diff options
-rw-r--r-- | examples/widgets/browser/browsermainwindow.cpp | 19 | ||||
-rw-r--r-- | examples/widgets/fancybrowser/mainwindow.cpp | 19 | ||||
-rw-r--r-- | src/core/common/qt_messages.h | 22 | ||||
-rw-r--r-- | src/core/qt_render_view_observer_host.cpp | 14 | ||||
-rw-r--r-- | src/core/qt_render_view_observer_host.h | 4 | ||||
-rw-r--r-- | src/core/renderer/qt_render_view_observer.cpp | 18 | ||||
-rw-r--r-- | src/core/renderer/qt_render_view_observer.h | 3 | ||||
-rw-r--r-- | src/core/web_contents_adapter.cpp | 14 | ||||
-rw-r--r-- | src/core/web_contents_adapter.h | 2 | ||||
-rw-r--r-- | src/core/web_contents_adapter_client.h | 2 | ||||
-rw-r--r-- | src/webengine/api/qquickwebengineview_p_p.h | 2 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage.cpp | 24 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage.h | 4 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage_p.h | 4 | ||||
-rw-r--r-- | tests/auto/widgets/qwebengineframe/tst_qwebengineframe.cpp | 7 |
15 files changed, 143 insertions, 15 deletions
diff --git a/examples/widgets/browser/browsermainwindow.cpp b/examples/widgets/browser/browsermainwindow.cpp index 9a2262314..ac8426d9a 100644 --- a/examples/widgets/browser/browsermainwindow.cpp +++ b/examples/widgets/browser/browsermainwindow.cpp @@ -71,6 +71,16 @@ #include <QtCore/QDebug> +#if __cplusplus >= 201103L +#include <functional> +using std::bind; +namespace placeholders = std::placeholders; +#else +#include <tr1/functional> +using std::tr1::bind; +namespace placeholders = std::tr1::placeholders; +#endif + BrowserMainWindow::BrowserMainWindow(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags) , m_tabWidget(new TabWidget(this)) @@ -372,9 +382,7 @@ void BrowserMainWindow::setupMenu() #endif viewMenu->addSeparator(); -#if defined(QWEBENGINEPAGE_TOHTML) viewMenu->addAction(tr("Page S&ource"), this, SLOT(slotViewPageSource()), tr("Ctrl+Alt+U")); -#endif QAction *a = viewMenu->addAction(tr("&Full Screen"), this, SLOT(slotViewFullScreen(bool)), Qt::Key_F11); a->setCheckable(true); @@ -810,17 +818,16 @@ void BrowserMainWindow::slotViewFullScreen(bool makeFullScreen) void BrowserMainWindow::slotViewPageSource() { -#if defined(QWEBENGINEPAGE_TOHTML) if (!currentTab()) return; - QString markup = currentTab()->page()->toHtml(); - QPlainTextEdit *view = new QPlainTextEdit(markup); + QPlainTextEdit *view = new QPlainTextEdit; view->setWindowTitle(tr("Page Source of %1").arg(currentTab()->title())); view->setMinimumWidth(640); view->setAttribute(Qt::WA_DeleteOnClose); view->show(); -#endif + + currentTab()->page()->toHtml(bind(&QPlainTextEdit::setPlainText, view, placeholders::_1)); } void BrowserMainWindow::slotHome() diff --git a/examples/widgets/fancybrowser/mainwindow.cpp b/examples/widgets/fancybrowser/mainwindow.cpp index 53b2a545d..b9d5a8364 100644 --- a/examples/widgets/fancybrowser/mainwindow.cpp +++ b/examples/widgets/fancybrowser/mainwindow.cpp @@ -42,6 +42,16 @@ #include <QtWebEngineWidgets> #include "mainwindow.h" +#if __cplusplus >= 201103L +#include <functional> +using std::bind; +namespace placeholders = std::placeholders; +#else +#include <tr1/functional> +using std::tr1::bind; +namespace placeholders = std::tr1::placeholders; +#endif + //! [1] MainWindow::MainWindow(const QUrl& url) @@ -75,12 +85,10 @@ MainWindow::MainWindow(const QUrl& url) toolBar->addWidget(locationEdit); //! [1] -#ifdef QWEBENGINEPAGE_TOHTML QMenu *viewMenu = menuBar()->addMenu(tr("&View")); QAction* viewSourceAction = new QAction("Page Source", this); connect(viewSourceAction, SIGNAL(triggered()), SLOT(viewSource())); viewMenu->addAction(viewSourceAction); -#endif //! [3] QMenu *effectMenu = menuBar()->addMenu(tr("&Effect")); @@ -106,16 +114,13 @@ MainWindow::MainWindow(const QUrl& url) void MainWindow::viewSource() { -#ifdef QWEBENGINEPAGE_TOHTML - QWebEnginePage *mainFrame = view->page(); QTextEdit* textEdit = new QTextEdit(NULL); textEdit->setAttribute(Qt::WA_DeleteOnClose); textEdit->adjustSize(); textEdit->move(this->geometry().center() - textEdit->rect().center()); - - textEdit->setPlainText(mainFrame->toHtml()); textEdit->show(); -#endif + + view->page()->toHtml(bind(&QTextEdit::setPlainText, textEdit, placeholders::_1)); } //! [4] diff --git a/src/core/common/qt_messages.h b/src/core/common/qt_messages.h index 77be79360..47303d38d 100644 --- a/src/core/common/qt_messages.h +++ b/src/core/common/qt_messages.h @@ -18,3 +18,25 @@ namespace IPC { #endif // RENDER_VIEW_MESSAGES_H #define IPC_MESSAGE_START QtMsgStart + +//----------------------------------------------------------------------------- +// RenderView messages +// These are messages sent from the browser to the renderer process. + +IPC_MESSAGE_ROUTED1(QtRenderViewObserver_FetchDocumentMarkup, + uint64 /* requestId */) + +IPC_MESSAGE_ROUTED1(QtRenderViewObserver_FetchDocumentInnerText, + uint64 /* requestId */) + +//----------------------------------------------------------------------------- +// WebContents messages +// These are messages sent from the renderer back to the browser process. + +IPC_MESSAGE_ROUTED2(QtRenderViewObserverHost_DidFetchDocumentMarkup, + base::string16 /* markup */, + uint64 /* requestId */) + +IPC_MESSAGE_ROUTED2(QtRenderViewObserverHost_DidFetchDocumentInnerText, + base::string16 /* innerText */, + uint64 /* requestId */) diff --git a/src/core/qt_render_view_observer_host.cpp b/src/core/qt_render_view_observer_host.cpp index fec2c4b0c..4b3cc0189 100644 --- a/src/core/qt_render_view_observer_host.cpp +++ b/src/core/qt_render_view_observer_host.cpp @@ -51,10 +51,24 @@ QtRenderViewObserverHost::QtRenderViewObserverHost(content::WebContents *webCont { } +void QtRenderViewObserverHost::fetchDocumentMarkup(quint64 requestId) +{ + Send(new QtRenderViewObserver_FetchDocumentMarkup(routing_id(), requestId)); +} + +void QtRenderViewObserverHost::fetchDocumentInnerText(quint64 requestId) +{ + Send(new QtRenderViewObserver_FetchDocumentInnerText(routing_id(), requestId)); +} + bool QtRenderViewObserverHost::OnMessageReceived(const IPC::Message& message) { bool handled = true; IPC_BEGIN_MESSAGE_MAP(QtRenderViewObserverHost, message) + IPC_MESSAGE_HANDLER(QtRenderViewObserverHost_DidFetchDocumentMarkup, + onDidFetchDocumentMarkup) + IPC_MESSAGE_HANDLER(QtRenderViewObserverHost_DidFetchDocumentInnerText, + onDidFetchDocumentInnerText) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() return handled; diff --git a/src/core/qt_render_view_observer_host.h b/src/core/qt_render_view_observer_host.h index 61b6a4124..7d93176c5 100644 --- a/src/core/qt_render_view_observer_host.h +++ b/src/core/qt_render_view_observer_host.h @@ -55,9 +55,13 @@ class QtRenderViewObserverHost : public content::WebContentsObserver { public: QtRenderViewObserverHost(content::WebContents*, WebContentsAdapterClient *adapterClient); + void fetchDocumentMarkup(quint64 requestId); + void fetchDocumentInnerText(quint64 requestId); private: bool OnMessageReceived(const IPC::Message& message) Q_DECL_OVERRIDE; + void onDidFetchDocumentMarkup(const base::string16& markup, quint64 requestId); + void onDidFetchDocumentInnerText(const base::string16& innerText, quint64 requestId); WebContentsAdapterClient *m_adapterClient; }; diff --git a/src/core/renderer/qt_render_view_observer.cpp b/src/core/renderer/qt_render_view_observer.cpp index b3b4c38c4..0f5ca6556 100644 --- a/src/core/renderer/qt_render_view_observer.cpp +++ b/src/core/renderer/qt_render_view_observer.cpp @@ -54,10 +54,28 @@ QtRenderViewObserver::QtRenderViewObserver(content::RenderView* render_view) { } +void QtRenderViewObserver::onFetchDocumentMarkup(quint64 requestId) +{ + Send(new QtRenderViewObserverHost_DidFetchDocumentMarkup( + routing_id(), + render_view()->GetWebView()->mainFrame()->document().createMarkup(), + requestId)); +} + +void QtRenderViewObserver::onFetchDocumentInnerText(quint64 requestId) +{ + Send(new QtRenderViewObserverHost_DidFetchDocumentInnerText( + routing_id(), + render_view()->GetWebView()->mainFrame()->document().documentElement().innerText(), + requestId)); +} + bool QtRenderViewObserver::OnMessageReceived(const IPC::Message& message) { bool handled = true; IPC_BEGIN_MESSAGE_MAP(QtRenderViewObserver, message) + IPC_MESSAGE_HANDLER(QtRenderViewObserver_FetchDocumentMarkup, onFetchDocumentMarkup) + IPC_MESSAGE_HANDLER(QtRenderViewObserver_FetchDocumentInnerText, onFetchDocumentInnerText) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() return handled; diff --git a/src/core/renderer/qt_render_view_observer.h b/src/core/renderer/qt_render_view_observer.h index 8c5713c4a..c37dce16d 100644 --- a/src/core/renderer/qt_render_view_observer.h +++ b/src/core/renderer/qt_render_view_observer.h @@ -48,6 +48,9 @@ public: QtRenderViewObserver(content::RenderView* render_view); private: + void onFetchDocumentMarkup(quint64 requestId); + void onFetchDocumentInnerText(quint64 requestId); + virtual bool OnMessageReceived(const IPC::Message& message) Q_DECL_OVERRIDE; DISALLOW_COPY_AND_ASSIGN(QtRenderViewObserver); diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp index bd3be1744..6cdc83375 100644 --- a/src/core/web_contents_adapter.cpp +++ b/src/core/web_contents_adapter.cpp @@ -394,6 +394,20 @@ quint64 WebContentsAdapter::runJavaScriptCallbackResult(const QString &javaScrip return d->lastRequestId; } +quint64 WebContentsAdapter::fetchDocumentMarkup() +{ + Q_D(WebContentsAdapter); + d->renderViewObserverHost->fetchDocumentMarkup(++d->lastRequestId); + return d->lastRequestId; +} + +quint64 WebContentsAdapter::fetchDocumentInnerText() +{ + Q_D(WebContentsAdapter); + d->renderViewObserverHost->fetchDocumentInnerText(++d->lastRequestId); + return d->lastRequestId; +} + void WebContentsAdapter::dpiScaleChanged() { Q_D(WebContentsAdapter); diff --git a/src/core/web_contents_adapter.h b/src/core/web_contents_adapter.h index 49c1de4c0..e70aae259 100644 --- a/src/core/web_contents_adapter.h +++ b/src/core/web_contents_adapter.h @@ -86,6 +86,8 @@ public: void filesSelectedInChooser(const QStringList &fileList, WebContentsAdapterClient::FileChooserMode); void runJavaScript(const QString &javaScript, const QString &xPath); quint64 runJavaScriptCallbackResult(const QString &javaScript, const QString &xPath); + quint64 fetchDocumentMarkup(); + quint64 fetchDocumentInnerText(); void dpiScaleChanged(); diff --git a/src/core/web_contents_adapter_client.h b/src/core/web_contents_adapter_client.h index e3e88e110..77a02f5e7 100644 --- a/src/core/web_contents_adapter_client.h +++ b/src/core/web_contents_adapter_client.h @@ -130,6 +130,8 @@ public: virtual void javascriptDialog(QSharedPointer<JavaScriptDialogController>) = 0; virtual void runFileChooser(FileChooserMode, const QString &defaultFileName, const QStringList &acceptedMimeTypes) = 0; virtual void didRunJavaScript(const QVariant& result, quint64 requestId) = 0; + virtual void didFetchDocumentMarkup(const QString& result, quint64 requestId) = 0; + virtual void didFetchDocumentInnerText(const QString& result, quint64 requestId) = 0; }; #endif // WEB_CONTENTS_ADAPTER_CLIENT_H diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h index 96632904c..87c0a092b 100644 --- a/src/webengine/api/qquickwebengineview_p_p.h +++ b/src/webengine/api/qquickwebengineview_p_p.h @@ -139,6 +139,8 @@ public: virtual void javascriptDialog(QSharedPointer<JavaScriptDialogController>) Q_DECL_OVERRIDE; virtual void runFileChooser(FileChooserMode, const QString &defaultFileName, const QStringList &acceptedMimeTypes) Q_DECL_OVERRIDE; virtual void didRunJavaScript(const QVariant&, quint64) Q_DECL_OVERRIDE { } + virtual void didFetchDocumentMarkup(const QString&, quint64) Q_DECL_OVERRIDE { } + virtual void didFetchDocumentInnerText(const QString&, quint64) Q_DECL_OVERRIDE { } void setDevicePixelRatio(qreal); diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index 8192f38ed..1a3cf5dde 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -151,6 +151,16 @@ void QWebEnginePagePrivate::didRunJavaScript(const QVariant& result, quint64 req (*m_variantCallbacks.take(requestId))(result); } +void QWebEnginePagePrivate::didFetchDocumentMarkup(const QString& result, quint64 requestId) +{ + (*m_stringCallbacks.take(requestId))(result); +} + +void QWebEnginePagePrivate::didFetchDocumentInnerText(const QString& result, quint64 requestId) +{ + (*m_stringCallbacks.take(requestId))(result); +} + void QWebEnginePagePrivate::updateAction(QWebEnginePage::WebAction action) const { #ifdef QT_NO_ACTION @@ -448,6 +458,20 @@ void QWebEnginePage::load(const QUrl& url) d->adapter->load(url); } +void QWebEnginePage::toHtml(const QWebEngineCallback<const QString &> &resultCallback) const +{ + Q_D(const QWebEnginePage); + quint64 requestId = d->adapter->fetchDocumentMarkup(); + d->m_stringCallbacks.insert(requestId, resultCallback.d); +} + +void QWebEnginePage::toPlainText(const QWebEngineCallback<const QString &> &resultCallback) const +{ + Q_D(const QWebEnginePage); + quint64 requestId = d->adapter->fetchDocumentInnerText(); + d->m_stringCallbacks.insert(requestId, resultCallback.d); +} + void QWebEnginePage::setHtml(const QString &html, const QUrl &baseUrl) { Q_D(QWebEnginePage); diff --git a/src/webenginewidgets/api/qwebenginepage.h b/src/webenginewidgets/api/qwebenginepage.h index c33119571..d92e87cc6 100644 --- a/src/webenginewidgets/api/qwebenginepage.h +++ b/src/webenginewidgets/api/qwebenginepage.h @@ -434,8 +434,8 @@ public: void setContent(const QByteArray &data, const QString &mimeType = QString(), const QUrl &baseUrl = QUrl()); void addToJavaScriptWindowObject(const QString &name, QObject *object, ValueOwnership ownership = QtOwnership); - QString toHtml() const; - QString toPlainText() const; + void toHtml(const QWebEngineCallback<const QString &> &resultCallback) const; + void toPlainText(const QWebEngineCallback<const QString &> &resultCallback) const; QString title() const; void setUrl(const QUrl &url); diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h index 656eb4788..60317972a 100644 --- a/src/webenginewidgets/api/qwebenginepage_p.h +++ b/src/webenginewidgets/api/qwebenginepage_p.h @@ -81,6 +81,8 @@ public: virtual void javascriptDialog(QSharedPointer<JavaScriptDialogController>) Q_DECL_OVERRIDE; virtual void runFileChooser(FileChooserMode, const QString &defaultFileName, const QStringList &acceptedMimeTypes) Q_DECL_OVERRIDE; virtual void didRunJavaScript(const QVariant& result, quint64 requestId) Q_DECL_OVERRIDE; + virtual void didFetchDocumentMarkup(const QString& result, quint64 requestId) Q_DECL_OVERRIDE; + virtual void didFetchDocumentInnerText(const QString& result, quint64 requestId) Q_DECL_OVERRIDE; void updateAction(QWebEnginePage::WebAction) const; void updateNavigationActions(); @@ -94,7 +96,9 @@ public: WebEngineContextMenuData m_menuData; typedef QtWebEnginePrivate::QWebEngineCallbackPrivateBase<const QVariant&> VariantCallback; + typedef QtWebEnginePrivate::QWebEngineCallbackPrivateBase<const QString&> StringCallback; mutable QHash<quint64, QExplicitlySharedDataPointer<VariantCallback> > m_variantCallbacks; + mutable QHash<quint64, QExplicitlySharedDataPointer<StringCallback> > m_stringCallbacks; }; QT_END_NAMESPACE diff --git a/tests/auto/widgets/qwebengineframe/tst_qwebengineframe.cpp b/tests/auto/widgets/qwebengineframe/tst_qwebengineframe.cpp index 11281082b..1db95366b 100644 --- a/tests/auto/widgets/qwebengineframe/tst_qwebengineframe.cpp +++ b/tests/auto/widgets/qwebengineframe/tst_qwebengineframe.cpp @@ -60,6 +60,7 @@ private Q_SLOTS: void javaScriptWindowObjectCleared_data(); void javaScriptWindowObjectCleared(); void javaScriptWindowObjectClearedOnEvaluate(); + void earlyToHtml(); void setHtml(); void setHtmlWithImageResource(); void setHtmlWithStylesheetResource(); @@ -389,6 +390,12 @@ void tst_QWebEngineFrame::javaScriptWindowObjectClearedOnEvaluate() QCOMPARE(spy.count(), 1); } +void tst_QWebEngineFrame::earlyToHtml() +{ + QString html("<html><head></head><body></body></html>"); + QCOMPARE(toHtml(m_view->page()), html); +} + void tst_QWebEngineFrame::setHtml() { QString html("<html><head></head><body><p>hello world</p></body></html>"); |