Index: content/browser/web_contents/web_contents_view_gtk.cc |
diff --git a/content/browser/web_contents/web_contents_view_gtk.cc b/content/browser/web_contents/web_contents_view_gtk.cc |
index 7c6683530f4a60386332ae7a92a8d66f343a9ac6..2e73ddc8b819ebe4419ed33927279490e88f68be 100644 |
--- a/content/browser/web_contents/web_contents_view_gtk.cc |
+++ b/content/browser/web_contents/web_contents_view_gtk.cc |
@@ -223,11 +223,18 @@ RenderWidgetHostView* WebContentsViewGtk::CreateViewForWidget( |
GDK_POINTER_MOTION_MASK); |
InsertIntoContentArea(content_view); |
- // Renderer target DnD. |
- drag_dest_.reset(new WebDragDestGtk(web_contents_, content_view)); |
- |
- if (delegate_.get()) |
- drag_dest_->set_delegate(delegate_->GetDragDestDelegate()); |
+ // We don't want to change any state in this class for swapped out RVHs |
+ // because they will not be visible at this time. |
Charlie Reis
2013/02/27 20:01:44
Great. Please add:
It is important to update this
|
+ if (render_widget_host->IsRenderView()) { |
+ RenderViewHost* rvh = RenderViewHost::From(render_widget_host); |
+ if (!static_cast<RenderViewHostImpl*>(rvh)->is_swapped_out()) { |
+ // Renderer target DnD. |
+ drag_dest_.reset(new WebDragDestGtk(web_contents_, content_view)); |
+ |
+ if (delegate_.get()) |
+ drag_dest_->set_delegate(delegate_->GetDragDestDelegate()); |
+ } |
+ } |
return view; |
} |
@@ -262,7 +269,20 @@ void WebContentsViewGtk::SizeContents(const gfx::Size& size) { |
void WebContentsViewGtk::RenderViewCreated(RenderViewHost* host) { |
} |
-void WebContentsViewGtk::RenderViewSwappedIn(RenderViewHost* host) { |
+void WebContentsViewGtk::RenderViewSwappedIn(RenderViewHost* new_host, |
+ RenderViewHost* old_host) { |
+ // If we don't have a drag_dest yet, then we should set the drag dest to the |
+ // new RVH. |
+ // Also, not sure if this ever happens, but if the renderViewHost we're |
+ // swapping out is used by the drag_dest, then we need to reset the drag_dest |
+ // to the new host. |
+ if (!drag_dest_.get() || (old_host && |
+ (old_host->GetView()->GetNativeView() == drag_dest_->widget()))) { |
+ drag_dest_.reset(new WebDragDestGtk(web_contents_, |
+ new_host->GetView()->GetNativeView())); |
+ if (delegate_.get()) |
+ drag_dest_->set_delegate(delegate_->GetDragDestDelegate()); |
+ } |
} |
WebContents* WebContentsViewGtk::web_contents() { |