render_widget_fullscreen_pepper.cc revision 868fa2fe829687343ffae624259930155e16dbd8
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_widget_fullscreen_pepper.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/gpu/client/gpu_channel_host.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/view_messages.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/gpu/render_widget_compositor.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/pepper/pepper_platform_context_3d_impl.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_thread_impl.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gpu/command_buffer/client/gles2_implementation.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/platform_canvas.h"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebCanvas.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebGraphicsContext3D.h"
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebLayer.h"
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebSize.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebCursorInfo.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebWidget.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size_conversions.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gpu_preference.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/plugins/ppapi/plugin_delegate.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/plugins/ppapi/ppapi_plugin_instance.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebCanvas;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebCompositionUnderline;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebCursorInfo;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebGestureEvent;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebInputEvent;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebMouseEvent;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebMouseWheelEvent;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPoint;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebRect;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSize;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebString;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebTextDirection;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebTextInputType;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebVector;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebWidget;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WGC3Dintptr;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See third_party/WebKit/Source/WebCore/dom/WheelEvent.h.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const float kTickDivisor = 120.0f;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FullscreenMouseLockDispatcher : public MouseLockDispatcher {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit FullscreenMouseLockDispatcher(RenderWidgetFullscreenPepper* widget);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~FullscreenMouseLockDispatcher();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MouseLockDispatcher implementation.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SendLockMouseRequest(bool unlocked_by_target) OVERRIDE;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SendUnlockMouseRequest() OVERRIDE;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetFullscreenPepper* widget_;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FullscreenMouseLockDispatcher);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebMouseEvent WebMouseEventFromGestureEvent(const WebGestureEvent& gesture) {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebMouseEvent mouse;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (gesture.type) {
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case WebInputEvent::GestureScrollBegin:
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mouse.type = WebInputEvent::MouseDown;
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case WebInputEvent::GestureScrollUpdate:
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mouse.type = WebInputEvent::MouseMove;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case WebInputEvent::GestureFlingStart:
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (gesture.sourceDevice == WebGestureEvent::Touchscreen) {
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // A scroll gesture on the touchscreen may end with a GestureScrollEnd
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // when there is no velocity, or a GestureFlingStart when it has a
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // velocity. In both cases, it should end the drag that was initiated by
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // the GestureScrollBegin (and subsequent GestureScrollUpdate) events.
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mouse.type = WebInputEvent::MouseUp;
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      } else {
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return mouse;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case WebInputEvent::GestureScrollEnd:
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mouse.type = WebInputEvent::MouseUp;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (mouse.type == WebInputEvent::Undefined)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return mouse;
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mouse.timeStampSeconds = gesture.timeStampSeconds;
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mouse.modifiers = gesture.modifiers | WebInputEvent::LeftButtonDown;
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mouse.button = WebMouseEvent::ButtonLeft;
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mouse.clickCount = (mouse.type == WebInputEvent::MouseDown ||
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      mouse.type == WebInputEvent::MouseUp);
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mouse.x = gesture.x;
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mouse.y = gesture.y;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mouse.windowX = gesture.globalX;
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mouse.windowY = gesture.globalY;
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mouse.globalX = gesture.globalX;
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mouse.globalY = gesture.globalY;
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return mouse;
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FullscreenMouseLockDispatcher::FullscreenMouseLockDispatcher(
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderWidgetFullscreenPepper* widget) : widget_(widget) {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FullscreenMouseLockDispatcher::~FullscreenMouseLockDispatcher() {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FullscreenMouseLockDispatcher::SendLockMouseRequest(
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool unlocked_by_target) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget_->Send(new ViewHostMsg_LockMouse(widget_->routing_id(), false,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          unlocked_by_target, true));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FullscreenMouseLockDispatcher::SendUnlockMouseRequest() {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget_->Send(new ViewHostMsg_UnlockMouse(widget_->routing_id()));
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebWidget that simply wraps the pepper plugin.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PepperWidget : public WebWidget {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit PepperWidget(RenderWidgetFullscreenPepper* widget)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : widget_(widget) {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PepperWidget() {}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebWidget API
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void close() {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete this;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual WebSize size() {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return size_;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void willStartLiveResize() {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void resize(const WebSize& size) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!widget_->plugin())
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_ = size;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebRect plugin_rect(0, 0, size_.width, size_.height);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    widget_->plugin()->ViewChanged(plugin_rect, plugin_rect,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   std::vector<gfx::Rect>());
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    widget_->Invalidate();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void willEndLiveResize() {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void animate(double frameBeginTime) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void layout() {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void paint(WebCanvas* canvas, const WebRect& rect, PaintOptions) {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!widget_->plugin())
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SkAutoCanvasRestore auto_restore(canvas, true);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    float canvas_scale = widget_->deviceScaleFactor();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    canvas->scale(canvas_scale, canvas_scale);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebRect plugin_rect(0, 0, size_.width, size_.height);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    widget_->plugin()->Paint(canvas, plugin_rect, rect);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void setCompositorSurfaceReady() {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void composite(bool finish) {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void themeChanged() {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTIMPLEMENTED();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool handleInputEvent(const WebInputEvent& event) {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!widget_->plugin())
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This cursor info is ignored, we always set the cursor directly from
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // RenderWidgetFullscreenPepper::DidChangeCursor.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebCursorInfo cursor;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Pepper plugins do not accept gesture events. So do not send the gesture
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // events directly to the plugin. Instead, try to convert them to equivalent
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // mouse events, and then send to the plugin.
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (WebInputEvent::isGestureEventType(event.type)) {
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool result = false;
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const WebGestureEvent* gesture_event =
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          static_cast<const WebGestureEvent*>(&event);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switch (event.type) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case WebInputEvent::GestureTap: {
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          WebMouseEvent mouse;
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          mouse.timeStampSeconds = gesture_event->timeStampSeconds;
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          mouse.type = WebInputEvent::MouseMove;
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          mouse.modifiers = gesture_event->modifiers;
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          mouse.x = gesture_event->x;
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          mouse.y = gesture_event->y;
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          mouse.windowX = gesture_event->globalX;
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          mouse.windowY = gesture_event->globalY;
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          mouse.globalX = gesture_event->globalX;
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          mouse.globalY = gesture_event->globalY;
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          mouse.movementX = 0;
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          mouse.movementY = 0;
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          result |= widget_->plugin()->HandleInputEvent(mouse, &cursor);
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          mouse.type = WebInputEvent::MouseDown;
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          mouse.button = WebMouseEvent::ButtonLeft;
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          mouse.clickCount = gesture_event->data.tap.tapCount;
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          result |= widget_->plugin()->HandleInputEvent(mouse, &cursor);
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          mouse.type = WebInputEvent::MouseUp;
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          result |= widget_->plugin()->HandleInputEvent(mouse, &cursor);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        default: {
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          WebMouseEvent mouse = WebMouseEventFromGestureEvent(*gesture_event);
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          if (mouse.type != WebInputEvent::Undefined)
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            result |= widget_->plugin()->HandleInputEvent(mouse, &cursor);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          break;
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return result;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool result = widget_->plugin()->HandleInputEvent(event, &cursor);
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // For normal web pages, WebViewImpl does input event translations and
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // generates context menu events. Since we don't have a WebView, we need to
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // do the necessary translation ourselves.
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (WebInputEvent::isMouseEventType(event.type)) {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const WebMouseEvent& mouse_event =
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          reinterpret_cast<const WebMouseEvent&>(event);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool send_context_menu_event = false;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // On Mac/Linux, we handle it on mouse down.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // On Windows, we handle it on mouse up.
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      send_context_menu_event =
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          mouse_event.type == WebInputEvent::MouseUp &&
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          mouse_event.button == WebMouseEvent::ButtonRight;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      send_context_menu_event =
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          mouse_event.type == WebInputEvent::MouseDown &&
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (mouse_event.button == WebMouseEvent::ButtonRight ||
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           (mouse_event.button == WebMouseEvent::ButtonLeft &&
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            mouse_event.modifiers & WebMouseEvent::ControlKey));
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      send_context_menu_event =
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          mouse_event.type == WebInputEvent::MouseDown &&
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          mouse_event.button == WebMouseEvent::ButtonRight;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (send_context_menu_event) {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WebMouseEvent context_menu_event(mouse_event);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        context_menu_event.type = WebInputEvent::ContextMenu;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        widget_->plugin()->HandleInputEvent(context_menu_event, &cursor);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return result;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void mouseCaptureLost() {
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTIMPLEMENTED();
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void setFocus(bool focus) {
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTIMPLEMENTED();
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(piman): figure out IME and implement these if necessary.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool setComposition(
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const WebString& text,
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const WebVector<WebCompositionUnderline>& underlines,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int selectionStart,
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int selectionEnd) {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool confirmComposition() {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool compositionRange(size_t* location, size_t* length) {
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool confirmComposition(const WebString& text) {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual WebTextInputType textInputType() {
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebKit::WebTextInputTypeNone;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual WebRect caretOrSelectionBounds() {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return WebRect();
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool selectionRange(WebPoint& start, WebPoint& end) const {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool caretOrSelectionRange(size_t* location, size_t* length) {
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void setTextDirection(WebTextDirection) {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool isAcceleratedCompositingActive() const {
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return widget_->plugin() && widget_->is_compositing();
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetFullscreenPepper* widget_;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebSize size_;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PepperWidget);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // anonymous namespace
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetFullscreenPepper* RenderWidgetFullscreenPepper::Create(
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32 opener_id, webkit::ppapi::PluginInstance* plugin,
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& active_url,
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebKit::WebScreenInfo& screen_info) {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(MSG_ROUTING_NONE, opener_id);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<RenderWidgetFullscreenPepper> widget(
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new RenderWidgetFullscreenPepper(plugin, active_url, screen_info));
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  widget->Init(opener_id);
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  widget->AddRef();
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return widget.get();
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetFullscreenPepper::RenderWidgetFullscreenPepper(
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    webkit::ppapi::PluginInstance* plugin,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& active_url,
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebKit::WebScreenInfo& screen_info)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : RenderWidgetFullscreen(screen_info),
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      active_url_(active_url),
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      plugin_(plugin),
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer_(NULL),
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mouse_lock_dispatcher_(new FullscreenMouseLockDispatcher(
371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          this)) {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetFullscreenPepper::~RenderWidgetFullscreenPepper() {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetFullscreenPepper::Invalidate() {
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InvalidateRect(gfx::Rect(size_.width(), size_.height()));
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetFullscreenPepper::InvalidateRect(const WebKit::WebRect& rect) {
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  didInvalidateRect(rect);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetFullscreenPepper::ScrollRect(
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int dx, int dy, const WebKit::WebRect& rect) {
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  didScrollRect(dx, dy, rect);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetFullscreenPepper::Destroy() {
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function is called by the plugin instance as it's going away, so reset
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // plugin_ to NULL to avoid calling into a dangling pointer e.g. on Close().
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plugin_ = NULL;
394b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
395b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // After calling Destroy(), the plugin instance assumes that the layer is not
396b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // used by us anymore, so it may destroy the layer before this object goes
397b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // away.
398b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  SetLayer(NULL);
399b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new ViewHostMsg_Close(routing_id_));
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Release();
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetFullscreenPepper::DidChangeCursor(
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebKit::WebCursorInfo& cursor) {
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  didChangeCursor(cursor);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetFullscreenPepper::SetLayer(WebKit::WebLayer* layer) {
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_ = layer;
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool compositing = !!layer_;
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (compositing != is_accelerated_compositing_active_) {
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (compositing) {
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      initializeLayerTreeView();
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (!layerTreeView())
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return;
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer_->setBounds(WebKit::WebSize(size()));
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      layer_->setDrawsContent(true);
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      compositor_->setDeviceScaleFactor(device_scale_factor_);
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      compositor_->setRootLayer(*layer_);
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      didActivateCompositor(-1);
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else {
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      didDeactivateCompositor();
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetFullscreenPepper::OnMessageReceived(const IPC::Message& msg) {
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(RenderWidgetFullscreenPepper, msg)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_FORWARD(ViewMsg_LockMouse_ACK,
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        mouse_lock_dispatcher_.get(),
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MouseLockDispatcher::OnLockMouseACK)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_FORWARD(ViewMsg_MouseLockLost,
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        mouse_lock_dispatcher_.get(),
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MouseLockDispatcher::OnMouseLockLost)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (handled)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RenderWidgetFullscreen::OnMessageReceived(msg);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetFullscreenPepper::WillInitiatePaint() {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (plugin_)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    plugin_->ViewWillInitiatePaint();
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetFullscreenPepper::DidInitiatePaint() {
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (plugin_)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    plugin_->ViewInitiatedPaint();
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetFullscreenPepper::DidFlushPaint() {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (plugin_)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    plugin_->ViewFlushedPaint();
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetFullscreenPepper::Close() {
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the fullscreen window is closed (e.g. user pressed escape), reset to
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // normal mode.
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (plugin_)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    plugin_->FlashSetFullscreen(false, false);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Call Close on the base class to destroy the WebWidget instance.
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidget::Close();
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)webkit::ppapi::PluginInstance*
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetFullscreenPepper::GetBitmapForOptimizedPluginPaint(
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect& paint_bounds,
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TransportDIB** dib,
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect* location,
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gfx::Rect* clip,
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    float* scale_factor) {
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (plugin_ && plugin_->GetBitmapForOptimizedPluginPaint(
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          paint_bounds, dib, location, clip, scale_factor)) {
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return plugin_;
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void RenderWidgetFullscreenPepper::OnResize(
48590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const ViewMsg_Resize_Params& params) {
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (layer_)
48790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    layer_->setBounds(WebKit::WebSize(params.new_size));
48890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  RenderWidget::OnResize(params);
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebWidget* RenderWidgetFullscreenPepper::CreateWebWidget() {
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new PepperWidget(this);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GURL RenderWidgetFullscreenPepper::GetURLForGraphicsContext3D() {
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return active_url_;
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetFullscreenPepper::SetDeviceScaleFactor(
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    float device_scale_factor) {
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidget::SetDeviceScaleFactor(device_scale_factor);
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (compositor_)
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    compositor_->setDeviceScaleFactor(device_scale_factor);
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
507