Commit 596cfef0 authored by kinuko@chromium.org's avatar kinuko@chromium.org

RequestQuotaDispatcher should handle unexpected death of QuotaDispatcherHost gracefully

BUG=285380

Review URL: https://chromiumcodereview.appspot.com/23783005

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@222026 0039d316-1c4b-4281-b951-d872f2087c98
parent af349561
...@@ -24,9 +24,10 @@ namespace content { ...@@ -24,9 +24,10 @@ namespace content {
// sends back the response to the renderer/worker. // sends back the response to the renderer/worker.
class QuotaDispatcherHost::RequestDispatcher { class QuotaDispatcherHost::RequestDispatcher {
public: public:
RequestDispatcher(QuotaDispatcherHost* dispatcher_host, RequestDispatcher(base::WeakPtr<QuotaDispatcherHost> dispatcher_host,
int request_id) int request_id)
: dispatcher_host_(dispatcher_host), : dispatcher_host_(dispatcher_host),
render_process_id_(dispatcher_host->process_id_),
request_id_(request_id) { request_id_(request_id) {
dispatcher_host_->outstanding_requests_.AddWithID(this, request_id_); dispatcher_host_->outstanding_requests_.AddWithID(this, request_id_);
} }
...@@ -35,21 +36,26 @@ class QuotaDispatcherHost::RequestDispatcher { ...@@ -35,21 +36,26 @@ class QuotaDispatcherHost::RequestDispatcher {
protected: protected:
// Subclass must call this when it's done with the request. // Subclass must call this when it's done with the request.
void Completed() { void Completed() {
dispatcher_host_->outstanding_requests_.Remove(request_id_); if (dispatcher_host_)
dispatcher_host_->outstanding_requests_.Remove(request_id_);
} }
QuotaDispatcherHost* dispatcher_host() const { return dispatcher_host_; } QuotaDispatcherHost* dispatcher_host() const {
return dispatcher_host_.get();
}
quota::QuotaManager* quota_manager() const { quota::QuotaManager* quota_manager() const {
return dispatcher_host_->quota_manager_; return dispatcher_host_ ? dispatcher_host_->quota_manager_ : NULL;
} }
QuotaPermissionContext* permission_context() const { QuotaPermissionContext* permission_context() const {
return dispatcher_host_->permission_context_.get(); return dispatcher_host_ ?
dispatcher_host_->permission_context_.get() : NULL;
} }
int render_process_id() const { return dispatcher_host_->process_id_; } int render_process_id() const { return render_process_id_; }
int request_id() const { return request_id_; } int request_id() const { return request_id_; }
private: private:
QuotaDispatcherHost* dispatcher_host_; base::WeakPtr<QuotaDispatcherHost> dispatcher_host_;
int render_process_id_;
int request_id_; int request_id_;
}; };
...@@ -57,7 +63,7 @@ class QuotaDispatcherHost::QueryUsageAndQuotaDispatcher ...@@ -57,7 +63,7 @@ class QuotaDispatcherHost::QueryUsageAndQuotaDispatcher
: public RequestDispatcher { : public RequestDispatcher {
public: public:
QueryUsageAndQuotaDispatcher( QueryUsageAndQuotaDispatcher(
QuotaDispatcherHost* dispatcher_host, base::WeakPtr<QuotaDispatcherHost> dispatcher_host,
int request_id) int request_id)
: RequestDispatcher(dispatcher_host, request_id), : RequestDispatcher(dispatcher_host, request_id),
weak_factory_(this) {} weak_factory_(this) {}
...@@ -73,7 +79,8 @@ class QuotaDispatcherHost::QueryUsageAndQuotaDispatcher ...@@ -73,7 +79,8 @@ class QuotaDispatcherHost::QueryUsageAndQuotaDispatcher
private: private:
void DidQueryStorageUsageAndQuota( void DidQueryStorageUsageAndQuota(
QuotaStatusCode status, int64 usage, int64 quota) { QuotaStatusCode status, int64 usage, int64 quota) {
DCHECK(dispatcher_host()); if (!dispatcher_host())
return;
if (status != quota::kQuotaStatusOk) { if (status != quota::kQuotaStatusOk) {
dispatcher_host()->Send(new QuotaMsg_DidFail(request_id(), status)); dispatcher_host()->Send(new QuotaMsg_DidFail(request_id(), status));
} else { } else {
...@@ -91,7 +98,7 @@ class QuotaDispatcherHost::RequestQuotaDispatcher ...@@ -91,7 +98,7 @@ class QuotaDispatcherHost::RequestQuotaDispatcher
public: public:
typedef RequestQuotaDispatcher self_type; typedef RequestQuotaDispatcher self_type;
RequestQuotaDispatcher(QuotaDispatcherHost* dispatcher_host, RequestQuotaDispatcher(base::WeakPtr<QuotaDispatcherHost> dispatcher_host,
int request_id, int request_id,
const GURL& origin, const GURL& origin,
StorageType type, StorageType type,
...@@ -108,6 +115,7 @@ class QuotaDispatcherHost::RequestQuotaDispatcher ...@@ -108,6 +115,7 @@ class QuotaDispatcherHost::RequestQuotaDispatcher
virtual ~RequestQuotaDispatcher() {} virtual ~RequestQuotaDispatcher() {}
void Start() { void Start() {
DCHECK(dispatcher_host());
DCHECK(type_ == quota::kStorageTypeTemporary || DCHECK(type_ == quota::kStorageTypeTemporary ||
type_ == quota::kStorageTypePersistent || type_ == quota::kStorageTypePersistent ||
type_ == quota::kStorageTypeSyncable); type_ == quota::kStorageTypeSyncable);
...@@ -129,6 +137,8 @@ class QuotaDispatcherHost::RequestQuotaDispatcher ...@@ -129,6 +137,8 @@ class QuotaDispatcherHost::RequestQuotaDispatcher
StorageType type, StorageType type,
QuotaStatusCode status, QuotaStatusCode status,
int64 quota) { int64 quota) {
if (!dispatcher_host())
return;
DCHECK_EQ(type_, type); DCHECK_EQ(type_, type);
DCHECK_EQ(host_, host); DCHECK_EQ(host_, host);
if (status != quota::kQuotaStatusOk) { if (status != quota::kQuotaStatusOk) {
...@@ -162,6 +172,8 @@ class QuotaDispatcherHost::RequestQuotaDispatcher ...@@ -162,6 +172,8 @@ class QuotaDispatcherHost::RequestQuotaDispatcher
void DidGetPermissionResponse( void DidGetPermissionResponse(
QuotaPermissionContext::QuotaPermissionResponse response) { QuotaPermissionContext::QuotaPermissionResponse response) {
if (!dispatcher_host())
return;
if (response != QuotaPermissionContext::QUOTA_PERMISSION_RESPONSE_ALLOW) { if (response != QuotaPermissionContext::QUOTA_PERMISSION_RESPONSE_ALLOW) {
// User didn't allow the new quota. Just returning the current quota. // User didn't allow the new quota. Just returning the current quota.
DidFinish(quota::kQuotaStatusOk, current_quota_); DidFinish(quota::kQuotaStatusOk, current_quota_);
...@@ -178,6 +190,8 @@ class QuotaDispatcherHost::RequestQuotaDispatcher ...@@ -178,6 +190,8 @@ class QuotaDispatcherHost::RequestQuotaDispatcher
} }
void DidFinish(QuotaStatusCode status, int64 granted_quota) { void DidFinish(QuotaStatusCode status, int64 granted_quota) {
if (!dispatcher_host())
return;
DCHECK(dispatcher_host()); DCHECK(dispatcher_host());
if (status != quota::kQuotaStatusOk) { if (status != quota::kQuotaStatusOk) {
dispatcher_host()->Send(new QuotaMsg_DidFail(request_id(), status)); dispatcher_host()->Send(new QuotaMsg_DidFail(request_id(), status));
...@@ -203,7 +217,8 @@ QuotaDispatcherHost::QuotaDispatcherHost( ...@@ -203,7 +217,8 @@ QuotaDispatcherHost::QuotaDispatcherHost(
QuotaPermissionContext* permission_context) QuotaPermissionContext* permission_context)
: process_id_(process_id), : process_id_(process_id),
quota_manager_(quota_manager), quota_manager_(quota_manager),
permission_context_(permission_context) { permission_context_(permission_context),
weak_factory_(this) {
} }
bool QuotaDispatcherHost::OnMessageReceived( bool QuotaDispatcherHost::OnMessageReceived(
...@@ -227,7 +242,7 @@ void QuotaDispatcherHost::OnQueryStorageUsageAndQuota( ...@@ -227,7 +242,7 @@ void QuotaDispatcherHost::OnQueryStorageUsageAndQuota(
const GURL& origin, const GURL& origin,
StorageType type) { StorageType type) {
QueryUsageAndQuotaDispatcher* dispatcher = new QueryUsageAndQuotaDispatcher( QueryUsageAndQuotaDispatcher* dispatcher = new QueryUsageAndQuotaDispatcher(
this, request_id); weak_factory_.GetWeakPtr(), request_id);
dispatcher->QueryStorageUsageAndQuota(origin, type); dispatcher->QueryStorageUsageAndQuota(origin, type);
} }
...@@ -251,7 +266,8 @@ void QuotaDispatcherHost::OnRequestStorageQuota( ...@@ -251,7 +266,8 @@ void QuotaDispatcherHost::OnRequestStorageQuota(
} }
RequestQuotaDispatcher* dispatcher = new RequestQuotaDispatcher( RequestQuotaDispatcher* dispatcher = new RequestQuotaDispatcher(
this, request_id, origin, type, requested_size, render_view_id); weak_factory_.GetWeakPtr(), request_id, origin, type,
requested_size, render_view_id);
dispatcher->Start(); dispatcher->Start();
} }
......
...@@ -60,6 +60,8 @@ class QuotaDispatcherHost : public BrowserMessageFilter { ...@@ -60,6 +60,8 @@ class QuotaDispatcherHost : public BrowserMessageFilter {
IDMap<RequestDispatcher, IDMapOwnPointer> outstanding_requests_; IDMap<RequestDispatcher, IDMapOwnPointer> outstanding_requests_;
base::WeakPtrFactory<QuotaDispatcherHost> weak_factory_;
DISALLOW_IMPLICIT_CONSTRUCTORS(QuotaDispatcherHost); DISALLOW_IMPLICIT_CONSTRUCTORS(QuotaDispatcherHost);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment