diff options
Diffstat (limited to 'src/webengine/api/qquickwebengineview.cpp')
-rw-r--r-- | src/webengine/api/qquickwebengineview.cpp | 349 |
1 files changed, 176 insertions, 173 deletions
diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp index 31a258b0c..61f940f15 100644 --- a/src/webengine/api/qquickwebengineview.cpp +++ b/src/webengine/api/qquickwebengineview.cpp @@ -47,6 +47,8 @@ #include "javascript_dialog_controller.h" #include "qquickwebenginehistory_p.h" #include "qquickwebenginecertificateerror_p.h" +#include "qquickwebenginecontextmenurequest_p.h" +#include "qquickwebenginedialogrequests_p.h" #include "qquickwebenginefaviconprovider_p_p.h" #include "qquickwebengineloadrequest_p.h" #include "qquickwebenginenavigationrequest_p.h" @@ -61,8 +63,8 @@ #include "render_widget_host_view_qt_delegate_quick.h" #include "render_widget_host_view_qt_delegate_quickwindow.h" +#include "renderer_host/user_resource_controller_host.h" #include "ui_delegates_manager.h" -#include "user_resource_controller_host.h" #include "web_contents_adapter.h" #include "web_engine_error.h" #include "web_engine_settings.h" @@ -125,8 +127,6 @@ static QAccessibleInterface *webAccessibleFactory(const QString &, QObject *obje QQuickWebEngineViewPrivate::QQuickWebEngineViewPrivate() : adapter(0) - , e(new QQuickWebEngineViewExperimental(this)) - , v(new QQuickWebEngineViewport(this)) , m_history(new QQuickWebEngineHistory(this)) , m_profile(QQuickWebEngineProfile::defaultProfile()) , m_settings(new QQuickWebEngineSettings(m_profile->settings())) @@ -145,27 +145,28 @@ QQuickWebEngineViewPrivate::QQuickWebEngineViewPrivate() , m_dpiScale(1.0) , m_backgroundColor(Qt::white) , m_defaultZoomFactor(1.0) - // QTBUG-53467 - , m_menuEnabled(true) -{ - // The gold standard for mobile web content is 160 dpi, and the devicePixelRatio expected - // is the (possibly quantized) ratio of device dpi to 160 dpi. - // However GUI toolkits on non-iOS platforms may be using different criteria than relative - // DPI (depending on the history of that platform), dictating the choice of - // QScreen::devicePixelRatio(). - // Where applicable (i.e. non-iOS mobile platforms), override QScreen::devicePixelRatio - // and instead use a reasonable default value for viewport.devicePixelRatio to avoid every - // app having to use this experimental API. + , m_ui2Enabled(false) +{ QString platform = qApp->platformName().toLower(); - if (platform == QLatin1String("qnx")) { - qreal webPixelRatio = QGuiApplication::primaryScreen()->physicalDotsPerInch() / 160; - - // Quantize devicePixelRatio to increments of 1 to allow JS and media queries to select - // 1x, 2x, 3x etc assets that fit an integral number of pixels. - setDevicePixelRatio(qMax(1, qRound(webPixelRatio))); - } if (platform == QLatin1Literal("eglfs")) - m_menuEnabled = false; + m_ui2Enabled = true; + + const QByteArray dialogSet = qgetenv("QTWEBENGINE_DIALOG_SET"); + + if (!dialogSet.isEmpty()) { + if (dialogSet == QByteArrayLiteral("QtQuickControls2")) { + m_ui2Enabled = true; + } else if (dialogSet == QByteArrayLiteral("QtQuickControls1") + && m_ui2Enabled) { + m_ui2Enabled = false; + qWarning("QTWEBENGINE_DIALOG_SET=QtQuickControls1 forces use of Qt Quick Controls 1 " + "on an eglfs backend. This can crash your application!"); + } else { + qWarning("Ignoring QTWEBENGINE_DIALOG_SET environment variable set to %s. Accepted " + "values are \"QtQuickControls1\" and \"QtQuickControls2\"", dialogSet.data()); + } + } + #ifndef QT_NO_ACCESSIBILITY QAccessible::installFactory(&webAccessibleFactory); #endif // QT_NO_ACCESSIBILITY @@ -175,21 +176,11 @@ QQuickWebEngineViewPrivate::~QQuickWebEngineViewPrivate() { } -QQuickWebEngineViewExperimental *QQuickWebEngineViewPrivate::experimental() const -{ - return e.data(); -} - -QQuickWebEngineViewport *QQuickWebEngineViewPrivate::viewport() const -{ - return v.data(); -} - UIDelegatesManager *QQuickWebEngineViewPrivate::ui() { Q_Q(QQuickWebEngineView); if (m_uIDelegatesManager.isNull()) - m_uIDelegatesManager.reset(new UIDelegatesManager(q)); + m_uIDelegatesManager.reset(m_ui2Enabled ? new UI2DelegatesManager(q) : new UIDelegatesManager(q)); return m_uIDelegatesManager.data(); } @@ -216,31 +207,41 @@ bool QQuickWebEngineViewPrivate::contextMenuRequested(const WebEngineContextMenu { Q_Q(QQuickWebEngineView); - if (!m_menuEnabled) { - qWarning("You are trying to open context menu on eglfs backend, which is not currently supported\n" - "See QTBUG-53467."); - return false; - } + m_contextMenuData = data; + + QQuickWebEngineContextMenuRequest *request = new QQuickWebEngineContextMenuRequest(data); + // mark the object for gc by creating temporary jsvalue + qmlEngine(q)->newQObject(request); + Q_EMIT q->contextMenuRequested(request); + + if (request->isAccepted()) + return true; // Assign the WebEngineView as the parent of the menu, so mouse events are properly propagated // on OSX. - QObject *menu = ui()->addMenu(q, QString(), data.pos); + QObject *menu = ui()->addMenu(q, QString(), data.position()); if (!menu) return false; - contextMenuData.update(data); - Q_EMIT q->experimental()->contextMenuDataChanged(); - // Populate our menu MenuItemHandler *item = 0; - - if (!data.linkText.isEmpty() && data.linkUrl.isValid()) { + if (data.isEditable() && !data.spellCheckerSuggestions().isEmpty()) { + const QPointer<QQuickWebEngineView> qRef(q); + for (int i=0; i < data.spellCheckerSuggestions().count() && i < 4; i++) { + item = new MenuItemHandler(menu); + QString replacement = data.spellCheckerSuggestions().at(i); + QObject::connect(item, &MenuItemHandler::triggered, [qRef, replacement] { qRef->replaceMisspelledWord(replacement); }); + ui()->addMenuItem(item, replacement); + } + ui()->addMenuSeparator(menu); + } + if (!data.linkText().isEmpty() && data.linkUrl().isValid()) { item = new MenuItemHandler(menu); QObject::connect(item, &MenuItemHandler::triggered, [q] { q->triggerWebAction(QQuickWebEngineView::OpenLinkInThisWindow); }); ui()->addMenuItem(item, QQuickWebEngineView::tr("Follow Link")); } - if (data.selectedText.isEmpty()) { + if (data.selectedText().isEmpty()) { item = new MenuItemHandler(menu); QObject::connect(item, &MenuItemHandler::triggered, q, &QQuickWebEngineView::goBack); ui()->addMenuItem(item, QQuickWebEngineView::tr("Back"), QStringLiteral("go-previous"), q->canGoBack()); @@ -252,6 +253,10 @@ bool QQuickWebEngineViewPrivate::contextMenuRequested(const WebEngineContextMenu item = new MenuItemHandler(menu); QObject::connect(item, &MenuItemHandler::triggered, q, &QQuickWebEngineView::reload); ui()->addMenuItem(item, QQuickWebEngineView::tr("Reload"), QStringLiteral("view-refresh")); + + item = new MenuItemHandler(menu); + QObject::connect(item, &MenuItemHandler::triggered, [q] { q->triggerWebAction(QQuickWebEngineView::ViewSource); }); + ui()->addMenuItem(item, QQuickWebEngineView::tr("View Page Source"), QStringLiteral("view-source"), adapter->canViewSource()); } else { item = new MenuItemHandler(menu); QObject::connect(item, &MenuItemHandler::triggered, [q] { q->triggerWebAction(QQuickWebEngineView::Copy); }); @@ -261,7 +266,7 @@ bool QQuickWebEngineViewPrivate::contextMenuRequested(const WebEngineContextMenu ui()->addMenuItem(item, QQuickWebEngineView::tr("Unselect")); } - if (!contextMenuData.linkText().isEmpty() && contextMenuData.linkUrl().isValid()) { + if (!data.linkText().isEmpty() && data.linkUrl().isValid()) { item = new MenuItemHandler(menu); QObject::connect(item, &MenuItemHandler::triggered, [q] { q->triggerWebAction(QQuickWebEngineView::CopyLinkToClipboard); }); ui()->addMenuItem(item, QQuickWebEngineView::tr("Copy Link URL")); @@ -269,9 +274,9 @@ bool QQuickWebEngineViewPrivate::contextMenuRequested(const WebEngineContextMenu QObject::connect(item, &MenuItemHandler::triggered, [q] { q->triggerWebAction(QQuickWebEngineView::DownloadLinkToDisk); }); ui()->addMenuItem(item, QQuickWebEngineView::tr("Save Link")); } - if (contextMenuData.mediaUrl().isValid()) { - switch (contextMenuData.mediaType()) { - case QQuickWebEngineContextMenuData::MediaTypeImage: + if (data.mediaUrl().isValid()) { + switch (data.mediaType()) { + case WebEngineContextMenuData::MediaTypeImage: item = new MenuItemHandler(menu); QObject::connect(item, &MenuItemHandler::triggered, [q] { q->triggerWebAction(QQuickWebEngineView::CopyImageUrlToClipboard); }); ui()->addMenuItem(item, QQuickWebEngineView::tr("Copy Image URL")); @@ -282,11 +287,11 @@ bool QQuickWebEngineViewPrivate::contextMenuRequested(const WebEngineContextMenu QObject::connect(item, &MenuItemHandler::triggered, [q] { q->triggerWebAction(QQuickWebEngineView::DownloadImageToDisk); }); ui()->addMenuItem(item, QQuickWebEngineView::tr("Save Image")); break; - case QQuickWebEngineContextMenuData::MediaTypeCanvas: + case WebEngineContextMenuData::MediaTypeCanvas: Q_UNREACHABLE(); // mediaUrl is invalid for canvases break; - case QQuickWebEngineContextMenuData::MediaTypeAudio: - case QQuickWebEngineContextMenuData::MediaTypeVideo: + case WebEngineContextMenuData::MediaTypeAudio: + case WebEngineContextMenuData::MediaTypeVideo: item = new MenuItemHandler(menu); QObject::connect(item, &MenuItemHandler::triggered, [q] { q->triggerWebAction(QQuickWebEngineView::CopyMediaUrlToClipboard); }); ui()->addMenuItem(item, QQuickWebEngineView::tr("Copy Media URL")); @@ -299,12 +304,12 @@ bool QQuickWebEngineViewPrivate::contextMenuRequested(const WebEngineContextMenu item = new MenuItemHandler(menu); QObject::connect(item, &MenuItemHandler::triggered, [q] { q->triggerWebAction(QQuickWebEngineView::ToggleMediaLoop); }); ui()->addMenuItem(item, QQuickWebEngineView::tr("Toggle Looping")); - if (data.mediaFlags & WebEngineContextMenuData::MediaHasAudio) { + if (data.mediaFlags() & WebEngineContextMenuData::MediaHasAudio) { item = new MenuItemHandler(menu); QObject::connect(item, &MenuItemHandler::triggered, [q] { q->triggerWebAction(QQuickWebEngineView::ToggleMediaMute); }); ui()->addMenuItem(item, QQuickWebEngineView::tr("Toggle Mute")); } - if (data.mediaFlags & WebEngineContextMenuData::MediaCanToggleControls) { + if (data.mediaFlags() & WebEngineContextMenuData::MediaCanToggleControls) { item = new MenuItemHandler(menu); QObject::connect(item, &MenuItemHandler::triggered, [q] { q->triggerWebAction(QQuickWebEngineView::ToggleMediaControls); }); ui()->addMenuItem(item, QQuickWebEngineView::tr("Toggle Media Controls")); @@ -313,7 +318,7 @@ bool QQuickWebEngineViewPrivate::contextMenuRequested(const WebEngineContextMenu default: break; } - } else if (contextMenuData.mediaType() == QQuickWebEngineContextMenuData::MediaTypeCanvas) { + } else if (data.mediaType() == WebEngineContextMenuData::MediaTypeCanvas) { item = new MenuItemHandler(menu); QObject::connect(item, &MenuItemHandler::triggered, [q] { q->triggerWebAction(QQuickWebEngineView::CopyImageToClipboard); }); ui()->addMenuItem(item, QQuickWebEngineView::tr("Copy Image")); @@ -341,7 +346,7 @@ bool QQuickWebEngineViewPrivate::contextMenuRequested(const WebEngineContextMenu } // Now fire the popup() method on the top level menu - QMetaObject::invokeMethod(menu, "popup"); + ui()->showMenu(menu); return true; } @@ -356,7 +361,13 @@ void QQuickWebEngineViewPrivate::navigationRequested(int navigationType, const Q void QQuickWebEngineViewPrivate::javascriptDialog(QSharedPointer<JavaScriptDialogController> dialog) { - ui()->showDialog(dialog); + Q_Q(QQuickWebEngineView); + QQuickWebEngineJavaScriptDialogRequest *request = new QQuickWebEngineJavaScriptDialogRequest(dialog); + // mark the object for gc by creating temporary jsvalue + qmlEngine(q)->newQObject(request); + Q_EMIT q->javaScriptDialogRequested(request); + if (!request->isAccepted()) + ui()->showDialog(dialog); } void QQuickWebEngineViewPrivate::allowCertificateError(const QSharedPointer<CertificateErrorController> &errorController) @@ -381,12 +392,24 @@ void QQuickWebEngineViewPrivate::runGeolocationPermissionRequest(const QUrl &url void QQuickWebEngineViewPrivate::showColorDialog(QSharedPointer<ColorChooserController> controller) { - ui()->showColorDialog(controller); + Q_Q(QQuickWebEngineView); + QQuickWebEngineColorDialogRequest *request = new QQuickWebEngineColorDialogRequest(controller); + // mark the object for gc by creating temporary jsvalue + qmlEngine(q)->newQObject(request); + Q_EMIT q->colorDialogRequested(request); + if (!request->isAccepted()) + ui()->showColorDialog(controller); } -void QQuickWebEngineViewPrivate::runFileChooser(FilePickerController* controller) +void QQuickWebEngineViewPrivate::runFileChooser(QSharedPointer<FilePickerController> controller) { - ui()->showFilePicker(controller); + Q_Q(QQuickWebEngineView); + QQuickWebEngineFileDialogRequest *request = new QQuickWebEngineFileDialogRequest(controller); + // mark the object for gc by creating temporary jsvalue + qmlEngine(q)->newQObject(request); + Q_EMIT q->fileDialogRequested(request); + if (!request->isAccepted()) + ui()->showFilePicker(controller); } void QQuickWebEngineViewPrivate::passOnFocus(bool reverse) @@ -654,7 +677,13 @@ void QQuickWebEngineViewPrivate::javaScriptConsoleMessage(JavaScriptConsoleMessa void QQuickWebEngineViewPrivate::authenticationRequired(QSharedPointer<AuthenticationDialogController> controller) { - ui()->showDialog(controller); + Q_Q(QQuickWebEngineView); + QQuickWebEngineAuthenticationDialogRequest *request = new QQuickWebEngineAuthenticationDialogRequest(controller); + // mark the object for gc by creating temporary jsvalue + qmlEngine(q)->newQObject(request); + Q_EMIT q->authenticationDialogRequested(request); + if (!request->isAccepted()) + ui()->showDialog(controller); } void QQuickWebEngineViewPrivate::runMediaAccessPermissionRequest(const QUrl &securityOrigin, WebContentsAdapterClient::MediaRequestFlags requestFlags) @@ -836,7 +865,7 @@ QQuickWebEngineView::QQuickWebEngineView(QQuickItem *parent) , d_ptr(new QQuickWebEngineViewPrivate) { Q_D(QQuickWebEngineView); - d->e->q_ptr = d->q_ptr = this; + d->q_ptr = this; this->setActiveFocusOnTab(true); this->setFlags(QQuickItem::ItemIsFocusScope | QQuickItem::ItemAcceptsInputMethod | QQuickItem::ItemAcceptsDrops); @@ -1078,18 +1107,40 @@ void QQuickWebEngineViewPrivate::showValidationMessage(const QRect &anchor, cons if (m_testSupport) Q_EMIT m_testSupport->validationMessageShown(mainText, subText); #endif - - ui()->showMessageBubble(anchor, mainText, subText); + Q_Q(QQuickWebEngineView); + QQuickWebEngineFormValidationMessageRequest *request; + request = new QQuickWebEngineFormValidationMessageRequest(QQuickWebEngineFormValidationMessageRequest::RequestTypeShow, + anchor,mainText,subText); + // mark the object for gc by creating temporary jsvalue + qmlEngine(q)->newQObject(request); + Q_EMIT q->formValidationMessageRequested(request); + if (!request->isAccepted()) + ui()->showMessageBubble(anchor, mainText, subText); } void QQuickWebEngineViewPrivate::hideValidationMessage() { - ui()->hideMessageBubble(); + Q_Q(QQuickWebEngineView); + QQuickWebEngineFormValidationMessageRequest *request; + request = new QQuickWebEngineFormValidationMessageRequest(QQuickWebEngineFormValidationMessageRequest::RequestTypeHide); + // mark the object for gc by creating temporary jsvalue + qmlEngine(q)->newQObject(request); + Q_EMIT q->formValidationMessageRequested(request); + if (!request->isAccepted()) + ui()->hideMessageBubble(); } void QQuickWebEngineViewPrivate::moveValidationMessage(const QRect &anchor) { - ui()->moveMessageBubble(anchor); + Q_Q(QQuickWebEngineView); + QQuickWebEngineFormValidationMessageRequest *request; + request = new QQuickWebEngineFormValidationMessageRequest(QQuickWebEngineFormValidationMessageRequest::RequestTypeMove, + anchor); + // mark the object for gc by creating temporary jsvalue + qmlEngine(q)->newQObject(request); + Q_EMIT q->formValidationMessageRequested(request); + if (!request->isAccepted()) + ui()->moveMessageBubble(anchor); } void QQuickWebEngineViewPrivate::updateScrollPosition(const QPointF &position) @@ -1125,6 +1176,11 @@ bool QQuickWebEngineViewPrivate::isEnabled() const return q->isEnabled(); } +void QQuickWebEngineViewPrivate::setToolTip(const QString &toolTipText) +{ + ui()->showToolTip(toolTipText); +} + bool QQuickWebEngineView::isLoading() const { Q_D(const QQuickWebEngineView); @@ -1184,12 +1240,6 @@ void QQuickWebEngineView::runJavaScript(const QString &script, quint32 worldId, d->adapter->runJavaScript(script, worldId); } -QQuickWebEngineViewExperimental *QQuickWebEngineView::experimental() const -{ - Q_D(const QQuickWebEngineView); - return d->e.data(); -} - qreal QQuickWebEngineView::zoomFactor() const { Q_D(const QQuickWebEngineView); @@ -1274,23 +1324,16 @@ void QQuickWebEngineView::printToPdf(const QJSValue &callback, PrintedPageSizeId d->m_callbacks.insert(requestId, callback); } -bool QQuickWebEngineView::isFullScreen() const -{ - Q_D(const QQuickWebEngineView); - return d->m_fullscreenMode; -} - -void QQuickWebEngineViewExperimental::setExtraContextMenuEntriesComponent(QQmlComponent *contextMenuExtras) +void QQuickWebEngineView::replaceMisspelledWord(const QString &replacement) { - if (d_ptr->contextMenuExtraItems == contextMenuExtras) - return; - d_ptr->contextMenuExtraItems = contextMenuExtras; - emit extraContextMenuEntriesComponentChanged(); + Q_D(QQuickWebEngineView); + d->adapter->replaceMisspelling(replacement); } -QQmlComponent *QQuickWebEngineViewExperimental::extraContextMenuEntriesComponent() const +bool QQuickWebEngineView::isFullScreen() const { - return d_ptr->contextMenuExtraItems; + Q_D(const QQuickWebEngineView); + return d->m_fullscreenMode; } void QQuickWebEngineView::findText(const QString &subString, FindFlags options, const QJSValue &callback) @@ -1514,118 +1557,118 @@ void QQuickWebEngineView::triggerWebAction(WebAction action) d->adapter->unselect(); break; case OpenLinkInThisWindow: - if (d->contextMenuData.linkUrl().isValid()) - setUrl(d->contextMenuData.linkUrl()); + if (d->m_contextMenuData.linkUrl().isValid()) + setUrl(d->m_contextMenuData.linkUrl()); break; case OpenLinkInNewWindow: - if (d->contextMenuData.linkUrl().isValid()) { + if (d->m_contextMenuData.linkUrl().isValid()) { QQuickWebEngineNewViewRequest request; - request.m_requestedUrl = d->contextMenuData.linkUrl(); + request.m_requestedUrl = d->m_contextMenuData.linkUrl(); request.m_isUserInitiated = true; request.m_destination = NewViewInWindow; Q_EMIT newViewRequested(&request); } break; case OpenLinkInNewTab: - if (d->contextMenuData.linkUrl().isValid()) { + if (d->m_contextMenuData.linkUrl().isValid()) { QQuickWebEngineNewViewRequest request; - request.m_requestedUrl = d->contextMenuData.linkUrl(); + request.m_requestedUrl = d->m_contextMenuData.linkUrl(); request.m_isUserInitiated = true; request.m_destination = NewViewInBackgroundTab; Q_EMIT newViewRequested(&request); } break; case CopyLinkToClipboard: - if (d->contextMenuData.linkUrl().isValid()) { - QString urlString = d->contextMenuData.linkUrl().toString(QUrl::FullyEncoded); - QString title = d->contextMenuData.linkText().toHtmlEscaped(); + if (d->m_contextMenuData.linkUrl().isValid()) { + QString urlString = d->m_contextMenuData.linkUrl().toString(QUrl::FullyEncoded); + QString title = d->m_contextMenuData.linkText().toHtmlEscaped(); QMimeData *data = new QMimeData(); data->setText(urlString); QString html = QStringLiteral("<a href=\"") + urlString + QStringLiteral("\">") + title + QStringLiteral("</a>"); data->setHtml(html); - data->setUrls(QList<QUrl>() << d->contextMenuData.linkUrl()); + data->setUrls(QList<QUrl>() << d->m_contextMenuData.linkUrl()); qApp->clipboard()->setMimeData(data); } break; case DownloadLinkToDisk: - if (d->contextMenuData.linkUrl().isValid()) - d->adapter->download(d->contextMenuData.linkUrl(), d->contextMenuData.d->suggestedFileName); + if (d->m_contextMenuData.linkUrl().isValid()) + d->adapter->download(d->m_contextMenuData.linkUrl(), d->m_contextMenuData.suggestedFileName()); break; case CopyImageToClipboard: - if (d->contextMenuData.d->hasImageContent && - (d->contextMenuData.mediaType() == QQuickWebEngineContextMenuData::MediaTypeImage || - d->contextMenuData.mediaType() == QQuickWebEngineContextMenuData::MediaTypeCanvas)) + if (d->m_contextMenuData.hasImageContent() && + (d->m_contextMenuData.mediaType() == WebEngineContextMenuData::MediaTypeImage || + d->m_contextMenuData.mediaType() == WebEngineContextMenuData::MediaTypeCanvas)) { - d->adapter->copyImageAt(d->contextMenuData.position()); + d->adapter->copyImageAt(d->m_contextMenuData.position()); } break; case CopyImageUrlToClipboard: - if (d->contextMenuData.mediaUrl().isValid() && d->contextMenuData.mediaType() == QQuickWebEngineContextMenuData::MediaTypeImage) { - QString urlString = d->contextMenuData.mediaUrl().toString(QUrl::FullyEncoded); - QString title = d->contextMenuData.linkText(); + if (d->m_contextMenuData.mediaUrl().isValid() && d->m_contextMenuData.mediaType() == WebEngineContextMenuData::MediaTypeImage) { + QString urlString = d->m_contextMenuData.mediaUrl().toString(QUrl::FullyEncoded); + QString title = d->m_contextMenuData.linkText(); if (!title.isEmpty()) title = QStringLiteral(" alt=\"%1\"").arg(title.toHtmlEscaped()); QMimeData *data = new QMimeData(); data->setText(urlString); QString html = QStringLiteral("<img src=\"") + urlString + QStringLiteral("\"") + title + QStringLiteral("></img>"); data->setHtml(html); - data->setUrls(QList<QUrl>() << d->contextMenuData.mediaUrl()); + data->setUrls(QList<QUrl>() << d->m_contextMenuData.mediaUrl()); qApp->clipboard()->setMimeData(data); } break; case DownloadImageToDisk: case DownloadMediaToDisk: - if (d->contextMenuData.mediaUrl().isValid()) - d->adapter->download(d->contextMenuData.mediaUrl(), d->contextMenuData.d->suggestedFileName); + if (d->m_contextMenuData.mediaUrl().isValid()) + d->adapter->download(d->m_contextMenuData.mediaUrl(), d->m_contextMenuData.suggestedFileName()); break; case CopyMediaUrlToClipboard: - if (d->contextMenuData.mediaUrl().isValid() && - (d->contextMenuData.mediaType() == QQuickWebEngineContextMenuData::MediaTypeAudio || - d->contextMenuData.mediaType() == QQuickWebEngineContextMenuData::MediaTypeVideo)) + if (d->m_contextMenuData.mediaUrl().isValid() && + (d->m_contextMenuData.mediaType() == WebEngineContextMenuData::MediaTypeAudio || + d->m_contextMenuData.mediaType() == WebEngineContextMenuData::MediaTypeVideo)) { - QString urlString = d->contextMenuData.mediaUrl().toString(QUrl::FullyEncoded); + QString urlString = d->m_contextMenuData.mediaUrl().toString(QUrl::FullyEncoded); QMimeData *data = new QMimeData(); data->setText(urlString); - if (d->contextMenuData.mediaType() == QQuickWebEngineContextMenuData::MediaTypeAudio) + if (d->m_contextMenuData.mediaType() == WebEngineContextMenuData::MediaTypeAudio) data->setHtml(QStringLiteral("<audio src=\"") + urlString + QStringLiteral("\"></audio>")); else data->setHtml(QStringLiteral("<video src=\"") + urlString + QStringLiteral("\"></video>")); - data->setUrls(QList<QUrl>() << d->contextMenuData.mediaUrl()); + data->setUrls(QList<QUrl>() << d->m_contextMenuData.mediaUrl()); qApp->clipboard()->setMimeData(data); } break; case ToggleMediaControls: - if (d->contextMenuData.mediaUrl().isValid() && d->contextMenuData.d->mediaFlags & WebEngineContextMenuData::MediaCanToggleControls) { - bool enable = !(d->contextMenuData.d->mediaFlags & WebEngineContextMenuData::MediaControls); - d->adapter->executeMediaPlayerActionAt(d->contextMenuData.position(), WebContentsAdapter::MediaPlayerControls, enable); + if (d->m_contextMenuData.mediaUrl().isValid() && d->m_contextMenuData.mediaFlags() & WebEngineContextMenuData::MediaCanToggleControls) { + bool enable = !(d->m_contextMenuData.mediaFlags() & WebEngineContextMenuData::MediaControls); + d->adapter->executeMediaPlayerActionAt(d->m_contextMenuData.position(), WebContentsAdapter::MediaPlayerControls, enable); } break; case ToggleMediaLoop: - if (d->contextMenuData.mediaUrl().isValid() && - (d->contextMenuData.mediaType() == QQuickWebEngineContextMenuData::MediaTypeAudio || - d->contextMenuData.mediaType() == QQuickWebEngineContextMenuData::MediaTypeVideo)) + if (d->m_contextMenuData.mediaUrl().isValid() && + (d->m_contextMenuData.mediaType() == WebEngineContextMenuData::MediaTypeAudio || + d->m_contextMenuData.mediaType() == WebEngineContextMenuData::MediaTypeVideo)) { - bool enable = !(d->contextMenuData.d->mediaFlags & WebEngineContextMenuData::MediaLoop); - d->adapter->executeMediaPlayerActionAt(d->contextMenuData.position(), WebContentsAdapter::MediaPlayerLoop, enable); + bool enable = !(d->m_contextMenuData.mediaFlags() & WebEngineContextMenuData::MediaLoop); + d->adapter->executeMediaPlayerActionAt(d->m_contextMenuData.position(), WebContentsAdapter::MediaPlayerLoop, enable); } break; case ToggleMediaPlayPause: - if (d->contextMenuData.mediaUrl().isValid() && - (d->contextMenuData.mediaType() == QQuickWebEngineContextMenuData::MediaTypeAudio || - d->contextMenuData.mediaType() == QQuickWebEngineContextMenuData::MediaTypeVideo)) + if (d->m_contextMenuData.mediaUrl().isValid() && + (d->m_contextMenuData.mediaType() == WebEngineContextMenuData::MediaTypeAudio || + d->m_contextMenuData.mediaType() == WebEngineContextMenuData::MediaTypeVideo)) { - bool enable = (d->contextMenuData.d->mediaFlags & WebEngineContextMenuData::MediaPaused); - d->adapter->executeMediaPlayerActionAt(d->contextMenuData.position(), WebContentsAdapter::MediaPlayerPlay, enable); + bool enable = (d->m_contextMenuData.mediaFlags() & WebEngineContextMenuData::MediaPaused); + d->adapter->executeMediaPlayerActionAt(d->m_contextMenuData.position(), WebContentsAdapter::MediaPlayerPlay, enable); } break; case ToggleMediaMute: - if (d->contextMenuData.mediaUrl().isValid() && d->contextMenuData.d->mediaFlags & WebEngineContextMenuData::MediaHasAudio) { - bool enable = !(d->contextMenuData.d->mediaFlags & WebEngineContextMenuData::MediaMuted); - d->adapter->executeMediaPlayerActionAt(d->contextMenuData.position(), WebContentsAdapter::MediaPlayerMute, enable); + if (d->m_contextMenuData.mediaUrl().isValid() && d->m_contextMenuData.mediaFlags() & WebEngineContextMenuData::MediaHasAudio) { + bool enable = !(d->m_contextMenuData.mediaFlags() & WebEngineContextMenuData::MediaMuted); + d->adapter->executeMediaPlayerActionAt(d->m_contextMenuData.position(), WebContentsAdapter::MediaPlayerMute, enable); } break; case InspectElement: - d->adapter->inspectElementAt(d->contextMenuData.position()); + d->adapter->inspectElementAt(d->m_contextMenuData.position()); break; case ExitFullScreen: d->adapter->exitFullScreen(); @@ -1636,17 +1679,14 @@ void QQuickWebEngineView::triggerWebAction(WebAction action) case SavePage: d->adapter->save(); break; + case ViewSource: + d->adapter->viewSource(); + break; default: Q_UNREACHABLE(); } } -const QQuickWebEngineContextMenuData *QQuickWebEngineViewExperimental::contextMenuData() const -{ - Q_D(const QQuickWebEngineView); - return &d->contextMenuData; -} - QSizeF QQuickWebEngineView::contentsSize() const { Q_D(const QQuickWebEngineView); @@ -1731,42 +1771,5 @@ void QQuickWebEngineFullScreenRequest::reject() m_viewPrivate->setFullScreenMode(!m_toggleOn); } -QQuickWebEngineViewExperimental::QQuickWebEngineViewExperimental(QQuickWebEngineViewPrivate *viewPrivate) - : q_ptr(0) - , d_ptr(viewPrivate) -{ -} - -QQuickWebEngineViewport *QQuickWebEngineViewExperimental::viewport() const -{ - Q_D(const QQuickWebEngineView); - return d->viewport(); -} - -QQuickWebEngineViewport::QQuickWebEngineViewport(QQuickWebEngineViewPrivate *viewPrivate) - : d_ptr(viewPrivate) -{ -} - -qreal QQuickWebEngineViewport::devicePixelRatio() const -{ - Q_D(const QQuickWebEngineView); - return d->devicePixelRatio; -} - -void QQuickWebEngineViewport::setDevicePixelRatio(qreal devicePixelRatio) -{ - Q_D(QQuickWebEngineView); - // Valid range is [1, inf) - devicePixelRatio = qMax(qreal(1.0), devicePixelRatio); - if (d->devicePixelRatio == devicePixelRatio) - return; - d->setDevicePixelRatio(devicePixelRatio); - if (!d->adapter) - return; - d->adapter->dpiScaleChanged(); - Q_EMIT devicePixelRatioChanged(); -} - QT_END_NAMESPACE |