diff options
Diffstat (limited to 'src/webengine/api/qquickwebengineview.cpp')
-rw-r--r-- | src/webengine/api/qquickwebengineview.cpp | 89 |
1 files changed, 88 insertions, 1 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); |