Index: content/child/permissions/permission_dispatcher_thread_proxy.cc |
diff --git a/content/child/permissions/permission_dispatcher_thread_proxy.cc b/content/child/permissions/permission_dispatcher_thread_proxy.cc |
index 1d8d96b204408e69ebb42f658b85bb038e895918..0ecdfa48a8d67654ae985a75db97a1c79dfee993 100644 |
--- a/content/child/permissions/permission_dispatcher_thread_proxy.cc |
+++ b/content/child/permissions/permission_dispatcher_thread_proxy.cc |
@@ -13,6 +13,7 @@ |
#include "content/child/permissions/permission_dispatcher.h" |
#include "content/child/worker_task_runner.h" |
#include "third_party/WebKit/public/platform/WebURL.h" |
+#include "third_party/WebKit/public/platform/modules/permissions/WebPermissionObserver.h" |
using base::LazyInstance; |
using base::ThreadLocalPointer; |
@@ -67,6 +68,57 @@ void PermissionDispatcherThreadProxy::queryPermission( |
WorkerTaskRunner::Instance()->CurrentWorkerId())); |
} |
+void PermissionDispatcherThreadProxy::startListening( |
+ blink::WebPermissionType type, |
+ const blink::WebURL& origin, |
+ blink::WebPermissionObserver* observer) { |
+ if (!PermissionDispatcher::IsObservable(type)) |
+ return; |
+ |
+ RegisterObserver(observer); |
+ |
+ main_thread_task_runner_->PostTask(FROM_HERE, |
+ base::Bind(&PermissionDispatcher::StartListeningForWorker, |
+ base::Unretained(permission_dispatcher_), |
+ type, |
+ origin.string().utf8(), |
+ WorkerTaskRunner::Instance()->CurrentWorkerId(), |
+ base::Bind(&PermissionDispatcherThreadProxy::OnPermissionChanged, |
+ base::Unretained(this), |
+ type, |
+ origin.string().utf8(), |
+ base::Unretained(observer)))); |
+} |
+ |
+void PermissionDispatcherThreadProxy::stopListening( |
+ blink::WebPermissionObserver* observer) { |
+ UnregisterObserver(observer); |
+} |
+ |
+void PermissionDispatcherThreadProxy::OnPermissionChanged( |
+ blink::WebPermissionType type, |
+ const std::string& origin, |
+ blink::WebPermissionObserver* observer, |
+ blink::WebPermissionStatus status) { |
+ if (!IsObserverRegistered(observer)) |
+ return; |
+ |
+ observer->permissionChanged(type, status); |
+ |
+ main_thread_task_runner_->PostTask(FROM_HERE, |
+ base::Bind(&PermissionDispatcher::GetNextPermissionChangeForWorker, |
+ base::Unretained(permission_dispatcher_), |
+ type, |
+ origin, |
+ status, |
+ WorkerTaskRunner::Instance()->CurrentWorkerId(), |
+ base::Bind(&PermissionDispatcherThreadProxy::OnPermissionChanged, |
+ base::Unretained(this), |
+ type, |
+ origin, |
+ base::Unretained(observer)))); |
+} |
+ |
void PermissionDispatcherThreadProxy::OnWorkerRunLoopStopped() { |
delete this; |
} |