Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2098)

Unified Diff: chrome/browser/pepper_flash_settings_manager.cc

Issue 10986059: Fail incoming requests in PepperFlashSettingsManager after an error. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: sync Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/pepper_flash_settings_manager.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/pepper_flash_settings_manager.cc
diff --git a/chrome/browser/pepper_flash_settings_manager.cc b/chrome/browser/pepper_flash_settings_manager.cc
index df1acbc2e0507798120ad045a7ff0e9b57d94558..88ef5a353e1b5c4fbc3fdd8cff6efa90db6c4805 100644
--- a/chrome/browser/pepper_flash_settings_manager.cc
+++ b/chrome/browser/pepper_flash_settings_manager.cc
@@ -33,11 +33,13 @@ class PepperFlashSettingsManager::Core
: public IPC::Listener,
public base::RefCountedThreadSafe<Core, BrowserThread::DeleteOnIOThread> {
public:
- Core(PepperFlashSettingsManager* manager,
+ Core(base::WeakPtr<PepperFlashSettingsManager> manager,
content::BrowserContext* browser_context);
void Initialize();
- // Stops sending notifications to |manager_| and sets it to NULL.
+
+ // Notifies the core that it has been detached. Afterwards, no method should
+ // be called any more.
void Detach();
void DeauthorizeContentLicenses(uint32 request_id);
@@ -76,6 +78,13 @@ class PepperFlashSettingsManager::Core
CLEAR_SITE_DATA,
};
+ enum State {
+ STATE_UNINITIALIZED = 0,
+ STATE_INITIALIZED,
+ STATE_ERROR,
+ STATE_DETACHED,
+ };
+
struct PendingRequest {
PendingRequest()
: id(0),
@@ -164,7 +173,7 @@ class PepperFlashSettingsManager::Core
void OnClearSiteDataResult(uint32 request_id, bool success);
// Used only on the UI thread.
- PepperFlashSettingsManager* manager_;
+ base::WeakPtr<PepperFlashSettingsManager> manager_;
// Used only on the I/O thread.
FilePath plugin_data_path_;
@@ -174,10 +183,7 @@ class PepperFlashSettingsManager::Core
scoped_ptr<IPC::Channel> channel_;
// Used only on the I/O thread.
- bool initialized_;
- // Whether Detach() has been called on the UI thread. When it is true, further
- // work is not necessary. Used only on the I/O thread.
- bool detached_;
+ State state_;
// Requests that need to be sent once the channel to the broker process is
// established. Used only on the I/O thread.
@@ -196,11 +202,11 @@ class PepperFlashSettingsManager::Core
scoped_refptr<PluginPrefs> plugin_prefs_;
};
-PepperFlashSettingsManager::Core::Core(PepperFlashSettingsManager* manager,
- content::BrowserContext* browser_context)
+PepperFlashSettingsManager::Core::Core(
+ base::WeakPtr<PepperFlashSettingsManager> manager,
+ content::BrowserContext* browser_context)
: manager_(manager),
- initialized_(false),
- detached_(false),
+ state_(STATE_UNINITIALIZED),
browser_context_path_(browser_context->GetPath()),
plugin_prefs_(PluginPrefs::GetForProfile(
Profile::FromBrowserContext(browser_context))) {
@@ -220,9 +226,8 @@ void PepperFlashSettingsManager::Core::Initialize() {
void PepperFlashSettingsManager::Core::Detach() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- manager_ = NULL;
- // This call guarantees that one ref is retained until |detached_| is set to
- // true. This is important. Otherwise, if the ref count drops to zero on the
+ // This call guarantees that one ref is retained until we get to the DETACHED
+ // state. This is important. Otherwise, if the ref count drops to zero on the
// UI thread (which posts a task to delete this object on the I/O thread)
// while the I/O thread doesn't know about it, methods on the I/O thread might
// increase the ref count again and cause double deletion.
@@ -265,9 +270,9 @@ void PepperFlashSettingsManager::Core::SetDefaultPermission(
}
void PepperFlashSettingsManager::Core::SetSitePermission(
- uint32 request_id,
- PP_Flash_BrowserOperations_SettingType setting_type,
- const ppapi::FlashSiteSettings& sites) {
+ uint32 request_id,
+ PP_Flash_BrowserOperations_SettingType setting_type,
+ const ppapi::FlashSiteSettings& sites) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
BrowserThread::PostTask(
@@ -319,7 +324,7 @@ bool PepperFlashSettingsManager::Core::OnMessageReceived(
void PepperFlashSettingsManager::Core::OnChannelError() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (detached_)
+ if (state_ == STATE_DETACHED)
return;
NotifyErrorFromIOThread();
@@ -329,10 +334,10 @@ void PepperFlashSettingsManager::Core::ConnectToChannel(
bool success,
const IPC::ChannelHandle& handle) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (detached_)
+ if (state_ == STATE_DETACHED)
return;
- DCHECK(!initialized_);
+ DCHECK(state_ == STATE_UNINITIALIZED);
DCHECK(!channel_.get());
if (!success) {
@@ -348,7 +353,7 @@ void PepperFlashSettingsManager::Core::ConnectToChannel(
return;
}
- initialized_ = true;
+ state_ = STATE_INITIALIZED;
std::vector<PendingRequest> temp_pending_requests;
temp_pending_requests.swap(pending_requests_);
@@ -386,10 +391,7 @@ void PepperFlashSettingsManager::Core::ConnectToChannel(
void PepperFlashSettingsManager::Core::InitializeOnIOThread() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- DCHECK(!initialized_);
-
- if (detached_)
- return;
+ DCHECK_EQ(STATE_UNINITIALIZED, state_);
webkit::WebPluginInfo plugin_info;
if (!PepperFlashSettingsManager::IsPepperFlashInUse(plugin_prefs_.get(),
@@ -415,10 +417,9 @@ void PepperFlashSettingsManager::Core::InitializeOnIOThread() {
void PepperFlashSettingsManager::Core::DeauthorizeContentLicensesOnIOThread(
uint32 request_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (detached_)
- return;
+ DCHECK_NE(STATE_DETACHED, state_);
- if (!initialized_) {
+ if (state_ == STATE_UNINITIALIZED) {
PendingRequest request;
request.id = request_id;
request.type = DEAUTHORIZE_CONTENT_LICENSES;
@@ -428,6 +429,11 @@ void PepperFlashSettingsManager::Core::DeauthorizeContentLicensesOnIOThread(
pending_responses_.insert(
std::make_pair(request_id, DEAUTHORIZE_CONTENT_LICENSES));
+ if (state_ == STATE_ERROR) {
+ NotifyErrorFromIOThread();
+ return;
+ }
+
IPC::Message* msg =
new PpapiMsg_DeauthorizeContentLicenses(request_id, plugin_data_path_);
if (!channel_->Send(msg)) {
@@ -442,10 +448,9 @@ void PepperFlashSettingsManager::Core::GetPermissionSettingsOnIOThread(
uint32 request_id,
PP_Flash_BrowserOperations_SettingType setting_type) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (detached_)
- return;
+ DCHECK_NE(STATE_DETACHED, state_);
- if (!initialized_) {
+ if (state_ == STATE_UNINITIALIZED) {
PendingRequest request;
request.id = request_id;
request.type = GET_PERMISSION_SETTINGS;
@@ -456,6 +461,11 @@ void PepperFlashSettingsManager::Core::GetPermissionSettingsOnIOThread(
pending_responses_.insert(
std::make_pair(request_id, GET_PERMISSION_SETTINGS));
+ if (state_ == STATE_ERROR) {
+ NotifyErrorFromIOThread();
+ return;
+ }
+
IPC::Message* msg = new PpapiMsg_GetPermissionSettings(
request_id, plugin_data_path_, setting_type);
if (!channel_->Send(msg)) {
@@ -472,10 +482,9 @@ void PepperFlashSettingsManager::Core::SetDefaultPermissionOnIOThread(
PP_Flash_BrowserOperations_Permission permission,
bool clear_site_specific) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (detached_)
- return;
+ DCHECK_NE(STATE_DETACHED, state_);
- if (!initialized_) {
+ if (state_ == STATE_UNINITIALIZED) {
PendingRequest request;
request.id = request_id;
request.type = SET_DEFAULT_PERMISSION;
@@ -487,6 +496,11 @@ void PepperFlashSettingsManager::Core::SetDefaultPermissionOnIOThread(
}
pending_responses_.insert(std::make_pair(request_id, SET_DEFAULT_PERMISSION));
+ if (state_ == STATE_ERROR) {
+ NotifyErrorFromIOThread();
+ return;
+ }
+
IPC::Message* msg = new PpapiMsg_SetDefaultPermission(
request_id, plugin_data_path_, setting_type, permission,
clear_site_specific);
@@ -503,10 +517,9 @@ void PepperFlashSettingsManager::Core::SetSitePermissionOnIOThread(
PP_Flash_BrowserOperations_SettingType setting_type,
const ppapi::FlashSiteSettings& sites) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (detached_)
- return;
+ DCHECK_NE(STATE_DETACHED, state_);
- if (!initialized_) {
+ if (state_ == STATE_UNINITIALIZED) {
pending_requests_.push_back(PendingRequest());
PendingRequest& request = pending_requests_.back();
request.id = request_id;
@@ -517,6 +530,11 @@ void PepperFlashSettingsManager::Core::SetSitePermissionOnIOThread(
}
pending_responses_.insert(std::make_pair(request_id, SET_SITE_PERMISSION));
+ if (state_ == STATE_ERROR) {
+ NotifyErrorFromIOThread();
+ return;
+ }
+
IPC::Message* msg = new PpapiMsg_SetSitePermission(
request_id, plugin_data_path_, setting_type, sites);
if (!channel_->Send(msg)) {
@@ -530,10 +548,9 @@ void PepperFlashSettingsManager::Core::SetSitePermissionOnIOThread(
void PepperFlashSettingsManager::Core::GetSitesWithDataOnIOThread(
uint32 request_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (detached_)
- return;
+ DCHECK_NE(STATE_DETACHED, state_);
- if (!initialized_) {
+ if (state_ == STATE_UNINITIALIZED) {
pending_requests_.push_back(PendingRequest());
PendingRequest& request = pending_requests_.back();
request.id = request_id;
@@ -542,6 +559,11 @@ void PepperFlashSettingsManager::Core::GetSitesWithDataOnIOThread(
}
pending_responses_.insert(std::make_pair(request_id, GET_SITES_WITH_DATA));
+ if (state_ == STATE_ERROR) {
+ NotifyErrorFromIOThread();
+ return;
+ }
+
IPC::Message* msg = new PpapiMsg_GetSitesWithData(
request_id, plugin_data_path_);
if (!channel_->Send(msg)) {
@@ -558,10 +580,9 @@ void PepperFlashSettingsManager::Core::ClearSiteDataOnIOThread(
uint64 flags,
uint64 max_age) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (detached_)
- return;
+ DCHECK_NE(STATE_DETACHED, state_);
- if (!initialized_) {
+ if (state_ == STATE_UNINITIALIZED) {
pending_requests_.push_back(PendingRequest());
PendingRequest& request = pending_requests_.back();
request.id = request_id;
@@ -573,6 +594,11 @@ void PepperFlashSettingsManager::Core::ClearSiteDataOnIOThread(
}
pending_responses_.insert(std::make_pair(request_id, CLEAR_SITE_DATA));
+ if (state_ == STATE_ERROR) {
+ NotifyErrorFromIOThread();
+ return;
+ }
+
IPC::Message* msg = new PpapiMsg_ClearSiteData(
request_id, plugin_data_path_, site, flags, max_age);
if (!channel_->Send(msg)) {
@@ -584,14 +610,15 @@ void PepperFlashSettingsManager::Core::ClearSiteDataOnIOThread(
}
void PepperFlashSettingsManager::Core::DetachOnIOThread() {
- detached_ = true;
+ state_ = STATE_DETACHED;
}
void PepperFlashSettingsManager::Core::NotifyErrorFromIOThread() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (detached_)
+ if (state_ == STATE_DETACHED)
return;
+ state_ = STATE_ERROR;
std::vector<std::pair<uint32, RequestType> > notifications;
for (std::vector<PendingRequest>::iterator iter = pending_requests_.begin();
iter != pending_requests_.end(); ++iter) {
@@ -613,7 +640,7 @@ PepperFlashSettingsManager::Core::NotifyDeauthorizeContentLicensesCompleted(
bool success) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- if (manager_) {
+ if (manager_.get()) {
manager_->client_->OnDeauthorizeContentLicensesCompleted(
request_id, success);
}
@@ -626,7 +653,7 @@ void PepperFlashSettingsManager::Core::NotifyGetPermissionSettingsCompleted(
const ppapi::FlashSiteSettings& sites) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- if (manager_) {
+ if (manager_.get()) {
manager_->client_->OnGetPermissionSettingsCompleted(
request_id, success, default_permission, sites);
}
@@ -637,7 +664,7 @@ void PepperFlashSettingsManager::Core::NotifySetDefaultPermissionCompleted(
bool success) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- if (manager_) {
+ if (manager_.get()) {
manager_->client_->OnSetDefaultPermissionCompleted(
request_id, success);
}
@@ -648,7 +675,7 @@ void PepperFlashSettingsManager::Core::NotifySetSitePermissionCompleted(
bool success) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- if (manager_) {
+ if (manager_.get()) {
manager_->client_->OnSetSitePermissionCompleted(
request_id, success);
}
@@ -659,7 +686,7 @@ void PepperFlashSettingsManager::Core::NotifyGetSitesWithDataCompleted(
const std::vector<std::string>& sites) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- if (manager_) {
+ if (manager_.get()) {
manager_->client_->OnGetSitesWithDataCompleted(
request_id, sites);
}
@@ -670,7 +697,7 @@ void PepperFlashSettingsManager::Core::NotifyClearSiteDataCompleted(
bool success) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- if (manager_)
+ if (manager_.get())
manager_->client_->OnClearSiteDataCompleted(request_id, success);
}
@@ -681,9 +708,9 @@ void PepperFlashSettingsManager::Core::NotifyError(
scoped_refptr<Core> protector(this);
for (std::vector<std::pair<uint32, RequestType> >::const_iterator iter =
notifications.begin(); iter != notifications.end(); ++iter) {
- // Check |manager_| for each iteration in case Detach() happens in one of
+ // Check |manager_| for each iteration in case it is destroyed in one of
// the callbacks.
- if (!manager_)
+ if (!manager_.get())
return;
switch (iter->second) {
@@ -716,15 +743,15 @@ void PepperFlashSettingsManager::Core::NotifyError(
}
}
- if (manager_)
- manager_->OnError();
+ if (manager_.get())
+ manager_->OnError(this);
}
void PepperFlashSettingsManager::Core::OnDeauthorizeContentLicensesResult(
uint32 request_id,
bool success) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (detached_)
+ if (state_ == STATE_DETACHED)
return;
DLOG_IF(ERROR, !success) << "DeauthorizeContentLicenses returned error";
@@ -749,7 +776,7 @@ void PepperFlashSettingsManager::Core::OnGetPermissionSettingsResult(
PP_Flash_BrowserOperations_Permission default_permission,
const ppapi::FlashSiteSettings& sites) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (detached_)
+ if (state_ == STATE_DETACHED)
return;
DLOG_IF(ERROR, !success) << "GetPermissionSettings returned error";
@@ -772,7 +799,7 @@ void PepperFlashSettingsManager::Core::OnSetDefaultPermissionResult(
uint32 request_id,
bool success) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (detached_)
+ if (state_ == STATE_DETACHED)
return;
DLOG_IF(ERROR, !success) << "SetDefaultPermission returned error";
@@ -795,7 +822,7 @@ void PepperFlashSettingsManager::Core::OnSetSitePermissionResult(
uint32 request_id,
bool success) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (detached_)
+ if (state_ == STATE_DETACHED)
return;
DLOG_IF(ERROR, !success) << "SetSitePermission returned error";
@@ -818,7 +845,7 @@ void PepperFlashSettingsManager::Core::OnGetSitesWithDataResult(
uint32 request_id,
const std::vector<std::string>& sites) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (detached_)
+ if (state_ == STATE_DETACHED)
return;
std::map<uint32, RequestType>::iterator iter =
@@ -839,7 +866,7 @@ void PepperFlashSettingsManager::Core::OnClearSiteDataResult(
uint32 request_id,
bool success) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- if (detached_)
+ if (state_ == STATE_DETACHED)
return;
DLOG_IF(ERROR, !success) << "ClearSiteData returned error";
@@ -861,7 +888,8 @@ void PepperFlashSettingsManager::Core::OnClearSiteDataResult(
PepperFlashSettingsManager::PepperFlashSettingsManager(
Client* client,
content::BrowserContext* browser_context)
- : client_(client),
+ : ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)),
+ client_(client),
browser_context_(browser_context),
next_request_id_(1) {
DCHECK(client);
@@ -977,17 +1005,16 @@ uint32 PepperFlashSettingsManager::GetNextRequestId() {
void PepperFlashSettingsManager::EnsureCoreExists() {
if (!core_.get()) {
- core_ = new Core(this, browser_context_);
+ core_ = new Core(weak_ptr_factory_.GetWeakPtr(), browser_context_);
core_->Initialize();
}
}
-void PepperFlashSettingsManager::OnError() {
- if (core_.get()) {
- core_->Detach();
- core_ = NULL;
- } else {
- NOTREACHED();
- }
-}
+void PepperFlashSettingsManager::OnError(Core* core) {
+ DCHECK(core);
+ if (core != core_.get())
+ return;
+ core_->Detach();
+ core_ = NULL;
+}
« no previous file with comments | « chrome/browser/pepper_flash_settings_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698