diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-11 20:22:32 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-11 20:22:32 +0000 |
commit | eda48c7a4e569aaf2f2327e0226762868346f531 (patch) | |
tree | eb1e837d6ff4a77add2df32c8286601c530a51b3 /chrome | |
parent | 34717bc08d6b56f276e49675acbbb5eb2fc48fbf (diff) | |
download | chromium_src-eda48c7a4e569aaf2f2327e0226762868346f531.zip chromium_src-eda48c7a4e569aaf2f2327e0226762868346f531.tar.gz chromium_src-eda48c7a4e569aaf2f2327e0226762868346f531.tar.bz2 |
Get rid of RenderWidgetHostDestroyed method in the various classes. RenderWidgetHost fires a notification and also calls RenderWidgetHostView. The notification was being observed by TabContents, which calls TabContentsView which tells the RenderWidgetHostView and RenderViewHostDelegateHelper. So I took out the extra indirection which was redundant, and just made RenderViewHostDelegateHelper observe the notification itself.
BUG=87702
Review URL: http://codereview.chromium.org/7324057
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@92045 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
6 files changed, 33 insertions, 26 deletions
diff --git a/chrome/browser/renderer_host/render_widget_host_view_mac.h b/chrome/browser/renderer_host/render_widget_host_view_mac.h index 1d032e7..93862f8 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_mac.h +++ b/chrome/browser/renderer_host/render_widget_host_view_mac.h @@ -202,7 +202,6 @@ class RenderWidgetHostViewMac : public RenderWidgetHostView { const std::vector<gfx::Rect>& copy_rects) OVERRIDE; virtual void RenderViewGone(base::TerminationStatus status, int error_code) OVERRIDE; - virtual void WillDestroyRenderWidget(RenderWidgetHost* rwh) OVERRIDE {}; virtual void Destroy() OVERRIDE; virtual void SetTooltipText(const std::wstring& tooltip_text) OVERRIDE; virtual void SelectionChanged(const std::string& text, diff --git a/chrome/browser/renderer_host/render_widget_host_view_views.h b/chrome/browser/renderer_host/render_widget_host_view_views.h index f1a44ea..86ea396 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_views.h +++ b/chrome/browser/renderer_host/render_widget_host_view_views.h @@ -76,7 +76,6 @@ class RenderWidgetHostViewViews : public RenderWidgetHostView, virtual void RenderViewGone(base::TerminationStatus status, int error_code) OVERRIDE; virtual void Destroy() OVERRIDE; - virtual void WillDestroyRenderWidget(RenderWidgetHost* rwh) OVERRIDE {} virtual void SetTooltipText(const std::wstring& tooltip_text) OVERRIDE; virtual void SelectionChanged(const std::string& text, const ui::Range& range) OVERRIDE; diff --git a/chrome/browser/renderer_host/render_widget_host_view_win.cc b/chrome/browser/renderer_host/render_widget_host_view_win.cc index 7934837..f2c5e33 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_win.cc +++ b/chrome/browser/renderer_host/render_widget_host_view_win.cc @@ -691,11 +691,6 @@ void RenderWidgetHostViewWin::WillWmDestroy() { CleanupCompositorWindow(); } -void RenderWidgetHostViewWin::WillDestroyRenderWidget(RenderWidgetHost* rwh) { - if (rwh == render_widget_host_) - render_widget_host_ = NULL; -} - void RenderWidgetHostViewWin::Destroy() { // We've been told to destroy. // By clearing close_on_deactivate_, we prevent further deactivations @@ -703,6 +698,7 @@ void RenderWidgetHostViewWin::Destroy() { // triggering further destructions. The deletion of this is handled by // OnFinalMessage(); close_on_deactivate_ = false; + render_widget_host_ = NULL; being_destroyed_ = true; CleanupCompositorWindow(); DestroyWindow(); @@ -1688,8 +1684,7 @@ LRESULT RenderWidgetHostViewWin::OnParentNotify(UINT message, WPARAM wparam, void RenderWidgetHostViewWin::OnFinalMessage(HWND window) { // When the render widget host is being destroyed, it ends up calling - // WillDestroyRenderWidget (through the RENDER_WIDGET_HOST_DESTROYED - // notification) which NULLs render_widget_host_. + // Destroy() which NULLs render_widget_host_. // Note: the following bug http://crbug.com/24248 seems to report that // OnFinalMessage is called with a deleted |render_widget_host_|. It is not // clear how this could happen, hence the NULLing of render_widget_host_ diff --git a/chrome/browser/renderer_host/render_widget_host_view_win.h b/chrome/browser/renderer_host/render_widget_host_view_win.h index a079c55..d557f97 100644 --- a/chrome/browser/renderer_host/render_widget_host_view_win.h +++ b/chrome/browser/renderer_host/render_widget_host_view_win.h @@ -159,7 +159,6 @@ class RenderWidgetHostViewWin int error_code) OVERRIDE; // called by TabContents before DestroyWindow virtual void WillWmDestroy() OVERRIDE; - virtual void WillDestroyRenderWidget(RenderWidgetHost* rwh) OVERRIDE; virtual void Destroy() OVERRIDE; virtual void SetTooltipText(const std::wstring& tooltip_text) OVERRIDE; virtual BackingStore* AllocBackingStore(const gfx::Size& size) OVERRIDE; diff --git a/chrome/browser/tab_contents/render_view_host_delegate_helper.cc b/chrome/browser/tab_contents/render_view_host_delegate_helper.cc index 2b61535..3f23de0 100644 --- a/chrome/browser/tab_contents/render_view_host_delegate_helper.cc +++ b/chrome/browser/tab_contents/render_view_host_delegate_helper.cc @@ -32,11 +32,30 @@ #include "content/browser/tab_contents/tab_contents.h" #include "content/browser/tab_contents/tab_contents_view.h" #include "content/browser/webui/web_ui.h" +#include "content/common/notification_service.h" -RenderViewHostDelegateViewHelper::RenderViewHostDelegateViewHelper() {} +RenderViewHostDelegateViewHelper::RenderViewHostDelegateViewHelper() { + registrar_.Add(this, content::NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, + NotificationService::AllSources()); +} RenderViewHostDelegateViewHelper::~RenderViewHostDelegateViewHelper() {} +void RenderViewHostDelegateViewHelper::Observe( + int type, + const NotificationSource& source, + const NotificationDetails& details) { + DCHECK_EQ(type, content::NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED); + RenderWidgetHost* host = Source<RenderWidgetHost>(source).ptr(); + for (PendingWidgetViews::iterator i = pending_widget_views_.begin(); + i != pending_widget_views_.end(); ++i) { + if (host->view() == i->second) { + pending_widget_views_.erase(i); + break; + } + } +} + BackgroundContents* RenderViewHostDelegateViewHelper::MaybeCreateBackgroundContents( int route_id, @@ -202,17 +221,6 @@ RenderWidgetHostView* RenderViewHostDelegateViewHelper::GetCreatedWidget( return widget_host_view; } -void RenderViewHostDelegateViewHelper::RenderWidgetHostDestroyed( - RenderWidgetHost* host) { - for (PendingWidgetViews::iterator i = pending_widget_views_.begin(); - i != pending_widget_views_.end(); ++i) { - if (host->view() == i->second) { - pending_widget_views_.erase(i); - return; - } - } -} - // static WebPreferences RenderViewHostDelegateHelper::GetWebkitPrefs( Profile* profile, bool is_web_ui) { diff --git a/chrome/browser/tab_contents/render_view_host_delegate_helper.h b/chrome/browser/tab_contents/render_view_host_delegate_helper.h index e0525fb..a2b2bf6 100644 --- a/chrome/browser/tab_contents/render_view_host_delegate_helper.h +++ b/chrome/browser/tab_contents/render_view_host_delegate_helper.h @@ -10,6 +10,8 @@ #include "base/basictypes.h" #include "content/browser/webui/web_ui.h" +#include "content/common/notification_observer.h" +#include "content/common/notification_registrar.h" #include "content/common/window_container_type.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebPopupType.h" #include "ui/gfx/rect.h" @@ -28,7 +30,7 @@ class TabContents; // Provides helper methods that provide common implementations of some // RenderViewHostDelegate::View methods. -class RenderViewHostDelegateViewHelper { +class RenderViewHostDelegateViewHelper : public NotificationObserver { public: RenderViewHostDelegateViewHelper(); virtual ~RenderViewHostDelegateViewHelper(); @@ -66,10 +68,12 @@ class RenderViewHostDelegateViewHelper { // map. virtual TabContents* GetCreatedWindow(int route_id); - // Removes |host| from the internal map of pending RenderWidgets. - void RenderWidgetHostDestroyed(RenderWidgetHost* host); - private: + // NotificationObserver implementation + virtual void Observe(int type, + const NotificationSource& source, + const NotificationDetails& details) OVERRIDE; + BackgroundContents* MaybeCreateBackgroundContents( int route_id, Profile* profile, @@ -87,6 +91,9 @@ class RenderViewHostDelegateViewHelper { typedef std::map<int, RenderWidgetHostView*> PendingWidgetViews; PendingWidgetViews pending_widget_views_; + // Registers and unregisters us for notifications. + NotificationRegistrar registrar_; + DISALLOW_COPY_AND_ASSIGN(RenderViewHostDelegateViewHelper); }; |