15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/flash_resource.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <cmath> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/containers/mru_cache.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/debug/crash_logging.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/lazy_instance.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_errors.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/private/ppb_flash.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/c/trusted/ppb_browser_font_trusted.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/plugin_dispatcher.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/plugin_globals.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/serialized_structs.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/ppapi_preferences.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/scoped_pp_var.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/time_conversion.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/var.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/enter.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/thunk/ppb_url_request_info_api.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ppapi::thunk::EnterResourceNoLock; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct LocalTimeZoneOffsetEntry { 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks expiration; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double offset; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LocalTimeZoneOffsetCache 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public base::MRUCache<PP_Time, LocalTimeZoneOffsetEntry> { 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LocalTimeZoneOffsetCache() 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : base::MRUCache<PP_Time, LocalTimeZoneOffsetEntry>(kCacheSize) {} 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const size_t kCacheSize = 100; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::LazyInstance<LocalTimeZoneOffsetCache>::Leaky 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_local_time_zone_offset_cache = LAZY_INSTANCE_INITIALIZER; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)FlashResource::FlashResource(Connection connection, 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Instance instance, 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PluginDispatcher* plugin_dispatcher) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : PluginResource(connection, instance), 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_dispatcher_(plugin_dispatcher) { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendCreate(RENDERER, PpapiHostMsg_Flash_Create()); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendCreate(BROWSER, PpapiHostMsg_Flash_Create()); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FlashResource::~FlashResource() { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)thunk::PPB_Flash_Functions_API* FlashResource::AsPPB_Flash_Functions_API() { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Var FlashResource::GetProxyForURL(PP_Instance instance, 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& url) { 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string proxy; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t result = SyncCall<PpapiPluginMsg_Flash_GetProxyForURLReply>(RENDERER, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_Flash_GetProxyForURL(url), &proxy); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (result == PP_OK) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return StringVar::StringToPPVar(proxy); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_MakeUndefined(); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FlashResource::UpdateActivity(PP_Instance instance) { 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Post(BROWSER, PpapiHostMsg_Flash_UpdateActivity()); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Bool FlashResource::SetCrashData(PP_Instance instance, 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_FlashCrashKey key, 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Var value) { 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StringVar* url_string_var(StringVar::FromPPVar(value)); 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!url_string_var) 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return PP_FALSE; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (key) { 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PP_FLASHCRASHKEY_URL: { 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PluginGlobals::Get()->SetActiveURL(url_string_var->value()); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_TRUE; 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case PP_FLASHCRASHKEY_RESOURCE_URL: { 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::debug::SetCrashKeyValue("subresource_url", url_string_var->value()); 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return PP_TRUE; 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_FALSE; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)double FlashResource::GetLocalTimeZoneOffset(PP_Instance instance, 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Time t) { 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LocalTimeZoneOffsetCache& cache = g_local_time_zone_offset_cache.Get(); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get the minimum PP_Time value that shares the same minute as |t|. 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Use cached offset if cache hasn't expired and |t| is in the same minute as 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the time for the cached offset (assume offsets change on minute 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // boundaries). 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Time t_minute_base = floor(t / 60.0) * 60.0; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LocalTimeZoneOffsetCache::iterator iter = cache.Get(t_minute_base); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks now = base::TimeTicks::Now(); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter != cache.end() && now < iter->second.expiration) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return iter->second.offset; 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Cache the local offset for ten seconds, since it's slow on XP and Linux. 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note that TimeTicks does not continue counting across sleep/resume on all 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // platforms. This may be acceptable for 10 seconds, but if in the future this 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // is changed to one minute or more, then we should consider using base::Time. 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int64 kMaxCachedLocalOffsetAgeInSeconds = 10; 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta expiration_delta = 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta::FromSeconds(kMaxCachedLocalOffsetAgeInSeconds); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LocalTimeZoneOffsetEntry cache_entry; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_entry.expiration = now + expiration_delta; 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_entry.offset = 0.0; 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We can't do the conversion here on Linux because the localtime calls 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // require filesystem access prohibited by the sandbox. 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(shess): Figure out why OSX needs the access, the sandbox warmup should 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // handle it. http://crbug.com/149006 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_LINUX) || defined(OS_MACOSX) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t result = SyncCall<PpapiPluginMsg_Flash_GetLocalTimeZoneOffsetReply>( 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BROWSER, 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_Flash_GetLocalTimeZoneOffset(PPTimeToTime(t)), 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &cache_entry.offset); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (result != PP_OK) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_entry.offset = 0.0; 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache_entry.offset = PPGetLocalTimeZoneOffset(PPTimeToTime(t)); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cache.Put(t_minute_base, cache_entry); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return cache_entry.offset; 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Var FlashResource::GetSetting(PP_Instance instance, 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_FlashSetting setting) { 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (setting) { 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PP_FLASHSETTING_3DENABLED: 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_MakeBool(PP_FromBool( 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_dispatcher_->preferences().is_3d_supported)); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PP_FLASHSETTING_INCOGNITO: 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_MakeBool(PP_FromBool(plugin_dispatcher_->incognito())); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PP_FLASHSETTING_STAGE3DENABLED: 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_MakeBool(PP_FromBool( 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_dispatcher_->preferences().is_stage3d_supported)); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PP_FLASHSETTING_STAGE3DBASELINEENABLED: 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_MakeBool(PP_FromBool( 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_dispatcher_->preferences().is_stage3d_baseline_supported)); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PP_FLASHSETTING_LANGUAGE: 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return StringVar::StringToPPVar( 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PluginGlobals::Get()->GetUILanguage()); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PP_FLASHSETTING_NUMCORES: 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_MakeInt32( 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_dispatcher_->preferences().number_of_cpu_cores); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PP_FLASHSETTING_LSORESTRICTIONS: { 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t restrictions; 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t result = 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SyncCall<PpapiPluginMsg_Flash_GetLocalDataRestrictionsReply>(BROWSER, 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_Flash_GetLocalDataRestrictions(), &restrictions); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (result != PP_OK) 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_MakeInt32(PP_FLASHLSORESTRICTIONS_NONE); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_MakeInt32(restrictions); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_MakeUndefined(); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FlashResource::SetInstanceAlwaysOnTop(PP_Instance instance, 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Bool on_top) { 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Post(RENDERER, PpapiHostMsg_Flash_SetInstanceAlwaysOnTop(PP_ToBool(on_top))); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Bool FlashResource::DrawGlyphs( 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Resource pp_image_data, 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_BrowserFont_Trusted_Description* font_desc, 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t color, 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_Point* position, 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_Rect* clip, 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const float transformation[3][3], 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Bool allow_subpixel_aa, 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t glyph_count, 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const uint16_t glyph_indices[], 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_Point glyph_advances[]) { 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterResourceNoLock<thunk::PPB_ImageData_API> enter(pp_image_data, true); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (enter.failed()) 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_FALSE; 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The instance parameter isn't strictly necessary but we check that it 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // matches anyway. 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enter.resource()->pp_instance() != instance) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_FALSE; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PPBFlash_DrawGlyphs_Params params; 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.image_data = enter.resource()->host_resource(); 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.font_desc.SetFromPPBrowserFontDescription(*font_desc); 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.color = color; 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.position = *position; 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.clip = *clip; 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < 3; i++) { 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int j = 0; j < 3; j++) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.transformation[i][j] = transformation[i][j]; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.allow_subpixel_aa = allow_subpixel_aa; 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.glyph_indices.insert(params.glyph_indices.begin(), 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &glyph_indices[0], 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &glyph_indices[glyph_count]); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) params.glyph_advances.insert(params.glyph_advances.begin(), 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &glyph_advances[0], 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &glyph_advances[glyph_count]); 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This has to be synchronous because the caller may want to composite on 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // top of the resulting text after the call is complete. 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t result = SyncCall<IPC::Message>(RENDERER, 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_Flash_DrawGlyphs(params)); 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_FromBool(result == PP_OK); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int32_t FlashResource::Navigate(PP_Instance instance, 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Resource request_info, 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* target, 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Bool from_user_action) { 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EnterResourceNoLock<thunk::PPB_URLRequestInfo_API> enter(request_info, 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enter.failed()) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_ERROR_BADRESOURCE; 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return SyncCall<IPC::Message>(RENDERER, PpapiHostMsg_Flash_Navigate( 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enter.object()->GetData(), target, PP_ToBool(from_user_action))); 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PP_Bool FlashResource::IsRectTopmost(PP_Instance instance, 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PP_Rect* rect) { 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int32_t result = SyncCall<IPC::Message>(RENDERER, 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PpapiHostMsg_Flash_IsRectTopmost(*rect)); 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return PP_FromBool(result == PP_OK); 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FlashResource::InvokePrinting(PP_Instance instance) { 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Post(RENDERER, PpapiHostMsg_Flash_InvokePrinting()); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace proxy 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ppapi 257