summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorjcivelli@google.com <jcivelli@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-29 20:23:40 +0000
committerjcivelli@google.com <jcivelli@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-29 20:23:40 +0000
commitd5f32f19a121b121aa1b39a6ea6250ee8ba84e39 (patch)
tree6503bb71c723c0cd63b1231a71c81e2f1990c852 /chrome
parentb172783e9129bb9c8c34130d16e3b777f7fca3ea (diff)
downloadchromium_src-d5f32f19a121b121aa1b39a6ea6250ee8ba84e39.zip
chromium_src-d5f32f19a121b121aa1b39a6ea6250ee8ba84e39.tar.gz
chromium_src-d5f32f19a121b121aa1b39a6ea6250ee8ba84e39.tar.bz2
This CL ensures the interstitial when hidden does not call
Show on the RenderWidgetHostView. on Windows this would cause the tab HWND to be parented to the desktop (as Show was called when Hide had not been called). BUG=36290 TEST=See bug for steps. Review URL: http://codereview.chromium.org/1388002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@42991 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view.h3
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_gtk.cc5
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_gtk.h1
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_mac.h1
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_mac.mm4
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_win.cc4
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_win.h1
-rw-r--r--chrome/browser/renderer_host/test/test_render_view_host.h1
-rw-r--r--chrome/browser/tab_contents/interstitial_page.cc5
9 files changed, 24 insertions, 1 deletions
diff --git a/chrome/browser/renderer_host/render_widget_host_view.h b/chrome/browser/renderer_host/render_widget_host_view.h
index ee2fb78..153c5f95 100644
--- a/chrome/browser/renderer_host/render_widget_host_view.h
+++ b/chrome/browser/renderer_host/render_widget_host_view.h
@@ -95,6 +95,9 @@ class RenderWidgetHostView {
virtual void Show() = 0;
virtual void Hide() = 0;
+ // Whether the view is showing.
+ virtual bool IsShowing() = 0;
+
// Retrieve the bounds of the View, in screen coordinates.
virtual gfx::Rect GetViewBounds() const = 0;
diff --git a/chrome/browser/renderer_host/render_widget_host_view_gtk.cc b/chrome/browser/renderer_host/render_widget_host_view_gtk.cc
index 7b02f6a..966c643 100644
--- a/chrome/browser/renderer_host/render_widget_host_view_gtk.cc
+++ b/chrome/browser/renderer_host/render_widget_host_view_gtk.cc
@@ -496,6 +496,11 @@ void RenderWidgetHostViewGtk::Hide() {
gtk_widget_hide(view_.get());
}
+bool RenderWidgetHostViewGtk::IsShowing() {
+ // TODO(jcivelli): use gtk_widget_get_visible once we build with GTK 2.18.
+ return (GTK_WIDGET_FLAGS(view_.get()) & GTK_VISIBLE) != 0;
+}
+
gfx::Rect RenderWidgetHostViewGtk::GetViewBounds() const {
GtkAllocation* alloc = &view_.get()->allocation;
return gfx::Rect(alloc->x, alloc->y,
diff --git a/chrome/browser/renderer_host/render_widget_host_view_gtk.h b/chrome/browser/renderer_host/render_widget_host_view_gtk.h
index cd38590..de6c480 100644
--- a/chrome/browser/renderer_host/render_widget_host_view_gtk.h
+++ b/chrome/browser/renderer_host/render_widget_host_view_gtk.h
@@ -55,6 +55,7 @@ class RenderWidgetHostViewGtk : public RenderWidgetHostView {
virtual bool HasFocus();
virtual void Show();
virtual void Hide();
+ virtual bool IsShowing();
virtual gfx::Rect GetViewBounds() const;
virtual void UpdateCursor(const WebCursor& cursor);
virtual void SetIsLoading(bool is_loading);
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 c6ed3b7..5ebedbb 100644
--- a/chrome/browser/renderer_host/render_widget_host_view_mac.h
+++ b/chrome/browser/renderer_host/render_widget_host_view_mac.h
@@ -108,6 +108,7 @@ class RenderWidgetHostViewMac : public RenderWidgetHostView {
virtual bool HasFocus();
virtual void Show();
virtual void Hide();
+ virtual bool IsShowing();
virtual gfx::Rect GetViewBounds() const;
virtual void UpdateCursor(const WebCursor& cursor);
virtual void SetIsLoading(bool is_loading);
diff --git a/chrome/browser/renderer_host/render_widget_host_view_mac.mm b/chrome/browser/renderer_host/render_widget_host_view_mac.mm
index e7d0c56..6908baa 100644
--- a/chrome/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/chrome/browser/renderer_host/render_widget_host_view_mac.mm
@@ -273,6 +273,10 @@ void RenderWidgetHostViewMac::Hide() {
WasHidden();
}
+bool RenderWidgetHostViewMac::IsShowing() {
+ return ![cocoa_view_ isHidden];
+}
+
gfx::Rect RenderWidgetHostViewMac::GetViewBounds() const {
return [cocoa_view_ NSRectToRect:[cocoa_view_ bounds]];
}
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 2d08f42..d70b674 100644
--- a/chrome/browser/renderer_host/render_widget_host_view_win.cc
+++ b/chrome/browser/renderer_host/render_widget_host_view_win.cc
@@ -542,6 +542,10 @@ void RenderWidgetHostViewWin::Hide() {
WasHidden();
}
+bool RenderWidgetHostViewWin::IsShowing() {
+ return !!IsWindowVisible();
+}
+
gfx::Rect RenderWidgetHostViewWin::GetViewBounds() const {
CRect window_rect;
GetWindowRect(&window_rect);
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 f43dd0f..c140d14 100644
--- a/chrome/browser/renderer_host/render_widget_host_view_win.h
+++ b/chrome/browser/renderer_host/render_widget_host_view_win.h
@@ -125,6 +125,7 @@ class RenderWidgetHostViewWin
virtual bool HasFocus();
virtual void Show();
virtual void Hide();
+ virtual bool IsShowing();
virtual gfx::Rect GetViewBounds() const;
virtual void UpdateCursor(const WebCursor& cursor);
virtual void SetIsLoading(bool is_loading);
diff --git a/chrome/browser/renderer_host/test/test_render_view_host.h b/chrome/browser/renderer_host/test/test_render_view_host.h
index bbc6ea6..a43af51 100644
--- a/chrome/browser/renderer_host/test/test_render_view_host.h
+++ b/chrome/browser/renderer_host/test/test_render_view_host.h
@@ -54,6 +54,7 @@ class TestRenderWidgetHostView : public RenderWidgetHostView {
virtual void AdvanceFocus(bool reverse) {}
virtual void Show() { is_showing_ = true; }
virtual void Hide() { is_showing_ = false; }
+ virtual bool IsShowing() { return is_showing_; }
virtual gfx::Rect GetViewBounds() const { return gfx::Rect(); }
virtual void SetIsLoading(bool is_loading) {}
virtual void UpdateCursor(const WebCursor& cursor) {}
diff --git a/chrome/browser/tab_contents/interstitial_page.cc b/chrome/browser/tab_contents/interstitial_page.cc
index 641edd6..31fa713 100644
--- a/chrome/browser/tab_contents/interstitial_page.cc
+++ b/chrome/browser/tab_contents/interstitial_page.cc
@@ -226,9 +226,12 @@ void InterstitialPage::Show() {
void InterstitialPage::Hide() {
RenderWidgetHostView* old_view = tab_->render_view_host()->view();
- if (old_view) {
+ if (old_view && !old_view->IsShowing()) {
// Show the original RVH since we're going away. Note it might not exist if
// the renderer crashed while the interstitial was showing.
+ // Note that it is important that we don't call Show() if the view is
+ // already showing. That would result in bad things (unparented HWND on
+ // Windows for example) happening.
old_view->Show();
}