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