Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(111)

Side by Side Diff: content/renderer/media/media_permission_dispatcher.cc

Issue 1838903007: media: Add mojo MediaPermission service Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698