Index: chrome/browser/renderer_host/render_widget_host_view_views.cc |
diff --git a/chrome/browser/renderer_host/render_widget_host_view_views.cc b/chrome/browser/renderer_host/render_widget_host_view_views.cc |
index f5cdaeb2cb2ca8278487b1b39c28decae5db288a..82e68e0fb794718de7134434a86e0433eb19a330 100644 |
--- a/chrome/browser/renderer_host/render_widget_host_view_views.cc |
+++ b/chrome/browser/renderer_host/render_widget_host_view_views.cc |
@@ -22,6 +22,7 @@ |
#include "chrome/common/chrome_switches.h" |
#include "chrome/common/native_web_keyboard_event.h" |
#include "chrome/common/render_messages.h" |
+#include "gfx/canvas.h" |
#include "third_party/WebKit/WebKit/chromium/public/gtk/WebInputEventFactory.h" |
#include "third_party/WebKit/WebKit/chromium/public/WebInputEvent.h" |
#include "views/event.h" |
@@ -137,7 +138,7 @@ void RenderWidgetHostViewViews::SetSize(const gfx::Size& size) { |
if (requested_size_.width() != width || |
requested_size_.height() != height) { |
requested_size_ = gfx::Size(width, height); |
- SetBounds(x(), y(), requested_size_.width(), requested_size_.height()); |
+ SetBounds(gfx::Rect(x(), y(), width, height)); |
host_->WasResized(); |
} |
} |
@@ -279,7 +280,9 @@ BackingStore* RenderWidgetHostViewViews::AllocBackingStore( |
} |
gfx::NativeView RenderWidgetHostViewViews::native_view() const { |
- return GetWidget()->GetNativeView(); |
+ if (GetWidget()) |
+ return GetWidget()->GetNativeView(); |
+ return NULL; |
} |
void RenderWidgetHostViewViews::SetBackground(const SkBitmap& background) { |
@@ -288,6 +291,16 @@ void RenderWidgetHostViewViews::SetBackground(const SkBitmap& background) { |
} |
void RenderWidgetHostViewViews::Paint(gfx::Canvas* canvas) { |
+ if (is_hidden_) { |
+ return; |
+ } |
+ |
+ // Paint a "hole" in the canvas so that the render of the web page is on |
+ // top of whatever else has already been painted in the views hierarchy. |
+ // Later views might still get to paint on top. |
+ canvas->FillRectInt(SK_ColorBLACK, 0, 0, kMaxWindowWidth, kMaxWindowHeight, |
+ SkXfermode::kClear_Mode); |
+ |
// Don't do any painting if the GPU process is rendering directly |
// into the View. |
RenderWidgetHost* render_widget_host = GetRenderWidgetHost(); |
@@ -301,6 +314,9 @@ void RenderWidgetHostViewViews::Paint(gfx::Canvas* canvas) { |
// TODO(anicolao): get the damage somehow |
// invalid_rect_ = damage_rect; |
invalid_rect_ = bounds(); |
+ gfx::Point origin; |
+ ConvertPointToWidget(this, &origin); |
+ |
about_to_validate_and_paint_ = true; |
BackingStoreX* backing_store = static_cast<BackingStoreX*>( |
host_->GetBackingStore(true)); |
@@ -318,7 +334,7 @@ void RenderWidgetHostViewViews::Paint(gfx::Canvas* canvas) { |
if (!visually_deemphasized_) { |
// In the common case, use XCopyArea. We don't draw more than once, so |
// we don't need to double buffer. |
- backing_store->XShowRect( |
+ backing_store->XShowRect(origin, |
paint_rect, x11_util::GetX11WindowFromGtkWidget(native_view())); |
} else { |
// If the grey blend is showing, we make two drawing calls. Use double |
@@ -500,7 +516,7 @@ void RenderWidgetHostViewViews::DidGainFocus() { |
void RenderWidgetHostViewViews::WillLoseFocus() { |
// If we are showing a context menu, maintain the illusion that webkit has |
// focus. |
- if (!is_showing_context_menu_) |
+ if (!is_showing_context_menu_ && !is_hidden_) |
GetRenderWidgetHost()->Blur(); |
} |
@@ -508,7 +524,7 @@ void RenderWidgetHostViewViews::WillLoseFocus() { |
void RenderWidgetHostViewViews::ShowCurrentCursor() { |
// The widget may not have a window. If that's the case, abort mission. This |
// is the same issue as that explained above in Paint(). |
- if (!native_view()->window) |
+ if (!native_view() || !native_view()->window) |
return; |
// TODO(anicolao): change to set cursors without GTK |