Index: content/renderer/render_widget.cc |
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc |
index 8ad1bf00b87049842180065cfd40d56ee0e23836..4cd7315e2ade000bba6091586185d14bd33d3b50 100644 |
--- a/content/renderer/render_widget.cc |
+++ b/content/renderer/render_widget.cc |
@@ -287,34 +287,26 @@ |
blink::WebPopupType popup_type, |
const ScreenInfo& screen_info) { |
DCHECK(opener_id != MSG_ROUTING_NONE); |
- |
- // Do a synchronous IPC to obtain a routing ID. |
- int32_t routing_id = MSG_ROUTING_NONE; |
- if (!RenderThreadImpl::current_render_message_filter()->CreateNewWidget( |
- opener_id, popup_type, &routing_id)) { |
- return nullptr; |
- } |
- |
scoped_refptr<RenderWidget> widget(new RenderWidget( |
compositor_deps, popup_type, screen_info, false, false, false)); |
- widget->InitRoutingID(routing_id); |
- widget->Init(opener_id, RenderWidget::CreateWebWidget(widget.get())); |
- DCHECK(!widget->HasOneRef()); // RenderWidget::Init() adds a reference. |
- return widget.get(); |
+ if (widget->Init(opener_id)) { // adds reference on success. |
+ return widget.get(); |
+ } |
+ return NULL; |
} |
// static |
RenderWidget* RenderWidget::CreateForFrame( |
- int widget_routing_id, |
+ int routing_id, |
bool hidden, |
const ScreenInfo& screen_info, |
CompositorDependencies* compositor_deps, |
blink::WebLocalFrame* frame) { |
- CHECK_NE(widget_routing_id, MSG_ROUTING_NONE); |
+ CHECK_NE(routing_id, MSG_ROUTING_NONE); |
// TODO(avi): Before RenderViewImpl has-a RenderWidget, the browser passes the |
// same routing ID for both the view routing ID and the main frame widget |
// routing ID. https://crbug.com/545684 |
- RenderViewImpl* view = RenderViewImpl::FromRoutingID(widget_routing_id); |
+ RenderViewImpl* view = RenderViewImpl::FromRoutingID(routing_id); |
if (view) { |
view->AttachWebFrameWidget( |
RenderWidget::CreateWebFrameWidget(view->GetWidget(), frame)); |
@@ -326,16 +318,18 @@ |
screen_info, false, hidden, false) |
: new RenderWidget(compositor_deps, blink::WebPopupTypeNone, |
screen_info, false, hidden, false)); |
+ widget->SetRoutingID(routing_id); |
widget->for_oopif_ = true; |
- // Init increments the reference count on |widget|, keeping it alive after |
+ // DoInit increments the reference count on |widget|, keeping it alive after |
// this function returns. |
- widget->InitRoutingID(widget_routing_id); |
- widget->Init(MSG_ROUTING_NONE, |
- RenderWidget::CreateWebFrameWidget(widget.get(), frame)); |
- |
- if (g_render_widget_initialized) |
- g_render_widget_initialized(widget.get()); |
- return widget.get(); |
+ if (widget->DoInit(MSG_ROUTING_NONE, |
+ RenderWidget::CreateWebFrameWidget(widget.get(), frame), |
+ CreateWidgetCallback())) { |
+ if (g_render_widget_initialized) |
+ g_render_widget_initialized(widget.get()); |
+ return widget.get(); |
+ } |
+ return nullptr; |
} |
// static |
@@ -367,6 +361,12 @@ |
OnClose(); |
} |
+void RenderWidget::SetRoutingID(int32_t routing_id) { |
+ routing_id_ = routing_id; |
+ input_handler_.reset(new RenderWidgetInputHandler( |
+ GetRenderWidgetInputHandlerDelegate(this), this)); |
+} |
+ |
void RenderWidget::SetSwappedOut(bool is_swapped_out) { |
// We should only toggle between states. |
DCHECK(is_swapped_out_ != is_swapped_out); |
@@ -381,16 +381,29 @@ |
RenderProcess::current()->AddRefProcess(); |
} |
-void RenderWidget::InitRoutingID(int32_t routing_id) { |
- DCHECK_EQ(routing_id_, MSG_ROUTING_NONE); |
- routing_id_ = routing_id; |
- input_handler_.reset(new RenderWidgetInputHandler( |
- GetRenderWidgetInputHandlerDelegate(this), this)); |
-} |
- |
-void RenderWidget::Init(int32_t opener_id, WebWidget* web_widget) { |
+bool RenderWidget::CreateWidget(int32_t opener_id, |
+ blink::WebPopupType popup_type, |
+ int32_t* routing_id) { |
+ RenderThreadImpl::current_render_message_filter()->CreateNewWidget( |
+ opener_id, popup_type, routing_id); |
+ return true; |
+} |
+ |
+bool RenderWidget::Init(int32_t opener_id) { |
+ bool success = DoInit(opener_id, RenderWidget::CreateWebWidget(this), |
+ base::Bind(&RenderWidget::CreateWidget, base::Unretained(this), |
+ opener_id, popup_type_, &routing_id_)); |
+ if (success) { |
+ SetRoutingID(routing_id_); |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+bool RenderWidget::DoInit(int32_t opener_id, |
+ WebWidget* web_widget, |
+ CreateWidgetCallback create_widget_callback) { |
DCHECK(!webwidget_internal_); |
- DCHECK_NE(routing_id_, MSG_ROUTING_NONE); |
if (opener_id != MSG_ROUTING_NONE) |
opener_id_ = opener_id; |
@@ -400,14 +413,25 @@ |
new WebWidgetLockTarget(webwidget_internal_)); |
mouse_lock_dispatcher_.reset(new RenderWidgetMouseLockDispatcher(this)); |
- RenderThread::Get()->AddRoute(routing_id_, this); |
- // Take a reference on behalf of the RenderThread. This will be balanced |
- // when we receive ViewMsg_Close. |
- AddRef(); |
- if (RenderThreadImpl::current()) { |
- RenderThreadImpl::current()->WidgetCreated(); |
- if (is_hidden_) |
- RenderThreadImpl::current()->WidgetHidden(); |
+ bool result = true; |
+ if (!create_widget_callback.is_null()) |
+ result = std::move(create_widget_callback).Run(); |
+ |
+ if (result) { |
+ RenderThread::Get()->AddRoute(routing_id_, this); |
+ // Take a reference on behalf of the RenderThread. This will be balanced |
+ // when we receive ViewMsg_Close. |
+ AddRef(); |
+ if (RenderThreadImpl::current()) { |
+ RenderThreadImpl::current()->WidgetCreated(); |
+ if (is_hidden_) |
+ RenderThreadImpl::current()->WidgetHidden(); |
+ } |
+ |
+ return true; |
+ } else { |
+ // The above Send can fail when the tab is closing. |
+ return false; |
} |
} |