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 "chrome/browser/pepper_flash_settings_manager.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sequenced_task_runner_helpers.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/plugins/plugin_prefs.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/renderer_host/pepper/device_id_fetcher.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_context.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/pepper_flash_settings_helper.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/plugin_service.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_constants.h"
27ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/common/webplugininfo.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_channel.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ipc/ipc_listener.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h"
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PepperFlashSettingsManager::Core
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public IPC::Listener,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public base::RefCountedThreadSafe<Core, BrowserThread::DeleteOnIOThread> {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Core(base::WeakPtr<PepperFlashSettingsManager> manager,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       content::BrowserContext* browser_context);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Initialize();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notifies the core that it has been detached. Afterwards, no method should
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be called any more.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Detach();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeauthorizeContentLicenses(uint32 request_id);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetPermissionSettings(
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uint32 request_id,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_Flash_BrowserOperations_SettingType setting_type);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetDefaultPermission(
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uint32 request_id,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_Flash_BrowserOperations_SettingType setting_type,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_Flash_BrowserOperations_Permission permission,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool clear_site_specific);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetSitePermission(uint32 request_id,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         PP_Flash_BrowserOperations_SettingType setting_type,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const ppapi::FlashSiteSettings& sites);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetSitesWithData(uint32 request_id);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearSiteData(uint32 request_id,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const std::string& site,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     uint64 flags,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     uint64 max_age);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPC::Listener implementation.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnChannelError() OVERRIDE;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend struct BrowserThread::DeleteOnThread<BrowserThread::IO>;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::DeleteHelper<Core>;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum RequestType {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INVALID_REQUEST_TYPE = 0,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DEAUTHORIZE_CONTENT_LICENSES,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GET_PERMISSION_SETTINGS,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SET_DEFAULT_PERMISSION,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SET_SITE_PERMISSION,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GET_SITES_WITH_DATA,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CLEAR_SITE_DATA,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum State {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_UNINITIALIZED = 0,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_INITIALIZED,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_ERROR,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    STATE_DETACHED,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct PendingRequest {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PendingRequest()
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : id(0),
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          type(INVALID_REQUEST_TYPE),
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          setting_type(PP_FLASH_BROWSEROPERATIONS_SETTINGTYPE_CAMERAMIC),
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          permission(PP_FLASH_BROWSEROPERATIONS_PERMISSION_DEFAULT),
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          clear_site_specific(false),
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          flags(0),
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          max_age(0) {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 id;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RequestType type;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Used by GET_PERMISSION_SETTINGS, SET_DEFAULT_PERMISSION and
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // SET_SITE_PERMISSION.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_SettingType setting_type;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Used by SET_DEFAULT_PERMISSION.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_Permission permission;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool clear_site_specific;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Used by SET_SITE_PERMISSION.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ppapi::FlashSiteSettings sites;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Used by CLEAR_SITE_DATA
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string site;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint64 flags;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint64 max_age;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~Core();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ConnectToChannel(bool success, const IPC::ChannelHandle& handle);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitializeOnIOThread();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DeauthorizeContentLicensesOnIOThread(uint32 request_id);
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DeauthorizeContentLicensesOnBlockingPool(
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      uint32 request_id,
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const base::FilePath& profile_path);
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DeauthorizeContentLicensesInPlugin(uint32 request_id, bool success);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetPermissionSettingsOnIOThread(
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uint32 request_id,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_Flash_BrowserOperations_SettingType setting_type);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetDefaultPermissionOnIOThread(
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uint32 request_id,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_Flash_BrowserOperations_SettingType setting_type,
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_Flash_BrowserOperations_Permission permission,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool clear_site_specific);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetSitePermissionOnIOThread(
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uint32 request_id,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_Flash_BrowserOperations_SettingType setting_type,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ppapi::FlashSiteSettings& sites);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetSitesWithDataOnIOThread(uint32 request_id);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearSiteDataOnIOThread(uint32 request_id,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const std::string& site,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               uint64 flags,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               uint64 max_age);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DetachOnIOThread();
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyErrorFromIOThread();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyDeauthorizeContentLicensesCompleted(uint32 request_id,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 bool success);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyGetPermissionSettingsCompleted(
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uint32 request_id,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool success,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_Flash_BrowserOperations_Permission default_permission,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ppapi::FlashSiteSettings& sites);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifySetDefaultPermissionCompleted(uint32 request_id, bool success);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifySetSitePermissionCompleted(uint32 request_id, bool success);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyGetSitesWithDataCompleted(uint32 request_id,
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const std::vector<std::string>& sites);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyClearSiteDataCompleted(uint32 request_id, bool success);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NotifyError(
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<std::pair<uint32, RequestType> >& notifications);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Message handlers.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDeauthorizeContentLicensesResult(uint32 request_id, bool success);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetPermissionSettingsResult(
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uint32 request_id,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool success,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_Flash_BrowserOperations_Permission default_permission,
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const ppapi::FlashSiteSettings& sites);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetDefaultPermissionResult(uint32 request_id, bool success);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnSetSitePermissionResult(uint32 request_id, bool success);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnGetSitesWithDataResult(uint32 request_id,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const std::vector<std::string>& sites);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnClearSiteDataResult(uint32 request_id, bool success);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used only on the UI thread.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<PepperFlashSettingsManager> manager_;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used only on the I/O thread.
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath plugin_data_path_;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The channel is NULL until we have opened a connection to the broker
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // process. Used only on the I/O thread.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<IPC::Channel> channel_;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used only on the I/O thread.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  State state_;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Requests that need to be sent once the channel to the broker process is
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // established. Used only on the I/O thread.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<PendingRequest> pending_requests_;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Requests that have been sent but haven't got replied. Used only on the
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // I/O thread.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<uint32, RequestType> pending_responses_;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used only on the I/O thread.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<content::PepperFlashSettingsHelper> helper_;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Path for the current profile. Must be retrieved on the UI thread from the
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser context when we start so we can use it later on the I/O thread.
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath browser_context_path_;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PluginPrefs> plugin_prefs_;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PepperFlashSettingsManager::Core::Core(
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::WeakPtr<PepperFlashSettingsManager> manager,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::BrowserContext* browser_context)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : manager_(manager),
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state_(STATE_UNINITIALIZED),
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_context_path_(browser_context->GetPath()),
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      plugin_prefs_(PluginPrefs::GetForProfile(
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          Profile::FromBrowserContext(browser_context))) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PepperFlashSettingsManager::Core::~Core() {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::Initialize() {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          base::Bind(&Core::InitializeOnIOThread, this));
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::Detach() {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This call guarantees that one ref is retained until we get to the DETACHED
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // state. This is important. Otherwise, if the ref count drops to zero on the
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UI thread (which posts a task to delete this object on the I/O thread)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // while the I/O thread doesn't know about it, methods on the I/O thread might
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // increase the ref count again and cause double deletion.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::IO, FROM_HERE, base::Bind(&Core::DetachOnIOThread, this));
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::DeauthorizeContentLicenses(
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id) {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::IO, FROM_HERE,
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&Core::DeauthorizeContentLicensesOnIOThread, this,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 request_id));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::GetPermissionSettings(
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_SettingType setting_type) {
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::IO, FROM_HERE,
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&Core::GetPermissionSettingsOnIOThread, this, request_id,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 setting_type));
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::SetDefaultPermission(
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_SettingType setting_type,
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_Permission permission,
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool clear_site_specific) {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::IO, FROM_HERE,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&Core::SetDefaultPermissionOnIOThread, this, request_id,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 setting_type, permission, clear_site_specific));
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::SetSitePermission(
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_SettingType setting_type,
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ppapi::FlashSiteSettings& sites) {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::IO, FROM_HERE,
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&Core::SetSitePermissionOnIOThread, this, request_id,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 setting_type, sites));
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::GetSitesWithData(uint32 request_id) {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::IO, FROM_HERE,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&Core::GetSitesWithDataOnIOThread, this, request_id));
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::ClearSiteData(uint32 request_id,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     const std::string& site,
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     uint64 flags,
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     uint64 max_age) {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::IO, FROM_HERE,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&Core::ClearSiteDataOnIOThread, this, request_id,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 site, flags, max_age));
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PepperFlashSettingsManager::Core::OnMessageReceived(
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IPC::Message& message) {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(Core, message)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiHostMsg_DeauthorizeContentLicensesResult,
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnDeauthorizeContentLicensesResult)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiHostMsg_GetPermissionSettingsResult,
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnGetPermissionSettingsResult)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiHostMsg_SetDefaultPermissionResult,
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnSetDefaultPermissionResult)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiHostMsg_SetSitePermissionResult,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnSetSitePermissionResult)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiHostMsg_GetSitesWithDataResult,
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnGetSitesWithDataResult)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiHostMsg_ClearSiteDataResult,
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        OnClearSiteDataResult)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED_ERROR()
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::OnChannelError() {
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_ == STATE_DETACHED)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotifyErrorFromIOThread();
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::ConnectToChannel(
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success,
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IPC::ChannelHandle& handle) {
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_ == STATE_DETACHED)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(state_ == STATE_UNINITIALIZED);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!channel_.get());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!success) {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DLOG(ERROR) << "Couldn't open plugin channel";
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyErrorFromIOThread();
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  channel_ = IPC::Channel::CreateClient(handle, this);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!channel_->Connect()) {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DLOG(ERROR) << "Couldn't connect to plugin";
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyErrorFromIOThread();
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state_ = STATE_INITIALIZED;
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<PendingRequest> temp_pending_requests;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  temp_pending_requests.swap(pending_requests_);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::vector<PendingRequest>::iterator iter =
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           temp_pending_requests.begin();
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != temp_pending_requests.end(); ++iter) {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (iter->type) {
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case INVALID_REQUEST_TYPE:
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case DEAUTHORIZE_CONTENT_LICENSES:
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DeauthorizeContentLicensesOnIOThread(iter->id);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GET_PERMISSION_SETTINGS:
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetPermissionSettingsOnIOThread(iter->id, iter->setting_type);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case SET_DEFAULT_PERMISSION:
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SetDefaultPermissionOnIOThread(
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            iter->id, iter->setting_type, iter->permission,
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            iter->clear_site_specific);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case SET_SITE_PERMISSION:
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SetSitePermissionOnIOThread(iter->id, iter->setting_type, iter->sites);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GET_SITES_WITH_DATA:
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GetSitesWithDataOnIOThread(iter->id);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case CLEAR_SITE_DATA:
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ClearSiteDataOnIOThread(iter->id, iter->site, iter->flags,
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                iter->max_age);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::InitializeOnIOThread() {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(STATE_UNINITIALIZED, state_);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
403ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  content::WebPluginInfo plugin_info;
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!PepperFlashSettingsManager::IsPepperFlashInUse(plugin_prefs_.get(),
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      &plugin_info)) {
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyErrorFromIOThread();
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath profile_path =
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_context_path_.Append(content::kPepperDataDirname);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plugin_data_path_ = profile_path.Append(plugin_info.name);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  plugin_data_path_ = profile_path.Append(base::UTF16ToUTF8(plugin_info.name));
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_ = content::PepperFlashSettingsHelper::Create();
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::PepperFlashSettingsHelper::OpenChannelCallback callback =
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&Core::ConnectToChannel, this);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_->OpenChannelToBroker(plugin_info.path, callback);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::DeauthorizeContentLicensesOnIOThread(
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id) {
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(STATE_DETACHED, state_);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_ == STATE_UNINITIALIZED) {
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PendingRequest request;
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.id = request_id;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.type = DEAUTHORIZE_CONTENT_LICENSES;
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pending_requests_.push_back(request);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_responses_.insert(
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::make_pair(request_id, DEAUTHORIZE_CONTENT_LICENSES));
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_ == STATE_ERROR) {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyErrorFromIOThread();
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BrowserThread::PostBlockingPoolTask(FROM_HERE,
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&Core::DeauthorizeContentLicensesOnBlockingPool, this,
447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 request_id, browser_context_path_));
448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DeauthorizeContentLicensesInPlugin(request_id, true);
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(raymes): This is temporary code to migrate ChromeOS devices to the new
454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// scheme for generating device IDs. Delete this once we are sure most ChromeOS
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// devices have been migrated.
456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PepperFlashSettingsManager::Core::DeauthorizeContentLicensesOnBlockingPool(
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    uint32 request_id,
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const base::FilePath& profile_path) {
459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // ChromeOS used to store the device ID in a file but this is no longer used.
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Wipe that file.
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::FilePath& device_id_path =
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      chrome::DeviceIDFetcher::GetLegacyDeviceIDPath(profile_path);
4637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool success = base::DeleteFile(device_id_path, false);
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BrowserThread::PostTask(
466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      BrowserThread::IO, FROM_HERE,
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&Core::DeauthorizeContentLicensesInPlugin, this, request_id,
468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 success));
469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void PepperFlashSettingsManager::Core::DeauthorizeContentLicensesInPlugin(
472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    uint32 request_id,
473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool success) {
474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!success) {
476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NotifyErrorFromIOThread();
477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
478c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC::Message* msg =
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new PpapiMsg_DeauthorizeContentLicenses(request_id, plugin_data_path_);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!channel_->Send(msg)) {
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DLOG(ERROR) << "Couldn't send DeauthorizeContentLicenses message";
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A failure notification for the current request will be sent since
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |pending_responses_| has been updated.
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyErrorFromIOThread();
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::GetPermissionSettingsOnIOThread(
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_SettingType setting_type) {
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(STATE_DETACHED, state_);
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_ == STATE_UNINITIALIZED) {
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PendingRequest request;
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.id = request_id;
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.type = GET_PERMISSION_SETTINGS;
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.setting_type = setting_type;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pending_requests_.push_back(request);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_responses_.insert(
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::make_pair(request_id, GET_PERMISSION_SETTINGS));
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_ == STATE_ERROR) {
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyErrorFromIOThread();
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC::Message* msg = new PpapiMsg_GetPermissionSettings(
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_id, plugin_data_path_, setting_type);
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!channel_->Send(msg)) {
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DLOG(ERROR) << "Couldn't send GetPermissionSettings message";
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A failure notification for the current request will be sent since
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |pending_responses_| has been updated.
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyErrorFromIOThread();
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::SetDefaultPermissionOnIOThread(
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_SettingType setting_type,
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_Permission permission,
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool clear_site_specific) {
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(STATE_DETACHED, state_);
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_ == STATE_UNINITIALIZED) {
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PendingRequest request;
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.id = request_id;
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.type = SET_DEFAULT_PERMISSION;
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.setting_type = setting_type;
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.permission = permission;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.clear_site_specific = clear_site_specific;
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pending_requests_.push_back(request);
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_responses_.insert(std::make_pair(request_id, SET_DEFAULT_PERMISSION));
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_ == STATE_ERROR) {
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyErrorFromIOThread();
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC::Message* msg = new PpapiMsg_SetDefaultPermission(
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_id, plugin_data_path_, setting_type, permission,
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      clear_site_specific);
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!channel_->Send(msg)) {
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DLOG(ERROR) << "Couldn't send SetDefaultPermission message";
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A failure notification for the current request will be sent since
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |pending_responses_| has been updated.
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyErrorFromIOThread();
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::SetSitePermissionOnIOThread(
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_SettingType setting_type,
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ppapi::FlashSiteSettings& sites) {
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(STATE_DETACHED, state_);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_ == STATE_UNINITIALIZED) {
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pending_requests_.push_back(PendingRequest());
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PendingRequest& request = pending_requests_.back();
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.id = request_id;
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.type = SET_SITE_PERMISSION;
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.setting_type = setting_type;
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.sites = sites;
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_responses_.insert(std::make_pair(request_id, SET_SITE_PERMISSION));
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_ == STATE_ERROR) {
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyErrorFromIOThread();
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC::Message* msg = new PpapiMsg_SetSitePermission(
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_id, plugin_data_path_, setting_type, sites);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!channel_->Send(msg)) {
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DLOG(ERROR) << "Couldn't send SetSitePermission message";
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A failure notification for the current request will be sent since
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |pending_responses_| has been updated.
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyErrorFromIOThread();
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::GetSitesWithDataOnIOThread(
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id) {
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(STATE_DETACHED, state_);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_ == STATE_UNINITIALIZED) {
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pending_requests_.push_back(PendingRequest());
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PendingRequest& request = pending_requests_.back();
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.id = request_id;
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.type = GET_SITES_WITH_DATA;
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_responses_.insert(std::make_pair(request_id, GET_SITES_WITH_DATA));
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_ == STATE_ERROR) {
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyErrorFromIOThread();
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC::Message* msg = new PpapiMsg_GetSitesWithData(
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_id, plugin_data_path_);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!channel_->Send(msg)) {
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DLOG(ERROR) << "Couldn't send GetSitesWithData message";
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A failure notification for the current request will be sent since
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |pending_responses_| has been updated.
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyErrorFromIOThread();
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::ClearSiteDataOnIOThread(
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& site,
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint64 flags,
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint64 max_age) {
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_NE(STATE_DETACHED, state_);
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_ == STATE_UNINITIALIZED) {
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pending_requests_.push_back(PendingRequest());
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PendingRequest& request = pending_requests_.back();
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.id = request_id;
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.type = CLEAR_SITE_DATA;
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.site = site;
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.flags = flags;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    request.max_age = max_age;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_responses_.insert(std::make_pair(request_id, CLEAR_SITE_DATA));
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_ == STATE_ERROR) {
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyErrorFromIOThread();
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC::Message* msg = new PpapiMsg_ClearSiteData(
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      request_id, plugin_data_path_, site, flags, max_age);
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!channel_->Send(msg)) {
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DLOG(ERROR) << "Couldn't send ClearSiteData message";
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A failure notification for the current request will be sent since
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // |pending_responses_| has been updated.
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyErrorFromIOThread();
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::DetachOnIOThread() {
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state_ = STATE_DETACHED;
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::NotifyErrorFromIOThread() {
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_ == STATE_DETACHED)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state_ = STATE_ERROR;
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::pair<uint32, RequestType> > notifications;
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::vector<PendingRequest>::iterator iter = pending_requests_.begin();
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != pending_requests_.end(); ++iter) {
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    notifications.push_back(std::make_pair(iter->id, iter->type));
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_requests_.clear();
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  notifications.insert(notifications.end(), pending_responses_.begin(),
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       pending_responses_.end());
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_responses_.clear();
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&Core::NotifyError, this, notifications));
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PepperFlashSettingsManager::Core::NotifyDeauthorizeContentLicensesCompleted(
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success) {
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (manager_.get()) {
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->client_->OnDeauthorizeContentLicensesCompleted(
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        request_id, success);
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::NotifyGetPermissionSettingsCompleted(
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success,
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_Permission default_permission,
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ppapi::FlashSiteSettings& sites) {
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (manager_.get()) {
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->client_->OnGetPermissionSettingsCompleted(
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        request_id, success, default_permission, sites);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::NotifySetDefaultPermissionCompleted(
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success) {
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (manager_.get()) {
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->client_->OnSetDefaultPermissionCompleted(
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        request_id, success);
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::NotifySetSitePermissionCompleted(
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success) {
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (manager_.get()) {
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->client_->OnSetSitePermissionCompleted(
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        request_id, success);
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::NotifyGetSitesWithDataCompleted(
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<std::string>& sites) {
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (manager_.get()) {
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->client_->OnGetSitesWithDataCompleted(
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        request_id, sites);
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::NotifyClearSiteDataCompleted(
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success) {
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (manager_.get())
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->client_->OnClearSiteDataCompleted(request_id, success);
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::NotifyError(
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<std::pair<uint32, RequestType> >& notifications) {
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Core> protector(this);
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::vector<std::pair<uint32, RequestType> >::const_iterator iter =
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      notifications.begin(); iter != notifications.end(); ++iter) {
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check |manager_| for each iteration in case it is destroyed in one of
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the callbacks.
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!manager_.get())
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (iter->second) {
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case INVALID_REQUEST_TYPE:
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case DEAUTHORIZE_CONTENT_LICENSES:
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        manager_->client_->OnDeauthorizeContentLicensesCompleted(
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            iter->first, false);
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GET_PERMISSION_SETTINGS:
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        manager_->client_->OnGetPermissionSettingsCompleted(
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            iter->first, false, PP_FLASH_BROWSEROPERATIONS_PERMISSION_DEFAULT,
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ppapi::FlashSiteSettings());
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case SET_DEFAULT_PERMISSION:
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        manager_->client_->OnSetDefaultPermissionCompleted(
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            iter->first, false);
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case SET_SITE_PERMISSION:
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        manager_->client_->OnSetSitePermissionCompleted(iter->first, false);
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case GET_SITES_WITH_DATA:
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        manager_->client_->OnGetSitesWithDataCompleted(
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            iter->first, std::vector<std::string>());
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case CLEAR_SITE_DATA:
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        manager_->client_->OnClearSiteDataCompleted(iter->first, false);
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (manager_.get())
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->OnError(this);
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::OnDeauthorizeContentLicensesResult(
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success) {
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_ == STATE_DETACHED)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DLOG_IF(ERROR, !success) << "DeauthorizeContentLicenses returned error";
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<uint32, RequestType>::iterator iter =
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pending_responses_.find(request_id);
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (iter == pending_responses_.end())
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(iter->second, DEAUTHORIZE_CONTENT_LICENSES);
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_responses_.erase(iter);
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&Core::NotifyDeauthorizeContentLicensesCompleted, this,
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 request_id, success));
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::OnGetPermissionSettingsResult(
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success,
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_Permission default_permission,
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ppapi::FlashSiteSettings& sites) {
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_ == STATE_DETACHED)
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DLOG_IF(ERROR, !success) << "GetPermissionSettings returned error";
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<uint32, RequestType>::iterator iter =
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pending_responses_.find(request_id);
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (iter == pending_responses_.end())
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(iter->second, GET_PERMISSION_SETTINGS);
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_responses_.erase(iter);
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&Core::NotifyGetPermissionSettingsCompleted, this,
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 request_id, success, default_permission, sites));
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::OnSetDefaultPermissionResult(
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success) {
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_ == STATE_DETACHED)
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DLOG_IF(ERROR, !success) << "SetDefaultPermission returned error";
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<uint32, RequestType>::iterator iter =
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pending_responses_.find(request_id);
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (iter == pending_responses_.end())
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(iter->second, SET_DEFAULT_PERMISSION);
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_responses_.erase(iter);
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&Core::NotifySetDefaultPermissionCompleted, this,
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 request_id, success));
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::OnSetSitePermissionResult(
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success) {
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_ == STATE_DETACHED)
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DLOG_IF(ERROR, !success) << "SetSitePermission returned error";
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<uint32, RequestType>::iterator iter =
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pending_responses_.find(request_id);
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (iter == pending_responses_.end())
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(iter->second, SET_SITE_PERMISSION);
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_responses_.erase(iter);
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&Core::NotifySetSitePermissionCompleted, this, request_id,
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      success));
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::OnGetSitesWithDataResult(
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<std::string>& sites) {
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_ == STATE_DETACHED)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<uint32, RequestType>::iterator iter =
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pending_responses_.find(request_id);
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (iter == pending_responses_.end())
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(iter->second, GET_SITES_WITH_DATA);
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_responses_.erase(iter);
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&Core::NotifyGetSitesWithDataCompleted, this, request_id,
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sites));
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::Core::OnClearSiteDataResult(
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 request_id,
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success) {
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state_ == STATE_DETACHED)
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DLOG_IF(ERROR, !success) << "ClearSiteData returned error";
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::map<uint32, RequestType>::iterator iter =
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pending_responses_.find(request_id);
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (iter == pending_responses_.end())
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(iter->second, CLEAR_SITE_DATA);
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pending_responses_.erase(iter);
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::UI, FROM_HERE,
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&Core::NotifyClearSiteDataCompleted, this, request_id,
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      success));
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PepperFlashSettingsManager::PepperFlashSettingsManager(
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Client* client,
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::BrowserContext* browser_context)
9334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : client_(client),
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_context_(browser_context),
9354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      next_request_id_(1),
9364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      weak_ptr_factory_(this) {
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(client);
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(browser_context);
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PepperFlashSettingsManager::~PepperFlashSettingsManager() {
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (core_.get())
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    core_->Detach();
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PepperFlashSettingsManager::IsPepperFlashInUse(
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PluginPrefs* plugin_prefs,
949ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    content::WebPluginInfo* plugin_info) {
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!plugin_prefs)
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::PluginService* plugin_service =
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::PluginService::GetInstance();
955ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::vector<content::WebPluginInfo> plugins;
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  plugin_service->GetPluginInfoArray(
957ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      GURL(), content::kFlashPluginSwfMimeType, false, &plugins, NULL);
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
959ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  for (std::vector<content::WebPluginInfo>::iterator iter = plugins.begin();
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       iter != plugins.end(); ++iter) {
961ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (iter->is_pepper_plugin() && plugin_prefs->IsPluginEnabled(*iter)) {
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (plugin_info)
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *plugin_info = *iter;
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
9717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid PepperFlashSettingsManager::RegisterProfilePrefs(
972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    user_prefs::PrefRegistrySyncable* registry) {
973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
974c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kDeauthorizeContentLicenses,
975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
976c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kPepperFlashSettingsEnabled,
980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      true,
981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)uint32 PepperFlashSettingsManager::DeauthorizeContentLicenses(
985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PrefService* prefs) {
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Clear the device ID salt which has the effect of regenerating a device
989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // ID. Since this happens synchronously (and on the UI thread), we don't have
990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // to add it to a pending request.
991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs->ClearPref(prefs::kDRMSalt);
992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnsureCoreExists();
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 id = GetNextRequestId();
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  core_->DeauthorizeContentLicenses(id);
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return id;
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32 PepperFlashSettingsManager::GetPermissionSettings(
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_SettingType setting_type) {
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnsureCoreExists();
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 id = GetNextRequestId();
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  core_->GetPermissionSettings(id, setting_type);
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return id;
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32 PepperFlashSettingsManager::SetDefaultPermission(
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_SettingType setting_type,
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_Permission permission,
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool clear_site_specific) {
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnsureCoreExists();
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 id = GetNextRequestId();
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  core_->SetDefaultPermission(id, setting_type, permission,
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              clear_site_specific);
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return id;
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32 PepperFlashSettingsManager::SetSitePermission(
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Flash_BrowserOperations_SettingType setting_type,
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ppapi::FlashSiteSettings& sites) {
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnsureCoreExists();
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 id = GetNextRequestId();
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  core_->SetSitePermission(id, setting_type, sites);
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return id;
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32 PepperFlashSettingsManager::GetSitesWithData() {
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnsureCoreExists();
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 id = GetNextRequestId();
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  core_->GetSitesWithData(id);
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return id;
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32 PepperFlashSettingsManager::ClearSiteData(const std::string& site,
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 uint64 flags,
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 uint64 max_age) {
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnsureCoreExists();
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 id = GetNextRequestId();
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  core_->ClearSiteData(id, site, flags, max_age);
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return id;
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32 PepperFlashSettingsManager::GetNextRequestId() {
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return next_request_id_++;
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::EnsureCoreExists() {
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!core_.get()) {
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    core_ = new Core(weak_ptr_factory_.GetWeakPtr(), browser_context_);
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    core_->Initialize();
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperFlashSettingsManager::OnError(Core* core) {
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(core);
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (core != core_.get())
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  core_->Detach();
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  core_ = NULL;
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1072