summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJocelyn Turcotte <jocelyn.turcotte@digia.com>2013-08-09 18:27:15 +0200
committerZeno Albisser <zeno.albisser@digia.com>2013-08-12 12:09:29 +0200
commit4fdbee3bc4526d4a43b798a095e5168633eb99f5 (patch)
tree11c27e2cba9e383a150838a29c3873a1ed484042 /lib
parent2ee75c4411394981f5bbf50c0edffe42b6343c90 (diff)
Delay the RWHVDelegate parenting until it's been attached to its RWHV.
This avoids the RWHV being accessed before being attached to the delegate when attaching the later to the view's layout. Change-Id: I5fffef60fdd7203cfb4ced807b5475aac676ea09 Reviewed-by: Zeno Albisser <zeno.albisser@digia.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/quick/qquickwebcontentsview.cpp5
-rw-r--r--lib/quick/qquickwebcontentsview_p_p.h1
-rw-r--r--lib/quick/render_widget_host_view_qt_delegate_quick.cpp8
-rw-r--r--lib/quick/render_widget_host_view_qt_delegate_quick.h3
-rw-r--r--lib/render_widget_host_view_qt.cpp1
-rw-r--r--lib/render_widget_host_view_qt_delegate.h2
-rw-r--r--lib/web_contents_view_qt.cpp4
-rw-r--r--lib/widgets/Api/qwebcontentsview.cpp6
-rw-r--r--lib/widgets/Api/qwebcontentsview_p.h1
-rw-r--r--lib/widgets/render_widget_host_view_qt_delegate_widget.cpp9
-rw-r--r--lib/widgets/render_widget_host_view_qt_delegate_widget.h1
-rw-r--r--lib/widgets/widgets.pro2
12 files changed, 32 insertions, 11 deletions
diff --git a/lib/quick/qquickwebcontentsview.cpp b/lib/quick/qquickwebcontentsview.cpp
index 18bccd107..48ba0fb60 100644
--- a/lib/quick/qquickwebcontentsview.cpp
+++ b/lib/quick/qquickwebcontentsview.cpp
@@ -55,10 +55,7 @@ QQuickWebContentsViewPrivate::QQuickWebContentsViewPrivate()
RenderWidgetHostViewQtDelegate *QQuickWebContentsViewPrivate::CreateRenderWidgetHostViewQtDelegate()
{
- Q_Q(QQuickWebContentsView);
- // Parent the RWHVQtDelegate directly, this might have to be changed to handle popups and fullscreen.
- RenderWidgetHostViewQtDelegateQuick *viewDelegate = new RenderWidgetHostViewQtDelegateQuick(q);
- return viewDelegate;
+ return new RenderWidgetHostViewQtDelegateQuick;
}
void QQuickWebContentsViewPrivate::titleChanged(const QString &title)
diff --git a/lib/quick/qquickwebcontentsview_p_p.h b/lib/quick/qquickwebcontentsview_p_p.h
index faf9d1ccf..51f805881 100644
--- a/lib/quick/qquickwebcontentsview_p_p.h
+++ b/lib/quick/qquickwebcontentsview_p_p.h
@@ -66,6 +66,7 @@ public:
virtual void focusContainer() Q_DECL_OVERRIDE;
QScopedPointer<WebContentsAdapter> adapter;
+ friend class RenderWidgetHostViewQtDelegateQuick;
};
#endif // QQUICKWEBCONTENTSVIEW_P_P_H
diff --git a/lib/quick/render_widget_host_view_qt_delegate_quick.cpp b/lib/quick/render_widget_host_view_qt_delegate_quick.cpp
index 451d92044..5610beabb 100644
--- a/lib/quick/render_widget_host_view_qt_delegate_quick.cpp
+++ b/lib/quick/render_widget_host_view_qt_delegate_quick.cpp
@@ -41,6 +41,8 @@
#include "render_widget_host_view_qt_delegate_quick.h"
+#include "qquickwebcontentsview_p.h"
+#include "qquickwebcontentsview_p_p.h"
#include <QQuickWindow>
#include <QWindow>
@@ -51,6 +53,12 @@ RenderWidgetHostViewQtDelegateQuick::RenderWidgetHostViewQtDelegateQuick(QQuickI
setAcceptHoverEvents(true);
}
+void RenderWidgetHostViewQtDelegateQuick::initAsChild(WebContentsAdapterClient* container)
+{
+ QQuickWebContentsViewPrivate *viewPrivate = static_cast<QQuickWebContentsViewPrivate *>(container);
+ setParentItem(viewPrivate->q_func());
+}
+
QRectF RenderWidgetHostViewQtDelegateQuick::screenRect() const
{
QPointF pos = mapToScene(QPointF(0,0));
diff --git a/lib/quick/render_widget_host_view_qt_delegate_quick.h b/lib/quick/render_widget_host_view_qt_delegate_quick.h
index 1bf8aa8da..b08ec3051 100644
--- a/lib/quick/render_widget_host_view_qt_delegate_quick.h
+++ b/lib/quick/render_widget_host_view_qt_delegate_quick.h
@@ -67,8 +67,9 @@ class RenderWidgetHostViewQtDelegateQuick : public QQuickPaintedItem, public Ren
{
Q_OBJECT
public:
- RenderWidgetHostViewQtDelegateQuick(QQuickItem *parent);
+ RenderWidgetHostViewQtDelegateQuick(QQuickItem *parent = 0);
+ virtual void initAsChild(WebContentsAdapterClient* container);
virtual QRectF screenRect() const;
virtual void setKeyboardFocus();
virtual bool hasKeyboardFocus();
diff --git a/lib/render_widget_host_view_qt.cpp b/lib/render_widget_host_view_qt.cpp
index d3a22f5cc..922c0d57a 100644
--- a/lib/render_widget_host_view_qt.cpp
+++ b/lib/render_widget_host_view_qt.cpp
@@ -161,6 +161,7 @@ content::BackingStore *RenderWidgetHostViewQt::AllocBackingStore(const gfx::Size
void RenderWidgetHostViewQt::InitAsChild(gfx::NativeView parent_view)
{
+ m_delegate->initAsChild(reinterpret_cast<WebContentsAdapterClient*>(parent_view));
}
void RenderWidgetHostViewQt::InitAsPopup(content::RenderWidgetHostView*, const gfx::Rect&)
diff --git a/lib/render_widget_host_view_qt_delegate.h b/lib/render_widget_host_view_qt_delegate.h
index a4ccca337..34f03d125 100644
--- a/lib/render_widget_host_view_qt_delegate.h
+++ b/lib/render_widget_host_view_qt_delegate.h
@@ -53,11 +53,13 @@ class QEvent;
class QPainter;
class QWindow;
class RenderWidgetHostViewQt;
+class WebContentsAdapterClient;
class QWEBENGINE_EXPORT RenderWidgetHostViewQtDelegate {
public:
virtual ~RenderWidgetHostViewQtDelegate();
+ virtual void initAsChild(WebContentsAdapterClient*) = 0;
virtual QRectF screenRect() const = 0;
virtual void setKeyboardFocus() = 0;
virtual bool hasKeyboardFocus() = 0;
diff --git a/lib/web_contents_view_qt.cpp b/lib/web_contents_view_qt.cpp
index f447349a8..09863ca9e 100644
--- a/lib/web_contents_view_qt.cpp
+++ b/lib/web_contents_view_qt.cpp
@@ -52,6 +52,10 @@ content::RenderWidgetHostView* WebContentsViewQt::CreateViewForWidget(content::R
RenderWidgetHostViewQt *view = new RenderWidgetHostViewQt(render_widget_host);
RenderWidgetHostViewQtDelegate* viewDelegate = m_client->CreateRenderWidgetHostViewQtDelegate();
view->SetDelegate(viewDelegate);
+ // The delegate has been bound to its view, now initialize it.
+ // gfx::NativeView logically maps to our client here but the reinterpret_cast is still ugly.
+ // The alternative is be to have a duplicated method with the proper signature.
+ view->InitAsChild(reinterpret_cast<gfx::NativeView>(m_client));
return view;
}
diff --git a/lib/widgets/Api/qwebcontentsview.cpp b/lib/widgets/Api/qwebcontentsview.cpp
index 2ef4c04d4..dff1ebf43 100644
--- a/lib/widgets/Api/qwebcontentsview.cpp
+++ b/lib/widgets/Api/qwebcontentsview.cpp
@@ -96,11 +96,7 @@ void QWebContentsViewPrivate::focusContainer()
RenderWidgetHostViewQtDelegate *QWebContentsViewPrivate::CreateRenderWidgetHostViewQtDelegate()
{
- Q_Q(QWebContentsView);
- RenderWidgetHostViewQtDelegateWidget *viewDelegate = new RenderWidgetHostViewQtDelegateWidget(q);
- // Parent the RWHVQtDelegate directly, this might have to be changed to handle popups and fullscreen.
- q->layout()->addWidget(viewDelegate);
- return viewDelegate;
+ return new RenderWidgetHostViewQtDelegateWidget;
}
QWebContentsView::QWebContentsView()
diff --git a/lib/widgets/Api/qwebcontentsview_p.h b/lib/widgets/Api/qwebcontentsview_p.h
index d97a098d9..6fb60c33e 100644
--- a/lib/widgets/Api/qwebcontentsview_p.h
+++ b/lib/widgets/Api/qwebcontentsview_p.h
@@ -68,6 +68,7 @@ public:
bool m_isLoading;
QScopedPointer<WebContentsAdapter> adapter;
+ friend class RenderWidgetHostViewQtDelegateWidget;
};
#endif
diff --git a/lib/widgets/render_widget_host_view_qt_delegate_widget.cpp b/lib/widgets/render_widget_host_view_qt_delegate_widget.cpp
index 1e696537e..05b8a16e8 100644
--- a/lib/widgets/render_widget_host_view_qt_delegate_widget.cpp
+++ b/lib/widgets/render_widget_host_view_qt_delegate_widget.cpp
@@ -41,7 +41,10 @@
#include "render_widget_host_view_qt_delegate_widget.h"
+#include "qwebcontentsview.h"
+#include "qwebcontentsview_p.h"
#include <QtGlobal>
+#include <QLayout>
#include <QResizeEvent>
#include <QPainter>
#include <QPaintEvent>
@@ -70,6 +73,12 @@ RenderWidgetHostViewQtDelegateWidget::RenderWidgetHostViewQtDelegateWidget(QWidg
#endif
}
+void RenderWidgetHostViewQtDelegateWidget::initAsChild(WebContentsAdapterClient* container)
+{
+ QWebContentsViewPrivate *viewPrivate = static_cast<QWebContentsViewPrivate *>(container);
+ viewPrivate->q_func()->layout()->addWidget(this);
+}
+
QRectF RenderWidgetHostViewQtDelegateWidget::screenRect() const
{
return QRectF(x(), y(), width(), height());
diff --git a/lib/widgets/render_widget_host_view_qt_delegate_widget.h b/lib/widgets/render_widget_host_view_qt_delegate_widget.h
index 240f29ba5..1eec64149 100644
--- a/lib/widgets/render_widget_host_view_qt_delegate_widget.h
+++ b/lib/widgets/render_widget_host_view_qt_delegate_widget.h
@@ -54,6 +54,7 @@ class RenderWidgetHostViewQtDelegateWidget : public QWidget, public RenderWidget
public:
RenderWidgetHostViewQtDelegateWidget(QWidget *parent = 0);
+ virtual void initAsChild(WebContentsAdapterClient* container);
virtual QRectF screenRect() const;
virtual void setKeyboardFocus();
virtual bool hasKeyboardFocus();
diff --git a/lib/widgets/widgets.pro b/lib/widgets/widgets.pro
index 351264d57..3fd9b1f80 100644
--- a/lib/widgets/widgets.pro
+++ b/lib/widgets/widgets.pro
@@ -19,7 +19,7 @@ QMAKE_RPATHDIR += $$LIBPATH
DESTDIR = $$LIBPATH
-INCLUDEPATH += ../
+INCLUDEPATH += Api ../
SOURCES = \
Api/qwebcontentsview.cpp\