| Index: content/ppapi_plugin/broker_process_dispatcher.cc
|
| diff --git a/content/ppapi_plugin/broker_process_dispatcher.cc b/content/ppapi_plugin/broker_process_dispatcher.cc
|
| index 7844639d98f91511c89040054ce9eab46aff7ee6..985cdeab33d2b5f540f265b884fa3ff687b64290 100644
|
| --- a/content/ppapi_plugin/broker_process_dispatcher.cc
|
| +++ b/content/ppapi_plugin/broker_process_dispatcher.cc
|
| @@ -6,11 +6,15 @@
|
|
|
| #include "base/bind.h"
|
| #include "base/bind_helpers.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| #include "base/utf_string_conversions.h"
|
| #include "content/common/child_process.h"
|
| #include "ppapi/c/pp_bool.h"
|
| #include "ppapi/c/private/ppp_flash_browser_operations.h"
|
| #include "ppapi/proxy/ppapi_messages.h"
|
| +#include "ppapi/shared_impl/ppapi_globals.h"
|
| +#include "ppapi/shared_impl/var.h"
|
| +#include "ppapi/shared_impl/var_tracker.h"
|
|
|
| namespace {
|
|
|
| @@ -26,14 +30,70 @@ std::string ConvertPluginDataPath(const FilePath& plugin_data_path) {
|
| #endif
|
| }
|
|
|
| +struct GetPermissionSettingsContext {
|
| + GetPermissionSettingsContext(
|
| + const base::WeakPtr<BrokerProcessDispatcher> in_dispatcher,
|
| + uint32 in_request_id)
|
| + : dispatcher(in_dispatcher),
|
| + request_id(in_request_id) {
|
| + }
|
| +
|
| + base::WeakPtr<BrokerProcessDispatcher> dispatcher;
|
| + uint32 request_id;
|
| +};
|
| +
|
| +void GetPermissionSettingsCallback(
|
| + void* user_data,
|
| + PP_Bool success,
|
| + PP_Flash_BrowserOperations_Permission default_permission,
|
| + uint32_t site_count,
|
| + const PP_Flash_BrowserOperations_SiteSetting sites[]) {
|
| + scoped_ptr<GetPermissionSettingsContext> context(
|
| + reinterpret_cast<GetPermissionSettingsContext*>(user_data));
|
| +
|
| + if (!context->dispatcher)
|
| + return;
|
| +
|
| + ppapi::FlashSiteSettings site_vector;
|
| + if (success) {
|
| + site_vector.reserve(site_count);
|
| + for (uint32_t i = 0; i < site_count; ++i) {
|
| + ppapi::StringVar* string_var = ppapi::StringVar::FromPPVar(sites[i].site);
|
| + if (!string_var) {
|
| + success = PP_FALSE;
|
| + break;
|
| + }
|
| + site_vector.push_back(
|
| + ppapi::FlashSiteSetting(string_var->value(), sites[i].permission));
|
| + }
|
| +
|
| + if (!success)
|
| + site_vector.clear();
|
| + }
|
| + context->dispatcher->OnGetPermissionSettingsCompleted(
|
| + context->request_id, PP_ToBool(success), default_permission, site_vector);
|
| +}
|
| +
|
| } // namespace
|
|
|
| BrokerProcessDispatcher::BrokerProcessDispatcher(
|
| PP_GetInterface_Func get_plugin_interface,
|
| PP_ConnectInstance_Func connect_instance)
|
| : ppapi::proxy::BrokerSideDispatcher(connect_instance),
|
| - get_plugin_interface_(get_plugin_interface) {
|
| + get_plugin_interface_(get_plugin_interface),
|
| + flash_browser_operations_1_1_(NULL),
|
| + flash_browser_operations_1_0_(NULL) {
|
| ChildProcess::current()->AddRefProcess();
|
| +
|
| + if (get_plugin_interface) {
|
| + flash_browser_operations_1_0_ =
|
| + static_cast<const PPP_Flash_BrowserOperations_1_0*>(
|
| + get_plugin_interface_(PPP_FLASH_BROWSEROPERATIONS_INTERFACE_1_0));
|
| +
|
| + flash_browser_operations_1_1_ =
|
| + static_cast<const PPP_Flash_BrowserOperations_1_1*>(
|
| + get_plugin_interface_(PPP_FLASH_BROWSEROPERATIONS_INTERFACE_1_1));
|
| + }
|
| }
|
|
|
| BrokerProcessDispatcher::~BrokerProcessDispatcher() {
|
| @@ -55,11 +115,25 @@ bool BrokerProcessDispatcher::OnMessageReceived(const IPC::Message& msg) {
|
| IPC_MESSAGE_HANDLER(PpapiMsg_ClearSiteData, OnMsgClearSiteData)
|
| IPC_MESSAGE_HANDLER(PpapiMsg_DeauthorizeContentLicenses,
|
| OnMsgDeauthorizeContentLicenses)
|
| + IPC_MESSAGE_HANDLER(PpapiMsg_GetPermissionSettings,
|
| + OnMsgGetPermissionSettings)
|
| + IPC_MESSAGE_HANDLER(PpapiMsg_SetDefaultPermission,
|
| + OnMsgSetDefaultPermission)
|
| + IPC_MESSAGE_HANDLER(PpapiMsg_SetSitePermission, OnMsgSetSitePermission)
|
| IPC_MESSAGE_UNHANDLED(return BrokerSideDispatcher::OnMessageReceived(msg))
|
| IPC_END_MESSAGE_MAP()
|
| return true;
|
| }
|
|
|
| +void BrokerProcessDispatcher::OnGetPermissionSettingsCompleted(
|
| + uint32 request_id,
|
| + bool success,
|
| + PP_Flash_BrowserOperations_Permission default_permission,
|
| + const ppapi::FlashSiteSettings& sites) {
|
| + Send(new PpapiHostMsg_GetPermissionSettingsResult(
|
| + request_id, success, default_permission, sites));
|
| +}
|
| +
|
| void BrokerProcessDispatcher::OnMsgClearSiteData(
|
| const FilePath& plugin_data_path,
|
| const std::string& site,
|
| @@ -76,37 +150,107 @@ void BrokerProcessDispatcher::OnMsgDeauthorizeContentLicenses(
|
| request_id, DeauthorizeContentLicenses(plugin_data_path)));
|
| }
|
|
|
| +void BrokerProcessDispatcher::OnMsgGetPermissionSettings(
|
| + uint32 request_id,
|
| + const FilePath& plugin_data_path,
|
| + PP_Flash_BrowserOperations_SettingType setting_type) {
|
| + if (!flash_browser_operations_1_1_) {
|
| + OnGetPermissionSettingsCompleted(
|
| + request_id, false, PP_FLASH_BROWSEROPERATIONS_PERMISSION_DEFAULT,
|
| + ppapi::FlashSiteSettings());
|
| + return;
|
| + }
|
| +
|
| + std::string data_str = ConvertPluginDataPath(plugin_data_path);
|
| + // The GetPermissionSettingsContext object will be deleted in
|
| + // GetPermissionSettingsCallback().
|
| + flash_browser_operations_1_1_->GetPermissionSettings(
|
| + data_str.c_str(), setting_type, &GetPermissionSettingsCallback,
|
| + new GetPermissionSettingsContext(AsWeakPtr(), request_id));
|
| +}
|
| +
|
| +void BrokerProcessDispatcher::OnMsgSetDefaultPermission(
|
| + uint32 request_id,
|
| + const FilePath& plugin_data_path,
|
| + PP_Flash_BrowserOperations_SettingType setting_type,
|
| + PP_Flash_BrowserOperations_Permission permission,
|
| + bool clear_site_specific) {
|
| + Send(new PpapiHostMsg_SetDefaultPermissionResult(
|
| + request_id,
|
| + SetDefaultPermission(plugin_data_path, setting_type, permission,
|
| + clear_site_specific)));
|
| +}
|
| +
|
| +void BrokerProcessDispatcher::OnMsgSetSitePermission(
|
| + uint32 request_id,
|
| + const FilePath& plugin_data_path,
|
| + PP_Flash_BrowserOperations_SettingType setting_type,
|
| + const ppapi::FlashSiteSettings& sites) {
|
| + Send(new PpapiHostMsg_SetSitePermissionResult(
|
| + request_id, SetSitePermission(plugin_data_path, setting_type, sites)));
|
| +}
|
| +
|
| bool BrokerProcessDispatcher::ClearSiteData(const FilePath& plugin_data_path,
|
| const std::string& site,
|
| uint64 flags,
|
| uint64 max_age) {
|
| - if (!get_plugin_interface_)
|
| - return false;
|
| - const PPP_Flash_BrowserOperations_1_0* browser_interface =
|
| - static_cast<const PPP_Flash_BrowserOperations_1_0*>(
|
| - get_plugin_interface_(PPP_FLASH_BROWSEROPERATIONS_INTERFACE_1_0));
|
| - if (!browser_interface)
|
| + if (!flash_browser_operations_1_0_)
|
| return false;
|
|
|
| std::string data_str = ConvertPluginDataPath(plugin_data_path);
|
| - browser_interface->ClearSiteData(data_str.c_str(),
|
| - site.empty() ? NULL : site.c_str(),
|
| - flags, max_age);
|
| + flash_browser_operations_1_0_->ClearSiteData(
|
| + data_str.c_str(), site.empty() ? NULL : site.c_str(), flags, max_age);
|
| return true;
|
| }
|
|
|
| bool BrokerProcessDispatcher::DeauthorizeContentLicenses(
|
| const FilePath& plugin_data_path) {
|
| - if (!get_plugin_interface_)
|
| - return false;
|
| - const PPP_Flash_BrowserOperations_1_1* browser_interface =
|
| - static_cast<const PPP_Flash_BrowserOperations_1_1*>(
|
| - get_plugin_interface_(PPP_FLASH_BROWSEROPERATIONS_INTERFACE_1_1));
|
| - if (!browser_interface)
|
| + if (!flash_browser_operations_1_1_)
|
| return false;
|
|
|
| std::string data_str = ConvertPluginDataPath(plugin_data_path);
|
| - return PP_ToBool(browser_interface->DeauthorizeContentLicenses(
|
| + return PP_ToBool(flash_browser_operations_1_1_->DeauthorizeContentLicenses(
|
| data_str.c_str()));
|
| }
|
|
|
| +bool BrokerProcessDispatcher::SetDefaultPermission(
|
| + const FilePath& plugin_data_path,
|
| + PP_Flash_BrowserOperations_SettingType setting_type,
|
| + PP_Flash_BrowserOperations_Permission permission,
|
| + bool clear_site_specific) {
|
| + if (!flash_browser_operations_1_1_)
|
| + return false;
|
| +
|
| + std::string data_str = ConvertPluginDataPath(plugin_data_path);
|
| + return PP_ToBool(flash_browser_operations_1_1_->SetDefaultPermission(
|
| + data_str.c_str(), setting_type, permission,
|
| + PP_FromBool(clear_site_specific)));
|
| +}
|
| +
|
| +bool BrokerProcessDispatcher::SetSitePermission(
|
| + const FilePath& plugin_data_path,
|
| + PP_Flash_BrowserOperations_SettingType setting_type,
|
| + const ppapi::FlashSiteSettings& sites) {
|
| + if (!flash_browser_operations_1_1_)
|
| + return false;
|
| +
|
| + if (sites.empty())
|
| + return true;
|
| +
|
| + std::string data_str = ConvertPluginDataPath(plugin_data_path);
|
| + scoped_array<PP_Flash_BrowserOperations_SiteSetting> site_array(
|
| + new PP_Flash_BrowserOperations_SiteSetting[sites.size()]);
|
| +
|
| + for (size_t i = 0; i < sites.size(); ++i) {
|
| + site_array[i].site = ppapi::StringVar::StringToPPVar(sites[i].site);
|
| + site_array[i].permission = sites[i].permission;
|
| + }
|
| +
|
| + PP_Bool result = flash_browser_operations_1_1_->SetSitePermission(
|
| + data_str.c_str(), setting_type, sites.size(), site_array.get());
|
| +
|
| + for (size_t i = 0; i < sites.size(); ++i)
|
| + ppapi::PpapiGlobals::Get()->GetVarTracker()->ReleaseVar(site_array[i].site);
|
| +
|
| + return PP_ToBool(result);
|
| +}
|
|
|