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

Side by Side Diff: content/child/permissions/permission_dispatcher.cc

Issue 1373883003: Move geolocation and permission mojoms into components. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 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
« no previous file with comments | « content/child/permissions/permission_dispatcher.h ('k') | content/common/BUILD.gn » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 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 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/child/permissions/permission_dispatcher.h" 5 #include "content/child/permissions/permission_dispatcher.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "content/child/worker_task_runner.h" 8 #include "content/child/worker_task_runner.h"
9 #include "content/public/common/service_registry.h" 9 #include "content/public/common/service_registry.h"
10 #include "third_party/WebKit/public/platform/WebURL.h" 10 #include "third_party/WebKit/public/platform/WebURL.h"
11 #include "third_party/WebKit/public/platform/modules/permissions/WebPermissionOb server.h" 11 #include "third_party/WebKit/public/platform/modules/permissions/WebPermissionOb server.h"
12 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h" 12 #include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
13 13
14 using blink::WebPermissionObserver; 14 using blink::WebPermissionObserver;
15 15
16 namespace content { 16 namespace content {
17 17
18 namespace { 18 namespace {
19 19
20 PermissionName GetPermissionName(blink::WebPermissionType type) { 20 permission::Name GetPermissionName(blink::WebPermissionType type) {
21 switch (type) { 21 switch (type) {
22 case blink::WebPermissionTypeGeolocation: 22 case blink::WebPermissionTypeGeolocation:
23 return PERMISSION_NAME_GEOLOCATION; 23 return permission::NAME_GEOLOCATION;
24 case blink::WebPermissionTypeNotifications: 24 case blink::WebPermissionTypeNotifications:
25 return PERMISSION_NAME_NOTIFICATIONS; 25 return permission::NAME_NOTIFICATIONS;
26 case blink::WebPermissionTypePushNotifications: 26 case blink::WebPermissionTypePushNotifications:
27 return PERMISSION_NAME_PUSH_NOTIFICATIONS; 27 return permission::NAME_PUSH_NOTIFICATIONS;
28 case blink::WebPermissionTypeMidiSysEx: 28 case blink::WebPermissionTypeMidiSysEx:
29 return PERMISSION_NAME_MIDI_SYSEX; 29 return permission::NAME_MIDI_SYSEX;
30 case blink::WebPermissionTypeDurableStorage: 30 case blink::WebPermissionTypeDurableStorage:
31 return PERMISSION_NAME_DURABLE_STORAGE; 31 return permission::NAME_DURABLE_STORAGE;
32 case blink::WebPermissionTypeMidi: 32 case blink::WebPermissionTypeMidi:
33 return PERMISSION_NAME_MIDI; 33 return permission::NAME_MIDI;
34 default: 34 default:
35 // The default statement is only there to prevent compilation failures if 35 // The default statement is only there to prevent compilation failures if
36 // WebPermissionType enum gets extended. 36 // WebPermissionType enum gets extended.
37 NOTREACHED(); 37 NOTREACHED();
38 return PERMISSION_NAME_GEOLOCATION; 38 return permission::NAME_GEOLOCATION;
39 } 39 }
40 } 40 }
41 41
42 PermissionStatus GetPermissionStatus(blink::WebPermissionStatus status) { 42 permission::Status GetPermissionStatus(blink::WebPermissionStatus status) {
43 switch (status) { 43 switch (status) {
44 case blink::WebPermissionStatusGranted: 44 case blink::WebPermissionStatusGranted:
45 return PERMISSION_STATUS_GRANTED; 45 return permission::STATUS_GRANTED;
46 case blink::WebPermissionStatusDenied: 46 case blink::WebPermissionStatusDenied:
47 return PERMISSION_STATUS_DENIED; 47 return permission::STATUS_DENIED;
48 case blink::WebPermissionStatusPrompt: 48 case blink::WebPermissionStatusPrompt:
49 return PERMISSION_STATUS_ASK; 49 return permission::STATUS_ASK;
50 } 50 }
51 51
52 NOTREACHED(); 52 NOTREACHED();
53 return PERMISSION_STATUS_DENIED; 53 return permission::STATUS_DENIED;
54 } 54 }
55 55
56 blink::WebPermissionStatus GetWebPermissionStatus(PermissionStatus status) { 56 blink::WebPermissionStatus GetWebPermissionStatus(permission::Status status) {
57 switch (status) { 57 switch (status) {
58 case PERMISSION_STATUS_GRANTED: 58 case permission::STATUS_GRANTED:
59 return blink::WebPermissionStatusGranted; 59 return blink::WebPermissionStatusGranted;
60 case PERMISSION_STATUS_DENIED: 60 case permission::STATUS_DENIED:
61 return blink::WebPermissionStatusDenied; 61 return blink::WebPermissionStatusDenied;
62 case PERMISSION_STATUS_ASK: 62 case permission::STATUS_ASK:
63 return blink::WebPermissionStatusPrompt; 63 return blink::WebPermissionStatusPrompt;
64 } 64 }
65 65
66 NOTREACHED(); 66 NOTREACHED();
67 return blink::WebPermissionStatusDenied; 67 return blink::WebPermissionStatusDenied;
68 } 68 }
69 69
70 const int kNoWorkerThread = 0; 70 const int kNoWorkerThread = 0;
71 71
72 } // anonymous namespace 72 } // anonymous namespace
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 120
121 void PermissionDispatcher::startListening( 121 void PermissionDispatcher::startListening(
122 blink::WebPermissionType type, 122 blink::WebPermissionType type,
123 const blink::WebURL& origin, 123 const blink::WebURL& origin,
124 WebPermissionObserver* observer) { 124 WebPermissionObserver* observer) {
125 if (!IsObservable(type)) 125 if (!IsObservable(type))
126 return; 126 return;
127 127
128 RegisterObserver(observer); 128 RegisterObserver(observer);
129 129
130 GetNextPermissionChange(type, 130 GetNextPermissionChange(type, origin.string().utf8(), observer,
131 origin.string().utf8(),
132 observer,
133 // We initialize with an arbitrary value because the 131 // We initialize with an arbitrary value because the
134 // mojo service wants a value. Worst case, the 132 // mojo service wants a value. Worst case, the
135 // observer will get notified about a non-change which 133 // observer will get notified about a non-change which
136 // should be a no-op. After the first notification, 134 // should be a no-op. After the first notification,
137 // GetNextPermissionChange will be called with the 135 // GetNextPermissionChange will be called with the
138 // latest known value. 136 // latest known value.
139 PERMISSION_STATUS_ASK); 137 permission::STATUS_ASK);
140 } 138 }
141 139
142 void PermissionDispatcher::stopListening(WebPermissionObserver* observer) { 140 void PermissionDispatcher::stopListening(WebPermissionObserver* observer) {
143 UnregisterObserver(observer); 141 UnregisterObserver(observer);
144 } 142 }
145 143
146 void PermissionDispatcher::QueryPermissionForWorker( 144 void PermissionDispatcher::QueryPermissionForWorker(
147 blink::WebPermissionType type, 145 blink::WebPermissionType type,
148 const std::string& origin, 146 const std::string& origin,
149 blink::WebPermissionCallback* callback, 147 blink::WebPermissionCallback* callback,
(...skipping 24 matching lines...) Expand all
174 int worker_thread_id) { 172 int worker_thread_id) {
175 RevokePermissionInternal(type, origin, callback, worker_thread_id); 173 RevokePermissionInternal(type, origin, callback, worker_thread_id);
176 } 174 }
177 175
178 void PermissionDispatcher::StartListeningForWorker( 176 void PermissionDispatcher::StartListeningForWorker(
179 blink::WebPermissionType type, 177 blink::WebPermissionType type,
180 const std::string& origin, 178 const std::string& origin,
181 int worker_thread_id, 179 int worker_thread_id,
182 const base::Callback<void(blink::WebPermissionStatus)>& callback) { 180 const base::Callback<void(blink::WebPermissionStatus)>& callback) {
183 GetPermissionServicePtr()->GetNextPermissionChange( 181 GetPermissionServicePtr()->GetNextPermissionChange(
184 GetPermissionName(type), 182 GetPermissionName(type), origin,
185 origin,
186 // We initialize with an arbitrary value because the mojo service wants a 183 // We initialize with an arbitrary value because the mojo service wants a
187 // value. Worst case, the observer will get notified about a non-change 184 // value. Worst case, the observer will get notified about a non-change
188 // which should be a no-op. After the first notification, 185 // which should be a no-op. After the first notification,
189 // GetNextPermissionChange will be called with the latest known value. 186 // GetNextPermissionChange will be called with the latest known value.
190 PERMISSION_STATUS_ASK, 187 permission::STATUS_ASK,
191 base::Bind(&PermissionDispatcher::OnPermissionChangedForWorker, 188 base::Bind(&PermissionDispatcher::OnPermissionChangedForWorker,
192 base::Unretained(this), 189 base::Unretained(this), worker_thread_id, callback));
193 worker_thread_id,
194 callback));
195 } 190 }
196 191
197 void PermissionDispatcher::GetNextPermissionChangeForWorker( 192 void PermissionDispatcher::GetNextPermissionChangeForWorker(
198 blink::WebPermissionType type, 193 blink::WebPermissionType type,
199 const std::string& origin, 194 const std::string& origin,
200 blink::WebPermissionStatus status, 195 blink::WebPermissionStatus status,
201 int worker_thread_id, 196 int worker_thread_id,
202 const base::Callback<void(blink::WebPermissionStatus)>& callback) { 197 const base::Callback<void(blink::WebPermissionStatus)>& callback) {
203 GetPermissionServicePtr()->GetNextPermissionChange( 198 GetPermissionServicePtr()->GetNextPermissionChange(
204 GetPermissionName(type), 199 GetPermissionName(type),
(...skipping 11 matching lines...) Expand all
216 blink::WebPermissionStatus status) { 211 blink::WebPermissionStatus status) {
217 callback->onSuccess(status); 212 callback->onSuccess(status);
218 } 213 }
219 214
220 void PermissionDispatcher::RunPermissionsCallbackOnWorkerThread( 215 void PermissionDispatcher::RunPermissionsCallbackOnWorkerThread(
221 scoped_ptr<blink::WebPermissionsCallback> callback, 216 scoped_ptr<blink::WebPermissionsCallback> callback,
222 scoped_ptr<blink::WebVector<blink::WebPermissionStatus>> statuses) { 217 scoped_ptr<blink::WebVector<blink::WebPermissionStatus>> statuses) {
223 callback->onSuccess(blink::adoptWebPtr(statuses.release())); 218 callback->onSuccess(blink::adoptWebPtr(statuses.release()));
224 } 219 }
225 220
226 PermissionServicePtr& PermissionDispatcher::GetPermissionServicePtr() { 221 permission::PermissionServicePtr&
222 PermissionDispatcher::GetPermissionServicePtr() {
227 if (!permission_service_.get()) { 223 if (!permission_service_.get()) {
228 service_registry_->ConnectToRemoteService( 224 service_registry_->ConnectToRemoteService(
229 mojo::GetProxy(&permission_service_)); 225 mojo::GetProxy(&permission_service_));
230 } 226 }
231 return permission_service_; 227 return permission_service_;
232 } 228 }
233 229
234 void PermissionDispatcher::QueryPermissionInternal( 230 void PermissionDispatcher::QueryPermissionInternal(
235 blink::WebPermissionType type, 231 blink::WebPermissionType type,
236 const std::string& origin, 232 const std::string& origin,
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 blink::WebPermissionsCallback* callback, 278 blink::WebPermissionsCallback* callback,
283 int worker_thread_id) { 279 int worker_thread_id) {
284 // We need to save the |callback| in an ScopedVector so if |this| gets 280 // We need to save the |callback| in an ScopedVector so if |this| gets
285 // deleted, the callback will not leak. In the case of |this| gets deleted, 281 // deleted, the callback will not leak. In the case of |this| gets deleted,
286 // the |permission_service_| pipe will be destroyed too so OnQueryPermission 282 // the |permission_service_| pipe will be destroyed too so OnQueryPermission
287 // will not be called. 283 // will not be called.
288 uintptr_t callback_key = reinterpret_cast<uintptr_t>(callback); 284 uintptr_t callback_key = reinterpret_cast<uintptr_t>(callback);
289 permissions_callbacks_.add(callback_key, 285 permissions_callbacks_.add(callback_key,
290 scoped_ptr<blink::WebPermissionsCallback>(callback)); 286 scoped_ptr<blink::WebPermissionsCallback>(callback));
291 287
292 mojo::Array<PermissionName> names(types.size()); 288 mojo::Array<permission::Name> names(types.size());
293 for (size_t i = 0; i < types.size(); ++i) 289 for (size_t i = 0; i < types.size(); ++i)
294 names[i] = GetPermissionName(types[i]); 290 names[i] = GetPermissionName(types[i]);
295 291
296 GetPermissionServicePtr()->RequestPermissions( 292 GetPermissionServicePtr()->RequestPermissions(
297 names.Pass(), 293 names.Pass(),
298 origin, 294 origin,
299 blink::WebUserGestureIndicator::isProcessingUserGesture(), 295 blink::WebUserGestureIndicator::isProcessingUserGesture(),
300 base::Bind(&PermissionDispatcher::OnRequestPermissionsResponse, 296 base::Bind(&PermissionDispatcher::OnRequestPermissionsResponse,
301 base::Unretained(this), 297 base::Unretained(this),
302 worker_thread_id, 298 worker_thread_id,
(...skipping 15 matching lines...) Expand all
318 314
319 GetPermissionServicePtr()->RevokePermission( 315 GetPermissionServicePtr()->RevokePermission(
320 GetPermissionName(type), 316 GetPermissionName(type),
321 origin, 317 origin,
322 base::Bind(&PermissionDispatcher::OnPermissionResponse, 318 base::Bind(&PermissionDispatcher::OnPermissionResponse,
323 base::Unretained(this), 319 base::Unretained(this),
324 worker_thread_id, 320 worker_thread_id,
325 callback_key)); 321 callback_key));
326 } 322 }
327 323
328 void PermissionDispatcher::OnPermissionResponse( 324 void PermissionDispatcher::OnPermissionResponse(int worker_thread_id,
329 int worker_thread_id, 325 uintptr_t callback_key,
330 uintptr_t callback_key, 326 permission::Status result) {
331 PermissionStatus result) {
332 scoped_ptr<blink::WebPermissionCallback> callback = 327 scoped_ptr<blink::WebPermissionCallback> callback =
333 permission_callbacks_.take_and_erase(callback_key); 328 permission_callbacks_.take_and_erase(callback_key);
334 blink::WebPermissionStatus status = GetWebPermissionStatus(result); 329 blink::WebPermissionStatus status = GetWebPermissionStatus(result);
335 330
336 if (worker_thread_id != kNoWorkerThread) { 331 if (worker_thread_id != kNoWorkerThread) {
337 // If the worker is no longer running, ::PostTask() will return false and 332 // If the worker is no longer running, ::PostTask() will return false and
338 // gracefully fail, destroying the callback too. 333 // gracefully fail, destroying the callback too.
339 WorkerTaskRunner::Instance()->PostTask( 334 WorkerTaskRunner::Instance()->PostTask(
340 worker_thread_id, 335 worker_thread_id,
341 base::Bind(&PermissionDispatcher::RunPermissionCallbackOnWorkerThread, 336 base::Bind(&PermissionDispatcher::RunPermissionCallbackOnWorkerThread,
342 base::Passed(&callback), status)); 337 base::Passed(&callback), status));
343 return; 338 return;
344 } 339 }
345 340
346 callback->onSuccess(status); 341 callback->onSuccess(status);
347 } 342 }
348 343
349 void PermissionDispatcher::OnRequestPermissionsResponse( 344 void PermissionDispatcher::OnRequestPermissionsResponse(
350 int worker_thread_id, 345 int worker_thread_id,
351 uintptr_t callback_key, 346 uintptr_t callback_key,
352 const mojo::Array<PermissionStatus>& result) { 347 const mojo::Array<permission::Status>& result) {
353 scoped_ptr<blink::WebPermissionsCallback> callback = 348 scoped_ptr<blink::WebPermissionsCallback> callback =
354 permissions_callbacks_.take_and_erase(callback_key); 349 permissions_callbacks_.take_and_erase(callback_key);
355 scoped_ptr<blink::WebVector<blink::WebPermissionStatus>> statuses( 350 scoped_ptr<blink::WebVector<blink::WebPermissionStatus>> statuses(
356 new blink::WebVector<blink::WebPermissionStatus>(result.size())); 351 new blink::WebVector<blink::WebPermissionStatus>(result.size()));
357 352
358 for (size_t i = 0; i < result.size(); i++) 353 for (size_t i = 0; i < result.size(); i++)
359 statuses->operator[](i) = GetWebPermissionStatus(result[i]); 354 statuses->operator[](i) = GetWebPermissionStatus(result[i]);
360 355
361 if (worker_thread_id != kNoWorkerThread) { 356 if (worker_thread_id != kNoWorkerThread) {
362 // If the worker is no longer running, ::PostTask() will return false and 357 // If the worker is no longer running, ::PostTask() will return false and
363 // gracefully fail, destroying the callback too. 358 // gracefully fail, destroying the callback too.
364 WorkerTaskRunner::Instance()->PostTask( 359 WorkerTaskRunner::Instance()->PostTask(
365 worker_thread_id, 360 worker_thread_id,
366 base::Bind(&PermissionDispatcher::RunPermissionsCallbackOnWorkerThread, 361 base::Bind(&PermissionDispatcher::RunPermissionsCallbackOnWorkerThread,
367 base::Passed(&callback), 362 base::Passed(&callback),
368 base::Passed(&statuses))); 363 base::Passed(&statuses)));
369 return; 364 return;
370 } 365 }
371 366
372 callback->onSuccess(blink::adoptWebPtr(statuses.release())); 367 callback->onSuccess(blink::adoptWebPtr(statuses.release()));
373 } 368 }
374 369
375 void PermissionDispatcher::OnPermissionChanged( 370 void PermissionDispatcher::OnPermissionChanged(blink::WebPermissionType type,
376 blink::WebPermissionType type, 371 const std::string& origin,
377 const std::string& origin, 372 WebPermissionObserver* observer,
378 WebPermissionObserver* observer, 373 permission::Status status) {
379 PermissionStatus status) {
380 if (!IsObserverRegistered(observer)) 374 if (!IsObserverRegistered(observer))
381 return; 375 return;
382 376
383 observer->permissionChanged(type, GetWebPermissionStatus(status)); 377 observer->permissionChanged(type, GetWebPermissionStatus(status));
384 378
385 GetNextPermissionChange(type, origin, observer, status); 379 GetNextPermissionChange(type, origin, observer, status);
386 } 380 }
387 381
388 void PermissionDispatcher::OnPermissionChangedForWorker( 382 void PermissionDispatcher::OnPermissionChangedForWorker(
389 int worker_thread_id, 383 int worker_thread_id,
390 const base::Callback<void(blink::WebPermissionStatus)>& callback, 384 const base::Callback<void(blink::WebPermissionStatus)>& callback,
391 PermissionStatus status) { 385 permission::Status status) {
392 DCHECK(worker_thread_id != kNoWorkerThread); 386 DCHECK(worker_thread_id != kNoWorkerThread);
393 387
394 WorkerTaskRunner::Instance()->PostTask( 388 WorkerTaskRunner::Instance()->PostTask(
395 worker_thread_id, base::Bind(callback, GetWebPermissionStatus(status))); 389 worker_thread_id, base::Bind(callback, GetWebPermissionStatus(status)));
396 } 390 }
397 391
398 void PermissionDispatcher::GetNextPermissionChange( 392 void PermissionDispatcher::GetNextPermissionChange(
399 blink::WebPermissionType type, 393 blink::WebPermissionType type,
400 const std::string& origin, 394 const std::string& origin,
401 WebPermissionObserver* observer, 395 WebPermissionObserver* observer,
402 PermissionStatus current_status) { 396 permission::Status current_status) {
403 GetPermissionServicePtr()->GetNextPermissionChange( 397 GetPermissionServicePtr()->GetNextPermissionChange(
404 GetPermissionName(type), 398 GetPermissionName(type),
405 origin, 399 origin,
406 current_status, 400 current_status,
407 base::Bind(&PermissionDispatcher::OnPermissionChanged, 401 base::Bind(&PermissionDispatcher::OnPermissionChanged,
408 base::Unretained(this), 402 base::Unretained(this),
409 type, 403 type,
410 origin, 404 origin,
411 base::Unretained(observer))); 405 base::Unretained(observer)));
412 } 406 }
413 407
414 } // namespace content 408 } // namespace content
OLDNEW
« no previous file with comments | « content/child/permissions/permission_dispatcher.h ('k') | content/common/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698