Index: webkit/plugins/npapi/webplugin_delegate_impl_mac.mm |
=================================================================== |
--- webkit/plugins/npapi/webplugin_delegate_impl_mac.mm (revision 98412) |
+++ webkit/plugins/npapi/webplugin_delegate_impl_mac.mm (working copy) |
@@ -262,6 +262,7 @@ |
instance_(instance), |
parent_(containing_view), |
quirks_(0), |
+ use_buffer_context_(true), |
buffer_context_(NULL), |
layer_(nil), |
surface_(NULL), |
@@ -692,18 +693,24 @@ |
const gfx::Rect& damage_rect) { |
// If we get a paint event before we are completely set up (e.g., a nested |
// call while the plugin is still in NPP_SetWindow), bail. |
- if (!have_called_set_window_ || !buffer_context_) |
+ if (!have_called_set_window_ || (use_buffer_context_ && !buffer_context_)) |
return; |
- DCHECK(buffer_context_ == context); |
+ DCHECK(!use_buffer_context_ || buffer_context_ == context); |
static base::StatsRate plugin_paint("Plugin.Paint"); |
base::StatsScope<base::StatsRate> scope(plugin_paint); |
- // Plugin invalidates trigger asynchronous paints with the original |
- // invalidation rect; the plugin may be resized before the paint is handled, |
- // so we need to ensure that the damage rect is still sane. |
- const gfx::Rect paint_rect(damage_rect.Intersect( |
- gfx::Rect(0, 0, window_rect_.width(), window_rect_.height()))); |
+ gfx::Rect paint_rect; |
+ if (use_buffer_context_) { |
+ // Plugin invalidates trigger asynchronous paints with the original |
+ // invalidation rect; the plugin may be resized before the paint is handled, |
+ // so we need to ensure that the damage rect is still sane. |
+ paint_rect = damage_rect.Intersect( |
+ gfx::Rect(0, 0, window_rect_.width(), window_rect_.height())); |
+ } else { |
+ // Use the actual window region when drawing directly to the window context. |
+ paint_rect = damage_rect.Intersect(window_rect_); |
+ } |
ScopedActiveDelegate active_delegate(this); |
@@ -714,6 +721,13 @@ |
CGContextSaveGState(context); |
+ if (!use_buffer_context_) { |
+ // Reposition the context origin so that plugins will draw at the correct |
+ // location in the window. |
+ CGContextClipToRect(context, paint_rect.ToCGRect()); |
+ CGContextTranslateCTM(context, window_rect_.x(), window_rect_.y()); |
+ } |
+ |
switch (instance()->event_model()) { |
#ifndef NP_NO_CARBON |
case NPEventModelCarbon: { |
@@ -739,10 +753,15 @@ |
} |
} |
- // The backing buffer can change during the call to NPP_HandleEvent, in which |
- // case the old context is (or is about to be) invalid. |
- if (context == buffer_context_) |
+ if (use_buffer_context_) { |
+ // The backing buffer can change during the call to NPP_HandleEvent, in |
+ // which case the old context is (or is about to be) invalid. |
+ if (context == buffer_context_) |
+ CGContextRestoreGState(context); |
+ } else { |
+ // Always restore the context to the saved state. |
CGContextRestoreGState(context); |
+ } |
} |
void WebPluginDelegateImpl::WindowlessSetWindow() { |
@@ -1115,6 +1134,10 @@ |
plugin_visible); |
} |
+void WebPluginDelegateImpl::SetNoBufferContext() { |
+ use_buffer_context_ = false; |
+} |
+ |
void WebPluginDelegateImpl::FireIdleEvent() { |
// Avoid a race condition between IO and UI threads during plugin shutdown |
if (!instance()) |