| OLD | NEW |
| (Empty) |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "content/renderer/media/media_permission_dispatcher.h" | |
| 6 | |
| 7 #include "base/bind.h" | |
| 8 #include "base/logging.h" | |
| 9 #include "base/single_thread_task_runner.h" | |
| 10 #include "base/thread_task_runner_handle.h" | |
| 11 #include "media/base/bind_to_current_loop.h" | |
| 12 #include "url/gurl.h" | |
| 13 | |
| 14 namespace { | |
| 15 | |
| 16 using Type = media::MediaPermission::Type; | |
| 17 | |
| 18 content::mojom::PermissionName MediaPermissionTypeToPermissionName(Type type) { | |
| 19 switch (type) { | |
| 20 case Type::PROTECTED_MEDIA_IDENTIFIER: | |
| 21 return content::mojom::PermissionName::PROTECTED_MEDIA_IDENTIFIER; | |
| 22 case Type::AUDIO_CAPTURE: | |
| 23 return content::mojom::PermissionName::AUDIO_CAPTURE; | |
| 24 case Type::VIDEO_CAPTURE: | |
| 25 return content::mojom::PermissionName::VIDEO_CAPTURE; | |
| 26 } | |
| 27 NOTREACHED(); | |
| 28 return content::mojom::PermissionName::PROTECTED_MEDIA_IDENTIFIER; | |
| 29 } | |
| 30 | |
| 31 } // namespace | |
| 32 | |
| 33 namespace content { | |
| 34 | |
| 35 MediaPermissionDispatcher::MediaPermissionDispatcher( | |
| 36 const ConnectToServiceCB& connect_to_service_cb) | |
| 37 : connect_to_service_cb_(connect_to_service_cb), | |
| 38 task_runner_(base::ThreadTaskRunnerHandle::Get()), | |
| 39 next_request_id_(0), | |
| 40 weak_factory_(this) { | |
| 41 DCHECK(!connect_to_service_cb_.is_null()); | |
| 42 weak_ptr_ = weak_factory_.GetWeakPtr(); | |
| 43 } | |
| 44 | |
| 45 MediaPermissionDispatcher::~MediaPermissionDispatcher() { | |
| 46 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | |
| 47 | |
| 48 // Fire all pending callbacks with |false|. | |
| 49 for (auto& request : requests_) | |
| 50 request.second.Run(false); | |
| 51 } | |
| 52 | |
| 53 void MediaPermissionDispatcher::HasPermission( | |
| 54 Type type, | |
| 55 const GURL& security_origin, | |
| 56 const PermissionStatusCB& permission_status_cb) { | |
| 57 if (!task_runner_->RunsTasksOnCurrentThread()) { | |
| 58 task_runner_->PostTask( | |
| 59 FROM_HERE, base::Bind(&MediaPermissionDispatcher::HasPermission, | |
| 60 weak_ptr_, type, security_origin, | |
| 61 media::BindToCurrentLoop(permission_status_cb))); | |
| 62 return; | |
| 63 } | |
| 64 | |
| 65 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | |
| 66 | |
| 67 if (!permission_service_) | |
| 68 connect_to_service_cb_.Run(mojo::GetProxy(&permission_service_)); | |
| 69 | |
| 70 int request_id = RegisterCallback(permission_status_cb); | |
| 71 DVLOG(2) << __FUNCTION__ << ": request ID " << request_id; | |
| 72 | |
| 73 permission_service_->HasPermission( | |
| 74 MediaPermissionTypeToPermissionName(type), security_origin.spec(), | |
| 75 base::Bind(&MediaPermissionDispatcher::OnPermissionStatus, weak_ptr_, | |
| 76 request_id)); | |
| 77 } | |
| 78 | |
| 79 void MediaPermissionDispatcher::RequestPermission( | |
| 80 Type type, | |
| 81 const GURL& security_origin, | |
| 82 const PermissionStatusCB& permission_status_cb) { | |
| 83 if (!task_runner_->RunsTasksOnCurrentThread()) { | |
| 84 task_runner_->PostTask( | |
| 85 FROM_HERE, base::Bind(&MediaPermissionDispatcher::RequestPermission, | |
| 86 weak_ptr_, type, security_origin, | |
| 87 media::BindToCurrentLoop(permission_status_cb))); | |
| 88 return; | |
| 89 } | |
| 90 | |
| 91 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | |
| 92 | |
| 93 if (!permission_service_) | |
| 94 connect_to_service_cb_.Run(mojo::GetProxy(&permission_service_)); | |
| 95 | |
| 96 int request_id = RegisterCallback(permission_status_cb); | |
| 97 DVLOG(2) << __FUNCTION__ << ": request ID " << request_id; | |
| 98 | |
| 99 permission_service_->RequestPermission( | |
| 100 MediaPermissionTypeToPermissionName(type), security_origin.spec(), | |
| 101 base::Bind(&MediaPermissionDispatcher::OnPermissionStatus, weak_ptr_, | |
| 102 request_id)); | |
| 103 } | |
| 104 | |
| 105 uint32_t MediaPermissionDispatcher::RegisterCallback( | |
| 106 const PermissionStatusCB& permission_status_cb) { | |
| 107 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | |
| 108 | |
| 109 uint32_t request_id = next_request_id_++; | |
| 110 DCHECK(!requests_.count(request_id)); | |
| 111 requests_[request_id] = permission_status_cb; | |
| 112 | |
| 113 return request_id; | |
| 114 } | |
| 115 | |
| 116 void MediaPermissionDispatcher::OnPermissionStatus( | |
| 117 uint32_t request_id, | |
| 118 mojom::PermissionStatus status) { | |
| 119 DVLOG(2) << __FUNCTION__ << ": (" << request_id << ", " << status << ")"; | |
| 120 DCHECK(task_runner_->RunsTasksOnCurrentThread()); | |
| 121 | |
| 122 RequestMap::iterator iter = requests_.find(request_id); | |
| 123 DCHECK(iter != requests_.end()) << "Request not found."; | |
| 124 | |
| 125 PermissionStatusCB permission_status_cb = iter->second; | |
| 126 requests_.erase(iter); | |
| 127 | |
| 128 permission_status_cb.Run(status == mojom::PermissionStatus::GRANTED); | |
| 129 } | |
| 130 | |
| 131 } // namespace content | |
| OLD | NEW |