| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CONTENT_RENDERER_RENDER_WIDGET_FULLSCREEN_PEPPER_H_ |
| #define CONTENT_RENDERER_RENDER_WIDGET_FULLSCREEN_PEPPER_H_ |
| |
| #include "base/memory/scoped_ptr.h" |
| #include "base/memory/weak_ptr.h" |
| #include "content/common/gpu/client/webgraphicscontext3d_command_buffer_impl.h" |
| #include "content/renderer/mouse_lock_dispatcher.h" |
| #include "content/renderer/pepper/pepper_parent_context_provider.h" |
| #include "content/renderer/render_widget_fullscreen.h" |
| #include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3D.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebWidget.h" |
| #include "webkit/plugins/ppapi/fullscreen_container.h" |
| |
| class WebGraphicsContext3DCommandBufferImpl; |
| |
| namespace webkit { |
| namespace ppapi { |
| |
| class PluginInstance; |
| |
| } // namespace ppapi |
| } // namespace webkit |
| |
| // A RenderWidget that hosts a fullscreen pepper plugin. This provides a |
| // FullscreenContainer that the plugin instance can callback into to e.g. |
| // invalidate rects. |
| class RenderWidgetFullscreenPepper : |
| public RenderWidgetFullscreen, |
| public webkit::ppapi::FullscreenContainer, |
| public content::PepperParentContextProvider, |
| public WebGraphicsContext3DSwapBuffersClient { |
| public: |
| static RenderWidgetFullscreenPepper* Create( |
| int32 opener_id, |
| webkit::ppapi::PluginInstance* plugin, |
| const GURL& active_url, |
| const WebKit::WebScreenInfo& screen_info); |
| |
| // WebGraphicscontext3DSwapBuffersClient implementation |
| virtual void OnViewContextSwapBuffersPosted() OVERRIDE; |
| virtual void OnViewContextSwapBuffersComplete() OVERRIDE; |
| virtual void OnViewContextSwapBuffersAborted() OVERRIDE; |
| |
| // pepper::FullscreenContainer API. |
| virtual void Invalidate() OVERRIDE; |
| virtual void InvalidateRect(const WebKit::WebRect& rect) OVERRIDE; |
| virtual void ScrollRect(int dx, int dy, const WebKit::WebRect& rect) OVERRIDE; |
| virtual void Destroy() OVERRIDE; |
| virtual void DidChangeCursor(const WebKit::WebCursorInfo& cursor) OVERRIDE; |
| virtual webkit::ppapi::PluginDelegate::PlatformContext3D* |
| CreateContext3D() OVERRIDE; |
| virtual MouseLockDispatcher* GetMouseLockDispatcher() OVERRIDE; |
| |
| // IPC::Listener implementation. This overrides the implementation |
| // in RenderWidgetFullscreen. |
| virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE; |
| |
| WebGraphicsContext3DCommandBufferImpl* context() const { return context_; } |
| void SwapBuffers(); |
| |
| // Could be NULL when this widget is closing. |
| webkit::ppapi::PluginInstance* plugin() const { return plugin_; } |
| |
| protected: |
| RenderWidgetFullscreenPepper(webkit::ppapi::PluginInstance* plugin, |
| const GURL& active_url, |
| const WebKit::WebScreenInfo& screen_info); |
| virtual ~RenderWidgetFullscreenPepper(); |
| |
| // RenderWidget API. |
| virtual void WillInitiatePaint() OVERRIDE; |
| virtual void DidInitiatePaint() OVERRIDE; |
| virtual void DidFlushPaint() OVERRIDE; |
| virtual void Close() OVERRIDE; |
| virtual webkit::ppapi::PluginInstance* GetBitmapForOptimizedPluginPaint( |
| const gfx::Rect& paint_bounds, |
| TransportDIB** dib, |
| gfx::Rect* location, |
| gfx::Rect* clip) OVERRIDE; |
| virtual void OnResize(const gfx::Size& new_size, |
| const gfx::Rect& resizer_rect, |
| bool is_fullscreen) OVERRIDE; |
| |
| // RenderWidgetFullscreen API. |
| virtual WebKit::WebWidget* CreateWebWidget() OVERRIDE; |
| |
| // RenderWidget overrides. |
| virtual bool SupportsAsynchronousSwapBuffers() OVERRIDE; |
| |
| private: |
| // Creates the GL context for compositing. |
| void CreateContext(); |
| |
| // Initialize the GL states and resources for compositing. |
| bool InitContext(); |
| |
| // Checks (and returns) whether accelerated compositing should be on or off, |
| // and notify the browser. |
| bool CheckCompositing(); |
| |
| // Implementation of PepperParentContextProvider. |
| virtual WebGraphicsContext3DCommandBufferImpl* |
| GetParentContextForPlatformContext3D() OVERRIDE; |
| |
| // URL that is responsible for this widget, passed to ggl::CreateViewContext. |
| GURL active_url_; |
| |
| // The plugin instance this widget wraps. |
| webkit::ppapi::PluginInstance* plugin_; |
| |
| // GL context for compositing. |
| WebGraphicsContext3DCommandBufferImpl* context_; |
| unsigned int buffer_; |
| unsigned int program_; |
| |
| base::WeakPtrFactory<RenderWidgetFullscreenPepper> weak_ptr_factory_; |
| |
| scoped_ptr<MouseLockDispatcher> mouse_lock_dispatcher_; |
| |
| DISALLOW_COPY_AND_ASSIGN(RenderWidgetFullscreenPepper); |
| }; |
| |
| #endif // CONTENT_RENDERER_RENDER_WIDGET_FULLSCREEN_PEPPER_H_ |