aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlivier De Cannière <[email protected]>2023-02-06 10:12:11 +0100
committerOlivier De Cannière <[email protected]>2023-02-09 13:02:01 +0100
commitd2c8fe712a87a247864decd9d13167f847035aab (patch)
treed79e36abe66f95b8d22d287e4c60ba2ab30e32dd
parent2af8743aab51287ec914d25176ae0fc45202db32 (diff)
UrlObject: Fix setting searchParams not modifying the url's search field
Previously, setting the search params via the searchParams.set() method did not change the url's search field. The searchParams object now has a back pointer to the urlObject it belongs to. Whenever a search param is set, the url search field is also updated. The tst_qv4urlobject test was also added to check proper behavior. Pick-to: 6.5 Task-number: QTBUG-110454 Change-Id: I3b0e843395da8a0e5aedcf71895981f68560d9c6 Reviewed-by: Fabian Kosmale <[email protected]>
-rw-r--r--src/qml/jsruntime/qv4urlobject.cpp29
-rw-r--r--src/qml/jsruntime/qv4urlobject_p.h11
-rw-r--r--tests/auto/qml/CMakeLists.txt1
-rw-r--r--tests/auto/qml/qv4urlobject/CMakeLists.txt20
-rw-r--r--tests/auto/qml/qv4urlobject/tst_qv4urlobject.cpp58
5 files changed, 116 insertions, 3 deletions
diff --git a/src/qml/jsruntime/qv4urlobject.cpp b/src/qml/jsruntime/qv4urlobject.cpp
index 8b6db439e2..e5d8ddb9e8 100644
--- a/src/qml/jsruntime/qv4urlobject.cpp
+++ b/src/qml/jsruntime/qv4urlobject.cpp
@@ -670,6 +670,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();
@@ -960,6 +961,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 +1014,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();
@@ -1335,6 +1360,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();
}
diff --git a/src/qml/jsruntime/qv4urlobject_p.h b/src/qml/jsruntime/qv4urlobject_p.h
index e4a3ba073b..4e4a03a923 100644
--- a/src/qml/jsruntime/qv4urlobject_p.h
+++ b/src/qml/jsruntime/qv4urlobject_p.h
@@ -50,12 +50,13 @@ struct UrlCtor : FunctionObject
void init(QV4::ExecutionContext *scope);
};
-// clang-format on
+// clang-format off
#define UrlSearchParamsObjectMembers(class, Member) \
Member(class, Pointer, ArrayObject *, params) \
Member(class, Pointer, ArrayObject *, keys) \
- Member(class, Pointer, ArrayObject *, values)
-// clang-format off
+ Member(class, Pointer, ArrayObject *, values) \
+ Member(class, Pointer, UrlObject *, url)
+// clang-format on
DECLARE_HEAP_OBJECT(UrlSearchParamsObject, Object)
{
@@ -212,6 +213,10 @@ struct UrlSearchParamsObject : Object
QList<QStringList> params() const;
void setParams(QList<QStringList> params);
+ Heap::UrlObject *urlObject() const;
+ void setUrlObject(const UrlObject *url);
+
+ QString searchString() const;
QString nameAt(int index) const;
Heap::String * nameAtRaw(int index) const;
diff --git a/tests/auto/qml/CMakeLists.txt b/tests/auto/qml/CMakeLists.txt
index 77663f350d..e5b6de7b8c 100644
--- a/tests/auto/qml/CMakeLists.txt
+++ b/tests/auto/qml/CMakeLists.txt
@@ -142,6 +142,7 @@ if(QT_FEATURE_private_tests)
add_subdirectory(qv4mm)
add_subdirectory(qv4identifiertable)
add_subdirectory(qv4regexp)
+ add_subdirectory(qv4urlobject)
if(QT_FEATURE_process AND NOT QNX)
add_subdirectory(ecmascripttests)
endif()
diff --git a/tests/auto/qml/qv4urlobject/CMakeLists.txt b/tests/auto/qml/qv4urlobject/CMakeLists.txt
new file mode 100644
index 0000000000..4686efe4a3
--- /dev/null
+++ b/tests/auto/qml/qv4urlobject/CMakeLists.txt
@@ -0,0 +1,20 @@
+# Copyright (C) 2023 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+# Generated from qv4urlobject.pro.
+
+#####################################################################
+## tst_qv4urlobject Test:
+#####################################################################
+
+qt_internal_add_test(tst_qv4urlobject
+ SOURCES
+ tst_qv4urlobject.cpp
+ LIBRARIES
+ Qt::Gui
+ Qt::Qml
+ Qt::QmlPrivate
+)
+
+## Scopes:
+#####################################################################
diff --git a/tests/auto/qml/qv4urlobject/tst_qv4urlobject.cpp b/tests/auto/qml/qv4urlobject/tst_qv4urlobject.cpp
new file mode 100644
index 0000000000..99a5803586
--- /dev/null
+++ b/tests/auto/qml/qv4urlobject/tst_qv4urlobject.cpp
@@ -0,0 +1,58 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+
+#include <qtest.h>
+#include <QtQml/qjsengine.h>
+
+class tst_urlobject : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void searchParams_set();
+ void searchParams_nullUrlPointer();
+};
+
+void tst_urlobject::searchParams_set()
+{
+ QJSEngine engine;
+ QJSValue result =
+ engine.evaluate(QLatin1String("var url = new URL(\"http://www.google.com/search\");"
+ "url.href"));
+ QVERIFY(!result.isError());
+ QCOMPARE(result.toString(), "http://www.google.com/search");
+
+ result = engine.evaluate(QLatin1String("url.toString()"));
+ QVERIFY(!result.isError());
+ QCOMPARE(result.toString(), "http://www.google.com/search");
+
+ result = engine.evaluate(QLatin1String("url.searchParams.set(\"q\", \"value\");"
+ "url.href;"));
+ QVERIFY(!result.isError());
+ QCOMPARE(result.toString(), "http://www.google.com/search?q=value");
+
+ result = engine.evaluate(QLatin1String("url.toString()"));
+ QVERIFY(!result.isError());
+ QCOMPARE(result.toString(), "http://www.google.com/search?q=value");
+
+ result = engine.evaluate(QLatin1String("url.searchParams.set(\"t\", \"otherValue\");"
+ "url.href;"));
+ QVERIFY(!result.isError());
+ QCOMPARE(result.toString(), "http://www.google.com/search?q=value&t=otherValue");
+
+ result = engine.evaluate(QLatin1String("url.toString()"));
+ QVERIFY(!result.isError());
+ QCOMPARE(result.toString(), "http://www.google.com/search?q=value&t=otherValue");
+}
+
+void tst_urlobject::searchParams_nullUrlPointer()
+{
+ QJSEngine engine;
+ QJSValue result = engine.evaluate(QLatin1String("let params = new URLSearchParams();"
+ "params.set(\"foo\", \"bar\");"));
+ QVERIFY(!result.isError());
+}
+
+QTEST_MAIN(tst_urlobject)
+
+#include "tst_qv4urlobject.moc"