Index: content/child/permissions/permission_dispatcher.cc |
diff --git a/content/child/permissions/permission_dispatcher.cc b/content/child/permissions/permission_dispatcher.cc |
index eb5ac4538f0f9caf86adea7769ed9ab016e18e7b..4a0957ecb7b8646e95b0a977e96abe921e0c83cd 100644 |
--- a/content/child/permissions/permission_dispatcher.cc |
+++ b/content/child/permissions/permission_dispatcher.cc |
@@ -75,13 +75,13 @@ bool PermissionDispatcher::IsObservable(blink::WebPermissionType type) { |
} |
PermissionDispatcher::CallbackInformation::CallbackInformation( |
- blink::WebPermissionQueryCallback* callback, |
+ blink::WebPermissionCallback* callback, |
int worker_thread_id) |
: callback_(callback), |
worker_thread_id_(worker_thread_id) { |
} |
-blink::WebPermissionQueryCallback* |
+blink::WebPermissionCallback* |
PermissionDispatcher::CallbackInformation::callback() const { |
return callback_.get(); |
} |
@@ -90,7 +90,7 @@ int PermissionDispatcher::CallbackInformation::worker_thread_id() const { |
return worker_thread_id_; |
} |
-blink::WebPermissionQueryCallback* |
+blink::WebPermissionCallback* |
PermissionDispatcher::CallbackInformation::ReleaseCallback() { |
return callback_.release(); |
} |
@@ -108,11 +108,19 @@ PermissionDispatcher::~PermissionDispatcher() { |
void PermissionDispatcher::queryPermission( |
blink::WebPermissionType type, |
const blink::WebURL& origin, |
- blink::WebPermissionQueryCallback* callback) { |
+ blink::WebPermissionCallback* callback) { |
QueryPermissionInternal( |
type, origin.string().utf8(), callback, kNoWorkerThread); |
} |
+void PermissionDispatcher::revokePermission( |
+ blink::WebPermissionType type, |
+ const blink::WebURL& origin, |
+ blink::WebPermissionCallback* callback) { |
+ RevokePermissionInternal( |
+ type, origin.string().utf8(), callback, kNoWorkerThread); |
+} |
+ |
void PermissionDispatcher::startListening( |
blink::WebPermissionType type, |
const blink::WebURL& origin, |
@@ -141,11 +149,19 @@ void PermissionDispatcher::stopListening(WebPermissionObserver* observer) { |
void PermissionDispatcher::QueryPermissionForWorker( |
blink::WebPermissionType type, |
const std::string& origin, |
- blink::WebPermissionQueryCallback* callback, |
+ blink::WebPermissionCallback* callback, |
int worker_thread_id) { |
QueryPermissionInternal(type, origin, callback, worker_thread_id); |
} |
+void PermissionDispatcher::RevokePermissionForWorker( |
+ blink::WebPermissionType type, |
+ const std::string& origin, |
+ blink::WebPermissionCallback* callback, |
+ int worker_thread_id) { |
+ RevokePermissionInternal(type, origin, callback, worker_thread_id); |
+} |
+ |
void PermissionDispatcher::StartListeningForWorker( |
blink::WebPermissionType type, |
const std::string& origin, |
@@ -183,7 +199,7 @@ void PermissionDispatcher::GetNextPermissionChangeForWorker( |
// static |
void PermissionDispatcher::RunCallbackOnWorkerThread( |
- blink::WebPermissionQueryCallback* callback, |
+ blink::WebPermissionCallback* callback, |
scoped_ptr<blink::WebPermissionStatus> status) { |
callback->onSuccess(status.release()); |
delete callback; |
@@ -200,7 +216,7 @@ PermissionServicePtr& PermissionDispatcher::GetPermissionServicePtr() { |
void PermissionDispatcher::QueryPermissionInternal( |
blink::WebPermissionType type, |
const std::string& origin, |
- blink::WebPermissionQueryCallback* callback, |
+ blink::WebPermissionCallback* callback, |
int worker_thread_id) { |
// We need to save the |callback| in an IDMap so if |this| gets deleted, the |
// callback will not leak. In the case of |this| gets deleted, the |
@@ -211,13 +227,32 @@ void PermissionDispatcher::QueryPermissionInternal( |
GetPermissionServicePtr()->HasPermission( |
GetPermissionName(type), |
origin, |
- base::Bind(&PermissionDispatcher::OnQueryPermission, |
+ base::Bind(&PermissionDispatcher::OnPermissionResponse, |
+ base::Unretained(this), |
+ request_id)); |
+} |
+ |
+void PermissionDispatcher::RevokePermissionInternal( |
+ blink::WebPermissionType type, |
+ const std::string& origin, |
+ blink::WebPermissionCallback* callback, |
+ int worker_thread_id) { |
+ // We need to save the |callback| in an IDMap so if |this| gets deleted, the |
+ // callback will not leak. In the case of |this| gets deleted, the |
+ // |permission_service_| pipe will be destroyed too so OnQueryPermission will |
+ // not be called. |
+ int request_id = pending_callbacks_.Add( |
+ new CallbackInformation(callback, worker_thread_id)); |
+ GetPermissionServicePtr()->RevokePermission( |
+ GetPermissionName(type), |
+ origin, |
+ base::Bind(&PermissionDispatcher::OnPermissionResponse, |
base::Unretained(this), |
request_id)); |
} |
-void PermissionDispatcher::OnQueryPermission(int request_id, |
- PermissionStatus result) { |
+void PermissionDispatcher::OnPermissionResponse(int request_id, |
+ PermissionStatus result) { |
CallbackInformation* callback_information = |
pending_callbacks_.Lookup(request_id); |
DCHECK(callback_information && callback_information->callback()); |
@@ -225,7 +260,7 @@ void PermissionDispatcher::OnQueryPermission(int request_id, |
new blink::WebPermissionStatus(GetWebPermissionStatus(result))); |
if (callback_information->worker_thread_id() != kNoWorkerThread) { |
- blink::WebPermissionQueryCallback* callback = |
+ blink::WebPermissionCallback* callback = |
callback_information->ReleaseCallback(); |
int worker_thread_id = callback_information->worker_thread_id(); |
pending_callbacks_.Remove(request_id); |