12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/renderer/pepper/pepper_flash_renderer_host.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <map> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/lazy_instance.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/metrics/histogram.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_util.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/pdf/renderer/ppb_pdf_impl.h" 1458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/public/renderer/pepper_plugin_instance.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/renderer/render_thread.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/renderer/renderer_ppapi_host.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ipc/ipc_message_macros.h" 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/http/http_util.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/pp_errors.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/trusted/ppb_browser_font_trusted.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/dispatch_host_message.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/host_dispatcher.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/resource_message_params.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/serialized_structs.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/thunk/enter.h" 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/thunk/ppb_image_data_api.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "skia/ext/platform_canvas.h" 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkCanvas.h" 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkMatrix.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkPaint.h" 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkPoint.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkTemplates.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkTypeface.h" 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect.h" 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h" 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ppapi::thunk::EnterResourceNoLock; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ppapi::thunk::PPB_ImageData_API; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Some non-simple HTTP request headers that Flash may set. 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// (Please see http://www.w3.org/TR/cors/#simple-header for the definition of 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// simple headers.) 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// The list and the enum defined below are used to collect data about request 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// headers used in PPB_Flash.Navigate() calls, in order to understand the impact 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// of rejecting PPB_Flash.Navigate() requests with non-simple headers. 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// TODO(yzshen): We should be able to remove the histogram recording code once 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// we get the answer. 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char* kRejectedHttpRequestHeaders[] = { 54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "authorization", // 55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "cache-control", // 56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "content-encoding", // 57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "content-md5", // 58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "content-type", // If the media type is not one of those covered by the 59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // simple header definition. 60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "expires", // 61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "from", // 62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "if-match", // 63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "if-none-match", // 64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "if-range", // 65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "if-unmodified-since", // 66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "pragma", // 67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "referer" // 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Please note that new entries should be added right above 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// FLASH_NAVIGATE_USAGE_ENUM_COUNT, and existing entries shouldn't be re-ordered 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// or removed, since this ordering is used in a histogram. 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)enum FlashNavigateUsage { 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This section must be in the same order as kRejectedHttpRequestHeaders. 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) REJECT_AUTHORIZATION = 0, 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) REJECT_CACHE_CONTROL, 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) REJECT_CONTENT_ENCODING, 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) REJECT_CONTENT_MD5, 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) REJECT_CONTENT_TYPE, 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) REJECT_EXPIRES, 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) REJECT_FROM, 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) REJECT_IF_MATCH, 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) REJECT_IF_NONE_MATCH, 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) REJECT_IF_RANGE, 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) REJECT_IF_UNMODIFIED_SINCE, 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) REJECT_PRAGMA, 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) REJECT_REFERER, 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The navigate request is rejected because of headers not listed above 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // (e.g., custom headers). 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) REJECT_OTHER_HEADERS, 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Total number of rejected navigate requests. 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TOTAL_REJECTED_NAVIGATE_REQUESTS, 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Total number of navigate requests. 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TOTAL_NAVIGATE_REQUESTS, 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FLASH_NAVIGATE_USAGE_ENUM_COUNT 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static base::LazyInstance<std::map<std::string, FlashNavigateUsage> > 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) g_rejected_headers = LAZY_INSTANCE_INITIALIZER; 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool IsSimpleHeader(const std::string& lower_case_header_name, 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& header_value) { 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (lower_case_header_name == "accept" || 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) lower_case_header_name == "accept-language" || 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) lower_case_header_name == "content-language") { 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return true; 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (lower_case_header_name == "content-type") { 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string lower_case_mime_type; 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string lower_case_charset; 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool had_charset = false; 116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch net::HttpUtil::ParseContentType(header_value, 117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch &lower_case_mime_type, 118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch &lower_case_charset, 119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch &had_charset, 120c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch NULL); 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return lower_case_mime_type == "application/x-www-form-urlencoded" || 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) lower_case_mime_type == "multipart/form-data" || 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) lower_case_mime_type == "text/plain"; 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return false; 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RecordFlashNavigateUsage(FlashNavigateUsage usage) { 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_NE(FLASH_NAVIGATE_USAGE_ENUM_COUNT, usage); 131c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch UMA_HISTOGRAM_ENUMERATION( 132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch "Plugin.FlashNavigateUsage", usage, FLASH_NAVIGATE_USAGE_ENUM_COUNT); 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PepperFlashRendererHost::PepperFlashRendererHost( 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::RendererPpapiHost* host, 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Instance instance, 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Resource resource) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : ResourceHost(host->GetPpapiHost(), instance, resource), 1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) host_(host), 143c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch weak_factory_(this) {} 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PepperFlashRendererHost::~PepperFlashRendererHost() { 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This object may be destroyed in the middle of a sync message. If that is 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the case, make sure we respond to all the pending navigate calls. 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<ppapi::host::ReplyMessageContext>::reverse_iterator it; 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (it = navigate_replies_.rbegin(); it != navigate_replies_.rend(); ++it) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendReply(*it, IPC::Message()); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t PepperFlashRendererHost::OnResourceMessageReceived( 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IPC::Message& msg, 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::host::HostMessageContext* context) { 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PPAPI_BEGIN_MESSAGE_MAP(PepperFlashRendererHost, msg) 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_Flash_GetProxyForURL, 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnGetProxyForURL) 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_Flash_SetInstanceAlwaysOnTop, 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnSetInstanceAlwaysOnTop) 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_Flash_DrawGlyphs, 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnDrawGlyphs) 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_Flash_Navigate, OnNavigate) 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_Flash_IsRectTopmost, 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnIsRectTopmost) 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_Flash_InvokePrinting, 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnInvokePrinting) 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PPAPI_END_MESSAGE_MAP() 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_FAILED; 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t PepperFlashRendererHost::OnGetProxyForURL( 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::host::HostMessageContext* host_context, 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& url) { 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GURL gurl(url); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!gurl.is_valid()) 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_FAILED; 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string proxy; 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool result = content::RenderThread::Get()->ResolveProxy(gurl, &proxy); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!result) 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_FAILED; 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_context->reply_msg = PpapiPluginMsg_Flash_GetProxyForURLReply(proxy); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK; 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t PepperFlashRendererHost::OnSetInstanceAlwaysOnTop( 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::host::HostMessageContext* host_context, 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool on_top) { 18958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch content::PepperPluginInstance* plugin_instance = 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_->GetPluginInstance(pp_instance()); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (plugin_instance) 192bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch plugin_instance->SetAlwaysOnTop(on_top); 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Since no reply is sent for this message, it doesn't make sense to return an 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // error. 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK; 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t PepperFlashRendererHost::OnDrawGlyphs( 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::host::HostMessageContext* host_context, 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::proxy::PPBFlash_DrawGlyphs_Params params) { 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (params.glyph_indices.size() != params.glyph_advances.size() || 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.glyph_indices.empty()) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_FAILED; 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set up the typeface. 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int style = SkTypeface::kNormal; 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (static_cast<PP_BrowserFont_Trusted_Weight>(params.font_desc.weight) >= 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_BROWSERFONT_TRUSTED_WEIGHT_BOLD) 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) style |= SkTypeface::kBold; 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (params.font_desc.italic) 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) style |= SkTypeface::kItalic; 212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch skia::RefPtr<SkTypeface> typeface = skia::AdoptRef(SkTypeface::CreateFromName( 213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch params.font_desc.face.c_str(), static_cast<SkTypeface::Style>(style))); 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!typeface) 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_FAILED; 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 217a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch EnterResourceNoLock<PPB_ImageData_API> enter( 218a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch params.image_data.host_resource(), true); 219a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (enter.failed()) 220a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return PP_ERROR_FAILED; 221a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Set up the canvas. 223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch PPB_ImageData_API* image = static_cast<PPB_ImageData_API*>(enter.object()); 224a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch SkCanvas* canvas = image->GetPlatformCanvas(); 225a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch bool needs_unmapping = false; 226a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (!canvas) { 227a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch needs_unmapping = true; 228a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch image->Map(); 229a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch canvas = image->GetPlatformCanvas(); 230a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (!canvas) 231a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch return PP_ERROR_FAILED; // Failure mapping. 232a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 233a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkAutoCanvasRestore acr(canvas, true); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Clip is applied in pixels before the transform. 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkRect clip_rect = { 238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SkIntToScalar(params.clip.point.x), SkIntToScalar(params.clip.point.y), 239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SkIntToScalar(params.clip.point.x + params.clip.size.width), 240c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SkIntToScalar(params.clip.point.y + params.clip.size.height)}; 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->clipRect(clip_rect); 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Convert & set the matrix. 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkMatrix matrix; 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix.set(SkMatrix::kMScaleX, SkFloatToScalar(params.transformation[0][0])); 246c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch matrix.set(SkMatrix::kMSkewX, SkFloatToScalar(params.transformation[0][1])); 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix.set(SkMatrix::kMTransX, SkFloatToScalar(params.transformation[0][2])); 248c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch matrix.set(SkMatrix::kMSkewY, SkFloatToScalar(params.transformation[1][0])); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix.set(SkMatrix::kMScaleY, SkFloatToScalar(params.transformation[1][1])); 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix.set(SkMatrix::kMTransY, SkFloatToScalar(params.transformation[1][2])); 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix.set(SkMatrix::kMPersp0, SkFloatToScalar(params.transformation[2][0])); 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix.set(SkMatrix::kMPersp1, SkFloatToScalar(params.transformation[2][1])); 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) matrix.set(SkMatrix::kMPersp2, SkFloatToScalar(params.transformation[2][2])); 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->concat(matrix); 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkPaint paint; 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setColor(params.color); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setAntiAlias(true); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setHinting(SkPaint::kFull_Hinting); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setTextSize(SkIntToScalar(params.font_desc.size)); 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setTypeface(typeface.get()); // Takes a ref and manages lifetime. 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (params.allow_subpixel_aa) { 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setSubpixelText(true); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) paint.setLCDRenderText(true); 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkScalar x = SkIntToScalar(params.position.x); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkScalar y = SkIntToScalar(params.position.y); 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Build up the skia advances. 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t glyph_count = params.glyph_indices.size(); 273a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (glyph_count) { 274a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch std::vector<SkPoint> storage; 275a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch storage.resize(glyph_count); 276a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch SkPoint* sk_positions = &storage[0]; 277a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch for (uint32_t i = 0; i < glyph_count; i++) { 278a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch sk_positions[i].set(x, y); 279a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch x += SkFloatToScalar(params.glyph_advances[i].x); 280a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch y += SkFloatToScalar(params.glyph_advances[i].y); 281a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch } 282a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch 283c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch canvas->drawPosText( 284c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ¶ms.glyph_indices[0], glyph_count * 2, sk_positions, paint); 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 287a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch if (needs_unmapping) 288a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch image->Unmap(); 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK; 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CAUTION: This code is subtle because Navigate is a sync call which may 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// cause re-entrancy or cause the instance to be destroyed. If the instance 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// is destroyed we need to ensure that we respond to all outstanding sync 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// messages so that the plugin process does not remain blocked. 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t PepperFlashRendererHost::OnNavigate( 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::host::HostMessageContext* host_context, 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ppapi::URLRequestInfoData& data, 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& target, 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool from_user_action) { 30258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch // If our PepperPluginInstance is already destroyed, just return a failure. 30358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch content::PepperPluginInstance* plugin_instance = 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_->GetPluginInstance(pp_instance()); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!plugin_instance) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_FAILED; 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::map<std::string, FlashNavigateUsage>& rejected_headers = 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) g_rejected_headers.Get(); 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (rejected_headers.empty()) { 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < arraysize(kRejectedHttpRequestHeaders); ++i) 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rejected_headers[kRejectedHttpRequestHeaders[i]] = 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<FlashNavigateUsage>(i); 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 316c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch net::HttpUtil::HeadersIterator header_iter( 317c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch data.headers.begin(), data.headers.end(), "\n\r"); 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool rejected = false; 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) while (header_iter.GetNext()) { 3206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::string lower_case_header_name = 3216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::StringToLowerASCII(header_iter.name()); 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!IsSimpleHeader(lower_case_header_name, header_iter.values())) { 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rejected = true; 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::map<std::string, FlashNavigateUsage>::const_iterator iter = 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rejected_headers.find(lower_case_header_name); 327c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch FlashNavigateUsage usage = 328c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch iter != rejected_headers.end() ? iter->second : REJECT_OTHER_HEADERS; 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordFlashNavigateUsage(usage); 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordFlashNavigateUsage(TOTAL_NAVIGATE_REQUESTS); 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (rejected) { 3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) RecordFlashNavigateUsage(TOTAL_REJECTED_NAVIGATE_REQUESTS); 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return PP_ERROR_NOACCESS; 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Navigate may call into Javascript (e.g. with a "javascript:" URL), 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // or do things like navigate away from the page, either one of which will 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // need to re-enter into the plugin. It is safe, because it is essentially 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // equivalent to NPN_GetURL, where Flash would expect re-entrancy. 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::proxy::HostDispatcher* host_dispatcher = 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::proxy::HostDispatcher::GetForInstance(pp_instance()); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_dispatcher->set_allow_plugin_reentrancy(); 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3472385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Grab a weak pointer to ourselves on the stack so we can check if we are 3482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // still alive. 3492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::WeakPtr<PepperFlashRendererHost> weak_ptr = weak_factory_.GetWeakPtr(); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Keep track of reply contexts in case we are destroyed during a Navigate 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // call. Even if we are destroyed, we still need to send these replies to 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // unblock the plugin process. 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) navigate_replies_.push_back(host_context->MakeReplyMessageContext()); 3542385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch plugin_instance->Navigate(data, target.c_str(), from_user_action); 3552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // This object might have been destroyed by this point. If it is destroyed 3562385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // the reply will be sent in the destructor. Otherwise send the reply here. 3572385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch if (weak_ptr.get()) { 3582385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch SendReply(navigate_replies_.back(), IPC::Message()); 3592385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch navigate_replies_.pop_back(); 3602385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch } 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Return PP_OK_COMPLETIONPENDING so that no reply is automatically sent. 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK_COMPLETIONPENDING; 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t PepperFlashRendererHost::OnIsRectTopmost( 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::host::HostMessageContext* host_context, 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_Rect& rect) { 36958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch content::PepperPluginInstance* plugin_instance = 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_->GetPluginInstance(pp_instance()); 371c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (plugin_instance && 372c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch plugin_instance->IsRectTopmost(gfx::Rect( 373c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch rect.point.x, rect.point.y, rect.size.width, rect.size.height))) 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK; 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_FAILED; 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t PepperFlashRendererHost::OnInvokePrinting( 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::host::HostMessageContext* host_context) { 3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pdf::PPB_PDF_Impl::InvokePrintingForInstance(pp_instance()); 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_OK; 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 383