diff options
Diffstat (limited to 'src/webengine/api')
-rw-r--r-- | src/webengine/api/qquickwebengineview.cpp | 89 | ||||
-rw-r--r-- | src/webengine/api/qquickwebengineview_p_p.h | 16 |
2 files changed, 102 insertions, 3 deletions
diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp index ac2dc681e..1dcc2acd0 100644 --- a/src/webengine/api/qquickwebengineview.cpp +++ b/src/webengine/api/qquickwebengineview.cpp @@ -44,20 +44,29 @@ #include "net/base/net_errors.h" #include "qquickwebengineloadrequest_p.h" +#include "render_widget_host_view_qt_delegate_quick.h" +#include "ui_delegates_manager.h" #include "web_contents_adapter.h" #include "web_engine_error.h" -#include "render_widget_host_view_qt_delegate_quick.h" +#include <QQmlEngine> +#include <QQmlComponent> +#include <QQmlContext> +#include <QQmlProperty> #include <QScreen> +#include <QStringBuilder> #include <QUrl> #include <QQmlEngine> +#include <private/qqmlmetatype_p.h> + QT_BEGIN_NAMESPACE QQuickWebEngineViewPrivate::QQuickWebEngineViewPrivate() : adapter(new WebContentsAdapter(qApp->property("QQuickWebEngineView_DisableHardwareAcceleration").toBool() ? SoftwareRenderingMode : HardwareAccelerationMode)) , e(new QQuickWebEngineViewExperimental(this)) , v(new QQuickWebEngineViewport(this)) + , contextMenuExtraItems(0) , loadProgress(0) , inspectable(false) , m_isLoading(false) @@ -94,6 +103,14 @@ QQuickWebEngineViewport *QQuickWebEngineViewPrivate::viewport() const return v.data(); } +UIDelegatesManager *QQuickWebEngineViewPrivate::ui() +{ + Q_Q(QQuickWebEngineView); + if (m_uIDelegatesManager.isNull()) + m_uIDelegatesManager.reset(new UIDelegatesManager(q)); + return m_uIDelegatesManager.data(); +} + RenderWidgetHostViewQtDelegate *QQuickWebEngineViewPrivate::CreateRenderWidgetHostViewQtDelegate(RenderWidgetHostViewQtDelegateClient *client, RenderingMode mode) { #if (QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)) @@ -103,6 +120,63 @@ RenderWidgetHostViewQtDelegate *QQuickWebEngineViewPrivate::CreateRenderWidgetHo return new RenderWidgetHostViewQtDelegateQuickPainted(client); } +bool QQuickWebEngineViewPrivate::contextMenuRequested(const WebEngineContextMenuData &data) +{ + Q_Q(QQuickWebEngineView); + + QObject *menu = ui()->addMenu(0, QString(), data.pos); + if (!menu) + return false; + + // Populate our menu + MenuItemHandler *item = 0; + + if (data.selectedText.isEmpty()) { + item = new MenuItemHandler(menu); + QObject::connect(item, &MenuItemHandler::triggered, q, &QQuickWebEngineView::goBack); + ui()->addMenuItem(item, QObject::tr("Back"), QStringLiteral("go-previous"), q->canGoBack()); + + item = new MenuItemHandler(menu); + QObject::connect(item, &MenuItemHandler::triggered, q, &QQuickWebEngineView::goForward); + ui()->addMenuItem(item, QObject::tr("Forward"), QStringLiteral("go-next"), q->canGoForward()); + + item = new MenuItemHandler(menu); + QObject::connect(item, &MenuItemHandler::triggered, q, &QQuickWebEngineView::reload); + ui()->addMenuItem(item, QObject::tr("Reload"), QStringLiteral("view-refresh")); + } else { + item = new CopyMenuItem(menu, data.selectedText); + ui()->addMenuItem(item, QObject::tr("Copy...")); + } + + if (!data.linkText.isEmpty() && data.linkUrl.isValid()) { + item = new NavigateMenuItem(menu, adapter, data.linkUrl); + ui()->addMenuItem(item, QObject::tr("Navigate to...")); + item = new CopyMenuItem(menu, data.linkUrl.toString()); + ui()->addMenuItem(item, QObject::tr("Copy link address")); + } + + // FIXME: expose the context menu data as an attached property to make this more useful + if (contextMenuExtraItems) { + ui()->addMenuSeparator(menu); + if (QObject* menuExtras = contextMenuExtraItems->create(ui()->creationContextForComponent(contextMenuExtraItems))) { + menuExtras->setParent(menu); + QQmlListReference entries(menu, QQmlMetaType::defaultProperty(menu).name(), qmlEngine(q)); + if (entries.isValid()) + entries.append(menuExtras); + } + } + + // Now fire the popup() method on the top level menu + QMetaObject::invokeMethod(menu, "popup"); + return true; +} + +bool QQuickWebEngineViewPrivate::javascriptDialog(JavascriptDialogType type, const QString &message, const QString &defaultValue, QString *result) +{ + Q_UNUSED(message); Q_UNUSED(defaultValue); Q_UNUSED(result); + return false; +} + void QQuickWebEngineViewPrivate::titleChanged(const QString &title) { Q_Q(QQuickWebEngineView); @@ -338,6 +412,19 @@ void QQuickWebEngineView::setInspectable(bool enable) d->adapter->enableInspector(enable); } +void QQuickWebEngineViewExperimental::setExtraContextMenuEntriesComponent(QQmlComponent *contextMenuExtras) +{ + if (d_ptr->contextMenuExtraItems == contextMenuExtras) + return; + d_ptr->contextMenuExtraItems = contextMenuExtras; + emit extraContextMenuEntriesComponentChanged(); +} + +QQmlComponent *QQuickWebEngineViewExperimental::extraContextMenuEntriesComponent() const +{ + return d_ptr->contextMenuExtraItems; +} + void QQuickWebEngineView::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) { QQuickItem::geometryChanged(newGeometry, oldGeometry); diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h index 110a1b9b6..67337baeb 100644 --- a/src/webengine/api/qquickwebengineview_p_p.h +++ b/src/webengine/api/qquickwebengineview_p_p.h @@ -47,13 +47,17 @@ #include <QScopedPointer> #include <QSharedData> +#include <QString> #include <QtCore/qcompilerdetection.h> #include <QtQuick/private/qquickitem_p.h> class WebContentsAdapter; +class UIDelegatesManager; QT_BEGIN_NAMESPACE class QQuickWebEngineView; +class QQmlComponent; +class QQmlContext; class Q_WEBENGINE_PRIVATE_EXPORT QQuickWebEngineViewport : public QObject { Q_OBJECT @@ -88,12 +92,17 @@ private: class Q_WEBENGINE_PRIVATE_EXPORT QQuickWebEngineViewExperimental : public QObject { Q_OBJECT Q_PROPERTY(QQuickWebEngineViewport *viewport READ viewport) + Q_PROPERTY(QQmlComponent *extraContextMenuEntriesComponent READ extraContextMenuEntriesComponent WRITE setExtraContextMenuEntriesComponent NOTIFY extraContextMenuEntriesComponentChanged) + public: QQuickWebEngineViewport *viewport() const; Q_INVOKABLE void adoptHandle(QQuickWebEngineViewHandle *viewHandle); + void setExtraContextMenuEntriesComponent(QQmlComponent *); + QQmlComponent *extraContextMenuEntriesComponent() const; Q_SIGNALS: void createWindow(const QJSValue &newViewHandle, const QString &newViewDisposition); + void extraContextMenuEntriesComponentChanged(); private: QQuickWebEngineViewExperimental(QQuickWebEngineViewPrivate* viewPrivate); @@ -112,6 +121,7 @@ public: QQuickWebEngineViewExperimental *experimental() const; QQuickWebEngineViewport *viewport() const; + UIDelegatesManager *ui(); virtual RenderWidgetHostViewQtDelegate* CreateRenderWidgetHostViewQtDelegate(RenderWidgetHostViewQtDelegateClient *client, RenderingMode) Q_DECL_OVERRIDE; virtual void titleChanged(const QString&) Q_DECL_OVERRIDE; @@ -125,8 +135,8 @@ public: virtual void focusContainer() Q_DECL_OVERRIDE; virtual void adoptNewWindow(WebContentsAdapter *newWebContents, WindowOpenDisposition disposition, const QRect &) Q_DECL_OVERRIDE; virtual void close() Q_DECL_OVERRIDE; - virtual bool contextMenuRequested(const WebEngineContextMenuData &) Q_DECL_OVERRIDE { return false;} - virtual bool javascriptDialog(JavascriptDialogType type, const QString &message, const QString &defaultValue = QString(), QString *result = 0) Q_DECL_OVERRIDE { return false; } + virtual bool contextMenuRequested(const WebEngineContextMenuData &) Q_DECL_OVERRIDE; + virtual bool javascriptDialog(JavascriptDialogType, const QString &message, const QString &defaultValue = QString(), QString *result = 0) Q_DECL_OVERRIDE { Q_UNUSED(message); Q_UNUSED(defaultValue); Q_UNUSED(result); return false; } virtual void runFileChooser(FileChooserMode, const QString &defaultFileName, const QStringList &acceptedMimeTypes) { Q_UNUSED(defaultFileName); Q_UNUSED(acceptedMimeTypes);} void setDevicePixelRatio(qreal); @@ -134,6 +144,7 @@ public: QExplicitlySharedDataPointer<WebContentsAdapter> adapter; QScopedPointer<QQuickWebEngineViewExperimental> e; QScopedPointer<QQuickWebEngineViewport> v; + QQmlComponent *contextMenuExtraItems; QUrl icon; int loadProgress; bool inspectable; @@ -141,6 +152,7 @@ public: qreal devicePixelRatio; private: + QScopedPointer<UIDelegatesManager> m_uIDelegatesManager; qreal m_dpiScale; }; |