| Index: ppapi/proxy/ppb_flash_proxy.cc
|
| ===================================================================
|
| --- ppapi/proxy/ppb_flash_proxy.cc (revision 172925)
|
| +++ ppapi/proxy/ppb_flash_proxy.cc (working copy)
|
| @@ -100,8 +100,15 @@
|
|
|
| bool handled = true;
|
| IPC_BEGIN_MESSAGE_MAP(PPB_Flash_Proxy, msg)
|
| + IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlash_SetInstanceAlwaysOnTop,
|
| + OnHostMsgSetInstanceAlwaysOnTop)
|
| + IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlash_DrawGlyphs,
|
| + OnHostMsgDrawGlyphs)
|
| + IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlash_Navigate, OnHostMsgNavigate)
|
| IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlash_GetLocalTimeZoneOffset,
|
| OnHostMsgGetLocalTimeZoneOffset)
|
| + IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlash_IsRectTopmost,
|
| + OnHostMsgIsRectTopmost)
|
| IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlash_InvokePrinting,
|
| OnHostMsgInvokePrinting)
|
| IPC_MESSAGE_HANDLER(PpapiHostMsg_PPBFlash_GetSetting,
|
| @@ -112,6 +119,80 @@
|
| return handled;
|
| }
|
|
|
| +void PPB_Flash_Proxy::SetInstanceAlwaysOnTop(PP_Instance instance,
|
| + PP_Bool on_top) {
|
| + dispatcher()->Send(new PpapiHostMsg_PPBFlash_SetInstanceAlwaysOnTop(
|
| + API_ID_PPB_FLASH, instance, on_top));
|
| +}
|
| +
|
| +PP_Bool PPB_Flash_Proxy::DrawGlyphs(
|
| + PP_Instance instance,
|
| + PP_Resource pp_image_data,
|
| + const PP_BrowserFont_Trusted_Description* font_desc,
|
| + uint32_t color,
|
| + const PP_Point* position,
|
| + const PP_Rect* clip,
|
| + const float transformation[3][3],
|
| + PP_Bool allow_subpixel_aa,
|
| + uint32_t glyph_count,
|
| + const uint16_t glyph_indices[],
|
| + const PP_Point glyph_advances[]) {
|
| + Resource* image_data =
|
| + PpapiGlobals::Get()->GetResourceTracker()->GetResource(pp_image_data);
|
| + if (!image_data)
|
| + return PP_FALSE;
|
| + // The instance parameter isn't strictly necessary but we check that it
|
| + // matches anyway.
|
| + if (image_data->pp_instance() != instance)
|
| + return PP_FALSE;
|
| +
|
| + PPBFlash_DrawGlyphs_Params params;
|
| + params.image_data = image_data->host_resource();
|
| + params.font_desc.SetFromPPBrowserFontDescription(*font_desc);
|
| + params.color = color;
|
| + params.position = *position;
|
| + params.clip = *clip;
|
| + for (int i = 0; i < 3; i++) {
|
| + for (int j = 0; j < 3; j++)
|
| + params.transformation[i][j] = transformation[i][j];
|
| + }
|
| + params.allow_subpixel_aa = allow_subpixel_aa;
|
| +
|
| + params.glyph_indices.insert(params.glyph_indices.begin(),
|
| + &glyph_indices[0],
|
| + &glyph_indices[glyph_count]);
|
| + params.glyph_advances.insert(params.glyph_advances.begin(),
|
| + &glyph_advances[0],
|
| + &glyph_advances[glyph_count]);
|
| +
|
| + PP_Bool result = PP_FALSE;
|
| + dispatcher()->Send(new PpapiHostMsg_PPBFlash_DrawGlyphs(
|
| + API_ID_PPB_FLASH, instance, params, &result));
|
| + return result;
|
| +}
|
| +
|
| +int32_t PPB_Flash_Proxy::Navigate(PP_Instance instance,
|
| + PP_Resource request_info,
|
| + const char* target,
|
| + PP_Bool from_user_action) {
|
| + thunk::EnterResourceNoLock<thunk::PPB_URLRequestInfo_API> enter(
|
| + request_info, true);
|
| + if (enter.failed())
|
| + return PP_ERROR_BADRESOURCE;
|
| + return Navigate(instance, enter.object()->GetData(), target,
|
| + from_user_action);
|
| +}
|
| +
|
| +int32_t PPB_Flash_Proxy::Navigate(PP_Instance instance,
|
| + const URLRequestInfoData& data,
|
| + const char* target,
|
| + PP_Bool from_user_action) {
|
| + int32_t result = PP_ERROR_FAILED;
|
| + dispatcher()->Send(new PpapiHostMsg_PPBFlash_Navigate(
|
| + API_ID_PPB_FLASH, instance, data, target, from_user_action, &result));
|
| + return result;
|
| +}
|
| +
|
| double PPB_Flash_Proxy::GetLocalTimeZoneOffset(PP_Instance instance,
|
| PP_Time t) {
|
| LocalTimeZoneOffsetCache& cache = g_local_time_zone_offset_cache.Get();
|
| @@ -163,6 +244,14 @@
|
| return cache_entry.offset;
|
| }
|
|
|
| +PP_Bool PPB_Flash_Proxy::IsRectTopmost(PP_Instance instance,
|
| + const PP_Rect* rect) {
|
| + PP_Bool result = PP_FALSE;
|
| + dispatcher()->Send(new PpapiHostMsg_PPBFlash_IsRectTopmost(
|
| + API_ID_PPB_FLASH, instance, *rect, &result));
|
| + return result;
|
| +}
|
| +
|
| PP_Var PPB_Flash_Proxy::GetSetting(PP_Instance instance,
|
| PP_FlashSetting setting) {
|
| PluginDispatcher* plugin_dispatcher =
|
| @@ -191,9 +280,77 @@
|
| return PP_MakeUndefined();
|
| }
|
|
|
| +void PPB_Flash_Proxy::OnHostMsgSetInstanceAlwaysOnTop(PP_Instance instance,
|
| + PP_Bool on_top) {
|
| + EnterInstanceNoLock enter(instance);
|
| + if (enter.succeeded())
|
| + enter.functions()->GetFlashAPI()->SetInstanceAlwaysOnTop(instance, on_top);
|
| +}
|
| +
|
| +void PPB_Flash_Proxy::OnHostMsgDrawGlyphs(
|
| + PP_Instance instance,
|
| + const PPBFlash_DrawGlyphs_Params& params,
|
| + PP_Bool* result) {
|
| + *result = PP_FALSE;
|
| + EnterInstanceNoLock enter(instance);
|
| + if (enter.failed())
|
| + return;
|
| +
|
| + if (params.glyph_indices.size() != params.glyph_advances.size() ||
|
| + params.glyph_indices.empty())
|
| + return;
|
| +
|
| + PP_BrowserFont_Trusted_Description font_desc;
|
| + params.font_desc.SetToPPBrowserFontDescription(&font_desc);
|
| +
|
| + *result = enter.functions()->GetFlashAPI()->DrawGlyphs(
|
| + 0, // Unused instance param.
|
| + params.image_data.host_resource(), &font_desc,
|
| + params.color, ¶ms.position, ¶ms.clip,
|
| + const_cast<float(*)[3]>(params.transformation),
|
| + params.allow_subpixel_aa,
|
| + static_cast<uint32_t>(params.glyph_indices.size()),
|
| + const_cast<uint16_t*>(¶ms.glyph_indices[0]),
|
| + const_cast<PP_Point*>(¶ms.glyph_advances[0]));
|
| +
|
| + // SetToPPFontDescription() creates a var which is owned by the caller.
|
| + PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(font_desc.face);
|
| +}
|
| +
|
| +void PPB_Flash_Proxy::OnHostMsgNavigate(PP_Instance instance,
|
| + const URLRequestInfoData& data,
|
| + const std::string& target,
|
| + PP_Bool from_user_action,
|
| + int32_t* result) {
|
| + EnterInstanceNoLock enter_instance(instance);
|
| + if (enter_instance.failed()) {
|
| + *result = PP_ERROR_BADARGUMENT;
|
| + return;
|
| + }
|
| + DCHECK(!dispatcher()->IsPlugin());
|
| +
|
| + // Validate the PP_Instance since we'll be constructing resources on its
|
| + // behalf.
|
| + HostDispatcher* host_dispatcher = static_cast<HostDispatcher*>(dispatcher());
|
| + if (HostDispatcher::GetForInstance(instance) != host_dispatcher) {
|
| + NOTREACHED();
|
| + *result = PP_ERROR_BADARGUMENT;
|
| + return;
|
| + }
|
| +
|
| + // We need to allow re-entrancy here, because this may call into Javascript
|
| + // (e.g. with a "javascript:" URL), or do things like navigate away from the
|
| + // page, either one of which will need to re-enter into the plugin.
|
| + // It is safe, because it is essentially equivalent to NPN_GetURL, where Flash
|
| + // would expect re-entrancy. When running in-process, it does re-enter here.
|
| + host_dispatcher->set_allow_plugin_reentrancy();
|
| + *result = enter_instance.functions()->GetFlashAPI()->Navigate(
|
| + instance, data, target.c_str(), from_user_action);
|
| +}
|
| +
|
| void PPB_Flash_Proxy::OnHostMsgGetLocalTimeZoneOffset(PP_Instance instance,
|
| - PP_Time t,
|
| - double* result) {
|
| + PP_Time t,
|
| + double* result) {
|
| EnterInstanceNoLock enter(instance);
|
| if (enter.succeeded()) {
|
| *result = enter.functions()->GetFlashAPI()->GetLocalTimeZoneOffset(
|
| @@ -203,6 +360,16 @@
|
| }
|
| }
|
|
|
| +void PPB_Flash_Proxy::OnHostMsgIsRectTopmost(PP_Instance instance,
|
| + PP_Rect rect,
|
| + PP_Bool* result) {
|
| + EnterInstanceNoLock enter(instance);
|
| + if (enter.succeeded())
|
| + *result = enter.functions()->GetFlashAPI()->IsRectTopmost(instance, &rect);
|
| + else
|
| + *result = PP_FALSE;
|
| +}
|
| +
|
| void PPB_Flash_Proxy::OnHostMsgGetSetting(PP_Instance instance,
|
| PP_FlashSetting setting,
|
| SerializedVarReturnValue id) {
|
|
|