1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/pepper_flash_settings_manager.h"
11 #include "base/bind.h"
12 #include "base/compiler_specific.h"
13 #include "base/files/file_util.h"
14 #include "base/sequenced_task_runner_helpers.h"
15 #include "base/strings/utf_string_conversions.h"
16 #include "base/task/thread_pool.h"
17 #include "build/build_config.h"
18 #include "chrome/browser/plugins/plugin_prefs.h"
19 #include "chrome/browser/profiles/profile.h"
20 #include "chrome/browser/renderer_host/pepper/device_id_fetcher.h"
21 #include "chrome/common/pref_names.h"
22 #include "components/pref_registry/pref_registry_syncable.h"
23 #include "components/prefs/pref_service.h"
24 #include "content/public/browser/browser_context.h"
25 #include "content/public/browser/browser_task_traits.h"
26 #include "content/public/browser/browser_thread.h"
27 #include "content/public/browser/pepper_flash_settings_helper.h"
28 #include "content/public/browser/plugin_service.h"
29 #include "content/public/common/content_constants.h"
30 #include "content/public/common/webplugininfo.h"
31 #include "ipc/ipc_channel.h"
32 #include "ipc/ipc_listener.h"
33 #include "ppapi/proxy/ppapi_messages.h"
36 using content::BrowserThread;
38 class PepperFlashSettingsManager::Core
39 : public IPC::Listener,
40 public base::RefCountedThreadSafe<Core, BrowserThread::DeleteOnIOThread> {
42 Core(base::WeakPtr<PepperFlashSettingsManager> manager,
43 content::BrowserContext* browser_context);
47 // Notifies the core that it has been detached. Afterwards, no method should
48 // be called any more.
51 void DeauthorizeContentLicenses(uint32_t request_id);
52 void GetPermissionSettings(
54 PP_Flash_BrowserOperations_SettingType setting_type);
55 void SetDefaultPermission(uint32_t request_id,
56 PP_Flash_BrowserOperations_SettingType setting_type,
57 PP_Flash_BrowserOperations_Permission permission,
58 bool clear_site_specific);
59 void SetSitePermission(uint32_t request_id,
60 PP_Flash_BrowserOperations_SettingType setting_type,
61 const ppapi::FlashSiteSettings& sites);
62 void GetSitesWithData(uint32_t request_id);
63 void ClearSiteData(uint32_t request_id,
64 const std::string& site,
68 // IPC::Listener implementation.
69 bool OnMessageReceived(const IPC::Message& message) override;
70 void OnChannelError() override;
73 friend struct BrowserThread::DeleteOnThread<BrowserThread::IO>;
74 friend class base::DeleteHelper<Core>;
77 INVALID_REQUEST_TYPE = 0,
78 DEAUTHORIZE_CONTENT_LICENSES,
79 GET_PERMISSION_SETTINGS,
80 SET_DEFAULT_PERMISSION,
87 STATE_UNINITIALIZED = 0,
93 struct PendingRequest {
96 type(INVALID_REQUEST_TYPE),
97 setting_type(PP_FLASH_BROWSEROPERATIONS_SETTINGTYPE_CAMERAMIC),
98 permission(PP_FLASH_BROWSEROPERATIONS_PERMISSION_DEFAULT),
99 clear_site_specific(false),
107 // Used by GET_PERMISSION_SETTINGS, SET_DEFAULT_PERMISSION and
108 // SET_SITE_PERMISSION.
109 PP_Flash_BrowserOperations_SettingType setting_type;
111 // Used by SET_DEFAULT_PERMISSION.
112 PP_Flash_BrowserOperations_Permission permission;
113 bool clear_site_specific;
115 // Used by SET_SITE_PERMISSION.
116 ppapi::FlashSiteSettings sites;
118 // Used by CLEAR_SITE_DATA
126 void ConnectToChannel(bool success, const IPC::ChannelHandle& handle);
128 void InitializeOnIOThread();
129 void DeauthorizeContentLicensesOnIOThread(uint32_t request_id);
130 void DeauthorizeContentLicensesAsync(uint32_t request_id,
131 const base::FilePath& profile_path);
132 void DeauthorizeContentLicensesInPlugin(uint32_t request_id, bool success);
133 void GetPermissionSettingsOnIOThread(
135 PP_Flash_BrowserOperations_SettingType setting_type);
136 void SetDefaultPermissionOnIOThread(
138 PP_Flash_BrowserOperations_SettingType setting_type,
139 PP_Flash_BrowserOperations_Permission permission,
140 bool clear_site_specific);
141 void SetSitePermissionOnIOThread(
143 PP_Flash_BrowserOperations_SettingType setting_type,
144 const ppapi::FlashSiteSettings& sites);
145 void GetSitesWithDataOnIOThread(uint32_t request_id);
146 void ClearSiteDataOnIOThread(uint32_t request_id,
147 const std::string& site,
150 void DetachOnIOThread();
152 void NotifyErrorFromIOThread();
154 void NotifyDeauthorizeContentLicensesCompleted(uint32_t request_id,
156 void NotifyGetPermissionSettingsCompleted(
159 PP_Flash_BrowserOperations_Permission default_permission,
160 const ppapi::FlashSiteSettings& sites);
161 void NotifySetDefaultPermissionCompleted(uint32_t request_id, bool success);
162 void NotifySetSitePermissionCompleted(uint32_t request_id, bool success);
163 void NotifyGetSitesWithDataCompleted(uint32_t request_id,
164 const std::vector<std::string>& sites);
165 void NotifyClearSiteDataCompleted(uint32_t request_id, bool success);
168 const std::vector<std::pair<uint32_t, RequestType>>& notifications);
171 void OnDeauthorizeContentLicensesResult(uint32_t request_id, bool success);
172 void OnGetPermissionSettingsResult(
175 PP_Flash_BrowserOperations_Permission default_permission,
176 const ppapi::FlashSiteSettings& sites);
177 void OnSetDefaultPermissionResult(uint32_t request_id, bool success);
178 void OnSetSitePermissionResult(uint32_t request_id, bool success);
179 void OnGetSitesWithDataResult(uint32_t request_id,
180 const std::vector<std::string>& sites);
181 void OnClearSiteDataResult(uint32_t request_id, bool success);
183 // Used only on the UI thread.
184 base::WeakPtr<PepperFlashSettingsManager> manager_;
186 // Used only on the I/O thread.
187 base::FilePath plugin_data_path_;
189 // The channel is NULL until we have opened a connection to the broker
190 // process. Used only on the I/O thread.
191 std::unique_ptr<IPC::Channel> channel_;
193 // Used only on the I/O thread.
196 // Requests that need to be sent once the channel to the broker process is
197 // established. Used only on the I/O thread.
198 std::vector<PendingRequest> pending_requests_;
199 // Requests that have been sent but haven't got replied. Used only on the
201 std::map<uint32_t, RequestType> pending_responses_;
203 // Used only on the I/O thread.
204 scoped_refptr<content::PepperFlashSettingsHelper> helper_;
206 // Path for the current profile. Must be retrieved on the UI thread from the
207 // browser context when we start so we can use it later on the I/O thread.
208 base::FilePath browser_context_path_;
210 scoped_refptr<PluginPrefs> plugin_prefs_;
213 PepperFlashSettingsManager::Core::Core(
214 base::WeakPtr<PepperFlashSettingsManager> manager,
215 content::BrowserContext* browser_context)
217 state_(STATE_UNINITIALIZED),
218 browser_context_path_(browser_context->GetPath()),
219 plugin_prefs_(PluginPrefs::GetForProfile(
220 Profile::FromBrowserContext(browser_context))) {
221 DCHECK_CURRENTLY_ON(BrowserThread::UI);
224 PepperFlashSettingsManager::Core::~Core() {
225 DCHECK_CURRENTLY_ON(BrowserThread::IO);
228 void PepperFlashSettingsManager::Core::Initialize() {
229 DCHECK_CURRENTLY_ON(BrowserThread::UI);
230 content::GetIOThreadTaskRunner({})->PostTask(
231 FROM_HERE, base::BindOnce(&Core::InitializeOnIOThread, this));
234 void PepperFlashSettingsManager::Core::Detach() {
235 DCHECK_CURRENTLY_ON(BrowserThread::UI);
237 // This call guarantees that one ref is retained until we get to the DETACHED
238 // state. This is important. Otherwise, if the ref count drops to zero on the
239 // UI thread (which posts a task to delete this object on the I/O thread)
240 // while the I/O thread doesn't know about it, methods on the I/O thread might
241 // increase the ref count again and cause double deletion.
242 content::GetIOThreadTaskRunner({})->PostTask(
243 FROM_HERE, base::BindOnce(&Core::DetachOnIOThread, this));
246 void PepperFlashSettingsManager::Core::DeauthorizeContentLicenses(
247 uint32_t request_id) {
248 DCHECK_CURRENTLY_ON(BrowserThread::UI);
250 content::GetIOThreadTaskRunner({})->PostTask(
251 FROM_HERE, base::BindOnce(&Core::DeauthorizeContentLicensesOnIOThread,
255 void PepperFlashSettingsManager::Core::GetPermissionSettings(
257 PP_Flash_BrowserOperations_SettingType setting_type) {
258 DCHECK_CURRENTLY_ON(BrowserThread::UI);
260 content::GetIOThreadTaskRunner({})->PostTask(
261 FROM_HERE, base::BindOnce(&Core::GetPermissionSettingsOnIOThread, this,
262 request_id, setting_type));
265 void PepperFlashSettingsManager::Core::SetDefaultPermission(
267 PP_Flash_BrowserOperations_SettingType setting_type,
268 PP_Flash_BrowserOperations_Permission permission,
269 bool clear_site_specific) {
270 DCHECK_CURRENTLY_ON(BrowserThread::UI);
272 content::GetIOThreadTaskRunner({})->PostTask(
274 base::BindOnce(&Core::SetDefaultPermissionOnIOThread, this, request_id,
275 setting_type, permission, clear_site_specific));
278 void PepperFlashSettingsManager::Core::SetSitePermission(
280 PP_Flash_BrowserOperations_SettingType setting_type,
281 const ppapi::FlashSiteSettings& sites) {
282 DCHECK_CURRENTLY_ON(BrowserThread::UI);
284 content::GetIOThreadTaskRunner({})->PostTask(
285 FROM_HERE, base::BindOnce(&Core::SetSitePermissionOnIOThread, this,
286 request_id, setting_type, sites));
289 void PepperFlashSettingsManager::Core::GetSitesWithData(uint32_t request_id) {
290 DCHECK_CURRENTLY_ON(BrowserThread::UI);
292 content::GetIOThreadTaskRunner({})->PostTask(
294 base::BindOnce(&Core::GetSitesWithDataOnIOThread, this, request_id));
297 void PepperFlashSettingsManager::Core::ClearSiteData(uint32_t request_id,
298 const std::string& site,
301 DCHECK_CURRENTLY_ON(BrowserThread::UI);
303 content::GetIOThreadTaskRunner({})->PostTask(
304 FROM_HERE, base::BindOnce(&Core::ClearSiteDataOnIOThread, this,
305 request_id, site, flags, max_age));
308 bool PepperFlashSettingsManager::Core::OnMessageReceived(
309 const IPC::Message& message) {
310 IPC_BEGIN_MESSAGE_MAP(Core, message)
311 IPC_MESSAGE_HANDLER(PpapiHostMsg_DeauthorizeContentLicensesResult,
312 OnDeauthorizeContentLicensesResult)
313 IPC_MESSAGE_HANDLER(PpapiHostMsg_GetPermissionSettingsResult,
314 OnGetPermissionSettingsResult)
315 IPC_MESSAGE_HANDLER(PpapiHostMsg_SetDefaultPermissionResult,
316 OnSetDefaultPermissionResult)
317 IPC_MESSAGE_HANDLER(PpapiHostMsg_SetSitePermissionResult,
318 OnSetSitePermissionResult)
319 IPC_MESSAGE_HANDLER(PpapiHostMsg_GetSitesWithDataResult,
320 OnGetSitesWithDataResult)
321 IPC_MESSAGE_HANDLER(PpapiHostMsg_ClearSiteDataResult,
322 OnClearSiteDataResult)
323 IPC_MESSAGE_UNHANDLED_ERROR()
324 IPC_END_MESSAGE_MAP()
329 void PepperFlashSettingsManager::Core::OnChannelError() {
330 DCHECK_CURRENTLY_ON(BrowserThread::IO);
331 if (state_ == STATE_DETACHED)
334 NotifyErrorFromIOThread();
337 void PepperFlashSettingsManager::Core::ConnectToChannel(
339 const IPC::ChannelHandle& handle) {
340 DCHECK_CURRENTLY_ON(BrowserThread::IO);
341 if (state_ == STATE_DETACHED)
344 DCHECK(state_ == STATE_UNINITIALIZED);
345 DCHECK(!channel_.get());
348 DLOG(ERROR) << "Couldn't open plugin channel";
349 NotifyErrorFromIOThread();
353 channel_ = IPC::Channel::CreateClient(handle, this,
354 base::ThreadTaskRunnerHandle::Get());
355 if (!channel_->Connect()) {
356 DLOG(ERROR) << "Couldn't connect to plugin";
357 NotifyErrorFromIOThread();
361 state_ = STATE_INITIALIZED;
363 std::vector<PendingRequest> temp_pending_requests;
364 temp_pending_requests.swap(pending_requests_);
365 for (auto iter = temp_pending_requests.begin();
366 iter != temp_pending_requests.end(); ++iter) {
367 switch (iter->type) {
368 case INVALID_REQUEST_TYPE:
371 case DEAUTHORIZE_CONTENT_LICENSES:
372 DeauthorizeContentLicensesOnIOThread(iter->id);
374 case GET_PERMISSION_SETTINGS:
375 GetPermissionSettingsOnIOThread(iter->id, iter->setting_type);
377 case SET_DEFAULT_PERMISSION:
378 SetDefaultPermissionOnIOThread(
379 iter->id, iter->setting_type, iter->permission,
380 iter->clear_site_specific);
382 case SET_SITE_PERMISSION:
383 SetSitePermissionOnIOThread(iter->id, iter->setting_type, iter->sites);
385 case GET_SITES_WITH_DATA:
386 GetSitesWithDataOnIOThread(iter->id);
388 case CLEAR_SITE_DATA:
389 ClearSiteDataOnIOThread(iter->id, iter->site, iter->flags,
396 void PepperFlashSettingsManager::Core::InitializeOnIOThread() {
397 DCHECK_CURRENTLY_ON(BrowserThread::IO);
398 DCHECK_EQ(STATE_UNINITIALIZED, state_);
400 content::WebPluginInfo plugin_info;
401 if (!PepperFlashSettingsManager::IsPepperFlashInUse(plugin_prefs_.get(),
403 NotifyErrorFromIOThread();
407 base::FilePath profile_path =
408 browser_context_path_.Append(content::kPepperDataDirname);
410 plugin_data_path_ = profile_path.Append(plugin_info.name);
412 plugin_data_path_ = profile_path.Append(base::UTF16ToUTF8(plugin_info.name));
415 helper_ = content::PepperFlashSettingsHelper::Create();
416 helper_->OpenChannelToBroker(plugin_info.path,
417 base::BindOnce(&Core::ConnectToChannel, this));
420 void PepperFlashSettingsManager::Core::DeauthorizeContentLicensesOnIOThread(
421 uint32_t request_id) {
422 DCHECK_CURRENTLY_ON(BrowserThread::IO);
423 DCHECK_NE(STATE_DETACHED, state_);
425 if (state_ == STATE_UNINITIALIZED) {
426 PendingRequest request;
427 request.id = request_id;
428 request.type = DEAUTHORIZE_CONTENT_LICENSES;
429 pending_requests_.push_back(request);
433 pending_responses_.insert(
434 std::make_pair(request_id, DEAUTHORIZE_CONTENT_LICENSES));
435 if (state_ == STATE_ERROR) {
436 NotifyErrorFromIOThread();
440 #if defined(OS_CHROMEOS)
441 base::ThreadPool::PostTask(
442 FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
443 base::BindOnce(&Core::DeauthorizeContentLicensesAsync, this, request_id,
444 browser_context_path_));
446 DeauthorizeContentLicensesInPlugin(request_id, true);
450 // TODO(raymes): This is temporary code to migrate ChromeOS devices to the new
451 // scheme for generating device IDs. Delete this once we are sure most ChromeOS
452 // devices have been migrated.
453 void PepperFlashSettingsManager::Core::DeauthorizeContentLicensesAsync(
455 const base::FilePath& profile_path) {
456 // ChromeOS used to store the device ID in a file but this is no longer used.
458 const base::FilePath& device_id_path =
459 DeviceIDFetcher::GetLegacyDeviceIDPath(profile_path);
460 bool success = base::DeleteFile(device_id_path, false);
462 content::GetIOThreadTaskRunner({})->PostTask(
463 FROM_HERE, base::BindOnce(&Core::DeauthorizeContentLicensesInPlugin, this,
464 request_id, success));
467 void PepperFlashSettingsManager::Core::DeauthorizeContentLicensesInPlugin(
470 DCHECK_CURRENTLY_ON(BrowserThread::IO);
472 NotifyErrorFromIOThread();
476 new PpapiMsg_DeauthorizeContentLicenses(request_id, plugin_data_path_);
477 if (!channel_->Send(msg)) {
478 DLOG(ERROR) << "Couldn't send DeauthorizeContentLicenses message";
479 // A failure notification for the current request will be sent since
480 // |pending_responses_| has been updated.
481 NotifyErrorFromIOThread();
485 void PepperFlashSettingsManager::Core::GetPermissionSettingsOnIOThread(
487 PP_Flash_BrowserOperations_SettingType setting_type) {
488 DCHECK_CURRENTLY_ON(BrowserThread::IO);
489 DCHECK_NE(STATE_DETACHED, state_);
491 if (state_ == STATE_UNINITIALIZED) {
492 PendingRequest request;
493 request.id = request_id;
494 request.type = GET_PERMISSION_SETTINGS;
495 request.setting_type = setting_type;
496 pending_requests_.push_back(request);
500 pending_responses_.insert(
501 std::make_pair(request_id, GET_PERMISSION_SETTINGS));
502 if (state_ == STATE_ERROR) {
503 NotifyErrorFromIOThread();
507 IPC::Message* msg = new PpapiMsg_GetPermissionSettings(
508 request_id, plugin_data_path_, setting_type);
509 if (!channel_->Send(msg)) {
510 DLOG(ERROR) << "Couldn't send GetPermissionSettings message";
511 // A failure notification for the current request will be sent since
512 // |pending_responses_| has been updated.
513 NotifyErrorFromIOThread();
517 void PepperFlashSettingsManager::Core::SetDefaultPermissionOnIOThread(
519 PP_Flash_BrowserOperations_SettingType setting_type,
520 PP_Flash_BrowserOperations_Permission permission,
521 bool clear_site_specific) {
522 DCHECK_CURRENTLY_ON(BrowserThread::IO);
523 DCHECK_NE(STATE_DETACHED, state_);
525 if (state_ == STATE_UNINITIALIZED) {
526 PendingRequest request;
527 request.id = request_id;
528 request.type = SET_DEFAULT_PERMISSION;
529 request.setting_type = setting_type;
530 request.permission = permission;
531 request.clear_site_specific = clear_site_specific;
532 pending_requests_.push_back(request);
536 pending_responses_.insert(std::make_pair(request_id, SET_DEFAULT_PERMISSION));
537 if (state_ == STATE_ERROR) {
538 NotifyErrorFromIOThread();
542 IPC::Message* msg = new PpapiMsg_SetDefaultPermission(
543 request_id, plugin_data_path_, setting_type, permission,
544 clear_site_specific);
545 if (!channel_->Send(msg)) {
546 DLOG(ERROR) << "Couldn't send SetDefaultPermission message";
547 // A failure notification for the current request will be sent since
548 // |pending_responses_| has been updated.
549 NotifyErrorFromIOThread();
553 void PepperFlashSettingsManager::Core::SetSitePermissionOnIOThread(
555 PP_Flash_BrowserOperations_SettingType setting_type,
556 const ppapi::FlashSiteSettings& sites) {
557 DCHECK_CURRENTLY_ON(BrowserThread::IO);
558 DCHECK_NE(STATE_DETACHED, state_);
560 if (state_ == STATE_UNINITIALIZED) {
561 pending_requests_.push_back(PendingRequest());
562 PendingRequest& request = pending_requests_.back();
563 request.id = request_id;
564 request.type = SET_SITE_PERMISSION;
565 request.setting_type = setting_type;
566 request.sites = sites;
570 pending_responses_.insert(std::make_pair(request_id, SET_SITE_PERMISSION));
571 if (state_ == STATE_ERROR) {
572 NotifyErrorFromIOThread();
576 IPC::Message* msg = new PpapiMsg_SetSitePermission(
577 request_id, plugin_data_path_, setting_type, sites);
578 if (!channel_->Send(msg)) {
579 DLOG(ERROR) << "Couldn't send SetSitePermission message";
580 // A failure notification for the current request will be sent since
581 // |pending_responses_| has been updated.
582 NotifyErrorFromIOThread();
586 void PepperFlashSettingsManager::Core::GetSitesWithDataOnIOThread(
587 uint32_t request_id) {
588 DCHECK_CURRENTLY_ON(BrowserThread::IO);
589 DCHECK_NE(STATE_DETACHED, state_);
591 if (state_ == STATE_UNINITIALIZED) {
592 pending_requests_.push_back(PendingRequest());
593 PendingRequest& request = pending_requests_.back();
594 request.id = request_id;
595 request.type = GET_SITES_WITH_DATA;
599 pending_responses_.insert(std::make_pair(request_id, GET_SITES_WITH_DATA));
600 if (state_ == STATE_ERROR) {
601 NotifyErrorFromIOThread();
605 IPC::Message* msg = new PpapiMsg_GetSitesWithData(
606 request_id, plugin_data_path_);
607 if (!channel_->Send(msg)) {
608 DLOG(ERROR) << "Couldn't send GetSitesWithData message";
609 // A failure notification for the current request will be sent since
610 // |pending_responses_| has been updated.
611 NotifyErrorFromIOThread();
615 void PepperFlashSettingsManager::Core::ClearSiteDataOnIOThread(
617 const std::string& site,
620 DCHECK_CURRENTLY_ON(BrowserThread::IO);
621 DCHECK_NE(STATE_DETACHED, state_);
623 if (state_ == STATE_UNINITIALIZED) {
624 pending_requests_.push_back(PendingRequest());
625 PendingRequest& request = pending_requests_.back();
626 request.id = request_id;
627 request.type = CLEAR_SITE_DATA;
629 request.flags = flags;
630 request.max_age = max_age;
634 pending_responses_.insert(std::make_pair(request_id, CLEAR_SITE_DATA));
635 if (state_ == STATE_ERROR) {
636 NotifyErrorFromIOThread();
640 IPC::Message* msg = new PpapiMsg_ClearSiteData(
641 request_id, plugin_data_path_, site, flags, max_age);
642 if (!channel_->Send(msg)) {
643 DLOG(ERROR) << "Couldn't send ClearSiteData message";
644 // A failure notification for the current request will be sent since
645 // |pending_responses_| has been updated.
646 NotifyErrorFromIOThread();
650 void PepperFlashSettingsManager::Core::DetachOnIOThread() {
651 state_ = STATE_DETACHED;
654 void PepperFlashSettingsManager::Core::NotifyErrorFromIOThread() {
655 DCHECK_CURRENTLY_ON(BrowserThread::IO);
656 if (state_ == STATE_DETACHED)
659 state_ = STATE_ERROR;
660 std::vector<std::pair<uint32_t, RequestType>> notifications;
661 for (auto iter = pending_requests_.begin(); iter != pending_requests_.end();
663 notifications.push_back(std::make_pair(iter->id, iter->type));
665 pending_requests_.clear();
666 notifications.insert(notifications.end(), pending_responses_.begin(),
667 pending_responses_.end());
668 pending_responses_.clear();
670 content::GetUIThreadTaskRunner({})->PostTask(
671 FROM_HERE, base::BindOnce(&Core::NotifyError, this, notifications));
674 void PepperFlashSettingsManager::Core::
675 NotifyDeauthorizeContentLicensesCompleted(uint32_t request_id,
677 DCHECK_CURRENTLY_ON(BrowserThread::UI);
679 if (manager_.get()) {
680 manager_->client_->OnDeauthorizeFlashContentLicensesCompleted(request_id,
685 void PepperFlashSettingsManager::Core::NotifyGetPermissionSettingsCompleted(
688 PP_Flash_BrowserOperations_Permission default_permission,
689 const ppapi::FlashSiteSettings& sites) {
690 DCHECK_CURRENTLY_ON(BrowserThread::UI);
692 if (manager_.get()) {
693 manager_->client_->OnGetPermissionSettingsCompleted(
694 request_id, success, default_permission, sites);
698 void PepperFlashSettingsManager::Core::NotifySetDefaultPermissionCompleted(
701 DCHECK_CURRENTLY_ON(BrowserThread::UI);
703 if (manager_.get()) {
704 manager_->client_->OnSetDefaultPermissionCompleted(
705 request_id, success);
709 void PepperFlashSettingsManager::Core::NotifySetSitePermissionCompleted(
712 DCHECK_CURRENTLY_ON(BrowserThread::UI);
714 if (manager_.get()) {
715 manager_->client_->OnSetSitePermissionCompleted(
716 request_id, success);
720 void PepperFlashSettingsManager::Core::NotifyGetSitesWithDataCompleted(
722 const std::vector<std::string>& sites) {
723 DCHECK_CURRENTLY_ON(BrowserThread::UI);
725 if (manager_.get()) {
726 manager_->client_->OnGetSitesWithDataCompleted(
731 void PepperFlashSettingsManager::Core::NotifyClearSiteDataCompleted(
734 DCHECK_CURRENTLY_ON(BrowserThread::UI);
737 manager_->client_->OnClearSiteDataCompleted(request_id, success);
740 void PepperFlashSettingsManager::Core::NotifyError(
741 const std::vector<std::pair<uint32_t, RequestType>>& notifications) {
742 DCHECK_CURRENTLY_ON(BrowserThread::UI);
744 scoped_refptr<Core> protector(this);
745 for (auto iter = notifications.begin(); iter != notifications.end(); ++iter) {
746 // Check |manager_| for each iteration in case it is destroyed in one of
751 switch (iter->second) {
752 case INVALID_REQUEST_TYPE:
755 case DEAUTHORIZE_CONTENT_LICENSES:
756 manager_->client_->OnDeauthorizeFlashContentLicensesCompleted(
759 case GET_PERMISSION_SETTINGS:
760 manager_->client_->OnGetPermissionSettingsCompleted(
761 iter->first, false, PP_FLASH_BROWSEROPERATIONS_PERMISSION_DEFAULT,
762 ppapi::FlashSiteSettings());
764 case SET_DEFAULT_PERMISSION:
765 manager_->client_->OnSetDefaultPermissionCompleted(
768 case SET_SITE_PERMISSION:
769 manager_->client_->OnSetSitePermissionCompleted(iter->first, false);
771 case GET_SITES_WITH_DATA:
772 manager_->client_->OnGetSitesWithDataCompleted(
773 iter->first, std::vector<std::string>());
775 case CLEAR_SITE_DATA:
776 manager_->client_->OnClearSiteDataCompleted(iter->first, false);
782 manager_->OnError(this);
785 void PepperFlashSettingsManager::Core::OnDeauthorizeContentLicensesResult(
788 DCHECK_CURRENTLY_ON(BrowserThread::IO);
789 if (state_ == STATE_DETACHED)
792 DLOG_IF(ERROR, !success) << "DeauthorizeContentLicenses returned error";
794 auto iter = pending_responses_.find(request_id);
795 if (iter == pending_responses_.end())
798 DCHECK_EQ(iter->second, DEAUTHORIZE_CONTENT_LICENSES);
800 pending_responses_.erase(iter);
801 content::GetUIThreadTaskRunner({})->PostTask(
803 base::BindOnce(&Core::NotifyDeauthorizeContentLicensesCompleted, this,
804 request_id, success));
807 void PepperFlashSettingsManager::Core::OnGetPermissionSettingsResult(
810 PP_Flash_BrowserOperations_Permission default_permission,
811 const ppapi::FlashSiteSettings& sites) {
812 DCHECK_CURRENTLY_ON(BrowserThread::IO);
813 if (state_ == STATE_DETACHED)
816 DLOG_IF(ERROR, !success) << "GetPermissionSettings returned error";
818 auto iter = pending_responses_.find(request_id);
819 if (iter == pending_responses_.end())
822 DCHECK_EQ(iter->second, GET_PERMISSION_SETTINGS);
824 pending_responses_.erase(iter);
825 content::GetUIThreadTaskRunner({})->PostTask(
827 base::BindOnce(&Core::NotifyGetPermissionSettingsCompleted, this,
828 request_id, success, default_permission, sites));
831 void PepperFlashSettingsManager::Core::OnSetDefaultPermissionResult(
834 DCHECK_CURRENTLY_ON(BrowserThread::IO);
835 if (state_ == STATE_DETACHED)
838 DLOG_IF(ERROR, !success) << "SetDefaultPermission returned error";
840 auto iter = pending_responses_.find(request_id);
841 if (iter == pending_responses_.end())
844 DCHECK_EQ(iter->second, SET_DEFAULT_PERMISSION);
846 pending_responses_.erase(iter);
847 content::GetUIThreadTaskRunner({})->PostTask(
848 FROM_HERE, base::BindOnce(&Core::NotifySetDefaultPermissionCompleted,
849 this, request_id, success));
852 void PepperFlashSettingsManager::Core::OnSetSitePermissionResult(
855 DCHECK_CURRENTLY_ON(BrowserThread::IO);
856 if (state_ == STATE_DETACHED)
859 DLOG_IF(ERROR, !success) << "SetSitePermission returned error";
861 auto iter = pending_responses_.find(request_id);
862 if (iter == pending_responses_.end())
865 DCHECK_EQ(iter->second, SET_SITE_PERMISSION);
867 pending_responses_.erase(iter);
868 content::GetUIThreadTaskRunner({})->PostTask(
869 FROM_HERE, base::BindOnce(&Core::NotifySetSitePermissionCompleted, this,
870 request_id, success));
873 void PepperFlashSettingsManager::Core::OnGetSitesWithDataResult(
875 const std::vector<std::string>& sites) {
876 DCHECK_CURRENTLY_ON(BrowserThread::IO);
877 if (state_ == STATE_DETACHED)
880 auto iter = pending_responses_.find(request_id);
881 if (iter == pending_responses_.end())
884 DCHECK_EQ(iter->second, GET_SITES_WITH_DATA);
886 pending_responses_.erase(iter);
887 content::GetUIThreadTaskRunner({})->PostTask(
888 FROM_HERE, base::BindOnce(&Core::NotifyGetSitesWithDataCompleted, this,
892 void PepperFlashSettingsManager::Core::OnClearSiteDataResult(
895 DCHECK_CURRENTLY_ON(BrowserThread::IO);
896 if (state_ == STATE_DETACHED)
899 DLOG_IF(ERROR, !success) << "ClearSiteData returned error";
901 auto iter = pending_responses_.find(request_id);
902 if (iter == pending_responses_.end())
905 DCHECK_EQ(iter->second, CLEAR_SITE_DATA);
907 pending_responses_.erase(iter);
908 content::GetUIThreadTaskRunner({})->PostTask(
909 FROM_HERE, base::BindOnce(&Core::NotifyClearSiteDataCompleted, this,
910 request_id, success));
913 PepperFlashSettingsManager::PepperFlashSettingsManager(
915 content::BrowserContext* browser_context)
916 : client_(client), browser_context_(browser_context), next_request_id_(1) {
918 DCHECK(browser_context);
921 PepperFlashSettingsManager::~PepperFlashSettingsManager() {
927 bool PepperFlashSettingsManager::IsPepperFlashInUse(
928 PluginPrefs* plugin_prefs,
929 content::WebPluginInfo* plugin_info) {
933 content::PluginService* plugin_service =
934 content::PluginService::GetInstance();
935 std::vector<content::WebPluginInfo> plugins;
936 plugin_service->GetPluginInfoArray(
937 GURL(), content::kFlashPluginSwfMimeType, false, &plugins, NULL);
939 for (auto iter = plugins.begin(); iter != plugins.end(); ++iter) {
940 if (iter->is_pepper_plugin() && plugin_prefs->IsPluginEnabled(*iter)) {
942 *plugin_info = *iter;
950 void PepperFlashSettingsManager::RegisterProfilePrefs(
951 user_prefs::PrefRegistrySyncable* registry) {
952 registry->RegisterBooleanPref(prefs::kPepperFlashSettingsEnabled, true);
955 uint32_t PepperFlashSettingsManager::DeauthorizeContentLicenses(
956 PrefService* prefs) {
957 DCHECK_CURRENTLY_ON(BrowserThread::UI);
959 // Clear the device ID salt which has the effect of regenerating a device
960 // ID. Since this happens synchronously (and on the UI thread), we don't have
961 // to add it to a pending request.
962 prefs->ClearPref(prefs::kDRMSalt);
965 uint32_t id = GetNextRequestId();
966 core_->DeauthorizeContentLicenses(id);
970 uint32_t PepperFlashSettingsManager::GetPermissionSettings(
971 PP_Flash_BrowserOperations_SettingType setting_type) {
972 DCHECK_CURRENTLY_ON(BrowserThread::UI);
975 uint32_t id = GetNextRequestId();
976 core_->GetPermissionSettings(id, setting_type);
980 uint32_t PepperFlashSettingsManager::SetDefaultPermission(
981 PP_Flash_BrowserOperations_SettingType setting_type,
982 PP_Flash_BrowserOperations_Permission permission,
983 bool clear_site_specific) {
984 DCHECK_CURRENTLY_ON(BrowserThread::UI);
987 uint32_t id = GetNextRequestId();
988 core_->SetDefaultPermission(id, setting_type, permission,
989 clear_site_specific);
993 uint32_t PepperFlashSettingsManager::SetSitePermission(
994 PP_Flash_BrowserOperations_SettingType setting_type,
995 const ppapi::FlashSiteSettings& sites) {
996 DCHECK_CURRENTLY_ON(BrowserThread::UI);
999 uint32_t id = GetNextRequestId();
1000 core_->SetSitePermission(id, setting_type, sites);
1004 uint32_t PepperFlashSettingsManager::GetSitesWithData() {
1005 DCHECK_CURRENTLY_ON(BrowserThread::UI);
1008 uint32_t id = GetNextRequestId();
1009 core_->GetSitesWithData(id);
1013 uint32_t PepperFlashSettingsManager::ClearSiteData(const std::string& site,
1016 DCHECK_CURRENTLY_ON(BrowserThread::UI);
1019 uint32_t id = GetNextRequestId();
1020 core_->ClearSiteData(id, site, flags, max_age);
1024 uint32_t PepperFlashSettingsManager::GetNextRequestId() {
1025 return next_request_id_++;
1028 void PepperFlashSettingsManager::EnsureCoreExists() {
1030 core_ = new Core(weak_ptr_factory_.GetWeakPtr(), browser_context_);
1031 core_->Initialize();
1035 void PepperFlashSettingsManager::OnError(Core* core) {
1037 if (core != core_.get())