Index: webkit/glue/plugins/webplugin_delegate_impl_mac.mm |
diff --git a/webkit/glue/plugins/webplugin_delegate_impl_mac.mm b/webkit/glue/plugins/webplugin_delegate_impl_mac.mm |
index 09ee22b65cf8fc310058b3ac815111eb6a019092..c61ed22c354e1b4508ca914c590169443b4a92af 100644 |
--- a/webkit/glue/plugins/webplugin_delegate_impl_mac.mm |
+++ b/webkit/glue/plugins/webplugin_delegate_impl_mac.mm |
@@ -372,17 +372,15 @@ bool WebPluginDelegateImpl::PlatformInitialize() { |
NPError err = instance()->NPP_GetValue(NPPVpluginCoreAnimationLayer, |
reinterpret_cast<void*>(&layer)); |
if (!err) { |
+ // Create the timer; it will be started when we get a window handle. |
+ redraw_timer_.reset(new base::RepeatingTimer<WebPluginDelegateImpl>); |
layer_ = layer; |
- plugin_->BindFakePluginWindowHandle(false); |
surface_ = new AcceleratedSurface; |
surface_->Initialize(NULL, true); |
renderer_ = [[CARenderer rendererWithCGLContext:surface_->context() |
options:NULL] retain]; |
[renderer_ setLayer:layer_]; |
- UpdateAcceleratedSurface(); |
- redraw_timer_.reset(new base::RepeatingTimer<WebPluginDelegateImpl>); |
- // This will start the timer, but only if we are visible. |
- PluginVisibilityChanged(); |
+ plugin_->BindFakePluginWindowHandle(false); |
} |
break; |
} |
@@ -979,7 +977,7 @@ void WebPluginDelegateImpl::PluginVisibilityChanged() { |
#endif |
if (instance()->drawing_model() == NPDrawingModelCoreAnimation) { |
bool plugin_visible = container_is_visible_ && !clip_rect_.IsEmpty(); |
- if (plugin_visible && !redraw_timer_->IsRunning()) { |
+ if (plugin_visible && !redraw_timer_->IsRunning() && windowed_handle()) { |
redraw_timer_->Start( |
base::TimeDelta::FromMilliseconds(kCoreAnimationRedrawPeriodMs), |
this, &WebPluginDelegateImpl::DrawLayerInSurface); |
@@ -993,6 +991,10 @@ void WebPluginDelegateImpl::PluginVisibilityChanged() { |
#pragma mark Core Animation Support |
void WebPluginDelegateImpl::DrawLayerInSurface() { |
+ // If we haven't plumbed up the surface yet, don't try to draw. |
+ if (!windowed_handle()) |
+ return; |
+ |
surface_->MakeCurrent(); |
surface_->Clear(window_rect_); |
@@ -1029,6 +1031,14 @@ void WebPluginDelegateImpl::UpdateAcceleratedSurface() { |
} |
} |
+void WebPluginDelegateImpl::set_windowed_handle( |
+ gfx::PluginWindowHandle handle) { |
+ windowed_handle_ = handle; |
+ UpdateAcceleratedSurface(); |
+ // Kick off the drawing timer, if necessary. |
+ PluginVisibilityChanged(); |
+} |
+ |
#pragma mark - |
#pragma mark Carbon Event support |