Index: content/renderer/media/media_permission_dispatcher_proxy.cc |
diff --git a/content/renderer/media/media_permission_dispatcher_proxy.cc b/content/renderer/media/media_permission_dispatcher_proxy.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..693e5f0bdf8f52ae35beb5d92ccc0ca918c1ca22 |
--- /dev/null |
+++ b/content/renderer/media/media_permission_dispatcher_proxy.cc |
@@ -0,0 +1,158 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "content/renderer/media/media_permission_dispatcher_proxy.h" |
+ |
+#include "base/bind.h" |
+#include "base/callback_helpers.h" |
+#include "base/location.h" |
+#include "base/thread_task_runner_handle.h" |
+#include "url/gurl.h" |
+ |
+namespace content { |
+ |
+class MediaPermissionDispatcherProxy::Core { |
+ public: |
+ Core(scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, |
+ scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, |
+ base::WeakPtr<MediaPermissionDispatcher> parent, |
+ base::WeakPtr<MediaPermissionDispatcher> media_permission_dispatcher); |
+ ~Core(); |
+ |
+ void HasPermission(Type type, |
+ const GURL& security_origin, |
+ uint32_t request_id); |
+ |
+ void RequestPermission(Type type, |
+ const GURL& security_origin, |
+ uint32_t request_id); |
+ |
+ scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner() { |
+ return ui_task_runner_; |
+ } |
+ |
+ scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner() { |
+ return caller_task_runner_; |
+ } |
+ |
+ base::WeakPtr<MediaPermissionDispatcherProxy::Core> GetWeakPtr() { |
+ return weak_ptr_factory_.GetWeakPtr(); |
+ } |
+ |
+ private: |
+ // Reports the result on the caller's thread. |
+ void ReportResult(uint32_t request_id, bool granted); |
+ |
+ scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; |
+ scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_; |
+ |
+ // |parent_| is the proxy which holds this Core. |
+ base::WeakPtr<MediaPermissionDispatcher> parent_; |
+ |
+ // |media_permission_| is the real implementation which calls |
+ // PermissionServices on the UI thread. |
+ base::WeakPtr<MediaPermissionDispatcher> media_permission_; |
+ |
+ base::WeakPtrFactory<MediaPermissionDispatcherProxy::Core> weak_ptr_factory_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(Core); |
+}; |
+ |
+MediaPermissionDispatcherProxy::Core::Core( |
+ scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, |
+ scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, |
+ base::WeakPtr<MediaPermissionDispatcher> parent, |
+ base::WeakPtr<MediaPermissionDispatcher> media_permission) |
+ : ui_task_runner_(ui_task_runner), |
+ caller_task_runner_(caller_task_runner), |
+ parent_(parent), |
+ media_permission_(media_permission), |
+ weak_ptr_factory_(this) {} |
+ |
+MediaPermissionDispatcherProxy::Core::~Core() { |
+ DCHECK(ui_task_runner_->BelongsToCurrentThread()); |
+} |
+ |
+void MediaPermissionDispatcherProxy::Core::HasPermission( |
+ Type type, |
+ const GURL& security_origin, |
+ uint32_t request_id) { |
+ DCHECK(ui_task_runner_->BelongsToCurrentThread()); |
+ |
+ if (media_permission_.get()) { |
+ media_permission_->HasPermission( |
+ type, security_origin, |
+ base::Bind(&MediaPermissionDispatcherProxy::Core::ReportResult, |
+ GetWeakPtr(), request_id)); |
+ } else { |
+ ReportResult(request_id, false); |
+ } |
+} |
+ |
+void MediaPermissionDispatcherProxy::Core::RequestPermission( |
+ Type type, |
+ const GURL& security_origin, |
+ uint32_t request_id) { |
+ DCHECK(ui_task_runner_->BelongsToCurrentThread()); |
+ |
+ if (media_permission_.get()) { |
+ media_permission_->RequestPermission( |
+ type, security_origin, |
+ base::Bind(&MediaPermissionDispatcherProxy::Core::ReportResult, |
+ GetWeakPtr(), request_id)); |
+ } else { |
+ ReportResult(request_id, false); |
+ } |
+} |
+ |
+void MediaPermissionDispatcherProxy::Core::ReportResult(uint32_t request_id, |
+ bool result) { |
+ DCHECK(ui_task_runner_->BelongsToCurrentThread()); |
+ caller_task_runner_->PostTask( |
+ FROM_HERE, base::Bind(&MediaPermissionDispatcherProxy::DeliverResult, |
+ parent_, request_id, result)); |
+} |
+ |
+MediaPermissionDispatcherProxy::MediaPermissionDispatcherProxy( |
+ scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, |
+ scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, |
+ base::WeakPtr<MediaPermissionDispatcher> media_permission) |
+ : weak_ptr_factory_(this) { |
+ thread_checker().DetachFromThread(); |
+ core_.reset(new Core(ui_task_runner, caller_task_runner, |
+ weak_ptr_factory_.GetWeakPtr(), media_permission)); |
+} |
+ |
+MediaPermissionDispatcherProxy::~MediaPermissionDispatcherProxy() { |
+ DCHECK(core_->caller_task_runner()->BelongsToCurrentThread()); |
+ |
+ auto ui_task_runner = core_->ui_task_runner(); |
+ ui_task_runner->DeleteSoon(FROM_HERE, core_.release()); |
+} |
+ |
+void MediaPermissionDispatcherProxy::HasPermission( |
+ Type type, |
+ const GURL& security_origin, |
+ const PermissionStatusCB& permission_status_cb) { |
+ DCHECK(core_->caller_task_runner()->BelongsToCurrentThread()); |
+ |
+ core_->ui_task_runner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&Core::HasPermission, core_->GetWeakPtr(), type, |
+ security_origin, RegisterCallback(permission_status_cb))); |
+} |
+ |
+void MediaPermissionDispatcherProxy::RequestPermission( |
+ Type type, |
+ const GURL& security_origin, |
+ const PermissionStatusCB& permission_status_cb) { |
+ DCHECK(core_->caller_task_runner()->BelongsToCurrentThread()); |
+ |
+ core_->ui_task_runner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&Core::RequestPermission, core_->GetWeakPtr(), type, |
+ security_origin, RegisterCallback(permission_status_cb))); |
+} |
+ |
+} // namespace content |