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 "content/ppapi_plugin/broker_process_dispatcher.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/child/child_process.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_bool.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/private/ppp_flash_browser_operations.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// How long we wait before releasing the broker process.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kBrokerReleaseTimeSeconds = 30;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string ConvertPluginDataPath(const base::FilePath& plugin_data_path) {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The string is always 8-bit, convert on Windows.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::WideToUTF8(plugin_data_path.value());
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return plugin_data_path.value();
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct GetPermissionSettingsContext {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetPermissionSettingsContext(
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::WeakPtr<BrokerProcessDispatcher> in_dispatcher,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uint32 in_request_id)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : dispatcher(in_dispatcher),
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        request_id(in_request_id) {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<BrokerProcessDispatcher> dispatcher;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 request_id;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetPermissionSettingsCallback(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void* user_data,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Bool success,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_Permission default_permission,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32_t site_count,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const PP_Flash_BrowserOperations_SiteSetting sites[]) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<GetPermissionSettingsContext> context(
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<GetPermissionSettingsContext*>(user_data));
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!context->dispatcher.get())
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppapi::FlashSiteSettings site_vector;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (success) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    site_vector.reserve(site_count);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (uint32_t i = 0; i < site_count; ++i) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!sites[i].site) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        success = PP_FALSE;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      site_vector.push_back(
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ppapi::FlashSiteSetting(sites[i].site, sites[i].permission));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!success)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      site_vector.clear();
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  context->dispatcher->OnGetPermissionSettingsCompleted(
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      context->request_id, PP_ToBool(success), default_permission, site_vector);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrokerProcessDispatcher::BrokerProcessDispatcher(
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_GetInterface_Func get_plugin_interface,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_ConnectInstance_Func connect_instance)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ppapi::proxy::BrokerSideDispatcher(connect_instance),
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      get_plugin_interface_(get_plugin_interface),
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flash_browser_operations_1_3_(NULL),
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flash_browser_operations_1_2_(NULL),
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flash_browser_operations_1_0_(NULL) {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (get_plugin_interface) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flash_browser_operations_1_0_ =
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<const PPP_Flash_BrowserOperations_1_0*>(
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            get_plugin_interface_(PPP_FLASH_BROWSEROPERATIONS_INTERFACE_1_0));
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flash_browser_operations_1_2_ =
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<const PPP_Flash_BrowserOperations_1_2*>(
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            get_plugin_interface_(PPP_FLASH_BROWSEROPERATIONS_INTERFACE_1_2));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flash_browser_operations_1_3_ =
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<const PPP_Flash_BrowserOperations_1_3*>(
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            get_plugin_interface_(PPP_FLASH_BROWSEROPERATIONS_INTERFACE_1_3));
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrokerProcessDispatcher::~BrokerProcessDispatcher() {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DVLOG(1) << "BrokerProcessDispatcher::~BrokerProcessDispatcher()";
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't free the process right away. This timer allows the child process
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to be re-used if the user rapidly goes to a new page that requires this
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // plugin. This is the case for common plugins where they may be used on a
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // source and destination page of a navigation. We don't want to tear down
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and re-start processes each time in these cases.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  process_ref_.ReleaseWithDelay(
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromSeconds(kBrokerReleaseTimeSeconds));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrokerProcessDispatcher::OnMessageReceived(const IPC::Message& msg) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(BrokerProcessDispatcher, msg)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiMsg_GetSitesWithData, OnGetSitesWithData)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiMsg_ClearSiteData, OnClearSiteData)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiMsg_DeauthorizeContentLicenses,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnDeauthorizeContentLicenses)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiMsg_GetPermissionSettings, OnGetPermissionSettings)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiMsg_SetDefaultPermission, OnSetDefaultPermission)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiMsg_SetSitePermission, OnSetSitePermission)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(return BrokerSideDispatcher::OnMessageReceived(msg))
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrokerProcessDispatcher::OnGetPermissionSettingsCompleted(
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_Permission default_permission,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ppapi::FlashSiteSettings& sites) {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new PpapiHostMsg_GetPermissionSettingsResult(
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_id, success, default_permission, sites));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrokerProcessDispatcher::OnGetSitesWithData(
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::FilePath& plugin_data_path) {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> sites;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetSitesWithData(plugin_data_path, &sites);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new PpapiHostMsg_GetSitesWithDataResult(request_id, sites));
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrokerProcessDispatcher::OnClearSiteData(
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::FilePath& plugin_data_path,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& site,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint64 flags,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint64 max_age) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new PpapiHostMsg_ClearSiteDataResult(
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_id, ClearSiteData(plugin_data_path, site, flags, max_age)));
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrokerProcessDispatcher::OnDeauthorizeContentLicenses(
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::FilePath& plugin_data_path) {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new PpapiHostMsg_DeauthorizeContentLicensesResult(
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_id, DeauthorizeContentLicenses(plugin_data_path)));
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrokerProcessDispatcher::OnGetPermissionSettings(
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::FilePath& plugin_data_path,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_SettingType setting_type) {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flash_browser_operations_1_3_) {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string data_str = ConvertPluginDataPath(plugin_data_path);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The GetPermissionSettingsContext object will be deleted in
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // GetPermissionSettingsCallback().
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flash_browser_operations_1_3_->GetPermissionSettings(
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data_str.c_str(), setting_type, &GetPermissionSettingsCallback,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new GetPermissionSettingsContext(AsWeakPtr(), request_id));
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flash_browser_operations_1_2_) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string data_str = ConvertPluginDataPath(plugin_data_path);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The GetPermissionSettingsContext object will be deleted in
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // GetPermissionSettingsCallback().
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flash_browser_operations_1_2_->GetPermissionSettings(
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data_str.c_str(), setting_type, &GetPermissionSettingsCallback,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new GetPermissionSettingsContext(AsWeakPtr(), request_id));
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnGetPermissionSettingsCompleted(
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_id, false, PP_FLASH_BROWSEROPERATIONS_PERMISSION_DEFAULT,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ppapi::FlashSiteSettings());
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrokerProcessDispatcher::OnSetDefaultPermission(
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::FilePath& plugin_data_path,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_SettingType setting_type,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_Permission permission,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool clear_site_specific) {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new PpapiHostMsg_SetDefaultPermissionResult(
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_id,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SetDefaultPermission(plugin_data_path, setting_type, permission,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           clear_site_specific)));
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrokerProcessDispatcher::OnSetSitePermission(
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::FilePath& plugin_data_path,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_SettingType setting_type,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ppapi::FlashSiteSettings& sites) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new PpapiHostMsg_SetSitePermissionResult(
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_id, SetSitePermission(plugin_data_path, setting_type, sites)));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrokerProcessDispatcher::GetSitesWithData(
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::FilePath& plugin_data_path,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string>* site_vector) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data_str = ConvertPluginDataPath(plugin_data_path);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flash_browser_operations_1_3_) {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    char** sites = NULL;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flash_browser_operations_1_3_->GetSitesWithData(data_str.c_str(), &sites);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!sites)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; sites[i]; ++i)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      site_vector->push_back(sites[i]);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flash_browser_operations_1_3_->FreeSiteList(sites);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrokerProcessDispatcher::ClearSiteData(
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::FilePath& plugin_data_path,
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& site,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint64 flags,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint64 max_age) {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data_str = ConvertPluginDataPath(plugin_data_path);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flash_browser_operations_1_3_) {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flash_browser_operations_1_3_->ClearSiteData(
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data_str.c_str(), site.empty() ? NULL : site.c_str(), flags, max_age);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(viettrungluu): Remove this (and the 1.0 interface) sometime after M21
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // goes to Stable.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flash_browser_operations_1_2_) {
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flash_browser_operations_1_2_->ClearSiteData(
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data_str.c_str(), site.empty() ? NULL : site.c_str(), flags, max_age);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flash_browser_operations_1_0_) {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    flash_browser_operations_1_0_->ClearSiteData(
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data_str.c_str(), site.empty() ? NULL : site.c_str(), flags, max_age);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrokerProcessDispatcher::DeauthorizeContentLicenses(
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::FilePath& plugin_data_path) {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flash_browser_operations_1_3_) {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string data_str = ConvertPluginDataPath(plugin_data_path);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_ToBool(flash_browser_operations_1_3_->DeauthorizeContentLicenses(
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data_str.c_str()));
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flash_browser_operations_1_2_) {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string data_str = ConvertPluginDataPath(plugin_data_path);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_ToBool(flash_browser_operations_1_2_->DeauthorizeContentLicenses(
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data_str.c_str()));
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrokerProcessDispatcher::SetDefaultPermission(
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::FilePath& plugin_data_path,
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_SettingType setting_type,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_Permission permission,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool clear_site_specific) {
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flash_browser_operations_1_3_) {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string data_str = ConvertPluginDataPath(plugin_data_path);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_ToBool(flash_browser_operations_1_3_->SetDefaultPermission(
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data_str.c_str(), setting_type, permission,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PP_FromBool(clear_site_specific)));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flash_browser_operations_1_2_) {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string data_str = ConvertPluginDataPath(plugin_data_path);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_ToBool(flash_browser_operations_1_2_->SetDefaultPermission(
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data_str.c_str(), setting_type, permission,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PP_FromBool(clear_site_specific)));
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrokerProcessDispatcher::SetSitePermission(
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const base::FilePath& plugin_data_path,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_SettingType setting_type,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ppapi::FlashSiteSettings& sites) {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (sites.empty())
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data_str = ConvertPluginDataPath(plugin_data_path);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PP_Flash_BrowserOperations_SiteSetting[]> site_array(
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new PP_Flash_BrowserOperations_SiteSetting[sites.size()]);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < sites.size(); ++i) {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    site_array[i].site = sites[i].site.c_str();
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    site_array[i].permission = sites[i].permission;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flash_browser_operations_1_3_) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Bool result = flash_browser_operations_1_3_->SetSitePermission(
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data_str.c_str(), setting_type, sites.size(), site_array.get());
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
314    return PP_ToBool(result);
315  }
316
317  if (flash_browser_operations_1_2_) {
318    PP_Bool result = flash_browser_operations_1_2_->SetSitePermission(
319        data_str.c_str(), setting_type, sites.size(), site_array.get());
320
321    return PP_ToBool(result);
322  }
323
324  return false;
325}
326
327}  // namespace content
328