Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5133)

Unified Diff: chrome/renderer/render_widget_fullscreen_pepper.cc

Issue 3352019: Add fullscreen support to Pepper. (Closed) Base URL: git://git.chromium.org/chromium.git
Patch Set: git cl tree Created 10 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/renderer/render_widget_fullscreen_pepper.cc
diff --git a/chrome/renderer/render_widget_fullscreen_pepper.cc b/chrome/renderer/render_widget_fullscreen_pepper.cc
new file mode 100644
index 0000000000000000000000000000000000000000..69756da69690fadd7833388a61d74f57e8738fb4
--- /dev/null
+++ b/chrome/renderer/render_widget_fullscreen_pepper.cc
@@ -0,0 +1,211 @@
+// Copyright (c) 2010 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.
+
+#include "chrome/renderer/render_widget_fullscreen_pepper.h"
+
+#include "chrome/common/render_messages.h"
+#include "chrome/renderer/render_thread.h"
+#include "third_party/WebKit/WebKit/chromium/public/WebCursorInfo.h"
+#include "third_party/WebKit/WebKit/chromium/public/WebSize.h"
+#include "third_party/WebKit/WebKit/chromium/public/WebWidget.h"
+#include "webkit/glue/plugins/pepper_fullscreen_container.h"
+#include "webkit/glue/plugins/pepper_plugin_instance.h"
+
+using WebKit::WebCanvas;
+using WebKit::WebCompositionUnderline;
+using WebKit::WebCursorInfo;
+using WebKit::WebInputEvent;
+using WebKit::WebRect;
+using WebKit::WebSize;
+using WebKit::WebString;
+using WebKit::WebTextDirection;
+using WebKit::WebTextInputType;
+using WebKit::WebVector;
+using WebKit::WebWidget;
+
+namespace {
+
+// WebWidget that simply wraps the pepper plugin.
+class PepperWidget : public WebWidget {
+ public:
+ PepperWidget(pepper::PluginInstance* plugin,
+ RenderWidgetFullscreenPepper* widget)
+ : plugin_(plugin),
+ widget_(widget),
+ cursor_(WebCursorInfo::TypePointer) {
+ }
+
+ // WebWidget API
+ virtual void close() {
+ delete this;
+ }
+
+ virtual WebSize size() {
+ return size_;
+ }
+
+ virtual void resize(const WebSize& size) {
+ size_ = size;
+ WebRect plugin_rect(0, 0, size_.width, size_.height);
+ // TODO(piman): transparently scale the plugin instead of resizing it.
+ plugin_->ViewChanged(plugin_rect, plugin_rect);
+ widget_->GenerateFullRepaint();
+ }
+
+ virtual void layout() {
+ }
+
+ virtual void paint(WebCanvas* canvas, const WebRect& rect) {
+ if (!plugin_)
+ return;
+ WebRect plugin_rect(0, 0, size_.width, size_.height);
+ plugin_->Paint(canvas, plugin_rect, rect);
+ }
+
+ virtual void composite(bool finish) {
+ NOTIMPLEMENTED();
+ }
+
+ virtual void themeChanged() {
+ NOTIMPLEMENTED();
+ }
+
+ virtual bool handleInputEvent(const WebInputEvent& event) {
+ if (!plugin_)
+ return false;
+ return plugin_->HandleInputEvent(event, &cursor_);
+ }
+
+ virtual void mouseCaptureLost() {
+ NOTIMPLEMENTED();
+ }
+
+ virtual void setFocus(bool focus) {
+ NOTIMPLEMENTED();
+ }
+
+ virtual bool setComposition(
+ const WebString& text,
+ const WebVector<WebCompositionUnderline>& underlines,
+ int selectionStart,
+ int selectionEnd) {
+ NOTIMPLEMENTED();
+ return false;
+ }
+
+ virtual bool confirmComposition() {
+ NOTIMPLEMENTED();
+ return false;
+ }
+
+ virtual WebTextInputType textInputType() {
+ NOTIMPLEMENTED();
+ return WebKit::WebTextInputTypeNone;
+ }
+
+ virtual WebRect caretOrSelectionBounds() {
+ NOTIMPLEMENTED();
+ return WebRect();
+ }
+
+ virtual void setTextDirection(WebTextDirection) {
+ NOTIMPLEMENTED();
+ }
+
+ virtual bool isAcceleratedCompositingActive() const {
+ // TODO(piman): see if supporting accelerated compositing makes sense.
+ return false;
+ }
+
+ private:
+ pepper::PluginInstance* plugin_;
+ RenderWidgetFullscreenPepper* widget_;
+ WebSize size_;
+ WebCursorInfo cursor_;
+
+ DISALLOW_COPY_AND_ASSIGN(PepperWidget);
+};
+
+
+// A FullscreenContainer that forwards the API calls to the
+// RenderWidgetFullscreenPepper.
+class WidgetFullscreenContainer : public pepper::FullscreenContainer {
+ public:
+ explicit WidgetFullscreenContainer(RenderWidgetFullscreenPepper* widget)
+ : widget_(widget) {
+ }
+ virtual ~WidgetFullscreenContainer() { }
+
+ virtual void Invalidate() {
+ widget_->GenerateFullRepaint();
+ }
+
+ virtual void InvalidateRect(const WebKit::WebRect& rect) {
+ widget_->didInvalidateRect(rect);
+ }
+
+ virtual void Destroy() {
+ widget_->SendClose();
+ }
+
+ private:
+ RenderWidgetFullscreenPepper* widget_;
+
+ DISALLOW_COPY_AND_ASSIGN(WidgetFullscreenContainer);
+};
+
+} // anonymous namespace
+
+// static
+RenderWidgetFullscreenPepper* RenderWidgetFullscreenPepper::Create(
+ int32 opener_id, RenderThreadBase* render_thread,
+ pepper::PluginInstance* plugin) {
+ DCHECK_NE(MSG_ROUTING_NONE, opener_id);
+ scoped_refptr<RenderWidgetFullscreenPepper> widget =
+ new RenderWidgetFullscreenPepper(render_thread, plugin);
+ widget->Init(opener_id);
+ return widget.release();
+}
+
+RenderWidgetFullscreenPepper::RenderWidgetFullscreenPepper(
+ RenderThreadBase* render_thread, pepper::PluginInstance* plugin)
+ : RenderWidgetFullscreen(render_thread, WebKit::WebPopupTypeSelect),
+ plugin_(plugin),
+ container_(new WidgetFullscreenContainer(this)) {
+}
+
+RenderWidgetFullscreenPepper::~RenderWidgetFullscreenPepper() {
+}
+
+WebWidget* RenderWidgetFullscreenPepper::CreateWebWidget() {
+ return new PepperWidget(plugin_, this);
+}
+
+void RenderWidgetFullscreenPepper::Close() {
+ // If the fullscreen window is closed (e.g. user pressed escape), reset to
+ // normal mode.
+ if (plugin_)
+ plugin_->SetFullscreen(false);
+}
+
+void RenderWidgetFullscreenPepper::DidInitiatePaint() {
+ if (plugin_)
+ plugin_->ViewInitiatedPaint();
+}
+
+void RenderWidgetFullscreenPepper::DidFlushPaint() {
+ if (plugin_)
+ plugin_->ViewFlushedPaint();
+}
+
+void RenderWidgetFullscreenPepper::SendClose() {
+ // This function is called by the plugin instance as it's going away, so reset
+ // plugin_ to NULL to avoid calling into a dangling pointer e.g. on Close().
+ plugin_ = NULL;
+ Send(new ViewHostMsg_Close(routing_id_));
+}
+
+void RenderWidgetFullscreenPepper::GenerateFullRepaint() {
+ didInvalidateRect(gfx::Rect(size_.width(), size_.height()));
+}
« no previous file with comments | « chrome/renderer/render_widget_fullscreen_pepper.h ('k') | webkit/glue/plugins/pepper_fullscreen_container.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698