Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qv4urlobject.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5#include "qv4urlobject_p.h"
6
7#include <QtCore/QUrl>
8
9#include <qv4jscall_p.h>
10#include <qv4objectiterator_p.h>
11
12using namespace QV4;
13
16
19
20
22{
23 Heap::FunctionObject::init(engine, QLatin1String("URL"));
24}
25
27{
28 Q_UNUSED(ctor);
29
30 Scope scope(engine);
31 ScopedObject o(scope);
32
33 defineDefaultProperty(QLatin1String("toString"), method_getHref);
34 defineDefaultProperty(QLatin1String("toJSON"), method_getHref);
35
36 defineAccessorProperty(QLatin1String("hash"), method_getHash, method_setHash);
37 defineAccessorProperty(QLatin1String("host"), method_getHost, method_setHost);
38 defineAccessorProperty(QLatin1String("hostname"), method_getHostname, method_setHostname);
39 defineAccessorProperty(QLatin1String("href"), method_getHref, method_setHref);
40 defineAccessorProperty(QLatin1String("origin"), method_getOrigin, nullptr);
41 defineAccessorProperty(QLatin1String("password"), method_getPassword, method_setPassword);
42 defineAccessorProperty(QLatin1String("pathname"), method_getPathname, method_setPathname);
43 defineAccessorProperty(QLatin1String("port"), method_getPort, method_setPort);
44 defineAccessorProperty(QLatin1String("protocol"), method_getProtocol, method_setProtocol);
45 defineAccessorProperty(QLatin1String("search"), method_getSearch, method_setSearch);
46 defineAccessorProperty(QLatin1String("searchParams"), method_getSearchParams, nullptr);
47 defineAccessorProperty(QLatin1String("username"), method_getUsername, method_setUsername);
48}
49
51{
52 if (hash.startsWith(QLatin1Char('#')))
53 hash = hash.mid(1);
54
55 QUrl url = toQUrl();
57
58 if (!url.isValid())
59 return false;
60
61 d()->hash.set(engine(), engine()->newString(url.fragment()));
62 d()->href.set(engine(), engine()->newString(url.toString()));
63
64 return true;
65}
66
68{
69 QUrl url = toQUrl();
70 url.setHost(host);
71
72 if (!url.isValid())
73 return false;
74
75 d()->hostname.set(engine(), engine()->newString(url.host()));
76 d()->href.set(engine(), engine()->newString(url.toString()));
77
78 updateOrigin();
79 updateHost();
80
81 return true;
82}
83
85{
86 int port = -1;
87
88 if (hostname.contains(QLatin1Char(':'))) {
89 const QStringList list = hostname.split(QLatin1Char(':'));
90 hostname = list[0];
91 port = list[1].toInt();
92 }
93
94 QUrl url = toQUrl();
95 url.setHost(hostname);
97
98 if (!url.isValid())
99 return false;
100
101 if (url.port() != -1)
102 d()->port.set(engine(), engine()->newString(QString::number(url.port())));
103
104 d()->hostname.set(engine(), engine()->newString(url.host()));
105 d()->href.set(engine(), engine()->newString(url.toString()));
106
107 updateOrigin();
108 updateHost();
109
110 return true;
111}
112
114{
115 const QUrl url(href);
116 if (!url.isValid() || url.isRelative())
117 return false;
118
119 setUrl(url);
120 return true;
121}
122
124{
125 d()->hash.set(engine(), engine()->newString(url.fragment()));
126 d()->hostname.set(engine(), engine()->newString(url.host()));
127 d()->href.set(engine(), engine()->newString(url.toString(QUrl::ComponentFormattingOptions(QUrl::ComponentFormattingOption::FullyEncoded))));
128 d()->password.set(engine(), engine()->newString(url.password()));
129 d()->pathname.set(engine(), engine()->newString(url.path()));
130 d()->port.set(engine(),
131 engine()->newString(url.port() == -1 ? QLatin1String("")
132 : QString::number(url.port())));
133 d()->protocol.set(engine(), engine()->newString(url.scheme() + QLatin1Char(':')));
134 d()->search.set(engine(), engine()->newString(url.query(QUrl::ComponentFormattingOptions(QUrl::ComponentFormattingOption::FullyEncoded))));
135 d()->username.set(engine(), engine()->newString(url.userName()));
136
137 updateOrigin();
138 updateHost();
139}
140
142{
143 QUrl url = toQUrl();
144 url.setPassword(password);
145
146 if (!url.isValid())
147 return false;
148
149 d()->password.set(engine(), engine()->newString(url.password()));
150 d()->href.set(engine(), engine()->newString(url.toString()));
151
152 return true;
153}
154
156{
157 QUrl url = toQUrl();
158 url.setPath(pathname);
159
160 if (!url.isValid())
161 return false;
162
163 d()->pathname.set(engine(), engine()->newString(url.path()));
164 d()->href.set(engine(), engine()->newString(url.toString()));
165
166 return true;
167}
168
170{
171 QUrl url = toQUrl();
172 url.setPort(port.isEmpty() ? -1 : port.toInt());
173
174 if (!url.isValid())
175 return false;
176
177 d()->port.set(engine(),
178 engine()->newString(url.port() == -1 ? QLatin1String("")
179 : QString::number(url.port())));
180 d()->href.set(engine(), engine()->newString(url.toString()));
181
182 updateOrigin();
183 updateHost();
184
185 return true;
186}
187
188bool UrlObject::setProtocol(QString protocolOrScheme)
189{
190 QUrl url = toQUrl();
191 // If there is one or several ':' in the protocolOrScheme,
192 // everything from the first colon is removed.
193
194 qsizetype firstColonPos = protocolOrScheme.indexOf(QLatin1Char(':'));
195
196 if (firstColonPos != -1)
197 protocolOrScheme.truncate(firstColonPos);
198
199 url.setScheme(protocolOrScheme);
200
201 if (!url.isValid())
202 return false;
203
204 d()->protocol.set(engine(), engine()->newString(url.scheme() + QLatin1Char(':')));
205 d()->href.set(engine(), engine()->newString(url.toString()));
206
207 updateOrigin();
208 updateHost();
209
210 return true;
211}
212
214{
215 QUrl url = toQUrl();
216
217 if (search.startsWith(QLatin1Char('?')))
218 search = search.mid(1);
219
220 url.setQuery(search);
221
222 if (!url.isValid())
223 return false;
224
225 d()->search.set(engine(), engine()->newString(url.query()));
226 d()->href.set(engine(), engine()->newString(url.toString()));
227
228 return true;
229}
230
232{
233 QUrl url = toQUrl();
234 url.setUserName(username);
235
236 if (!url.isValid())
237 return false;
238
239 d()->username.set(engine(), engine()->newString(url.userName()));
240 d()->href.set(engine(), engine()->newString(url.toString()));
241
242 return true;
243}
244
246{
247 auto url = QUrl(href());
248 if (auto url = QUrl(href()); !url.hasQuery() || url.query().isEmpty())
249 return QLatin1String("");
250
251 constexpr auto options = QUrl::ComponentFormattingOption::EncodeSpaces
254 return u'?' + url.query(options);
255}
256
258{
259 return QUrl(href());
260}
261
262void UrlObject::updateOrigin()
263{
264 QUrl url = toQUrl();
265
266 QString proto = url.scheme();
267
268 // A blob's origin is the origin of the URL that it points to
269 if (proto == QLatin1String("blob")) {
270 url = QUrl(url.path());
271 proto = url.scheme();
272 }
273
274 QString origin;
275 if (proto == QLatin1String("http") || proto == QLatin1String("https")
276 || proto == QLatin1String("ftp")) {
277 origin = QLatin1String("%1://%2").arg(url.scheme(), url.host());
278
279 if (url.port() != -1)
280 origin.append(QLatin1String(":") + QString::number(url.port()));
281 }
282
283 d()->origin.set(engine(), engine()->newString(origin));
284}
285
286void UrlObject::updateHost()
287{
288 QUrl url = toQUrl();
289
290 QString host = url.host();
291
292 if (url.port() != -1)
294
295 d()->host.set(engine(), engine()->newString(host));
296}
297
298static bool checkUrlObjectType(ExecutionEngine *v4, const Scoped<UrlObject> &r)
299{
300 if (r)
301 return true;
302
303 v4->throwTypeError(QStringLiteral("Value of \"this\" must be of type URL"));
304 return false;
305}
306
308 const Value *, int)
309{
310 ExecutionEngine *v4 = b->engine();
311 Scope scope(v4);
312
313 Scoped<UrlObject> r(scope, thisObject);
314 if (!checkUrlObjectType(v4, r))
315 return Encode::undefined();
316
317 return Encode(v4->newString(r->hash()));
318}
319
321 const Value *argv, int)
322{
323 ExecutionEngine *v4 = b->engine();
324 Scope scope(v4);
325
326 ScopedValue arg(scope, argv[0]);
327 String *stringValue = arg->stringValue();
328
329 if (stringValue == nullptr)
330 return v4->throwTypeError(QLatin1String("Invalid parameter provided"));
331
332 Scoped<UrlObject> r(scope, thisObject);
333 if (!checkUrlObjectType(v4, r))
334 return Encode::undefined();
335
336 r->setHash(stringValue->toQString());
337
338 return Encode::undefined();
339}
340
342 const Value *, int)
343{
344 ExecutionEngine *v4 = b->engine();
345 Scope scope(v4);
346
347 Scoped<UrlObject> r(scope, thisObject);
348 if (!checkUrlObjectType(v4, r))
349 return Encode::undefined();
350
351 return Encode(v4->newString(r->host()));
352}
353
355 const Value *argv, int)
356{
357 ExecutionEngine *v4 = b->engine();
358 Scope scope(v4);
359
360 ScopedValue arg(scope, argv[0]);
361 String *stringValue = arg->stringValue();
362
363 if (stringValue == nullptr)
364 return v4->throwTypeError(QLatin1String("Invalid parameter provided"));
365
366 Scoped<UrlObject> r(scope, thisObject);
367 if (!checkUrlObjectType(v4, r))
368 return Encode::undefined();
369
370 QString host = stringValue->toQString();
371 if (!r->setHost(host))
372 return v4->throwTypeError(QLatin1String("Invalid host: %1").arg(host));
373
374 return Encode::undefined();
375}
376
378 const Value *, int)
379{
380 ExecutionEngine *v4 = b->engine();
381 Scope scope(v4);
382
383 Scoped<UrlObject> r(scope, thisObject);
384 if (!checkUrlObjectType(v4, r))
385 return Encode::undefined();
386
387 return Encode(v4->newString(r->hostname()));
388}
389
391 const Value *argv, int)
392{
393 ExecutionEngine *v4 = b->engine();
394 Scope scope(v4);
395
396 ScopedValue arg(scope, argv[0]);
397 String *stringValue = arg->stringValue();
398
399 if (stringValue == nullptr)
400 return v4->throwTypeError(QLatin1String("Invalid parameter provided"));
401
402 Scoped<UrlObject> r(scope, thisObject);
403 if (!checkUrlObjectType(v4, r))
404 return Encode::undefined();
405
406 QString hostname = stringValue->toQString();
407 if (!r->setHostname(hostname))
408 return v4->throwTypeError(QLatin1String("Invalid hostname: %1").arg(hostname));
409
410 return Encode::undefined();
411}
412
414 const Value *, int)
415{
416 ExecutionEngine *v4 = b->engine();
417 Scope scope(v4);
418
419 Scoped<UrlObject> r(scope, thisObject);
420 if (!checkUrlObjectType(v4, r))
421 return Encode::undefined();
422
423 return Encode(v4->newString(r->href()));
424}
425
427 const Value *argv, int)
428{
429 ExecutionEngine *v4 = b->engine();
430 Scope scope(v4);
431
432 ScopedValue arg(scope, argv[0]);
433 String *stringValue = arg->stringValue();
434
435 if (stringValue == nullptr)
436 return v4->throwTypeError(QLatin1String("Invalid parameter provided"));
437
438 Scoped<UrlObject> r(scope, thisObject);
439 if (!checkUrlObjectType(v4, r))
440 return Encode::undefined();
441
442 QString href = stringValue->toQString();
443 if (!r->setHref(href))
444 return v4->throwTypeError(QLatin1String("Invalid URL: %1").arg(href));
445
446 return Encode::undefined();
447}
448
450 const Value *, int)
451{
452 ExecutionEngine *v4 = b->engine();
453 Scope scope(v4);
454
455 Scoped<UrlObject> r(scope, thisObject);
456 if (!checkUrlObjectType(v4, r))
457 return Encode::undefined();
458
459 return Encode(v4->newString(r->origin()));
460}
461
463 const Value *, int)
464{
465 ExecutionEngine *v4 = b->engine();
466 Scope scope(v4);
467
468 Scoped<UrlObject> r(scope, thisObject);
469 if (!checkUrlObjectType(v4, r))
470 return Encode::undefined();
471
472 return Encode(v4->newString(r->password()));
473}
474
476 const Value *argv, int)
477{
478 ExecutionEngine *v4 = b->engine();
479 Scope scope(v4);
480
481 ScopedValue arg(scope, argv[0]);
482 String *stringValue = arg->stringValue();
483
484 if (stringValue == nullptr)
485 return v4->throwTypeError(QLatin1String("Invalid parameter provided"));
486
487 Scoped<UrlObject> r(scope, thisObject);
488 if (!checkUrlObjectType(v4, r))
489 return Encode::undefined();
490
491 r->setPassword(stringValue->toQString());
492
493 return Encode::undefined();
494}
495
497 const Value *, int)
498{
499 ExecutionEngine *v4 = b->engine();
500 Scope scope(v4);
501
502 Scoped<UrlObject> r(scope, thisObject);
503 if (!checkUrlObjectType(v4, r))
504 return Encode::undefined();
505
506 return Encode(v4->newString(r->pathname()));
507}
508
510 const Value *argv, int)
511{
512 ExecutionEngine *v4 = b->engine();
513 Scope scope(v4);
514
515 ScopedValue arg(scope, argv[0]);
516 String *stringValue = arg->stringValue();
517
518 if (stringValue == nullptr)
519 return v4->throwTypeError(QLatin1String("Invalid parameter provided"));
520
521 Scoped<UrlObject> r(scope, thisObject);
522 if (!checkUrlObjectType(v4, r))
523 return Encode::undefined();
524
525 r->setPathname(stringValue->toQString());
526
527 return Encode::undefined();
528}
529
531 const Value *, int)
532{
533 ExecutionEngine *v4 = b->engine();
534 Scope scope(v4);
535
536 Scoped<UrlObject> r(scope, thisObject);
537 if (!checkUrlObjectType(v4, r))
538 return Encode::undefined();
539
540 return Encode(v4->newString(r->port()));
541}
542
544 const Value *argv, int)
545{
546 ExecutionEngine *v4 = b->engine();
547 Scope scope(v4);
548
549 ScopedValue arg(scope, argv[0]);
550 String *stringValue = arg->stringValue();
551
553
554 if (stringValue != nullptr)
555 port = stringValue->toQString();
556 else if (arg->isInt32())
557 port = QString::number(arg->toInt32());
558 else
559 return v4->throwTypeError(QLatin1String("Invalid parameter provided"));
560
561 Scoped<UrlObject> r(scope, thisObject);
562 if (!checkUrlObjectType(v4, r))
563 return Encode::undefined();
564
565 if (!r->setPort(port))
566 return v4->throwTypeError(QLatin1String("Invalid port: %1").arg(port));
567
568 return Encode::undefined();
569}
570
572 const Value *, int)
573{
574 ExecutionEngine *v4 = b->engine();
575 Scope scope(v4);
576
577 Scoped<UrlObject> r(scope, thisObject);
578 if (!checkUrlObjectType(v4, r))
579 return Encode::undefined();
580
581 return Encode(v4->newString(r->protocol()));
582}
583
585 const Value *argv, int)
586{
587 ExecutionEngine *v4 = b->engine();
588 Scope scope(v4);
589
590 ScopedValue arg(scope, argv[0]);
591 String *stringValue = arg->stringValue();
592
593 if (stringValue == nullptr)
594 return v4->throwTypeError(QLatin1String("Invalid parameter provided"));
595
596 Scoped<UrlObject> r(scope, thisObject);
597 if (!checkUrlObjectType(v4, r))
598 return Encode::undefined();
599
600 r->setProtocol(stringValue->toQString());
601
602 return Encode::undefined();
603}
604
606 const Value *, int)
607{
608 ExecutionEngine *v4 = b->engine();
609 Scope scope(v4);
610
611 Scoped<UrlObject> r(scope, thisObject);
612 if (!checkUrlObjectType(v4, r))
613 return Encode::undefined();
614
615 return Encode(v4->newString(r->search()));
616}
617
619 const Value *argv, int)
620{
621 ExecutionEngine *v4 = b->engine();
622 Scope scope(v4);
623
624 ScopedValue arg(scope, argv[0]);
625 String *stringValue = arg->stringValue();
626
627 if (stringValue == nullptr)
628 return v4->throwTypeError(QLatin1String("Invalid parameter provided"));
629
630 Scoped<UrlObject> r(scope, thisObject);
631 if (!checkUrlObjectType(v4, r))
632 return Encode::undefined();
633
634 r->setSearch(stringValue->toQString());
635
636 return Encode::undefined();
637}
638
640 const Value *, int)
641{
642 ExecutionEngine *v4 = b->engine();
643 Scope scope(v4);
644
645 Scoped<UrlObject> r(scope, thisObject);
646 if (!checkUrlObjectType(v4, r))
647 return Encode::undefined();
648
649 return Encode(v4->newString(r->username()));
650}
651
653 const Value *argv, int)
654{
655 ExecutionEngine *v4 = b->engine();
656 Scope scope(v4);
657
658 ScopedValue arg(scope, argv[0]);
659 String *stringValue = arg->stringValue();
660
661 if (stringValue == nullptr)
662 return v4->throwTypeError(QLatin1String("Invalid parameter provided"));
663
664 Scoped<UrlObject> r(scope, thisObject);
665 if (!checkUrlObjectType(v4, r))
666 return Encode::undefined();
667
668 r->setUsername(stringValue->toQString());
669
670 return Encode::undefined();
671}
672
674 const Value *, int)
675{
676 ExecutionEngine *v4 = b->engine();
677 Scope scope(v4);
678
679 Scoped<UrlObject> r(scope, thisObject);
680 if (!checkUrlObjectType(v4, r))
681 return Encode::undefined();
682
683 Scoped<UrlSearchParamsObject> usp(scope, v4->newUrlSearchParamsObject());
684
685 usp->setUrlObject(thisObject->as<UrlObject>());
686 usp->initializeParams(r->search());
687
688 return usp->asReturnedValue();
689}
690
692 int argc, const Value *newTarget)
693{
694 ExecutionEngine *v4 = that->engine();
695
696 if (argc < 1 || argc > 2)
697 return v4->throwError(QLatin1String("Invalid amount of arguments"));
698
699 Scope scope(v4);
700
701 ScopedValue arg1(scope, argv[0]);
702
703 QString arg1String = arg1->toQString();
704 QString urlString;
705
706 if (argc == 2) {
707 ScopedValue arg2(scope, argv[1]);
708 String *arg2StringValue = arg2->stringValue();
709
710 if (arg2StringValue == nullptr)
711 return v4->throwTypeError(QLatin1String("Invalid parameter provided"));
712
713 QUrl url = QUrl(arg2StringValue->toQString());
714 QUrl relativeUrl = QUrl(arg1String);
715
716 QString baseUrlPath = url.path();
717 QString relativePath = relativeUrl.path();
718
719 // If the base URL contains a path the last section of it is discarded
720 int lastSlash = baseUrlPath.lastIndexOf(QLatin1Char('/'));
721 if (lastSlash != -1)
722 baseUrlPath.truncate(lastSlash);
723
724 if (!relativePath.startsWith(QLatin1Char('/')))
725 relativePath = relativePath.prepend(QLatin1Char('/'));
726
727 url.setPath(baseUrlPath + relativePath);
728 url.setFragment(relativeUrl.fragment());
729 url.setQuery(relativeUrl.query());
730
731 urlString = url.toString();
732 } else {
733 urlString = arg1String;
734 }
735
737
738 if (!newTarget)
739 return o;
740
741 ScopedObject obj(scope, o);
742 obj->setProtoFromNewTarget(newTarget);
743
744 UrlObject *urlObject = obj->as<UrlObject>();
745
746 if (!urlObject->setHref(urlString))
747 return v4->throwTypeError(QLatin1String("Invalid URL: %1").arg(urlString));
748
749 return obj->asReturnedValue();
750}
751
752
754{
755 Heap::FunctionObject::init(engine, QLatin1String("URLSearchParams"));
756}
757
759{
760 Q_UNUSED(ctor);
761
762 Scope scope(engine);
763 ScopedObject o(scope);
764
765 defineDefaultProperty(QLatin1String("toString"), method_toString);
766 defineDefaultProperty(QLatin1String("sort"), method_sort);
767 defineDefaultProperty(QLatin1String("append"), method_append);
768 defineDefaultProperty(QLatin1String("delete"), method_delete);
769 defineDefaultProperty(QLatin1String("has"), method_has);
770 defineDefaultProperty(QLatin1String("set"), method_set);
771 defineDefaultProperty(QLatin1String("get"), method_get);
772 defineDefaultProperty(QLatin1String("getAll"), method_getAll);
773 defineDefaultProperty(QLatin1String("forEach"), method_forEach);
774 defineDefaultProperty(QLatin1String("entries"), method_entries);
775 defineDefaultProperty(QLatin1String("keys"), method_keys);
776 defineDefaultProperty(QLatin1String("values"), method_values);
777}
778
780 int argc, const Value *newTarget)
781{
782 ExecutionEngine *v4 = that->engine();
783
784 if (argc > 1)
785 return v4->throwError(QLatin1String("Invalid amount of arguments"));
786
787 Scope scope(v4);
788
789 ScopedValue arg(scope, argv[0]);
790 ArrayObject *argArrayObject = arg->as<ArrayObject>();
791 Object *argObject = arg->as<Object>();
792
794
795 if (!newTarget)
796 return o;
797
798 ScopedObject obj(scope, o);
799 obj->setProtoFromNewTarget(newTarget);
800
801 UrlSearchParamsObject *urlSearchParamsObject = obj->as<UrlSearchParamsObject>();
802
803 if (argArrayObject != nullptr) {
804 ScopedArrayObject argArray(scope, argArrayObject);
805
806 uint len = argArray->getLength();
807
808 for (uint i = 0; i < len; i++) {
809 QV4::Value pair = argArray->get(i);
810 auto *pairArrayObject = pair.as<ArrayObject>();
811
812 if (pairArrayObject == nullptr) {
813 return v4->throwTypeError(
814 QLatin1String("element %1 is not a pair").arg(QString::number(i)));
815 }
816
817
818 ScopedArrayObject pairArray(scope, pairArrayObject);
819
820
821 uint pairLen = pairArray->getLength();
822
823
824 if (pairLen != 2) {
825 return v4->throwTypeError(QLatin1String("pair %1 has %2 elements instead of 2")
827 .arg(QString::number(pairLen)));
828 }
829 }
830
831 urlSearchParamsObject->initializeParams(argArray);
832 } else if (argObject != nullptr) {
833 ScopedObject scopedObject(scope, argObject);
834 urlSearchParamsObject->initializeParams(scopedObject);
835 } else {
836 QString value = argc > 0 ? arg->toQString() : QLatin1String("");
837 urlSearchParamsObject->initializeParams(value);
838 }
839
840 return obj->asReturnedValue();
841}
842
844{
845 auto *arrayObject = engine()->newArrayObject(0);
846 auto *keys = engine()->newArrayObject(0);
847 auto *values = engine()->newArrayObject(0);
848
849 d()->params.set(engine(), arrayObject);
850 d()->keys.set(engine(), keys);
851 d()->values.set(engine(), values);
852}
853
855{
856 Q_ASSERT(d()->params == nullptr);
857
858 initializeParams();
859
860 if (value.startsWith(QLatin1Char('?')))
861 value = value.mid(1);
862
863 const QStringList params = value.split(QLatin1Char('&'));
864
865 for (const QString& param : params) {
866 if (param.isEmpty())
867 continue;
868
870
871 int equalsIndex = param.indexOf(QLatin1Char('='));
872 if (equalsIndex != -1) {
873 key = param.left(equalsIndex);
874 value = param.mid(equalsIndex+1);
875 } else {
876 key = param;
877 }
878
879 append(engine()->newString(key), engine()->newString(value));
880 }
881}
882
884{
885 Q_ASSERT(d()->params == nullptr);
886
887 Scope scope(engine());
888
889 uint len = params->getLength();
890 auto *keys = engine()->newArrayObject(len);
891 auto *values = engine()->newArrayObject(len);
892
893 ScopedArrayObject scopedKeys(scope, keys);
894 ScopedArrayObject scopedValues(scope, values);
895
896 for (uint i = 0; i < len; i++)
897 {
898 QV4::Value pair = params->get(i);
899 auto *pairArrayObject = pair.as<ArrayObject>();
900
901 QV4::Value key = pairArrayObject->get(uint(0));
902 QV4::Value value = pairArrayObject->get(uint(1));
903
904 scopedKeys->put(i, key);
905 scopedValues->put(i, value);
906 }
907
908
909 d()->params.set(engine(), params->d());
910 d()->keys.set(engine(), keys);
911 d()->values.set(engine(), values);
912}
913
915{
916 Q_ASSERT(d()->params == nullptr);
917
918 initializeParams();
919
920 Scope scope(engine());
922
923 ScopedValue name(scope);
924 ScopedValue val(scope);
925
926 while (true) {
927 name = it.nextPropertyNameAsString(val);
928 if (name->isNull())
929 break;
930
931 Heap::String *nameStr = name->as<String>()->d();
932 Heap::String *valStr = val->toString(engine());
933
934 append(nameStr, valStr);
935 }
936}
937
939{
940 auto *arrayObject = engine()->newArrayObject(0);
941 auto *keys = engine()->newArrayObject(0);
942 auto *values = engine()->newArrayObject(0);
943
944 Scope scope(engine());
945
946 ScopedArrayObject scopedArray(scope, arrayObject);
947
948 ScopedArrayObject scopedKeys(scope, keys);
949 ScopedArrayObject scopedValues(scope, values);
950
951 uint len = 0;
952
953 for (const QStringList& param : params) {
954
955 auto *valuePair = engine()->newArrayObject(2);
956
957 ScopedArrayObject valuePairObject(scope, valuePair);
958
959 ScopedValue key(scope, Value::fromHeapObject(engine()->newString(param[0])));
960 ScopedValue value(scope, Value::fromHeapObject(engine()->newString(param[1])));
961 valuePairObject->put(uint(0), key);
962 valuePairObject->put(uint(1), value);
963
964 scopedKeys->put(len, key);
965 scopedValues->put(len, value);
966
967 scopedArray->put(len, valuePairObject);
968 len++;
969 }
970
971 d()->params.set(engine(), arrayObject);
972 d()->keys.set(engine(), keys);
973 d()->values.set(engine(), values);
974}
975
977{
978 d()->url.set(engine(), url->d());
979}
980
982{
983 Scope scope(engine());
984
985 ScopedArrayObject scopedArray(scope, d()->params);
986 ScopedArrayObject scopedKeys(scope, d()->keys);
987 ScopedArrayObject scopedValues(scope, d()->values);
988
989 auto *valuePair = engine()->newArrayObject(2);
990
991 ScopedArrayObject valuePairObject(scope, valuePair);
992
993 ScopedValue keyScoped(scope, Value::fromHeapObject(name));
994 ScopedValue valueScoped(scope, Value::fromHeapObject(value));
995 valuePairObject->put(uint(0), keyScoped);
996 valuePairObject->put(uint(1), valueScoped);
997
998 uint len = scopedArray->getLength();
999
1000 scopedKeys->put(len, keyScoped);
1001 scopedValues->put(len, valueScoped);
1002
1003 scopedArray->put(len, valuePairObject);
1004}
1005
1006QList<QStringList> UrlSearchParamsObject::params() const
1007{
1008 auto *arrayObject = d()->params.get();
1009 Scope scope(engine());
1010 ScopedArrayObject scopedArray(scope, arrayObject);
1011
1012 QList<QStringList> result;
1013
1014 uint len = scopedArray->getLength();
1015
1016 for (uint i = 0; i < len; i++) {
1017 QV4::Value pair = scopedArray->get(i);
1018 auto *pairArrayObject = pair.as<ArrayObject>();
1019
1020 QV4::Value key = pairArrayObject->get(uint(0));
1021 QV4::Value value = pairArrayObject->get(uint(1));
1022
1023 result << QStringList { key.toQString(), value.toQString() };
1024 }
1025
1026 return result;
1027}
1028
1029Heap::UrlObject *UrlSearchParamsObject::urlObject() const
1030{
1031 return d()->url.get();
1032}
1033
1035{
1036 QString search = QLatin1String("");
1037 auto params = this->params();
1038 auto len = params.size();
1039 for (int i = 0; i < len; ++i) {
1040 const QStringList &param = params[i];
1041 search += param[0] + QLatin1Char('=') + param[1];
1042 if (i != len - 1)
1043 search += QLatin1Char('&');
1044 }
1045 return search;
1046}
1047
1049{
1050 auto *arrayObject = d()->params.get();
1051 Scope scope(engine());
1052 ScopedArrayObject scopedArray(scope, arrayObject);
1053
1054 return scopedArray->getLength();
1055}
1056
1058{
1059 auto *arrayObject = d()->params.get();
1060 Scope scope(engine());
1061 ScopedArrayObject scopedArray(scope, arrayObject);
1062
1063 int len = scopedArray->getLength();
1064
1065 for (int i = last + 1; i < len; i++) {
1066 QV4::Value pair = scopedArray->get(i);
1067 auto *pairArrayObject = pair.as<ArrayObject>();
1068
1069 QV4::Value key = pairArrayObject->get(uint(0));
1070
1071 if (key.toQString() == name)
1072 return i;
1073 }
1074
1075 return -1;
1076}
1077
1078QString UrlSearchParamsObject::stringAt(int index, int pairIndex) const
1079{
1080 auto *arrayObject = d()->params.get();
1081 Scope scope(engine());
1082 ScopedArrayObject scopedArray(scope, arrayObject);
1083
1084 if (index >= scopedArray->getLength())
1085 return {};
1086
1087 QV4::Value pair = scopedArray->get(index);
1088 auto *pairArrayObject = pair.as<ArrayObject>();
1089
1090 QV4::Value value = pairArrayObject->get(pairIndex);
1091
1092 return value.toQString();
1093}
1094
1095QV4::Heap::String * UrlSearchParamsObject::stringAtRaw(int index, int pairIndex) const
1096{
1097 auto *arrayObject = d()->params.get();
1098 Scope scope(engine());
1099 ScopedArrayObject scopedArray(scope, arrayObject);
1100
1101 if (index >= scopedArray->getLength())
1102 return nullptr;
1103
1104 QV4::Value pair = scopedArray->get(index);
1105 auto *pairArrayObject = pair.as<ArrayObject>();
1106
1107 QV4::Value value = pairArrayObject->get(pairIndex);
1108
1109 return value.as<String>()->d();
1110}
1111
1113{
1114 return stringAt(index, 0);
1115}
1116
1118{
1119 return stringAtRaw(index, 0);
1120}
1121
1122
1124{
1125 return stringAt(index, 1);
1126}
1127
1129{
1130 return stringAtRaw(index, 1);
1131}
1132
1133
1140
1143{
1144 const UrlSearchParamsObject *usp = static_cast<const UrlSearchParamsObject *>(o);
1145
1146 Scope scope(usp);
1147
1148 uint len = usp->length();
1149 if (arrayIndex < len) {
1150 uint index = arrayIndex;
1151 ++arrayIndex;
1152 if (attrs)
1154 if (pd)
1155 pd->value = usp->engine()->newString(usp->nameAt(index));
1157 }
1158
1160}
1161
1168
1170 Property *p)
1171{
1173 if (attributes != Attr_Invalid)
1174 return attributes;
1175
1176 if (id.isArrayIndex()) {
1177 const int index = id.asArrayIndex();
1178 const auto usp = static_cast<const UrlSearchParamsObject *>(m);
1179 if (index < usp->length()) {
1180 if (p)
1181 p->value = usp->engine()->newString(usp->nameAt(index));
1183 }
1184 }
1185
1186 return Object::virtualGetOwnProperty(m, id, p);
1187}
1188
1189static bool checkSearchParamsType(ExecutionEngine *v4, const Scoped<UrlSearchParamsObject> &o)
1190{
1191 if (o)
1192 return true;
1193
1194 v4->throwTypeError(QStringLiteral("Value of \"this\" must be of type URLSearchParams"));
1195 return false;
1196}
1197
1199 const FunctionObject *b, const Value *thisObject, const Value *, int)
1200{
1201 ExecutionEngine *v4 = b->engine();
1202 Scope scope(v4);
1203
1204 Scoped<UrlSearchParamsObject> o(scope, thisObject);
1205 if (!checkSearchParamsType(v4, o))
1206 return Encode::undefined();
1207
1208 auto params = o->params();
1209
1210 QString value;
1211
1212 for (const QStringList &pair : params)
1215
1216 value.chop(1);
1217
1218 return Encode(v4->newString(value));
1219}
1220
1222 const Value *, int)
1223{
1224 ExecutionEngine *v4 = b->engine();
1225 Scope scope(v4);
1226
1227 Scoped<UrlSearchParamsObject> o(scope, thisObject);
1228 if (!checkSearchParamsType(v4, o))
1229 return Encode::undefined();
1230
1231 QList<QStringList> params = o->params();
1232 std::stable_sort(params.begin(), params.end(), [](QStringList a, QStringList b) { return a[0] < b[0]; });
1233
1234 o->setParams(params);
1235
1236 return Encode::undefined();
1237}
1238
1240 const Value *argv, int argc)
1241{
1242 ExecutionEngine *v4 = b->engine();
1243 Scope scope(v4);
1244
1245 if (argc != 2)
1246 return v4->throwError(QLatin1String("Bad amount of arguments"));
1247
1248 ScopedValue argName(scope, argv[0]);
1249 ScopedValue argValue(scope, argv[1]);
1250
1251 String *argNameString = argName->stringValue();
1252
1253 if (argNameString == nullptr)
1254 return v4->throwTypeError(QLatin1String("Invalid argument provided"));
1255
1256 ScopedString name(scope, argName->as<String>());
1257 ScopedString value(scope, argValue->toString(v4));
1258
1259 Scoped<UrlSearchParamsObject> o(scope, thisObject);
1260 if (!checkSearchParamsType(v4, o))
1261 return Encode::undefined();
1262
1263 o->append(name->d(), value->d());
1264
1265 return Encode::undefined();
1266}
1267
1269 const Value *argv, int argc)
1270{
1271 ExecutionEngine *v4 = b->engine();
1272 Scope scope(v4);
1273
1274 if (argc != 1)
1275 return v4->throwError(QLatin1String("Bad amount of arguments"));
1276
1277 ScopedValue argName(scope, argv[0]);
1278
1279 String *argNameString = argName->stringValue();
1280
1281 if (argNameString == nullptr)
1282 return v4->throwTypeError(QLatin1String("Invalid argument provided"));
1283
1284 QString name = argNameString->toQString();
1285
1286 Scoped<UrlSearchParamsObject> o(scope, thisObject);
1287 if (!checkSearchParamsType(v4, o))
1288 return Encode::undefined();
1289
1290 QList<QStringList> params = o->params();
1291 params.removeIf([&name](const auto &pair) { return pair.at(0) == name; });
1292
1293 o->setParams(params);
1294
1295 return Encode::undefined();
1296}
1297
1299 const Value *argv, int argc)
1300{
1301 ExecutionEngine *v4 = b->engine();
1302 Scope scope(v4);
1303
1304 if (argc != 1)
1305 return v4->throwError(QLatin1String("Bad amount of arguments"));
1306
1307 ScopedValue argName(scope, argv[0]);
1308
1309 String *argNameString = argName->stringValue();
1310
1311 if (argNameString == nullptr)
1312 return v4->throwTypeError(QLatin1String("Invalid argument provided"));
1313
1314 Scoped<UrlSearchParamsObject> o(scope, thisObject);
1315 if (!checkSearchParamsType(v4, o))
1316 return Encode::undefined();
1317
1318 QString name = argNameString->toQString();
1319
1320 return Encode(o->indexOf(name) != -1);
1321}
1322
1324 const Value *argv, int argc)
1325{
1326 ExecutionEngine *v4 = b->engine();
1327 Scope scope(v4);
1328
1329 if (argc != 2)
1330 return v4->throwError(QLatin1String("Bad amount of arguments"));
1331
1332 ScopedValue argName(scope, argv[0]);
1333 ScopedValue argValue(scope, argv[1]);
1334
1335 String *argNameString = argName->stringValue();
1336
1337 if (argNameString == nullptr)
1338 return v4->throwTypeError(QLatin1String("Invalid argument provided"));
1339
1340 Scoped<UrlSearchParamsObject> o(scope, thisObject);
1341 if (!checkSearchParamsType(v4, o))
1342 return Encode::undefined();
1343
1344 QString name = argNameString->toQString();
1345 QString value = argValue->toQString();
1346
1347 auto params = o->params();
1348
1349 bool matched = false;
1350
1351 for (auto it = params.begin(); it != params.end();) {
1352 QStringList &param = *it;
1353 if (param[0] == name) {
1354 if (!matched) {
1355 param[1] = value;
1356 matched = true;
1357 } else {
1358 it = params.erase(it);
1359 continue;
1360 }
1361 }
1362 it++;
1363 }
1364
1365 if (!matched)
1366 params << QStringList { name, value };
1367
1368 o->setParams(params);
1369
1370 Scoped<UrlObject> scopedUrlObject(scope, o->d()->url.get());
1371 if (scopedUrlObject)
1372 scopedUrlObject->setSearch(o->searchString());
1373
1374 return Encode::undefined();
1375}
1376
1378 const Value *argv, int argc)
1379{
1380 ExecutionEngine *v4 = b->engine();
1381 Scope scope(v4);
1382
1383 if (argc != 1)
1384 return v4->throwError(QLatin1String("Bad amount of arguments"));
1385
1386 ScopedValue argName(scope, argv[0]);
1387
1388 String *argNameString = argName->stringValue();
1389
1390 if (argNameString == nullptr)
1391 return v4->throwTypeError(QLatin1String("Invalid argument provided"));
1392
1393 Scoped<UrlSearchParamsObject> o(scope, thisObject);
1394 if (!checkSearchParamsType(v4, o))
1395 return Encode::undefined();
1396
1397 QString name = argNameString->toQString();
1398
1399 int index = o->indexOf(name);
1400
1401 if (index == -1)
1402 return Encode::null();
1403
1404 return Encode(o->valueAtRaw(index));
1405}
1406
1408 const Value *thisObject, const Value *argv,
1409 int argc)
1410{
1411 ExecutionEngine *v4 = b->engine();
1412 Scope scope(v4);
1413
1414 if (argc != 1)
1415 return v4->throwError(QLatin1String("Bad amount of arguments"));
1416
1417 ScopedValue argName(scope, argv[0]);
1418
1419 String *argNameString = argName->stringValue();
1420
1421 if (argNameString == nullptr)
1422 return v4->throwTypeError(QLatin1String("Invalid argument provided"));
1423
1424 Scoped<UrlSearchParamsObject> o(scope, thisObject);
1425 if (!checkSearchParamsType(v4, o))
1426 return Encode::undefined();
1427
1428 QString name = argNameString->toQString();
1429
1430 auto *arrayObject = v4->newArrayObject(0);
1431 ScopedArrayObject result(scope, arrayObject);
1432
1433 int i = 0;
1434 for (int index = o->indexOf(name); index != -1; index = o->indexOf(name, index)) {
1435 ScopedValue value(scope, Value::fromHeapObject(o->valueAtRaw(index)));
1436 result->put(i++, value);
1437 }
1438
1439 return Encode(arrayObject);
1440}
1441
1443 const Value *thisObject, const Value *argv,
1444 int argc)
1445{
1446 ExecutionEngine *v4 = b->engine();
1447 Scope scope(v4);
1448
1449 if (argc != 1)
1450 return v4->throwError(QLatin1String("Bad amount of arguments"));
1451
1452 ScopedValue argFunc(scope, argv[0]);
1453
1454 FunctionObject *func = argFunc->as<FunctionObject>();
1455
1456 if (func == nullptr)
1457 return v4->throwTypeError(QLatin1String("Invalid argument: must be a function"));
1458
1459 Scoped<UrlSearchParamsObject> o(scope, thisObject);
1460 if (!checkSearchParamsType(v4, o))
1461 return Encode::undefined();
1462
1463 for (int i = 0; i < o->length(); i++) {
1464 Scoped<String> name(scope, o->nameAtRaw(i));
1465 Scoped<String> value(scope, o->valueAtRaw(i));
1466
1467 QV4::JSCallArguments calldata(scope, 2);
1468
1469 calldata.args[0] = value;
1470 calldata.args[1] = name;
1471
1472 func->call(calldata);
1473 }
1474
1475 return Encode::undefined();
1476}
1477
1479 const Value *thisObject, const Value *,
1480 int argc)
1481{
1482 ExecutionEngine *v4 = b->engine();
1483 Scope scope(v4);
1484
1485 if (argc != 0)
1486 return v4->throwError(QLatin1String("Bad amount of arguments"));
1487
1488 Scoped<UrlSearchParamsObject> o(scope, thisObject);
1489 if (!checkSearchParamsType(v4, o))
1490 return Encode::undefined();
1491
1492 ScopedObject params(scope, o->d()->params.get());
1493
1494 Scoped<ArrayIteratorObject> paramsIterator(scope, v4->newArrayIteratorObject(params));
1495 paramsIterator->d()->iterationKind = IteratorKind::KeyValueIteratorKind;
1496 return paramsIterator->asReturnedValue();
1497}
1498
1500 const Value *thisObject, const Value *,
1501 int argc)
1502{
1503 ExecutionEngine *v4 = b->engine();
1504 Scope scope(v4);
1505
1506 if (argc != 0)
1507 return v4->throwError(QLatin1String("Bad amount of arguments"));
1508
1509 Scoped<UrlSearchParamsObject> o(scope, thisObject);
1510 if (!checkSearchParamsType(v4, o))
1511 return Encode::undefined();
1512
1513 ScopedObject keys(scope, o->d()->keys.get());
1514
1515 Scoped<ArrayIteratorObject> keysIterator(scope, v4->newArrayIteratorObject(keys));
1516 keysIterator->d()->iterationKind = IteratorKind::KeyValueIteratorKind;
1517 return keysIterator->asReturnedValue();
1518}
1519
1521 const Value *thisObject, const Value *,
1522 int argc)
1523{
1524 ExecutionEngine *v4 = b->engine();
1525 Scope scope(v4);
1526
1527 if (argc != 0)
1528 return v4->throwError(QLatin1String("Bad amount of arguments"));
1529
1530 Scoped<UrlSearchParamsObject> o(scope, thisObject);
1531 if (!checkSearchParamsType(v4, o))
1532 return Encode::undefined();
1533
1534 ScopedObject values(scope, o->d()->values.get());
1535
1536 Scoped<ArrayIteratorObject> valuesIterator(scope, v4->newArrayIteratorObject(values));
1537 valuesIterator->d()->iterationKind = IteratorKind::KeyValueIteratorKind;
1538 return valuesIterator->asReturnedValue();
1539}
QString arg(Args &&...args) const
iterator begin()
Definition qset.h:136
iterator end()
Definition qset.h:140
iterator erase(const_iterator i)
Definition qset.h:145
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
qsizetype lastIndexOf(QChar c, Qt::CaseSensitivity cs=Qt::CaseSensitive) const noexcept
Definition qstring.h:296
bool startsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string starts with s; otherwise returns false.
Definition qstring.cpp:5455
void chop(qsizetype n)
Removes n characters from the end of the string.
Definition qstring.cpp:6340
QStringList split(const QString &sep, Qt::SplitBehavior behavior=Qt::KeepEmptyParts, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Splits the string into substrings wherever sep occurs, and returns the list of those strings.
Definition qstring.cpp:8218
QString mid(qsizetype position, qsizetype n=-1) const &
Definition qstring.cpp:5300
bool isEmpty() const noexcept
Returns true if the string has no characters; otherwise returns false.
Definition qstring.h:192
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:6018
bool contains(QChar c, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Definition qstring.h:1369
static QString number(int, int base=10)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:8084
QString & append(QChar c)
Definition qstring.cpp:3252
QString & prepend(QChar c)
Definition qstring.h:478
\inmodule QtCore
Definition qurl.h:94
bool hasQuery() const
Definition qurl.cpp:2513
QString fragment(ComponentFormattingOptions options=PrettyDecoded) const
Returns the fragment of the URL.
Definition qurl.cpp:2682
QString query(ComponentFormattingOptions=PrettyDecoded) const
Returns the query string of the URL if there's a query string, or an empty result if not.
Definition qurl.cpp:2609
void setPassword(const QString &password, ParsingMode mode=DecodedMode)
Sets the URL's password to password.
Definition qurl.cpp:2227
void setUserName(const QString &userName, ParsingMode mode=DecodedMode)
Sets the URL's user name to userName.
Definition qurl.cpp:2164
void setFragment(const QString &fragment, ParsingMode mode=TolerantMode)
Sets the fragment of the URL to fragment.
Definition qurl.cpp:2648
bool isRelative() const
Returns true if the URL is relative; otherwise returns false.
Definition qurl.cpp:2800
bool isValid() const
Returns true if the URL is non-empty and valid; otherwise returns false.
Definition qurl.cpp:1882
QString userName(ComponentFormattingOptions options=FullyDecoded) const
Returns the user name of the URL if it is defined; otherwise an empty string is returned.
Definition qurl.cpp:2199
QString host(ComponentFormattingOptions=FullyDecoded) const
Returns the host of the URL if it is defined; otherwise an empty string is returned.
Definition qurl.cpp:2340
void setQuery(const QString &query, ParsingMode mode=TolerantMode)
Sets the query string of the URL to query.
Definition qurl.cpp:2550
QString password(ComponentFormattingOptions=FullyDecoded) const
Returns the password of the URL if it is defined; otherwise an empty string is returned.
Definition qurl.cpp:2262
static QByteArray toPercentEncoding(const QString &, const QByteArray &exclude=QByteArray(), const QByteArray &include=QByteArray())
Returns an encoded copy of input.
Definition qurl.cpp:3019
QString scheme() const
Returns the scheme of the URL.
Definition qurl.cpp:1991
void setScheme(const QString &scheme)
Sets the scheme of the URL to scheme.
Definition qurl.cpp:1967
void setHost(const QString &host, ParsingMode mode=DecodedMode)
Sets the host of the URL to host.
Definition qurl.cpp:2289
int port(int defaultPort=-1) const
Definition qurl.cpp:2383
@ EncodeReserved
Definition qurl.h:125
@ EncodeUnicode
Definition qurl.h:123
@ EncodeSpaces
Definition qurl.h:122
@ FullyEncoded
Definition qurl.h:129
void setPath(const QString &path, ParsingMode mode=DecodedMode)
Sets the path of the URL to path.
Definition qurl.cpp:2414
QString toString(FormattingOptions options=FormattingOptions(PrettyDecoded)) const
Returns a string representation of the URL.
Definition qurl.cpp:2831
void setPort(int port)
Sets the port of the URL to port.
Definition qurl.cpp:2358
QString path(ComponentFormattingOptions options=FullyDecoded) const
Returns the path of the URL.
Definition qurl.cpp:2468
QHash< int, QWidget * > hash
[35multi]
list append(new Employee("Blackpool", "Stephen"))
QSet< QString >::iterator it
short next
Definition keywords.cpp:445
quint64 ReturnedValue
@ KeyValueIteratorKind
Scoped< String > ScopedString
@ Attr_Invalid
@ Attr_NotConfigurable
@ Attr_NotWritable
static struct AttrInfo attrs[]
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
EGLOutputPortEXT port
GLenum GLsizei GLsizei GLint * values
[15]
GLboolean GLboolean GLboolean b
const GLfloat * m
GLuint64 key
GLboolean GLboolean GLboolean GLboolean a
[7]
GLuint index
[2]
GLboolean r
[2]
GLenum GLuint GLenum GLsizei length
GLenum target
GLenum const GLint * param
GLuint name
void ** params
GLhandleARB obj
[2]
GLenum func
Definition qopenglext.h:663
GLuint GLfloat * val
GLuint GLuint GLuint GLuint arg1
GLuint GLuint GLuint GLuint GLuint GLuint GLuint arg2
GLuint64EXT * result
[6]
GLfloat GLfloat p
[1]
GLenum GLsizei len
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
SSL_CTX int void * arg
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
#define QStringLiteral(str)
request setUrl(QUrl("http://qt-project.org"))
#define Q_UNUSED(x)
ptrdiff_t qsizetype
Definition qtypes.h:165
unsigned int uint
Definition qtypes.h:34
static bool checkSearchParamsType(ExecutionEngine *v4, const Scoped< UrlSearchParamsObject > &o)
static bool checkUrlObjectType(ExecutionEngine *v4, const Scoped< UrlObject > &r)
#define DEFINE_OBJECT_VTABLE(classname)
QList< int > list
[14]
QStringList keys
QUrl url("example.com")
[constructor-url-reference]
QJSEngine engine
[0]
\inmodule QtCore \reentrant
Definition qchar.h:18
static constexpr ReturnedValue undefined()
static constexpr ReturnedValue null()
ReturnedValue throwError(const Value &value)
Heap::UrlSearchParamsObject * newUrlSearchParamsObject()
Heap::UrlObject * newUrlObject()
Heap::String * newString(char16_t c)
Heap::ArrayObject * newArrayObject(int count=0)
Heap::Object * newArrayIteratorObject(Object *o)
ReturnedValue throwTypeError()
void init(ExecutionEngine *engine)
void init(ExecutionEngine *engine)
ExecutionEngine * engine() const
PropertyKey next(const Object *o, Property *pd=nullptr, PropertyAttributes *attrs=nullptr) override
static PropertyKey fromArrayIndex(uint idx)
QV4_NEARLY_ALWAYS_INLINE constexpr quint32 value() const
QString toQString() const
bool setSearch(QString search)
Q_QML_AUTOTEST_EXPORT QString search() const
bool setPathname(QString pathname)
bool setHostname(QString hostname)
void setUrl(const QUrl &url)
bool setHash(QString hash)
QUrl toQUrl() const
bool setHref(QString href)
bool setProtocol(QString protocol)
bool setUsername(QString username)
bool setPort(QString port)
bool setPassword(QString password)
bool setHost(QString host)
static ReturnedValue method_getPathname(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getPort(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getSearchParams(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setProtocol(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getUsername(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getProtocol(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setHostname(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setHref(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setSearch(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getHash(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setHost(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setPort(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getPassword(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
void init(ExecutionEngine *engine, Object *ctor)
static ReturnedValue method_getOrigin(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setUsername(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getSearch(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setPassword(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getHost(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getHostname(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_getHref(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setPathname(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_setHash(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
void setParams(QList< QStringList > params)
QString valueAt(int index) const
QList< QStringList > params() const
Heap::UrlObject * urlObject() const
int indexOf(QString name, int last=-1) const
Heap::String * nameAtRaw(int index) const
void append(Heap::String *name, Heap::String *value)
Heap::String * valueAtRaw(int index) const
void setUrlObject(const UrlObject *url)
QString nameAt(int index) const
static ReturnedValue method_keys(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_forEach(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_get(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_sort(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_delete(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
void init(ExecutionEngine *engine, Object *ctor)
static ReturnedValue method_getAll(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_toString(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_append(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_has(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_set(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_entries(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static ReturnedValue method_values(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
static constexpr VTable::OwnPropertyKeys virtualOwnPropertyKeys
static constexpr VTable::GetOwnProperty virtualGetOwnProperty
static constexpr VTable::CallAsConstructor virtualCallAsConstructor
QML_NEARLY_ALWAYS_INLINE String * stringValue() const
Definition qv4value_p.h:55
static Value fromHeapObject(HeapBasePtr m)
Definition qv4value_p.h:84
const T * as() const
Definition qv4value_p.h:132
QString toQString() const
Definition qv4value.cpp:158
PropertyKey next(const QV4::Object *o, Property *pd=nullptr, PropertyAttributes *attrs=nullptr) override
~UrlSearchParamsObjectOwnPropertyKeyIterator() override=default