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" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/debug/trace_event.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h" 129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/utf_offset_string_conversions.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/texture_layer.h" 194311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "content/common/content_constants_internal.h" 2058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/public/common/page_zoom.h" 21558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/public/renderer/content_renderer_client.h" 22bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/common.h" 23bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/content_decryptor_delegate.h" 24bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/event_conversion.h" 25bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/fullscreen_container.h" 26bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/gfx_conversion.h" 272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "content/renderer/pepper/host_dispatcher_wrapper.h" 28bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/host_globals.h" 29bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/message_channel.h" 30bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/npapi_glue.h" 313240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch#include "content/renderer/pepper/pepper_browser_connection.h" 32558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/renderer/pepper/pepper_graphics_2d_host.h" 332385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "content/renderer/pepper/pepper_in_process_router.h" 34558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/renderer/pepper/pepper_platform_context_3d.h" 352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "content/renderer/pepper/pepper_url_loader_host.h" 36bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/plugin_module.h" 37bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/plugin_object.h" 38bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_buffer_impl.h" 39a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch#include "content/renderer/pepper/ppb_file_ref_impl.h" 40bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_graphics_3d_impl.h" 41bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_image_data_impl.h" 42bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppp_pdf.h" 43558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/renderer/pepper/renderer_ppapi_host_impl.h" 44bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/url_request_info_util.h" 452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "content/renderer/pepper/url_response_info_util.h" 46558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/renderer/render_thread_impl.h" 47558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/renderer/render_view_impl.h" 48558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/renderer/render_widget_fullscreen_pepper.h" 494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch#include "content/renderer/sad_plugin.h" 50558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "media/base/audio_hardware_config.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_find_dev.h" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppb_zoom_dev.h" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppp_find_dev.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppp_selection_dev.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppp_text_input_dev.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppp_zoom_dev.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_rect.h" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_audio_config.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_core.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_gamepad.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp_input_event.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp_instance.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp_messaging.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppp_mouse_lock.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppp_instance_private.h" 66558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "ppapi/host/ppapi_host.h" 672385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "ppapi/proxy/ppapi_messages.h" 682385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "ppapi/proxy/url_loader_resource.h" 69a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "ppapi/shared_impl/ppapi_permissions.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppapi_preferences.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_gamepad_shared.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_input_event_shared.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_url_util_shared.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppb_view_shared.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppp_instance_combined.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/resource.h" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/scoped_pp_resource.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/time_conversion.h" 7990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ppapi/shared_impl/url_request_info_data.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/var.h" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/enter.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/ppb_buffer_api.h" 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "printing/metafile.h" 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "printing/metafile_skia_wrapper.h" 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/units.h" 86a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "skia/ext/platform_canvas.h" 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "skia/ext/platform_device.h" 88868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebGamepads.h" 89868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h" 90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURL.h" 91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLError.h" 92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLRequest.h" 937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebBindings.h" 947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebCompositionUnderline.h" 957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebCursorInfo.h" 967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h" 977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebElement.h" 987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrame.h" 997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h" 1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginContainer.h" 1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPrintParams.h" 1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPrintScalingOption.h" 1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebScopedUserGesture.h" 1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebSecurityOrigin.h" 1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebUserGestureIndicator.h" 1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h" 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h" 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkRect.h" 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/range/range.h" 110a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "ui/gfx/image/image_skia.h" 111a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "ui/gfx/image/image_skia_rep.h" 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect_conversions.h" 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/scoped_ns_graphics_context_save_gstate_mac.h" 1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "v8/include/v8.h" 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/renderer/compositor_bindings/web_layer_impl.h" 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "printing/metafile_impl.h" 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_MACOSX) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h" 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h" 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/platform_canvas.h" 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/codec/jpeg_codec.h" 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/gdi_util.h" 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::StringPrintf; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::InputEventData; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::PpapiGlobals; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::PPB_InputEvent_Shared; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::PPB_View_Shared; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::PPP_Instance_Combined; 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ppapi::Resource; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::ScopedPPResource; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::StringVar; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::TrackedCallback; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::EnterResourceNoLock; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_Buffer_API; 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ppapi::thunk::PPB_Gamepad_API; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_Graphics2D_API; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_Graphics3D_API; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_ImageData_API; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::Var; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::ArrayBufferVar; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::ViewData; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebBindings; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebCanvas; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebCursorInfo; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebDocument; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebElement; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebFrame; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebInputEvent; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPlugin; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPluginContainer; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPrintParams; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebPrintScalingOption; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebScopedUserGesture; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebString; 16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using WebKit::WebURLError; 16290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using WebKit::WebURLLoader; 16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using WebKit::WebURLLoaderClient; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebURLRequest; 16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)using WebKit::WebURLResponse; 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WebUserGestureIndicator; 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WebUserGestureToken; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebView; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochnamespace content { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Exported by pdf.dll 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef bool (*RenderPDFPageToDCProc)( 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unsigned char* pdf_buffer, int buffer_size, int page_number, HDC dc, 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int dpi_x, int dpi_y, int bounds_origin_x, int bounds_origin_y, 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bounds_width, int bounds_height, bool fit_to_bounds, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool stretch_to_bounds, bool keep_aspect_ratio, bool center_in_bounds, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool autorotate); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DrawEmptyRectangle(HDC dc) { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(sanjeevr): This is a temporary hack. If we output a JPEG 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the EMF, the EnumEnhMetaFile call fails in the browser 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // process. The failure also happens if we output nothing here. 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to investigate the reason for this failure and fix it. 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In the meantime this temporary hack of drawing an empty 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rectangle in the DC gets us by. 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rectangle(dc, 0, 0, 0, 0); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check PP_TextInput_Type and ui::TextInputType are kept in sync. 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_NONE) == \ 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int(PP_TEXTINPUT_TYPE_NONE), mismatching_enums); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_TEXT) == \ 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int(PP_TEXTINPUT_TYPE_TEXT), mismatching_enums); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_PASSWORD) == \ 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int(PP_TEXTINPUT_TYPE_PASSWORD), mismatching_enums); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_SEARCH) == \ 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int(PP_TEXTINPUT_TYPE_SEARCH), mismatching_enums); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_EMAIL) == \ 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int(PP_TEXTINPUT_TYPE_EMAIL), mismatching_enums); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_NUMBER) == \ 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int(PP_TEXTINPUT_TYPE_NUMBER), mismatching_enums); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_TELEPHONE) == \ 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int(PP_TEXTINPUT_TYPE_TELEPHONE), mismatching_enums); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT(int(ui::TEXT_INPUT_TYPE_URL) == \ 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int(PP_TEXTINPUT_TYPE_URL), mismatching_enums); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The default text input type is to regard the plugin always accept text input. 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is for allowing users to use input methods even on completely-IME- 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unaware plugins (e.g., PPAPI Flash or PDF plugin for M16). 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Plugins need to explicitly opt out the text input mode if they know 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that they don't accept texts. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ui::TextInputType kPluginDefaultTextInputType = ui::TEXT_INPUT_TYPE_TEXT; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define COMPILE_ASSERT_MATCHING_ENUM(webkit_name, np_name) \ 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(static_cast<int>(WebCursorInfo::webkit_name) \ 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) == static_cast<int>(np_name), \ 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mismatching_enums) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define COMPILE_ASSERT_PRINT_SCALING_MATCHING_ENUM(webkit_name, pp_name) \ 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(static_cast<int>(webkit_name) \ 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) == static_cast<int>(pp_name), \ 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mismatching_enums) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <embed>/<object> attributes. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kWidth[] = "width"; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kHeight[] = "height"; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kBorder[] = "border"; // According to w3c, deprecated. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kStyle[] = "style"; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypePointer, PP_MOUSECURSOR_TYPE_POINTER); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeCross, PP_MOUSECURSOR_TYPE_CROSS); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeHand, PP_MOUSECURSOR_TYPE_HAND); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeIBeam, PP_MOUSECURSOR_TYPE_IBEAM); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeWait, PP_MOUSECURSOR_TYPE_WAIT); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeHelp, PP_MOUSECURSOR_TYPE_HELP); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeEastResize, PP_MOUSECURSOR_TYPE_EASTRESIZE); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNorthResize, PP_MOUSECURSOR_TYPE_NORTHRESIZE); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNorthEastResize, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_NORTHEASTRESIZE); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNorthWestResize, 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_NORTHWESTRESIZE); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeSouthResize, PP_MOUSECURSOR_TYPE_SOUTHRESIZE); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeSouthEastResize, 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_SOUTHEASTRESIZE); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeSouthWestResize, 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_SOUTHWESTRESIZE); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeWestResize, PP_MOUSECURSOR_TYPE_WESTRESIZE); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNorthSouthResize, 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_NORTHSOUTHRESIZE); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeEastWestResize, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_EASTWESTRESIZE); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNorthEastSouthWestResize, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_NORTHEASTSOUTHWESTRESIZE); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNorthWestSouthEastResize, 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_NORTHWESTSOUTHEASTRESIZE); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeColumnResize, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_COLUMNRESIZE); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeRowResize, PP_MOUSECURSOR_TYPE_ROWRESIZE); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeMiddlePanning, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_MIDDLEPANNING); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeEastPanning, PP_MOUSECURSOR_TYPE_EASTPANNING); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNorthPanning, 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_NORTHPANNING); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNorthEastPanning, 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_NORTHEASTPANNING); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNorthWestPanning, 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_NORTHWESTPANNING); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeSouthPanning, 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_SOUTHPANNING); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeSouthEastPanning, 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_SOUTHEASTPANNING); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeSouthWestPanning, 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_SOUTHWESTPANNING); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeWestPanning, PP_MOUSECURSOR_TYPE_WESTPANNING); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeMove, PP_MOUSECURSOR_TYPE_MOVE); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeVerticalText, 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_MOUSECURSOR_TYPE_VERTICALTEXT); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeCell, PP_MOUSECURSOR_TYPE_CELL); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeContextMenu, PP_MOUSECURSOR_TYPE_CONTEXTMENU); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeAlias, PP_MOUSECURSOR_TYPE_ALIAS); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeProgress, PP_MOUSECURSOR_TYPE_PROGRESS); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNoDrop, PP_MOUSECURSOR_TYPE_NODROP); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeCopy, PP_MOUSECURSOR_TYPE_COPY); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNone, PP_MOUSECURSOR_TYPE_NONE); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeNotAllowed, PP_MOUSECURSOR_TYPE_NOTALLOWED); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeZoomIn, PP_MOUSECURSOR_TYPE_ZOOMIN); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeZoomOut, PP_MOUSECURSOR_TYPE_ZOOMOUT); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeGrab, PP_MOUSECURSOR_TYPE_GRAB); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_MATCHING_ENUM(TypeGrabbing, PP_MOUSECURSOR_TYPE_GRABBING); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Do not assert WebCursorInfo::TypeCustom == PP_CURSORTYPE_CUSTOM; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PP_CURSORTYPE_CUSTOM is pinned to allow new cursor types. 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_PRINT_SCALING_MATCHING_ENUM(WebKit::WebPrintScalingOptionNone, 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_PRINTSCALINGOPTION_NONE); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_PRINT_SCALING_MATCHING_ENUM( 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebPrintScalingOptionFitToPrintableArea, 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_PRINTSCALINGOPTION_FIT_TO_PRINTABLE_AREA); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COMPILE_ASSERT_PRINT_SCALING_MATCHING_ENUM( 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebPrintScalingOptionSourceSize, PP_PRINTSCALINGOPTION_SOURCE_SIZE); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sets |*security_origin| to be the WebKit security origin associated with the 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// document containing the given plugin instance. On success, returns true. If 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the instance is invalid, returns false and |*security_origin| will be 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unchanged. 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SecurityOriginForInstance(PP_Instance instance_id, 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebSecurityOrigin* security_origin) { 31258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInstanceImpl* instance = 31358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch HostGlobals::Get()->GetInstance(instance_id); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement plugin_element = instance->container()->element(); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *security_origin = plugin_element.document().securityOrigin(); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Convert the given vector to an array of C-strings. The strings in the 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// returned vector are only guaranteed valid so long as the vector of strings 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is not modified. 325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)scoped_ptr<const char*[]> StringVectorToArgArray( 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::string>& vector) { 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<const char*[]> array(new const char*[vector.size()]); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < vector.size(); ++i) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) array[i] = vector[i].c_str(); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return array.Pass(); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 333558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass PluginInstanceLockTarget : public MouseLockDispatcher::LockTarget { 334558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch public: 335558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PluginInstanceLockTarget(PepperPluginInstanceImpl* plugin) 336558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch : plugin_(plugin) {} 337558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 338558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual void OnLockMouseACK(bool succeeded) OVERRIDE { 339558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch plugin_->OnLockMouseACK(succeeded); 340558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 341558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 342558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual void OnMouseLockLost() OVERRIDE { 343558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch plugin_->OnMouseLockLost(); 344558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 345558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 346558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual bool HandleMouseLockedInputEvent( 347558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const WebKit::WebMouseEvent &event) OVERRIDE { 348558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch plugin_->HandleMouseLockedInputEvent(event); 349558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return true; 350558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 351558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 352558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch private: 353558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PepperPluginInstanceImpl* plugin_; 354558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}; 355558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 356558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 36058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstanceImpl* PepperPluginInstanceImpl::Create( 361558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch RenderViewImpl* render_view, 36258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PluginModule* module, 36358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch WebPluginContainer* container, 36458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const GURL& plugin_url) { 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Callback<const void*(const char*)> get_plugin_interface_func = 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PluginModule::GetPluginInterface, module); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_Instance_Combined* ppp_instance_combined = 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_Instance_Combined::Create(get_plugin_interface_func); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ppp_instance_combined) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3713240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch return new PepperPluginInstanceImpl(render_view, module, 37258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch ppp_instance_combined, container, 37358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch plugin_url); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3764311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochPepperPluginInstanceImpl::ExternalDocumentLoader::ExternalDocumentLoader() 37790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : finished_loading_(false) { 37890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 37990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3804311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen MurdochPepperPluginInstanceImpl::ExternalDocumentLoader::~ExternalDocumentLoader() { 38190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 38290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3834311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochvoid PepperPluginInstanceImpl::ExternalDocumentLoader::ReplayReceivedData( 38490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebURLLoaderClient* document_loader) { 38590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for (std::list<std::string>::iterator it = data_.begin(); 38690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) it != data_.end(); ++it) { 38790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) document_loader->didReceiveData(NULL, it->c_str(), it->length(), 38890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 0 /* encoded_data_length */); 38990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 39090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (finished_loading_) { 39190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) document_loader->didFinishLoading(NULL, 39290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 0 /* finish_time */); 39390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 39490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (error_.get()) { 39590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) document_loader->didFail(NULL, *error_); 39690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 39790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 39890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3994311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochvoid PepperPluginInstanceImpl::ExternalDocumentLoader::didReceiveData( 40090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebURLLoader* loader, 40190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const char* data, 40290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int data_length, 40390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int encoded_data_length) { 40490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) data_.push_back(std::string(data, data_length)); 40590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 40690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4074311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochvoid PepperPluginInstanceImpl::ExternalDocumentLoader::didFinishLoading( 40890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebURLLoader* loader, 40990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) double finish_time) { 41090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!finished_loading_); 41190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) finished_loading_ = true; 41290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 41390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4144311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochvoid PepperPluginInstanceImpl::ExternalDocumentLoader::didFail( 41590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) WebURLLoader* loader, 41690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const WebURLError& error) { 41790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!error_.get()); 41890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) error_.reset(new WebURLError(error)); 41990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 42090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4213240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochPepperPluginInstanceImpl::GamepadImpl::GamepadImpl() 4224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch : Resource(ppapi::Resource::Untracked()) { 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 42558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstanceImpl::GamepadImpl::~GamepadImpl() { 426bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 427bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 42858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPPB_Gamepad_API* PepperPluginInstanceImpl::GamepadImpl::AsPPB_Gamepad_API() { 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return this; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::GamepadImpl::Sample( 43358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Instance instance, 43458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_GamepadsSampleData* data) { 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebGamepads webkit_data; 4363240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch RenderThreadImpl::current()->SampleGamepads(&webkit_data); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConvertWebKitGamepadData( 4384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch *reinterpret_cast<const ppapi::WebKitGamepads*>(&webkit_data), data); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 44158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstanceImpl::PepperPluginInstanceImpl( 442558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch RenderViewImpl* render_view, 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginModule* module, 4444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ppapi::PPP_Instance_Combined* instance_interface, 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebPluginContainer* container, 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& plugin_url) 4473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch : render_view_(render_view), 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_(module), 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_interface_(instance_interface), 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_instance_(0), 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container_(container), 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_bound_to_fullscreen_(false), 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_url_(plugin_url), 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) full_frame_(false), 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sent_initial_did_change_view_(false), 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_change_weak_ptr_factory_(this), 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bound_graphics_2d_platform_(NULL), 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_webkit_focus_(false), 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_content_area_focus_(false), 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_identifier_(-1), 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_find_interface_(NULL), 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_input_event_interface_(NULL), 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_messaging_interface_(NULL), 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_mouse_lock_interface_(NULL), 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_pdf_interface_(NULL), 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_private_interface_(NULL), 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_selection_interface_(NULL), 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_textinput_interface_(NULL), 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_zoom_interface_(NULL), 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checked_for_plugin_input_event_interface_(false), 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checked_for_plugin_messaging_interface_(false), 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checked_for_plugin_pdf_interface_(false), 4733240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch gamepad_impl_(new GamepadImpl()), 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_print_interface_(NULL), 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_graphics_3d_interface_(NULL), 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) always_on_top_(false), 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_container_(NULL), 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flash_fullscreen_(false), 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desired_fullscreen_state_(false), 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sad_plugin_(NULL), 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_event_mask_(0), 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filtered_input_event_mask_(0), 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_input_type_(kPluginDefaultTextInputType), 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_input_caret_(0, 0, 0, 0), 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_input_caret_bounds_(0, 0, 0, 0), 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_input_caret_set_(false), 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_caret_(0), 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_anchor_(0), 48990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) pending_user_gesture_(0.0), 49090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) document_loader_(NULL), 4914311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch external_document_load_(false), 4927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch npp_(new NPP_t), 4937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch isolate_(v8::Isolate::GetCurrent()) { 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_instance_ = HostGlobals::Get()->AddInstance(this); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(¤t_print_settings_, 0, sizeof(current_print_settings_)); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_->InstanceCreated(this); 498d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch 4993240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (render_view) { // NULL in tests 5003240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch render_view->PepperInstanceCreated(this); 501558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch view_data_.is_page_visible = !render_view->is_hidden(); 502558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 5033240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch // Set the initial focus. 5043240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch SetContentAreaFocus(render_view_->has_focus()); 5053240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 5063240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (!module_->IsProxied()) { 5073240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperBrowserConnection* browser_connection = 5083240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperBrowserConnection::Get(render_view_); 5093240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch browser_connection->DidCreateInProcessInstance( 5103240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch pp_instance(), 5113240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch render_view_->GetRoutingID(), 5123240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch container_->element().document().url(), 5133240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch GetPluginURL()); 5143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 5153240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 5163240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 517558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch RendererPpapiHostImpl* host_impl = module_->renderer_ppapi_host(); 518558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch resource_creation_ = host_impl->CreateInProcessResourceCreationAPI(this); 51990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5204311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (GetContentClient()->renderer() && // NULL in unit tests. 5214311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch GetContentClient()->renderer()->IsExternalPepperPlugin(module->name())) 5224311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch external_document_load_ = true; 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstanceImpl::~PepperPluginInstanceImpl() { 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!fullscreen_container_); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Force-unbind any Graphics. In the case of Graphics2D, if the plugin 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // leaks the graphics 2D, it may actually get cleaned up after our 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // destruction, so we need its pointers to be up-to-date. 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BindGraphics(pp_instance(), 0); 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Free all the plugin objects. This will automatically clear the back- 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pointer from the NPObject so WebKit can't call into the plugin any more. 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Swap out the set so we can delete from it (the objects will try to 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // unregister themselves inside the delete call). 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginObjectSet plugin_object_copy; 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) live_plugin_objects_.swap(plugin_object_copy); 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (PluginObjectSet::iterator i = plugin_object_copy.begin(); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) i != plugin_object_copy.end(); ++i) 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete *i; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (TrackedCallback::IsPending(lock_mouse_callback_)) 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_mouse_callback_->Abort(); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (render_view_) 5483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch render_view_->PepperInstanceDeleted(this); 5493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 5503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (!module_->IsProxied() && render_view_) { 5513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperBrowserConnection* browser_connection = 5523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch PepperBrowserConnection::Get(render_view_); 5533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch browser_connection->DidDeleteInProcessInstance(pp_instance()); 5543240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch } 5553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch 556558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch UnSetAndDeleteLockTargetAdapter(); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_->InstanceDeleted(this); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we switched from the NaCl plugin module, notify it too. 559868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (original_module_.get()) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_module_->InstanceDeleted(this); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This should be last since some of the above "instance deleted" calls will 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // want to look up in the global map to get info off of our object. 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostGlobals::Get()->InstanceDeleted(pp_instance_); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: Any of these methods that calls into the plugin needs to take into 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// account that the plugin may use Var to remove the <embed> from the DOM, which 56958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// will make the PepperWebPluginImpl drop its reference, usually the last one. 57058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// If a method needs to access a member of the instance after the call has 57158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch// returned, then it needs to keep its own reference on the stack. 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::Delete() { 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 57558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force the MessageChannel to release its "passthrough object" which should 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // release our last reference to the "InstanceObject" and will probably 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destroy it. We want to do this prior to calling DidDestroy in case the 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destructor of the instance object tries to use the instance. 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_channel_->SetPassthroughObject(NULL); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this is a NaCl plugin instance, shut down the NaCl plugin by calling 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // its DidDestroy. Don't call DidDestroy on the untrusted plugin instance, 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since there is little that it can do at this point. 584b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (original_instance_interface_) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_instance_interface_->DidDestroy(pp_instance()); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_interface_->DidDestroy(pp_instance()); 588b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) // Ensure we don't attempt to call functions on the destroyed instance. 589b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) original_instance_interface_.reset(); 590b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) instance_interface_.reset(); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fullscreen_container_) { 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_container_->Destroy(); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_container_ = NULL; 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bound_graphics_3d_ = NULL; 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateLayer(); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_ = NULL; 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::Paint(WebCanvas* canvas, 60258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const gfx::Rect& plugin_rect, 60358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const gfx::Rect& paint_rect) { 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TRACE_EVENT0("ppapi", "PluginInstance::Paint"); 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (module()->is_crashed()) { 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Crashed plugin painting. 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!sad_plugin_) // Lazily initialize bitmap. 608558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch sad_plugin_ = GetContentClient()->renderer()->GetSadPluginBitmap(); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sad_plugin_) 6104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch PaintSadPlugin(canvas, plugin_rect, *sad_plugin_); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 614558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (bound_graphics_2d_platform_) 615558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bound_graphics_2d_platform_->Paint(canvas, plugin_rect, paint_rect); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::InvalidateRect(const gfx::Rect& rect) { 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fullscreen_container_) { 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rect.IsEmpty()) 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_container_->Invalidate(); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_container_->InvalidateRect(rect); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!container_ || 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_data_.rect.size.width == 0 || view_data_.rect.size.height == 0) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // Nothing to do. 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rect.IsEmpty()) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_->invalidate(); 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_->invalidateRect(rect); 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 63558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::ScrollRect(int dx, 63658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch int dy, 63758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const gfx::Rect& rect) { 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fullscreen_container_) { 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_container_->ScrollRect(dx, dy, rect); 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (full_frame_ && !IsViewAccelerated()) { 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_->scrollRect(dx, dy, rect); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Can't do optimized scrolling since there could be other elements on top 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of us or the view renders via the accelerated compositor which is 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // incompatible with the move and backfill scrolling model. 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidateRect(rect); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::CommitBackingTexture() { 653868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (texture_layer_.get()) 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) texture_layer_->SetNeedsDisplay(); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::InstanceCrashed() { 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force free all resources and vars. 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostGlobals::Get()->InstanceCrashed(pp_instance()); 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Free any associated graphics. 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetFullscreen(false); 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FlashSetFullscreen(false, false); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unbind current 2D or 3D graphics context. 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BindGraphics(pp_instance(), 0); 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidateRect(gfx::Rect()); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 668558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch render_view_->PluginCrashed(module_->path(), module_->GetPeerProcessId()); 669558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch UnSetAndDeleteLockTargetAdapter(); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochstatic void SetGPUHistogram(const ppapi::Preferences& prefs, 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::string>& arg_names, 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::string>& arg_values) { 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Calculate a histogram to let us determine how likely people are to try to 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // run Stage3D content on machines that have it blacklisted. 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool needs_gpu = false; 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_xp = base::win::GetVersion() <= base::win::VERSION_XP; 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arg_names.size(); i++) { 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (arg_names[i] == "wmode") { 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // In theory content other than Flash could have a "wmode" argument, 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // but that's pretty unlikely. 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (arg_values[i] == "direct" || arg_values[i] == "gpu") 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) needs_gpu = true; 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 0 : No 3D content and GPU is blacklisted 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1 : No 3D content and GPU is not blacklisted 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2 : 3D content but GPU is blacklisted 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3 : 3D content and GPU is not blacklisted 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 4 : No 3D content and GPU is blacklisted on XP 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 5 : No 3D content and GPU is not blacklisted on XP 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 6 : 3D content but GPU is blacklisted on XP 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 7 : 3D content and GPU is not blacklisted on XP 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Flash.UsesGPU", 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_xp * 4 + needs_gpu * 2 + prefs.is_webgl_supported, 8); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 70358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::Initialize( 70458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const std::vector<std::string>& arg_names, 70558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const std::vector<std::string>& arg_values, 70658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch bool full_frame) { 70790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) message_channel_.reset(new MessageChannel(this)); 70890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) full_frame_ = full_frame; 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateTouchEventRequest(); 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container_->setWantsWheelEvents(IsAcceptingWheelEvents()); 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 714558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SetGPUHistogram(ppapi::Preferences(render_view_->webkit_preferences()), 715558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch arg_names, arg_values); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argn_ = arg_names; 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argv_ = arg_values; 719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<const char*[]> argn_array(StringVectorToArgArray(argn_)); 720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<const char*[]> argv_array(StringVectorToArgArray(argv_)); 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool success = PP_ToBool(instance_interface_->DidCreate(pp_instance(), 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) argn_.size(), 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) argn_array.get(), 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) argv_array.get())); 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (success) 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_channel_->StopQueueingJavaScriptMessages(); 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return success; 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 73058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::HandleDocumentLoad( 73190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const WebKit::WebURLResponse& response) { 73290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) DCHECK(!document_loader_); 7334311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (external_document_load_) { 7344311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // The external proxy isn't available, so save the response and record 7354311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch // document load notifications for later replay. 7364311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch external_document_response_ = response; 7374311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch external_document_loader_.reset(new ExternalDocumentLoader()); 7384311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch document_loader_ = external_document_loader_.get(); 7392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return true; 7402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 7412385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 7422385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (module()->is_crashed()) { 7432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Don't create a resource for a crashed plugin. 7442385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch container()->element().document().frame()->stopLoading(); 7452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return false; 74690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 7472385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 7482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch DCHECK(!document_loader_); 7492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 7502385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Create a loader resource host for this load. Note that we have to set 7512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // the document_loader before issuing the in-process 7522385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // PPP_Instance.HandleDocumentLoad call below, since this may reentrantly 7532385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // call into the instance and expect it to be valid. 7542385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch RendererPpapiHostImpl* host_impl = module_->renderer_ppapi_host(); 7552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch PepperURLLoaderHost* loader_host = 7562385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch new PepperURLLoaderHost(host_impl, true, pp_instance(), 0); 7572385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // TODO(teravest): Remove set_document_loader() from instance and clean up 7582385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // this relationship. 7592385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch set_document_loader(loader_host); 7602385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch loader_host->didReceiveResponse(NULL, response); 7612385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 7622385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // This host will be pending until the resource object attaches to it. 7632385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // 7642385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // PpapiHost now owns the pointer to loader_host, so we don't have to worry 7652385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // about managing it. 7662385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch int pending_host_id = host_impl->GetPpapiHost()->AddPendingResourceHost( 7672385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch scoped_ptr<ppapi::host::ResourceHost>(loader_host)); 7682385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch DCHECK(pending_host_id); 7692385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 7702385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch DataFromWebURLResponse( 7712385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch pp_instance(), 7722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch response, 7732385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::Bind(&PepperPluginInstanceImpl::DidDataFromWebURLResponse, 7742385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch AsWeakPtr(), 7752385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch response, 7762385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch pending_host_id)); 7772385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 7782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // If the load was not abandoned, document_loader_ will now be set. It's 7792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // possible that the load was canceled by now and document_loader_ was 7802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // already nulled out. 78190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return true; 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 78458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::SendCompositionEventToPlugin( 785bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch PP_InputEvent_Type type, const base::string16& text) { 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<WebKit::WebCompositionUnderline> empty; 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SendCompositionEventWithUnderlineInformationToPlugin( 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type, text, empty, static_cast<int>(text.size()), 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(text.size())); 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl:: 79358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch SendCompositionEventWithUnderlineInformationToPlugin( 79458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_InputEvent_Type type, 79558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const base::string16& text, 79658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const std::vector<WebKit::WebCompositionUnderline>& underlines, 79758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch int selection_start, 79858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch int selection_end) { 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 80058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadInputEventInterface()) 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_InputEvent_Class event_class = PP_INPUTEVENT_CLASS_IME; 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!(filtered_input_event_mask_ & event_class) && 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !(input_event_mask_ & event_class)) 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8104311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ppapi::InputEventData event; 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.event_type = type; 8124311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch event.event_time_stamp = ppapi::TimeTicksToPPTimeTicks( 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks::Now()); 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert UTF16 text to UTF8 with offset conversion. 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<size_t> utf16_offsets; 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utf16_offsets.push_back(selection_start); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utf16_offsets.push_back(selection_end); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < underlines.size(); ++i) { 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utf16_offsets.push_back(underlines[i].startOffset); 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utf16_offsets.push_back(underlines[i].endOffset); 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<size_t> utf8_offsets(utf16_offsets); 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event.character_text = base::UTF16ToUTF8AndAdjustOffsets(text, &utf8_offsets); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the converted selection range. 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.composition_selection_start = (utf8_offsets[0] == std::string::npos ? 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.character_text.size() : utf8_offsets[0]); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.composition_selection_end = (utf8_offsets[1] == std::string::npos ? 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.character_text.size() : utf8_offsets[1]); 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the converted segmentation points. 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Be sure to add 0 and size(), and remove duplication or errors. 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<size_t> offset_set(utf8_offsets.begin()+2, utf8_offsets.end()); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset_set.insert(0); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset_set.insert(event.character_text.size()); 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset_set.erase(std::string::npos); 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.composition_segment_offsets.assign(offset_set.begin(), 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset_set.end()); 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the composition target. 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < underlines.size(); ++i) { 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (underlines[i].thick) { 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<uint32_t>::iterator it = 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::find(event.composition_segment_offsets.begin(), 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.composition_segment_offsets.end(), 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utf8_offsets[2*i+2]); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it != event.composition_segment_offsets.end()) { 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.composition_target_segment = 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it - event.composition_segment_offsets.begin(); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the event. 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = false; 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filtered_input_event_mask_ & event_class) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.is_filtered = true; 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handled = true; // Unfiltered events are assumed to be handled. 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<PPB_InputEvent_Shared> event_resource( 8634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch new PPB_InputEvent_Shared(ppapi::OBJECT_IS_IMPL, pp_instance(), event)); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) handled |= PP_ToBool(plugin_input_event_interface_->HandleInputEvent( 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_instance(), event_resource->pp_resource())); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 86958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::RequestInputEventsHelper( 87058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch uint32_t event_classes) { 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (event_classes & PP_INPUTEVENT_CLASS_TOUCH) 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateTouchEventRequest(); 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (event_classes & PP_INPUTEVENT_CLASS_WHEEL) 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container_->setWantsWheelEvents(IsAcceptingWheelEvents()); 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 87758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::HandleCompositionStart( 87858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const base::string16& text) { 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SendCompositionEventToPlugin(PP_INPUTEVENT_TYPE_IME_COMPOSITION_START, 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text); 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 88358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::HandleCompositionUpdate( 884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& text, 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<WebKit::WebCompositionUnderline>& underlines, 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int selection_start, 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int selection_end) { 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SendCompositionEventWithUnderlineInformationToPlugin( 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE, 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text, underlines, selection_start, selection_end); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 89358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::HandleCompositionEnd( 89458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const base::string16& text) { 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SendCompositionEventToPlugin(PP_INPUTEVENT_TYPE_IME_COMPOSITION_END, 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text); 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 89958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::HandleTextInput(const base::string16& text) { 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SendCompositionEventToPlugin(PP_INPUTEVENT_TYPE_IME_TEXT, 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 90458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::GetSurroundingText(base::string16* text, 90558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch ui::Range* range) const { 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<size_t> offsets; 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offsets.push_back(selection_anchor_); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offsets.push_back(selection_caret_); 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *text = base::UTF8ToUTF16AndAdjustOffsets(surrounding_text_, &offsets); 910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) range->set_start(offsets[0] == base::string16::npos ? text->size() 911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : offsets[0]); 912c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) range->set_end(offsets[1] == base::string16::npos ? text->size() 913c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : offsets[1]); 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::IsPluginAcceptingCompositionEvents() const { 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (filtered_input_event_mask_ & PP_INPUTEVENT_CLASS_IME) || 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (input_event_mask_ & PP_INPUTEVENT_CLASS_IME); 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochgfx::Rect PepperPluginInstanceImpl::GetCaretBounds() const { 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!text_input_caret_set_) { 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If it is never set by the plugin, use the bottom left corner. 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Rect(view_data_.rect.point.x, 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_data_.rect.point.y + view_data_.rect.size.height, 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0); 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(kinaba) Take CSS transformation into accont. 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(kinaba) Take bounding_box into account. On some platforms, an 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "exclude rectangle" where candidate window must avoid the region can be 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // passed to IME. Currently, we pass only the caret rectangle because 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it is the only information supported uniformly in Chromium. 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect caret(text_input_caret_); 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) caret.Offset(view_data_.rect.point.x, view_data_.rect.point.y); 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return caret; 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 93958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::HandleInputEvent( 94058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const WebKit::WebInputEvent& event, 94158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch WebCursorInfo* cursor_info) { 94258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch TRACE_EVENT0("ppapi", "PepperPluginInstanceImpl::HandleInputEvent"); 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 944558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (WebInputEvent::isMouseEventType(event.type)) { 9453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch render_view_->PepperDidReceiveMouseEvent(this); 946558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't dispatch input events to crashed plugins. 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (module()->is_crashed()) 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 95358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool rv = false; 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (LoadInputEventInterface()) { 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_InputEvent_Class event_class = ClassifyInputEvent(event.type); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!event_class) 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((filtered_input_event_mask_ & event_class) || 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (input_event_mask_ & event_class)) { 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Actually send the event. 9644311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch std::vector< ppapi::InputEventData > events; 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateInputEventData(event, &events); 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow the user gesture to be pending after the plugin handles the 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // event. This allows out-of-process plugins to respond to the user 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // gesture after processing has finished here. 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (WebUserGestureIndicator::isProcessingUserGesture()) { 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pending_user_gesture_ = 9724311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ppapi::EventTimeToPPTimeTicks(event.timeStampSeconds); 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_user_gesture_token_ = 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebUserGestureIndicator::currentUserGestureToken(); 9757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pending_user_gesture_token_.setOutOfProcess(); 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Each input event may generate more than one PP_InputEvent. 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < events.size(); i++) { 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (filtered_input_event_mask_ & event_class) 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) events[i].is_filtered = true; 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv = true; // Unfiltered events are assumed to be handled. 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<PPB_InputEvent_Shared> event_resource( 9854311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch new PPB_InputEvent_Shared(ppapi::OBJECT_IS_IMPL, 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_instance(), events[i])); 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rv |= PP_ToBool(plugin_input_event_interface_->HandleInputEvent( 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_instance(), event_resource->pp_resource())); 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 994b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (cursor_) 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cursor_info = *cursor_; 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rv; 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::HandleMessage(PP_Var message) { 100058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch TRACE_EVENT0("ppapi", "PepperPluginInstanceImpl::HandleMessage"); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 100258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadMessagingInterface()) 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_messaging_interface_->HandleMessage(pp_instance(), message); 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 100858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Var PepperPluginInstanceImpl::GetInstanceObject() { 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 101058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the plugin supports the private instance interface, try to retrieve its 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // instance object. 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (LoadPrivateInterface()) 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return plugin_private_interface_->GetInstanceObject(pp_instance()); 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 101958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::ViewChanged( 1020bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const gfx::Rect& position, 1021bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const gfx::Rect& clip, 1022bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const std::vector<gfx::Rect>& cut_outs_rects) { 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit can give weird (x,y) positions for empty clip rects (since the 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // position technically doesn't matter). But we want to make these 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // consistent since this is given to the plugin, so force everything to 0 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the "everything is clipped" case. 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect new_clip; 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!clip.IsEmpty()) 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_clip = clip; 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cut_outs_rects_ = cut_outs_rects; 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_data_.rect = PP_FromGfxRect(position); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_data_.clip_rect = PP_FromGfxRect(clip); 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_data_.device_scale = container_->deviceScaleFactor(); 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_data_.css_scale = container_->pageZoomFactor() * 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_->pageScaleFactor(); 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (desired_fullscreen_state_ || view_data_.is_fullscreen) { 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement element = container_->element(); 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDocument document = element.document(); 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_fullscreen_element = (element == document.fullScreenElement()); 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!view_data_.is_fullscreen && desired_fullscreen_state_ && 1044558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch render_view_->is_fullscreen() && is_fullscreen_element) { 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Entered fullscreen. Only possible via SetFullscreen(). 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_data_.is_fullscreen = true; 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (view_data_.is_fullscreen && !is_fullscreen_element) { 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Exited fullscreen. Possible via SetFullscreen() or F11/link, 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so desired_fullscreen_state might be out-of-date. 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desired_fullscreen_state_ = false; 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_data_.is_fullscreen = false; 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This operation will cause the plugin to re-layout which will send more 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DidChangeView updates. Schedule an asynchronous update and suppress 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // notifications until that completes to avoid sending intermediate sizes 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the plugins. 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScheduleAsyncDidChangeView(); 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset the size attributes that we hacked to fill in the screen and 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // retrigger ViewChanged. Make sure we don't forward duplicates of 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this view to the plugin. 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResetSizeAttributesAfterFullscreen(); 10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateFlashFullscreenState(fullscreen_container_ != NULL); 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendDidChangeView(); 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 107258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SetWebKitFocus(bool has_focus) { 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (has_webkit_focus_ == has_focus) 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool old_plugin_focus = PluginHasFocus(); 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_webkit_focus_ = has_focus; 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (PluginHasFocus() != old_plugin_focus) 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendFocusChangeNotification(); 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 108258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SetContentAreaFocus(bool has_focus) { 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (has_content_area_focus_ == has_focus) 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool old_plugin_focus = PluginHasFocus(); 10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) has_content_area_focus_ = has_focus; 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (PluginHasFocus() != old_plugin_focus) 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendFocusChangeNotification(); 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 109258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::PageVisibilityChanged(bool is_visible) { 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_visible == view_data_.is_page_visible) 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // Nothing to do. 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_data_.is_page_visible = is_visible; 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the initial DidChangeView notification hasn't been sent to the plugin, 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // let it pass the visibility state for us, instead of sending a notification 109958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // immediately. It is possible that PepperPluginInstanceImpl::ViewChanged() 110058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // hasn't been called for the first time. In that case, most of the fields in 1101bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // |view_data_| haven't been properly initialized. 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (sent_initial_did_change_view_) 11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendDidChangeView(); 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 110658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::ViewWillInitiatePaint() { 1107558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (bound_graphics_2d_platform_) 1108558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bound_graphics_2d_platform_->ViewWillInitiatePaint(); 1109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) else if (bound_graphics_3d_.get()) 11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bound_graphics_3d_->ViewWillInitiatePaint(); 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 111358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::ViewInitiatedPaint() { 1114558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (bound_graphics_2d_platform_) 1115558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bound_graphics_2d_platform_->ViewInitiatedPaint(); 1116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) else if (bound_graphics_3d_.get()) 11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bound_graphics_3d_->ViewInitiatedPaint(); 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::ViewFlushedPaint() { 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 112258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 1123558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (bound_graphics_2d_platform_) 1124558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bound_graphics_2d_platform_->ViewFlushedPaint(); 1125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) else if (bound_graphics_3d_.get()) 11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bound_graphics_3d_->ViewFlushedPaint(); 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::GetBitmapForOptimizedPluginPaint( 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& paint_bounds, 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransportDIB** dib, 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect* location, 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect* clip, 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float* scale_factor) { 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!always_on_top_) 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1137558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!bound_graphics_2d_platform_ || 1138558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch !bound_graphics_2d_platform_->IsAlwaysOpaque()) { 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1140558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We specifically want to compare against the area covered by the backing 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // store when seeing if we cover the given paint bounds, since the backing 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // store could be smaller than the declared plugin area. 1145558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PPB_ImageData_Impl* image_data = bound_graphics_2d_platform_->ImageData(); 1146558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // ImageDatas created by NaCl don't have a TransportDIB, so can't be 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // optimized this way. 1148558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!image_data->GetTransportDIB()) 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point plugin_origin = PP_ToGfxPoint(view_data_.rect.point); 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Vector2d plugin_offset = plugin_origin.OffsetFromOrigin(); 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert |paint_bounds| to be relative to the left-top corner of the plugin. 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect relative_paint_bounds(paint_bounds); 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relative_paint_bounds.Offset(-plugin_offset); 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect pixel_plugin_backing_store_rect( 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 0, image_data->width(), image_data->height()); 1159558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch float scale = bound_graphics_2d_platform_->GetScale(); 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect plugin_backing_store_rect = gfx::ToEnclosedRect( 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ScaleRect(pixel_plugin_backing_store_rect, scale)); 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect clip_page = PP_ToGfxRect(view_data_.clip_rect); 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect plugin_paint_rect = 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::IntersectRects(plugin_backing_store_rect, clip_page); 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_paint_rect.Contains(relative_paint_bounds)) 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't do optimized painting if the area to paint intersects with the 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cut-out rects, otherwise we will paint over them. 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<gfx::Rect>::const_iterator iter = cut_outs_rects_.begin(); 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) iter != cut_outs_rects_.end(); ++iter) { 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (relative_paint_bounds.Intersects(*iter)) 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1177558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch *dib = image_data->GetTransportDIB(); 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_backing_store_rect.Offset(plugin_offset); 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *location = plugin_backing_store_rect; 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) clip_page.Offset(plugin_offset); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *clip = clip_page; 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The plugin scale factor is inverted, e.g. for a device scale factor of 2x 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the plugin scale factor is 0.5. 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *scale_factor = 1.0 / scale; 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 118858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbase::string16 PepperPluginInstanceImpl::GetSelectedText(bool html) { 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 119058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadSelectionInterface()) 1192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return base::string16(); 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var rv = plugin_selection_interface_->GetSelectedText(pp_instance(), 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_FromBool(html)); 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringVar* string = StringVar::FromPPVar(rv); 1197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 selection; 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (string) 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection = UTF8ToUTF16(string->value()); 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Release the ref the plugin transfered to us. 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostGlobals::Get()->GetVarTracker()->ReleaseVar(rv); 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return selection; 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 120558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbase::string16 PepperPluginInstanceImpl::GetLinkAtPosition( 120658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const gfx::Point& point) { 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 120858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadPdfInterface()) 1210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return base::string16(); 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Point p; 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p.x = point.x(); 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) p.y = point.y(); 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var rv = plugin_pdf_interface_->GetLinkAtPosition(pp_instance(), p); 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringVar* string = StringVar::FromPPVar(rv); 1217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 link; 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (string) 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) link = UTF8ToUTF16(string->value()); 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Release the ref the plugin transfered to us. 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(rv); 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return link; 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 122558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::RequestSurroundingText( 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t desired_number_of_characters) { 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 122858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadTextInputInterface()) 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_textinput_interface_->RequestSurroundingText( 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_instance(), desired_number_of_characters); 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 123558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::Zoom(double factor, bool text_only) { 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 123758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadZoomInterface()) 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_zoom_interface_->Zoom(pp_instance(), factor, PP_FromBool(text_only)); 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 124358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::StartFind(const base::string16& search_text, 124458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch bool case_sensitive, 124558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch int identifier) { 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 124758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadFindInterface()) 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_identifier_ = identifier; 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_ToBool( 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_find_interface_->StartFind( 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_instance(), 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF16ToUTF8(search_text.c_str()).c_str(), 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_FromBool(case_sensitive))); 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SelectFindResult(bool forward) { 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 126058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (LoadFindInterface()) 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_find_interface_->SelectFindResult(pp_instance(), 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_FromBool(forward)); 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 126658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::StopFind() { 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 126858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadFindInterface()) 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_identifier_ = -1; 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_find_interface_->StopFind(pp_instance()); 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 127558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::LoadFindInterface() { 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_find_interface_) { 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_find_interface_ = 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const PPP_Find_Dev*>(module_->GetPluginInterface( 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_FIND_DEV_INTERFACE)); 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!plugin_find_interface_; 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 128558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::LoadInputEventInterface() { 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!checked_for_plugin_input_event_interface_) { 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checked_for_plugin_input_event_interface_ = true; 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_input_event_interface_ = 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const PPP_InputEvent*>(module_->GetPluginInterface( 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_INPUT_EVENT_INTERFACE)); 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!plugin_input_event_interface_; 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 129558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::LoadMessagingInterface() { 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!checked_for_plugin_messaging_interface_) { 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checked_for_plugin_messaging_interface_ = true; 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_messaging_interface_ = 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const PPP_Messaging*>(module_->GetPluginInterface( 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_MESSAGING_INTERFACE)); 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!plugin_messaging_interface_; 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 130558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::LoadMouseLockInterface() { 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_mouse_lock_interface_) { 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_mouse_lock_interface_ = 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const PPP_MouseLock*>(module_->GetPluginInterface( 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_MOUSELOCK_INTERFACE)); 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!plugin_mouse_lock_interface_; 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 131558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::LoadPdfInterface() { 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!checked_for_plugin_pdf_interface_) { 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checked_for_plugin_pdf_interface_ = true; 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_pdf_interface_ = 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const PPP_Pdf_1*>(module_->GetPluginInterface( 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_PDF_INTERFACE_1)); 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!plugin_pdf_interface_; 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 132658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::LoadPrintInterface() { 13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only check for the interface if the plugin has dev permission. 13284311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (!module_->permissions().HasPermission(ppapi::PERMISSION_DEV)) 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_print_interface_) { 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_print_interface_ = static_cast<const PPP_Printing_Dev*>( 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_->GetPluginInterface(PPP_PRINTING_DEV_INTERFACE)); 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!plugin_print_interface_; 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 133758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::LoadPrivateInterface() { 13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only check for the interface if the plugin has private permission. 13394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (!module_->permissions().HasPermission(ppapi::PERMISSION_PRIVATE)) 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_private_interface_) { 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_private_interface_ = static_cast<const PPP_Instance_Private*>( 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_->GetPluginInterface(PPP_INSTANCE_PRIVATE_INTERFACE)); 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!plugin_private_interface_; 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 134958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::LoadSelectionInterface() { 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_selection_interface_) { 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_selection_interface_ = 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const PPP_Selection_Dev*>(module_->GetPluginInterface( 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_SELECTION_DEV_INTERFACE)); 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!plugin_selection_interface_; 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::LoadTextInputInterface() { 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_textinput_interface_) { 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_textinput_interface_ = 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const PPP_TextInput_Dev*>(module_->GetPluginInterface( 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_TEXTINPUT_DEV_INTERFACE)); 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!plugin_textinput_interface_; 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 136858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::LoadZoomInterface() { 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_zoom_interface_) { 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_zoom_interface_ = 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const PPP_Zoom_Dev*>(module_->GetPluginInterface( 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_ZOOM_DEV_INTERFACE)); 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!plugin_zoom_interface_; 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 137858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::PluginHasFocus() const { 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return flash_fullscreen_ || (has_webkit_focus_ && has_content_area_focus_); 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 138258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SendFocusChangeNotification() { 1383d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch // This call can happen during PepperPluginIn>stanceImpl destruction, because 138458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // WebKit informs the plugin it's losing focus. See crbug.com/236574 13853240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch if (!instance_interface_) 1386b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return; 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_focus = PluginHasFocus(); 13883240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch render_view_->PepperFocusChanged(this, has_focus); 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_interface_->DidChangeFocus(pp_instance(), PP_FromBool(has_focus)); 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 139258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::UpdateTouchEventRequest() { 13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool raw_touch = (filtered_input_event_mask_ & PP_INPUTEVENT_CLASS_TOUCH) || 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (input_event_mask_ & PP_INPUTEVENT_CLASS_TOUCH); 13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container_->requestTouchEventType(raw_touch ? 13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebPluginContainer::TouchEventRequestTypeRaw : 13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebPluginContainer::TouchEventRequestTypeSynthesizedMouse); 13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 140058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::IsAcceptingWheelEvents() const { 14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (filtered_input_event_mask_ & PP_INPUTEVENT_CLASS_WHEEL) || 14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (input_event_mask_ & PP_INPUTEVENT_CLASS_WHEEL); 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 140558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::ScheduleAsyncDidChangeView() { 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_change_weak_ptr_factory_.HasWeakPtrs()) 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // Already scheduled. 1408b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 1409b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FROM_HERE, 141058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch base::Bind(&PepperPluginInstanceImpl::SendAsyncDidChangeView, 1411b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) view_change_weak_ptr_factory_.GetWeakPtr())); 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 141458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SendAsyncDidChangeView() { 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The bound callback that owns the weak pointer is still valid until after 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this function returns. SendDidChangeView checks HasWeakPtrs, so we need to 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // invalidate them here. 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: If we ever want to have more than one pending callback, it should 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // use a different factory, or we should have a different strategy here. 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_change_weak_ptr_factory_.InvalidateWeakPtrs(); 14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendDidChangeView(); 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 142458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SendDidChangeView() { 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't send DidChangeView to crashed plugins. 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (module()->is_crashed()) 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_change_weak_ptr_factory_.HasWeakPtrs() || 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (sent_initial_did_change_view_ && 14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_view_data_.Equals(view_data_))) 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; // Nothing to update. 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_Size& size = view_data_.rect.size; 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Avoid sending a notification with a huge rectangle. 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (size.width < 0 || size.width > kMaxPluginSideLength || 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size.height < 0 || size.height > kMaxPluginSideLength || 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We know this won't overflow due to above checks. 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<uint32>(size.width) * static_cast<uint32>(size.height) > 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMaxPluginSize) { 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sent_initial_did_change_view_ = true; 14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_sent_view_data_ = view_data_; 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedPPResource resource( 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedPPResource::PassRef(), 14484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch (new PPB_View_Shared(ppapi::OBJECT_IS_IMPL, 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_instance(), view_data_))->GetReference()); 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_interface_->DidChangeView(pp_instance(), resource, 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &view_data_.rect, 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &view_data_.clip_rect); 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::ReportGeometry() { 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this call was delayed, we may have transitioned back to fullscreen in 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the mean time, so only report the geometry if we are actually in normal 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // mode. 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (container_ && !fullscreen_container_ && !flash_fullscreen_) 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_->reportGeometry(); 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 146458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::GetPreferredPrintOutputFormat( 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_PrintOutputFormat_Dev* format) { 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 146758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadPrintInterface()) 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t supported_formats = 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_print_interface_->QuerySupportedFormats(pp_instance()); 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (supported_formats & PP_PRINTOUTPUTFORMAT_PDF) { 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *format = PP_PRINTOUTPUTFORMAT_PDF; 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 147958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::SupportsPrintInterface() { 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_PrintOutputFormat_Dev format; 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetPreferredPrintOutputFormat(&format); 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 148458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::IsPrintScalingDisabled() { 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(plugin_print_interface_); 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_print_interface_) 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return plugin_print_interface_->IsScalingDisabled(pp_instance()) == PP_TRUE; 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 149158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochint PepperPluginInstanceImpl::PrintBegin(const WebPrintParams& print_params) { 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 149358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_PrintOutputFormat_Dev format; 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetPreferredPrintOutputFormat(&format)) { 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PrintBegin should not have been called since SupportsPrintInterface 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // would have returned false; 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_pages = 0; 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_PrintSettings_Dev print_settings; 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_settings.printable_area = PP_FromGfxRect(print_params.printableArea); 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_settings.content_area = PP_FromGfxRect(print_params.printContentArea); 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_settings.paper_size = PP_FromGfxSize(print_params.paperSize); 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_settings.dpi = print_params.printerDPI; 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_settings.orientation = PP_PRINTORIENTATION_NORMAL; 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_settings.grayscale = PP_FALSE; 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_settings.print_scaling_option = static_cast<PP_PrintScalingOption_Dev>( 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_params.printScalingOption); 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print_settings.format = format; 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) num_pages = plugin_print_interface_->Begin(pp_instance(), 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &print_settings); 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!num_pages) 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_print_settings_ = print_settings; 151790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) canvas_.clear(); 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ranges_.clear(); 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return num_pages; 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 152258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::PrintPage(int page_number, 152358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch WebKit::WebCanvas* canvas) { 1524a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch#if defined(ENABLE_FULL_PRINTING) 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(plugin_print_interface_); 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_PrintPageNumberRange_Dev page_range; 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_range.first_page_number = page_range.last_page_number = page_number; 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The canvas only has a metafile on it for print preview. 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool save_for_later = 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (printing::MetafileSkiaWrapper::GetMetafileFromCanvas(*canvas) != NULL); 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_WIN) 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) save_for_later = save_for_later && skia::IsPreviewMetafile(*canvas); 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (save_for_later) { 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ranges_.push_back(page_range); 153690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) canvas_ = skia::SharePtr(canvas); 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PrintPageHelper(&page_range, 1, canvas); 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else // defined(ENABLED_PRINTING) 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 154658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::PrintPageHelper( 1547bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch PP_PrintPageNumberRange_Dev* page_ranges, 1548bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch int num_ranges, 1549bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebKit::WebCanvas* canvas) { 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 155158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(plugin_print_interface_); 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_print_interface_) 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource print_output = plugin_print_interface_->PrintPages( 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp_instance(), page_ranges, num_ranges); 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!print_output) 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ret = false; 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_print_settings_.format == PP_PRINTOUTPUTFORMAT_PDF) 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = PrintPDFOutput(print_output, canvas); 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now we need to release the print output resource. 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginModule::GetCore()->ReleaseResource(print_output); 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ret; 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 157158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::PrintEnd() { 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 157358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ranges_.empty()) 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintPageHelper(&(ranges_.front()), ranges_.size(), canvas_.get()); 157690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) canvas_.clear(); 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ranges_.clear(); 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(plugin_print_interface_); 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (plugin_print_interface_) 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_print_interface_->End(pp_instance()); 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memset(¤t_print_settings_, 0, sizeof(current_print_settings_)); 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_printed_page_ = NULL; 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_MACOSX) 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 158958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::CanRotateView() { 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadPdfInterface()) 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 159658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::RotateView(WebPlugin::RotationType type) { 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!LoadPdfInterface()) 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_PrivatePageTransformType transform_type = 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type == WebPlugin::RotationType90Clockwise ? 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CW : 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CCW; 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_pdf_interface_->Transform(pp_instance(), transform_type); 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: plugin instance may have been deleted. 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 160758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::FlashIsFullscreenOrPending() { 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return fullscreen_container_ != NULL; 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 161158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::IsFullscreenOrPending() { 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return desired_fullscreen_state_; 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 161558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::SetFullscreen(bool fullscreen) { 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a reference on the stack. See NOTE above. 161758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check whether we are trying to switch to the state we're already going 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to (i.e. if we're already switching to fullscreen but the fullscreen 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // container isn't ready yet, don't do anything more). 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fullscreen == IsFullscreenOrPending()) 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check whether we are trying to switch while the state is in transition. 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The 2nd request gets dropped while messing up the internal state, so 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // disallow this. 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view_data_.is_fullscreen != desired_fullscreen_state_) 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fullscreen && !IsProcessingUserGesture()) 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VLOG(1) << "Setting fullscreen to " << (fullscreen ? "on" : "off"); 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desired_fullscreen_state_ = fullscreen; 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fullscreen) { 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the user gesture in case we're processing one that's pending. 16392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebScopedUserGesture user_gesture(CurrentUserGestureToken()); 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit does not resize the plugin to fill the screen in fullscreen mode, 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so we will tweak plugin's attributes to support the expected behavior. 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeepSizeAttributesBeforeFullscreen(); 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetSizeAttributesForFullscreen(); 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_->element().requestFullScreen(); 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_->element().document().cancelFullScreen(); 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::UpdateFlashFullscreenState( 165258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch bool flash_fullscreen) { 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_mouselock_pending = TrackedCallback::IsPending(lock_mouse_callback_); 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flash_fullscreen == flash_fullscreen_) { 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Manually clear callback when fullscreen fails with mouselock pending. 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!flash_fullscreen && is_mouselock_pending) 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_mouse_callback_->Run(PP_ERROR_FAILED); 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PPB_Graphics3D_Impl* graphics_3d = bound_graphics_3d_.get(); 1663868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (graphics_3d) 16642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateLayer(); 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool old_plugin_focus = PluginHasFocus(); 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flash_fullscreen_ = flash_fullscreen; 1668558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (is_mouselock_pending && !IsMouseLocked()) { 16692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsProcessingUserGesture() && 16702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !module_->permissions().HasPermission( 16714311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ppapi::PERMISSION_BYPASS_USER_GESTURE)) { 16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lock_mouse_callback_->Run(PP_ERROR_NO_USER_GESTURE); 16732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 16742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Open a user gesture here so the Webkit user gesture checks will succeed 16752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // for out-of-process plugins. 16762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebScopedUserGesture user_gesture(CurrentUserGestureToken()); 1677558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!LockMouse()) 16782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) lock_mouse_callback_->Run(PP_ERROR_FAILED); 16792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (PluginHasFocus() != old_plugin_focus) 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendFocusChangeNotification(); 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 168658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::IsViewAccelerated() { 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!container_) 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDocument document = container_->element().document(); 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = document.frame(); 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame) 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebView* view = frame->view(); 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!view) 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return view->isAcceleratedCompositingActive(); 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 170158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::PrintPDFOutput(PP_Resource print_output, 170258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch WebKit::WebCanvas* canvas) { 1703a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch#if defined(ENABLE_FULL_PRINTING) 17044311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ppapi::thunk::EnterResourceNoLock<PPB_Buffer_API> enter(print_output, true); 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BufferAutoMapper mapper(enter.object()); 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!mapper.data() || !mapper.size()) { 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For Windows, we need the PDF DLL to render the output PDF to a DC. 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HMODULE pdf_module = GetModuleHandle(L"pdf.dll"); 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pdf_module) 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderPDFPageToDCProc render_proc = 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<RenderPDFPageToDCProc>( 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetProcAddress(pdf_module, "RenderPDFPageToDC")); 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!render_proc) 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ret = false; 17262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_LINUX) || defined(OS_MACOSX) 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Linux we just set the final bits in the native metafile 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (NativeMetafile and PreviewMetafile must have compatible formats, 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // i.e. both PDF for this to work). 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::Metafile* metafile = 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::MetafileSkiaWrapper::GetMetafileFromCanvas(*canvas); 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(metafile != NULL); 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (metafile) 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = metafile->InitFromData(mapper.data(), mapper.size()); 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN) 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::Metafile* metafile = 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::MetafileSkiaWrapper::GetMetafileFromCanvas(*canvas); 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (metafile) { 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only have a metafile when doing print preview, so we just want to 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pass the PDF off to preview. 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = metafile->InitFromData(mapper.data(), mapper.size()); 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Windows, we now need to render the PDF to the DC that backs the 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // supplied canvas. 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HDC dc = skia::BeginPlatformPaint(canvas); 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DrawEmptyRectangle(dc); 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size_in_pixels; 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_in_pixels.set_width(printing::ConvertUnit( 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_print_settings_.printable_area.size.width, 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(printing::kPointsPerInch), 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_print_settings_.dpi)); 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_in_pixels.set_height(printing::ConvertUnit( 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_print_settings_.printable_area.size.height, 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(printing::kPointsPerInch), 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_print_settings_.dpi)); 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to scale down DC to fit an entire page into DC available area. 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First, we'll try to use default scaling based on the 72dpi that is 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // used in webkit for printing. 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If default scaling is not enough to fit the entire PDF without 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Current metafile is based on screen DC and have current screen size. 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Writing outside of those boundaries will result in the cut-off output. 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On metafiles (this is the case here), scaling down will still record 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // original coordinates and we'll be able to print in full resolution. 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Before playback we'll need to counter the scaling up that will happen 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the browser (printed_document_win.cc). 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double dynamic_scale = gfx::CalculatePageScale(dc, size_in_pixels.width(), 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_in_pixels.height()); 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double page_scale = static_cast<double>(printing::kPointsPerInch) / 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<double>(current_print_settings_.dpi); 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dynamic_scale < page_scale) { 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_scale = dynamic_scale; 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printing::MetafileSkiaWrapper::SetCustomScaleOnCanvas(*canvas, 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) page_scale); 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::ScaleDC(dc, page_scale); 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = render_proc(static_cast<unsigned char*>(mapper.data()), mapper.size(), 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, dc, current_print_settings_.dpi, 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_print_settings_.dpi, 0, 0, size_in_pixels.width(), 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_in_pixels.height(), true, false, true, true, true); 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) skia::EndPlatformPaint(canvas); 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ret; 1788a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch#else // defined(ENABLE_FULL_PRINTING) 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1793868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)static void IgnoreCallback(unsigned, bool) {} 1794868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 179558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::UpdateLayer() { 17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!container_) 17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1799868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) gpu::Mailbox mailbox; 18007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (bound_graphics_3d_.get()) { 1801558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PlatformContext3D* context = bound_graphics_3d_->platform_context(); 1802868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) context->GetBackingMailbox(&mailbox); 1803868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1804868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) bool want_layer = !mailbox.IsZero(); 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (want_layer == !!texture_layer_.get() && 18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_bound_to_fullscreen_ == !!fullscreen_container_) 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1810868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (texture_layer_.get()) { 18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!layer_bound_to_fullscreen_) 18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container_->setWebLayer(NULL); 18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (fullscreen_container_) 18142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_container_->SetLayer(NULL); 18152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_layer_.reset(); 18162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) texture_layer_ = NULL; 18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (want_layer) { 18192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(bound_graphics_3d_.get()); 1820868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) texture_layer_ = cc::TextureLayer::CreateForMailbox(NULL); 18212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_layer_.reset(new webkit::WebLayerImpl(texture_layer_)); 1822c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (fullscreen_container_) { 18232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fullscreen_container_->SetLayer(web_layer_.get()); 1824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Ignore transparency in fullscreen, since that's what Flash always 1825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // wants to do, and that lets it not recreate a context if 1826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // wmode=transparent was specified. 1827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) texture_layer_->SetContentsOpaque(true); 1828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } else { 18292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) container_->setWebLayer(web_layer_.get()); 1830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) texture_layer_->SetContentsOpaque(bound_graphics_3d_->IsOpaque()); 1831c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1832868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) texture_layer_->SetTextureMailbox( 1833868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) cc::TextureMailbox(mailbox, base::Bind(&IgnoreCallback), 0)); 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_bound_to_fullscreen_ = !!fullscreen_container_; 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 183858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::AddPluginObject(PluginObject* plugin_object) { 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(live_plugin_objects_.find(plugin_object) == 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) live_plugin_objects_.end()); 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) live_plugin_objects_.insert(plugin_object); 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 184458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::RemovePluginObject(PluginObject* plugin_object) { 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't actually verify that the object is in the set since during module 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // deletion we'll be in the process of freeing them. 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) live_plugin_objects_.erase(plugin_object); 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::IsProcessingUserGesture() { 18514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch PP_TimeTicks now = ppapi::TimeTicksToPPTimeTicks(base::TimeTicks::Now()); 18522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Give a lot of slack so tests won't be flaky. 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PP_TimeTicks kUserGestureDurationInSeconds = 10.0; 18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pending_user_gesture_token_.hasGestures() && 18552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (now - pending_user_gesture_ < kUserGestureDurationInSeconds); 18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 185858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochWebUserGestureToken PepperPluginInstanceImpl::CurrentUserGestureToken() { 18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsProcessingUserGesture()) 18602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pending_user_gesture_token_ = WebUserGestureToken(); 18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return pending_user_gesture_token_; 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 186458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::OnLockMouseACK(bool succeeded) { 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (TrackedCallback::IsPending(lock_mouse_callback_)) 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_mouse_callback_->Run(succeeded ? PP_OK : PP_ERROR_FAILED); 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 186958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::OnMouseLockLost() { 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (LoadMouseLockInterface()) 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_mouse_lock_interface_->MouseLockLost(pp_instance()); 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 187458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::HandleMouseLockedInputEvent( 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebKit::WebMouseEvent& event) { 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |cursor_info| is ignored since it is hidden when the mouse is locked. 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebCursorInfo cursor_info; 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleInputEvent(event, &cursor_info); 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 188158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SimulateInputEvent( 188258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const InputEventData& input_event) { 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebView* web_view = container()->element().document().frame()->view(); 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!web_view) { 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = SimulateIMEEvent(input_event); 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (handled) 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<linked_ptr<WebInputEvent> > events = 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateSimulatedWebInputEvents( 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_event, 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_data_.rect.point.x + view_data_.rect.size.width / 2, 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_data_.rect.point.y + view_data_.rect.size.height / 2); 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<linked_ptr<WebInputEvent> >::iterator it = events.begin(); 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != events.end(); ++it) { 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_view->handleInputEvent(*it->get()); 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 190458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::SimulateIMEEvent( 190558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const InputEventData& input_event) { 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (input_event.event_type) { 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_IME_COMPOSITION_START: 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE: 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateImeSetCompositionEvent(input_event); 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_IME_COMPOSITION_END: 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(input_event.character_text.empty()); 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateImeSetCompositionEvent(input_event); 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case PP_INPUTEVENT_TYPE_IME_TEXT: 1916558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch render_view_->SimulateImeConfirmComposition( 1917558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch UTF8ToUTF16(input_event.character_text), ui::Range()); 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 192558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SimulateImeSetCompositionEvent( 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const InputEventData& input_event) { 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<size_t> offsets; 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offsets.push_back(input_event.composition_selection_start); 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offsets.push_back(input_event.composition_selection_end); 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offsets.insert(offsets.end(), 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_event.composition_segment_offsets.begin(), 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_event.composition_segment_offsets.end()); 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 utf16_text = 19352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::UTF8ToUTF16AndAdjustOffsets(input_event.character_text, &offsets); 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<WebKit::WebCompositionUnderline> underlines; 19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 2; i + 1 < offsets.size(); ++i) { 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebCompositionUnderline underline; 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) underline.startOffset = offsets[i]; 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) underline.endOffset = offsets[i + 1]; 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (input_event.composition_target_segment == static_cast<int32_t>(i - 2)) 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) underline.thick = true; 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) underlines.push_back(underline); 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1947558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch render_view_->SimulateImeSetComposition( 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) utf16_text, underlines, offsets[0], offsets[1]); 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochContentDecryptorDelegate* 195258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PepperPluginInstanceImpl::GetContentDecryptorDelegate() { 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (content_decryptor_delegate_) 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return content_decryptor_delegate_.get(); 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PPP_ContentDecryptor_Private* plugin_decryption_interface = 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<const PPP_ContentDecryptor_Private*>( 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_->GetPluginInterface( 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_CONTENTDECRYPTOR_PRIVATE_INTERFACE)); 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plugin_decryption_interface) 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_decryptor_delegate_.reset( 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ContentDecryptorDelegate(pp_instance_, plugin_decryption_interface)); 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return content_decryptor_delegate_.get(); 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 196858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Bool PepperPluginInstanceImpl::BindGraphics(PP_Instance instance, 196958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Resource device) { 197058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch TRACE_EVENT0("ppapi", "PepperPluginInstanceImpl::BindGraphics"); 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The Graphics3D instance can't be destroyed until we call 19722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // UpdateLayer(). 19734311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch scoped_refptr<ppapi::Resource> old_graphics = bound_graphics_3d_.get(); 1974868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (bound_graphics_3d_.get()) { 19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bound_graphics_3d_->BindToInstance(false); 19762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bound_graphics_3d_ = NULL; 19772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 19782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (bound_graphics_2d_platform_) { 1979558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch bound_graphics_2d_platform_->BindToInstance(NULL); 19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bound_graphics_2d_platform_ = NULL; 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Special-case clearing the current device. 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!device) { 19852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateLayer(); 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InvalidateRect(gfx::Rect()); 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_TRUE; 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Refuse to bind if in transition to fullscreen with PPB_FlashFullscreen or 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to/from fullscreen with PPB_Fullscreen. 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((fullscreen_container_ && !flash_fullscreen_) || 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) desired_fullscreen_state_ != view_data_.is_fullscreen) 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1996558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const ppapi::host::PpapiHost* ppapi_host = 1997558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch RendererPpapiHost::GetForPPInstance(instance)->GetPpapiHost(); 1998558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ppapi::host::ResourceHost* host = ppapi_host->GetResourceHost(device); 1999558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PepperGraphics2DHost* graphics_2d = NULL; 2000558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (host) { 2001a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (host->IsGraphics2DHost()) 2002a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) graphics_2d = static_cast<PepperGraphics2DHost*>(host); 2003558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch DLOG_IF(ERROR, !graphics_2d) << "Resource is not PepperGraphics2DHost."; 2004558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 2005558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterResourceNoLock<PPB_Graphics3D_API> enter_3d(device, false); 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPB_Graphics3D_Impl* graphics_3d = enter_3d.succeeded() ? 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<PPB_Graphics3D_Impl*>(enter_3d.object()) : NULL; 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (graphics_2d) { 2011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (graphics_2d->BindToInstance(this)) { 2012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bound_graphics_2d_platform_ = graphics_2d; 2013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateLayer(); 2014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return PP_TRUE; 2015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (graphics_3d) { 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure graphics can only be bound to the instance it is 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // associated with. 2019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (graphics_3d->pp_instance() == pp_instance() && 2020c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) graphics_3d->BindToInstance(true)) { 2021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bound_graphics_3d_ = graphics_3d; 2022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateLayer(); 2023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return PP_TRUE; 2024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The instance cannot be bound or the device is not a valid resource type. 2028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return PP_FALSE; 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 203158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Bool PepperPluginInstanceImpl::IsFullFrame(PP_Instance instance) { 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FromBool(full_frame()); 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 203558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochconst ViewData* PepperPluginInstanceImpl::GetViewData(PP_Instance instance) { 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return &view_data_; 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 203958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Bool PepperPluginInstanceImpl::FlashIsFullscreen(PP_Instance instance) { 20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_FromBool(flash_fullscreen_); 20412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 20422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 204358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Var PepperPluginInstanceImpl::GetWindowObject(PP_Instance instance) { 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!container_) 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = container_->element().document().frame(); 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame) 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NPObjectToPPVar(this, frame->windowObject()); 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Var PepperPluginInstanceImpl::GetOwnerElementObject(PP_Instance instance) { 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!container_) 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NPObjectToPPVar(this, container_->scriptableObjectForElement()); 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 206058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Var PepperPluginInstanceImpl::ExecuteScript(PP_Instance instance, 206158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Var script, 206258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Var* exception) { 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Executing the script may remove the plugin from the DOM, so we need to keep 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a reference to ourselves so that we can still process the result after the 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebBindings::evaluate() below. 206658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TryCatch try_catch(exception); 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (try_catch.has_exception()) 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convert the script into an inconvenient NPString object. 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringVar* script_string = StringVar::FromPPVar(script); 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!script_string) { 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try_catch.SetException("Script param to ExecuteScript must be a string."); 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPString np_script; 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) np_script.UTF8Characters = script_string->value().c_str(); 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) np_script.UTF8Length = script_string->value().length(); 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the current frame to pass to the evaluate function. 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = container_->element().document().frame(); 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!frame) { 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try_catch.SetException("No frame to execute script in."); 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NPVariant result; 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ok = false; 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsProcessingUserGesture()) { 20912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebScopedUserGesture user_gesture(CurrentUserGestureToken()); 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ok = WebBindings::evaluate(NULL, frame->windowObject(), &np_script, 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result); 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ok = WebBindings::evaluate(NULL, frame->windowObject(), &np_script, 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result); 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ok) { 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TryCatch doesn't catch the exceptions properly. Since this is only for 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a trusted API, just set to a general exception message. 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try_catch.SetException("Exception caught"); 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebBindings::releaseVariantValue(&result); 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeUndefined(); 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var ret = NPVariantToPPVar(this, &result); 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebBindings::releaseVariantValue(&result); 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ret; 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 211158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochuint32_t PepperPluginInstanceImpl::GetAudioHardwareOutputSampleRate( 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance) { 2113558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch RenderThreadImpl* thread = RenderThreadImpl::current(); 2114558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return thread->GetAudioHardwareConfig()->GetOutputSampleRate(); 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 211758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochuint32_t PepperPluginInstanceImpl::GetAudioHardwareOutputBufferSize( 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance) { 2119558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch RenderThreadImpl* thread = RenderThreadImpl::current(); 2120558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return thread->GetAudioHardwareConfig()->GetOutputBufferSize(); 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 212358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Var PepperPluginInstanceImpl::GetDefaultCharSet(PP_Instance instance) { 2124558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return StringVar::StringToPPVar( 2125558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch render_view_->webkit_preferences().default_encoding); 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These PPB_ContentDecryptor_Private calls are responses to 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PPP_ContentDecryptor_Private calls made on |content_decryptor_delegate_|. 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Therefore, |content_decryptor_delegate_| must have been initialized when 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the following methods are called. 213258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::NeedKey(PP_Instance instance, 213358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Var key_system_var, 213458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Var session_id_var, 213558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Var init_data_var) { 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_decryptor_delegate_->NeedKey( 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_system_var, session_id_var, init_data_var); 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 214058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::KeyAdded(PP_Instance instance, 214158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Var key_system_var, 214258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Var session_id_var) { 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_decryptor_delegate_->KeyAdded(key_system_var, session_id_var); 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 214658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::KeyMessage(PP_Instance instance, 214758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Var key_system_var, 214858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Var session_id_var, 214958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Var message_var, 215058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Var default_url_var) { 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_decryptor_delegate_->KeyMessage( 21522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key_system_var, session_id_var, message_var, default_url_var); 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::KeyError(PP_Instance instance, 215658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Var key_system_var, 215758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Var session_id_var, 215858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch int32_t media_error, 215958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch int32_t system_code) { 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_decryptor_delegate_->KeyError( 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_system_var, session_id_var, media_error, system_code); 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 216458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::DeliverBlock( 216558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Instance instance, 216658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Resource decrypted_block, 216758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const PP_DecryptedBlockInfo* block_info) { 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_decryptor_delegate_->DeliverBlock(decrypted_block, block_info); 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 217158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::DecoderInitializeDone( 2172bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch PP_Instance instance, 2173bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch PP_DecryptorStreamType decoder_type, 2174bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch uint32_t request_id, 2175bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch PP_Bool success) { 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_decryptor_delegate_->DecoderInitializeDone( 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decoder_type, request_id, success); 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 218058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::DecoderDeinitializeDone( 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_DecryptorStreamType decoder_type, 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t request_id) { 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_decryptor_delegate_->DecoderDeinitializeDone(decoder_type, 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) request_id); 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 218858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::DecoderResetDone( 218958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Instance instance, 219058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_DecryptorStreamType decoder_type, 219158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch uint32_t request_id) { 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_decryptor_delegate_->DecoderResetDone(decoder_type, request_id); 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 219658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::DeliverFrame( 219758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Instance instance, 219858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Resource decrypted_frame, 219958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const PP_DecryptedFrameInfo* frame_info) { 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_decryptor_delegate_->DeliverFrame(decrypted_frame, frame_info); 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 220358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::DeliverSamples( 2204bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch PP_Instance instance, 2205bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch PP_Resource audio_frames, 2206bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch const PP_DecryptedBlockInfo* block_info) { 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_decryptor_delegate_->DeliverSamples(audio_frames, block_info); 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 221058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::NumberOfFindResultsChanged( 221158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Instance instance, 221258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch int32_t total, 221358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Bool final_result) { 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(find_identifier_, -1); 2215558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch render_view_->reportFindInPageMatchCount( 2216558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch find_identifier_, total, PP_ToBool(final_result)); 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 221958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SelectedFindResultChanged(PP_Instance instance, 222058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch int32_t index) { 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_NE(find_identifier_, -1); 2222558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch render_view_->reportFindInPageSelection( 2223558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch find_identifier_, index + 1, WebKit::WebRect()); 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 222658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Bool PepperPluginInstanceImpl::IsFullscreen(PP_Instance instance) { 2227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return PP_FromBool(view_data_.is_fullscreen); 2228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 2229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 223058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Bool PepperPluginInstanceImpl::SetFullscreen(PP_Instance instance, 223158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Bool fullscreen) { 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FromBool(SetFullscreen(PP_ToBool(fullscreen))); 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 223558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Bool PepperPluginInstanceImpl::GetScreenSize(PP_Instance instance, 223658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Size* size) { 2237558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch WebKit::WebScreenInfo info = render_view_->screenInfo(); 2238558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch *size = PP_MakeSize(info.rect.width, info.rect.height); 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_TRUE; 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22424311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochppapi::Resource* PepperPluginInstanceImpl::GetSingletonResource( 22432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Instance instance, 22444311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ppapi::SingletonResourceID id) { 22452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Flash APIs and some others aren't implemented in-process. 22462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (id) { 22474311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case ppapi::BROKER_SINGLETON_ID: 22484311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case ppapi::BROWSER_FONT_SINGLETON_ID: 22494311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case ppapi::CRX_FILESYSTEM_SINGLETON_ID: 22504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case ppapi::EXTENSIONS_COMMON_SINGLETON_ID: 22514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case ppapi::FLASH_CLIPBOARD_SINGLETON_ID: 22524311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case ppapi::FLASH_FILE_SINGLETON_ID: 22534311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case ppapi::FLASH_FULLSCREEN_SINGLETON_ID: 22544311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case ppapi::FLASH_SINGLETON_ID: 22554311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case ppapi::NETWORK_PROXY_SINGLETON_ID: 22564311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case ppapi::PDF_SINGLETON_ID: 22574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case ppapi::TRUETYPE_FONT_SINGLETON_ID: 22582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTIMPLEMENTED(); 22592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 22604311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch case ppapi::GAMEPAD_SINGLETON_ID: 2261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return gamepad_impl_.get(); 22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 226858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochint32_t PepperPluginInstanceImpl::RequestInputEvents(PP_Instance instance, 226958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch uint32_t event_classes) { 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_event_mask_ |= event_classes; 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filtered_input_event_mask_ &= ~(event_classes); 22722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestInputEventsHelper(event_classes); 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ValidateRequestInputEvents(false, event_classes); 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 227658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochint32_t PepperPluginInstanceImpl::RequestFilteringInputEvents( 2277bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch PP_Instance instance, 2278bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch uint32_t event_classes) { 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filtered_input_event_mask_ |= event_classes; 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_event_mask_ &= ~(event_classes); 22812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestInputEventsHelper(event_classes); 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ValidateRequestInputEvents(true, event_classes); 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 228558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::ClearInputEventRequest(PP_Instance instance, 228658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch uint32_t event_classes) { 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_event_mask_ &= ~(event_classes); 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filtered_input_event_mask_ &= ~(event_classes); 22892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestInputEventsHelper(event_classes); 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 229258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::ZoomChanged(PP_Instance instance, 229358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch double factor) { 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only want to tell the page to change its zoom if the whole page is the 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // plugin. If we're in an iframe, then don't do anything. 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsFullPagePlugin()) 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 229858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch container()->zoomLevelChanged(content::ZoomFactorToZoomLevel(factor)); 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 230158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::ZoomLimitsChanged(PP_Instance instance, 230258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch double minimum_factor, 2303558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch double maximum_factor) { 2304558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (minimum_factor > maximum_factor) { 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2308558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch double minimum_level = ZoomFactorToZoomLevel(minimum_factor); 2309558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch double maximum_level = ZoomFactorToZoomLevel(maximum_factor); 2310558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch render_view_->webview()->zoomLimitsChanged(minimum_level, maximum_level); 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 231358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::PostMessage(PP_Instance instance, 231458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Var message) { 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_channel_->PostMessageToJavaScript(message); 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 231858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Bool PepperPluginInstanceImpl::SetCursor(PP_Instance instance, 231958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_MouseCursor_Type type, 232058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Resource image, 232158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const PP_Point* hot_spot) { 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ValidateSetCursorParams(type, image, hot_spot)) 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type != PP_MOUSECURSOR_TYPE_CUSTOM) { 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoSetCursor(new WebCursorInfo(static_cast<WebCursorInfo::Type>(type))); 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_TRUE; 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnterResourceNoLock<PPB_ImageData_API> enter(image, true); 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPB_ImageData_Impl* image_data = 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<PPB_ImageData_Impl*>(enter.object()); 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ImageDataAutoMapper auto_mapper(image_data); 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!auto_mapper.is_valid()) 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebCursorInfo> custom_cursor( 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new WebCursorInfo(WebCursorInfo::TypeCustom)); 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) custom_cursor->hotSpot.x = hot_spot->x; 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) custom_cursor->hotSpot.y = hot_spot->y; 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkBitmap* bitmap = image_data->GetMappedBitmap(); 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make a deep copy, so that the cursor remains valid even after the original 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // image data gets freed. 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!bitmap->copyTo(&custom_cursor->customImage.getSkBitmap(), 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitmap->config())) { 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoSetCursor(custom_cursor.release()); 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_TRUE; 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochint32_t PepperPluginInstanceImpl::LockMouse( 235858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Instance instance, 235958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<TrackedCallback> callback) { 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (TrackedCallback::IsPending(lock_mouse_callback_)) 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_ERROR_INPROGRESS; 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2363558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (IsMouseLocked()) 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_OK; 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!CanAccessMainFrame()) 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_ERROR_NOACCESS; 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsProcessingUserGesture()) 23702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_NO_USER_GESTURE; 23712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Attempt mouselock only if Flash isn't waiting on fullscreen, otherwise 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we wait and call LockMouse() in UpdateFlashFullscreenState(). 2374558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!FlashIsFullscreenOrPending() || flash_fullscreen_) { 23752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Open a user gesture here so the Webkit user gesture checks will succeed 23762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // for out-of-process plugins. 23772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebScopedUserGesture user_gesture(CurrentUserGestureToken()); 2378558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!LockMouse()) 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_ERROR_FAILED; 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Either mouselock succeeded or a Flash fullscreen is pending. 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_mouse_callback_ = callback; 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_OK_COMPLETIONPENDING; 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 238758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::UnlockMouse(PP_Instance instance) { 2388558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch GetMouseLockDispatcher()->UnlockMouse(GetOrCreateLockTargetAdapter()); 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 239158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SetTextInputType(PP_Instance instance, 239258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_TextInput_Type type) { 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int itype = type; 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (itype < 0 || itype > ui::TEXT_INPUT_TYPE_URL) 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) itype = ui::TEXT_INPUT_TYPE_NONE; 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_input_type_ = static_cast<ui::TextInputType>(itype); 23973240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch render_view_->PepperTextInputTypeChanged(this); 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 240058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::UpdateCaretPosition( 240158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Instance instance, 240258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const PP_Rect& caret, 240358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const PP_Rect& bounding_box) { 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_input_caret_ = PP_ToGfxRect(caret); 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_input_caret_bounds_ = PP_ToGfxRect(bounding_box); 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_input_caret_set_ = true; 24073240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch render_view_->PepperCaretPositionChanged(this); 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 241058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::CancelCompositionText(PP_Instance instance) { 24113240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch render_view_->PepperCancelComposition(this); 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 241458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SelectionChanged(PP_Instance instance) { 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(kinaba): currently the browser always calls RequestSurroundingText. 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It can be optimized so that it won't call it back until the information 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is really needed. 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Avoid calling in nested context or else this will reenter the plugin. This 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // uses a weak pointer rather than exploiting the fact that this class is 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // refcounted because we don't actually want this operation to affect the 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lifetime of the instance. 2423b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 2424b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) FROM_HERE, 242558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch base::Bind(&PepperPluginInstanceImpl::RequestSurroundingText, 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AsWeakPtr(), 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<size_t>(kExtraCharsForTextInput))); 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 243058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::UpdateSurroundingText(PP_Instance instance, 243158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const char* text, 243258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch uint32_t caret, 243358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch uint32_t anchor) { 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) surrounding_text_ = text; 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_caret_ = caret; 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selection_anchor_ = anchor; 24373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch render_view_->PepperSelectionChanged(this); 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 244058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Var PepperPluginInstanceImpl::ResolveRelativeToDocument( 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Var relative, 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_URLComponents_Dev* components) { 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringVar* relative_string = StringVar::FromPPVar(relative); 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!relative_string) 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_MakeNull(); 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement plugin_element = container()->element(); 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL document_url = plugin_element.document().baseURL(); 24504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return ppapi::PPB_URLUtil_Shared::GenerateURLReturn( 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) document_url.Resolve(relative_string->value()), 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) components); 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Bool PepperPluginInstanceImpl::DocumentCanRequest(PP_Instance instance, 245658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Var url) { 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringVar* url_string = StringVar::FromPPVar(url); 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url_string) 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebSecurityOrigin security_origin; 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SecurityOriginForInstance(instance, &security_origin)) 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL gurl(url_string->value()); 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!gurl.is_valid()) 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return BoolToPPBool(security_origin.canRequest(gurl)); 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 247258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Bool PepperPluginInstanceImpl::DocumentCanAccessDocument( 247358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Instance instance, 247458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Instance target) { 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebSecurityOrigin our_origin; 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SecurityOriginForInstance(instance, &our_origin)) 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebSecurityOrigin target_origin; 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!SecurityOriginForInstance(instance, &target_origin)) 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PP_FALSE; 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return BoolToPPBool(our_origin.canAccess(target_origin)); 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 248658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Var PepperPluginInstanceImpl::GetDocumentURL( 248758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_Instance instance, 248858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PP_URLComponents_Dev* components) { 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebDocument document = container()->element().document(); 24904311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return ppapi::PPB_URLUtil_Shared::GenerateURLReturn(document.url(), 24914311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch components); 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 249458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Var PepperPluginInstanceImpl::GetPluginInstanceURL( 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_URLComponents_Dev* components) { 24974311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch return ppapi::PPB_URLUtil_Shared::GenerateURLReturn(plugin_url_, 24984311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch components); 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 250158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_ExternalPluginResult PepperPluginInstanceImpl::ResetAsProxied( 25022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<PluginModule> module) { 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save the original module and switch over to the new one now that this 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // plugin is using the IPC-based proxy. 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_module_ = module_; 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) module_ = module; 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Don't send any messages to the plugin until DidCreate() has finished. 25092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_channel_->QueueJavaScriptMessages(); 25102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For NaCl instances, remember the NaCl plugin instance interface, so we 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can shut it down by calling its DidDestroy in our Delete() method. 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) original_instance_interface_.reset(instance_interface_.release()); 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Callback<const void*(const char*)> get_plugin_interface_func = 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&PluginModule::GetPluginInterface, module_.get()); 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_Instance_Combined* ppp_instance_combined = 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PPP_Instance_Combined::Create(get_plugin_interface_func); 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ppp_instance_combined) { 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The proxy must support at least one usable PPP_Instance interface. 25212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // While this could be a failure to implement the interface in the NaCl 25222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // module, it is more likely that the NaCl process has crashed. Either 25232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // way, report that module initialization failed. 2524a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return PP_EXTERNAL_PLUGIN_ERROR_MODULE; 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_interface_.reset(ppp_instance_combined); 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear all PPP interfaces we may have cached. 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_find_interface_ = NULL; 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_input_event_interface_ = NULL; 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checked_for_plugin_input_event_interface_ = false; 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_messaging_interface_ = NULL; 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checked_for_plugin_messaging_interface_ = false; 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_mouse_lock_interface_ = NULL; 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_pdf_interface_ = NULL; 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) checked_for_plugin_pdf_interface_ = false; 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_private_interface_ = NULL; 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_selection_interface_ = NULL; 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_textinput_interface_ = NULL; 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_zoom_interface_ = NULL; 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Re-send the DidCreate event via the proxy. 2543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<const char*[]> argn_array(StringVectorToArgArray(argn_)); 2544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<const char*[]> argv_array(StringVectorToArgArray(argv_)); 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!instance_interface_->DidCreate(pp_instance(), argn_.size(), 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) argn_array.get(), argv_array.get())) 2547a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return PP_EXTERNAL_PLUGIN_ERROR_INSTANCE; 25482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_channel_->StopQueueingJavaScriptMessages(); 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear sent_initial_did_change_view_ and cancel any pending DidChangeView 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // event. This way, SendDidChangeView will send the "current" view 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // immediately (before other events like HandleDocumentLoad). 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sent_initial_did_change_view_ = false; 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) view_change_weak_ptr_factory_.InvalidateWeakPtrs(); 25552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendDidChangeView(); 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25574311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch DCHECK(external_document_load_); 25584311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch external_document_load_ = false; 25594311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch if (!external_document_response_.isNull()) { 256090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) document_loader_ = NULL; 256190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Pass the response to the new proxy. 25624311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch HandleDocumentLoad(external_document_response_); 25634311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch external_document_response_ = WebKit::WebURLResponse(); 256490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Replay any document load events we've received to the real loader. 25654311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch external_document_loader_->ReplayReceivedData(document_loader_); 25664311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch external_document_loader_.reset(NULL); 256790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 256890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2569a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return PP_EXTERNAL_PLUGIN_OK; 25702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 25712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 257258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::IsValidInstanceOf(PluginModule* module) { 25732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(module); 25742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return module == module_.get() || 25752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) module == original_module_.get(); 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 257858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochNPP PepperPluginInstanceImpl::instanceNPP() { 257990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return npp_.get(); 258090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 258190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 258258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochv8::Isolate* PepperPluginInstanceImpl::GetIsolate() const { 25837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return isolate_; 25847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 25857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 258658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstance* PepperPluginInstance::Get(PP_Instance instance_id) { 2587a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return HostGlobals::Get()->GetInstance(instance_id); 2588a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 2589a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 259058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochRenderView* PepperPluginInstanceImpl::GetRenderView() { 2591bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return render_view_; 2592bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 2593bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 259458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochWebKit::WebPluginContainer* PepperPluginInstanceImpl::GetContainer() { 2595bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return container_; 2596bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 2597bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 25984311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdochppapi::VarTracker* PepperPluginInstanceImpl::GetVarTracker() { 2599a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return HostGlobals::Get()->GetVarTracker(); 2600a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 2601a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 260258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochconst GURL& PepperPluginInstanceImpl::GetPluginURL() { 2603bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return plugin_url_; 2604bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 2605bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 260658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbase::FilePath PepperPluginInstanceImpl::GetModulePath() { 2607bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return module_->path(); 2608bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 2609bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2610a031efa9dbd9b321781674193e8ac7636d47eb1dBen MurdochPP_Resource PepperPluginInstanceImpl::CreateExternalFileReference( 2611a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch const base::FilePath& external_file_path) { 2612a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch PPB_FileRef_Impl* ref = PPB_FileRef_Impl::CreateExternal( 2613a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch pp_instance(), external_file_path, ""); 2614a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch return ref->GetReference(); 2615a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch} 2616a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch 261758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_Resource PepperPluginInstanceImpl::CreateImage(gfx::ImageSkia* source_image, 261858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch float scale) { 2619a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch ui::ScaleFactor scale_factor = ui::GetScaleFactorFromScale(scale); 2620a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch gfx::ImageSkiaRep image_skia_rep = source_image->GetRepresentation( 2621a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch scale_factor); 2622a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 2623a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (image_skia_rep.is_null() || image_skia_rep.scale_factor() != scale_factor) 2624a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return 0; 2625a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 262658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PPB_ImageData_Impl> image_data(new PPB_ImageData_Impl( 262758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch pp_instance(), 262858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PPB_ImageData_Impl::PLATFORM)); 2629a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (!image_data->Init( 263058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch PPB_ImageData_Impl::GetNativeImageDataFormat(), 2631a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch image_skia_rep.pixel_width(), 2632a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch image_skia_rep.pixel_height(), 2633a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch false)) { 2634a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return 0; 2635a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 2636a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 263758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch ImageDataAutoMapper mapper(image_data.get()); 2638a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (!mapper.is_valid()) 2639a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return 0; 2640a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 2641a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch skia::PlatformCanvas* canvas = image_data->GetPlatformCanvas(); 2642a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Note: Do not SkBitmap::copyTo the canvas bitmap directly because it will 2643a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // ignore the allocated pixels in shared memory and re-allocate a new buffer. 2644a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch canvas->writePixels(image_skia_rep.sk_bitmap(), 0, 0); 2645a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 2646a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return image_data->GetReference(); 2647a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 2648a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 264958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPP_ExternalPluginResult PepperPluginInstanceImpl::SwitchToOutOfProcessProxy( 2650a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch const base::FilePath& file_path, 26514311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ppapi::PpapiPermissions permissions, 2652a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch const IPC::ChannelHandle& channel_handle, 2653a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch base::ProcessId plugin_pid, 2654a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch int plugin_child_id) { 2655a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Create a new module for each instance of the external plugin that is using 2656a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // the IPC based out-of-process proxy. We can't use the existing module, 2657a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // because it is configured for the in-process plugin, and we must keep it 2658a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // that way to allow the page to create other instances. 265958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PluginModule> external_plugin_module( 2660a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch module_->CreateModuleForExternalPluginInstance()); 2661a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 26623240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch RendererPpapiHostImpl* renderer_ppapi_host = 26633240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch external_plugin_module->CreateOutOfProcessModule( 26643240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch render_view_, 2665a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch file_path, 2666a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch permissions, 2667a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch channel_handle, 2668a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch plugin_pid, 26693240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch plugin_child_id, 26703240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch true); 2671a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (!renderer_ppapi_host) { 2672a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch DLOG(ERROR) << "CreateExternalPluginModule() failed"; 2673a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return PP_EXTERNAL_PLUGIN_ERROR_MODULE; 2674a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 2675a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 2676a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch // Finally, switch the instance to the proxy. 2677a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return external_plugin_module->InitAsProxiedExternalPlugin(this); 2678a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch} 2679a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 268058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SetAlwaysOnTop(bool on_top) { 2681bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch always_on_top_ = on_top; 2682bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 2683bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 268458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::DoSetCursor(WebCursorInfo* cursor) { 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cursor_.reset(cursor); 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fullscreen_container_) { 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fullscreen_container_->DidChangeCursor(*cursor); 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 26893240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch render_view_->PepperDidChangeCursor(this, *cursor); 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 269358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::IsFullPagePlugin() { 2694bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebFrame* frame = container()->element().document().frame(); 2695bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return frame->view()->mainFrame()->document().isPluginDocument(); 2696bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 2697bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 269858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::FlashSetFullscreen(bool fullscreen, 269958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch bool delay_report) { 270058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch TRACE_EVENT0("ppapi", "PepperPluginInstanceImpl::FlashSetFullscreen"); 2701bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Keep a reference on the stack. See NOTE above. 270258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch scoped_refptr<PepperPluginInstanceImpl> ref(this); 2703bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2704bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // We check whether we are trying to switch to the state we're already going 2705bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // to (i.e. if we're already switching to fullscreen but the fullscreen 2706bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // container isn't ready yet, don't do anything more). 2707bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (fullscreen == FlashIsFullscreenOrPending()) 2708bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return; 2709bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2710bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Unbind current 2D or 3D graphics context. 2711bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch VLOG(1) << "Setting fullscreen to " << (fullscreen ? "on" : "off"); 2712bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (fullscreen) { 2713bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DCHECK(!fullscreen_container_); 2714558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch fullscreen_container_ = render_view_->CreatePepperFullscreenContainer(this); 2715bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch UpdateLayer(); 2716bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } else { 2717bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch DCHECK(fullscreen_container_); 2718bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch fullscreen_container_->Destroy(); 2719bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch fullscreen_container_ = NULL; 2720bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch UpdateFlashFullscreenState(false); 2721bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (!delay_report) { 2722bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ReportGeometry(); 2723bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } else { 2724bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch base::MessageLoop::current()->PostTask( 272558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch FROM_HERE, 272658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch base::Bind(&PepperPluginInstanceImpl::ReportGeometry, this)); 2727bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 2728bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 2729bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 2730bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 273158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::IsRectTopmost(const gfx::Rect& rect) { 2732bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (flash_fullscreen_) 2733bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return true; 2734bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2735bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return container_->isRectTopmost(rect); 2736bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 2737bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 27382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochint32_t PepperPluginInstanceImpl::Navigate( 27394311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch const ppapi::URLRequestInfoData& request, 274058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch const char* target, 27412385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch bool from_user_action) { 27422385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (!container_) 27432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return PP_ERROR_FAILED; 2744bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 2745bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebDocument document = container_->element().document(); 2746bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebFrame* frame = document.frame(); 27472385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (!frame) 27482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return PP_ERROR_FAILED; 27492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 27504311e82a78ceafbe0585f51d4c8a86df9f21aa0dBen Murdoch ppapi::URLRequestInfoData completed_request = request; 27512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 27522385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch WebURLRequest web_request; 2753a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch if (!CreateWebURLRequest(&completed_request, frame, &web_request)) 27542385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return PP_ERROR_FAILED; 27552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch web_request.setFirstPartyForCookies(document.firstPartyForCookies()); 27562385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch web_request.setHasUserGesture(from_user_action); 27572385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 27582385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch GURL gurl(web_request.url()); 27592385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (gurl.SchemeIs("javascript")) { 27602385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // In imitation of the NPAPI implementation, only |target_frame == frame| is 27612385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // allowed for security reasons. 27622385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch WebFrame* target_frame = 27632385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch frame->view()->findFrameByName(WebString::fromUTF8(target), frame); 27642385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (target_frame != frame) 27652385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return PP_ERROR_NOACCESS; 27662385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 27672385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // TODO(viettrungluu): NPAPI sends the result back to the plugin -- do we 27682385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // need that? 27692385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch WebString result = container_->executeScriptURL(gurl, from_user_action); 27702385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return result.isNull() ? PP_ERROR_FAILED : PP_OK; 2771bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 2772bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 27732385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Only GETs and POSTs are supported. 27742385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (web_request.httpMethod() != "GET" && 27752385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch web_request.httpMethod() != "POST") 27762385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return PP_ERROR_BADARGUMENT; 2777bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 27782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch WebString target_str = WebString::fromUTF8(target); 27792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch container_->loadFrameRequest(web_request, target_str, false, NULL); 27802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch return PP_OK; 2781bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 2782bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 278358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochbool PepperPluginInstanceImpl::CanAccessMainFrame() const { 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!container_) 27855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 27865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebDocument containing_document = container_->element().document(); 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!containing_document.frame() || 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !containing_document.frame()->view() || 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !containing_document.frame()->view()->mainFrame()) { 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebDocument main_document = 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) containing_document.frame()->view()->mainFrame()->document(); 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return containing_document.securityOrigin().canAccess( 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_document.securityOrigin()); 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 280058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::KeepSizeAttributesBeforeFullscreen() { 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement element = container_->element(); 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) width_before_fullscreen_ = element.getAttribute(WebString::fromUTF8(kWidth)); 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) height_before_fullscreen_ = 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element.getAttribute(WebString::fromUTF8(kHeight)); 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) border_before_fullscreen_ = 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element.getAttribute(WebString::fromUTF8(kBorder)); 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style_before_fullscreen_ = element.getAttribute(WebString::fromUTF8(kStyle)); 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 281058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::SetSizeAttributesForFullscreen() { 2811558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch WebKit::WebScreenInfo info = render_view_->screenInfo(); 2812558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch screen_size_for_fullscreen_ = gfx::Size(info.rect.width, info.rect.height); 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string width = StringPrintf("%d", screen_size_for_fullscreen_.width()); 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string height = StringPrintf("%d", screen_size_for_fullscreen_.height()); 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement element = container_->element(); 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element.setAttribute(WebString::fromUTF8(kWidth), WebString::fromUTF8(width)); 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element.setAttribute(WebString::fromUTF8(kHeight), 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebString::fromUTF8(height)); 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element.setAttribute(WebString::fromUTF8(kBorder), WebString::fromUTF8("0")); 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // There should be no style settings that matter in fullscreen mode, 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so just replace them instead of appending. 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NOTE: "position: fixed" and "display: block" reset the plugin and 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // using %% settings might not work without them (e.g. if the plugin is a 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // child of a container element). 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string style; 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style += StringPrintf("width: %s !important; ", width.c_str()); 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style += StringPrintf("height: %s !important; ", height.c_str()); 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style += "margin: 0 !important; padding: 0 !important; border: 0 !important"; 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container_->element().setAttribute(kStyle, WebString::fromUTF8(style)); 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 283458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochvoid PepperPluginInstanceImpl::ResetSizeAttributesAfterFullscreen() { 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screen_size_for_fullscreen_ = gfx::Size(); 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement element = container_->element(); 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_); 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_); 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_); 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_); 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2843558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbool PepperPluginInstanceImpl::IsMouseLocked() { 2844558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return GetMouseLockDispatcher()->IsMouseLockedTo( 2845558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch GetOrCreateLockTargetAdapter()); 2846558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 2847558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2848558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochbool PepperPluginInstanceImpl::LockMouse() { 2849558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return GetMouseLockDispatcher()->LockMouse(GetOrCreateLockTargetAdapter()); 2850558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 2851558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2852558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochMouseLockDispatcher::LockTarget* 2853558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch PepperPluginInstanceImpl::GetOrCreateLockTargetAdapter() { 2854558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!lock_target_.get()) { 2855558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch lock_target_.reset(new PluginInstanceLockTarget(this)); 2856558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 2857558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return lock_target_.get(); 2858558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 2859558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2860558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochMouseLockDispatcher* PepperPluginInstanceImpl::GetMouseLockDispatcher() { 2861558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (flash_fullscreen_) { 2862558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch RenderWidgetFullscreenPepper* container = 2863558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch static_cast<RenderWidgetFullscreenPepper*>(fullscreen_container_); 2864558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return container->mouse_lock_dispatcher(); 2865558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } else { 2866558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return render_view_->mouse_lock_dispatcher(); 2867558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 2868558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 2869558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 2870558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochvoid PepperPluginInstanceImpl::UnSetAndDeleteLockTargetAdapter() { 2871558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (lock_target_.get()) { 2872558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch GetMouseLockDispatcher()->OnLockTargetDestroyed(lock_target_.get()); 2873558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch lock_target_.reset(); 2874558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 2875558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 2876558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 28772385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochvoid PepperPluginInstanceImpl::DidDataFromWebURLResponse( 28782385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const WebKit::WebURLResponse& response, 28792385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch int pending_host_id, 28802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const ppapi::URLResponseInfoData& data) { 28812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch RendererPpapiHostImpl* host_impl = module_->renderer_ppapi_host(); 2882a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 28832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (host_impl->in_process_router()) { 28842385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Running in-process, we can just create the resource and call the 28852385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // PPP_Instance function directly. 28862385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch scoped_refptr<ppapi::proxy::URLLoaderResource> loader_resource( 28872385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch new ppapi::proxy::URLLoaderResource( 28882385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch host_impl->in_process_router()->GetPluginConnection(pp_instance()), 28892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch pp_instance(), pending_host_id, data)); 28902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 28912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch PP_Resource loader_pp_resource = loader_resource->GetReference(); 28922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (!instance_interface_->HandleDocumentLoad( 28932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch pp_instance(), loader_pp_resource)) 28942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch loader_resource->Close(); 28952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // We don't pass a ref into the plugin, if it wants one, it will have taken 28962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // an additional one. 28972385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ppapi::PpapiGlobals::Get()->GetResourceTracker()->ReleaseResource( 28982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch loader_pp_resource); 2899a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } else { 29002385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Running out-of-process. Initiate an IPC call to notify the plugin 29012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // process. 29022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ppapi::proxy::HostDispatcher* dispatcher = 29032385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ppapi::proxy::HostDispatcher::GetForInstance(pp_instance()); 29042385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch dispatcher->Send(new PpapiMsg_PPPInstance_HandleDocumentLoad( 29052385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch ppapi::API_ID_PPP_INSTANCE, pp_instance(), pending_host_id, data)); 2906a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2907a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 2908a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 290958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch} // namespace content 2910