diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-07 20:32:42 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-07 20:32:42 +0000 |
commit | 20a02f9bc672fcb33fba1f8f2eb7f0d1111b5b28 (patch) | |
tree | db728dc8f39291a9c5748a4ba4ec03c20aa20a3d | |
parent | 586d51edafeeed9705656ac871fcd3d7653e4456 (diff) | |
download | chromium_src-20a02f9bc672fcb33fba1f8f2eb7f0d1111b5b28.zip chromium_src-20a02f9bc672fcb33fba1f8f2eb7f0d1111b5b28.tar.gz chromium_src-20a02f9bc672fcb33fba1f8f2eb7f0d1111b5b28.tar.bz2 |
Stop caching pointers to RenderWidgetHostView in WebContentsView implementations (namely Aura and Windows). This is a cause of problems because it sometimes goes out of date (i.e. with pending navigations that fail, and previously with interstitials).
BUG=162981
Review URL: https://codereview.chromium.org/11446057
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@171831 0039d316-1c4b-4281-b951-d872f2087c98
18 files changed, 34 insertions, 75 deletions
diff --git a/content/browser/web_contents/interstitial_page_impl.cc b/content/browser/web_contents/interstitial_page_impl.cc index 50883ae..df508e6 100644 --- a/content/browser/web_contents/interstitial_page_impl.cc +++ b/content/browser/web_contents/interstitial_page_impl.cc @@ -250,9 +250,6 @@ void InterstitialPageImpl::Hide() { // already showing. That would result in bad things (unparented HWND on // Windows for example) happening. old_view->Show(); - // WebContentsView implementations cached a pointer to the interstitial view - // when we created it, so set the old original back. - web_contents_->GetView()->SetView(old_view); } // If the focus was on the interstitial, let's keep it to the page. @@ -627,6 +624,10 @@ void InterstitialPageImpl::FocusThroughTabTraversal(bool reverse) { render_view_host_->SetInitialFocus(reverse); } +RenderWidgetHostView* InterstitialPageImpl::GetView() { + return render_view_host_->GetView(); +} + RenderViewHost* InterstitialPageImpl::GetRenderViewHostForTesting() const { return render_view_host_; } diff --git a/content/browser/web_contents/interstitial_page_impl.h b/content/browser/web_contents/interstitial_page_impl.h index 69f6120..4a48372 100644 --- a/content/browser/web_contents/interstitial_page_impl.h +++ b/content/browser/web_contents/interstitial_page_impl.h @@ -20,6 +20,7 @@ namespace content { class NavigationEntry; class RenderViewHostImpl; +class RenderWidgetHostView; class WebContentsView; class WebContentsImpl; @@ -68,6 +69,8 @@ class CONTENT_EXPORT InterstitialPageImpl // Called when tab traversing. void FocusThroughTabTraversal(bool reverse); + RenderWidgetHostView* GetView(); + // See description above field. void set_reload_on_dont_proceed(bool value) { reload_on_dont_proceed_ = value; diff --git a/content/browser/web_contents/render_view_host_manager.cc b/content/browser/web_contents/render_view_host_manager.cc index 63c05a6..25a4559 100644 --- a/content/browser/web_contents/render_view_host_manager.cc +++ b/content/browser/web_contents/render_view_host_manager.cc @@ -13,6 +13,7 @@ #include "content/browser/renderer_host/render_view_host_factory.h" #include "content/browser/renderer_host/render_view_host_impl.h" #include "content/browser/site_instance_impl.h" +#include "content/browser/web_contents/interstitial_page_impl.h" #include "content/browser/web_contents/navigation_controller_impl.h" #include "content/browser/web_contents/navigation_entry_impl.h" #include "content/browser/webui/web_ui_impl.h" @@ -89,6 +90,8 @@ RenderViewHostImpl* RenderViewHostManager::pending_render_view_host() const { } RenderWidgetHostView* RenderViewHostManager::GetRenderWidgetHostView() const { + if (interstitial_page_) + return interstitial_page_->GetView(); if (!render_view_host_) return NULL; return render_view_host_->GetView(); diff --git a/content/browser/web_contents/web_contents_view_android.cc b/content/browser/web_contents/web_contents_view_android.cc index acb597d..a042541 100644 --- a/content/browser/web_contents/web_contents_view_android.cc +++ b/content/browser/web_contents/web_contents_view_android.cc @@ -79,9 +79,6 @@ RenderWidgetHostView* WebContentsViewAndroid::CreateViewForWidget( return view; } -void WebContentsViewAndroid::SetView(RenderWidgetHostView* view) { -} - gfx::NativeView WebContentsViewAndroid::GetNativeView() const { return content_view_core_; } diff --git a/content/browser/web_contents/web_contents_view_android.h b/content/browser/web_contents/web_contents_view_android.h index 8975ea1..6236fe8 100644 --- a/content/browser/web_contents/web_contents_view_android.h +++ b/content/browser/web_contents/web_contents_view_android.h @@ -33,7 +33,6 @@ class WebContentsViewAndroid : public WebContentsView, virtual void CreateView(const gfx::Size& initial_size) OVERRIDE; virtual RenderWidgetHostView* CreateViewForWidget( RenderWidgetHost* render_widget_host) OVERRIDE; - virtual void SetView(RenderWidgetHostView* view) OVERRIDE; virtual gfx::NativeView GetNativeView() const OVERRIDE; virtual gfx::NativeView GetContentNativeView() const OVERRIDE; virtual gfx::NativeWindow GetTopLevelNativeWindow() const OVERRIDE; diff --git a/content/browser/web_contents/web_contents_view_aura.cc b/content/browser/web_contents/web_contents_view_aura.cc index 44ba318..bf881e3 100644 --- a/content/browser/web_contents/web_contents_view_aura.cc +++ b/content/browser/web_contents/web_contents_view_aura.cc @@ -328,7 +328,6 @@ WebContentsViewAura::WebContentsViewAura( WebContentsImpl* web_contents, WebContentsViewDelegate* delegate) : web_contents_(web_contents), - view_(NULL), delegate_(delegate), current_drag_op_(WebKit::WebDragOperationNone), drag_dest_delegate_(NULL), @@ -421,7 +420,7 @@ void WebContentsViewAura::PrepareContentWindowForOverscroll() { } void WebContentsViewAura::ResetOverscrollTransform() { - if (!view_) + if (!web_contents_->GetRenderWidgetHostView()) return; aura::Window* target = GetWindowToAnimateForOverscroll(); ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator()); @@ -432,14 +431,14 @@ void WebContentsViewAura::ResetOverscrollTransform() { } void WebContentsViewAura::CompleteOverscrollNavigation(OverscrollMode mode) { + if (!web_contents_->GetRenderWidgetHostView()) + return; + // Animate out the current view first. Navigate to the requested history at // the end of the animation. if (current_overscroll_gesture_ == OVERSCROLL_NONE) return; - if (!view_) - return; - completed_overscroll_gesture_ = mode; aura::Window* target = GetWindowToAnimateForOverscroll(); ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator()); @@ -447,7 +446,8 @@ void WebContentsViewAura::CompleteOverscrollNavigation(OverscrollMode mode) { settings.SetTweenType(ui::Tween::EASE_OUT); settings.AddObserver(this); gfx::Transform transform; - int content_width = view_->GetViewBounds().width(); + int content_width = + web_contents_->GetRenderWidgetHostView()->GetViewBounds().width(); transform.Translate(mode == OVERSCROLL_WEST ? -content_width : content_width, 0); target->SetTransform(transform); @@ -533,13 +533,14 @@ RenderWidgetHostView* WebContentsViewAura::CreateViewForWidget( return render_widget_host->GetView(); } - view_ = RenderWidgetHostView::CreateViewForWidget(render_widget_host); - view_->InitAsChild(NULL); - GetNativeView()->AddChild(view_->GetNativeView()); - view_->Show(); + RenderWidgetHostView* view = + RenderWidgetHostView::CreateViewForWidget(render_widget_host); + view->InitAsChild(NULL); + GetNativeView()->AddChild(view->GetNativeView()); + view->Show(); // We listen to drag drop events in the newly created view's window. - aura::client::SetDragDropDelegate(view_->GetNativeView(), this); + aura::client::SetDragDropDelegate(view->GetNativeView(), this); RenderWidgetHostImpl* host_impl = RenderWidgetHostImpl::From(render_widget_host); @@ -547,11 +548,7 @@ RenderWidgetHostView* WebContentsViewAura::CreateViewForWidget( web_contents_->GetDelegate()->CanOverscrollContent()) host_impl->overscroll_controller()->set_delegate(this); - return view_; -} - -void WebContentsViewAura::SetView(RenderWidgetHostView* view) { - view_ = view; + return view; } gfx::NativeView WebContentsViewAura::GetNativeView() const { @@ -559,7 +556,8 @@ gfx::NativeView WebContentsViewAura::GetNativeView() const { } gfx::NativeView WebContentsViewAura::GetContentNativeView() const { - return view_->GetNativeView(); + RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView(); + return rwhv ? rwhv->GetNativeView() : NULL; } gfx::NativeWindow WebContentsViewAura::GetTopLevelNativeWindow() const { @@ -576,7 +574,6 @@ void WebContentsViewAura::SetPageTitle(const string16& title) { void WebContentsViewAura::OnTabCrashed(base::TerminationStatus status, int error_code) { - view_ = NULL; // Set the focus to the parent because neither the view window nor this // window can handle key events. if (window_->HasFocus() && window_->parent()) @@ -690,7 +687,7 @@ void WebContentsViewAura::StartDragging( // updates while in the system DoDragDrop loop. int result_op = 0; { - gfx::NativeView content_native_view = view_? GetContentNativeView() : NULL; + gfx::NativeView content_native_view = GetContentNativeView(); MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current()); result_op = aura::client::GetDragDropClient(root_window)->StartDragAndDrop( data, root_window, content_native_view, @@ -846,9 +843,9 @@ bool WebContentsViewAura::ShouldDescendIntoChildForEventHandling( } bool WebContentsViewAura::CanFocus() { - // Do not take the focus if |view_| is gone because neither the view window - // nor this window can handle key events. - return view_ != NULL; + // Do not take the focus if the render widget host view is gone because + // neither the view window nor this window can handle key events. + return web_contents_->GetRenderWidgetHostView() != NULL; } void WebContentsViewAura::OnCaptureLost() { diff --git a/content/browser/web_contents/web_contents_view_aura.h b/content/browser/web_contents/web_contents_view_aura.h index 5d9dc63..ef53fea 100644 --- a/content/browser/web_contents/web_contents_view_aura.h +++ b/content/browser/web_contents/web_contents_view_aura.h @@ -81,7 +81,6 @@ class CONTENT_EXPORT WebContentsViewAura virtual void CreateView(const gfx::Size& initial_size) OVERRIDE; virtual RenderWidgetHostView* CreateViewForWidget( RenderWidgetHost* render_widget_host) OVERRIDE; - virtual void SetView(RenderWidgetHostView* view) OVERRIDE; virtual gfx::NativeView GetNativeView() const OVERRIDE; virtual gfx::NativeView GetContentNativeView() const OVERRIDE; virtual gfx::NativeWindow GetTopLevelNativeWindow() const OVERRIDE; @@ -170,8 +169,6 @@ class CONTENT_EXPORT WebContentsViewAura // The WebContentsImpl whose contents we display. WebContentsImpl* web_contents_; - RenderWidgetHostView* view_; - scoped_ptr<WebContentsViewDelegate> delegate_; WebKit::WebDragOperationsMask current_drag_op_; diff --git a/content/browser/web_contents/web_contents_view_gtk.cc b/content/browser/web_contents/web_contents_view_gtk.cc index f20f080..59aa26a 100644 --- a/content/browser/web_contents/web_contents_view_gtk.cc +++ b/content/browser/web_contents/web_contents_view_gtk.cc @@ -148,13 +148,6 @@ RenderWidgetHostView* WebContentsViewGtk::CreateViewForWidget( return view; } -void WebContentsViewGtk::SetView(RenderWidgetHostView* view) { - gfx::NativeView content_view = view->GetNativeView(); - drag_dest_.reset(new WebDragDestGtk(web_contents_, content_view)); - if (delegate_.get()) - drag_dest_->set_delegate(delegate_->GetDragDestDelegate()); -} - gfx::NativeView WebContentsViewGtk::GetNativeView() const { if (delegate_.get()) return delegate_->GetNativeView(); diff --git a/content/browser/web_contents/web_contents_view_gtk.h b/content/browser/web_contents/web_contents_view_gtk.h index 9d3ae6b..3e52372 100644 --- a/content/browser/web_contents/web_contents_view_gtk.h +++ b/content/browser/web_contents/web_contents_view_gtk.h @@ -48,7 +48,6 @@ class CONTENT_EXPORT WebContentsViewGtk virtual void CreateView(const gfx::Size& initial_size) OVERRIDE; virtual RenderWidgetHostView* CreateViewForWidget( RenderWidgetHost* render_widget_host) OVERRIDE; - virtual void SetView(RenderWidgetHostView* view) OVERRIDE; virtual gfx::NativeView GetNativeView() const OVERRIDE; virtual gfx::NativeView GetContentNativeView() const OVERRIDE; virtual gfx::NativeWindow GetTopLevelNativeWindow() const OVERRIDE; diff --git a/content/browser/web_contents/web_contents_view_guest.cc b/content/browser/web_contents/web_contents_view_guest.cc index b8a4afd..a732014 100644 --- a/content/browser/web_contents/web_contents_view_guest.cc +++ b/content/browser/web_contents/web_contents_view_guest.cc @@ -55,9 +55,6 @@ RenderWidgetHostView* WebContentsViewGuest::CreateViewForWidget( return view; } -void WebContentsViewGuest::SetView(RenderWidgetHostView* view) { -} - gfx::NativeView WebContentsViewGuest::GetNativeView() const { return NULL; } diff --git a/content/browser/web_contents/web_contents_view_guest.h b/content/browser/web_contents/web_contents_view_guest.h index 08e032f..efc1dff 100644 --- a/content/browser/web_contents/web_contents_view_guest.h +++ b/content/browser/web_contents/web_contents_view_guest.h @@ -39,7 +39,6 @@ class CONTENT_EXPORT WebContentsViewGuest virtual void CreateView(const gfx::Size& initial_size) OVERRIDE; virtual RenderWidgetHostView* CreateViewForWidget( RenderWidgetHost* render_widget_host) OVERRIDE; - virtual void SetView(RenderWidgetHostView* view) OVERRIDE; virtual gfx::NativeView GetNativeView() const OVERRIDE; virtual gfx::NativeView GetContentNativeView() const OVERRIDE; virtual gfx::NativeWindow GetTopLevelNativeWindow() const OVERRIDE; diff --git a/content/browser/web_contents/web_contents_view_mac.h b/content/browser/web_contents/web_contents_view_mac.h index ae17873..3403b287 100644 --- a/content/browser/web_contents/web_contents_view_mac.h +++ b/content/browser/web_contents/web_contents_view_mac.h @@ -67,7 +67,6 @@ class WebContentsViewMac : public WebContentsView, virtual void CreateView(const gfx::Size& initial_size) OVERRIDE; virtual RenderWidgetHostView* CreateViewForWidget( RenderWidgetHost* render_widget_host) OVERRIDE; - virtual void SetView(RenderWidgetHostView* view) OVERRIDE; virtual gfx::NativeView GetNativeView() const OVERRIDE; virtual gfx::NativeView GetContentNativeView() const OVERRIDE; virtual gfx::NativeWindow GetTopLevelNativeWindow() const OVERRIDE; diff --git a/content/browser/web_contents/web_contents_view_mac.mm b/content/browser/web_contents/web_contents_view_mac.mm index 8d59680..a050f17 100644 --- a/content/browser/web_contents/web_contents_view_mac.mm +++ b/content/browser/web_contents/web_contents_view_mac.mm @@ -141,9 +141,6 @@ RenderWidgetHostView* WebContentsViewMac::CreateViewForWidget( return view; } -void WebContentsViewMac::SetView(RenderWidgetHostView* view) { -} - gfx::NativeView WebContentsViewMac::GetNativeView() const { return cocoa_view_.get(); } diff --git a/content/browser/web_contents/web_contents_view_win.cc b/content/browser/web_contents/web_contents_view_win.cc index 667884c..0609285 100644 --- a/content/browser/web_contents/web_contents_view_win.cc +++ b/content/browser/web_contents/web_contents_view_win.cc @@ -90,7 +90,6 @@ void AddFilterToParentHwndSubclass(HWND hwnd, ui::HWNDMessageFilter* filter) { WebContentsViewWin::WebContentsViewWin(WebContentsImpl* web_contents, WebContentsViewDelegate* delegate) : web_contents_(web_contents), - view_(NULL), delegate_(delegate), hwnd_message_filter_(new PositionChangedMessageFilter) { } @@ -131,16 +130,12 @@ RenderWidgetHostView* WebContentsViewWin::CreateViewForWidget( return render_widget_host->GetView(); } - view_ = static_cast<RenderWidgetHostViewWin*>( + RenderWidgetHostViewWin* view = static_cast<RenderWidgetHostViewWin*>( RenderWidgetHostView::CreateViewForWidget(render_widget_host)); - view_->CreateWnd(GetNativeView()); - view_->ShowWindow(SW_SHOW); - view_->SetSize(initial_size_); - return view_; -} - -void WebContentsViewWin::SetView(RenderWidgetHostView* view) { - view_ = static_cast<RenderWidgetHostViewWin*>(view); + view->CreateWnd(GetNativeView()); + view->ShowWindow(SW_SHOW); + view->SetSize(initial_size_); + return view; } gfx::NativeView WebContentsViewWin::GetNativeView() const { @@ -173,9 +168,6 @@ void WebContentsViewWin::SetPageTitle(const string16& title) { void WebContentsViewWin::OnTabCrashed(base::TerminationStatus status, int error_code) { - // TODO(avi): No other TCV implementation does anything in this callback. Can - // this be moved elsewhere so that |OnTabCrashed| can be removed everywhere? - view_ = NULL; } void WebContentsViewWin::SizeContents(const gfx::Size& size) { diff --git a/content/browser/web_contents/web_contents_view_win.h b/content/browser/web_contents/web_contents_view_win.h index e9a7a7c..8da8882 100644 --- a/content/browser/web_contents/web_contents_view_win.h +++ b/content/browser/web_contents/web_contents_view_win.h @@ -20,7 +20,6 @@ class HWNDMessageFilter; } namespace content { -class RenderWidgetHostViewWin; class WebContentsDragWin; class WebContentsImpl; class WebContentsViewDelegate; @@ -57,7 +56,6 @@ class CONTENT_EXPORT WebContentsViewWin virtual void CreateView(const gfx::Size& initial_size) OVERRIDE; virtual RenderWidgetHostView* CreateViewForWidget( RenderWidgetHost* render_widget_host) OVERRIDE; - virtual void SetView(RenderWidgetHostView* view) OVERRIDE; virtual gfx::NativeView GetNativeView() const OVERRIDE; virtual gfx::NativeView GetContentNativeView() const OVERRIDE; virtual gfx::NativeWindow GetTopLevelNativeWindow() const OVERRIDE; @@ -128,8 +126,6 @@ class CONTENT_EXPORT WebContentsViewWin // The WebContentsImpl whose contents we display. WebContentsImpl* web_contents_; - RenderWidgetHostViewWin* view_; - scoped_ptr<WebContentsViewDelegate> delegate_; // The helper object that handles drag destination related interactions with diff --git a/content/public/browser/web_contents_view.h b/content/public/browser/web_contents_view.h index 45fe5c3..89ecdf9 100644 --- a/content/public/browser/web_contents_view.h +++ b/content/public/browser/web_contents_view.h @@ -37,12 +37,6 @@ class CONTENT_EXPORT WebContentsView { virtual RenderWidgetHostView* CreateViewForWidget( RenderWidgetHost* render_widget_host) = 0; - // This is required because some WebContentsView cache the - // RenderWidgetHostView created by the above method. In that case, when the - // view created by the above method is destroyed, the old one needs to be set - // again. - virtual void SetView(RenderWidgetHostView* view) = 0; - // Returns the native widget that contains the contents of the tab. virtual gfx::NativeView GetNativeView() const = 0; diff --git a/content/test/test_web_contents_view.cc b/content/test/test_web_contents_view.cc index 5b99a1c..0e9febc 100644 --- a/content/test/test_web_contents_view.cc +++ b/content/test/test_web_contents_view.cc @@ -50,9 +50,6 @@ RenderWidgetHostView* TestWebContentsView::CreateViewForWidget( return NULL; } -void TestWebContentsView::SetView(RenderWidgetHostView* view) { -} - gfx::NativeView TestWebContentsView::GetNativeView() const { return gfx::NativeView(); } diff --git a/content/test/test_web_contents_view.h b/content/test/test_web_contents_view.h index 0370740..d9e0f8e 100644 --- a/content/test/test_web_contents_view.h +++ b/content/test/test_web_contents_view.h @@ -40,7 +40,6 @@ class TestWebContentsView : public WebContentsView, virtual void CreateView(const gfx::Size& initial_size) OVERRIDE; virtual RenderWidgetHostView* CreateViewForWidget( RenderWidgetHost* render_widget_host) OVERRIDE; - virtual void SetView(RenderWidgetHostView* view) OVERRIDE; virtual gfx::NativeView GetNativeView() const OVERRIDE; virtual gfx::NativeView GetContentNativeView() const OVERRIDE; virtual gfx::NativeWindow GetTopLevelNativeWindow() const OVERRIDE; |