diff options
Diffstat (limited to 'src/qml/jsruntime/qv4urlobject.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4urlobject.cpp | 60 |
1 files changed, 48 insertions, 12 deletions
diff --git a/src/qml/jsruntime/qv4urlobject.cpp b/src/qml/jsruntime/qv4urlobject.cpp index 8b6db439e2..89c8b9cda2 100644 --- a/src/qml/jsruntime/qv4urlobject.cpp +++ b/src/qml/jsruntime/qv4urlobject.cpp @@ -18,9 +18,9 @@ DEFINE_OBJECT_VTABLE(UrlSearchParamsObject); DEFINE_OBJECT_VTABLE(UrlSearchParamsCtor); -void Heap::UrlCtor::init(QV4::ExecutionContext *scope) +void Heap::UrlCtor::init(QV4::ExecutionEngine *engine) { - Heap::FunctionObject::init(scope, QLatin1String("URL")); + Heap::FunctionObject::init(engine, QLatin1String("URL")); } void UrlPrototype::init(ExecutionEngine *engine, Object *ctor) @@ -124,14 +124,14 @@ void UrlObject::setUrl(const QUrl &url) { d()->hash.set(engine(), engine()->newString(url.fragment())); d()->hostname.set(engine(), engine()->newString(url.host())); - d()->href.set(engine(), engine()->newString(url.toString())); + d()->href.set(engine(), engine()->newString(url.toString(QUrl::ComponentFormattingOptions(QUrl::ComponentFormattingOption::FullyEncoded)))); d()->password.set(engine(), engine()->newString(url.password())); d()->pathname.set(engine(), engine()->newString(url.path())); d()->port.set(engine(), engine()->newString(url.port() == -1 ? QLatin1String("") : QString::number(url.port()))); d()->protocol.set(engine(), engine()->newString(url.scheme() + QLatin1Char(':'))); - d()->search.set(engine(), engine()->newString(url.query())); + d()->search.set(engine(), engine()->newString(url.query(QUrl::ComponentFormattingOptions(QUrl::ComponentFormattingOption::FullyEncoded)))); d()->username.set(engine(), engine()->newString(url.userName())); updateOrigin(); @@ -242,6 +242,18 @@ bool UrlObject::setUsername(QString username) return true; } +QString UrlObject::search() const +{ + auto url = QUrl(href()); + if (auto url = QUrl(href()); !url.hasQuery() || url.query().isEmpty()) + return QLatin1String(""); + + constexpr auto options = QUrl::ComponentFormattingOption::EncodeSpaces + | QUrl::ComponentFormattingOption::EncodeUnicode + | QUrl::ComponentFormattingOption::EncodeReserved; + return u'?' + url.query(options); +} + QUrl UrlObject::toQUrl() const { return QUrl(href()); @@ -670,6 +682,7 @@ ReturnedValue UrlPrototype::method_getSearchParams(const FunctionObject *b, cons Scoped<UrlSearchParamsObject> usp(scope, v4->newUrlSearchParamsObject()); + usp->setUrlObject(thisObject->as<UrlObject>()); usp->initializeParams(r->search()); return usp->asReturnedValue(); @@ -737,9 +750,9 @@ ReturnedValue UrlCtor::virtualCallAsConstructor(const FunctionObject *that, cons } -void Heap::UrlSearchParamsCtor::init(QV4::ExecutionContext *scope) +void Heap::UrlSearchParamsCtor::init(QV4::ExecutionEngine *engine) { - Heap::FunctionObject::init(scope, QLatin1String("URLSearchParams")); + Heap::FunctionObject::init(engine, QLatin1String("URLSearchParams")); } void UrlSearchParamsPrototype::init(ExecutionEngine *engine, Object *ctor) @@ -960,6 +973,11 @@ void UrlSearchParamsObject::setParams(QList<QStringList> params) d()->values.set(engine(), values); } +void UrlSearchParamsObject::setUrlObject(const UrlObject *url) +{ + d()->url.set(engine(), url->d()); +} + void UrlSearchParamsObject::append(Heap::String *name, Heap::String *value) { Scope scope(engine()); @@ -1008,6 +1026,25 @@ QList<QStringList> UrlSearchParamsObject::params() const return result; } +Heap::UrlObject *UrlSearchParamsObject::urlObject() const +{ + return d()->url.get(); +} + +QString UrlSearchParamsObject::searchString() const +{ + QString search = QLatin1String(""); + auto params = this->params(); + auto len = params.size(); + for (int i = 0; i < len; ++i) { + const QStringList ¶m = params[i]; + search += param[0] + QLatin1Char('=') + param[1]; + if (i != len - 1) + search += QLatin1Char('&'); + } + return search; +} + int UrlSearchParamsObject::length() const { auto *arrayObject = d()->params.get(); @@ -1251,12 +1288,7 @@ ReturnedValue UrlSearchParamsPrototype::method_delete(const FunctionObject *b, c return Encode::undefined(); QList<QStringList> params = o->params(); - - auto to_remove = std::remove_if(params.begin(), params.end(), [&name](QStringList pair) { - return pair[0] == name; - }); - - params.erase(to_remove, params.end()); + params.removeIf([&name](const auto &pair) { return pair.at(0) == name; }); o->setParams(params); @@ -1335,6 +1367,10 @@ ReturnedValue UrlSearchParamsPrototype::method_set(const FunctionObject *b, cons o->setParams(params); + Scoped<UrlObject> scopedUrlObject(scope, o->d()->url.get()); + if (scopedUrlObject) + scopedUrlObject->setSearch(o->searchString()); + return Encode::undefined(); } |