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

Side by Side Diff: content/browser/permissions/permission_service_impl.cc

Issue 1771743002: Move geolocation and permission mojoms into WebKit/public/platform. (Closed) 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
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/permissions/permission_service_impl.h" 5 #include "content/browser/permissions/permission_service_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "content/public/browser/browser_context.h" 11 #include "content/public/browser/browser_context.h"
12 #include "content/public/browser/permission_manager.h" 12 #include "content/public/browser/permission_manager.h"
13 #include "content/public/browser/permission_type.h" 13 #include "content/public/browser/permission_type.h"
14 14
15 using blink::mojom::PermissionName;
16 using blink::mojom::PermissionStatus;
17
15 namespace content { 18 namespace content {
16 19
17 namespace { 20 namespace {
18 21
19 PermissionType PermissionNameToPermissionType(mojom::PermissionName name) { 22 PermissionType PermissionNameToPermissionType(PermissionName name) {
20 switch(name) { 23 switch(name) {
21 case mojom::PermissionName::GEOLOCATION: 24 case PermissionName::GEOLOCATION:
jam 2016/03/31 19:45:52 (not for this cl) this duplicate enum seems unnec
22 return PermissionType::GEOLOCATION; 25 return PermissionType::GEOLOCATION;
23 case mojom::PermissionName::NOTIFICATIONS: 26 case PermissionName::NOTIFICATIONS:
24 return PermissionType::NOTIFICATIONS; 27 return PermissionType::NOTIFICATIONS;
25 case mojom::PermissionName::PUSH_NOTIFICATIONS: 28 case PermissionName::PUSH_NOTIFICATIONS:
26 return PermissionType::PUSH_MESSAGING; 29 return PermissionType::PUSH_MESSAGING;
27 case mojom::PermissionName::MIDI: 30 case PermissionName::MIDI:
28 return PermissionType::MIDI; 31 return PermissionType::MIDI;
29 case mojom::PermissionName::MIDI_SYSEX: 32 case PermissionName::MIDI_SYSEX:
30 return PermissionType::MIDI_SYSEX; 33 return PermissionType::MIDI_SYSEX;
31 case mojom::PermissionName::PROTECTED_MEDIA_IDENTIFIER: 34 case PermissionName::PROTECTED_MEDIA_IDENTIFIER:
32 return PermissionType::PROTECTED_MEDIA_IDENTIFIER; 35 return PermissionType::PROTECTED_MEDIA_IDENTIFIER;
33 case mojom::PermissionName::DURABLE_STORAGE: 36 case PermissionName::DURABLE_STORAGE:
34 return PermissionType::DURABLE_STORAGE; 37 return PermissionType::DURABLE_STORAGE;
35 case mojom::PermissionName::AUDIO_CAPTURE: 38 case PermissionName::AUDIO_CAPTURE:
36 return PermissionType::AUDIO_CAPTURE; 39 return PermissionType::AUDIO_CAPTURE;
37 case mojom::PermissionName::VIDEO_CAPTURE: 40 case PermissionName::VIDEO_CAPTURE:
38 return PermissionType::VIDEO_CAPTURE; 41 return PermissionType::VIDEO_CAPTURE;
39 } 42 }
40 43
41 NOTREACHED(); 44 NOTREACHED();
42 return PermissionType::NUM; 45 return PermissionType::NUM;
43 } 46 }
44 47
45 // This function allows the usage of the the multiple request map 48 // This function allows the usage of the the multiple request map
46 // with single requests. 49 // with single requests.
47 void PermissionRequestResponseCallbackWrapper( 50 void PermissionRequestResponseCallbackWrapper(
48 const mojo::Callback<void(mojom::PermissionStatus)>& callback, 51 const mojo::Callback<void(PermissionStatus)>& callback,
49 const mojo::Array<mojom::PermissionStatus>& vector) { 52 const mojo::Array<PermissionStatus>& vector) {
50 DCHECK_EQ(vector.size(), 1ul); 53 DCHECK_EQ(vector.size(), 1ul);
51 callback.Run(vector[0]); 54 callback.Run(vector[0]);
52 } 55 }
53 56
54 } // anonymous namespace 57 } // anonymous namespace
55 58
56 PermissionServiceImpl::PendingRequest::PendingRequest( 59 PermissionServiceImpl::PendingRequest::PendingRequest(
57 const PermissionsStatusCallback& callback, 60 const PermissionsStatusCallback& callback,
58 int request_count) 61 int request_count)
59 : callback(callback), 62 : callback(callback),
60 request_count(request_count) { 63 request_count(request_count) {
61 } 64 }
62 65
63 PermissionServiceImpl::PendingRequest::~PendingRequest() { 66 PermissionServiceImpl::PendingRequest::~PendingRequest() {
64 if (callback.is_null()) 67 if (callback.is_null())
65 return; 68 return;
66 69
67 mojo::Array<mojom::PermissionStatus> result = 70 mojo::Array<PermissionStatus> result =
68 mojo::Array<mojom::PermissionStatus>::New(request_count); 71 mojo::Array<PermissionStatus>::New(request_count);
69 for (int i = 0; i < request_count; ++i) 72 for (int i = 0; i < request_count; ++i)
70 result[i] = mojom::PermissionStatus::DENIED; 73 result[i] = PermissionStatus::DENIED;
71 callback.Run(std::move(result)); 74 callback.Run(std::move(result));
72 } 75 }
73 76
74 PermissionServiceImpl::PendingSubscription::PendingSubscription( 77 PermissionServiceImpl::PendingSubscription::PendingSubscription(
75 PermissionType permission, 78 PermissionType permission,
76 const GURL& origin, 79 const GURL& origin,
77 const PermissionStatusCallback& callback) 80 const PermissionStatusCallback& callback)
78 : id(-1), 81 : id(-1),
79 permission(permission), 82 permission(permission),
80 origin(origin), 83 origin(origin),
81 callback(callback) { 84 callback(callback) {
82 } 85 }
83 86
84 PermissionServiceImpl::PendingSubscription::~PendingSubscription() { 87 PermissionServiceImpl::PendingSubscription::~PendingSubscription() {
85 if (!callback.is_null()) 88 if (!callback.is_null())
86 callback.Run(mojom::PermissionStatus::ASK); 89 callback.Run(PermissionStatus::ASK);
87 } 90 }
88 91
89 PermissionServiceImpl::PermissionServiceImpl( 92 PermissionServiceImpl::PermissionServiceImpl(
90 PermissionServiceContext* context, 93 PermissionServiceContext* context,
91 mojo::InterfaceRequest<mojom::PermissionService> request) 94 mojo::InterfaceRequest<blink::mojom::PermissionService> request)
92 : context_(context), 95 : context_(context),
93 binding_(this, std::move(request)), 96 binding_(this, std::move(request)),
94 weak_factory_(this) { 97 weak_factory_(this) {
95 binding_.set_connection_error_handler( 98 binding_.set_connection_error_handler(
96 base::Bind(&PermissionServiceImpl::OnConnectionError, 99 base::Bind(&PermissionServiceImpl::OnConnectionError,
97 base::Unretained(this))); 100 base::Unretained(this)));
98 } 101 }
99 102
100 PermissionServiceImpl::~PermissionServiceImpl() { 103 PermissionServiceImpl::~PermissionServiceImpl() {
101 DCHECK(pending_requests_.IsEmpty()); 104 DCHECK(pending_requests_.IsEmpty());
102 } 105 }
103 106
104 void PermissionServiceImpl::OnConnectionError() { 107 void PermissionServiceImpl::OnConnectionError() {
105 context_->ServiceHadConnectionError(this); 108 context_->ServiceHadConnectionError(this);
106 // After that call, |this| will be deleted. 109 // After that call, |this| will be deleted.
107 } 110 }
108 111
109 void PermissionServiceImpl::RequestPermission( 112 void PermissionServiceImpl::RequestPermission(
110 mojom::PermissionName permission, 113 PermissionName permission,
111 const mojo::String& origin, 114 const mojo::String& origin,
112 const PermissionStatusCallback& callback) { 115 const PermissionStatusCallback& callback) {
113 // This condition is valid if the call is coming from a ChildThread instead of 116 // This condition is valid if the call is coming from a ChildThread instead of
114 // a RenderFrame. Some consumers of the service run in Workers and some in 117 // a RenderFrame. Some consumers of the service run in Workers and some in
115 // Frames. In the context of a Worker, it is not possible to show a 118 // Frames. In the context of a Worker, it is not possible to show a
116 // permission prompt because there is no tab. In the context of a Frame, we 119 // permission prompt because there is no tab. In the context of a Frame, we
117 // can. Even if the call comes from a context where it is not possible to show 120 // can. Even if the call comes from a context where it is not possible to show
118 // any UI, we want to still return something relevant so the current 121 // any UI, we want to still return something relevant so the current
119 // permission status is returned. 122 // permission status is returned.
120 BrowserContext* browser_context = context_->GetBrowserContext(); 123 BrowserContext* browser_context = context_->GetBrowserContext();
(...skipping 18 matching lines...) Expand all
139 // callback if it was run synchronously. 142 // callback if it was run synchronously.
140 PendingRequest* pending_request = pending_requests_.Lookup( 143 PendingRequest* pending_request = pending_requests_.Lookup(
141 pending_request_id); 144 pending_request_id);
142 if (!pending_request) 145 if (!pending_request)
143 return; 146 return;
144 pending_request->id = id; 147 pending_request->id = id;
145 } 148 }
146 149
147 void PermissionServiceImpl::OnRequestPermissionResponse( 150 void PermissionServiceImpl::OnRequestPermissionResponse(
148 int pending_request_id, 151 int pending_request_id,
149 mojom::PermissionStatus status) { 152 PermissionStatus status) {
150 OnRequestPermissionsResponse(pending_request_id, 153 OnRequestPermissionsResponse(pending_request_id,
151 std::vector<mojom::PermissionStatus>(1, status)); 154 std::vector<PermissionStatus>(1, status));
152 } 155 }
153 156
154 void PermissionServiceImpl::RequestPermissions( 157 void PermissionServiceImpl::RequestPermissions(
155 mojo::Array<mojom::PermissionName> permissions, 158 mojo::Array<PermissionName> permissions,
156 const mojo::String& origin, 159 const mojo::String& origin,
157 const PermissionsStatusCallback& callback) { 160 const PermissionsStatusCallback& callback) {
158 if (permissions.is_null()) { 161 if (permissions.is_null()) {
159 callback.Run(mojo::Array<mojom::PermissionStatus>()); 162 callback.Run(mojo::Array<PermissionStatus>());
160 return; 163 return;
161 } 164 }
162 165
163 // This condition is valid if the call is coming from a ChildThread instead of 166 // This condition is valid if the call is coming from a ChildThread instead of
164 // a RenderFrame. Some consumers of the service run in Workers and some in 167 // a RenderFrame. Some consumers of the service run in Workers and some in
165 // Frames. In the context of a Worker, it is not possible to show a 168 // Frames. In the context of a Worker, it is not possible to show a
166 // permission prompt because there is no tab. In the context of a Frame, we 169 // permission prompt because there is no tab. In the context of a Frame, we
167 // can. Even if the call comes from a context where it is not possible to show 170 // can. Even if the call comes from a context where it is not possible to show
168 // any UI, we want to still return something relevant so the current 171 // any UI, we want to still return something relevant so the current
169 // permission status is returned for each permission. 172 // permission status is returned for each permission.
170 BrowserContext* browser_context = context_->GetBrowserContext(); 173 BrowserContext* browser_context = context_->GetBrowserContext();
171 DCHECK(browser_context); 174 DCHECK(browser_context);
172 if (!context_->render_frame_host() || 175 if (!context_->render_frame_host() ||
173 !browser_context->GetPermissionManager()) { 176 !browser_context->GetPermissionManager()) {
174 mojo::Array<mojom::PermissionStatus> result(permissions.size()); 177 mojo::Array<PermissionStatus> result(permissions.size());
175 for (size_t i = 0; i < permissions.size(); ++i) { 178 for (size_t i = 0; i < permissions.size(); ++i) {
176 result[i] = 179 result[i] =
177 GetPermissionStatusFromName(permissions[i], GURL(origin.get())); 180 GetPermissionStatusFromName(permissions[i], GURL(origin.get()));
178 } 181 }
179 callback.Run(std::move(result)); 182 callback.Run(std::move(result));
180 return; 183 return;
181 } 184 }
182 185
183 std::vector<PermissionType> types(permissions.size()); 186 std::vector<PermissionType> types(permissions.size());
184 for (size_t i = 0; i < types.size(); ++i) 187 for (size_t i = 0; i < types.size(); ++i)
(...skipping 13 matching lines...) Expand all
198 // the response callback. 201 // the response callback.
199 PendingRequest* pending_request = pending_requests_.Lookup( 202 PendingRequest* pending_request = pending_requests_.Lookup(
200 pending_request_id); 203 pending_request_id);
201 if (!pending_request) 204 if (!pending_request)
202 return; 205 return;
203 pending_request->id = id; 206 pending_request->id = id;
204 } 207 }
205 208
206 void PermissionServiceImpl::OnRequestPermissionsResponse( 209 void PermissionServiceImpl::OnRequestPermissionsResponse(
207 int pending_request_id, 210 int pending_request_id,
208 const std::vector<mojom::PermissionStatus>& result) { 211 const std::vector<PermissionStatus>& result) {
209 PendingRequest* request = pending_requests_.Lookup(pending_request_id); 212 PendingRequest* request = pending_requests_.Lookup(pending_request_id);
210 PermissionsStatusCallback callback(request->callback); 213 PermissionsStatusCallback callback(request->callback);
211 request->callback.reset(); 214 request->callback.reset();
212 pending_requests_.Remove(pending_request_id); 215 pending_requests_.Remove(pending_request_id);
213 callback.Run(mojo::Array<mojom::PermissionStatus>::From(result)); 216 callback.Run(mojo::Array<PermissionStatus>::From(result));
214 } 217 }
215 218
216 void PermissionServiceImpl::CancelPendingOperations() { 219 void PermissionServiceImpl::CancelPendingOperations() {
217 DCHECK(context_->GetBrowserContext()); 220 DCHECK(context_->GetBrowserContext());
218 221
219 PermissionManager* permission_manager = 222 PermissionManager* permission_manager =
220 context_->GetBrowserContext()->GetPermissionManager(); 223 context_->GetBrowserContext()->GetPermissionManager();
221 if (!permission_manager) 224 if (!permission_manager)
222 return; 225 return;
223 226
(...skipping 11 matching lines...) Expand all
235 it.GetCurrentValue()->callback.Run(GetPermissionStatusFromType( 238 it.GetCurrentValue()->callback.Run(GetPermissionStatusFromType(
236 it.GetCurrentValue()->permission, it.GetCurrentValue()->origin)); 239 it.GetCurrentValue()->permission, it.GetCurrentValue()->origin));
237 it.GetCurrentValue()->callback.reset(); 240 it.GetCurrentValue()->callback.reset();
238 permission_manager->UnsubscribePermissionStatusChange( 241 permission_manager->UnsubscribePermissionStatusChange(
239 it.GetCurrentValue()->id); 242 it.GetCurrentValue()->id);
240 } 243 }
241 pending_subscriptions_.Clear(); 244 pending_subscriptions_.Clear();
242 } 245 }
243 246
244 void PermissionServiceImpl::HasPermission( 247 void PermissionServiceImpl::HasPermission(
245 mojom::PermissionName permission, 248 PermissionName permission,
246 const mojo::String& origin, 249 const mojo::String& origin,
247 const PermissionStatusCallback& callback) { 250 const PermissionStatusCallback& callback) {
248 callback.Run(GetPermissionStatusFromName(permission, GURL(origin.get()))); 251 callback.Run(GetPermissionStatusFromName(permission, GURL(origin.get())));
249 } 252 }
250 253
251 void PermissionServiceImpl::RevokePermission( 254 void PermissionServiceImpl::RevokePermission(
252 mojom::PermissionName permission, 255 PermissionName permission,
253 const mojo::String& origin, 256 const mojo::String& origin,
254 const PermissionStatusCallback& callback) { 257 const PermissionStatusCallback& callback) {
255 GURL origin_url(origin.get()); 258 GURL origin_url(origin.get());
256 PermissionType permission_type = PermissionNameToPermissionType(permission); 259 PermissionType permission_type = PermissionNameToPermissionType(permission);
257 mojom::PermissionStatus status = 260 PermissionStatus status =
258 GetPermissionStatusFromType(permission_type, origin_url); 261 GetPermissionStatusFromType(permission_type, origin_url);
259 262
260 // Resetting the permission should only be possible if the permission is 263 // Resetting the permission should only be possible if the permission is
261 // already granted. 264 // already granted.
262 if (status != mojom::PermissionStatus::GRANTED) { 265 if (status != PermissionStatus::GRANTED) {
263 callback.Run(status); 266 callback.Run(status);
264 return; 267 return;
265 } 268 }
266 269
267 ResetPermissionStatus(permission_type, origin_url); 270 ResetPermissionStatus(permission_type, origin_url);
268 271
269 callback.Run(GetPermissionStatusFromType(permission_type, origin_url)); 272 callback.Run(GetPermissionStatusFromType(permission_type, origin_url));
270 } 273 }
271 274
272 void PermissionServiceImpl::GetNextPermissionChange( 275 void PermissionServiceImpl::GetNextPermissionChange(
273 mojom::PermissionName permission, 276 PermissionName permission,
274 const mojo::String& mojo_origin, 277 const mojo::String& mojo_origin,
275 mojom::PermissionStatus last_known_status, 278 PermissionStatus last_known_status,
276 const PermissionStatusCallback& callback) { 279 const PermissionStatusCallback& callback) {
277 GURL origin(mojo_origin.get()); 280 GURL origin(mojo_origin.get());
278 mojom::PermissionStatus current_status = 281 PermissionStatus current_status =
279 GetPermissionStatusFromName(permission, origin); 282 GetPermissionStatusFromName(permission, origin);
280 if (current_status != last_known_status) { 283 if (current_status != last_known_status) {
281 callback.Run(current_status); 284 callback.Run(current_status);
282 return; 285 return;
283 } 286 }
284 287
285 BrowserContext* browser_context = context_->GetBrowserContext(); 288 BrowserContext* browser_context = context_->GetBrowserContext();
286 DCHECK(browser_context); 289 DCHECK(browser_context);
287 if (!browser_context->GetPermissionManager()) { 290 if (!browser_context->GetPermissionManager()) {
288 callback.Run(current_status); 291 callback.Run(current_status);
(...skipping 14 matching lines...) Expand all
303 browser_context->GetPermissionManager()->SubscribePermissionStatusChange( 306 browser_context->GetPermissionManager()->SubscribePermissionStatusChange(
304 permission_type, 307 permission_type,
305 origin, 308 origin,
306 // If the embedding_origin is empty, we,ll use the |origin| instead. 309 // If the embedding_origin is empty, we,ll use the |origin| instead.
307 embedding_origin.is_empty() ? origin : embedding_origin, 310 embedding_origin.is_empty() ? origin : embedding_origin,
308 base::Bind(&PermissionServiceImpl::OnPermissionStatusChanged, 311 base::Bind(&PermissionServiceImpl::OnPermissionStatusChanged,
309 weak_factory_.GetWeakPtr(), 312 weak_factory_.GetWeakPtr(),
310 pending_subscription_id)); 313 pending_subscription_id));
311 } 314 }
312 315
313 mojom::PermissionStatus PermissionServiceImpl::GetPermissionStatusFromName( 316 PermissionStatus PermissionServiceImpl::GetPermissionStatusFromName(
314 mojom::PermissionName permission, 317 PermissionName permission,
315 const GURL& origin) { 318 const GURL& origin) {
316 return GetPermissionStatusFromType(PermissionNameToPermissionType(permission), 319 return GetPermissionStatusFromType(PermissionNameToPermissionType(permission),
317 origin); 320 origin);
318 } 321 }
319 322
320 mojom::PermissionStatus PermissionServiceImpl::GetPermissionStatusFromType( 323 PermissionStatus PermissionServiceImpl::GetPermissionStatusFromType(
321 PermissionType type, 324 PermissionType type,
322 const GURL& origin) { 325 const GURL& origin) {
323 BrowserContext* browser_context = context_->GetBrowserContext(); 326 BrowserContext* browser_context = context_->GetBrowserContext();
324 DCHECK(browser_context); 327 DCHECK(browser_context);
325 if (!browser_context->GetPermissionManager()) 328 if (!browser_context->GetPermissionManager())
326 return mojom::PermissionStatus::DENIED; 329 return PermissionStatus::DENIED;
327 330
328 // If the embedding_origin is empty we'll use |origin| instead. 331 // If the embedding_origin is empty we'll use |origin| instead.
329 GURL embedding_origin = context_->GetEmbeddingOrigin(); 332 GURL embedding_origin = context_->GetEmbeddingOrigin();
330 return browser_context->GetPermissionManager()->GetPermissionStatus( 333 return browser_context->GetPermissionManager()->GetPermissionStatus(
331 type, origin, embedding_origin.is_empty() ? origin : embedding_origin); 334 type, origin, embedding_origin.is_empty() ? origin : embedding_origin);
332 } 335 }
333 336
334 void PermissionServiceImpl::ResetPermissionStatus(PermissionType type, 337 void PermissionServiceImpl::ResetPermissionStatus(PermissionType type,
335 const GURL& origin) { 338 const GURL& origin) {
336 BrowserContext* browser_context = context_->GetBrowserContext(); 339 BrowserContext* browser_context = context_->GetBrowserContext();
337 DCHECK(browser_context); 340 DCHECK(browser_context);
338 if (!browser_context->GetPermissionManager()) 341 if (!browser_context->GetPermissionManager())
339 return; 342 return;
340 343
341 // If the embedding_origin is empty we'll use |origin| instead. 344 // If the embedding_origin is empty we'll use |origin| instead.
342 GURL embedding_origin = context_->GetEmbeddingOrigin(); 345 GURL embedding_origin = context_->GetEmbeddingOrigin();
343 browser_context->GetPermissionManager()->ResetPermission( 346 browser_context->GetPermissionManager()->ResetPermission(
344 type, origin, embedding_origin.is_empty() ? origin : embedding_origin); 347 type, origin, embedding_origin.is_empty() ? origin : embedding_origin);
345 } 348 }
346 349
347 void PermissionServiceImpl::OnPermissionStatusChanged( 350 void PermissionServiceImpl::OnPermissionStatusChanged(
348 int pending_subscription_id, 351 int pending_subscription_id,
349 mojom::PermissionStatus status) { 352 PermissionStatus status) {
350 PendingSubscription* subscription = 353 PendingSubscription* subscription =
351 pending_subscriptions_.Lookup(pending_subscription_id); 354 pending_subscriptions_.Lookup(pending_subscription_id);
352 355
353 BrowserContext* browser_context = context_->GetBrowserContext(); 356 BrowserContext* browser_context = context_->GetBrowserContext();
354 DCHECK(browser_context); 357 DCHECK(browser_context);
355 if (browser_context->GetPermissionManager()) { 358 if (browser_context->GetPermissionManager()) {
356 browser_context->GetPermissionManager()->UnsubscribePermissionStatusChange( 359 browser_context->GetPermissionManager()->UnsubscribePermissionStatusChange(
357 subscription->id); 360 subscription->id);
358 } 361 }
359 362
360 PermissionStatusCallback callback = subscription->callback; 363 PermissionStatusCallback callback = subscription->callback;
361 364
362 subscription->callback.reset(); 365 subscription->callback.reset();
363 pending_subscriptions_.Remove(pending_subscription_id); 366 pending_subscriptions_.Remove(pending_subscription_id);
364 367
365 callback.Run(status); 368 callback.Run(status);
366 } 369 }
367 370
368 } // namespace content 371 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698