diff options
Diffstat (limited to 'webkit/plugins/ppapi/ppapi_plugin_instance.cc')
-rw-r--r-- | webkit/plugins/ppapi/ppapi_plugin_instance.cc | 97 |
1 files changed, 72 insertions, 25 deletions
diff --git a/webkit/plugins/ppapi/ppapi_plugin_instance.cc b/webkit/plugins/ppapi/ppapi_plugin_instance.cc index 84d549a..f871ce2 100644 --- a/webkit/plugins/ppapi/ppapi_plugin_instance.cc +++ b/webkit/plugins/ppapi/ppapi_plugin_instance.cc @@ -52,6 +52,7 @@ #include "ui/gfx/skia_util.h" #include "webkit/plugins/ppapi/common.h" #include "webkit/plugins/ppapi/event_conversion.h" +#include "webkit/plugins/ppapi/fullscreen_container.h" #include "webkit/plugins/ppapi/message_channel.h" #include "webkit/plugins/ppapi/npapi_glue.h" #include "webkit/plugins/ppapi/plugin_delegate.h" @@ -232,7 +233,7 @@ PluginInstance::PluginInstance( plugin_print_interface_(NULL), plugin_graphics_3d_interface_(NULL), always_on_top_(false), - desired_fullscreen_state_(false), + fullscreen_container_(NULL), fullscreen_(false), message_channel_(NULL), sad_plugin_(NULL), @@ -276,6 +277,10 @@ void PluginInstance::Delete() { scoped_refptr<PluginInstance> ref(this); instance_interface_->DidDestroy(pp_instance()); + if (fullscreen_container_) { + fullscreen_container_->Destroy(); + fullscreen_container_ = NULL; + } container_ = NULL; } @@ -296,21 +301,32 @@ void PluginInstance::Paint(WebCanvas* canvas, } void PluginInstance::InvalidateRect(const gfx::Rect& rect) { - if (!container_ || position_.IsEmpty()) - return; // Nothing to do. - if (rect.IsEmpty()) - container_->invalidate(); - else - container_->invalidateRect(rect); + if (fullscreen_container_) { + if (rect.IsEmpty()) + fullscreen_container_->Invalidate(); + else + fullscreen_container_->InvalidateRect(rect); + } else { + if (!container_ || position_.IsEmpty()) + return; // Nothing to do. + if (rect.IsEmpty()) + container_->invalidate(); + else + container_->invalidateRect(rect); + } } void PluginInstance::ScrollRect(int dx, int dy, const gfx::Rect& rect) { - if (full_frame_) { - container_->scrollRect(dx, dy, rect); + if (fullscreen_container_) { + fullscreen_container_->ScrollRect(dx, dy, rect); } else { - // Can't do optimized scrolling since there could be other elements on top - // of us. - InvalidateRect(rect); + if (full_frame_) { + container_->scrollRect(dx, dy, rect); + } else { + // Can't do optimized scrolling since there could be other elements on top + // of us. + InvalidateRect(rect); + } } } @@ -324,7 +340,10 @@ unsigned PluginInstance::GetBackingTextureId() { } void PluginInstance::CommitBackingTexture() { - container_->commitBackingTexture(); + if (fullscreen_container_) + fullscreen_container_->Invalidate(); + else + container_->commitBackingTexture(); } void PluginInstance::InstanceCrashed() { @@ -486,7 +505,7 @@ PP_Var PluginInstance::GetInstanceObject() { void PluginInstance::ViewChanged(const gfx::Rect& position, const gfx::Rect& clip) { - fullscreen_ = desired_fullscreen_state_; + fullscreen_ = (fullscreen_container_ != NULL); position_ = position; if (clip.IsEmpty()) { @@ -747,7 +766,10 @@ bool PluginInstance::PluginHasFocus() const { } void PluginInstance::ReportGeometry() { - if (container_) + // If this call was delayed, we may have transitioned back to fullscreen in + // the mean time, so only report the geometry if we are actually in normal + // mode. + if (container_ && !fullscreen_container_) container_->reportGeometry(); } @@ -866,7 +888,7 @@ void PluginInstance::PrintEnd() { } bool PluginInstance::IsFullscreenOrPending() { - return desired_fullscreen_state_; + return fullscreen_container_ != NULL; } void PluginInstance::SetFullscreen(bool fullscreen, bool delay_report) { @@ -879,16 +901,22 @@ void PluginInstance::SetFullscreen(bool fullscreen, bool delay_report) { if (fullscreen == IsFullscreenOrPending()) return; - desired_fullscreen_state_ = fullscreen; - if (fullscreen) - container_->element().requestFullScreen(); - else - container_->element().document().cancelFullScreen(); - if (!delay_report) { - ReportGeometry(); + BindGraphics(pp_instance(), 0); + VLOG(1) << "Setting fullscreen to " << (fullscreen ? "on" : "off"); + if (fullscreen) { + DCHECK(!fullscreen_container_); + fullscreen_container_ = delegate_->CreateFullscreenContainer(this); } else { - MessageLoop::current()->PostTask( + DCHECK(fullscreen_container_); + fullscreen_container_->Destroy(); + fullscreen_container_ = NULL; + fullscreen_ = false; + if (!delay_report) { + ReportGeometry(); + } else { + MessageLoop::current()->PostTask( FROM_HERE, NewRunnableMethod(this, &PluginInstance::ReportGeometry)); + } } } @@ -935,7 +963,10 @@ int32_t PluginInstance::Navigate(PPB_URLRequestInfo_Impl* request, } PluginDelegate::PlatformContext3D* PluginInstance::CreateContext3D() { - return delegate_->CreateContext3D(); + if (fullscreen_container_) + return fullscreen_container_->CreateContext3D(); + else + return delegate_->CreateContext3D(); } bool PluginInstance::PrintPDFOutput(PP_Resource print_output, @@ -1205,6 +1236,16 @@ PPB_Surface3D_Impl* PluginInstance::GetBoundSurface3D() const { } void PluginInstance::setBackingTextureId(unsigned int id) { + // If we have a full-screen container_ then the plugin is fullscreen, + // and the parent context is not the one for the browser page, but for the + // full-screen window, and so the parent texture ID doesn't correspond to + // anything in the page's context. + // + // TODO(alokp): It would be better at some point to have the equivalent + // in the FullscreenContainer so that we don't need to poll + if (fullscreen_container_) + return; + if (container_) container_->setBackingTextureId(id); } @@ -1250,6 +1291,10 @@ PP_Bool PluginInstance::BindGraphics(PP_Instance instance, return PP_TRUE; } + // Refuse to bind if we're transitioning to fullscreen. + if (fullscreen_container_ && !fullscreen_) + return PP_FALSE; + EnterResourceNoLock<PPB_Graphics2D_API> enter_2d(device, false); PPB_Graphics2D_Impl* graphics_2d = enter_2d.succeeded() ? static_cast<PPB_Graphics2D_Impl*>(enter_2d.object()) : NULL; @@ -1437,6 +1482,8 @@ void PluginInstance::SubscribeToPolicyUpdates(PP_Instance instance) { void PluginInstance::DoSetCursor(WebCursorInfo* cursor) { cursor_.reset(cursor); + if (fullscreen_container_) + fullscreen_container_->DidChangeCursor(*cursor); } } // namespace ppapi |