summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJocelyn Turcotte <jocelyn.turcotte@digia.com>2013-06-17 18:58:06 +0200
committerJocelyn Turcotte <jocelyn.turcotte@digia.com>2013-06-19 12:19:11 +0200
commitbbeaf3278de08da00f56aba3511951aaf6a8d233 (patch)
treef59de9808a942a2668f2bb73d0b03a1bebcd4b0f
parent2d2da7d717d6bd354f5febe3deb8615685ca3280 (diff)
Allow the API class to provide the page widget rendering implementation.
- Rename NativeViewQt to RenderWidgetHostViewQtDelegate to keep the context obvious. - Use an interface to handle the parenting instead of the NativeViewContainerQt mechanism that was needed with the Shell.
-rw-r--r--lib/lib.pro4
-rw-r--r--lib/qquickwebcontentsview.cpp39
-rw-r--r--lib/qquickwebcontentsview.h3
-rw-r--r--lib/qwebcontentsview.cpp21
-rw-r--r--lib/qwebcontentsview_p.h4
-rw-r--r--lib/render_widget_host_view_qt_delegate_quick.cpp125
-rw-r--r--lib/render_widget_host_view_qt_delegate_quick.h59
-rw-r--r--lib/render_widget_host_view_qt_delegate_widget.cpp84
-rw-r--r--lib/render_widget_host_view_qt_delegate_widget.h41
-rw-r--r--lib/web_contents_view_qt.h22
-rw-r--r--shared/native_view_container_qt.h116
-rw-r--r--shared/native_view_qt.cpp208
-rw-r--r--shared/native_view_qt.h97
-rw-r--r--shared/render_widget_host_view_qt.cpp60
-rw-r--r--shared/render_widget_host_view_qt.h5
-rw-r--r--shared/render_widget_host_view_qt_delegate.h21
-rw-r--r--shared/shared.pro6
17 files changed, 428 insertions, 487 deletions
diff --git a/lib/lib.pro b/lib/lib.pro
index 54a35b226..e4f75a65c 100644
--- a/lib/lib.pro
+++ b/lib/lib.pro
@@ -23,6 +23,8 @@ SOURCES = \
content_browser_client_qt.cpp \
qquickwebcontentsview.cpp \
qwebcontentsview.cpp \
+ render_widget_host_view_qt_delegate_quick.cpp \
+ render_widget_host_view_qt_delegate_widget.cpp \
resource_context_qt.cpp \
url_request_context_getter_qt.cpp \
web_contents_delegate_qt.cpp \
@@ -34,6 +36,8 @@ HEADERS = \
qquickwebcontentsview.h \
qwebcontentsview.h \
qwebcontentsview_p.h \
+ render_widget_host_view_qt_delegate_quick.h \
+ render_widget_host_view_qt_delegate_widget.h \
resource_context_qt.h \
url_request_context_getter_qt.h \
web_contents_delegate_qt.h \
diff --git a/lib/qquickwebcontentsview.cpp b/lib/qquickwebcontentsview.cpp
index e540b0d32..ee68301b0 100644
--- a/lib/qquickwebcontentsview.cpp
+++ b/lib/qquickwebcontentsview.cpp
@@ -46,12 +46,12 @@
#include "browser_context_qt.h"
#include "content_browser_client_qt.h"
+#include "render_widget_host_view_qt_delegate_quick.h"
#include "web_contents_delegate_qt.h"
#include "web_contents_view_qt.h"
#include "web_engine_context.h"
#include <QUrl>
-#include <QQmlProperty>
void QQuickWebContentsView::registerType()
{
@@ -59,12 +59,15 @@ void QQuickWebContentsView::registerType()
qmlRegisterType<QQuickWebContentsView>("QtWebEngine", 1, 0, "WebContentsView");
}
-struct QQuickWebContentsViewPrivate
+class QQuickWebContentsViewPrivate : public WebContentsViewQtClient
{
QQuickWebContentsView *q_ptr;
Q_DECLARE_PUBLIC(QQuickWebContentsView)
+public:
QQuickWebContentsViewPrivate();
+ RenderWidgetHostViewQtDelegate* CreateRenderWidgetHostViewQtDelegate(content::RenderWidgetHostViewQt *view) Q_DECL_OVERRIDE;
+
scoped_refptr<WebEngineContext> context;
scoped_ptr<WebContentsDelegateQt> webContentsDelegate;
};
@@ -75,18 +78,10 @@ QQuickWebContentsView::QQuickWebContentsView()
d_ptr->q_ptr = this;
Q_D(QQuickWebContentsView);
- content::BrowserContext* browser_context = static_cast<ContentBrowserClientQt*>(content::GetContentClient()->browser())->browser_context();
- d->webContentsDelegate.reset(new WebContentsDelegateQt(browser_context, NULL, MSG_ROUTING_NONE, gfx::Size()));
-
WebContentsDelegateQt* delegate = d->webContentsDelegate.get();
connect(delegate, SIGNAL(titleChanged(QString)), this, SIGNAL(titleChanged(QString)));
connect(delegate, SIGNAL(urlChanged(QUrl)), this, SIGNAL(urlChanged()));
connect(delegate, SIGNAL(loadingStateChanged()), this, SIGNAL(loadingStateChanged()));
-
- WebContentsViewQt* content_view = static_cast<WebContentsViewQt*>(d->webContentsDelegate->web_contents()->GetView());
- QQuickItem* windowContainer = content_view->windowContainer()->qQuickItem();
- windowContainer->setParentItem(this);
- QQmlProperty::write(windowContainer, QStringLiteral("anchors.fill"), QVariant::fromValue(this));
}
QQuickWebContentsView::~QQuickWebContentsView()
@@ -171,8 +166,32 @@ bool QQuickWebContentsView::canGoForward() const
return d->webContentsDelegate->web_contents()->GetController().CanGoForward();
}
+void QQuickWebContentsView::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
+{
+ QQuickItem::geometryChanged(newGeometry, oldGeometry);
+
+ Q_FOREACH(QQuickItem *child, childItems()) {
+ Q_ASSERT(qobject_cast<RenderWidgetHostViewQtDelegateQuick *>(child));
+ child->setSize(newGeometry.size());
+ }
+}
+
QQuickWebContentsViewPrivate::QQuickWebContentsViewPrivate()
// This has to be the first thing we do.
: context(WebEngineContext::current())
{
+ content::BrowserContext* browser_context = static_cast<ContentBrowserClientQt*>(content::GetContentClient()->browser())->browser_context();
+ webContentsDelegate.reset(new WebContentsDelegateQt(browser_context, NULL, MSG_ROUTING_NONE, gfx::Size()));
+
+ WebContentsViewQt* contents_view = static_cast<WebContentsViewQt*>(webContentsDelegate->web_contents()->GetView());
+ contents_view->SetClient(this);
+}
+
+RenderWidgetHostViewQtDelegate *QQuickWebContentsViewPrivate::CreateRenderWidgetHostViewQtDelegate(content::RenderWidgetHostViewQt *view)
+{
+ Q_Q(QQuickWebContentsView);
+ // Parent the RWHV directly, this might have to be changed to handle popups and fullscreen.
+ RenderWidgetHostViewQtDelegateQuick *viewDelegate = new RenderWidgetHostViewQtDelegateQuick(view, q);
+ viewDelegate->setSize(QSizeF(q->width(), q->height()));
+ return viewDelegate;
}
diff --git a/lib/qquickwebcontentsview.h b/lib/qquickwebcontentsview.h
index 81459c490..2c19bce0a 100644
--- a/lib/qquickwebcontentsview.h
+++ b/lib/qquickwebcontentsview.h
@@ -79,6 +79,9 @@ Q_SIGNALS:
void urlChanged();
void loadingStateChanged();
+protected:
+ void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry);
+
private:
Q_DECLARE_PRIVATE(QQuickWebContentsView)
// Hides QObject::d_ptr allowing us to use the convenience macros.
diff --git a/lib/qwebcontentsview.cpp b/lib/qwebcontentsview.cpp
index 3f6c69990..c8f5535dd 100644
--- a/lib/qwebcontentsview.cpp
+++ b/lib/qwebcontentsview.cpp
@@ -46,6 +46,7 @@
#include "browser_context_qt.h"
#include "content_browser_client_qt.h"
+#include "render_widget_host_view_qt_delegate_widget.h"
#include "web_contents_delegate_qt.h"
#include "web_contents_view_qt.h"
#include "web_engine_context.h"
@@ -60,9 +61,6 @@ QWebContentsView::QWebContentsView()
d_ptr->q_ptr = this;
Q_D(QWebContentsView);
- content::BrowserContext* browser_context = static_cast<ContentBrowserClientQt*>(content::GetContentClient()->browser())->browser_context();
- d->webContentsDelegate.reset(new WebContentsDelegateQt(browser_context, NULL, MSG_ROUTING_NONE, gfx::Size()));
-
QVBoxLayout *layout = new QVBoxLayout;
layout->setContentsMargins(0, 0, 0, 0);
setLayout(layout);
@@ -71,9 +69,6 @@ QWebContentsView::QWebContentsView()
connect(delegate, SIGNAL(titleChanged(const QString&)), this, SIGNAL(titleChanged(const QString&)));
connect(delegate, SIGNAL(urlChanged(const QUrl&)), this, SIGNAL(urlChanged(const QUrl&)));
connect(delegate, SIGNAL(loadingStateChanged()), d, SLOT(loadingStateChanged()));
-
- WebContentsViewQt* content_view = static_cast<WebContentsViewQt*>(d->webContentsDelegate->web_contents()->GetView());
- layout->addLayout(content_view->windowContainer()->widget());
}
QWebContentsView::~QWebContentsView()
@@ -145,6 +140,11 @@ QWebContentsViewPrivate::QWebContentsViewPrivate()
: context(WebEngineContext::current())
, m_isLoading(false)
{
+ content::BrowserContext* browser_context = static_cast<ContentBrowserClientQt*>(content::GetContentClient()->browser())->browser_context();
+ webContentsDelegate.reset(new WebContentsDelegateQt(browser_context, NULL, MSG_ROUTING_NONE, gfx::Size()));
+
+ WebContentsViewQt* contents_view = static_cast<WebContentsViewQt*>(webContentsDelegate->web_contents()->GetView());
+ contents_view->SetClient(this);
}
void QWebContentsViewPrivate::loadingStateChanged()
@@ -159,3 +159,12 @@ void QWebContentsViewPrivate::loadingStateChanged()
Q_EMIT q->loadFinished(true);
}
}
+
+RenderWidgetHostViewQtDelegate *QWebContentsViewPrivate::CreateRenderWidgetHostViewQtDelegate(content::RenderWidgetHostViewQt *view)
+{
+ Q_Q(QWebContentsView);
+ RenderWidgetHostViewQtDelegateWidget *viewDelegate = new RenderWidgetHostViewQtDelegateWidget(view, q);
+ // Parent the RWHV directly, this might have to be changed to handle popups and fullscreen.
+ q->layout()->addWidget(viewDelegate);
+ return viewDelegate;
+}
diff --git a/lib/qwebcontentsview_p.h b/lib/qwebcontentsview_p.h
index 9d2190ee2..c2009c7ac 100644
--- a/lib/qwebcontentsview_p.h
+++ b/lib/qwebcontentsview_p.h
@@ -51,7 +51,7 @@
#include <QScopedPointer>
#include <QObject>
-class QWebContentsViewPrivate : public QObject
+class QWebContentsViewPrivate : public QObject, public WebContentsViewQtClient
{
QWebContentsView *q_ptr;
Q_DECLARE_PUBLIC(QWebContentsView)
@@ -59,6 +59,8 @@ class QWebContentsViewPrivate : public QObject
public:
QWebContentsViewPrivate();
+ RenderWidgetHostViewQtDelegate* CreateRenderWidgetHostViewQtDelegate(content::RenderWidgetHostViewQt *view) Q_DECL_OVERRIDE;
+
public Q_SLOTS:
void loadingStateChanged();
diff --git a/lib/render_widget_host_view_qt_delegate_quick.cpp b/lib/render_widget_host_view_qt_delegate_quick.cpp
new file mode 100644
index 000000000..754e68239
--- /dev/null
+++ b/lib/render_widget_host_view_qt_delegate_quick.cpp
@@ -0,0 +1,125 @@
+#include "render_widget_host_view_qt_delegate_quick.h"
+
+#include "shared/backing_store_qt.h"
+#include "shared/render_widget_host_view_qt.h"
+#include <QQuickWindow>
+#include <QWindow>
+
+RenderWidgetHostViewQtDelegateQuick::RenderWidgetHostViewQtDelegateQuick(content::RenderWidgetHostViewQt* view, QQuickItem *parent)
+ : QQuickPaintedItem(parent)
+ , m_backingStore(0)
+ , m_view(view)
+{
+ setFocus(true);
+ setAcceptedMouseButtons(Qt::AllButtons);
+}
+
+QRectF RenderWidgetHostViewQtDelegateQuick::screenRect() const
+{
+ QPointF pos = mapToScene(QPointF(0,0));
+ return QRectF(pos.x(), pos.y(), width(), height());
+}
+
+void RenderWidgetHostViewQtDelegateQuick::show()
+{
+ setVisible(true);
+}
+
+void RenderWidgetHostViewQtDelegateQuick::hide()
+{
+ setVisible(false);
+}
+
+bool RenderWidgetHostViewQtDelegateQuick::isVisible() const
+{
+ return QQuickPaintedItem::isVisible();
+}
+
+QWindow* RenderWidgetHostViewQtDelegateQuick::window() const
+{
+ return QQuickPaintedItem::window();
+}
+
+void RenderWidgetHostViewQtDelegateQuick::update(const QRect& rect)
+{
+ QQuickPaintedItem::update(rect);
+}
+
+void RenderWidgetHostViewQtDelegateQuick::paint(QPainter *painter)
+{
+ if (!m_backingStore)
+ return;
+
+ m_backingStore->paintToTarget(painter, boundingRect());
+}
+
+void RenderWidgetHostViewQtDelegateQuick::setBackingStore(BackingStoreQt* backingStore)
+{
+ m_backingStore = backingStore;
+ if (m_backingStore)
+ m_backingStore->resize(QSize(width(), height()));
+}
+
+QSGNode * RenderWidgetHostViewQtDelegateQuick::updatePaintNode(QSGNode * oldNode, UpdatePaintNodeData * data)
+{
+ return QQuickPaintedItem::updatePaintNode(oldNode, data);
+}
+
+void RenderWidgetHostViewQtDelegateQuick::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
+{
+ QQuickPaintedItem::geometryChanged(newGeometry, oldGeometry);
+
+ resizeBackingStore();
+}
+
+void RenderWidgetHostViewQtDelegateQuick::resizeBackingStore()
+{
+ if (m_backingStore)
+ m_backingStore->resize(QSize(width(), height()));
+}
+
+void RenderWidgetHostViewQtDelegateQuick::focusInEvent(QFocusEvent *event)
+{
+ m_view->handleFocusEvent(event);
+}
+
+void RenderWidgetHostViewQtDelegateQuick::focusOutEvent(QFocusEvent *event)
+{
+ m_view->handleFocusEvent(event);
+}
+
+void RenderWidgetHostViewQtDelegateQuick::mousePressEvent(QMouseEvent *event)
+{
+ setFocus(true);
+ m_view->handleMouseEvent(event);
+}
+
+void RenderWidgetHostViewQtDelegateQuick::mouseMoveEvent(QMouseEvent *event)
+{
+ m_view->handleMouseEvent(event);
+}
+
+void RenderWidgetHostViewQtDelegateQuick::mouseReleaseEvent(QMouseEvent *event)
+{
+ m_view->handleMouseEvent(event);
+}
+
+void RenderWidgetHostViewQtDelegateQuick::mouseDoubleClickEvent(QMouseEvent *event)
+{
+ m_view->handleMouseEvent(event);
+}
+
+void RenderWidgetHostViewQtDelegateQuick::keyPressEvent(QKeyEvent *event)
+{
+ m_view->handleKeyEvent(event);
+}
+
+void RenderWidgetHostViewQtDelegateQuick::keyReleaseEvent(QKeyEvent *event)
+{
+ m_view->handleKeyEvent(event);
+}
+
+void RenderWidgetHostViewQtDelegateQuick::wheelEvent(QWheelEvent *event)
+{
+ m_view->handleWheelEvent(event);
+}
diff --git a/lib/render_widget_host_view_qt_delegate_quick.h b/lib/render_widget_host_view_qt_delegate_quick.h
new file mode 100644
index 000000000..20725c621
--- /dev/null
+++ b/lib/render_widget_host_view_qt_delegate_quick.h
@@ -0,0 +1,59 @@
+#ifndef RENDER_WIDGET_HOST_VIEW_QT_DELEGATE_QUICK_H
+#define RENDER_WIDGET_HOST_VIEW_QT_DELEGATE_QUICK_H
+
+#include "shared/render_widget_host_view_qt_delegate.h"
+
+#include <QQuickPaintedItem>
+
+class BackingStoreQt;
+class QWindow;
+class QQuickItem;
+class QFocusEvent;
+class QMouseEvent;
+class QKeyEvent;
+class QWheelEvent;
+
+namespace content {
+ class RenderWidgetHostViewQt;
+}
+
+class RenderWidgetHostViewQtDelegateQuick : public QQuickPaintedItem, public RenderWidgetHostViewQtDelegate
+{
+ Q_OBJECT
+public:
+ RenderWidgetHostViewQtDelegateQuick(content::RenderWidgetHostViewQt* view, QQuickItem *parent = 0);
+
+ virtual void setBackingStore(BackingStoreQt* backingStore);
+ virtual QRectF screenRect() const;
+ virtual void show();
+ virtual void hide();
+ virtual bool isVisible() const;
+ virtual QWindow* window() const;
+ virtual void update(const QRect& rect = QRect());
+
+ void paint(QPainter *painter);
+
+ void focusInEvent(QFocusEvent*);
+ void focusOutEvent(QFocusEvent*);
+ void mousePressEvent(QMouseEvent*);
+ void mouseMoveEvent(QMouseEvent*);
+ void mouseReleaseEvent(QMouseEvent*);
+ void mouseDoubleClickEvent(QMouseEvent*);
+ void keyPressEvent(QKeyEvent*);
+ void keyReleaseEvent(QKeyEvent*);
+ void wheelEvent(QWheelEvent*);
+
+protected Q_SLOTS:
+ void resizeBackingStore();
+
+protected:
+ QSGNode* updatePaintNode(QSGNode * oldNode, UpdatePaintNodeData * data);
+ void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry);
+
+private:
+ BackingStoreQt* m_backingStore;
+ content::RenderWidgetHostViewQt *m_view;
+
+};
+
+#endif
diff --git a/lib/render_widget_host_view_qt_delegate_widget.cpp b/lib/render_widget_host_view_qt_delegate_widget.cpp
new file mode 100644
index 000000000..8be1d308f
--- /dev/null
+++ b/lib/render_widget_host_view_qt_delegate_widget.cpp
@@ -0,0 +1,84 @@
+#include "render_widget_host_view_qt_delegate_widget.h"
+
+#include "shared/backing_store_qt.h"
+#include "shared/render_widget_host_view_qt.h"
+
+#include <QResizeEvent>
+#include <QPaintEvent>
+
+RenderWidgetHostViewQtDelegateWidget::RenderWidgetHostViewQtDelegateWidget(content::RenderWidgetHostViewQt* view, QWidget *parent)
+ : QWidget(parent)
+ , m_painter(0)
+ , m_backingStore(0)
+ , m_view(view)
+{
+ setFocusPolicy(Qt::ClickFocus);
+ setAttribute(Qt::WA_OpaquePaintEvent);
+}
+
+QRectF RenderWidgetHostViewQtDelegateWidget::screenRect() const
+{
+ return QRectF(x(), y(), width(), height());
+}
+
+void RenderWidgetHostViewQtDelegateWidget::show()
+{
+ QWidget::show();
+}
+
+void RenderWidgetHostViewQtDelegateWidget::hide()
+{
+ QWidget::hide();
+}
+
+
+bool RenderWidgetHostViewQtDelegateWidget::isVisible() const
+{
+ return QWidget::isVisible();
+}
+
+QWindow* RenderWidgetHostViewQtDelegateWidget::window() const
+{
+ return QWidget::windowHandle();
+}
+
+void RenderWidgetHostViewQtDelegateWidget::update(const QRect& rect)
+{
+ QWidget::update(rect);
+}
+
+void RenderWidgetHostViewQtDelegateWidget::setBackingStore(BackingStoreQt* backingStore)
+{
+ m_backingStore = backingStore;
+ if (m_backingStore)
+ m_backingStore->resize(size());
+}
+
+void RenderWidgetHostViewQtDelegateWidget::paintEvent(QPaintEvent * event)
+{
+ if (!m_backingStore)
+ return;
+ QPainter painter(this);
+ m_backingStore->paintToTarget(&painter, event->rect());
+}
+
+QPainter* RenderWidgetHostViewQtDelegateWidget::painter()
+{
+ if (!m_painter)
+ m_painter = new QPainter(this);
+ return m_painter;
+}
+
+void RenderWidgetHostViewQtDelegateWidget::resizeEvent(QResizeEvent *resizeEvent)
+{
+ if (m_backingStore)
+ m_backingStore->resize(resizeEvent->size());
+ QWidget::update();
+}
+
+bool RenderWidgetHostViewQtDelegateWidget::event(QEvent *event)
+{
+ if (!m_view || !m_view->handleEvent(event))
+ return QWidget::event(event);
+ return true;
+}
diff --git a/lib/render_widget_host_view_qt_delegate_widget.h b/lib/render_widget_host_view_qt_delegate_widget.h
new file mode 100644
index 000000000..9087ba017
--- /dev/null
+++ b/lib/render_widget_host_view_qt_delegate_widget.h
@@ -0,0 +1,41 @@
+#ifndef RENDER_WIDGET_HOST_VIEW_QT_DELEGATE_WIDGET_H
+#define RENDER_WIDGET_HOST_VIEW_QT_DELEGATE_WIDGET_H
+
+#include "shared/render_widget_host_view_qt_delegate.h"
+
+#include <QWidget>
+
+class BackingStoreQt;
+class QWindow;
+
+namespace content {
+ class RenderWidgetHostViewQt;
+}
+
+class RenderWidgetHostViewQtDelegateWidget : public QWidget, public RenderWidgetHostViewQtDelegate
+{
+public:
+ RenderWidgetHostViewQtDelegateWidget(content::RenderWidgetHostViewQt* view, QWidget *parent = 0);
+
+ virtual void setBackingStore(BackingStoreQt* backingStore);
+ virtual QRectF screenRect() const;
+ virtual void show();
+ virtual void hide();
+ virtual bool isVisible() const;
+ virtual QWindow* window() const;
+ virtual void update(const QRect& rect = QRect());
+
+ QPainter* painter();
+
+protected:
+ void paintEvent(QPaintEvent * event);
+ bool event(QEvent *event);
+ void resizeEvent(QResizeEvent *resizeEvent);
+
+private:
+ BackingStoreQt* m_backingStore;
+ QPainter* m_painter;
+ content::RenderWidgetHostViewQt *m_view;
+};
+
+#endif
diff --git a/lib/web_contents_view_qt.h b/lib/web_contents_view_qt.h
index 46e7fe7a9..d20f8fec6 100644
--- a/lib/web_contents_view_qt.h
+++ b/lib/web_contents_view_qt.h
@@ -49,7 +49,12 @@
#include "content/port/browser/web_contents_view_port.h"
#include "shared/render_widget_host_view_qt.h"
-#include "shared/native_view_container_qt.h"
+
+class WebContentsViewQtClient {
+public:
+ virtual ~WebContentsViewQtClient() { }
+ virtual RenderWidgetHostViewQtDelegate* CreateRenderWidgetHostViewQtDelegate(content::RenderWidgetHostViewQt *view) = 0;
+};
class WebContentsViewQt
: public content::WebContentsViewPort
@@ -57,13 +62,16 @@ class WebContentsViewQt
{
public:
WebContentsViewQt(content::WebContents* web_contents)
- : m_windowContainer(new NativeViewContainerQt)
+ : m_client(0)
{ }
- content::RenderWidgetHostView* CreateViewForWidget(content::RenderWidgetHost* render_widget_host)
+ void SetClient(WebContentsViewQtClient* client) { m_client = client; }
+
+ virtual content::RenderWidgetHostView *CreateViewForWidget(content::RenderWidgetHost* render_widget_host)
{
- content::RenderWidgetHostView* view = content::RenderWidgetHostView::CreateViewForWidget(render_widget_host);
- view->InitAsChild(reinterpret_cast<gfx::NativeView>(m_windowContainer));
+ content::RenderWidgetHostViewQt *view = new content::RenderWidgetHostViewQt(render_widget_host);
+ RenderWidgetHostViewQtDelegate *viewDelegate = m_client->CreateRenderWidgetHostViewQtDelegate(view);
+ view->SetDelegate(viewDelegate);
return view;
}
@@ -107,10 +115,8 @@ public:
virtual void ShowPopupMenu(const gfx::Rect& bounds, int item_height, double item_font_size, int selected_item,
const std::vector<WebMenuItem>& items, bool right_aligned, bool allow_multiple_selection) { QT_NOT_YET_IMPLEMENTED }
- NativeViewContainerQt* windowContainer() { return m_windowContainer; }
-
private:
- NativeViewContainerQt* m_windowContainer;
+ WebContentsViewQtClient* m_client;
};
#endif
diff --git a/shared/native_view_container_qt.h b/shared/native_view_container_qt.h
deleted file mode 100644
index 185a5b826..000000000
--- a/shared/native_view_container_qt.h
+++ /dev/null
@@ -1,116 +0,0 @@
-#ifndef NATIVE_VIEW_CONTAINER_QT_H
-#define NATIVE_VIEW_CONTAINER_QT_H
-
-#include "native_view_qt.h"
-
-#include <QWindow>
-#include <QVBoxLayout>
-#include <QQuickItem>
-
-class NativeViewContainerQt : public QObject
-{
- Q_OBJECT
-public:
- NativeViewContainerQt()
- : m_embeddable(0)
- , m_currentQQuickNativeView(0)
- , m_currentQWidgetNativeView(0)
- , m_isQQuick(true)
- {
- }
-
- QQuickItem* qQuickItem()
- {
- if (!m_embeddable) {
- QQuickItem* embeddable = new QQuickItem;
- m_isQQuick = true;
- connect(embeddable, SIGNAL(widthChanged()), this, SLOT(resized()));
- connect(embeddable, SIGNAL(heightChanged()), this, SLOT(resized()));
- m_embeddable = embeddable;
- }
-
- return static_cast<QQuickItem*>(m_embeddable);
- }
-
- QVBoxLayout* widget()
- {
- if (!m_embeddable) {
- m_isQQuick = false;
- QVBoxLayout *l = new QVBoxLayout;
- l->setContentsMargins(0, 0, 0, 0);
- m_embeddable = l;
- }
- return static_cast<QVBoxLayout*>(m_embeddable);
- }
-
- void setWidth(qreal width)
- {
- if (m_isQQuick && m_currentQQuickNativeView) {
- m_currentQQuickNativeView->setWidth(width);
- m_currentQQuickNativeView->setContentsSize(QSize(width, m_currentQQuickNativeView->height()));
- qQuickItem()->setWidth(width);
- }
- }
-
- void setHeight(qreal height)
- {
- if (m_isQQuick && m_currentQQuickNativeView) {
- m_currentQQuickNativeView->setHeight(height);
- m_currentQQuickNativeView->setContentsSize(QSize(m_currentQQuickNativeView->width(), height));
- qQuickItem()->setHeight(height);
- }
- }
-
- NativeViewQt* createNativeView(content::RenderWidgetHostViewQt* renderWidgetHostView)
- {
- if (m_isQQuick) {
- insert(new QQuickNativeView(renderWidgetHostView));
- connect(m_currentQQuickNativeView, SIGNAL(destroyed(QObject*)), this, SLOT(destroyedNativeView(QObject*)));
- return m_currentQQuickNativeView;
- }
-
- insert(new QWidgetNativeView(renderWidgetHostView));
- return m_currentQWidgetNativeView;
- }
-
-protected:
- void insert(QWidgetNativeView* nativeView)
- {
- widget()->removeWidget(m_currentQWidgetNativeView);
- widget()->addWidget(nativeView);
- m_currentQWidgetNativeView = nativeView;
- }
-
- void insert(QQuickNativeView* nativeView)
- {
- if (m_currentQQuickNativeView)
- m_currentQQuickNativeView->setParentItem(0);
-
- nativeView->setParentItem(qQuickItem());
- m_currentQQuickNativeView = nativeView;
- setWidth(qQuickItem()->width());
- setHeight(qQuickItem()->height());
- }
-
-public Q_SLOTS:
- void resized()
- {
- int w = static_cast<unsigned int>(qQuickItem()->width());
- int h = static_cast<unsigned int>(qQuickItem()->height());
- if (m_currentQQuickNativeView)
- m_currentQQuickNativeView->resize(w, h);
- }
-
- void destroyedNativeView(QObject* nativeView)
- {
- m_currentQQuickNativeView = 0;
- }
-
-private:
- QObject* m_embeddable;
- QWidgetNativeView* m_currentQWidgetNativeView;
- QQuickNativeView* m_currentQQuickNativeView;
- bool m_isQQuick;
-};
-
-#endif
diff --git a/shared/native_view_qt.cpp b/shared/native_view_qt.cpp
deleted file mode 100644
index 1a5716549..000000000
--- a/shared/native_view_qt.cpp
+++ /dev/null
@@ -1,208 +0,0 @@
-#include "native_view_qt.h"
-
-#include "backing_store_qt.h"
-#include "render_widget_host_view_qt.h"
-#include <QResizeEvent>
-#include <QShowEvent>
-#include <QPaintEvent>
-#include <QQuickWindow>
-#include <QWindow>
-
-QWidgetNativeView::QWidgetNativeView(content::RenderWidgetHostViewQt* view, QWidget *parent)
- : QWidget(parent)
- , m_painter(0)
- , m_backingStore(0)
- , m_view(view)
-{
- setFocusPolicy(Qt::ClickFocus);
- setAttribute(Qt::WA_OpaquePaintEvent);
-}
-
-QRectF QWidgetNativeView::screenRect() const
-{
- return QRectF(x(), y(), width(), height());
-}
-
-void QWidgetNativeView::show()
-{
- QWidget::show();
-}
-
-void QWidgetNativeView::hide()
-{
- QWidget::hide();
-}
-
-
-bool QWidgetNativeView::isVisible() const
-{
- return QWidget::isVisible();
-}
-
-QWindow* QWidgetNativeView::window() const
-{
- return QWidget::windowHandle();
-}
-
-void QWidgetNativeView::update(const QRect& rect)
-{
- QWidget::update(rect);
-}
-
-void QWidgetNativeView::setBackingStore(BackingStoreQt* backingStore)
-{
- m_backingStore = backingStore;
- if (m_backingStore)
- m_backingStore->resize(size());
-}
-
-void QWidgetNativeView::paintEvent(QPaintEvent * event)
-{
- if (!m_backingStore)
- return;
- QPainter painter(this);
- m_backingStore->paintToTarget(&painter, event->rect());
-}
-
-QPainter* QWidgetNativeView::painter()
-{
- if (!m_painter)
- m_painter = new QPainter(this);
- return m_painter;
-}
-
-void QWidgetNativeView::resizeEvent(QResizeEvent *resizeEvent)
-{
- if (m_backingStore)
- m_backingStore->resize(resizeEvent->size());
- QWidget::update();
-}
-
-bool QWidgetNativeView::event(QEvent *event)
-{
- if (!m_view || !m_view->handleEvent(event))
- return QWidget::event(event);
- return true;
-}
-
-QQuickNativeView::QQuickNativeView(content::RenderWidgetHostViewQt* view, QQuickItem *parent)
- : QQuickPaintedItem(parent)
- , m_backingStore(0)
- , m_view(view)
-{
- setFocus(true);
- setAcceptedMouseButtons(Qt::AllButtons);
-}
-
-QRectF QQuickNativeView::screenRect() const
-{
- QPointF pos = mapToScene(QPointF(0,0));
- return QRectF(pos.x(), pos.y(), width(), height());
-}
-
-void QQuickNativeView::show()
-{
- setVisible(true);
-}
-
-void QQuickNativeView::hide()
-{
- setVisible(true);
-}
-
-bool QQuickNativeView::isVisible() const
-{
- return QQuickPaintedItem::isVisible();
-}
-
-QWindow* QQuickNativeView::window() const
-{
- return QQuickPaintedItem::window();
-}
-
-void QQuickNativeView::update(const QRect& rect)
-{
- QQuickPaintedItem::update(rect);
-}
-
-void QQuickNativeView::paint(QPainter *painter)
-{
- if (!m_backingStore)
- return;
-
- m_backingStore->paintToTarget(painter, boundingRect());
-}
-
-void QQuickNativeView::setBackingStore(BackingStoreQt* backingStore)
-{
- m_backingStore = backingStore;
- if (m_backingStore)
- m_backingStore->resize(QSize(width(), height()));
-}
-
-QSGNode * QQuickNativeView::updatePaintNode(QSGNode * oldNode, UpdatePaintNodeData * data)
-{
- return QQuickPaintedItem::updatePaintNode(oldNode, data);
-}
-
-void QQuickNativeView::resizeBackingStore()
-{
- if (m_backingStore)
- m_backingStore->resize(QSize(width(), height()));
-}
-
-void QQuickNativeView::resize(int width, int height)
-{
- resetWidth();
- resetHeight();
- setWidth(width);
- setHeight(height);
- resizeBackingStore();
- update();
-}
-
-void QQuickNativeView::focusInEvent(QFocusEvent *event)
-{
- m_view->handleFocusEvent(event);
-}
-
-void QQuickNativeView::focusOutEvent(QFocusEvent *event)
-{
- m_view->handleFocusEvent(event);
-}
-
-void QQuickNativeView::mousePressEvent(QMouseEvent *event)
-{
- setFocus(true);
- m_view->handleMouseEvent(event);
-}
-
-void QQuickNativeView::mouseMoveEvent(QMouseEvent *event)
-{
- m_view->handleMouseEvent(event);
-}
-
-void QQuickNativeView::mouseReleaseEvent(QMouseEvent *event)
-{
- m_view->handleMouseEvent(event);
-}
-
-void QQuickNativeView::mouseDoubleClickEvent(QMouseEvent *event)
-{
- m_view->handleMouseEvent(event);
-}
-
-void QQuickNativeView::keyPressEvent(QKeyEvent *event)
-{
- m_view->handleKeyEvent(event);
-}
-
-void QQuickNativeView::keyReleaseEvent(QKeyEvent *event)
-{
- m_view->handleKeyEvent(event);
-}
-
-void QQuickNativeView::wheelEvent(QWheelEvent *event)
-{
- m_view->handleWheelEvent(event);
-}
diff --git a/shared/native_view_qt.h b/shared/native_view_qt.h
deleted file mode 100644
index 6a15701e8..000000000
--- a/shared/native_view_qt.h
+++ /dev/null
@@ -1,97 +0,0 @@
-#ifndef NATIVE_VIEW_QT_H
-#define NATIVE_VIEW_QT_H
-
-
-#include <QWidget>
-#include <QQuickPaintedItem>
-
-class BackingStoreQt;
-class QWindow;
-class QQuickItem;
-class QFocusEvent;
-class QMouseEvent;
-class QKeyEvent;
-class QWheelEvent;
-
-namespace content {
- class RenderWidgetHostViewQt;
-}
-
-class NativeViewQt {
-public:
- virtual ~NativeViewQt() {}
- virtual void setBackingStore(BackingStoreQt* backingStore) = 0;
- virtual QRectF screenRect() const = 0;
- virtual void show() = 0;
- virtual void hide() = 0;
- virtual bool isVisible() const = 0;
- virtual QWindow* window() const = 0;
- virtual void update(const QRect& rect = QRect()) = 0;
-};
-
-class QWidgetNativeView : public QWidget, public NativeViewQt
-{
-public:
- QWidgetNativeView(content::RenderWidgetHostViewQt* view, QWidget *parent = 0);
-
- virtual void setBackingStore(BackingStoreQt* backingStore);
- virtual QRectF screenRect() const;
- virtual void show();
- virtual void hide();
- virtual bool isVisible() const;
- virtual QWindow* window() const;
- virtual void update(const QRect& rect = QRect());
-
- QPainter* painter();
-
-protected:
- void paintEvent(QPaintEvent * event);
- bool event(QEvent *event);
- void resizeEvent(QResizeEvent *resizeEvent);
-
-private:
- BackingStoreQt* m_backingStore;
- QPainter* m_painter;
- content::RenderWidgetHostViewQt *m_view;
-};
-
-class QQuickNativeView : public QQuickPaintedItem, public NativeViewQt
-{
- Q_OBJECT
-public:
- QQuickNativeView(content::RenderWidgetHostViewQt* view, QQuickItem *parent = 0);
-
- virtual void setBackingStore(BackingStoreQt* backingStore);
- virtual QRectF screenRect() const;
- virtual void show();
- virtual void hide();
- virtual bool isVisible() const;
- virtual QWindow* window() const;
- virtual void update(const QRect& rect = QRect());
-
- void paint(QPainter *painter);
- void resize(int width, int height);
-
- void focusInEvent(QFocusEvent*);
- void focusOutEvent(QFocusEvent*);
- void mousePressEvent(QMouseEvent*);
- void mouseMoveEvent(QMouseEvent*);
- void mouseReleaseEvent(QMouseEvent*);
- void mouseDoubleClickEvent(QMouseEvent*);
- void keyPressEvent(QKeyEvent*);
- void keyReleaseEvent(QKeyEvent*);
- void wheelEvent(QWheelEvent*);
-
-protected Q_SLOTS:
- void resizeBackingStore();
-
-protected:
- QSGNode* updatePaintNode(QSGNode * oldNode, UpdatePaintNodeData * data);
-
-private:
- BackingStoreQt* m_backingStore;
- content::RenderWidgetHostViewQt *m_view;
-
-};
-
-#endif
diff --git a/shared/render_widget_host_view_qt.cpp b/shared/render_widget_host_view_qt.cpp
index 46a710591..759667000 100644
--- a/shared/render_widget_host_view_qt.cpp
+++ b/shared/render_widget_host_view_qt.cpp
@@ -42,9 +42,8 @@
#include "render_widget_host_view_qt.h"
#include "backing_store_qt.h"
+#include "render_widget_host_view_qt_delegate.h"
#include "web_event_factory.h"
-#include "native_view_container_qt.h"
-#include "native_view_qt.h"
#include "content/browser/renderer_host/render_view_host_impl.h"
#include "content/common/gpu/gpu_messages.h"
@@ -77,9 +76,9 @@ static void GetScreenInfoFromNativeWindow(QWindow* window, WebKit::WebScreenInfo
namespace content {
-RenderWidgetHostView* RenderWidgetHostView::CreateViewForWidget(
- RenderWidgetHost* widget) {
- return new RenderWidgetHostViewQt(widget);
+RenderWidgetHostView* RenderWidgetHostView::CreateViewForWidget(RenderWidgetHost*) {
+ // WebContentsViewQt should take care of this directly.
+ Q_ASSERT(false);
}
// static
@@ -90,7 +89,7 @@ void RenderWidgetHostViewPort::GetDefaultScreenInfo(WebKit::WebScreenInfo* resul
RenderWidgetHostViewQt::RenderWidgetHostViewQt(content::RenderWidgetHost* widget)
: m_host(content::RenderWidgetHostImpl::From(widget))
- , m_view(0)
+ , m_delegate(0)
, about_to_validate_and_paint_(false)
{
m_host->SetView(this);
@@ -128,28 +127,19 @@ bool RenderWidgetHostViewQt::handleEvent(QEvent* event) {
content::BackingStore *RenderWidgetHostViewQt::AllocBackingStore(const gfx::Size &size)
{
- if (m_view)
- return new BackingStoreQt(m_host, size, new QWindow);
- return 0;
+ return new BackingStoreQt(m_host, size, new QWindow);
}
void RenderWidgetHostViewQt::InitAsChild(gfx::NativeView parent_view)
{
- NativeViewContainerQt* container = reinterpret_cast<NativeViewContainerQt*>(parent_view);
- m_view = container->createNativeView(this);
- bool force_create = !m_host->empty();
- BackingStoreQt* backing_store = static_cast<BackingStoreQt*>(m_host->GetBackingStore(force_create));
- m_view->setBackingStore(backing_store);
}
void RenderWidgetHostViewQt::InitAsPopup(content::RenderWidgetHostView*, const gfx::Rect&)
{
- // m_view = new RasterWindow(this);
}
void RenderWidgetHostViewQt::InitAsFullscreen(content::RenderWidgetHostView*)
{
- // m_view = new RasterWindow(this);
}
content::RenderWidgetHost* RenderWidgetHostViewQt::GetRenderWidgetHost() const
@@ -164,7 +154,7 @@ void RenderWidgetHostViewQt::SetSize(const gfx::Size& size)
// int width = std::min(size.width(), kMaxWindowWidth);
// int height = std::min(size.height(), kMaxWindowHeight);
// if (IsPopup())
- // m_view->resize(width,height);
+ // m_delegate->resize(width,height);
if (m_requestedSize.width() != width ||
m_requestedSize.height() != height) {
@@ -178,7 +168,7 @@ void RenderWidgetHostViewQt::SetBounds(const gfx::Rect& rect)
{
// This is called when webkit has sent us a Move message.
// if (IsPopup())
- // m_view->setGeometry(rect.x(), rect.y(), rect.width(), rect.height());
+ // m_delegate->setGeometry(rect.x(), rect.y(), rect.width(), rect.height());
SetSize(rect.size());
}
@@ -204,12 +194,12 @@ gfx::NativeViewAccessible RenderWidgetHostViewQt::GetNativeViewAccessible()
// Set focus to the associated View component.
void RenderWidgetHostViewQt::Focus()
{
- // m_view->setFocus(Qt::MouseFocusReason);
+ // m_delegate->setFocus(Qt::MouseFocusReason);
}
bool RenderWidgetHostViewQt::HasFocus() const
{
- // return m_view->hasFocus();
+ // return m_delegate->hasFocus();
return true;
}
@@ -220,23 +210,23 @@ bool RenderWidgetHostViewQt::IsSurfaceAvailableForCopy() const
void RenderWidgetHostViewQt::Show()
{
- m_view->show();
+ m_delegate->show();
}
void RenderWidgetHostViewQt::Hide()
{
- m_view->hide();
+ m_delegate->hide();
}
bool RenderWidgetHostViewQt::IsShowing()
{
- return m_view->isVisible();
+ return m_delegate->isVisible();
}
// Retrieve the bounds of the View, in screen coordinates.
gfx::Rect RenderWidgetHostViewQt::GetViewBounds() const
{
- QRectF p = m_view->screenRect();
+ QRectF p = m_delegate->screenRect();
return gfx::Rect(p.x(), p.y(), p.width(), p.height());
}
@@ -281,7 +271,7 @@ gfx::NativeView RenderWidgetHostViewQt::BuildInputMethodsGtkMenu()
void RenderWidgetHostViewQt::WasShown()
{
- if (m_view->isVisible())
+ if (m_delegate->isVisible())
return;
m_host->WasShown();
@@ -289,7 +279,7 @@ void RenderWidgetHostViewQt::WasShown()
void RenderWidgetHostViewQt::WasHidden()
{
- if (!m_view->isVisible())
+ if (!m_delegate->isVisible())
return;
m_host->WasHidden();
@@ -334,7 +324,7 @@ void RenderWidgetHostViewQt::ImeCompositionRangeChanged(const ui::Range&, const
void RenderWidgetHostViewQt::DidUpdateBackingStore(const gfx::Rect& scroll_rect, const gfx::Vector2d& scroll_delta, const std::vector<gfx::Rect>& copy_rects)
{
- if (!m_view || !m_view->isVisible())
+ if (!m_delegate->isVisible())
return;
if (about_to_validate_and_paint_)
@@ -361,8 +351,8 @@ void RenderWidgetHostViewQt::RenderViewGone(base::TerminationStatus, int)
void RenderWidgetHostViewQt::Destroy()
{
- delete m_view;
- m_view = 0;
+ delete m_delegate;
+ m_delegate = 0;
}
void RenderWidgetHostViewQt::SetTooltipText(const string16&)
@@ -436,7 +426,7 @@ bool RenderWidgetHostViewQt::HasAcceleratedSurface(const gfx::Size&)
void RenderWidgetHostViewQt::GetScreenInfo(WebKit::WebScreenInfo* results)
{
- QWindow* window = m_view->window();
+ QWindow* window = m_delegate->window();
if (!window)
return;
GetScreenInfoFromNativeWindow(window, results);
@@ -444,10 +434,10 @@ void RenderWidgetHostViewQt::GetScreenInfo(WebKit::WebScreenInfo* results)
gfx::Rect RenderWidgetHostViewQt::GetBoundsInRootWindow()
{
- if (!m_view || !m_view->window())
+ if (!m_delegate->window())
return gfx::Rect();
- QRect r = m_view->window()->frameGeometry();
+ QRect r = m_delegate->window()->frameGeometry();
return gfx::Rect(r.x(), r.y(), r.width(), r.height());
}
@@ -479,10 +469,10 @@ void RenderWidgetHostViewQt::Paint(const gfx::Rect& damage_rect)
// Calling GetBackingStore maybe have changed |invalid_rect_|...
about_to_validate_and_paint_ = false;
- if (backing_store && m_view) {
- m_view->setBackingStore(backing_store);
+ if (backing_store) {
+ m_delegate->setBackingStore(backing_store);
QRect r(invalid_rect_.x(), invalid_rect_.y(), invalid_rect_.width(), invalid_rect_.height());
- m_view->update(r);
+ m_delegate->update(r);
}
}
diff --git a/shared/render_widget_host_view_qt.h b/shared/render_widget_host_view_qt.h
index fce2144df..79b9921ae 100644
--- a/shared/render_widget_host_view_qt.h
+++ b/shared/render_widget_host_view_qt.h
@@ -56,7 +56,7 @@ class QFocusEvent;
class QKeyEvent;
class QMouseEvent;
class QWheelEvent;
-class NativeViewQt;
+class RenderWidgetHostViewQtDelegate;
namespace content {
@@ -67,6 +67,7 @@ public:
RenderWidgetHostViewQt(content::RenderWidgetHost* widget);
~RenderWidgetHostViewQt();
+ void SetDelegate(RenderWidgetHostViewQtDelegate* delegate) { m_delegate = delegate; }
bool handleEvent(QEvent* event);
virtual content::BackingStore *AllocBackingStore(const gfx::Size &size);
@@ -136,7 +137,7 @@ private:
bool IsPopup() const;
content::RenderWidgetHostImpl *m_host;
- NativeViewQt *m_view;
+ RenderWidgetHostViewQtDelegate *m_delegate;
gfx::Size m_requestedSize;
// This is true when we are currently painting and thus should handle extra
diff --git a/shared/render_widget_host_view_qt_delegate.h b/shared/render_widget_host_view_qt_delegate.h
new file mode 100644
index 000000000..c01d7d942
--- /dev/null
+++ b/shared/render_widget_host_view_qt_delegate.h
@@ -0,0 +1,21 @@
+#ifndef RENDER_WIDGET_HOST_VIEW_QT_DELEGATE_H
+#define RENDER_WIDGET_HOST_VIEW_QT_DELEGATE_H
+
+#include <QRect>
+
+class BackingStoreQt;
+class QWindow;
+
+class RenderWidgetHostViewQtDelegate {
+public:
+ virtual ~RenderWidgetHostViewQtDelegate() {}
+ virtual void setBackingStore(BackingStoreQt* backingStore) = 0;
+ virtual QRectF screenRect() const = 0;
+ virtual void show() = 0;
+ virtual void hide() = 0;
+ virtual bool isVisible() const = 0;
+ virtual QWindow* window() const = 0;
+ virtual void update(const QRect& rect = QRect()) = 0;
+};
+
+#endif
diff --git a/shared/shared.pro b/shared/shared.pro
index 33c5d4051..053dacc4b 100644
--- a/shared/shared.pro
+++ b/shared/shared.pro
@@ -23,13 +23,11 @@ QT += widgets quick
SOURCES = \
backing_store_qt.cpp \
render_widget_host_view_qt.cpp \
- web_event_factory.cpp \
- native_view_qt.cpp
+ web_event_factory.cpp
HEADERS = \
backing_store_qt.h \
- native_view_container_qt.h \
- native_view_qt.h \
render_widget_host_view_qt.h \
+ render_widget_host_view_qt_delegate.h \
web_event_factory.h