aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4urlobject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/jsruntime/qv4urlobject.cpp')
-rw-r--r--src/qml/jsruntime/qv4urlobject.cpp60
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 &param = 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();
}