| Index: content/renderer/render_widget.cc
|
| diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
|
| index eca7a8df67b494ebb7f26e1ab50cd4765d7bd91f..1a920c11b627dcfb1ce2958f91d614f840a6b4b4 100644
|
| --- a/content/renderer/render_widget.cc
|
| +++ b/content/renderer/render_widget.cc
|
| @@ -220,7 +220,6 @@ RenderWidget::RenderWidget(int32_t widget_routing_id,
|
| compositor_deps_(compositor_deps),
|
| webwidget_internal_(nullptr),
|
| owner_delegate_(nullptr),
|
| - opener_id_(MSG_ROUTING_NONE),
|
| next_paint_flags_(0),
|
| auto_resize_mode_(false),
|
| need_update_rect_for_auto_resize_(false),
|
| @@ -292,23 +291,24 @@ void RenderWidget::InstallCreateHook(
|
| }
|
|
|
| // static
|
| -RenderWidget* RenderWidget::Create(int32_t opener_id,
|
| - CompositorDependencies* compositor_deps,
|
| - blink::WebPopupType popup_type,
|
| - const ScreenInfo& screen_info) {
|
| - DCHECK(opener_id != MSG_ROUTING_NONE);
|
| -
|
| +RenderWidget* RenderWidget::CreateForPopup(
|
| + RenderViewImpl* opener,
|
| + CompositorDependencies* compositor_deps,
|
| + blink::WebPopupType popup_type,
|
| + const ScreenInfo& screen_info) {
|
| // 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)) {
|
| + opener->GetRoutingID(), popup_type, &routing_id)) {
|
| return nullptr;
|
| }
|
|
|
| scoped_refptr<RenderWidget> widget(
|
| new RenderWidget(routing_id, compositor_deps, popup_type, screen_info,
|
| false, false, false));
|
| - widget->Init(opener_id, RenderWidget::CreateWebWidget(widget.get()));
|
| + ShowCallback opener_callback =
|
| + base::Bind(&RenderViewImpl::ShowCreatedPopupWidget, opener->AsWeakPtr());
|
| + widget->Init(opener_callback, RenderWidget::CreateWebWidget(widget.get()));
|
| DCHECK(!widget->HasOneRef()); // RenderWidget::Init() adds a reference.
|
| return widget.get();
|
| }
|
| @@ -341,7 +341,7 @@ RenderWidget* RenderWidget::CreateForFrame(
|
| widget->for_oopif_ = true;
|
| // Init increments the reference count on |widget|, keeping it alive after
|
| // this function returns.
|
| - widget->Init(MSG_ROUTING_NONE,
|
| + widget->Init(RenderWidget::ShowCallback(),
|
| RenderWidget::CreateWebFrameWidget(widget.get(), frame));
|
|
|
| if (g_render_widget_initialized)
|
| @@ -392,15 +392,15 @@ void RenderWidget::SetSwappedOut(bool is_swapped_out) {
|
| RenderProcess::current()->AddRefProcess();
|
| }
|
|
|
| -void RenderWidget::Init(int32_t opener_id, WebWidget* web_widget) {
|
| +void RenderWidget::Init(const ShowCallback& show_callback,
|
| + WebWidget* web_widget) {
|
| DCHECK(!webwidget_internal_);
|
| DCHECK_NE(routing_id_, MSG_ROUTING_NONE);
|
|
|
| input_handler_.reset(new RenderWidgetInputHandler(
|
| GetRenderWidgetInputHandlerDelegate(this), this));
|
|
|
| - if (opener_id != MSG_ROUTING_NONE)
|
| - opener_id_ = opener_id;
|
| + show_callback_ = show_callback;
|
|
|
| webwidget_internal_ = web_widget;
|
| webwidget_mouse_lock_target_.reset(
|
| @@ -1216,19 +1216,22 @@ void RenderWidget::didChangeCursor(const WebCursorInfo& cursor_info) {
|
| // This method provides us with the information about how to display the newly
|
| // created RenderWidget (i.e., as a blocked popup or as a new tab).
|
| //
|
| -void RenderWidget::show(WebNavigationPolicy) {
|
| +void RenderWidget::show(WebNavigationPolicy policy) {
|
| DCHECK(!did_show_) << "received extraneous Show call";
|
| DCHECK(routing_id_ != MSG_ROUTING_NONE);
|
| - DCHECK(opener_id_ != MSG_ROUTING_NONE);
|
| + DCHECK(!show_callback_.is_null());
|
|
|
| if (did_show_)
|
| return;
|
|
|
| did_show_ = true;
|
| +
|
| + // The opener is responsible for actually showing this widget.
|
| + show_callback_.Run(this, policy, initial_rect_);
|
| +
|
| // NOTE: initial_rect_ may still have its default values at this point, but
|
| // that's okay. It'll be ignored if as_popup is false, or the browser
|
| // process will impose a default position otherwise.
|
| - Send(new ViewHostMsg_ShowWidget(opener_id_, routing_id_, initial_rect_));
|
| SetPendingWindowRect(initial_rect_);
|
| }
|
|
|
|
|