Chromium Code Reviews| 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..86c020047c31a2bad472d0f8c82152de4add34d4 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,9 @@ 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_ && overlay_web_contents_) { |
|
sky
2013/04/05 23:12:40
overlay_web_contents_ should be a DCHECK, right?
kuan
2013/04/05 23:22:02
Done.
|
| + DCHECK_EQ(overlay_web_contents_->GetRenderViewHost(), |
| + (content::Source<content::RenderWidgetHost>(source)).ptr()); |
| shadow_view_.reset(); |
| + } |
| } |