From 78cc35d0705ef9f7b3e7785f031f77595ed71217 Mon Sep 17 00:00:00 2001 From: Valentin Fokin Date: Mon, 13 Nov 2017 10:09:13 +0100 Subject: Add QML autotests for ContextMenu Change-Id: If18bb163744b9064c0e4d97a9476851b6dee39ad Reviewed-by: Qt CI Bot Reviewed-by: Peter Varga --- tests/auto/quick/qmltests/data/tst_contextMenu.qml | 224 +++++++++++++++++++++ 1 file changed, 224 insertions(+) create mode 100644 tests/auto/quick/qmltests/data/tst_contextMenu.qml (limited to 'tests/auto/quick/qmltests/data/tst_contextMenu.qml') diff --git a/tests/auto/quick/qmltests/data/tst_contextMenu.qml b/tests/auto/quick/qmltests/data/tst_contextMenu.qml new file mode 100644 index 000000000..58947beaf --- /dev/null +++ b/tests/auto/quick/qmltests/data/tst_contextMenu.qml @@ -0,0 +1,224 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick.Controls 1.4 +import QtTest 1.0 +import QtWebEngine 1.6 + +TestWebEngineView { + id: webEngineView + width: 400 + height: 400 + + property string linkText: "" + property var mediaType: null + property string selectedText: "" + + onContextMenuRequested: { + linkText = request.linkText; + mediaType = request.mediaType; + selectedText = request.selectedText; + } + + SignalSpy { + id: contextMenuRequestedSpy + target: webEngineView + signalName: "contextMenuRequested" + } + + function getContextMenus() { + var data = webEngineView.data; + var contextMenus = []; + + for (var i = 0; i < data.length; i++) { + if (data[i].type == MenuItemType.Menu) { + contextMenus.push(data[i]); + } + } + return contextMenus; + } + + function destroyContextMenu() { + contextMenuTest.keyPress(Qt.Key_Escape); + return getContextMenus().length == 0; + } + + TestCase { + id: contextMenuTest + name: "WebEngineViewContextMenu" + when: windowShown + + function init() { + var contextMenus = getContextMenus(); + compare(contextMenus.length, 0); + } + + function cleanup() { + contextMenuRequestedSpy.clear(); + } + + function test_contextMenu_data() { + return [ + { tag: "defaultContextMenu", userHandled: false, accepted: false }, + { tag: "defaultContextMenuWithConnect", userHandled: true, accepted: false }, + { tag: "dontShowDefaultContextMenu", userHandled: true, accepted: true }, + ]; + } + + function test_contextMenu(row) { + if (Qt.platform.os == "osx") { + skip("When the menu pops up on macOS, it does not return and the test fails after time out."); + } + + function contextMenuHandler(request) { + request.accepted = row.accepted; + } + + if (row.userHandled) { + webEngineView.contextMenuRequested.connect(contextMenuHandler); + } + + mouseClick(webEngineView, 20, 20, Qt.RightButton); + contextMenuRequestedSpy.wait(); + compare(contextMenuRequestedSpy.count, 1); + + // There should be maximum one ContextMenu present at a time + var contextMenus = getContextMenus(); + verify(contextMenus.length <= 1); + compare(contextMenus[0] != null, !row.accepted); + + // FIXME: Sometimes the keyPress(Qt.Key_Escape) event isn't caught so we keep trying + tryVerify(destroyContextMenu); + webEngineView.contextMenuRequested.disconnect(contextMenuHandler); + } + + function test_contextMenuLinkAndSelectedText() { + if (Qt.platform.os == "osx") { + skip("When the menu pops up on macOS, it does not return and the test fails after time out."); + } + + webEngineView.loadHtml("" + + "Text " + + "Link" + + ""); + verify(webEngineView.waitForLoadSucceeded()); + + // 1. Nothing is selected, right click on the link + var linkCenter = getElementCenter("link"); + mouseClick(webEngineView, linkCenter.x, linkCenter.y, Qt.RightButton); + contextMenuRequestedSpy.wait(); + compare(contextMenuRequestedSpy.count, 1); + + var contextMenus = getContextMenus(); + compare(contextMenus.length, 1); + verify(contextMenus[0]); + compare(linkText, "Link"); + compare(mediaType, ContextMenuRequest.MediaTypeNone); + compare(selectedText, ""); + + contextMenuRequestedSpy.clear(); + // FIXME: Sometimes the keyPress(Qt.Key_Escape) event isn't caught so we keep trying + tryVerify(destroyContextMenu); + + // 2. Everything is selected, right click on the link + webEngineView.triggerWebAction(WebEngineView.SelectAll); + tryVerify(function() { return getTextSelection() == "Text Link" }); + + mouseClick(webEngineView, linkCenter.x, linkCenter.y, Qt.RightButton); + contextMenuRequestedSpy.wait(); + compare(contextMenuRequestedSpy.count, 1); + + contextMenus = getContextMenus(); + compare(contextMenus.length, 1); + verify(contextMenus[0]); + compare(linkText, "Link"); + compare(mediaType, ContextMenuRequest.MediaTypeNone); + compare(selectedText, "Text Link"); + + contextMenuRequestedSpy.clear(); + // FIXME: Sometimes the keyPress(Qt.Key_Escape) event isn't caught so we keep trying + tryVerify(destroyContextMenu); + + // 3. Everything is selected, right click on the text + var textCenter = getElementCenter("text"); + mouseClick(webEngineView, textCenter.x, textCenter.y, Qt.RightButton); + contextMenuRequestedSpy.wait(); + compare(contextMenuRequestedSpy.count, 1); + + contextMenus = getContextMenus(); + compare(contextMenus.length, 1); + verify(contextMenus[0]); + compare(linkText, ""); + compare(mediaType, ContextMenuRequest.MediaTypeNone); + compare(selectedText, "Text Link"); + + // FIXME: Sometimes the keyPress(Qt.Key_Escape) event isn't caught so we keep trying + tryVerify(destroyContextMenu); + } + + function test_contextMenuMediaType() { + if (Qt.platform.os == "osx") { + skip("When the menu pops up on macOS, it does not return and the test fails after time out."); + } + + webEngineView.url = Qt.resolvedUrl("favicon.html"); + verify(webEngineView.waitForLoadSucceeded()); + // 1. Right click on the image + var center = getElementCenter("image"); + mouseClick(webEngineView, center.x, center.y, Qt.RightButton); + contextMenuRequestedSpy.wait(); + compare(contextMenuRequestedSpy.count, 1); + + var contextMenus = getContextMenus(); + compare(contextMenus.length, 1); + verify(contextMenus[0]); + compare(linkText, ""); + compare(mediaType, ContextMenuRequest.MediaTypeImage); + compare(selectedText, ""); + contextMenuRequestedSpy.clear(); + // FIXME: Sometimes the keyPress(Qt.Key_Escape) event isn't caught so we keep trying + tryVerify(destroyContextMenu); + + // 2. Right click out of the image + mouseClick(webEngineView, center.x + 30, center.y, Qt.RightButton); + contextMenuRequestedSpy.wait(); + compare(contextMenuRequestedSpy.count, 1); + + contextMenus = getContextMenus(); + compare(contextMenus.length, 1); + verify(contextMenus[0]); + compare(linkText, ""); + compare(mediaType, ContextMenuRequest.MediaTypeNone); + compare(selectedText, ""); + + // FIXME: Sometimes the keyPress(Qt.Key_Escape) event isn't caught so we keep trying + tryVerify(destroyContextMenu); + } + } +} -- cgit v1.2.3