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); |
+} |