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) 558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/renderer/pepper/pepper_plugin_instance_impl.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_helpers.h" 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/command_line.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/trace_event.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h" 139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/utf_offset_string_conversions.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/texture_layer.h" 20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/common/content_constants_internal.h" 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/common/content_switches.h" 2258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/public/common/page_zoom.h" 23558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/renderer/content_renderer_client.h" 24bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/common.h" 25bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/content_decryptor_delegate.h" 26bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/event_conversion.h" 27bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/fullscreen_container.h" 28bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/gfx_conversion.h" 292385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "content/renderer/pepper/host_dispatcher_wrapper.h" 30bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/host_globals.h" 31bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/message_channel.h" 32bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/npapi_glue.h" 333240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "content/renderer/pepper/pepper_browser_connection.h" 34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/renderer/pepper/pepper_file_ref_renderer_host.h" 35558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/renderer/pepper/pepper_graphics_2d_host.h" 362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "content/renderer/pepper/pepper_in_process_router.h" 37558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/renderer/pepper/pepper_platform_context_3d.h" 382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "content/renderer/pepper/pepper_url_loader_host.h" 39bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/plugin_module.h" 40bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/plugin_object.h" 41bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_buffer_impl.h" 42bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_graphics_3d_impl.h" 43bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_image_data_impl.h" 44bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppp_pdf.h" 45558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/renderer/pepper/renderer_ppapi_host_impl.h" 46bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/url_request_info_util.h" 472385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "content/renderer/pepper/url_response_info_util.h" 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/renderer/render_frame_impl.h" 49558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/renderer/render_thread_impl.h" 50558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/renderer/render_view_impl.h" 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/renderer/render_widget.h" 52558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/renderer/render_widget_fullscreen_pepper.h" 53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/renderer/sad_plugin.h" 54558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "media/base/audio_hardware_config.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_find_dev.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_zoom_dev.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppp_find_dev.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppp_selection_dev.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppp_text_input_dev.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppp_zoom_dev.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_rect.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_audio_config.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_core.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_gamepad.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp_input_event.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp_instance.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp_messaging.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp_mouse_lock.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppp_instance_private.h" 70558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "ppapi/host/ppapi_host.h" 712385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "ppapi/proxy/ppapi_messages.h" 722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "ppapi/proxy/url_loader_resource.h" 73a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "ppapi/shared_impl/ppapi_permissions.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppapi_preferences.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_gamepad_shared.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_input_event_shared.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_url_util_shared.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_view_shared.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppp_instance_combined.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/resource.h" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/scoped_pp_resource.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/time_conversion.h" 8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ppapi/shared_impl/url_request_info_data.h" 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/var.h" 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/enter.h" 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/ppb_buffer_api.h" 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "printing/metafile.h" 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "printing/metafile_skia_wrapper.h" 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/units.h" 90a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "skia/ext/platform_canvas.h" 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "skia/ext/platform_device.h" 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebCursorInfo.h" 93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebGamepads.h" 94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h" 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURL.h" 96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLError.h" 97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLRequest.h" 987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebBindings.h" 997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebCompositionUnderline.h" 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "third_party/WebKit/public/web/WebDataSource.h" 1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h" 1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebElement.h" 1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrame.h" 1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h" 1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginContainer.h" 1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPrintParams.h" 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPrintScalingOption.h" 1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebScopedUserGesture.h" 1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebSecurityOrigin.h" 1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebUserGestureIndicator.h" 1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h" 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h" 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkRect.h" 114a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "ui/gfx/image/image_skia.h" 115a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "ui/gfx/image/image_skia_rep.h" 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/range/range.h" 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect_conversions.h" 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" 1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "v8/include/v8.h" 12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/renderer/compositor_bindings/web_layer_impl.h" 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_CHROMEOS) 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes_posix.h" 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/metafile_impl.h" 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_MACOSX) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h" 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/platform_canvas.h" 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/codec/jpeg_codec.h" 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/gdi_util.h" 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::StringPrintf; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::InputEventData; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::PpapiGlobals; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::PPB_InputEvent_Shared; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::PPB_View_Shared; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::PPP_Instance_Combined; 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ppapi::Resource; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::ScopedPPResource; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::StringVar; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::TrackedCallback; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::EnterResourceNoLock; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_Buffer_API; 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ppapi::thunk::PPB_Gamepad_API; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_Graphics2D_API; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_Graphics3D_API; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_ImageData_API; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::Var; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::ArrayBufferVar; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::ViewData; 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebBindings; 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebCanvas; 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebCursorInfo; 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebDocument; 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebElement; 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebFrame; 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebInputEvent; 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebPlugin; 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebPluginContainer; 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebPrintParams; 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebPrintScalingOption; 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebScopedUserGesture; 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString; 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLError; 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLLoader; 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLLoaderClient; 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLRequest; 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLResponse; 175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebUserGestureIndicator; 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebUserGestureToken; 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebView; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochnamespace content { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Exported by pdf.dll 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef bool (*RenderPDFPageToDCProc)( 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unsigned char* pdf_buffer, int buffer_size, int page_number, HDC dc, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int dpi_x, int dpi_y, int bounds_origin_x, int bounds_origin_y, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bounds_width, int bounds_height, bool fit_to_bounds, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool stretch_to_bounds, bool keep_aspect_ratio, bool center_in_bounds, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool autorotate); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DrawEmptyRectangle(HDC dc) { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(sanjeevr): This is a temporary hack. If we output a JPEG 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the EMF, the EnumEnhMetaFile call fails in the browser 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // process. The failure also happens if we output nothing here. 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to investigate the reason for this failure and fix it. 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In the meantime this temporary hack of drawing an empty 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rectangle in the DC gets us by. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rectangle(dc, 0, 0, 0, 0); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check PP_TextInput_Type and ui::TextInputType are kept in sync. 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_NONE) == \ 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int(PP_TEXTINPUT_TYPE_NONE), mismatching_enums); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_TEXT) == \ 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int(PP_TEXTINPUT_TYPE_TEXT), mismatching_enums); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_PASSWORD) == \ 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int(PP_TEXTINPUT_TYPE_PASSWORD), mismatching_enums); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_SEARCH) == \ 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int(PP_TEXTINPUT_TYPE_SEARCH), mismatching_enums); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_EMAIL) == \ 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int(PP_TEXTINPUT_TYPE_EMAIL), mismatching_enums); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_NUMBER) == \ 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int(PP_TEXTINPUT_TYPE_NUMBER), mismatching_enums); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_TELEPHONE) == \ 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int(PP_TEXTINPUT_TYPE_TELEPHONE), mismatching_enums); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_URL) == \ 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int(PP_TEXTINPUT_TYPE_URL), mismatching_enums); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The default text input type is to regard the plugin always accept text input. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is for allowing users to use input methods even on completely-IME- 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unaware plugins (e.g., PPAPI Flash or PDF plugin for M16). 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Plugins need to explicitly opt out the text input mode if they know 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that they don't accept texts. 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ui::TextInputType kPluginDefaultTextInputType = ui::TEXT_INPUT_TYPE_TEXT; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define COMPILE_ASSERT_MATCHING_ENUM(webkit_name, np_name) \ 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(static_cast<int>(WebCursorInfo::webkit_name) \ 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) == static_cast<int>(np_name), \ 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mismatching_enums) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define COMPILE_ASSERT_PRINT_SCALING_MATCHING_ENUM(webkit_name, pp_name) \ 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(static_cast<int>(webkit_name) \ 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) == static_cast<int>(pp_name), \ 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mismatching_enums) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <embed>/<object> attributes. 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kWidth[] = "width"; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kHeight[] = "height"; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kBorder[] = "border"; // According to w3c, deprecated. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kStyle[] = "style"; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypePointer, PP_MOUSECURSOR_TYPE_POINTER); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeCross, PP_MOUSECURSOR_TYPE_CROSS); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeHand, PP_MOUSECURSOR_TYPE_HAND); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeIBeam, PP_MOUSECURSOR_TYPE_IBEAM); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeWait, PP_MOUSECURSOR_TYPE_WAIT); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeHelp, PP_MOUSECURSOR_TYPE_HELP); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeEastResize, PP_MOUSECURSOR_TYPE_EASTRESIZE); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNorthResize, PP_MOUSECURSOR_TYPE_NORTHRESIZE); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNorthEastResize, 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_NORTHEASTRESIZE); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNorthWestResize, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_NORTHWESTRESIZE); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeSouthResize, PP_MOUSECURSOR_TYPE_SOUTHRESIZE); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeSouthEastResize, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_SOUTHEASTRESIZE); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeSouthWestResize, 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_SOUTHWESTRESIZE); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeWestResize, PP_MOUSECURSOR_TYPE_WESTRESIZE); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNorthSouthResize, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_NORTHSOUTHRESIZE); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeEastWestResize, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_EASTWESTRESIZE); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNorthEastSouthWestResize, 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_NORTHEASTSOUTHWESTRESIZE); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNorthWestSouthEastResize, 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_NORTHWESTSOUTHEASTRESIZE); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeColumnResize, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_COLUMNRESIZE); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeRowResize, PP_MOUSECURSOR_TYPE_ROWRESIZE); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeMiddlePanning, 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_MIDDLEPANNING); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeEastPanning, PP_MOUSECURSOR_TYPE_EASTPANNING); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNorthPanning, 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_NORTHPANNING); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNorthEastPanning, 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_NORTHEASTPANNING); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNorthWestPanning, 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_NORTHWESTPANNING); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeSouthPanning, 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_SOUTHPANNING); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeSouthEastPanning, 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_SOUTHEASTPANNING); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeSouthWestPanning, 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_SOUTHWESTPANNING); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeWestPanning, PP_MOUSECURSOR_TYPE_WESTPANNING); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeMove, PP_MOUSECURSOR_TYPE_MOVE); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeVerticalText, 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_VERTICALTEXT); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeCell, PP_MOUSECURSOR_TYPE_CELL); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeContextMenu, PP_MOUSECURSOR_TYPE_CONTEXTMENU); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeAlias, PP_MOUSECURSOR_TYPE_ALIAS); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeProgress, PP_MOUSECURSOR_TYPE_PROGRESS); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNoDrop, PP_MOUSECURSOR_TYPE_NODROP); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeCopy, PP_MOUSECURSOR_TYPE_COPY); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNone, PP_MOUSECURSOR_TYPE_NONE); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNotAllowed, PP_MOUSECURSOR_TYPE_NOTALLOWED); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeZoomIn, PP_MOUSECURSOR_TYPE_ZOOMIN); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeZoomOut, PP_MOUSECURSOR_TYPE_ZOOMOUT); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeGrab, PP_MOUSECURSOR_TYPE_GRAB); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeGrabbing, PP_MOUSECURSOR_TYPE_GRABBING); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Do not assert WebCursorInfo::TypeCustom == PP_CURSORTYPE_CUSTOM; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PP_CURSORTYPE_CUSTOM is pinned to allow new cursor types. 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)COMPILE_ASSERT_PRINT_SCALING_MATCHING_ENUM(blink::WebPrintScalingOptionNone, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_PRINTSCALINGOPTION_NONE); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_PRINT_SCALING_MATCHING_ENUM( 310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPrintScalingOptionFitToPrintableArea, 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_PRINTSCALINGOPTION_FIT_TO_PRINTABLE_AREA); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_PRINT_SCALING_MATCHING_ENUM( 313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPrintScalingOptionSourceSize, PP_PRINTSCALINGOPTION_SOURCE_SIZE); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sets |*security_origin| to be the WebKit security origin associated with the 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// document containing the given plugin instance. On success, returns true. If 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the instance is invalid, returns false and |*security_origin| will be 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unchanged. 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SecurityOriginForInstance(PP_Instance instance_id, 320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebSecurityOrigin* security_origin) { 32158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInstanceImpl* instance = 32258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch HostGlobals::Get()->GetInstance(instance_id); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement plugin_element = instance->container()->element(); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *security_origin = plugin_element.document().securityOrigin(); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Convert the given vector to an array of C-strings. The strings in the 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// returned vector are only guaranteed valid so long as the vector of strings 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is not modified. 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<const char*[]> StringVectorToArgArray( 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::string>& vector) { 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<const char*[]> array(new const char*[vector.size()]); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < vector.size(); ++i) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) array[i] = vector[i].c_str(); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return array.Pass(); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Returns true if this is a "system reserved" key which should not be sent to 3434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// a plugin. Some poorly behaving plugins (like Flash) incorrectly report that 3444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// they handle all keys sent to them. This can prevent keystrokes from working 3454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// for things like screen brightness and volume control. 346f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool IsReservedSystemInputEvent(const blink::WebInputEvent& event) { 3474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_CHROMEOS) 3484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (event.type != WebInputEvent::KeyDown && 3494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) event.type != WebInputEvent::KeyUp) 3504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return false; 351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebKeyboardEvent& key_event = 352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static_cast<const blink::WebKeyboardEvent&>(event); 3534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) switch (key_event.windowsKeyCode) { 3544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case ui::VKEY_BRIGHTNESS_DOWN: 3554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case ui::VKEY_BRIGHTNESS_UP: 3564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case ui::VKEY_KBD_BRIGHTNESS_DOWN: 3574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case ui::VKEY_KBD_BRIGHTNESS_UP: 3584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case ui::VKEY_VOLUME_MUTE: 3594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case ui::VKEY_VOLUME_DOWN: 3604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case ui::VKEY_VOLUME_UP: 3614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 3624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) default: 3634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return false; 3644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 3654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif // defined(OS_CHROMEOS) 3664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return false; 3674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 3684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 369558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass PluginInstanceLockTarget : public MouseLockDispatcher::LockTarget { 370558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch public: 371558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PluginInstanceLockTarget(PepperPluginInstanceImpl* plugin) 372558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch : plugin_(plugin) {} 373558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 374558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual void OnLockMouseACK(bool succeeded) OVERRIDE { 375558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch plugin_->OnLockMouseACK(succeeded); 376558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 377558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 378558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual void OnMouseLockLost() OVERRIDE { 379558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch plugin_->OnMouseLockLost(); 380558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 381558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 382558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual bool HandleMouseLockedInputEvent( 383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebMouseEvent &event) OVERRIDE { 384558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch plugin_->HandleMouseLockedInputEvent(event); 385558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return true; 386558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 387558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 388558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch private: 389558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PepperPluginInstanceImpl* plugin_; 390558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}; 391558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 392558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 39658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstanceImpl* PepperPluginInstanceImpl::Create( 397a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameImpl* render_frame, 39858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PluginModule* module, 39958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch WebPluginContainer* container, 40058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const GURL& plugin_url) { 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Callback<const void*(const char*)> get_plugin_interface_func = 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PluginModule::GetPluginInterface, module); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_Instance_Combined* ppp_instance_combined = 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_Instance_Combined::Create(get_plugin_interface_func); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ppp_instance_combined) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 407a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return new PepperPluginInstanceImpl(render_frame, module, 40858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch ppp_instance_combined, container, 40958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch plugin_url); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 412ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochPepperPluginInstanceImpl::ExternalDocumentLoader::ExternalDocumentLoader() 41390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : finished_loading_(false) { 41490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 41590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 416ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochPepperPluginInstanceImpl::ExternalDocumentLoader::~ExternalDocumentLoader() { 41790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 41890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 419ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid PepperPluginInstanceImpl::ExternalDocumentLoader::ReplayReceivedData( 42090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebURLLoaderClient* document_loader) { 42190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (std::list<std::string>::iterator it = data_.begin(); 42290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) it != data_.end(); ++it) { 42390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) document_loader->didReceiveData(NULL, it->c_str(), it->length(), 42490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 0 /* encoded_data_length */); 42590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 42690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (finished_loading_) { 42790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) document_loader->didFinishLoading(NULL, 42890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 0 /* finish_time */); 42990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 43090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (error_.get()) { 43190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) document_loader->didFail(NULL, *error_); 43290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 43390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 43490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 435ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid PepperPluginInstanceImpl::ExternalDocumentLoader::didReceiveData( 43690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebURLLoader* loader, 43790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const char* data, 43890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int data_length, 43990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int encoded_data_length) { 44090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) data_.push_back(std::string(data, data_length)); 44190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 44290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 443ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid PepperPluginInstanceImpl::ExternalDocumentLoader::didFinishLoading( 44490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebURLLoader* loader, 44590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) double finish_time) { 44690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!finished_loading_); 44790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) finished_loading_ = true; 44890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 44990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 450ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid PepperPluginInstanceImpl::ExternalDocumentLoader::didFail( 45190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebURLLoader* loader, 45290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const WebURLError& error) { 45390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!error_.get()); 45490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) error_.reset(new WebURLError(error)); 45590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 45690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochPepperPluginInstanceImpl::GamepadImpl::GamepadImpl() 458ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch : Resource(ppapi::Resource::Untracked()) { 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 46158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstanceImpl::GamepadImpl::~GamepadImpl() { 462bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 463bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 46458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPPB_Gamepad_API* PepperPluginInstanceImpl::GamepadImpl::AsPPB_Gamepad_API() { 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return this; 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::GamepadImpl::Sample( 46958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Instance instance, 47058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_GamepadsSampleData* data) { 471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebGamepads webkit_data; 4723240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch RenderThreadImpl::current()->SampleGamepads(&webkit_data); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConvertWebKitGamepadData( 4744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bit_cast<ppapi::WebKitGamepads>(webkit_data), data); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstanceImpl::PepperPluginInstanceImpl( 478a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) RenderFrameImpl* render_frame, 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginModule* module, 480ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ppapi::PPP_Instance_Combined* instance_interface, 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebPluginContainer* container, 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& plugin_url) 483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : render_frame_(render_frame), 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_(module), 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_interface_(instance_interface), 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_instance_(0), 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container_(container), 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_bound_to_fullscreen_(false), 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_url_(plugin_url), 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) full_frame_(false), 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sent_initial_did_change_view_(false), 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bound_graphics_2d_platform_(NULL), 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_webkit_focus_(false), 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_content_area_focus_(false), 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_identifier_(-1), 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_find_interface_(NULL), 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_input_event_interface_(NULL), 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_messaging_interface_(NULL), 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_mouse_lock_interface_(NULL), 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_pdf_interface_(NULL), 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_private_interface_(NULL), 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_selection_interface_(NULL), 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_textinput_interface_(NULL), 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_zoom_interface_(NULL), 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checked_for_plugin_input_event_interface_(false), 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checked_for_plugin_messaging_interface_(false), 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checked_for_plugin_pdf_interface_(false), 5083240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch gamepad_impl_(new GamepadImpl()), 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_print_interface_(NULL), 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_graphics_3d_interface_(NULL), 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) always_on_top_(false), 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_container_(NULL), 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flash_fullscreen_(false), 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desired_fullscreen_state_(false), 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sad_plugin_(NULL), 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_event_mask_(0), 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filtered_input_event_mask_(0), 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_input_type_(kPluginDefaultTextInputType), 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_input_caret_(0, 0, 0, 0), 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_input_caret_bounds_(0, 0, 0, 0), 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_input_caret_set_(false), 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_caret_(0), 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_anchor_(0), 52490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) pending_user_gesture_(0.0), 52590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) document_loader_(NULL), 526ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch external_document_load_(false), 5277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch npp_(new NPP_t), 5284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) isolate_(v8::Isolate::GetCurrent()), 529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) is_deleted_(false), 530f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) view_change_weak_ptr_factory_(this), 531f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_factory_(this) { 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_instance_ = HostGlobals::Get()->AddInstance(this); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(¤t_print_settings_, 0, sizeof(current_print_settings_)); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_->InstanceCreated(this); 536d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 537a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (render_frame) { // NULL in tests 538a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame->PepperInstanceCreated(this); 539a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) view_data_.is_page_visible = !render_frame_->GetRenderWidget()->is_hidden(); 540558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 5413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Set the initial focus. 542a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetContentAreaFocus(render_frame_->GetRenderWidget()->has_focus()); 5433240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 5443240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (!module_->IsProxied()) { 5453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperBrowserConnection* browser_connection = 546a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperBrowserConnection::Get(render_frame_); 5473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch browser_connection->DidCreateInProcessInstance( 5483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch pp_instance(), 549a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame_->render_view()->GetRoutingID(), 5503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch container_->element().document().url(), 5513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch GetPluginURL()); 5523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 5533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 5543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 555558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch RendererPpapiHostImpl* host_impl = module_->renderer_ppapi_host(); 556558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch resource_creation_ = host_impl->CreateInProcessResourceCreationAPI(this); 55790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 558ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (GetContentClient()->renderer() && // NULL in unit tests. 559ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GetContentClient()->renderer()->IsExternalPepperPlugin(module->name())) 560ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch external_document_load_ = true; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstanceImpl::~PepperPluginInstanceImpl() { 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!fullscreen_container_); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Free all the plugin objects. This will automatically clear the back- 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointer from the NPObject so WebKit can't call into the plugin any more. 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Swap out the set so we can delete from it (the objects will try to 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // unregister themselves inside the delete call). 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginObjectSet plugin_object_copy; 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) live_plugin_objects_.swap(plugin_object_copy); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (PluginObjectSet::iterator i = plugin_object_copy.begin(); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != plugin_object_copy.end(); ++i) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete *i; 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (TrackedCallback::IsPending(lock_mouse_callback_)) 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_mouse_callback_->Abort(); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 580a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (render_frame_) 581a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame_->PepperInstanceDeleted(this); 5823240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 583a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!module_->IsProxied() && render_frame_) { 5843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperBrowserConnection* browser_connection = 585a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PepperBrowserConnection::Get(render_frame_); 5863240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch browser_connection->DidDeleteInProcessInstance(pp_instance()); 5873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 5883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 589558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch UnSetAndDeleteLockTargetAdapter(); 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_->InstanceDeleted(this); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we switched from the NaCl plugin module, notify it too. 592868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (original_module_.get()) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_module_->InstanceDeleted(this); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should be last since some of the above "instance deleted" calls will 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // want to look up in the global map to get info off of our object. 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostGlobals::Get()->InstanceDeleted(pp_instance_); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: Any of these methods that calls into the plugin needs to take into 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// account that the plugin may use Var to remove the <embed> from the DOM, which 60258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// will make the PepperWebPluginImpl drop its reference, usually the last one. 60358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// If a method needs to access a member of the instance after the call has 60458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// returned, then it needs to keep its own reference on the stack. 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::Delete() { 607f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) is_deleted_ = true; 608f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 61058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the MessageChannel to release its "passthrough object" which should 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // release our last reference to the "InstanceObject" and will probably 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destroy it. We want to do this prior to calling DidDestroy in case the 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destructor of the instance object tries to use the instance. 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_channel_->SetPassthroughObject(NULL); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this is a NaCl plugin instance, shut down the NaCl plugin by calling 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // its DidDestroy. Don't call DidDestroy on the untrusted plugin instance, 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since there is little that it can do at this point. 619b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (original_instance_interface_) 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_instance_interface_->DidDestroy(pp_instance()); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_interface_->DidDestroy(pp_instance()); 623b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Ensure we don't attempt to call functions on the destroyed instance. 624b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) original_instance_interface_.reset(); 625b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) instance_interface_.reset(); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fullscreen_container_) { 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_container_->Destroy(); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_container_ = NULL; 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 63158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 63258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Force-unbind any Graphics. In the case of Graphics2D, if the plugin 63358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // leaks the graphics 2D, it may actually get cleaned up after our 63458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // destruction, so we need its pointers to be up-to-date. 63558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) BindGraphics(pp_instance(), 0); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_ = NULL; 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 639f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool PepperPluginInstanceImpl::is_deleted() const { 640f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return is_deleted_; 641f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 642f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 64358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::Paint(WebCanvas* canvas, 64458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const gfx::Rect& plugin_rect, 64558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const gfx::Rect& paint_rect) { 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("ppapi", "PluginInstance::Paint"); 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (module()->is_crashed()) { 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Crashed plugin painting. 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!sad_plugin_) // Lazily initialize bitmap. 650558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch sad_plugin_ = GetContentClient()->renderer()->GetSadPluginBitmap(); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sad_plugin_) 652ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch PaintSadPlugin(canvas, plugin_rect, *sad_plugin_); 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 656558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (bound_graphics_2d_platform_) 657558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bound_graphics_2d_platform_->Paint(canvas, plugin_rect, paint_rect); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::InvalidateRect(const gfx::Rect& rect) { 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fullscreen_container_) { 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rect.IsEmpty()) 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_container_->Invalidate(); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_container_->InvalidateRect(rect); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!container_ || 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_data_.rect.size.width == 0 || view_data_.rect.size.height == 0) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // Nothing to do. 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rect.IsEmpty()) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_->invalidate(); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_->invalidateRect(rect); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 67558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (texture_layer_) { 67658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (rect.IsEmpty()) { 67758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) texture_layer_->SetNeedsDisplay(); 67858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } else { 67958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) texture_layer_->SetNeedsDisplayRect(rect); 68058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 68158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::ScrollRect(int dx, 68558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch int dy, 68658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const gfx::Rect& rect) { 68758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (texture_layer_) { 68858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) InvalidateRect(rect); 68958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } else if (fullscreen_container_) { 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_container_->ScrollRect(dx, dy, rect); 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (full_frame_ && !IsViewAccelerated()) { 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_->scrollRect(dx, dy, rect); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can't do optimized scrolling since there could be other elements on top 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of us or the view renders via the accelerated compositor which is 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // incompatible with the move and backfill scrolling model. 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidateRect(rect); 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 703577f0d8067567e25b63130cd6d3c45f50df1221aBen Murdochstatic void IgnoreCallback(unsigned, bool) {} 704577f0d8067567e25b63130cd6d3c45f50df1221aBen Murdoch 70558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::CommitBackingTexture() { 706577f0d8067567e25b63130cd6d3c45f50df1221aBen Murdoch if (!texture_layer_.get()) 707577f0d8067567e25b63130cd6d3c45f50df1221aBen Murdoch return; 708577f0d8067567e25b63130cd6d3c45f50df1221aBen Murdoch PlatformContext3D* context = bound_graphics_3d_->platform_context(); 709577f0d8067567e25b63130cd6d3c45f50df1221aBen Murdoch gpu::Mailbox mailbox; 710577f0d8067567e25b63130cd6d3c45f50df1221aBen Murdoch uint32 sync_point = 0; 711577f0d8067567e25b63130cd6d3c45f50df1221aBen Murdoch context->GetBackingMailbox(&mailbox, &sync_point); 712577f0d8067567e25b63130cd6d3c45f50df1221aBen Murdoch DCHECK(!mailbox.IsZero()); 713577f0d8067567e25b63130cd6d3c45f50df1221aBen Murdoch DCHECK_NE(sync_point, 0u); 714577f0d8067567e25b63130cd6d3c45f50df1221aBen Murdoch texture_layer_->SetTextureMailbox( 715577f0d8067567e25b63130cd6d3c45f50df1221aBen Murdoch cc::TextureMailbox(mailbox, sync_point), 716577f0d8067567e25b63130cd6d3c45f50df1221aBen Murdoch cc::SingleReleaseCallback::Create(base::Bind(&IgnoreCallback))); 717577f0d8067567e25b63130cd6d3c45f50df1221aBen Murdoch texture_layer_->SetNeedsDisplay(); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::InstanceCrashed() { 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force free all resources and vars. 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostGlobals::Get()->InstanceCrashed(pp_instance()); 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Free any associated graphics. 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetFullscreen(false); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlashSetFullscreen(false, false); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unbind current 2D or 3D graphics context. 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BindGraphics(pp_instance(), 0); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidateRect(gfx::Rect()); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 731a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame_->PluginCrashed(module_->path(), module_->GetPeerProcessId()); 732558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch UnSetAndDeleteLockTargetAdapter(); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochstatic void SetGPUHistogram(const ppapi::Preferences& prefs, 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::string>& arg_names, 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::string>& arg_values) { 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calculate a histogram to let us determine how likely people are to try to 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // run Stage3D content on machines that have it blacklisted. 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool needs_gpu = false; 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_xp = base::win::GetVersion() <= base::win::VERSION_XP; 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arg_names.size(); i++) { 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (arg_names[i] == "wmode") { 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In theory content other than Flash could have a "wmode" argument, 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // but that's pretty unlikely. 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (arg_values[i] == "direct" || arg_values[i] == "gpu") 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) needs_gpu = true; 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 0 : No 3D content and GPU is blacklisted 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1 : No 3D content and GPU is not blacklisted 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2 : 3D content but GPU is blacklisted 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3 : 3D content and GPU is not blacklisted 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 4 : No 3D content and GPU is blacklisted on XP 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 5 : No 3D content and GPU is not blacklisted on XP 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 6 : 3D content but GPU is blacklisted on XP 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 7 : 3D content and GPU is not blacklisted on XP 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Flash.UsesGPU", 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_xp * 4 + needs_gpu * 2 + prefs.is_webgl_supported, 8); 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::Initialize( 76758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const std::vector<std::string>& arg_names, 76858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const std::vector<std::string>& arg_values, 76958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch bool full_frame) { 77090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) message_channel_.reset(new MessageChannel(this)); 77190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) full_frame_ = full_frame; 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateTouchEventRequest(); 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container_->setWantsWheelEvents(IsAcceptingWheelEvents()); 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 777a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetGPUHistogram(ppapi::Preferences( 778a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame_->render_view()->webkit_preferences()), 779a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) arg_names, arg_values); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argn_ = arg_names; 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argv_ = arg_values; 783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<const char*[]> argn_array(StringVectorToArgArray(argn_)); 784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<const char*[]> argv_array(StringVectorToArgArray(argv_)); 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool success = PP_ToBool(instance_interface_->DidCreate(pp_instance(), 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) argn_.size(), 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) argn_array.get(), 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) argv_array.get())); 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (success) 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_channel_->StopQueueingJavaScriptMessages(); 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return success; 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::HandleDocumentLoad( 795f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLResponse& response) { 79690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!document_loader_); 797ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (external_document_load_) { 798ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // The external proxy isn't available, so save the response and record 799ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // document load notifications for later replay. 800ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch external_document_response_ = response; 801ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch external_document_loader_.reset(new ExternalDocumentLoader()); 802ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch document_loader_ = external_document_loader_.get(); 8032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return true; 8042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 8052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 8062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (module()->is_crashed()) { 8072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Don't create a resource for a crashed plugin. 8082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch container()->element().document().frame()->stopLoading(); 8092385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return false; 81090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 8112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 8122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch DCHECK(!document_loader_); 8132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 8142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Create a loader resource host for this load. Note that we have to set 8152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // the document_loader before issuing the in-process 8162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // PPP_Instance.HandleDocumentLoad call below, since this may reentrantly 8172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // call into the instance and expect it to be valid. 8182385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch RendererPpapiHostImpl* host_impl = module_->renderer_ppapi_host(); 8192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch PepperURLLoaderHost* loader_host = 8202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch new PepperURLLoaderHost(host_impl, true, pp_instance(), 0); 8212385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // TODO(teravest): Remove set_document_loader() from instance and clean up 8222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // this relationship. 8232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch set_document_loader(loader_host); 8242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch loader_host->didReceiveResponse(NULL, response); 8252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 8262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // This host will be pending until the resource object attaches to it. 8272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // 8282385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // PpapiHost now owns the pointer to loader_host, so we don't have to worry 8292385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // about managing it. 8302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch int pending_host_id = host_impl->GetPpapiHost()->AddPendingResourceHost( 8312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch scoped_ptr<ppapi::host::ResourceHost>(loader_host)); 8322385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch DCHECK(pending_host_id); 8332385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 8342385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch DataFromWebURLResponse( 835d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) host_impl, 8362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch pp_instance(), 8372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch response, 8382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::Bind(&PepperPluginInstanceImpl::DidDataFromWebURLResponse, 839f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_factory_.GetWeakPtr(), 8402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch response, 8412385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch pending_host_id)); 8422385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 8432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // If the load was not abandoned, document_loader_ will now be set. It's 8442385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // possible that the load was canceled by now and document_loader_ was 8452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // already nulled out. 84690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return true; 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::SendCompositionEventToPlugin( 850bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch PP_InputEvent_Type type, const base::string16& text) { 851f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<blink::WebCompositionUnderline> empty; 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SendCompositionEventWithUnderlineInformationToPlugin( 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type, text, empty, static_cast<int>(text.size()), 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(text.size())); 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl:: 85858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch SendCompositionEventWithUnderlineInformationToPlugin( 85958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_InputEvent_Type type, 86058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const base::string16& text, 861f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::vector<blink::WebCompositionUnderline>& underlines, 86258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch int selection_start, 86358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch int selection_end) { 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 86558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadInputEventInterface()) 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_InputEvent_Class event_class = PP_INPUTEVENT_CLASS_IME; 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(filtered_input_event_mask_ & event_class) && 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !(input_event_mask_ & event_class)) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ppapi::InputEventData event; 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.event_type = type; 877ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch event.event_time_stamp = ppapi::TimeTicksToPPTimeTicks( 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks::Now()); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert UTF16 text to UTF8 with offset conversion. 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<size_t> utf16_offsets; 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utf16_offsets.push_back(selection_start); 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utf16_offsets.push_back(selection_end); 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < underlines.size(); ++i) { 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utf16_offsets.push_back(underlines[i].startOffset); 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utf16_offsets.push_back(underlines[i].endOffset); 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<size_t> utf8_offsets(utf16_offsets); 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.character_text = base::UTF16ToUTF8AndAdjustOffsets(text, &utf8_offsets); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the converted selection range. 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.composition_selection_start = (utf8_offsets[0] == std::string::npos ? 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.character_text.size() : utf8_offsets[0]); 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.composition_selection_end = (utf8_offsets[1] == std::string::npos ? 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.character_text.size() : utf8_offsets[1]); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the converted segmentation points. 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Be sure to add 0 and size(), and remove duplication or errors. 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<size_t> offset_set(utf8_offsets.begin()+2, utf8_offsets.end()); 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset_set.insert(0); 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset_set.insert(event.character_text.size()); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset_set.erase(std::string::npos); 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.composition_segment_offsets.assign(offset_set.begin(), 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset_set.end()); 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the composition target. 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < underlines.size(); ++i) { 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (underlines[i].thick) { 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint32_t>::iterator it = 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::find(event.composition_segment_offsets.begin(), 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.composition_segment_offsets.end(), 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utf8_offsets[2*i+2]); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it != event.composition_segment_offsets.end()) { 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.composition_target_segment = 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it - event.composition_segment_offsets.begin(); 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the event. 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = false; 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filtered_input_event_mask_ & event_class) 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.is_filtered = true; 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handled = true; // Unfiltered events are assumed to be handled. 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<PPB_InputEvent_Shared> event_resource( 928ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new PPB_InputEvent_Shared(ppapi::OBJECT_IS_IMPL, pp_instance(), event)); 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handled |= PP_ToBool(plugin_input_event_interface_->HandleInputEvent( 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_instance(), event_resource->pp_resource())); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 93458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::RequestInputEventsHelper( 93558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch uint32_t event_classes) { 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (event_classes & PP_INPUTEVENT_CLASS_TOUCH) 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateTouchEventRequest(); 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (event_classes & PP_INPUTEVENT_CLASS_WHEEL) 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container_->setWantsWheelEvents(IsAcceptingWheelEvents()); 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 94258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::HandleCompositionStart( 94358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const base::string16& text) { 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SendCompositionEventToPlugin(PP_INPUTEVENT_TYPE_IME_COMPOSITION_START, 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text); 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::HandleCompositionUpdate( 949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& text, 950f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::vector<blink::WebCompositionUnderline>& underlines, 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int selection_start, 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int selection_end) { 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SendCompositionEventWithUnderlineInformationToPlugin( 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE, 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text, underlines, selection_start, selection_end); 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::HandleCompositionEnd( 95958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const base::string16& text) { 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SendCompositionEventToPlugin(PP_INPUTEVENT_TYPE_IME_COMPOSITION_END, 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text); 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 96458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::HandleTextInput(const base::string16& text) { 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SendCompositionEventToPlugin(PP_INPUTEVENT_TYPE_IME_TEXT, 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text); 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 96958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::GetSurroundingText(base::string16* text, 97058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Range* range) const { 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<size_t> offsets; 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offsets.push_back(selection_anchor_); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offsets.push_back(selection_caret_); 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *text = base::UTF8ToUTF16AndAdjustOffsets(surrounding_text_, &offsets); 975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) range->set_start(offsets[0] == base::string16::npos ? text->size() 976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : offsets[0]); 977c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) range->set_end(offsets[1] == base::string16::npos ? text->size() 978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : offsets[1]); 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 98158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::IsPluginAcceptingCompositionEvents() const { 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (filtered_input_event_mask_ & PP_INPUTEVENT_CLASS_IME) || 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (input_event_mask_ & PP_INPUTEVENT_CLASS_IME); 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 98658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochgfx::Rect PepperPluginInstanceImpl::GetCaretBounds() const { 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!text_input_caret_set_) { 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If it is never set by the plugin, use the bottom left corner. 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect(view_data_.rect.point.x, 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_data_.rect.point.y + view_data_.rect.size.height, 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(kinaba) Take CSS transformation into accont. 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(kinaba) Take bounding_box into account. On some platforms, an 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "exclude rectangle" where candidate window must avoid the region can be 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // passed to IME. Currently, we pass only the caret rectangle because 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it is the only information supported uniformly in Chromium. 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect caret(text_input_caret_); 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) caret.Offset(view_data_.rect.point.x, view_data_.rect.point.y); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return caret; 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 100458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::HandleInputEvent( 1005f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebInputEvent& event, 100658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch WebCursorInfo* cursor_info) { 100758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch TRACE_EVENT0("ppapi", "PepperPluginInstanceImpl::HandleInputEvent"); 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1009558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (WebInputEvent::isMouseEventType(event.type)) { 1010a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame_->PepperDidReceiveMouseEvent(this); 1011558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't dispatch input events to crashed plugins. 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (module()->is_crashed()) 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Don't send reserved system key events to plugins. 10184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (IsReservedSystemInputEvent(event)) 10194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return false; 10204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 102258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool rv = false; 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (LoadInputEventInterface()) { 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_InputEvent_Class event_class = ClassifyInputEvent(event.type); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!event_class) 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((filtered_input_event_mask_ & event_class) || 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (input_event_mask_ & event_class)) { 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Actually send the event. 1033ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch std::vector< ppapi::InputEventData > events; 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateInputEventData(event, &events); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow the user gesture to be pending after the plugin handles the 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // event. This allows out-of-process plugins to respond to the user 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // gesture after processing has finished here. 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (WebUserGestureIndicator::isProcessingUserGesture()) { 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_user_gesture_ = 1041ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ppapi::EventTimeToPPTimeTicks(event.timeStampSeconds); 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_user_gesture_token_ = 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebUserGestureIndicator::currentUserGestureToken(); 10447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pending_user_gesture_token_.setOutOfProcess(); 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Each input event may generate more than one PP_InputEvent. 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < events.size(); i++) { 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filtered_input_event_mask_ & event_class) 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events[i].is_filtered = true; 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = true; // Unfiltered events are assumed to be handled. 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<PPB_InputEvent_Shared> event_resource( 1054ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new PPB_InputEvent_Shared(ppapi::OBJECT_IS_IMPL, 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_instance(), events[i])); 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv |= PP_ToBool(plugin_input_event_interface_->HandleInputEvent( 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_instance(), event_resource->pp_resource())); 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1063b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (cursor_) 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cursor_info = *cursor_; 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rv; 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 106858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::HandleMessage(PP_Var message) { 106958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch TRACE_EVENT0("ppapi", "PepperPluginInstanceImpl::HandleMessage"); 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 107158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadMessagingInterface()) 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_messaging_interface_->HandleMessage(pp_instance(), message); 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 107758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Var PepperPluginInstanceImpl::GetInstanceObject() { 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 107958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the plugin supports the private instance interface, try to retrieve its 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // instance object. 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (LoadPrivateInterface()) 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return plugin_private_interface_->GetInstanceObject(pp_instance()); 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 108858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::ViewChanged( 1089bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const gfx::Rect& position, 1090bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const gfx::Rect& clip, 1091bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const std::vector<gfx::Rect>& cut_outs_rects) { 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit can give weird (x,y) positions for empty clip rects (since the 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // position technically doesn't matter). But we want to make these 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // consistent since this is given to the plugin, so force everything to 0 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the "everything is clipped" case. 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect new_clip; 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!clip.IsEmpty()) 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_clip = clip; 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cut_outs_rects_ = cut_outs_rects; 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_data_.rect = PP_FromGfxRect(position); 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_data_.clip_rect = PP_FromGfxRect(clip); 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_data_.device_scale = container_->deviceScaleFactor(); 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_data_.css_scale = container_->pageZoomFactor() * 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_->pageScaleFactor(); 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (desired_fullscreen_state_ || view_data_.is_fullscreen) { 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement element = container_->element(); 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDocument document = element.document(); 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_fullscreen_element = (element == document.fullScreenElement()); 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!view_data_.is_fullscreen && desired_fullscreen_state_ && 1113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame()->GetRenderWidget()->is_fullscreen() && 1114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_fullscreen_element) { 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Entered fullscreen. Only possible via SetFullscreen(). 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_data_.is_fullscreen = true; 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (view_data_.is_fullscreen && !is_fullscreen_element) { 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Exited fullscreen. Possible via SetFullscreen() or F11/link, 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so desired_fullscreen_state might be out-of-date. 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desired_fullscreen_state_ = false; 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_data_.is_fullscreen = false; 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This operation will cause the plugin to re-layout which will send more 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DidChangeView updates. Schedule an asynchronous update and suppress 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notifications until that completes to avoid sending intermediate sizes 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the plugins. 11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScheduleAsyncDidChangeView(); 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset the size attributes that we hacked to fill in the screen and 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // retrigger ViewChanged. Make sure we don't forward duplicates of 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this view to the plugin. 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetSizeAttributesAfterFullscreen(); 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateFlashFullscreenState(fullscreen_container_ != NULL); 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendDidChangeView(); 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 114258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SetWebKitFocus(bool has_focus) { 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (has_webkit_focus_ == has_focus) 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool old_plugin_focus = PluginHasFocus(); 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_webkit_focus_ = has_focus; 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (PluginHasFocus() != old_plugin_focus) 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendFocusChangeNotification(); 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SetContentAreaFocus(bool has_focus) { 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (has_content_area_focus_ == has_focus) 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool old_plugin_focus = PluginHasFocus(); 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_content_area_focus_ = has_focus; 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (PluginHasFocus() != old_plugin_focus) 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendFocusChangeNotification(); 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 116258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::PageVisibilityChanged(bool is_visible) { 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_visible == view_data_.is_page_visible) 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // Nothing to do. 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_data_.is_page_visible = is_visible; 11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the initial DidChangeView notification hasn't been sent to the plugin, 11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // let it pass the visibility state for us, instead of sending a notification 116958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // immediately. It is possible that PepperPluginInstanceImpl::ViewChanged() 117058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // hasn't been called for the first time. In that case, most of the fields in 1171bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // |view_data_| haven't been properly initialized. 11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (sent_initial_did_change_view_) 11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendDidChangeView(); 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 117658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::ViewInitiatedPaint() { 1177558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (bound_graphics_2d_platform_) 1178558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bound_graphics_2d_platform_->ViewInitiatedPaint(); 1179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) else if (bound_graphics_3d_.get()) 11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bound_graphics_3d_->ViewInitiatedPaint(); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 118358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::ViewFlushedPaint() { 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 118558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 1186558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (bound_graphics_2d_platform_) 1187558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bound_graphics_2d_platform_->ViewFlushedPaint(); 1188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) else if (bound_graphics_3d_.get()) 11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bound_graphics_3d_->ViewFlushedPaint(); 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 119258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::GetBitmapForOptimizedPluginPaint( 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& paint_bounds, 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportDIB** dib, 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect* location, 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect* clip, 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float* scale_factor) { 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!always_on_top_) 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1200558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!bound_graphics_2d_platform_ || 1201558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch !bound_graphics_2d_platform_->IsAlwaysOpaque()) { 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1203558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We specifically want to compare against the area covered by the backing 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // store when seeing if we cover the given paint bounds, since the backing 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // store could be smaller than the declared plugin area. 1208558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PPB_ImageData_Impl* image_data = bound_graphics_2d_platform_->ImageData(); 1209558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // ImageDatas created by NaCl don't have a TransportDIB, so can't be 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // optimized this way. 1211558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!image_data->GetTransportDIB()) 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point plugin_origin = PP_ToGfxPoint(view_data_.rect.point); 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Vector2d plugin_offset = plugin_origin.OffsetFromOrigin(); 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert |paint_bounds| to be relative to the left-top corner of the plugin. 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect relative_paint_bounds(paint_bounds); 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relative_paint_bounds.Offset(-plugin_offset); 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect pixel_plugin_backing_store_rect( 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, image_data->width(), image_data->height()); 1222558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch float scale = bound_graphics_2d_platform_->GetScale(); 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect plugin_backing_store_rect = gfx::ToEnclosedRect( 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ScaleRect(pixel_plugin_backing_store_rect, scale)); 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect clip_page = PP_ToGfxRect(view_data_.clip_rect); 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect plugin_paint_rect = 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::IntersectRects(plugin_backing_store_rect, clip_page); 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_paint_rect.Contains(relative_paint_bounds)) 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't do optimized painting if the area to paint intersects with the 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cut-out rects, otherwise we will paint over them. 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<gfx::Rect>::const_iterator iter = cut_outs_rects_.begin(); 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != cut_outs_rects_.end(); ++iter) { 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (relative_paint_bounds.Intersects(*iter)) 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1240558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch *dib = image_data->GetTransportDIB(); 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_backing_store_rect.Offset(plugin_offset); 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *location = plugin_backing_store_rect; 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clip_page.Offset(plugin_offset); 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *clip = clip_page; 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The plugin scale factor is inverted, e.g. for a device scale factor of 2x 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the plugin scale factor is 0.5. 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *scale_factor = 1.0 / scale; 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbase::string16 PepperPluginInstanceImpl::GetSelectedText(bool html) { 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 125358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadSelectionInterface()) 1255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return base::string16(); 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var rv = plugin_selection_interface_->GetSelectedText(pp_instance(), 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_FromBool(html)); 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringVar* string = StringVar::FromPPVar(rv); 1260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 selection; 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (string) 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection = UTF8ToUTF16(string->value()); 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Release the ref the plugin transfered to us. 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostGlobals::Get()->GetVarTracker()->ReleaseVar(rv); 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return selection; 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 126858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbase::string16 PepperPluginInstanceImpl::GetLinkAtPosition( 126958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const gfx::Point& point) { 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 127158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadPdfInterface()) 1273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return base::string16(); 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Point p; 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p.x = point.x(); 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p.y = point.y(); 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var rv = plugin_pdf_interface_->GetLinkAtPosition(pp_instance(), p); 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringVar* string = StringVar::FromPPVar(rv); 1280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 link; 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (string) 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) link = UTF8ToUTF16(string->value()); 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Release the ref the plugin transfered to us. 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(rv); 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return link; 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 128858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::RequestSurroundingText( 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t desired_number_of_characters) { 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 129158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadTextInputInterface()) 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_textinput_interface_->RequestSurroundingText( 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_instance(), desired_number_of_characters); 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 129858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::Zoom(double factor, bool text_only) { 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 130058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadZoomInterface()) 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_zoom_interface_->Zoom(pp_instance(), factor, PP_FromBool(text_only)); 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 130658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::StartFind(const base::string16& search_text, 130758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch bool case_sensitive, 130858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch int identifier) { 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 131058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadFindInterface()) 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_identifier_ = identifier; 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_ToBool( 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_find_interface_->StartFind( 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_instance(), 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF16ToUTF8(search_text.c_str()).c_str(), 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_FromBool(case_sensitive))); 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 132158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SelectFindResult(bool forward) { 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 132358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (LoadFindInterface()) 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_find_interface_->SelectFindResult(pp_instance(), 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_FromBool(forward)); 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 132958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::StopFind() { 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 133158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadFindInterface()) 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_identifier_ = -1; 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_find_interface_->StopFind(pp_instance()); 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 133858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::LoadFindInterface() { 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_find_interface_) { 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_find_interface_ = 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const PPP_Find_Dev*>(module_->GetPluginInterface( 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_FIND_DEV_INTERFACE)); 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!plugin_find_interface_; 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 134858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::LoadInputEventInterface() { 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!checked_for_plugin_input_event_interface_) { 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checked_for_plugin_input_event_interface_ = true; 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_input_event_interface_ = 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const PPP_InputEvent*>(module_->GetPluginInterface( 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_INPUT_EVENT_INTERFACE)); 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!plugin_input_event_interface_; 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::LoadMessagingInterface() { 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!checked_for_plugin_messaging_interface_) { 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checked_for_plugin_messaging_interface_ = true; 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_messaging_interface_ = 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const PPP_Messaging*>(module_->GetPluginInterface( 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_MESSAGING_INTERFACE)); 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!plugin_messaging_interface_; 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 136858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::LoadMouseLockInterface() { 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_mouse_lock_interface_) { 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_mouse_lock_interface_ = 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const PPP_MouseLock*>(module_->GetPluginInterface( 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_MOUSELOCK_INTERFACE)); 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!plugin_mouse_lock_interface_; 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 137858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::LoadPdfInterface() { 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!checked_for_plugin_pdf_interface_) { 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checked_for_plugin_pdf_interface_ = true; 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_pdf_interface_ = 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const PPP_Pdf_1*>(module_->GetPluginInterface( 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_PDF_INTERFACE_1)); 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!plugin_pdf_interface_; 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 138958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::LoadPrintInterface() { 13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only check for the interface if the plugin has dev permission. 1391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!module_->permissions().HasPermission(ppapi::PERMISSION_DEV)) 13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_print_interface_) { 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_print_interface_ = static_cast<const PPP_Printing_Dev*>( 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_->GetPluginInterface(PPP_PRINTING_DEV_INTERFACE)); 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!plugin_print_interface_; 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 140058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::LoadPrivateInterface() { 1401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If this is a NaCl app, we want to talk to the trusted NaCl plugin to 1402f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // call GetInstanceObject. This is necessary to ensure that the properties 1403f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the trusted plugin exposes (readyState and lastError) work properly. Note 1404f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // that untrusted NaCl apps are not allowed to provide PPP_InstancePrivate, 1405f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // so it's correct to never look up PPP_InstancePrivate for them. 1406f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 1407f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If this is *not* a NaCl plugin, original_module_ will never be set; we talk 1408f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // to the "real" module. 1409f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<PluginModule> module = original_module_ ? original_module_ : 1410f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) module_; 14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only check for the interface if the plugin has private permission. 1412f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!module->permissions().HasPermission(ppapi::PERMISSION_PRIVATE)) 14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_private_interface_) { 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_private_interface_ = static_cast<const PPP_Instance_Private*>( 1416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) module->GetPluginInterface(PPP_INSTANCE_PRIVATE_INTERFACE)); 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!plugin_private_interface_; 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 142258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::LoadSelectionInterface() { 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_selection_interface_) { 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_selection_interface_ = 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const PPP_Selection_Dev*>(module_->GetPluginInterface( 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_SELECTION_DEV_INTERFACE)); 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!plugin_selection_interface_; 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 143158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::LoadTextInputInterface() { 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_textinput_interface_) { 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_textinput_interface_ = 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const PPP_TextInput_Dev*>(module_->GetPluginInterface( 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_TEXTINPUT_DEV_INTERFACE)); 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!plugin_textinput_interface_; 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 144158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::LoadZoomInterface() { 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_zoom_interface_) { 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_zoom_interface_ = 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const PPP_Zoom_Dev*>(module_->GetPluginInterface( 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_ZOOM_DEV_INTERFACE)); 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!plugin_zoom_interface_; 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::PluginHasFocus() const { 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return flash_fullscreen_ || (has_webkit_focus_ && has_content_area_focus_); 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SendFocusChangeNotification() { 1456424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Keep a reference on the stack. RenderViewImpl::PepperFocusChanged may 1457424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // remove the <embed> from the DOM, which will make the PepperWebPluginImpl 1458424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // drop its reference, usually the last one. This is similar to possible 1459424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // plugin behavior described at the NOTE above Delete(). 1460424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) scoped_refptr<PepperPluginInstanceImpl> ref(this); 1461424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_focus = PluginHasFocus(); 1463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame_->PepperFocusChanged(this, has_focus); 1464424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1465424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // instance_interface_ may have been cleared in Delete() if the 1466424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // PepperWebPluginImpl is destroyed. 1467424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (instance_interface_) 1468424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) instance_interface_->DidChangeFocus(pp_instance(), PP_FromBool(has_focus)); 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 147158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::UpdateTouchEventRequest() { 14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool raw_touch = (filtered_input_event_mask_ & PP_INPUTEVENT_CLASS_TOUCH) || 14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (input_event_mask_ & PP_INPUTEVENT_CLASS_TOUCH); 14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container_->requestTouchEventType(raw_touch ? 1475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPluginContainer::TouchEventRequestTypeRaw : 1476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebPluginContainer::TouchEventRequestTypeSynthesizedMouse); 14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 147958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::IsAcceptingWheelEvents() const { 14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (filtered_input_event_mask_ & PP_INPUTEVENT_CLASS_WHEEL) || 14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (input_event_mask_ & PP_INPUTEVENT_CLASS_WHEEL); 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 148458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::ScheduleAsyncDidChangeView() { 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_change_weak_ptr_factory_.HasWeakPtrs()) 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // Already scheduled. 1487b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 1488b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FROM_HERE, 148958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch base::Bind(&PepperPluginInstanceImpl::SendAsyncDidChangeView, 1490b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) view_change_weak_ptr_factory_.GetWeakPtr())); 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 149358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SendAsyncDidChangeView() { 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The bound callback that owns the weak pointer is still valid until after 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this function returns. SendDidChangeView checks HasWeakPtrs, so we need to 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // invalidate them here. 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: If we ever want to have more than one pending callback, it should 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use a different factory, or we should have a different strategy here. 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_change_weak_ptr_factory_.InvalidateWeakPtrs(); 15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendDidChangeView(); 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 150358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SendDidChangeView() { 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't send DidChangeView to crashed plugins. 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (module()->is_crashed()) 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_change_weak_ptr_factory_.HasWeakPtrs() || 15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (sent_initial_did_change_view_ && 15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_view_data_.Equals(view_data_))) 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // Nothing to update. 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sent_initial_did_change_view_ = true; 15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_view_data_ = view_data_; 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedPPResource resource( 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedPPResource::PassRef(), 1517ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch (new PPB_View_Shared(ppapi::OBJECT_IS_IMPL, 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_instance(), view_data_))->GetReference()); 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (bound_graphics_2d_platform_) 1521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bound_graphics_2d_platform_->DidChangeView(view_data_); 1522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1523f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // It's possible that Delete() has been called but the renderer hasn't 1524f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // released its reference to this object yet. 1525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (instance_interface_) { 1526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) instance_interface_->DidChangeView(pp_instance(), resource, 1527f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) &view_data_.rect, 1528f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) &view_data_.clip_rect); 1529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 153258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::ReportGeometry() { 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this call was delayed, we may have transitioned back to fullscreen in 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the mean time, so only report the geometry if we are actually in normal 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mode. 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (container_ && !fullscreen_container_ && !flash_fullscreen_) 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_->reportGeometry(); 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 154058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::GetPreferredPrintOutputFormat( 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_PrintOutputFormat_Dev* format) { 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 154358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadPrintInterface()) 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t supported_formats = 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_print_interface_->QuerySupportedFormats(pp_instance()); 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (supported_formats & PP_PRINTOUTPUTFORMAT_PDF) { 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *format = PP_PRINTOUTPUTFORMAT_PDF; 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::SupportsPrintInterface() { 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_PrintOutputFormat_Dev format; 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPreferredPrintOutputFormat(&format); 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 156058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::IsPrintScalingDisabled() { 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(plugin_print_interface_); 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_print_interface_) 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return plugin_print_interface_->IsScalingDisabled(pp_instance()) == PP_TRUE; 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 156758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochint PepperPluginInstanceImpl::PrintBegin(const WebPrintParams& print_params) { 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 156958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_PrintOutputFormat_Dev format; 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetPreferredPrintOutputFormat(&format)) { 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PrintBegin should not have been called since SupportsPrintInterface 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // would have returned false; 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_pages = 0; 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_PrintSettings_Dev print_settings; 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_settings.printable_area = PP_FromGfxRect(print_params.printableArea); 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_settings.content_area = PP_FromGfxRect(print_params.printContentArea); 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_settings.paper_size = PP_FromGfxSize(print_params.paperSize); 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_settings.dpi = print_params.printerDPI; 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_settings.orientation = PP_PRINTORIENTATION_NORMAL; 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_settings.grayscale = PP_FALSE; 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_settings.print_scaling_option = static_cast<PP_PrintScalingOption_Dev>( 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_params.printScalingOption); 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_settings.format = format; 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_pages = plugin_print_interface_->Begin(pp_instance(), 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &print_settings); 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!num_pages) 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_print_settings_ = print_settings; 159390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) canvas_.clear(); 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ranges_.clear(); 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return num_pages; 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 159858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::PrintPage(int page_number, 1599f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebCanvas* canvas) { 1600c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(ENABLE_FULL_PRINTING) 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(plugin_print_interface_); 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_PrintPageNumberRange_Dev page_range; 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_range.first_page_number = page_range.last_page_number = page_number; 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The canvas only has a metafile on it for print preview. 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool save_for_later = 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (printing::MetafileSkiaWrapper::GetMetafileFromCanvas(*canvas) != NULL); 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_WIN) 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_for_later = save_for_later && skia::IsPreviewMetafile(*canvas); 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (save_for_later) { 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ranges_.push_back(page_range); 161290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) canvas_ = skia::SharePtr(canvas); 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PrintPageHelper(&page_range, 1, canvas); 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else // defined(ENABLED_PRINTING) 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 162258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::PrintPageHelper( 1623bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch PP_PrintPageNumberRange_Dev* page_ranges, 1624bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int num_ranges, 1625f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebCanvas* canvas) { 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 162758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(plugin_print_interface_); 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_print_interface_) 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource print_output = plugin_print_interface_->PrintPages( 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_instance(), page_ranges, num_ranges); 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!print_output) 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ret = false; 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_print_settings_.format == PP_PRINTOUTPUTFORMAT_PDF) 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = PrintPDFOutput(print_output, canvas); 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now we need to release the print output resource. 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginModule::GetCore()->ReleaseResource(print_output); 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ret; 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 164758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::PrintEnd() { 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 164958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ranges_.empty()) 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintPageHelper(&(ranges_.front()), ranges_.size(), canvas_.get()); 165290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) canvas_.clear(); 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ranges_.clear(); 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(plugin_print_interface_); 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (plugin_print_interface_) 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_print_interface_->End(pp_instance()); 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(¤t_print_settings_, 0, sizeof(current_print_settings_)); 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_printed_page_ = NULL; 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_MACOSX) 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 166558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::CanRotateView() { 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadPdfInterface()) 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 167258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::RotateView(WebPlugin::RotationType type) { 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadPdfInterface()) 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_PrivatePageTransformType transform_type = 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type == WebPlugin::RotationType90Clockwise ? 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CW : 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CCW; 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_pdf_interface_->Transform(pp_instance(), transform_type); 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: plugin instance may have been deleted. 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 168358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::FlashIsFullscreenOrPending() { 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return fullscreen_container_ != NULL; 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 168758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::IsFullscreenOrPending() { 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return desired_fullscreen_state_; 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 169158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::SetFullscreen(bool fullscreen) { 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 169358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check whether we are trying to switch to the state we're already going 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to (i.e. if we're already switching to fullscreen but the fullscreen 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // container isn't ready yet, don't do anything more). 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fullscreen == IsFullscreenOrPending()) 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1701a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (fullscreen && 1702a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !render_frame_->render_view()->renderer_preferences(). 1703a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) plugin_fullscreen_allowed) 170468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return false; 170568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check whether we are trying to switch while the state is in transition. 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The 2nd request gets dropped while messing up the internal state, so 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // disallow this. 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_data_.is_fullscreen != desired_fullscreen_state_) 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fullscreen && !IsProcessingUserGesture()) 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Setting fullscreen to " << (fullscreen ? "on" : "off"); 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desired_fullscreen_state_ = fullscreen; 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fullscreen) { 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the user gesture in case we're processing one that's pending. 17202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebScopedUserGesture user_gesture(CurrentUserGestureToken()); 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit does not resize the plugin to fill the screen in fullscreen mode, 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so we will tweak plugin's attributes to support the expected behavior. 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeepSizeAttributesBeforeFullscreen(); 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetSizeAttributesForFullscreen(); 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_->element().requestFullScreen(); 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_->element().document().cancelFullScreen(); 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 173258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::UpdateFlashFullscreenState( 173358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch bool flash_fullscreen) { 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_mouselock_pending = TrackedCallback::IsPending(lock_mouse_callback_); 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flash_fullscreen == flash_fullscreen_) { 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Manually clear callback when fullscreen fails with mouselock pending. 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!flash_fullscreen && is_mouselock_pending) 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_mouse_callback_->Run(PP_ERROR_FAILED); 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 174358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) UpdateLayer(); 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool old_plugin_focus = PluginHasFocus(); 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flash_fullscreen_ = flash_fullscreen; 1747558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (is_mouselock_pending && !IsMouseLocked()) { 17482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsProcessingUserGesture() && 17492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !module_->permissions().HasPermission( 1750ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ppapi::PERMISSION_BYPASS_USER_GESTURE)) { 17512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lock_mouse_callback_->Run(PP_ERROR_NO_USER_GESTURE); 17522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 17532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Open a user gesture here so the Webkit user gesture checks will succeed 17542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // for out-of-process plugins. 17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebScopedUserGesture user_gesture(CurrentUserGestureToken()); 1756558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!LockMouse()) 17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lock_mouse_callback_->Run(PP_ERROR_FAILED); 17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (PluginHasFocus() != old_plugin_focus) 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendFocusChangeNotification(); 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 176558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::IsViewAccelerated() { 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!container_) 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDocument document = container_->element().document(); 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = document.frame(); 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame) 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebView* view = frame->view(); 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!view) 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return view->isAcceleratedCompositingActive(); 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 178058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::PrintPDFOutput(PP_Resource print_output, 1781f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebCanvas* canvas) { 1782c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(ENABLE_FULL_PRINTING) 1783ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ppapi::thunk::EnterResourceNoLock<PPB_Buffer_API> enter(print_output, true); 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BufferAutoMapper mapper(enter.object()); 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!mapper.data() || !mapper.size()) { 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For Windows, we need the PDF DLL to render the output PDF to a DC. 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HMODULE pdf_module = GetModuleHandle(L"pdf.dll"); 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pdf_module) 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderPDFPageToDCProc render_proc = 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<RenderPDFPageToDCProc>( 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProcAddress(pdf_module, "RenderPDFPageToDC")); 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!render_proc) 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ret = false; 180568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_ANDROID) 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Linux we just set the final bits in the native metafile 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (NativeMetafile and PreviewMetafile must have compatible formats, 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // i.e. both PDF for this to work). 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::Metafile* metafile = 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::MetafileSkiaWrapper::GetMetafileFromCanvas(*canvas); 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(metafile != NULL); 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (metafile) 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = metafile->InitFromData(mapper.data(), mapper.size()); 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN) 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::Metafile* metafile = 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::MetafileSkiaWrapper::GetMetafileFromCanvas(*canvas); 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (metafile) { 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only have a metafile when doing print preview, so we just want to 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pass the PDF off to preview. 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = metafile->InitFromData(mapper.data(), mapper.size()); 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Windows, we now need to render the PDF to the DC that backs the 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // supplied canvas. 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HDC dc = skia::BeginPlatformPaint(canvas); 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawEmptyRectangle(dc); 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size_in_pixels; 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_in_pixels.set_width(printing::ConvertUnit( 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_print_settings_.printable_area.size.width, 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(printing::kPointsPerInch), 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_print_settings_.dpi)); 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_in_pixels.set_height(printing::ConvertUnit( 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_print_settings_.printable_area.size.height, 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(printing::kPointsPerInch), 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_print_settings_.dpi)); 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to scale down DC to fit an entire page into DC available area. 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First, we'll try to use default scaling based on the 72dpi that is 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // used in webkit for printing. 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If default scaling is not enough to fit the entire PDF without 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Current metafile is based on screen DC and have current screen size. 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Writing outside of those boundaries will result in the cut-off output. 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On metafiles (this is the case here), scaling down will still record 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // original coordinates and we'll be able to print in full resolution. 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Before playback we'll need to counter the scaling up that will happen 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the browser (printed_document_win.cc). 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double dynamic_scale = gfx::CalculatePageScale(dc, size_in_pixels.width(), 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_in_pixels.height()); 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double page_scale = static_cast<double>(printing::kPointsPerInch) / 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<double>(current_print_settings_.dpi); 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dynamic_scale < page_scale) { 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_scale = dynamic_scale; 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::MetafileSkiaWrapper::SetCustomScaleOnCanvas(*canvas, 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_scale); 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ScaleDC(dc, page_scale); 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = render_proc(static_cast<unsigned char*>(mapper.data()), mapper.size(), 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, dc, current_print_settings_.dpi, 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_print_settings_.dpi, 0, 0, size_in_pixels.width(), 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_in_pixels.height(), true, false, true, true, true); 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) skia::EndPlatformPaint(canvas); 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ret; 1867c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#else // defined(ENABLE_FULL_PRINTING) 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 187258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::UpdateLayer() { 18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!container_) 18742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1876868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) gpu::Mailbox mailbox; 1877577f0d8067567e25b63130cd6d3c45f50df1221aBen Murdoch uint32 sync_point = 0; 18787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (bound_graphics_3d_.get()) { 1879558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PlatformContext3D* context = bound_graphics_3d_->platform_context(); 1880577f0d8067567e25b63130cd6d3c45f50df1221aBen Murdoch context->GetBackingMailbox(&mailbox, &sync_point); 1881577f0d8067567e25b63130cd6d3c45f50df1221aBen Murdoch DCHECK_EQ(mailbox.IsZero(), sync_point == 0); 1882868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 188358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool want_3d_layer = !mailbox.IsZero(); 188458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool want_2d_layer = bound_graphics_2d_platform_ && 188558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CommandLine::ForCurrentProcess()->HasSwitch( 188658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) switches::kEnableSoftwareCompositing); 188758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool want_layer = want_3d_layer || want_2d_layer; 188858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 188958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if ((want_layer == !!texture_layer_.get()) && 189058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) (want_3d_layer == layer_is_hardware_) && 1891577f0d8067567e25b63130cd6d3c45f50df1221aBen Murdoch layer_bound_to_fullscreen_ == !!fullscreen_container_) { 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1893577f0d8067567e25b63130cd6d3c45f50df1221aBen Murdoch } 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 189558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (texture_layer_) { 18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_bound_to_fullscreen_) 18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container_->setWebLayer(NULL); 18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (fullscreen_container_) 18992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_container_->SetLayer(NULL); 19002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_layer_.reset(); 19012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) texture_layer_ = NULL; 19022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (want_layer) { 190458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool opaque = false; 190558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (want_3d_layer) { 190658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(bound_graphics_3d_.get()); 190758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) texture_layer_ = cc::TextureLayer::CreateForMailbox(NULL); 190858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) opaque = bound_graphics_3d_->IsOpaque(); 190958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) texture_layer_->SetTextureMailbox( 1910577f0d8067567e25b63130cd6d3c45f50df1221aBen Murdoch cc::TextureMailbox(mailbox, sync_point), 1911d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) cc::SingleReleaseCallback::Create(base::Bind(&IgnoreCallback))); 191258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } else { 191358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(bound_graphics_2d_platform_); 191458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) texture_layer_ = cc::TextureLayer::CreateForMailbox(this); 191558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bound_graphics_2d_platform_->AttachedToNewLayer(); 191658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) opaque = bound_graphics_2d_platform_->IsAlwaysOpaque(); 191758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) texture_layer_->SetFlipped(false); 191858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 1919577f0d8067567e25b63130cd6d3c45f50df1221aBen Murdoch web_layer_.reset(new webkit::WebLayerImpl(texture_layer_)); 1920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (fullscreen_container_) { 19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_container_->SetLayer(web_layer_.get()); 1922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Ignore transparency in fullscreen, since that's what Flash always 1923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // wants to do, and that lets it not recreate a context if 1924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // wmode=transparent was specified. 1925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) texture_layer_->SetContentsOpaque(true); 1926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 19272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container_->setWebLayer(web_layer_.get()); 192858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) texture_layer_->SetContentsOpaque(opaque); 1929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_bound_to_fullscreen_ = !!fullscreen_container_; 193258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) layer_is_hardware_ = want_3d_layer; 193358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 193458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 193558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)unsigned PepperPluginInstanceImpl::PrepareTexture() { 193658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return 0; 193758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 193858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 193958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool PepperPluginInstanceImpl::PrepareTextureMailbox( 194058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) cc::TextureMailbox* mailbox, 1941d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<cc::SingleReleaseCallback>* release_callback, 194258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool use_shared_memory) { 194358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!bound_graphics_2d_platform_) 194458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return false; 1945d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return bound_graphics_2d_platform_->PrepareTextureMailbox( 1946d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) mailbox, release_callback); 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 194958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::AddPluginObject(PluginObject* plugin_object) { 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(live_plugin_objects_.find(plugin_object) == 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) live_plugin_objects_.end()); 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) live_plugin_objects_.insert(plugin_object); 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::RemovePluginObject(PluginObject* plugin_object) { 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't actually verify that the object is in the set since during module 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // deletion we'll be in the process of freeing them. 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) live_plugin_objects_.erase(plugin_object); 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 196158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::IsProcessingUserGesture() { 1962ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch PP_TimeTicks now = ppapi::TimeTicksToPPTimeTicks(base::TimeTicks::Now()); 19632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Give a lot of slack so tests won't be flaky. 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_TimeTicks kUserGestureDurationInSeconds = 10.0; 19652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pending_user_gesture_token_.hasGestures() && 19662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (now - pending_user_gesture_ < kUserGestureDurationInSeconds); 19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 196958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochWebUserGestureToken PepperPluginInstanceImpl::CurrentUserGestureToken() { 19702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsProcessingUserGesture()) 19712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_user_gesture_token_ = WebUserGestureToken(); 19722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pending_user_gesture_token_; 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 197558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::OnLockMouseACK(bool succeeded) { 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (TrackedCallback::IsPending(lock_mouse_callback_)) 19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_mouse_callback_->Run(succeeded ? PP_OK : PP_ERROR_FAILED); 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 198058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::OnMouseLockLost() { 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (LoadMouseLockInterface()) 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_mouse_lock_interface_->MouseLockLost(pp_instance()); 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 198558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::HandleMouseLockedInputEvent( 1986f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebMouseEvent& event) { 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |cursor_info| is ignored since it is hidden when the mouse is locked. 1988f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebCursorInfo cursor_info; 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleInputEvent(event, &cursor_info); 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 199258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SimulateInputEvent( 199358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const InputEventData& input_event) { 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebView* web_view = container()->element().document().frame()->view(); 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!web_view) { 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = SimulateIMEEvent(input_event); 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handled) 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<linked_ptr<WebInputEvent> > events = 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSimulatedWebInputEvents( 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_event, 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_data_.rect.point.x + view_data_.rect.size.width / 2, 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_data_.rect.point.y + view_data_.rect.size.height / 2); 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<linked_ptr<WebInputEvent> >::iterator it = events.begin(); 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != events.end(); ++it) { 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_view->handleInputEvent(*it->get()); 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 201558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::SimulateIMEEvent( 201658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const InputEventData& input_event) { 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (input_event.event_type) { 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_IME_COMPOSITION_START: 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE: 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateImeSetCompositionEvent(input_event); 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_IME_COMPOSITION_END: 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(input_event.character_text.empty()); 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateImeSetCompositionEvent(input_event); 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_IME_TEXT: 2027a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame_->SimulateImeConfirmComposition( 202858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) UTF8ToUTF16(input_event.character_text), gfx::Range()); 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 203658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SimulateImeSetCompositionEvent( 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const InputEventData& input_event) { 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<size_t> offsets; 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offsets.push_back(input_event.composition_selection_start); 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offsets.push_back(input_event.composition_selection_end); 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offsets.insert(offsets.end(), 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_event.composition_segment_offsets.begin(), 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_event.composition_segment_offsets.end()); 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 utf16_text = 20462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::UTF8ToUTF16AndAdjustOffsets(input_event.character_text, &offsets); 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2048f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<blink::WebCompositionUnderline> underlines; 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 2; i + 1 < offsets.size(); ++i) { 2050f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebCompositionUnderline underline; 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) underline.startOffset = offsets[i]; 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) underline.endOffset = offsets[i + 1]; 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input_event.composition_target_segment == static_cast<int32_t>(i - 2)) 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) underline.thick = true; 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) underlines.push_back(underline); 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2058a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame_->SimulateImeSetComposition( 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utf16_text, underlines, offsets[0], offsets[1]); 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 206258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochContentDecryptorDelegate* 206358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInstanceImpl::GetContentDecryptorDelegate() { 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content_decryptor_delegate_) 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return content_decryptor_delegate_.get(); 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PPP_ContentDecryptor_Private* plugin_decryption_interface = 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const PPP_ContentDecryptor_Private*>( 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_->GetPluginInterface( 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_CONTENTDECRYPTOR_PRIVATE_INTERFACE)); 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_decryption_interface) 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_decryptor_delegate_.reset( 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ContentDecryptorDelegate(pp_instance_, plugin_decryption_interface)); 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return content_decryptor_delegate_.get(); 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 207958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Bool PepperPluginInstanceImpl::BindGraphics(PP_Instance instance, 208058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Resource device) { 208158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch TRACE_EVENT0("ppapi", "PepperPluginInstanceImpl::BindGraphics"); 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The Graphics3D instance can't be destroyed until we call 20832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // UpdateLayer(). 2084ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scoped_refptr<ppapi::Resource> old_graphics = bound_graphics_3d_.get(); 2085868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (bound_graphics_3d_.get()) { 20862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bound_graphics_3d_->BindToInstance(false); 20872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bound_graphics_3d_ = NULL; 20882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 20892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (bound_graphics_2d_platform_) { 2090558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bound_graphics_2d_platform_->BindToInstance(NULL); 20912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bound_graphics_2d_platform_ = NULL; 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Special-case clearing the current device. 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!device) { 20962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateLayer(); 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidateRect(gfx::Rect()); 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_TRUE; 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Refuse to bind if in transition to fullscreen with PPB_FlashFullscreen or 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to/from fullscreen with PPB_Fullscreen. 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((fullscreen_container_ && !flash_fullscreen_) || 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desired_fullscreen_state_ != view_data_.is_fullscreen) 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2107558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const ppapi::host::PpapiHost* ppapi_host = 2108558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch RendererPpapiHost::GetForPPInstance(instance)->GetPpapiHost(); 2109558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ppapi::host::ResourceHost* host = ppapi_host->GetResourceHost(device); 2110558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PepperGraphics2DHost* graphics_2d = NULL; 2111558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (host) { 2112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (host->IsGraphics2DHost()) 2113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) graphics_2d = static_cast<PepperGraphics2DHost*>(host); 2114558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DLOG_IF(ERROR, !graphics_2d) << "Resource is not PepperGraphics2DHost."; 2115558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 2116558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterResourceNoLock<PPB_Graphics3D_API> enter_3d(device, false); 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPB_Graphics3D_Impl* graphics_3d = enter_3d.succeeded() ? 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<PPB_Graphics3D_Impl*>(enter_3d.object()) : NULL; 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (graphics_2d) { 2122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (graphics_2d->BindToInstance(this)) { 2123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bound_graphics_2d_platform_ = graphics_2d; 2124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateLayer(); 2125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return PP_TRUE; 2126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (graphics_3d) { 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure graphics can only be bound to the instance it is 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // associated with. 2130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (graphics_3d->pp_instance() == pp_instance() && 2131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) graphics_3d->BindToInstance(true)) { 2132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bound_graphics_3d_ = graphics_3d; 2133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateLayer(); 2134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return PP_TRUE; 2135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The instance cannot be bound or the device is not a valid resource type. 2139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return PP_FALSE; 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 214258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Bool PepperPluginInstanceImpl::IsFullFrame(PP_Instance instance) { 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FromBool(full_frame()); 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 214658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochconst ViewData* PepperPluginInstanceImpl::GetViewData(PP_Instance instance) { 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &view_data_; 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Bool PepperPluginInstanceImpl::FlashIsFullscreen(PP_Instance instance) { 21512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_FromBool(flash_fullscreen_); 21522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 21532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 215458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Var PepperPluginInstanceImpl::GetWindowObject(PP_Instance instance) { 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!container_) 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = container_->element().document().frame(); 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame) 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NPObjectToPPVar(this, frame->windowObject()); 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 216558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Var PepperPluginInstanceImpl::GetOwnerElementObject(PP_Instance instance) { 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!container_) 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NPObjectToPPVar(this, container_->scriptableObjectForElement()); 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 217158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Var PepperPluginInstanceImpl::ExecuteScript(PP_Instance instance, 217258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Var script, 217358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Var* exception) { 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Executing the script may remove the plugin from the DOM, so we need to keep 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a reference to ourselves so that we can still process the result after the 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebBindings::evaluate() below. 217758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TryCatch try_catch(exception); 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (try_catch.has_exception()) 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert the script into an inconvenient NPString object. 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringVar* script_string = StringVar::FromPPVar(script); 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!script_string) { 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try_catch.SetException("Script param to ExecuteScript must be a string."); 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPString np_script; 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) np_script.UTF8Characters = script_string->value().c_str(); 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) np_script.UTF8Length = script_string->value().length(); 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the current frame to pass to the evaluate function. 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = container_->element().document().frame(); 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame) { 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try_catch.SetException("No frame to execute script in."); 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPVariant result; 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ok = false; 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsProcessingUserGesture()) { 2202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebScopedUserGesture user_gesture(CurrentUserGestureToken()); 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ok = WebBindings::evaluate(NULL, frame->windowObject(), &np_script, 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result); 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ok = WebBindings::evaluate(NULL, frame->windowObject(), &np_script, 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result); 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ok) { 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TryCatch doesn't catch the exceptions properly. Since this is only for 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a trusted API, just set to a general exception message. 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try_catch.SetException("Exception caught"); 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebBindings::releaseVariantValue(&result); 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var ret = NPVariantToPPVar(this, &result); 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebBindings::releaseVariantValue(&result); 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ret; 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 222258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochuint32_t PepperPluginInstanceImpl::GetAudioHardwareOutputSampleRate( 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance) { 2224558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch RenderThreadImpl* thread = RenderThreadImpl::current(); 2225558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return thread->GetAudioHardwareConfig()->GetOutputSampleRate(); 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 222858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochuint32_t PepperPluginInstanceImpl::GetAudioHardwareOutputBufferSize( 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance) { 2230558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch RenderThreadImpl* thread = RenderThreadImpl::current(); 2231558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return thread->GetAudioHardwareConfig()->GetOutputBufferSize(); 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 223458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Var PepperPluginInstanceImpl::GetDefaultCharSet(PP_Instance instance) { 2235558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return StringVar::StringToPPVar( 2236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame_->render_view()->webkit_preferences().default_encoding); 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These PPB_ContentDecryptor_Private calls are responses to 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PPP_ContentDecryptor_Private calls made on |content_decryptor_delegate_|. 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Therefore, |content_decryptor_delegate_| must have been initialized when 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the following methods are called. 2243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PepperPluginInstanceImpl::SessionCreated(PP_Instance instance, 2244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) uint32_t session_id, 2245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PP_Var web_session_id_var) { 2246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content_decryptor_delegate_->OnSessionCreated(session_id, web_session_id_var); 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PepperPluginInstanceImpl::SessionMessage(PP_Instance instance, 2250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) uint32_t session_id, 2251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PP_Var message_var, 2252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) PP_Var destination_url) { 2253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content_decryptor_delegate_->OnSessionMessage( 2254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) session_id, message_var, destination_url); 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PepperPluginInstanceImpl::SessionReady(PP_Instance instance, 2258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) uint32_t session_id) { 2259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content_decryptor_delegate_->OnSessionReady(session_id); 2260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2262a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PepperPluginInstanceImpl::SessionClosed(PP_Instance instance, 2263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) uint32_t session_id) { 2264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content_decryptor_delegate_->OnSessionClosed(session_id); 2265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 2266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void PepperPluginInstanceImpl::SessionError(PP_Instance instance, 2268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) uint32_t session_id, 2269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int32_t media_error, 2270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int32_t system_code) { 2271a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content_decryptor_delegate_->OnSessionError( 2272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) session_id, media_error, system_code); 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 227558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::DeliverBlock( 227658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Instance instance, 227758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Resource decrypted_block, 227858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const PP_DecryptedBlockInfo* block_info) { 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_decryptor_delegate_->DeliverBlock(decrypted_block, block_info); 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 228258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::DecoderInitializeDone( 2283bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch PP_Instance instance, 2284bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch PP_DecryptorStreamType decoder_type, 2285bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch uint32_t request_id, 2286bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch PP_Bool success) { 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_decryptor_delegate_->DecoderInitializeDone( 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_type, request_id, success); 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 229158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::DecoderDeinitializeDone( 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DecryptorStreamType decoder_type, 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t request_id) { 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_decryptor_delegate_->DecoderDeinitializeDone(decoder_type, 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_id); 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 229958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::DecoderResetDone( 230058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Instance instance, 230158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_DecryptorStreamType decoder_type, 230258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch uint32_t request_id) { 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_decryptor_delegate_->DecoderResetDone(decoder_type, request_id); 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 230758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::DeliverFrame( 230858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Instance instance, 230958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Resource decrypted_frame, 231058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const PP_DecryptedFrameInfo* frame_info) { 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_decryptor_delegate_->DeliverFrame(decrypted_frame, frame_info); 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 231458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::DeliverSamples( 2315bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch PP_Instance instance, 2316bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch PP_Resource audio_frames, 23171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const PP_DecryptedSampleInfo* sample_info) { 23181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) content_decryptor_delegate_->DeliverSamples(audio_frames, sample_info); 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 232158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::NumberOfFindResultsChanged( 232258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Instance instance, 232358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch int32_t total, 232458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Bool final_result) { 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(find_identifier_, -1); 2326a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame_->reportFindInPageMatchCount( 2327558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch find_identifier_, total, PP_ToBool(final_result)); 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 233058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SelectedFindResultChanged(PP_Instance instance, 233158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch int32_t index) { 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(find_identifier_, -1); 2333a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame_->reportFindInPageSelection( 2334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) find_identifier_, index + 1, blink::WebRect()); 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 233758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Bool PepperPluginInstanceImpl::IsFullscreen(PP_Instance instance) { 2338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return PP_FromBool(view_data_.is_fullscreen); 2339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 234158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Bool PepperPluginInstanceImpl::SetFullscreen(PP_Instance instance, 234258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Bool fullscreen) { 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FromBool(SetFullscreen(PP_ToBool(fullscreen))); 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 234658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Bool PepperPluginInstanceImpl::GetScreenSize(PP_Instance instance, 234758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Size* size) { 2348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebScreenInfo info = render_frame()->GetRenderWidget()->screenInfo(); 2349558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch *size = PP_MakeSize(info.rect.width, info.rect.height); 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_TRUE; 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2353ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochppapi::Resource* PepperPluginInstanceImpl::GetSingletonResource( 23542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Instance instance, 2355ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ppapi::SingletonResourceID id) { 23562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Flash APIs and some others aren't implemented in-process. 23572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (id) { 2358ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case ppapi::BROKER_SINGLETON_ID: 2359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case ppapi::BROWSER_FONT_SINGLETON_ID: 2360ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case ppapi::EXTENSIONS_COMMON_SINGLETON_ID: 2361ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case ppapi::FLASH_CLIPBOARD_SINGLETON_ID: 2362ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case ppapi::FLASH_FILE_SINGLETON_ID: 2363ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case ppapi::FLASH_FULLSCREEN_SINGLETON_ID: 2364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case ppapi::FLASH_SINGLETON_ID: 2365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case ppapi::ISOLATED_FILESYSTEM_SINGLETON_ID: 2366ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case ppapi::NETWORK_PROXY_SINGLETON_ID: 2367ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case ppapi::PDF_SINGLETON_ID: 2368ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case ppapi::TRUETYPE_FONT_SINGLETON_ID: 23692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTIMPLEMENTED(); 23702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 2371ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch case ppapi::GAMEPAD_SINGLETON_ID: 2372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return gamepad_impl_.get(); 23732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 237958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochint32_t PepperPluginInstanceImpl::RequestInputEvents(PP_Instance instance, 238058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch uint32_t event_classes) { 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_event_mask_ |= event_classes; 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filtered_input_event_mask_ &= ~(event_classes); 23832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestInputEventsHelper(event_classes); 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ValidateRequestInputEvents(false, event_classes); 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 238758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochint32_t PepperPluginInstanceImpl::RequestFilteringInputEvents( 2388bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch PP_Instance instance, 2389bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch uint32_t event_classes) { 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filtered_input_event_mask_ |= event_classes; 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_event_mask_ &= ~(event_classes); 23922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestInputEventsHelper(event_classes); 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ValidateRequestInputEvents(true, event_classes); 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 239658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::ClearInputEventRequest(PP_Instance instance, 239758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch uint32_t event_classes) { 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_event_mask_ &= ~(event_classes); 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filtered_input_event_mask_ &= ~(event_classes); 24002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestInputEventsHelper(event_classes); 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 240358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::ZoomChanged(PP_Instance instance, 240458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch double factor) { 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only want to tell the page to change its zoom if the whole page is the 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // plugin. If we're in an iframe, then don't do anything. 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsFullPagePlugin()) 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 240958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch container()->zoomLevelChanged(content::ZoomFactorToZoomLevel(factor)); 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 241258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::ZoomLimitsChanged(PP_Instance instance, 241358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch double minimum_factor, 2414558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch double maximum_factor) { 2415558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (minimum_factor > maximum_factor) { 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2419558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch double minimum_level = ZoomFactorToZoomLevel(minimum_factor); 2420558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch double maximum_level = ZoomFactorToZoomLevel(maximum_factor); 2421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame_->render_view()->webview()->zoomLimitsChanged( 2422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) minimum_level, maximum_level); 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 242558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::PostMessage(PP_Instance instance, 242658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Var message) { 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_channel_->PostMessageToJavaScript(message); 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 243058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Bool PepperPluginInstanceImpl::SetCursor(PP_Instance instance, 243158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_MouseCursor_Type type, 243258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Resource image, 243358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const PP_Point* hot_spot) { 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ValidateSetCursorParams(type, image, hot_spot)) 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type != PP_MOUSECURSOR_TYPE_CUSTOM) { 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoSetCursor(new WebCursorInfo(static_cast<WebCursorInfo::Type>(type))); 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_TRUE; 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterResourceNoLock<PPB_ImageData_API> enter(image, true); 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPB_ImageData_Impl* image_data = 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<PPB_ImageData_Impl*>(enter.object()); 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ImageDataAutoMapper auto_mapper(image_data); 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!auto_mapper.is_valid()) 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebCursorInfo> custom_cursor( 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new WebCursorInfo(WebCursorInfo::TypeCustom)); 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) custom_cursor->hotSpot.x = hot_spot->x; 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) custom_cursor->hotSpot.y = hot_spot->y; 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkBitmap* bitmap = image_data->GetMappedBitmap(); 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make a deep copy, so that the cursor remains valid even after the original 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // image data gets freed. 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!bitmap->copyTo(&custom_cursor->customImage.getSkBitmap(), 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap->config())) { 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoSetCursor(custom_cursor.release()); 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_TRUE; 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 246958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochint32_t PepperPluginInstanceImpl::LockMouse( 247058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Instance instance, 247158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<TrackedCallback> callback) { 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (TrackedCallback::IsPending(lock_mouse_callback_)) 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_ERROR_INPROGRESS; 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (IsMouseLocked()) 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_OK; 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CanAccessMainFrame()) 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_ERROR_NOACCESS; 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsProcessingUserGesture()) 24822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_NO_USER_GESTURE; 24832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Attempt mouselock only if Flash isn't waiting on fullscreen, otherwise 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we wait and call LockMouse() in UpdateFlashFullscreenState(). 2486558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!FlashIsFullscreenOrPending() || flash_fullscreen_) { 24872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Open a user gesture here so the Webkit user gesture checks will succeed 24882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // for out-of-process plugins. 24892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebScopedUserGesture user_gesture(CurrentUserGestureToken()); 2490558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!LockMouse()) 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_ERROR_FAILED; 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Either mouselock succeeded or a Flash fullscreen is pending. 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_mouse_callback_ = callback; 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_OK_COMPLETIONPENDING; 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 249958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::UnlockMouse(PP_Instance instance) { 2500558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch GetMouseLockDispatcher()->UnlockMouse(GetOrCreateLockTargetAdapter()); 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 250358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SetTextInputType(PP_Instance instance, 250458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_TextInput_Type type) { 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int itype = type; 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (itype < 0 || itype > ui::TEXT_INPUT_TYPE_URL) 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) itype = ui::TEXT_INPUT_TYPE_NONE; 25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_input_type_ = static_cast<ui::TextInputType>(itype); 2509a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame_->PepperTextInputTypeChanged(this); 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 251258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::UpdateCaretPosition( 251358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Instance instance, 251458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const PP_Rect& caret, 251558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const PP_Rect& bounding_box) { 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_input_caret_ = PP_ToGfxRect(caret); 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_input_caret_bounds_ = PP_ToGfxRect(bounding_box); 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_input_caret_set_ = true; 2519a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame_->PepperCaretPositionChanged(this); 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 252258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::CancelCompositionText(PP_Instance instance) { 2523a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame_->PepperCancelComposition(this); 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 252658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SelectionChanged(PP_Instance instance) { 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(kinaba): currently the browser always calls RequestSurroundingText. 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It can be optimized so that it won't call it back until the information 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is really needed. 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Avoid calling in nested context or else this will reenter the plugin. This 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // uses a weak pointer rather than exploiting the fact that this class is 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // refcounted because we don't actually want this operation to affect the 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lifetime of the instance. 2535b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 2536b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FROM_HERE, 253758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch base::Bind(&PepperPluginInstanceImpl::RequestSurroundingText, 2538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) weak_factory_.GetWeakPtr(), 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<size_t>(kExtraCharsForTextInput))); 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 254258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::UpdateSurroundingText(PP_Instance instance, 254358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const char* text, 254458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch uint32_t caret, 254558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch uint32_t anchor) { 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surrounding_text_ = text; 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_caret_ = caret; 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_anchor_ = anchor; 2549a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame_->PepperSelectionChanged(this); 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Var PepperPluginInstanceImpl::ResolveRelativeToDocument( 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var relative, 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_URLComponents_Dev* components) { 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringVar* relative_string = StringVar::FromPPVar(relative); 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!relative_string) 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeNull(); 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement plugin_element = container()->element(); 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL document_url = plugin_element.document().baseURL(); 2562ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return ppapi::PPB_URLUtil_Shared::GenerateURLReturn( 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_url.Resolve(relative_string->value()), 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) components); 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 256758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Bool PepperPluginInstanceImpl::DocumentCanRequest(PP_Instance instance, 256858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Var url) { 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringVar* url_string = StringVar::FromPPVar(url); 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url_string) 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2573f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebSecurityOrigin security_origin; 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SecurityOriginForInstance(instance, &security_origin)) 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL gurl(url_string->value()); 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!gurl.is_valid()) 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return BoolToPPBool(security_origin.canRequest(gurl)); 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 258458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Bool PepperPluginInstanceImpl::DocumentCanAccessDocument( 258558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Instance instance, 258658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Instance target) { 2587f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebSecurityOrigin our_origin; 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SecurityOriginForInstance(instance, &our_origin)) 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebSecurityOrigin target_origin; 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SecurityOriginForInstance(instance, &target_origin)) 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return BoolToPPBool(our_origin.canAccess(target_origin)); 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 259858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Var PepperPluginInstanceImpl::GetDocumentURL( 259958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Instance instance, 260058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_URLComponents_Dev* components) { 2601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDocument document = container()->element().document(); 2602ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return ppapi::PPB_URLUtil_Shared::GenerateURLReturn(document.url(), 2603ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch components); 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 260658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Var PepperPluginInstanceImpl::GetPluginInstanceURL( 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_URLComponents_Dev* components) { 2609ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return ppapi::PPB_URLUtil_Shared::GenerateURLReturn(plugin_url_, 2610ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch components); 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 261358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)PP_Var PepperPluginInstanceImpl::GetPluginReferrerURL( 261458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PP_Instance instance, 261558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PP_URLComponents_Dev* components) { 2616f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDocument document = container()->element().document(); 261758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!full_frame_) 261858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return ppapi::PPB_URLUtil_Shared::GenerateURLReturn(document.url(), 261958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) components); 262058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebFrame* frame = document.frame(); 262158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!frame) 262258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return PP_MakeUndefined(); 262358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const WebURLRequest& request = frame->dataSource()->originalRequest(); 262458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) WebString referer = request.httpHeaderField("Referer"); 262558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (referer.isEmpty()) 262658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return PP_MakeUndefined(); 262758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return ppapi::PPB_URLUtil_Shared::GenerateURLReturn(GURL(referer), 262858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) components); 262958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 263058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 263158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_ExternalPluginResult PepperPluginInstanceImpl::ResetAsProxied( 26322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<PluginModule> module) { 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the original module and switch over to the new one now that this 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // plugin is using the IPC-based proxy. 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_module_ = module_; 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_ = module; 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Don't send any messages to the plugin until DidCreate() has finished. 26392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_channel_->QueueJavaScriptMessages(); 26402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For NaCl instances, remember the NaCl plugin instance interface, so we 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can shut it down by calling its DidDestroy in our Delete() method. 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_instance_interface_.reset(instance_interface_.release()); 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Callback<const void*(const char*)> get_plugin_interface_func = 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PluginModule::GetPluginInterface, module_.get()); 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_Instance_Combined* ppp_instance_combined = 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_Instance_Combined::Create(get_plugin_interface_func); 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ppp_instance_combined) { 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The proxy must support at least one usable PPP_Instance interface. 26512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // While this could be a failure to implement the interface in the NaCl 26522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // module, it is more likely that the NaCl process has crashed. Either 26532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // way, report that module initialization failed. 2654a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return PP_EXTERNAL_PLUGIN_ERROR_MODULE; 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_interface_.reset(ppp_instance_combined); 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear all PPP interfaces we may have cached. 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_find_interface_ = NULL; 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_input_event_interface_ = NULL; 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checked_for_plugin_input_event_interface_ = false; 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_messaging_interface_ = NULL; 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checked_for_plugin_messaging_interface_ = false; 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_mouse_lock_interface_ = NULL; 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_pdf_interface_ = NULL; 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checked_for_plugin_pdf_interface_ = false; 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_private_interface_ = NULL; 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_selection_interface_ = NULL; 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_textinput_interface_ = NULL; 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_zoom_interface_ = NULL; 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Re-send the DidCreate event via the proxy. 2673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<const char*[]> argn_array(StringVectorToArgArray(argn_)); 2674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<const char*[]> argv_array(StringVectorToArgArray(argv_)); 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_interface_->DidCreate(pp_instance(), argn_.size(), 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argn_array.get(), argv_array.get())) 2677a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return PP_EXTERNAL_PLUGIN_ERROR_INSTANCE; 26782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_channel_->StopQueueingJavaScriptMessages(); 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear sent_initial_did_change_view_ and cancel any pending DidChangeView 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // event. This way, SendDidChangeView will send the "current" view 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // immediately (before other events like HandleDocumentLoad). 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sent_initial_did_change_view_ = false; 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_change_weak_ptr_factory_.InvalidateWeakPtrs(); 26852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendDidChangeView(); 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2687ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK(external_document_load_); 2688ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch external_document_load_ = false; 2689ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch if (!external_document_response_.isNull()) { 269090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) document_loader_ = NULL; 269190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Pass the response to the new proxy. 2692ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch HandleDocumentLoad(external_document_response_); 2693f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) external_document_response_ = blink::WebURLResponse(); 269490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Replay any document load events we've received to the real loader. 2695ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch external_document_loader_->ReplayReceivedData(document_loader_); 2696ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch external_document_loader_.reset(NULL); 269790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 269890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2699a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return PP_EXTERNAL_PLUGIN_OK; 27002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 27012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 270258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::IsValidInstanceOf(PluginModule* module) { 27032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(module); 27042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return module == module_.get() || 27052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) module == original_module_.get(); 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 270858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochNPP PepperPluginInstanceImpl::instanceNPP() { 270990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return npp_.get(); 271090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 271190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 271258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstance* PepperPluginInstance::Get(PP_Instance instance_id) { 2713a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return HostGlobals::Get()->GetInstance(instance_id); 2714a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 2715a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 271658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochRenderView* PepperPluginInstanceImpl::GetRenderView() { 2717a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return render_frame_->render_view(); 2718bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 2719bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2720f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebPluginContainer* PepperPluginInstanceImpl::GetContainer() { 2721bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return container_; 2722bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 2723bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)v8::Isolate* PepperPluginInstanceImpl::GetIsolate() const { 2725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return isolate_; 2726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2727f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2728ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochppapi::VarTracker* PepperPluginInstanceImpl::GetVarTracker() { 2729a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return HostGlobals::Get()->GetVarTracker(); 2730a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 2731a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 273258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochconst GURL& PepperPluginInstanceImpl::GetPluginURL() { 2733bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return plugin_url_; 2734bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 2735bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 273658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbase::FilePath PepperPluginInstanceImpl::GetModulePath() { 2737bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return module_->path(); 2738bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 2739bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 274058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Resource PepperPluginInstanceImpl::CreateImage(gfx::ImageSkia* source_image, 274158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch float scale) { 274268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::ImageSkiaRep image_skia_rep = source_image->GetRepresentation(scale); 2743a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 274468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (image_skia_rep.is_null() || image_skia_rep.scale() != scale) 2745a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return 0; 2746a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 274758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PPB_ImageData_Impl> image_data(new PPB_ImageData_Impl( 274858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch pp_instance(), 274958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PPB_ImageData_Impl::PLATFORM)); 2750a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (!image_data->Init( 275158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PPB_ImageData_Impl::GetNativeImageDataFormat(), 2752a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch image_skia_rep.pixel_width(), 2753a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch image_skia_rep.pixel_height(), 2754a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch false)) { 2755a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return 0; 2756a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 2757a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 275858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch ImageDataAutoMapper mapper(image_data.get()); 2759a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (!mapper.is_valid()) 2760a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return 0; 2761a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 2762a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch skia::PlatformCanvas* canvas = image_data->GetPlatformCanvas(); 2763a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Note: Do not SkBitmap::copyTo the canvas bitmap directly because it will 2764a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // ignore the allocated pixels in shared memory and re-allocate a new buffer. 2765a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch canvas->writePixels(image_skia_rep.sk_bitmap(), 0, 0); 2766a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 2767a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return image_data->GetReference(); 2768a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 2769a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 277058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_ExternalPluginResult PepperPluginInstanceImpl::SwitchToOutOfProcessProxy( 2771a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch const base::FilePath& file_path, 2772ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ppapi::PpapiPermissions permissions, 2773a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch const IPC::ChannelHandle& channel_handle, 2774a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::ProcessId plugin_pid, 2775a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch int plugin_child_id) { 2776a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Create a new module for each instance of the external plugin that is using 2777a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // the IPC based out-of-process proxy. We can't use the existing module, 2778a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // because it is configured for the in-process plugin, and we must keep it 2779a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // that way to allow the page to create other instances. 278058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PluginModule> external_plugin_module( 2781a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch module_->CreateModuleForExternalPluginInstance()); 2782a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 27833240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch RendererPpapiHostImpl* renderer_ppapi_host = 27843240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch external_plugin_module->CreateOutOfProcessModule( 2785a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame_, 2786a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch file_path, 2787a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch permissions, 2788a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch channel_handle, 2789a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch plugin_pid, 27903240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch plugin_child_id, 27913240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch true); 2792a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (!renderer_ppapi_host) { 2793a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch DLOG(ERROR) << "CreateExternalPluginModule() failed"; 2794a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return PP_EXTERNAL_PLUGIN_ERROR_MODULE; 2795a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 2796a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 2797a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Finally, switch the instance to the proxy. 2798a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return external_plugin_module->InitAsProxiedExternalPlugin(this); 2799a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 2800a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 280158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SetAlwaysOnTop(bool on_top) { 2802bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch always_on_top_ = on_top; 2803bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 2804bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 280558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::DoSetCursor(WebCursorInfo* cursor) { 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cursor_.reset(cursor); 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fullscreen_container_) { 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_container_->DidChangeCursor(*cursor); 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2810a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame_->PepperDidChangeCursor(this, *cursor); 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 281458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::IsFullPagePlugin() { 2815bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebFrame* frame = container()->element().document().frame(); 2816bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return frame->view()->mainFrame()->document().isPluginDocument(); 2817bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 2818bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 281968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool PepperPluginInstanceImpl::FlashSetFullscreen(bool fullscreen, 282058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch bool delay_report) { 282158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch TRACE_EVENT0("ppapi", "PepperPluginInstanceImpl::FlashSetFullscreen"); 2822bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Keep a reference on the stack. See NOTE above. 282358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 2824bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2825bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // We check whether we are trying to switch to the state we're already going 2826bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // to (i.e. if we're already switching to fullscreen but the fullscreen 2827bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // container isn't ready yet, don't do anything more). 2828bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (fullscreen == FlashIsFullscreenOrPending()) 282968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return true; 283068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2831a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (fullscreen && 2832a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) !render_frame_->render_view()->renderer_preferences(). 2833a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) plugin_fullscreen_allowed) 283468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return false; 2835bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2836bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Unbind current 2D or 3D graphics context. 2837bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch VLOG(1) << "Setting fullscreen to " << (fullscreen ? "on" : "off"); 2838bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (fullscreen) { 2839bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DCHECK(!fullscreen_container_); 2840a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) fullscreen_container_ = 2841a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) render_frame_->CreatePepperFullscreenContainer(this); 2842bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch UpdateLayer(); 2843bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } else { 2844bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DCHECK(fullscreen_container_); 2845bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch fullscreen_container_->Destroy(); 2846bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch fullscreen_container_ = NULL; 2847bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch UpdateFlashFullscreenState(false); 2848bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!delay_report) { 2849bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ReportGeometry(); 2850bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } else { 2851bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch base::MessageLoop::current()->PostTask( 285258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch FROM_HERE, 285358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch base::Bind(&PepperPluginInstanceImpl::ReportGeometry, this)); 2854bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 2855bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 285668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 285768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return true; 2858bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 2859bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 286058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::IsRectTopmost(const gfx::Rect& rect) { 2861bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (flash_fullscreen_) 2862bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return true; 2863bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2864bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return container_->isRectTopmost(rect); 2865bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 2866bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 28672385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochint32_t PepperPluginInstanceImpl::Navigate( 2868ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const ppapi::URLRequestInfoData& request, 286958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const char* target, 28702385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch bool from_user_action) { 28712385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (!container_) 28722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return PP_ERROR_FAILED; 2873bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2874bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebDocument document = container_->element().document(); 2875bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebFrame* frame = document.frame(); 28762385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (!frame) 28772385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return PP_ERROR_FAILED; 28782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 2879ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ppapi::URLRequestInfoData completed_request = request; 28802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 28812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch WebURLRequest web_request; 2882d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!CreateWebURLRequest(pp_instance_, 2883d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) &completed_request, 2884d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) frame, 2885d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) &web_request)) { 28862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return PP_ERROR_FAILED; 2887d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 28882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch web_request.setFirstPartyForCookies(document.firstPartyForCookies()); 28892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch web_request.setHasUserGesture(from_user_action); 28902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 28912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch GURL gurl(web_request.url()); 28922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (gurl.SchemeIs("javascript")) { 28932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // In imitation of the NPAPI implementation, only |target_frame == frame| is 28942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // allowed for security reasons. 28952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch WebFrame* target_frame = 28962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch frame->view()->findFrameByName(WebString::fromUTF8(target), frame); 28972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (target_frame != frame) 28982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return PP_ERROR_NOACCESS; 28992385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 29002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // TODO(viettrungluu): NPAPI sends the result back to the plugin -- do we 29012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // need that? 29022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch WebString result = container_->executeScriptURL(gurl, from_user_action); 29032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return result.isNull() ? PP_ERROR_FAILED : PP_OK; 2904bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 2905bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 29062385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Only GETs and POSTs are supported. 29072385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (web_request.httpMethod() != "GET" && 29082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch web_request.httpMethod() != "POST") 29092385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return PP_ERROR_BADARGUMENT; 2910bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 29112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch WebString target_str = WebString::fromUTF8(target); 29122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch container_->loadFrameRequest(web_request, target_str, false, NULL); 29132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return PP_OK; 2914bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 2915bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2916d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)int PepperPluginInstanceImpl::MakePendingFileRefRendererHost( 2917d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const base::FilePath& path) { 2918d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RendererPpapiHostImpl* host_impl = module_->renderer_ppapi_host(); 2919d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) PepperFileRefRendererHost* file_ref_host( 2920d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) new PepperFileRefRendererHost(host_impl, pp_instance(), 0, path)); 2921d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return host_impl->GetPpapiHost()->AddPendingResourceHost( 2922d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<ppapi::host::ResourceHost>(file_ref_host)); 2923d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 2924d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2925f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PepperPluginInstanceImpl::SetEmbedProperty(PP_Var key, 2926f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PP_Var value) { 2927f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) message_channel_->SetReadOnlyProperty(key, value); 2928f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2929f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 293058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::CanAccessMainFrame() const { 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!container_) 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2933f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDocument containing_document = container_->element().document(); 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!containing_document.frame() || 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !containing_document.frame()->view() || 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !containing_document.frame()->view()->mainFrame()) { 29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2940f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDocument main_document = 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) containing_document.frame()->view()->mainFrame()->document(); 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return containing_document.securityOrigin().canAccess( 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_document.securityOrigin()); 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 294758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::KeepSizeAttributesBeforeFullscreen() { 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement element = container_->element(); 29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) width_before_fullscreen_ = element.getAttribute(WebString::fromUTF8(kWidth)); 29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) height_before_fullscreen_ = 29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element.getAttribute(WebString::fromUTF8(kHeight)); 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) border_before_fullscreen_ = 29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element.getAttribute(WebString::fromUTF8(kBorder)); 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style_before_fullscreen_ = element.getAttribute(WebString::fromUTF8(kStyle)); 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SetSizeAttributesForFullscreen() { 2958a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blink::WebScreenInfo info = render_frame_->GetRenderWidget()->screenInfo(); 2959558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch screen_size_for_fullscreen_ = gfx::Size(info.rect.width, info.rect.height); 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string width = StringPrintf("%d", screen_size_for_fullscreen_.width()); 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string height = StringPrintf("%d", screen_size_for_fullscreen_.height()); 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement element = container_->element(); 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element.setAttribute(WebString::fromUTF8(kWidth), WebString::fromUTF8(width)); 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element.setAttribute(WebString::fromUTF8(kHeight), 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString::fromUTF8(height)); 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element.setAttribute(WebString::fromUTF8(kBorder), WebString::fromUTF8("0")); 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There should be no style settings that matter in fullscreen mode, 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so just replace them instead of appending. 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: "position: fixed" and "display: block" reset the plugin and 29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // using %% settings might not work without them (e.g. if the plugin is a 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // child of a container element). 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string style; 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style += StringPrintf("width: %s !important; ", width.c_str()); 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style += StringPrintf("height: %s !important; ", height.c_str()); 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style += "margin: 0 !important; padding: 0 !important; border: 0 !important"; 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_->element().setAttribute(kStyle, WebString::fromUTF8(style)); 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 298158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::ResetSizeAttributesAfterFullscreen() { 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screen_size_for_fullscreen_ = gfx::Size(); 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement element = container_->element(); 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_); 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_); 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_); 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_); 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2990558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbool PepperPluginInstanceImpl::IsMouseLocked() { 2991558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return GetMouseLockDispatcher()->IsMouseLockedTo( 2992558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch GetOrCreateLockTargetAdapter()); 2993558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 2994558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2995558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbool PepperPluginInstanceImpl::LockMouse() { 2996558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return GetMouseLockDispatcher()->LockMouse(GetOrCreateLockTargetAdapter()); 2997558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 2998558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2999558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochMouseLockDispatcher::LockTarget* 3000558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PepperPluginInstanceImpl::GetOrCreateLockTargetAdapter() { 3001558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!lock_target_.get()) { 3002558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch lock_target_.reset(new PluginInstanceLockTarget(this)); 3003558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 3004558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return lock_target_.get(); 3005558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 3006558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 3007558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochMouseLockDispatcher* PepperPluginInstanceImpl::GetMouseLockDispatcher() { 3008558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (flash_fullscreen_) { 3009558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch RenderWidgetFullscreenPepper* container = 3010558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch static_cast<RenderWidgetFullscreenPepper*>(fullscreen_container_); 3011558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return container->mouse_lock_dispatcher(); 3012558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } else { 3013a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return render_frame_->render_view()->mouse_lock_dispatcher(); 3014558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 3015558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 3016558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 3017558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid PepperPluginInstanceImpl::UnSetAndDeleteLockTargetAdapter() { 3018558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (lock_target_.get()) { 3019558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch GetMouseLockDispatcher()->OnLockTargetDestroyed(lock_target_.get()); 3020558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch lock_target_.reset(); 3021558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 3022558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 3023558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 30242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochvoid PepperPluginInstanceImpl::DidDataFromWebURLResponse( 3025f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebURLResponse& response, 30262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch int pending_host_id, 30272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const ppapi::URLResponseInfoData& data) { 30282385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch RendererPpapiHostImpl* host_impl = module_->renderer_ppapi_host(); 3029a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 30302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (host_impl->in_process_router()) { 30312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Running in-process, we can just create the resource and call the 30322385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // PPP_Instance function directly. 30332385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch scoped_refptr<ppapi::proxy::URLLoaderResource> loader_resource( 30342385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch new ppapi::proxy::URLLoaderResource( 30352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch host_impl->in_process_router()->GetPluginConnection(pp_instance()), 30362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch pp_instance(), pending_host_id, data)); 30372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 30382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch PP_Resource loader_pp_resource = loader_resource->GetReference(); 30392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (!instance_interface_->HandleDocumentLoad( 30402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch pp_instance(), loader_pp_resource)) 30412385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch loader_resource->Close(); 30422385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // We don't pass a ref into the plugin, if it wants one, it will have taken 30432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // an additional one. 30442385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ppapi::PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource( 30452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch loader_pp_resource); 3046a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } else { 30472385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Running out-of-process. Initiate an IPC call to notify the plugin 30482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // process. 30492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ppapi::proxy::HostDispatcher* dispatcher = 30502385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ppapi::proxy::HostDispatcher::GetForInstance(pp_instance()); 30512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch dispatcher->Send(new PpapiMsg_PPPInstance_HandleDocumentLoad( 30522385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ppapi::API_ID_PPP_INSTANCE, pp_instance(), pending_host_id, data)); 3053a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 3054a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 3055a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 305658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} // namespace content 3057