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 blink::mojom::PermissionName MediaPermissionTypeToPermissionName(Type type) { | |
19 switch (type) { | |
20 case Type::PROTECTED_MEDIA_IDENTIFIER: | |
21 return blink::mojom::PermissionName::PROTECTED_MEDIA_IDENTIFIER; | |
22 case Type::AUDIO_CAPTURE: | |
23 return blink::mojom::PermissionName::AUDIO_CAPTURE; | |
24 case Type::VIDEO_CAPTURE: | |
25 return blink::mojom::PermissionName::VIDEO_CAPTURE; | |
26 } | |
27 NOTREACHED(); | |
28 return blink::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 blink::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 == blink::mojom::PermissionStatus::GRANTED); | |
129 } | |
130 | |
131 } // namespace content | |
OLD | NEW |