From 2a4a5b2ec17189d4ea8fa783cf219c65560e81f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCri=20Valdmann?= Date: Mon, 15 Jan 2018 17:57:05 +0100 Subject: Add support for registerProtocolHandler Extend initialization of URLRequestContextGetterQt to create a content::ProtocolHandlerRegistry for each content::BrowserContext and add the registry's URL request interceptor to the front of the interceptor chain. Implement methods in WebContentsDelegateQt to add/remove protocol handlers to/from the ProtocolHandlerRegistry. Add permission request signal and classes for core, quick and widgets. Add widgets autotest. Add signal handlers to quicknanobrowser and simplebrowser. Task-number: QTBUG-62783 Change-Id: I808e7eb9a1cb4d7216686deed4895de14fe46310 Reviewed-by: Allan Sandfeld Jensen --- tests/auto/quick/publicapi/tst_publicapi.cpp | 6 ++ .../auto/widgets/qwebenginepage/qwebenginepage.pro | 1 + .../widgets/qwebenginepage/tst_qwebenginepage.cpp | 65 ++++++++++++++++++++++ 3 files changed, 72 insertions(+) (limited to 'tests') diff --git a/tests/auto/quick/publicapi/tst_publicapi.cpp b/tests/auto/quick/publicapi/tst_publicapi.cpp index 032324e45..52d8a0b41 100644 --- a/tests/auto/quick/publicapi/tst_publicapi.cpp +++ b/tests/auto/quick/publicapi/tst_publicapi.cpp @@ -67,6 +67,7 @@ static QList typesToCheck = QList() << &QQuickWebEngineSettings::staticMetaObject << &QQuickWebEngineFullScreenRequest::staticMetaObject << &QQuickWebEngineQuotaPermissionRequest::staticMetaObject + << &QQuickWebEngineRegisterProtocolHandlerPermissionRequest::staticMetaObject << &QQuickWebEngineSingleton::staticMetaObject << &QQuickWebEngineAuthenticationDialogRequest::staticMetaObject << &QQuickWebEngineJavaScriptDialogRequest::staticMetaObject @@ -295,6 +296,10 @@ static QStringList expectedAPI = QStringList() << "QQuickWebEngineQuotaPermissionRequest.origin --> QUrl" << "QQuickWebEngineQuotaPermissionRequest.reject() --> void" << "QQuickWebEngineQuotaPermissionRequest.requestedSize --> qlonglong" + << "QQuickWebEngineRegisterProtocolHandlerPermissionRequest.accept() --> void" + << "QQuickWebEngineRegisterProtocolHandlerPermissionRequest.origin --> QUrl" + << "QQuickWebEngineRegisterProtocolHandlerPermissionRequest.protocol --> QString" + << "QQuickWebEngineRegisterProtocolHandlerPermissionRequest.reject() --> void" << "QQuickWebEngineScript.ApplicationWorld --> ScriptWorldId" << "QQuickWebEngineScript.Deferred --> InjectionPoint" << "QQuickWebEngineScript.DocumentCreation --> InjectionPoint" @@ -653,6 +658,7 @@ static QStringList expectedAPI = QStringList() << "QQuickWebEngineView.quotaPermissionRequested(QQuickWebEngineQuotaPermissionRequest) --> void" << "QQuickWebEngineView.recentlyAudible --> bool" << "QQuickWebEngineView.recentlyAudibleChanged(bool) --> void" + << "QQuickWebEngineView.registerProtocolHandlerPermissionRequested(QQuickWebEngineRegisterProtocolHandlerPermissionRequest) --> void" << "QQuickWebEngineView.reload() --> void" << "QQuickWebEngineView.reloadAndBypassCache() --> void" << "QQuickWebEngineView.renderProcessTerminated(RenderProcessTerminationStatus,int) --> void" diff --git a/tests/auto/widgets/qwebenginepage/qwebenginepage.pro b/tests/auto/widgets/qwebenginepage/qwebenginepage.pro index 47c09e1ce..8e7453827 100644 --- a/tests/auto/widgets/qwebenginepage/qwebenginepage.pro +++ b/tests/auto/widgets/qwebenginepage/qwebenginepage.pro @@ -1,4 +1,5 @@ include(../tests.pri) +include(../../shared/http.pri) QT *= core-private qtConfig(webengine-printing-and-pdf): DEFINES+=QWEBENGINEPAGE_PDFPRINTINGENABLED diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp index a32d96b3a..fbed89dd3 100644 --- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp +++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -49,6 +50,7 @@ #include #include #include +#include #include #include #include @@ -210,6 +212,8 @@ private Q_SLOTS: void viewSourceURL_data(); void viewSourceURL(); void proxyConfigWithUnexpectedHostPortPair(); + void registerProtocolHandler_data(); + void registerProtocolHandler(); private: static QPoint elementCenter(QWebEnginePage *page, const QString &id); @@ -4202,6 +4206,67 @@ void tst_QWebEnginePage::proxyConfigWithUnexpectedHostPortPair() QTRY_COMPARE(loadFinishedSpy.count(), 1); } +void tst_QWebEnginePage::registerProtocolHandler_data() +{ + QTest::addColumn("permission"); + QTest::newRow("accept") << true; + QTest::newRow("reject") << false; +} + +void tst_QWebEnginePage::registerProtocolHandler() +{ + QFETCH(bool, permission); + + HttpServer server; + QWebEnginePage page; + QSignalSpy loadSpy(&page, &QWebEnginePage::loadFinished); + QSignalSpy permissionSpy(&page, &QWebEnginePage::registerProtocolHandlerPermissionRequested); + + page.setUrl(server.url("/")); + auto rr1 = waitForRequest(&server); + QVERIFY(rr1); + rr1->setResponseBody(QByteArrayLiteral("some text here")); + rr1->sendResponse(); + auto rr2 = waitForRequest(&server); + QVERIFY(rr2); + QCOMPARE(rr2->requestMethod(), QByteArrayLiteral("GET")); + QCOMPARE(rr2->requestPath(), QByteArrayLiteral("/favicon.ico")); + rr2->setResponseStatus(404); + rr2->sendResponse(); + QTRY_COMPARE(loadSpy.count(), 1); + QCOMPARE(loadSpy.takeFirst().value(0).toBool(), true); + + QString callFormat = QStringLiteral("window.navigator.registerProtocolHandler(\"%1\", \"%2\", \"%3\")"); + QString protocol = QStringLiteral("mailto"); + QString url = server.url("/mail").toString() + QStringLiteral("?uri=%s"); + QString title; + QString call = callFormat.arg(protocol).arg(url).arg(title); + page.runJavaScript(call); + + QTRY_COMPARE(permissionSpy.count(), 1); + auto request = permissionSpy.takeFirst().value(0).value(); + QCOMPARE(request.origin(), QUrl(url)); + QCOMPARE(request.protocol(), protocol); + if (permission) + request.accept(); + else + request.reject(); + + page.runJavaScript(QStringLiteral("document.getElementById(\"link\").click()")); + + std::unique_ptr rr3; + if (permission) { + rr3 = waitForRequest(&server); + QVERIFY(rr3); + QCOMPARE(rr3->requestMethod(), QByteArrayLiteral("GET")); + QCOMPARE(rr3->requestPath(), QByteArrayLiteral("/mail?uri=mailto%3Afoo%40bar.com")); + rr3->sendResponse(); + } + + QTRY_COMPARE(loadSpy.count(), 1); + QCOMPARE(loadSpy.takeFirst().value(0).toBool(), permission); +} + static QByteArrayList params = {QByteArrayLiteral("--use-fake-device-for-media-stream")}; W_QTEST_MAIN(tst_QWebEnginePage, params) -- cgit v1.2.3