diff --git a/src/qml/jsruntime/qv4urlobject.cpp b/src/qml/jsruntime/qv4urlobject.cpp index 4417d327c6..637d033bd4 100644 --- a/src/qml/jsruntime/qv4urlobject.cpp +++ b/src/qml/jsruntime/qv4urlobject.cpp @@ -248,7 +248,10 @@ QString UrlObject::search() const if (auto url = QUrl(href()); !url.hasQuery() || url.query().isEmpty()) return QLatin1String(""); - return QLatin1Char('?') + url.query(QUrl::ComponentFormattingOptions(QUrl::ComponentFormattingOption::FullyEncoded)); + constexpr auto options = QUrl::ComponentFormattingOption::EncodeSpaces + | QUrl::ComponentFormattingOption::EncodeUnicode + | QUrl::ComponentFormattingOption::EncodeReserved; + return u'?' + url.query(options); } QUrl UrlObject::toQUrl() const diff --git a/tests/auto/qml/qv4urlobject/tst_qv4urlobject.cpp b/tests/auto/qml/qv4urlobject/tst_qv4urlobject.cpp index 886bfda018..b74ec3d583 100644 --- a/tests/auto/qml/qv4urlobject/tst_qv4urlobject.cpp +++ b/tests/auto/qml/qv4urlobject/tst_qv4urlobject.cpp @@ -116,6 +116,14 @@ void tst_urlobject::urlObject_search_data() << "var url = new URL(\"http://google.com/search/?a=㉽\");" "url.search" << "?a=%E3%89%BD"; + QTest::newRow("backslash") + // The JS string in the C++ source ends in 4 backslashes. + // The C++ compiler turns that into 2 backslashes. + // QV4 receives source code containing a string literal ending in two backslashes. + // The resulting JS string ends in a single backslash. + << "var url = new URL('http://google.com/search/?q=\\\\');" + "url.search" + << "?q=\\"; } void tst_urlobject::urlObject_href()