From 9b8c1020f2752ab5095086577ab98fa80926c43d Mon Sep 17 00:00:00 2001 From: Peter Varga Date: Wed, 13 Jul 2016 17:28:15 +0200 Subject: Add View Source API and make the feature available from context menu [ChangeLog][QtWebEngineQML][QQuickWebEngineView] View Source feature is now supported [ChangeLog][QtWebEngineWidgets][QWebEnginePage] View Source feature is now supported Change-Id: Icc16da71fc6ec95880897fc9744dd8be8c004e00 Reviewed-by: Allan Sandfeld Jensen --- src/webenginewidgets/api/qwebenginepage.cpp | 46 +++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'src/webenginewidgets/api/qwebenginepage.cpp') diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index 3f2323334..be5a39e83 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -81,6 +81,7 @@ #include #include #include +#include #include QT_BEGIN_NAMESPACE @@ -422,6 +423,9 @@ void QWebEnginePagePrivate::updateAction(QWebEnginePage::WebAction action) const case QWebEnginePage::ReloadAndBypassCache: enabled = !isLoading; break; + case QWebEnginePage::ViewSource: + enabled = adapter->canViewSource(); + break; default: break; } @@ -437,6 +441,7 @@ void QWebEnginePagePrivate::updateNavigationActions() updateAction(QWebEnginePage::Stop); updateAction(QWebEnginePage::Reload); updateAction(QWebEnginePage::ReloadAndBypassCache); + updateAction(QWebEnginePage::ViewSource); } #ifndef QT_NO_ACTION @@ -931,6 +936,9 @@ QAction *QWebEnginePage::action(WebAction action) const case SavePage: text = tr("Save &Page"); break; + case ViewSource: + text = tr("&View Page Source"); + break; case NoWebAction: case WebActionCount: Q_UNREACHABLE(); @@ -1121,6 +1129,17 @@ void QWebEnginePage::triggerAction(WebAction action, bool) case SavePage: d->adapter->save(); break; + case ViewSource: + // This is a workaround to make the ViewSource action working in a context menu. + // The WebContentsAdapter::viewSource() method deletes a + // RenderWidgetHostViewQtDelegateWidget instance which passes the control to the event + // loop. If the QMenu::aboutToHide() signal is connected to the QObject::deleteLater() + // slot the QMenu is deleted by the event handler while the ViewSource action is still not + // completed. This may lead to a crash. To avoid this the WebContentsAdapter::viewSource() + // method is called indirectly via the QTimer::singleShot() function which schedules the + // the viewSource() call after the QMenu's destruction. + QTimer::singleShot(0, this, [d](){ d->adapter->viewSource(); }); + break; case NoWebAction: break; case WebActionCount: @@ -1378,6 +1397,8 @@ QMenu *QWebEnginePage::createStandardContextMenu() action = new QAction(QIcon::fromTheme(QStringLiteral("view-refresh")), tr("&Reload"), menu); connect(action, &QAction::triggered, d->view, &QWebEngineView::reload); menu->addAction(action); + + menu->addAction(QWebEnginePage::action(ViewSource)); } else { menu->addAction(QWebEnginePage::action(Copy)); menu->addAction(QWebEnginePage::action(Unselect)); @@ -1788,6 +1809,31 @@ const QWebEngineContextMenuData &QWebEnginePage::contextMenuData() const return d->contextData; } +/*! + \since 5.8 + + Shows the source of the current page in a new tab. + + \sa canViewSource +*/ +void QWebEnginePage::viewSource() +{ + triggerAction(QWebEnginePage::ViewSource); +} + +/*! + \property QWebEnginePage::canViewSource + \brief whether the source for the current page can be viewed. + \since 5.8 + + \sa viewSource() +*/ +bool QWebEnginePage::canViewSource() const +{ + Q_D(const QWebEnginePage); + return d->adapter->canViewSource(); +} + QT_END_NAMESPACE #include "moc_qwebenginepage.cpp" -- cgit v1.2.3