| 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..765e82c40e2ad86abfe306574221a8c9877eefaa 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::OnQueryOrRevokePermission,
|
| + 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::OnQueryOrRevokePermission,
|
| base::Unretained(this),
|
| request_id));
|
| }
|
|
|
| -void PermissionDispatcher::OnQueryPermission(int request_id,
|
| - PermissionStatus result) {
|
| +void PermissionDispatcher::OnQueryOrRevokePermission(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);
|
|
|