Index: chrome/browser/ui/views/frame/contents_container.cc |
diff --git a/chrome/browser/ui/views/frame/contents_container.cc b/chrome/browser/ui/views/frame/contents_container.cc |
index 4603f9ad3e48af8d39346db592288a6423291ba2..3663a2191d4f0c3835246feb144409826e67362b 100644 |
--- a/chrome/browser/ui/views/frame/contents_container.cc |
+++ b/chrome/browser/ui/views/frame/contents_container.cc |
@@ -98,6 +98,8 @@ void ContentsContainer::MakeOverlayContentsActiveContents() { |
active_ = overlay_; |
overlay_ = NULL; |
overlay_web_contents_ = NULL; |
+ // Unregister from observing previous |overlay_web_contents_|. |
+ registrar_.RemoveAll(); |
// Since |overlay_| has been nuked, shadow view is not needed anymore. |
// Note that the previous |active_| will be deleted by caller (see |
// BrowserView::ActiveTabChanged()) after this call, hence removing the old |
@@ -145,9 +147,8 @@ void ContentsContainer::SetOverlay(views::WebView* overlay, |
if (overlay_web_contents_ != overlay_web_contents) { |
#if !defined(OS_WIN) |
- // Unregister from previous overlay web contents' render view host. |
- if (overlay_web_contents_) |
- registrar_.RemoveAll(); |
+ // Unregister from observing previous |overlay_web_contents_|. |
+ registrar_.RemoveAll(); |
#endif // !defined(OS_WIN) |
overlay_web_contents_ = overlay_web_contents; |
@@ -157,11 +158,13 @@ void ContentsContainer::SetOverlay(views::WebView* overlay, |
if (overlay_web_contents_) { |
content::RenderViewHost* rvh = overlay_web_contents_->GetRenderViewHost(); |
DCHECK(rvh); |
- content::NotificationSource source = |
- content::Source<content::RenderWidgetHost>(rvh); |
- registrar_.Add(this, |
- content::NOTIFICATION_RENDER_WIDGET_HOST_DID_UPDATE_BACKING_STORE, |
- source); |
+ if (rvh) { |
+ content::NotificationSource source = |
+ content::Source<content::RenderWidgetHost>(rvh); |
+ registrar_.Add(this, |
+ content::NOTIFICATION_RENDER_WIDGET_HOST_DID_UPDATE_BACKING_STORE, |
+ source); |
+ } |
} |
#endif // !defined(OS_WIN) |
} |
@@ -273,6 +276,10 @@ void ContentsContainer::Observe(int type, |
DCHECK_EQ(content::NOTIFICATION_RENDER_WIDGET_HOST_DID_UPDATE_BACKING_STORE, |
type); |
// Remove shadow view if it's not needed. |
- if (overlay_ && !draw_drop_shadow_) |
+ if (overlay_ && !draw_drop_shadow_) { |
+ DCHECK(overlay_web_contents_); |
+ DCHECK_EQ(overlay_web_contents_->GetRenderViewHost(), |
+ (content::Source<content::RenderWidgetHost>(source)).ptr()); |
shadow_view_.reset(); |
+ } |
} |