summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2019-02-15 11:30:19 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2019-02-18 10:29:40 +0000
commit65909d55417c78e88308644dea30a65fae2d9c4a (patch)
treefba86d055bc31f5f00f704aec3f953edbeabd08b
parente9f3b5a7d1609a169a6b6339b7b8a3c0be191efb (diff)
Remove hack with passing WebContentsAdapterClient as NativeView
Instead delay creating our render view just a little bit further in WebContentImpl::OpenWindow until it calls delegate->WebContentsCreated() Change-Id: Idd911d208bbfe419a2567220933eccb2ba726347 Reviewed-by: Jüri Valdmann <juri.valdmann@qt.io>
-rw-r--r--src/core/web_contents_adapter.cpp11
-rw-r--r--src/core/web_contents_delegate_qt.cpp6
-rw-r--r--src/core/web_contents_view_qt.cpp29
-rw-r--r--src/core/web_contents_view_qt.h7
4 files changed, 35 insertions, 18 deletions
diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp
index fe31a5b51..607412e16 100644
--- a/src/core/web_contents_adapter.cpp
+++ b/src/core/web_contents_adapter.cpp
@@ -240,9 +240,13 @@ static std::unique_ptr<content::WebContents> createBlankWebContents(WebContentsA
content::WebContents::CreateParams create_params(browserContext, NULL);
create_params.routing_id = MSG_ROUTING_NONE;
create_params.initial_size = gfx::Size(kTestWindowWidth, kTestWindowHeight);
- create_params.context = reinterpret_cast<gfx::NativeView>(adapterClient);
create_params.initially_hidden = true;
- return content::WebContents::Create(create_params);
+
+ std::unique_ptr<content::WebContents> webContents = content::WebContents::Create(create_params);
+ WebContentsViewQt* contentsView = static_cast<WebContentsViewQt*>(static_cast<content::WebContentsImpl*>(webContents.get())->GetView());
+ contentsView->setClient(adapterClient);
+
+ return webContents;
}
static void serializeNavigationHistory(const content::NavigationController &controller, QDataStream &output)
@@ -468,7 +472,6 @@ void WebContentsAdapter::initialize(content::SiteInstance *site)
if (!m_webContents) {
content::WebContents::CreateParams create_params(m_profileAdapter->profile(), site);
create_params.initial_size = gfx::Size(kTestWindowWidth, kTestWindowHeight);
- create_params.context = reinterpret_cast<gfx::NativeView>(m_adapterClient);
create_params.initially_hidden = true;
m_webContents = content::WebContents::Create(create_params);
}
@@ -506,7 +509,7 @@ void WebContentsAdapter::initialize(content::SiteInstance *site)
// Let the WebContent's view know about the WebContentsAdapterClient.
WebContentsViewQt* contentsView = static_cast<WebContentsViewQt*>(static_cast<content::WebContentsImpl*>(m_webContents.get())->GetView());
- contentsView->initialize(m_adapterClient);
+ contentsView->setClient(m_adapterClient);
// This should only be necessary after having restored the history to a new WebContentsAdapter.
m_webContents->GetController().LoadIfNecessary();
diff --git a/src/core/web_contents_delegate_qt.cpp b/src/core/web_contents_delegate_qt.cpp
index 4fcf2944d..ade29c770 100644
--- a/src/core/web_contents_delegate_qt.cpp
+++ b/src/core/web_contents_delegate_qt.cpp
@@ -58,12 +58,14 @@
#include "visited_links_manager_qt.h"
#include "web_contents_adapter_client.h"
#include "web_contents_adapter.h"
+#include "web_contents_view_qt.h"
#include "web_engine_context.h"
#include "web_engine_settings.h"
#include "chrome/browser/custom_handlers/protocol_handler_registry_factory.h"
#include "components/web_cache/browser/web_cache_manager.h"
#include "content/browser/renderer_host/render_widget_host_impl.h"
+#include "content/browser/web_contents/web_contents_impl.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/file_select_listener.h"
#include "content/public/browser/invalidate_type.h"
@@ -414,9 +416,11 @@ void WebContentsDelegateQt::DidUpdateFaviconURL(const std::vector<content::Favic
void WebContentsDelegateQt::WebContentsCreated(content::WebContents */*source_contents*/,
int /*opener_render_process_id*/, int /*opener_render_frame_id*/,
const std::string &/*frame_name*/,
- const GURL &target_url, content::WebContents */*new_contents*/)
+ const GURL &target_url, content::WebContents *newContents)
{
m_initialTargetUrl = toQt(target_url);
+ if (auto *view = static_cast<content::WebContentsImpl *>(newContents)->GetView())
+ static_cast<WebContentsViewQt *>(view)->setFactoryClient(m_viewClient);
}
content::ColorChooser *WebContentsDelegateQt::OpenColorChooser(content::WebContents *source, SkColor color, const std::vector<blink::mojom::ColorSuggestionPtr> &suggestion)
diff --git a/src/core/web_contents_view_qt.cpp b/src/core/web_contents_view_qt.cpp
index 550a98a52..7177a8713 100644
--- a/src/core/web_contents_view_qt.cpp
+++ b/src/core/web_contents_view_qt.cpp
@@ -62,7 +62,19 @@
namespace QtWebEngineCore {
-void WebContentsViewQt::initialize(WebContentsAdapterClient* client)
+void WebContentsViewQt::setFactoryClient(WebContentsAdapterClient* client)
+{
+ if (m_factoryClient)
+ return;
+ m_factoryClient = client;
+
+ // Check if a RWHV was created before the pre-initialization.
+ if (auto view = static_cast<RenderWidgetHostViewQt *>(m_webContents->GetRenderWidgetHostView())) {
+ view->setDelegate(m_factoryClient->CreateRenderWidgetHostViewQtDelegate(view));
+ }
+}
+
+void WebContentsViewQt::setClient(WebContentsAdapterClient* client)
{
m_client = client;
m_factoryClient = client;
@@ -78,10 +90,11 @@ content::RenderWidgetHostViewBase* WebContentsViewQt::CreateViewForWidget(conten
{
RenderWidgetHostViewQt *view = new RenderWidgetHostViewQt(render_widget_host);
- Q_ASSERT(m_factoryClient);
- view->setDelegate(m_factoryClient->CreateRenderWidgetHostViewQtDelegate(view));
- if (m_client)
- view->setAdapterClient(m_client);
+ if (m_factoryClient) {
+ view->setDelegate(m_factoryClient->CreateRenderWidgetHostViewQtDelegate(view));
+ if (m_client)
+ view->setAdapterClient(m_client);
+ }
return view;
}
@@ -99,15 +112,11 @@ content::RenderWidgetHostViewBase* WebContentsViewQt::CreateViewForChildWidget(c
void WebContentsViewQt::CreateView(const gfx::Size& initial_size, gfx::NativeView context)
{
- // This is passed through content::WebContents::CreateParams::context either as the native view's client
- // directly or, in the case of a page-created new window, the client of the creating window's native view.
- m_factoryClient = reinterpret_cast<WebContentsAdapterClient *>(context);
}
gfx::NativeView WebContentsViewQt::GetNativeView() const
{
- // Hack to provide the client to WebContentsImpl::CreateNewWindow.
- return reinterpret_cast<gfx::NativeView>(m_client);
+ return nullptr;
}
void WebContentsViewQt::GetContainerBounds(gfx::Rect* out) const
diff --git a/src/core/web_contents_view_qt.h b/src/core/web_contents_view_qt.h
index c7bac1d97..7cd3910f2 100644
--- a/src/core/web_contents_view_qt.h
+++ b/src/core/web_contents_view_qt.h
@@ -65,7 +65,8 @@ public:
, m_factoryClient(nullptr)
{ }
- void initialize(WebContentsAdapterClient* client);
+ void setFactoryClient(WebContentsAdapterClient* client);
+ void setClient(WebContentsAdapterClient* client);
WebContentsAdapterClient *client() { return m_client; }
content::RenderWidgetHostViewBase *CreateViewForWidget(content::RenderWidgetHost* render_widget_host, bool is_guest_view_hack) override;
@@ -86,9 +87,9 @@ public:
gfx::NativeView GetNativeView() const override;
- gfx::NativeView GetContentNativeView() const override { return 0; }
+ gfx::NativeView GetContentNativeView() const override { return nullptr; }
- gfx::NativeWindow GetTopLevelNativeWindow() const override { return 0; }
+ gfx::NativeWindow GetTopLevelNativeWindow() const override { return nullptr; }
void GetContainerBounds(gfx::Rect* out) const override;