summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorAndras Becsi <andras.becsi@digia.com>2014-07-25 15:53:07 +0200
committerAndras Becsi <andras.becsi@digia.com>2014-08-06 17:20:17 +0200
commitca30d0374020752d3ac367fdffef88a5c1fe4a48 (patch)
treed93bb8ca51657febaee379e86c422d91b905a68b /tests
parent7d90b44187cfa8f93df6a6341da41cf8192d18ad (diff)
Add QQuick API for intercepting navigation requests
Add missing navigationRequested API to be able to intercept navigation requests. This is useful for ignoring requests for example in kiosk-like applications that want to restrinct navigation to a specific url or domain, or want to disable specific types of navigation requests (e.g. reloading, clicking links, form submissions). Change-Id: Ie375e635a3c3566527972d05f5d99b39489c5ca8 Reviewed-by: Jocelyn Turcotte <jocelyn.turcotte@digia.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/quick/publicapi/tst_publicapi.cpp10
-rw-r--r--tests/auto/quick/qmltests/data/test2.html3
-rw-r--r--tests/auto/quick/qmltests/data/tst_navigationRequested.qml154
-rw-r--r--tests/auto/quick/qmltests/qmltests.pro1
4 files changed, 162 insertions, 6 deletions
diff --git a/tests/auto/quick/publicapi/tst_publicapi.cpp b/tests/auto/quick/publicapi/tst_publicapi.cpp
index 57b6e9001..ad54bd12e 100644
--- a/tests/auto/quick/publicapi/tst_publicapi.cpp
+++ b/tests/auto/quick/publicapi/tst_publicapi.cpp
@@ -47,8 +47,7 @@
#include <QtTest/QtTest>
#include <private/qquickwebengineview_p.h>
#include <private/qquickwebengineloadrequest_p.h>
-// FIXME: Implement!
-// #include <qquickwebenginenavigationrequest_p.h>
+#include <private/qquickwebenginenavigationrequest_p.h>
class tst_publicapi : public QObject {
Q_OBJECT
@@ -59,7 +58,7 @@ private Q_SLOTS:
static QList<const QMetaObject *> typesToCheck = QList<const QMetaObject *>()
<< &QQuickWebEngineView::staticMetaObject
<< &QQuickWebEngineLoadRequest::staticMetaObject
- // << &QQuickWebEngineNavigationRequest::staticMetaObject
+ << &QQuickWebEngineNavigationRequest::staticMetaObject
;
static QList<const char *> knownEnumNames = QList<const char *>();
@@ -79,10 +78,10 @@ static QStringList expectedAPI = QStringList()
<< "QQuickWebEngineView.FtpErrorDomain --> ErrorDomain"
<< "QQuickWebEngineView.DnsErrorDomain --> ErrorDomain"
<< "QQuickWebEngineView.LinkClickedNavigation --> NavigationType"
+ << "QQuickWebEngineView.TypedNavigation --> NavigationType"
<< "QQuickWebEngineView.FormSubmittedNavigation --> NavigationType"
<< "QQuickWebEngineView.BackForwardNavigation --> NavigationType"
<< "QQuickWebEngineView.ReloadNavigation --> NavigationType"
- << "QQuickWebEngineView.FormResubmittedNavigation --> NavigationType"
<< "QQuickWebEngineView.OtherNavigation --> NavigationType"
<< "QQuickWebEngineView.NewViewInWindow --> NewViewDestination"
<< "QQuickWebEngineView.NewViewInTab --> NewViewDestination"
@@ -118,8 +117,7 @@ static QStringList expectedAPI = QStringList()
<< "QQuickWebEngineLoadRequest.errorDomain --> QQuickWebEngineView::ErrorDomain"
<< "QQuickWebEngineLoadRequest.errorCode --> int"
<< "QQuickWebEngineNavigationRequest.url --> QUrl"
- << "QQuickWebEngineNavigationRequest.mouseButton --> int"
- << "QQuickWebEngineNavigationRequest.keyboardModifiers --> int"
+ << "QQuickWebEngineNavigationRequest.isMainFrame --> bool"
<< "QQuickWebEngineNavigationRequest.action --> QQuickWebEngineView::NavigationRequestAction"
<< "QQuickWebEngineNavigationRequest.navigationType --> QQuickWebEngineView::NavigationType"
<< "QQuickWebEngineNavigationRequest.actionChanged() --> void"
diff --git a/tests/auto/quick/qmltests/data/test2.html b/tests/auto/quick/qmltests/data/test2.html
index 629c2a063..8e20d7e9e 100644
--- a/tests/auto/quick/qmltests/data/test2.html
+++ b/tests/auto/quick/qmltests/data/test2.html
@@ -2,5 +2,8 @@
<head><title>Test page with huge link area</title></head>
<body>
<a title="A title" href="test1.html"><img width=200 height=200></a>
+<div>
+ <iframe src="test1.html"></iframe>
+</div>
</body>
</html>
diff --git a/tests/auto/quick/qmltests/data/tst_navigationRequested.qml b/tests/auto/quick/qmltests/data/tst_navigationRequested.qml
new file mode 100644
index 000000000..aae3799bc
--- /dev/null
+++ b/tests/auto/quick/qmltests/data/tst_navigationRequested.qml
@@ -0,0 +1,154 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtTest 1.0
+import QtWebEngine 0.9
+
+TestWebEngineView {
+ id: webEngineView
+ width: 200
+ height: 400
+
+ property bool shouldIgnoreLinkClicks: false
+ property bool shouldIgnoreSubFrameRequests: false
+
+ QtObject {
+ id: attributes
+ property url mainUrl: ""
+ property url iframeUrl: ""
+ property bool linkClickedNavigationRequested: false
+ property bool linkClickedNavigationIgnored: false
+
+ function clear() {
+ mainUrl = ""
+ iframeUrl = ""
+ linkClickedNavigationRequested = false
+ linkClickedNavigationIgnored = false
+ }
+ }
+
+ SignalSpy {
+ id: navigationSpy
+ target: webEngineView
+ signalName: "navigationRequested"
+ }
+
+ onNavigationRequested: {
+ if (request.isMainFrame) {
+ attributes.mainUrl = request.url
+ } else {
+ attributes.iframeUrl = request.url
+ if (shouldIgnoreSubFrameRequests) {
+ request.action = WebEngineView.IgnoreRequest
+ }
+ }
+
+ if (request.navigationType === WebEngineView.LinkClickedNavigation) {
+ attributes.linkClickedNavigationRequested = true
+ if (shouldIgnoreLinkClicks) {
+ request.action = WebEngineView.IgnoreRequest
+ attributes.linkClickedNavigationIgnored = true
+ }
+ }
+ }
+
+ TestCase {
+ name: "WebEngineViewNavigationRequested"
+ when: windowShown
+
+ function init() {
+ attributes.clear()
+ navigationSpy.clear()
+ shouldIgnoreLinkClicks = false
+ shouldIgnoreSubFrameRequests = false
+ }
+
+ function test_navigationRequested() {
+ // Test if we get notified about main frame and iframe loads
+ compare(navigationSpy.count, 0)
+ webEngineView.url = Qt.resolvedUrl("test2.html")
+ navigationSpy.wait()
+ compare(attributes.mainUrl, Qt.resolvedUrl("test2.html"))
+ navigationSpy.wait()
+ compare(attributes.iframeUrl, Qt.resolvedUrl("test1.html"))
+ compare(navigationSpy.count, 2)
+ verify(webEngineView.waitForLoadSucceeded())
+
+ // Test if we get notified about clicked links
+ mouseClick(webEngineView, 100, 100)
+ tryCompare(navigationSpy, "count", 3)
+ compare(attributes.mainUrl, Qt.resolvedUrl("test1.html"))
+ verify(attributes.linkClickedNavigationRequested)
+ verify(webEngineView.waitForLoadSucceeded())
+ }
+
+ function test_ignoreLinkClickedRequest() {
+ // Test if we can ignore clicked link requests
+ compare(navigationSpy.count, 0)
+ webEngineView.url = Qt.resolvedUrl("test2.html")
+ verify(webEngineView.waitForLoadSucceeded())
+
+ shouldIgnoreLinkClicks = true
+ mouseClick(webEngineView, 100, 100)
+ tryCompare(navigationSpy, "count", 3)
+ compare(attributes.mainUrl, Qt.resolvedUrl("test1.html"))
+ verify(attributes.linkClickedNavigationRequested)
+ verify(attributes.linkClickedNavigationIgnored)
+ // We ignored the main frame request, so we should
+ // get notified that the load has been stopped.
+ verify(webEngineView.waitForLoadStopped())
+ verify(!webEngineView.loading)
+ }
+
+ function test_ignoreSubFrameRequest() {
+ // Test if we can ignore sub frame requests
+ shouldIgnoreSubFrameRequests = true
+ webEngineView.url = Qt.resolvedUrl("test2.html")
+ tryCompare(navigationSpy, "count", 2)
+ compare(attributes.mainUrl, Qt.resolvedUrl("test2.html"))
+ compare(attributes.iframeUrl, Qt.resolvedUrl("test1.html"))
+ // We ignored the sub frame request, so
+ // the main frame load should still succeed.
+ verify(webEngineView.waitForLoadSucceeded())
+ }
+ }
+}
diff --git a/tests/auto/quick/qmltests/qmltests.pro b/tests/auto/quick/qmltests/qmltests.pro
index e6a68b950..b4514edc9 100644
--- a/tests/auto/quick/qmltests/qmltests.pro
+++ b/tests/auto/quick/qmltests/qmltests.pro
@@ -27,6 +27,7 @@ OTHER_FILES += \
$$PWD/data/tst_loadProgressSignal.qml \
$$PWD/data/tst_loadUrl.qml \
$$PWD/data/tst_navigationHistory.qml \
+ $$PWD/data/tst_navigationRequested.qml \
$$PWD/data/tst_properties.qml \
$$PWD/data/tst_runJavaScript.qml \
$$PWD/data/tst_titleChanged.qml