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" 119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/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" 1658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/renderer/pepper/pepper_plugin_instance_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" 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebCursorInfo.h" 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebGraphicsContext3D.h" 23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebLayer.h" 24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebSize.h" 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebWidget.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size_conversions.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gpu_preference.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebCanvas; 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebCompositionUnderline; 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebCursorInfo; 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebGestureEvent; 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebInputEvent; 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseEvent; 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebMouseWheelEvent; 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebPoint; 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebRect; 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebSize; 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString; 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTextDirection; 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTextInputType; 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebVector; 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebWidget; 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WGC3Dintptr; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FullscreenMouseLockDispatcher : public MouseLockDispatcher { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit FullscreenMouseLockDispatcher(RenderWidgetFullscreenPepper* widget); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FullscreenMouseLockDispatcher(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MouseLockDispatcher implementation. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SendLockMouseRequest(bool unlocked_by_target) OVERRIDE; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SendUnlockMouseRequest() OVERRIDE; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetFullscreenPepper* widget_; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FullscreenMouseLockDispatcher); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebMouseEvent WebMouseEventFromGestureEvent(const WebGestureEvent& gesture) { 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebMouseEvent mouse; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (gesture.type) { 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebInputEvent::GestureScrollBegin: 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.type = WebInputEvent::MouseDown; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebInputEvent::GestureScrollUpdate: 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.type = WebInputEvent::MouseMove; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebInputEvent::GestureFlingStart: 7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (gesture.sourceDevice == blink::WebGestureDeviceTouchscreen) { 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A scroll gesture on the touchscreen may end with a GestureScrollEnd 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // when there is no velocity, or a GestureFlingStart when it has a 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // velocity. In both cases, it should end the drag that was initiated by 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the GestureScrollBegin (and subsequent GestureScrollUpdate) events. 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.type = WebInputEvent::MouseUp; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mouse; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case WebInputEvent::GestureScrollEnd: 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.type = WebInputEvent::MouseUp; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mouse.type == WebInputEvent::Undefined) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mouse; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.timeStampSeconds = gesture.timeStampSeconds; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.modifiers = gesture.modifiers | WebInputEvent::LeftButtonDown; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.button = WebMouseEvent::ButtonLeft; 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.clickCount = (mouse.type == WebInputEvent::MouseDown || 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.type == WebInputEvent::MouseUp); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.x = gesture.x; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.y = gesture.y; 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.windowX = gesture.globalX; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.windowY = gesture.globalY; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.globalX = gesture.globalX; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.globalY = gesture.globalY; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mouse; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FullscreenMouseLockDispatcher::FullscreenMouseLockDispatcher( 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetFullscreenPepper* widget) : widget_(widget) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FullscreenMouseLockDispatcher::~FullscreenMouseLockDispatcher() { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FullscreenMouseLockDispatcher::SendLockMouseRequest( 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool unlocked_by_target) { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->Send(new ViewHostMsg_LockMouse(widget_->routing_id(), false, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unlocked_by_target, true)); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FullscreenMouseLockDispatcher::SendUnlockMouseRequest() { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->Send(new ViewHostMsg_UnlockMouse(widget_->routing_id())); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebWidget that simply wraps the pepper plugin. 133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// TODO(piman): figure out IME and implement setComposition and friends if 134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// necessary. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PepperWidget : public WebWidget { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit PepperWidget(RenderWidgetFullscreenPepper* widget) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : widget_(widget) { 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PepperWidget() {} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebWidget API 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void close() { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete this; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual WebSize size() { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return size_; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void resize(const WebSize& size) { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!widget_->plugin()) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_ = size; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebRect plugin_rect(0, 0, size_.width, size_.height); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->plugin()->ViewChanged(plugin_rect, plugin_rect, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<gfx::Rect>()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->Invalidate(); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void themeChanged() { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool handleInputEvent(const WebInputEvent& event) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!widget_->plugin()) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This cursor info is ignored, we always set the cursor directly from 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RenderWidgetFullscreenPepper::DidChangeCursor. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebCursorInfo cursor; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Pepper plugins do not accept gesture events. So do not send the gesture 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // events directly to the plugin. Instead, try to convert them to equivalent 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // mouse events, and then send to the plugin. 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (WebInputEvent::isGestureEventType(event.type)) { 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool result = false; 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const WebGestureEvent* gesture_event = 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<const WebGestureEvent*>(&event); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event.type) { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebInputEvent::GestureTap: { 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebMouseEvent mouse; 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.timeStampSeconds = gesture_event->timeStampSeconds; 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.type = WebInputEvent::MouseMove; 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.modifiers = gesture_event->modifiers; 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.x = gesture_event->x; 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.y = gesture_event->y; 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.windowX = gesture_event->globalX; 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.windowY = gesture_event->globalY; 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.globalX = gesture_event->globalX; 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.globalY = gesture_event->globalY; 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.movementX = 0; 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.movementY = 0; 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result |= widget_->plugin()->HandleInputEvent(mouse, &cursor); 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.type = WebInputEvent::MouseDown; 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.button = WebMouseEvent::ButtonLeft; 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.clickCount = gesture_event->data.tap.tapCount; 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result |= widget_->plugin()->HandleInputEvent(mouse, &cursor); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mouse.type = WebInputEvent::MouseUp; 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result |= widget_->plugin()->HandleInputEvent(mouse, &cursor); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: { 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebMouseEvent mouse = WebMouseEventFromGestureEvent(*gesture_event); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (mouse.type != WebInputEvent::Undefined) 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result |= widget_->plugin()->HandleInputEvent(mouse, &cursor); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return result; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool result = widget_->plugin()->HandleInputEvent(event, &cursor); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For normal web pages, WebViewImpl does input event translations and 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // generates context menu events. Since we don't have a WebView, we need to 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // do the necessary translation ourselves. 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (WebInputEvent::isMouseEventType(event.type)) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebMouseEvent& mouse_event = 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<const WebMouseEvent&>(event); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool send_context_menu_event = false; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Mac/Linux, we handle it on mouse down. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Windows, we handle it on mouse up. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_context_menu_event = 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event.type == WebInputEvent::MouseUp && 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event.button == WebMouseEvent::ButtonRight; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_context_menu_event = 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event.type == WebInputEvent::MouseDown && 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (mouse_event.button == WebMouseEvent::ButtonRight || 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (mouse_event.button == WebMouseEvent::ButtonLeft && 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event.modifiers & WebMouseEvent::ControlKey)); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) send_context_menu_event = 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event.type == WebInputEvent::MouseDown && 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_event.button == WebMouseEvent::ButtonRight; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (send_context_menu_event) { 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebMouseEvent context_menu_event(mouse_event); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) context_menu_event.type = WebInputEvent::ContextMenu; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->plugin()->HandleInputEvent(context_menu_event, &cursor); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetFullscreenPepper* widget_; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebSize size_; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PepperWidget); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // anonymous namespace 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetFullscreenPepper* RenderWidgetFullscreenPepper::Create( 26658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch int32 opener_id, 26758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInstanceImpl* plugin, 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& active_url, 269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebScreenInfo& screen_info) { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(MSG_ROUTING_NONE, opener_id); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<RenderWidgetFullscreenPepper> widget( 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new RenderWidgetFullscreenPepper(plugin, active_url, screen_info)); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(opener_id); 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) widget->AddRef(); 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return widget.get(); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetFullscreenPepper::RenderWidgetFullscreenPepper( 27958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInstanceImpl* plugin, 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& active_url, 281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebScreenInfo& screen_info) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : RenderWidgetFullscreen(screen_info), 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) active_url_(active_url), 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_(plugin), 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_(NULL), 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_lock_dispatcher_(new FullscreenMouseLockDispatcher( 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) this)) { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderWidgetFullscreenPepper::~RenderWidgetFullscreenPepper() { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetFullscreenPepper::Invalidate() { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidateRect(gfx::Rect(size_.width(), size_.height())); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetFullscreenPepper::InvalidateRect(const blink::WebRect& rect) { 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) didInvalidateRect(rect); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetFullscreenPepper::ScrollRect( 302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int dx, int dy, const blink::WebRect& rect) { 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetFullscreenPepper::Destroy() { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This function is called by the plugin instance as it's going away, so reset 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // plugin_ to NULL to avoid calling into a dangling pointer e.g. on Close(). 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_ = NULL; 309b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 310b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // After calling Destroy(), the plugin instance assumes that the layer is not 311b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // used by us anymore, so it may destroy the layer before this object goes 312b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // away. 313b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) SetLayer(NULL); 314b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Send(new ViewHostMsg_Close(routing_id_)); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Release(); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetFullscreenPepper::DidChangeCursor( 320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebCursorInfo& cursor) { 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) didChangeCursor(cursor); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RenderWidgetFullscreenPepper::SetLayer(blink::WebLayer* layer) { 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_ = layer; 326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!layer_) { 327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (compositor_) 328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) compositor_->clearRootLayer(); 329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!layerTreeView()) 332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) initializeLayerTreeView(); 333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) layer_->setBounds(blink::WebSize(size())); 334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) layer_->setDrawsContent(true); 335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) compositor_->setDeviceScaleFactor(device_scale_factor_); 336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) compositor_->setRootLayer(*layer_); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RenderWidgetFullscreenPepper::OnMessageReceived(const IPC::Message& msg) { 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(RenderWidgetFullscreenPepper, msg) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_FORWARD(ViewMsg_LockMouse_ACK, 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_lock_dispatcher_.get(), 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseLockDispatcher::OnLockMouseACK) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_FORWARD(ViewMsg_MouseLockLost, 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mouse_lock_dispatcher_.get(), 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseLockDispatcher::OnMouseLockLost) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = false) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP() 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handled) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RenderWidgetFullscreen::OnMessageReceived(msg); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetFullscreenPepper::DidInitiatePaint() { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (plugin_) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_->ViewInitiatedPaint(); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetFullscreenPepper::DidFlushPaint() { 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (plugin_) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_->ViewFlushedPaint(); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RenderWidgetFullscreenPepper::Close() { 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the fullscreen window is closed (e.g. user pressed escape), reset to 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // normal mode. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (plugin_) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_->FlashSetFullscreen(false, false); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Call Close on the base class to destroy the WebWidget instance. 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidget::Close(); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void RenderWidgetFullscreenPepper::OnResize( 37790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const ViewMsg_Resize_Params& params) { 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_) 379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) layer_->setBounds(blink::WebSize(params.new_size)); 38090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RenderWidget::OnResize(params); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebWidget* RenderWidgetFullscreenPepper::CreateWebWidget() { 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new PepperWidget(this); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GURL RenderWidgetFullscreenPepper::GetURLForGraphicsContext3D() { 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return active_url_; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RenderWidgetFullscreenPepper::SetDeviceScaleFactor( 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float device_scale_factor) { 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidget::SetDeviceScaleFactor(device_scale_factor); 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (compositor_) 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compositor_->setDeviceScaleFactor(device_scale_factor); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 399