diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/quick/qmltests/data/tst_action.qml | 54 | ||||
-rw-r--r-- | tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp | 95 |
2 files changed, 147 insertions, 2 deletions
diff --git a/tests/auto/quick/qmltests/data/tst_action.qml b/tests/auto/quick/qmltests/data/tst_action.qml index f6d8669fe..56a91d8d0 100644 --- a/tests/auto/quick/qmltests/data/tst_action.qml +++ b/tests/auto/quick/qmltests/data/tst_action.qml @@ -127,5 +127,59 @@ TestWebEngineView { stopAction.trigger(); compare(stopTriggerSpy.count, 0); } + + function test_editActionsWithExplicitFocus() { + var webView = Qt.createQmlObject("TestWebEngineView { visible: false; }", webEngineView); + webView.settings.focusOnNavigationEnabled = false; + + // The view is hidden and no focus on the page. Edit actions should be disabled. + var selectAllAction = webView.action(WebEngineView.SelectAll); + verify(selectAllAction); + verify(!selectAllAction.enabled); + + var triggerSpy = createTemporaryObject(signalSpy, webEngineView, {target: selectAllAction, signalName: "triggered"}); + var enabledSpy = createTemporaryObject(signalSpy, webEngineView, {target: selectAllAction, signalName: "enabledChanged"}); + + webView.loadHtml("<html><body><div>foo bar</div></body></html>"); + verify(webView.waitForLoadSucceeded()); + + // Still no focus because focus on navigation is disabled. Edit actions don't do anything (should not crash). + verify(!selectAllAction.enabled); + compare(enabledSpy.count, 0); + selectAllAction.trigger(); + compare(triggerSpy.count, 0); + compare(getTextSelection(), ""); + + // Focus content by focusing window from JavaScript. Edit actions should be enabled and functional. + webView.runJavaScript("window.focus();"); + tryVerify(function() { return enabledSpy.count === 1 }); + verify(selectAllAction.enabled); + selectAllAction.trigger(); + compare(triggerSpy.count, 1); + tryVerify(function() { return webView.getTextSelection() === "foo bar" }); + } + + function test_editActionsWithInitialFocus() { + var webView = Qt.createQmlObject("TestWebEngineView { visible: false; }", webEngineView); + webView.settings.focusOnNavigationEnabled = true; + + // The view is hidden and no focus on the page. Edit actions should be disabled. + var selectAllAction = webView.action(WebEngineView.SelectAll); + verify(selectAllAction); + verify(!selectAllAction.enabled); + + var triggerSpy = createTemporaryObject(signalSpy, webEngineView, {target: selectAllAction, signalName: "triggered"}); + var enabledSpy = createTemporaryObject(signalSpy, webEngineView, {target: selectAllAction, signalName: "enabledChanged"}); + + webView.loadHtml("<html><body><div>foo bar</div></body></html>"); + verify(webView.waitForLoadSucceeded()); + + // Content gets initial focus. + tryVerify(function() { return enabledSpy.count === 1 }); + verify(selectAllAction.enabled); + selectAllAction.trigger(); + compare(triggerSpy.count, 1); + tryVerify(function() { return webView.getTextSelection() === "foo bar" }); + } } } diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp index dd1140a4f..47ae0bdb5 100644 --- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp +++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp @@ -202,6 +202,10 @@ private Q_SLOTS: void sendNotification(); void contentsSize(); + void editActionsWithExplicitFocus(); + void editActionsWithInitialFocus(); + void editActionsWithFocusOnIframe(); + private: static QPoint elementCenter(QWebEnginePage *page, const QString &id); @@ -709,8 +713,8 @@ void tst_QWebEnginePage::textSelection() // these actions must exist QVERIFY(page->action(QWebEnginePage::SelectAll) != 0); - // ..but SelectAll is awalys enabled - QCOMPARE(page->action(QWebEnginePage::SelectAll)->isEnabled(), true); + // ..but SelectAll is disabled because the page has no focus due to disabled FocusOnNavigationEnabled. + QCOMPARE(page->action(QWebEnginePage::SelectAll)->isEnabled(), false); // Verify hasSelection returns false since there is no selection yet... QCOMPARE(page->hasSelection(), false); @@ -3398,6 +3402,93 @@ void tst_QWebEnginePage::contentsSize() QCOMPARE(m_page->contentsSize().height(), 1216); } +void tst_QWebEnginePage::editActionsWithExplicitFocus() +{ + QWebEngineView view; + QWebEnginePage *page = view.page(); + view.settings()->setAttribute(QWebEngineSettings::FocusOnNavigationEnabled, false); + + QSignalSpy loadFinishedSpy(page, &QWebEnginePage::loadFinished); + QSignalSpy selectionChangedSpy(page, &QWebEnginePage::selectionChanged); + QSignalSpy actionChangedSpy(page->action(QWebEnginePage::SelectAll), &QAction::changed); + + // The view is hidden and no focus on the page. Edit actions should be disabled. + QVERIFY(!view.isVisible()); + QVERIFY(!page->action(QWebEnginePage::SelectAll)->isEnabled()); + + page->setHtml(QString("<html><body><div>foo bar</div></body></html>")); + QTRY_COMPARE(loadFinishedSpy.count(), 1); + + // Still no focus because focus on navigation is disabled. Edit actions don't do anything (should not crash). + QVERIFY(!page->action(QWebEnginePage::SelectAll)->isEnabled()); + view.page()->triggerAction(QWebEnginePage::SelectAll); + QCOMPARE(selectionChangedSpy.count(), 0); + QCOMPARE(page->hasSelection(), false); + + // Focus content by focusing window from JavaScript. Edit actions should be enabled and functional. + evaluateJavaScriptSync(page, "window.focus();"); + QTRY_COMPARE(actionChangedSpy.count(), 1); + QVERIFY(page->action(QWebEnginePage::SelectAll)->isEnabled()); + view.page()->triggerAction(QWebEnginePage::SelectAll); + QTRY_COMPARE(selectionChangedSpy.count(), 1); + QCOMPARE(page->hasSelection(), true); + QCOMPARE(page->selectedText(), QStringLiteral("foo bar")); +} + +void tst_QWebEnginePage::editActionsWithInitialFocus() +{ + QWebEngineView view; + QWebEnginePage *page = view.page(); + view.settings()->setAttribute(QWebEngineSettings::FocusOnNavigationEnabled, true); + + QSignalSpy loadFinishedSpy(page, &QWebEnginePage::loadFinished); + QSignalSpy selectionChangedSpy(page, &QWebEnginePage::selectionChanged); + QSignalSpy actionChangedSpy(page->action(QWebEnginePage::SelectAll), &QAction::changed); + + // The view is hidden and no focus on the page. Edit actions should be disabled. + QVERIFY(!view.isVisible()); + QVERIFY(!page->action(QWebEnginePage::SelectAll)->isEnabled()); + + page->setHtml(QString("<html><body><div>foo bar</div></body></html>")); + QTRY_COMPARE(loadFinishedSpy.count(), 1); + + // Content gets initial focus. + QTRY_COMPARE(actionChangedSpy.count(), 1); + QVERIFY(page->action(QWebEnginePage::SelectAll)->isEnabled()); + view.page()->triggerAction(QWebEnginePage::SelectAll); + QTRY_COMPARE(selectionChangedSpy.count(), 1); + QCOMPARE(page->hasSelection(), true); + QCOMPARE(page->selectedText(), QStringLiteral("foo bar")); +} + +void tst_QWebEnginePage::editActionsWithFocusOnIframe() +{ + QWebEngineView view; + QWebEnginePage *page = view.page(); + view.settings()->setAttribute(QWebEngineSettings::FocusOnNavigationEnabled, false); + + QSignalSpy loadFinishedSpy(page, &QWebEnginePage::loadFinished); + QSignalSpy selectionChangedSpy(page, &QWebEnginePage::selectionChanged); + QSignalSpy actionChangedSpy(page->action(QWebEnginePage::SelectAll), &QAction::changed); + + // The view is hidden and no focus on the page. Edit actions should be disabled. + QVERIFY(!view.isVisible()); + QVERIFY(!page->action(QWebEnginePage::SelectAll)->isEnabled()); + + page->load(QUrl("qrc:///resources/iframe2.html")); + QTRY_COMPARE(loadFinishedSpy.count(), 1); + QVERIFY(!page->action(QWebEnginePage::SelectAll)->isEnabled()); + + // Focusing an iframe. + evaluateJavaScriptSync(page, "document.getElementsByTagName('iframe')[0].contentWindow.focus()"); + QTRY_COMPARE(actionChangedSpy.count(), 1); + QVERIFY(page->action(QWebEnginePage::SelectAll)->isEnabled()); + view.page()->triggerAction(QWebEnginePage::SelectAll); + QTRY_COMPARE(selectionChangedSpy.count(), 1); + QCOMPARE(page->hasSelection(), true); + QCOMPARE(page->selectedText(), QStringLiteral("inner")); +} + static QByteArrayList params = {QByteArrayLiteral("--use-fake-device-for-media-stream")}; W_QTEST_MAIN(tst_QWebEnginePage, params) |