From 0cc881b5bf8a4a6da8277d5166da92a1675f4654 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Mon, 29 Jun 2015 11:55:06 +0200 Subject: Add WebAction to QML api Adds WebActions matching QWebEnginePage to QQuickWebEngineView, this makes it possible to support copy/paste on OS X, and makes it possible to do rich text copy to clipboard on all platforms. Change-Id: If43c1b2e8ae0496423f830cfe6b86e0fa1b8126e Task-number: QTBUG-44289 Reviewed-by: Andras Becsi --- .../webengine/quicknanobrowser/BrowserWindow.qml | 51 +++++++++++++++++++--- src/webengine/api/qquickwebengineview.cpp | 48 +++++++++++++++++++- src/webengine/api/qquickwebengineview_p.h | 25 ++++++++++- src/webengine/plugin/plugin.cpp | 1 + src/webengine/ui_delegates_manager.cpp | 13 ------ src/webengine/ui_delegates_manager.h | 11 ----- src/webenginewidgets/api/qwebenginepage.cpp | 19 +------- 7 files changed, 117 insertions(+), 51 deletions(-) diff --git a/examples/webengine/quicknanobrowser/BrowserWindow.qml b/examples/webengine/quicknanobrowser/BrowserWindow.qml index 0df17f0ee..e7ad621b1 100644 --- a/examples/webengine/quicknanobrowser/BrowserWindow.qml +++ b/examples/webengine/quicknanobrowser/BrowserWindow.qml @@ -38,8 +38,8 @@ ** ****************************************************************************/ -import QtQuick 2.1 -import QtWebEngine 1.1 +import QtQuick 2.2 +import QtWebEngine 1.3 import QtQuick.Controls 1.0 import QtQuick.Controls.Styles 1.0 import QtQuick.Layouts 1.0 @@ -100,14 +100,14 @@ ApplicationWindow { } } Action { - shortcut: "Ctrl+R" + shortcut: StandardKey.Refresh onTriggered: { if (currentWebView) currentWebView.reload() } } Action { - shortcut: "Ctrl+T" + shortcut: StandardKey.AddTab onTriggered: { tabs.createEmptyTab(currentWebView.profile) tabs.currentIndex = tabs.count - 1 @@ -116,7 +116,7 @@ ApplicationWindow { } } Action { - shortcut: "Ctrl+W" + shortcut: StandardKey.Close onTriggered: { if (tabs.count == 1) browserWindow.close() @@ -136,14 +136,51 @@ ApplicationWindow { onTriggered: currentWebView.zoomFactor = 1.0; } Action { - shortcut: "Ctrl+-" + shortcut: StandardKey.ZoomOut onTriggered: currentWebView.zoomFactor -= 0.1; } Action { - shortcut: "Ctrl+=" + shortcut: StandardKey.ZoomIn onTriggered: currentWebView.zoomFactor += 0.1; } + Action { + shortcut: StandardKey.Copy + onTriggered: currentWebView.triggerWebAction(WebEngineView.Copy) + } + Action { + shortcut: StandardKey.Cut + onTriggered: currentWebView.triggerWebAction(WebEngineView.Cut) + } + Action { + shortcut: StandardKey.Paste + onTriggered: currentWebView.triggerWebAction(WebEngineView.Paste) + } + Action { + shortcut: "Shift+"+StandardKey.Paste + onTriggered: currentWebView.triggerWebAction(WebEngineView.PasteAndMatchStyle) + } + Action { + shortcut: StandardKey.SelectAll + onTriggered: currentWebView.triggerWebAction(WebEngineView.SelectAll) + } + Action { + shortcut: StandardKey.Undo + onTriggered: currentWebView.triggerWebAction(WebEngineView.Undo) + } + Action { + shortcut: StandardKey.Redo + onTriggered: currentWebView.triggerWebAction(WebEngineView.Redo) + } + Action { + shortcut: StandardKey.Back + onTriggered: currentWebView.triggerWebAction(WebEngineView.Back) + } + Action { + shortcut: StandardKey.Forward + onTriggered: currentWebView.triggerWebAction(WebEngineView.Forward) + } + toolBar: ToolBar { id: navigationBar RowLayout { diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp index 51dcb61eb..a90de3744 100644 --- a/src/webengine/api/qquickwebengineview.cpp +++ b/src/webengine/api/qquickwebengineview.cpp @@ -198,7 +198,8 @@ bool QQuickWebEngineViewPrivate::contextMenuRequested(const WebEngineContextMenu QObject::connect(item, &MenuItemHandler::triggered, q, &QQuickWebEngineView::reload); ui()->addMenuItem(item, QObject::tr("Reload"), QStringLiteral("view-refresh")); } else { - item = new CopyMenuItem(menu, data.selectedText); + item = new MenuItemHandler(menu); + QObject::connect(item, &MenuItemHandler::triggered, [q] { q->triggerWebAction(QQuickWebEngineView::Copy); }); ui()->addMenuItem(item, QObject::tr("Copy...")); } @@ -1040,6 +1041,51 @@ void QQuickWebEngineView::itemChange(ItemChange change, const ItemChangeData &va QQuickItem::itemChange(change, value); } +void QQuickWebEngineView::triggerWebAction(WebAction action) +{ + Q_D(QQuickWebEngineView); + switch (action) { + case Back: + d->adapter->navigateToOffset(-1); + break; + case Forward: + d->adapter->navigateToOffset(1); + break; + case Stop: + d->adapter->stop(); + break; + case Reload: + d->adapter->reload(); + break; + case ReloadAndBypassCache: + d->adapter->reloadAndBypassCache(); + break; + case Cut: + d->adapter->cut(); + break; + case Copy: + d->adapter->copy(); + break; + case Paste: + d->adapter->paste(); + break; + case Undo: + d->adapter->undo(); + break; + case Redo: + d->adapter->redo(); + break; + case SelectAll: + d->adapter->selectAll(); + break; + case PasteAndMatchStyle: + d->adapter->pasteAndMatchStyle(); + break; + default: + Q_UNREACHABLE(); + } +} + void QQuickWebEngineViewPrivate::userScripts_append(QQmlListProperty *p, QQuickWebEngineScript *script) { Q_ASSERT(p && p->data); diff --git a/src/webengine/api/qquickwebengineview_p.h b/src/webengine/api/qquickwebengineview_p.h index 462278571..95a9b2a2e 100644 --- a/src/webengine/api/qquickwebengineview_p.h +++ b/src/webengine/api/qquickwebengineview_p.h @@ -73,7 +73,7 @@ private: bool m_toggleOn; }; -#define LATEST_WEBENGINEVIEW_REVISION 2 +#define LATEST_WEBENGINEVIEW_REVISION 3 class Q_WEBENGINE_PRIVATE_EXPORT QQuickWebEngineView : public QQuickItem { Q_OBJECT @@ -105,6 +105,7 @@ class Q_WEBENGINE_PRIVATE_EXPORT QQuickWebEngineView : public QQuickItem { Q_ENUMS(Feature); Q_ENUMS(JavaScriptConsoleMessageLevel); Q_FLAGS(FindFlags); + Q_ENUMS(WebAction); public: QQuickWebEngineView(QQuickItem *parent = 0); @@ -173,6 +174,27 @@ public: Geolocation }; + enum WebAction { + NoWebAction = - 1, + Back, + Forward, + Stop, + Reload, + + Cut, + Copy, + Paste, + + Undo, + Redo, + SelectAll, + ReloadAndBypassCache, + + PasteAndMatchStyle, + + WebActionCount + }; + // must match WebContentsAdapterClient::JavaScriptConsoleMessageLevel enum JavaScriptConsoleMessageLevel { InfoMessageLevel = 0, @@ -218,6 +240,7 @@ public Q_SLOTS: Q_REVISION(1) void fullScreenCancelled(); Q_REVISION(1) void grantFeaturePermission(const QUrl &securityOrigin, Feature, bool granted); Q_REVISION(2) void setActiveFocusOnPress(bool arg); + Q_REVISION(3) void triggerWebAction(WebAction action); Q_SIGNALS: void titleChanged(); diff --git a/src/webengine/plugin/plugin.cpp b/src/webengine/plugin/plugin.cpp index cc95fb01f..95268e2c1 100644 --- a/src/webengine/plugin/plugin.cpp +++ b/src/webengine/plugin/plugin.cpp @@ -69,6 +69,7 @@ public: qmlRegisterUncreatableType(uri, 1, 0, "WebEngineNavigationRequest", QObject::tr("Cannot create separate instance of WebEngineNavigationRequest")); qmlRegisterType(uri, 1, 1, "WebEngineView"); + qmlRegisterType(uri, 1, 2, "WebEngineView"); qmlRegisterType(uri, 1, 1, "WebEngineProfile"); qmlRegisterType(uri, 1, 1, "WebEngineScript"); qmlRegisterUncreatableType(uri, 1, 1, "WebEngineCertificateError", QObject::tr("Cannot create separate instance of WebEngineCertificateError")); diff --git a/src/webengine/ui_delegates_manager.cpp b/src/webengine/ui_delegates_manager.cpp index 70b14cd47..6eeff7db5 100644 --- a/src/webengine/ui_delegates_manager.cpp +++ b/src/webengine/ui_delegates_manager.cpp @@ -109,19 +109,6 @@ MenuItemHandler::MenuItemHandler(QObject *parent) { } - -CopyMenuItem::CopyMenuItem(QObject *parent, const QString &textToCopy) - : MenuItemHandler(parent) - , m_textToCopy(textToCopy) -{ - connect(this, &MenuItemHandler::triggered, this, &CopyMenuItem::onTriggered); -} - -void CopyMenuItem::onTriggered() -{ - qApp->clipboard()->setText(m_textToCopy); -} - CopyLinkMenuItem::CopyLinkMenuItem(QObject *parent, const QUrl &url, const QString &title) : MenuItemHandler(parent) , m_url(url) diff --git a/src/webengine/ui_delegates_manager.h b/src/webengine/ui_delegates_manager.h index 648d71c12..7a35e8485 100644 --- a/src/webengine/ui_delegates_manager.h +++ b/src/webengine/ui_delegates_manager.h @@ -86,17 +86,6 @@ Q_SIGNALS: void triggered(); }; -class CopyMenuItem : public MenuItemHandler { - Q_OBJECT -public: - CopyMenuItem(QObject *parent, const QString &textToCopy); - -private: - void onTriggered(); - - QString m_textToCopy; -}; - class CopyLinkMenuItem : public MenuItemHandler { Q_OBJECT public: diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index f2941d952..ad007dc87 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -838,21 +838,6 @@ void QWebEnginePagePrivate::moveValidationMessage(const QRect &anchor) #endif } -namespace { -class SaveToClipboardFunctor -{ - QString m_text; -public: - SaveToClipboardFunctor(const QString &text) - : m_text(text) - {} - void operator()() const - { - qApp->clipboard()->setText(m_text); - } -}; -} - QMenu *QWebEnginePage::createStandardContextMenu() { Q_D(QWebEnginePage); @@ -879,9 +864,7 @@ QMenu *QWebEnginePage::createStandardContextMenu() connect(action, &QAction::triggered, d->view, &QWebEngineView::reload); menu->addAction(action); } else { - action = new QAction(tr("Copy..."), menu); - connect(action, &QAction::triggered, SaveToClipboardFunctor(contextMenuData.selectedText)); - menu->addAction(action); + menu->addAction(QWebEnginePage::action(Copy)); } if (!contextMenuData.linkText.isEmpty() && contextMenuData.linkUrl.isValid()) { -- cgit v1.2.3