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