summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJocelyn Turcotte <jocelyn.turcotte@digia.com>2014-01-15 19:10:22 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-22 08:45:25 +0100
commit1fcd7970e07a0ecab206224824d1c71488fc19e9 (patch)
tree7bc6ba73623a69aa303f1f4d5c075e8ef37ca45e
parent3fcd31f5bd86cb568b1ca4f4f5c7c12c6675dceb (diff)
Implement QWebEnginePage::toHtml and toPlainText
Those methods are now made asynchronous and need to be given a callback to handle the result. Update the code in the browser and fancybrowser examples using std::bind when using C++11 or tr1::bind with C++03 (which should be available with compilers on platforms that we support). Add a (currently failing) earlyToHtml test to make sure that an empty page doesn't crash because of a possibly incomplete attachment of the QtRenderViewObserver. Change-Id: I3ab7cb6f25b91b584dd80df5e4e9ad1e3214348e Reviewed-by: Pierre Rossi <pierre.rossi@gmail.com>
-rw-r--r--examples/widgets/browser/browsermainwindow.cpp19
-rw-r--r--examples/widgets/fancybrowser/mainwindow.cpp19
-rw-r--r--src/core/common/qt_messages.h22
-rw-r--r--src/core/qt_render_view_observer_host.cpp14
-rw-r--r--src/core/qt_render_view_observer_host.h4
-rw-r--r--src/core/renderer/qt_render_view_observer.cpp18
-rw-r--r--src/core/renderer/qt_render_view_observer.h3
-rw-r--r--src/core/web_contents_adapter.cpp14
-rw-r--r--src/core/web_contents_adapter.h2
-rw-r--r--src/core/web_contents_adapter_client.h2
-rw-r--r--src/webengine/api/qquickwebengineview_p_p.h2
-rw-r--r--src/webenginewidgets/api/qwebenginepage.cpp24
-rw-r--r--src/webenginewidgets/api/qwebenginepage.h4
-rw-r--r--src/webenginewidgets/api/qwebenginepage_p.h4
-rw-r--r--tests/auto/widgets/qwebengineframe/tst_qwebengineframe.cpp7
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>");