| OLD | NEW |
| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| 11 #include "content/public/child/worker_thread.h" | 11 #include "content/public/child/worker_thread.h" |
| 12 #include "content/public/common/service_registry.h" | 12 #include "content/public/common/service_registry.h" |
| 13 #include "third_party/WebKit/public/platform/WebURL.h" | 13 #include "third_party/WebKit/public/platform/WebURL.h" |
| 14 #include "third_party/WebKit/public/platform/modules/permissions/WebPermissionOb
server.h" | 14 #include "third_party/WebKit/public/platform/modules/permissions/WebPermissionOb
server.h" |
| 15 | 15 |
| 16 using blink::WebPermissionObserver; | 16 using blink::WebPermissionObserver; |
| 17 | 17 |
| 18 namespace content { | 18 namespace content { |
| 19 | 19 |
| 20 namespace { | 20 namespace { |
| 21 | 21 |
| 22 PermissionName GetPermissionName(blink::WebPermissionType type) { | 22 mojom::PermissionName GetPermissionName(blink::WebPermissionType type) { |
| 23 switch (type) { | 23 switch (type) { |
| 24 case blink::WebPermissionTypeGeolocation: | 24 case blink::WebPermissionTypeGeolocation: |
| 25 return PermissionName::GEOLOCATION; | 25 return mojom::PermissionName::GEOLOCATION; |
| 26 case blink::WebPermissionTypeNotifications: | 26 case blink::WebPermissionTypeNotifications: |
| 27 return PermissionName::NOTIFICATIONS; | 27 return mojom::PermissionName::NOTIFICATIONS; |
| 28 case blink::WebPermissionTypePushNotifications: | 28 case blink::WebPermissionTypePushNotifications: |
| 29 return PermissionName::PUSH_NOTIFICATIONS; | 29 return mojom::PermissionName::PUSH_NOTIFICATIONS; |
| 30 case blink::WebPermissionTypeMidiSysEx: | 30 case blink::WebPermissionTypeMidiSysEx: |
| 31 return PermissionName::MIDI_SYSEX; | 31 return mojom::PermissionName::MIDI_SYSEX; |
| 32 case blink::WebPermissionTypeDurableStorage: | 32 case blink::WebPermissionTypeDurableStorage: |
| 33 return PermissionName::DURABLE_STORAGE; | 33 return mojom::PermissionName::DURABLE_STORAGE; |
| 34 case blink::WebPermissionTypeMidi: | 34 case blink::WebPermissionTypeMidi: |
| 35 return PermissionName::MIDI; | 35 return mojom::PermissionName::MIDI; |
| 36 default: | 36 default: |
| 37 // The default statement is only there to prevent compilation failures if | 37 // The default statement is only there to prevent compilation failures if |
| 38 // WebPermissionType enum gets extended. | 38 // WebPermissionType enum gets extended. |
| 39 NOTREACHED(); | 39 NOTREACHED(); |
| 40 return PermissionName::GEOLOCATION; | 40 return mojom::PermissionName::GEOLOCATION; |
| 41 } | 41 } |
| 42 } | 42 } |
| 43 | 43 |
| 44 PermissionStatus GetPermissionStatus(blink::WebPermissionStatus status) { | 44 mojom::PermissionStatus GetPermissionStatus(blink::WebPermissionStatus status) { |
| 45 switch (status) { | 45 switch (status) { |
| 46 case blink::WebPermissionStatusGranted: | 46 case blink::WebPermissionStatusGranted: |
| 47 return PermissionStatus::GRANTED; | 47 return mojom::PermissionStatus::GRANTED; |
| 48 case blink::WebPermissionStatusDenied: | 48 case blink::WebPermissionStatusDenied: |
| 49 return PermissionStatus::DENIED; | 49 return mojom::PermissionStatus::DENIED; |
| 50 case blink::WebPermissionStatusPrompt: | 50 case blink::WebPermissionStatusPrompt: |
| 51 return PermissionStatus::ASK; | 51 return mojom::PermissionStatus::ASK; |
| 52 } | 52 } |
| 53 | 53 |
| 54 NOTREACHED(); | 54 NOTREACHED(); |
| 55 return PermissionStatus::DENIED; | 55 return mojom::PermissionStatus::DENIED; |
| 56 } | 56 } |
| 57 | 57 |
| 58 blink::WebPermissionStatus GetWebPermissionStatus(PermissionStatus status) { | 58 blink::WebPermissionStatus GetWebPermissionStatus( |
| 59 mojom::PermissionStatus status) { |
| 59 switch (status) { | 60 switch (status) { |
| 60 case PermissionStatus::GRANTED: | 61 case mojom::PermissionStatus::GRANTED: |
| 61 return blink::WebPermissionStatusGranted; | 62 return blink::WebPermissionStatusGranted; |
| 62 case PermissionStatus::DENIED: | 63 case mojom::PermissionStatus::DENIED: |
| 63 return blink::WebPermissionStatusDenied; | 64 return blink::WebPermissionStatusDenied; |
| 64 case PermissionStatus::ASK: | 65 case mojom::PermissionStatus::ASK: |
| 65 return blink::WebPermissionStatusPrompt; | 66 return blink::WebPermissionStatusPrompt; |
| 66 } | 67 } |
| 67 | 68 |
| 68 NOTREACHED(); | 69 NOTREACHED(); |
| 69 return blink::WebPermissionStatusDenied; | 70 return blink::WebPermissionStatusDenied; |
| 70 } | 71 } |
| 71 | 72 |
| 72 const int kNoWorkerThread = 0; | 73 const int kNoWorkerThread = 0; |
| 73 | 74 |
| 74 } // anonymous namespace | 75 } // anonymous namespace |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 | 131 |
| 131 RegisterObserver(observer); | 132 RegisterObserver(observer); |
| 132 | 133 |
| 133 GetNextPermissionChange(type, origin.string().utf8(), observer, | 134 GetNextPermissionChange(type, origin.string().utf8(), observer, |
| 134 // We initialize with an arbitrary value because the | 135 // We initialize with an arbitrary value because the |
| 135 // mojo service wants a value. Worst case, the | 136 // mojo service wants a value. Worst case, the |
| 136 // observer will get notified about a non-change which | 137 // observer will get notified about a non-change which |
| 137 // should be a no-op. After the first notification, | 138 // should be a no-op. After the first notification, |
| 138 // GetNextPermissionChange will be called with the | 139 // GetNextPermissionChange will be called with the |
| 139 // latest known value. | 140 // latest known value. |
| 140 PermissionStatus::ASK); | 141 mojom::PermissionStatus::ASK); |
| 141 } | 142 } |
| 142 | 143 |
| 143 void PermissionDispatcher::stopListening(WebPermissionObserver* observer) { | 144 void PermissionDispatcher::stopListening(WebPermissionObserver* observer) { |
| 144 UnregisterObserver(observer); | 145 UnregisterObserver(observer); |
| 145 } | 146 } |
| 146 | 147 |
| 147 void PermissionDispatcher::QueryPermissionForWorker( | 148 void PermissionDispatcher::QueryPermissionForWorker( |
| 148 blink::WebPermissionType type, | 149 blink::WebPermissionType type, |
| 149 const std::string& origin, | 150 const std::string& origin, |
| 150 blink::WebPermissionCallback* callback, | 151 blink::WebPermissionCallback* callback, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 180 blink::WebPermissionType type, | 181 blink::WebPermissionType type, |
| 181 const std::string& origin, | 182 const std::string& origin, |
| 182 int worker_thread_id, | 183 int worker_thread_id, |
| 183 const base::Callback<void(blink::WebPermissionStatus)>& callback) { | 184 const base::Callback<void(blink::WebPermissionStatus)>& callback) { |
| 184 GetPermissionServicePtr()->GetNextPermissionChange( | 185 GetPermissionServicePtr()->GetNextPermissionChange( |
| 185 GetPermissionName(type), origin, | 186 GetPermissionName(type), origin, |
| 186 // We initialize with an arbitrary value because the mojo service wants a | 187 // 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 | 188 // value. Worst case, the observer will get notified about a non-change |
| 188 // which should be a no-op. After the first notification, | 189 // which should be a no-op. After the first notification, |
| 189 // GetNextPermissionChange will be called with the latest known value. | 190 // GetNextPermissionChange will be called with the latest known value. |
| 190 PermissionStatus::ASK, | 191 mojom::PermissionStatus::ASK, |
| 191 base::Bind(&PermissionDispatcher::OnPermissionChangedForWorker, | 192 base::Bind(&PermissionDispatcher::OnPermissionChangedForWorker, |
| 192 base::Unretained(this), worker_thread_id, callback)); | 193 base::Unretained(this), worker_thread_id, callback)); |
| 193 } | 194 } |
| 194 | 195 |
| 195 void PermissionDispatcher::GetNextPermissionChangeForWorker( | 196 void PermissionDispatcher::GetNextPermissionChangeForWorker( |
| 196 blink::WebPermissionType type, | 197 blink::WebPermissionType type, |
| 197 const std::string& origin, | 198 const std::string& origin, |
| 198 blink::WebPermissionStatus status, | 199 blink::WebPermissionStatus status, |
| 199 int worker_thread_id, | 200 int worker_thread_id, |
| 200 const base::Callback<void(blink::WebPermissionStatus)>& callback) { | 201 const base::Callback<void(blink::WebPermissionStatus)>& callback) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 214 blink::WebPermissionStatus status) { | 215 blink::WebPermissionStatus status) { |
| 215 callback->onSuccess(status); | 216 callback->onSuccess(status); |
| 216 } | 217 } |
| 217 | 218 |
| 218 void PermissionDispatcher::RunPermissionsCallbackOnWorkerThread( | 219 void PermissionDispatcher::RunPermissionsCallbackOnWorkerThread( |
| 219 scoped_ptr<blink::WebPermissionsCallback> callback, | 220 scoped_ptr<blink::WebPermissionsCallback> callback, |
| 220 scoped_ptr<blink::WebVector<blink::WebPermissionStatus>> statuses) { | 221 scoped_ptr<blink::WebVector<blink::WebPermissionStatus>> statuses) { |
| 221 callback->onSuccess(blink::adoptWebPtr(statuses.release())); | 222 callback->onSuccess(blink::adoptWebPtr(statuses.release())); |
| 222 } | 223 } |
| 223 | 224 |
| 224 PermissionServicePtr& PermissionDispatcher::GetPermissionServicePtr() { | 225 mojom::PermissionServicePtr& PermissionDispatcher::GetPermissionServicePtr() { |
| 225 if (!permission_service_.get()) { | 226 if (!permission_service_.get()) { |
| 226 service_registry_->ConnectToRemoteService( | 227 service_registry_->ConnectToRemoteService( |
| 227 mojo::GetProxy(&permission_service_)); | 228 mojo::GetProxy(&permission_service_)); |
| 228 } | 229 } |
| 229 return permission_service_; | 230 return permission_service_; |
| 230 } | 231 } |
| 231 | 232 |
| 232 void PermissionDispatcher::QueryPermissionInternal( | 233 void PermissionDispatcher::QueryPermissionInternal( |
| 233 blink::WebPermissionType type, | 234 blink::WebPermissionType type, |
| 234 const std::string& origin, | 235 const std::string& origin, |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 blink::WebPermissionsCallback* callback, | 280 blink::WebPermissionsCallback* callback, |
| 280 int worker_thread_id) { | 281 int worker_thread_id) { |
| 281 // We need to save the |callback| in an ScopedVector so if |this| gets | 282 // We need to save the |callback| in an ScopedVector so if |this| gets |
| 282 // deleted, the callback will not leak. In the case of |this| gets deleted, | 283 // deleted, the callback will not leak. In the case of |this| gets deleted, |
| 283 // the |permission_service_| pipe will be destroyed too so OnQueryPermission | 284 // the |permission_service_| pipe will be destroyed too so OnQueryPermission |
| 284 // will not be called. | 285 // will not be called. |
| 285 uintptr_t callback_key = reinterpret_cast<uintptr_t>(callback); | 286 uintptr_t callback_key = reinterpret_cast<uintptr_t>(callback); |
| 286 permissions_callbacks_.add(callback_key, | 287 permissions_callbacks_.add(callback_key, |
| 287 scoped_ptr<blink::WebPermissionsCallback>(callback)); | 288 scoped_ptr<blink::WebPermissionsCallback>(callback)); |
| 288 | 289 |
| 289 mojo::Array<PermissionName> names(types.size()); | 290 mojo::Array<mojom::PermissionName> names(types.size()); |
| 290 for (size_t i = 0; i < types.size(); ++i) | 291 for (size_t i = 0; i < types.size(); ++i) |
| 291 names[i] = GetPermissionName(types[i]); | 292 names[i] = GetPermissionName(types[i]); |
| 292 | 293 |
| 293 GetPermissionServicePtr()->RequestPermissions( | 294 GetPermissionServicePtr()->RequestPermissions( |
| 294 std::move(names), origin, | 295 std::move(names), origin, |
| 295 base::Bind(&PermissionDispatcher::OnRequestPermissionsResponse, | 296 base::Bind(&PermissionDispatcher::OnRequestPermissionsResponse, |
| 296 base::Unretained(this), worker_thread_id, callback_key)); | 297 base::Unretained(this), worker_thread_id, callback_key)); |
| 297 } | 298 } |
| 298 | 299 |
| 299 void PermissionDispatcher::RevokePermissionInternal( | 300 void PermissionDispatcher::RevokePermissionInternal( |
| (...skipping 14 matching lines...) Expand all Loading... |
| 314 origin, | 315 origin, |
| 315 base::Bind(&PermissionDispatcher::OnPermissionResponse, | 316 base::Bind(&PermissionDispatcher::OnPermissionResponse, |
| 316 base::Unretained(this), | 317 base::Unretained(this), |
| 317 worker_thread_id, | 318 worker_thread_id, |
| 318 callback_key)); | 319 callback_key)); |
| 319 } | 320 } |
| 320 | 321 |
| 321 void PermissionDispatcher::OnPermissionResponse( | 322 void PermissionDispatcher::OnPermissionResponse( |
| 322 int worker_thread_id, | 323 int worker_thread_id, |
| 323 uintptr_t callback_key, | 324 uintptr_t callback_key, |
| 324 PermissionStatus result) { | 325 mojom::PermissionStatus result) { |
| 325 scoped_ptr<blink::WebPermissionCallback> callback = | 326 scoped_ptr<blink::WebPermissionCallback> callback = |
| 326 permission_callbacks_.take_and_erase(callback_key); | 327 permission_callbacks_.take_and_erase(callback_key); |
| 327 blink::WebPermissionStatus status = GetWebPermissionStatus(result); | 328 blink::WebPermissionStatus status = GetWebPermissionStatus(result); |
| 328 | 329 |
| 329 if (worker_thread_id != kNoWorkerThread) { | 330 if (worker_thread_id != kNoWorkerThread) { |
| 330 // If the worker is no longer running, ::PostTask() will return false and | 331 // If the worker is no longer running, ::PostTask() will return false and |
| 331 // gracefully fail, destroying the callback too. | 332 // gracefully fail, destroying the callback too. |
| 332 WorkerThread::PostTask( | 333 WorkerThread::PostTask( |
| 333 worker_thread_id, | 334 worker_thread_id, |
| 334 base::Bind(&PermissionDispatcher::RunPermissionCallbackOnWorkerThread, | 335 base::Bind(&PermissionDispatcher::RunPermissionCallbackOnWorkerThread, |
| 335 base::Passed(&callback), status)); | 336 base::Passed(&callback), status)); |
| 336 return; | 337 return; |
| 337 } | 338 } |
| 338 | 339 |
| 339 callback->onSuccess(status); | 340 callback->onSuccess(status); |
| 340 } | 341 } |
| 341 | 342 |
| 342 void PermissionDispatcher::OnRequestPermissionsResponse( | 343 void PermissionDispatcher::OnRequestPermissionsResponse( |
| 343 int worker_thread_id, | 344 int worker_thread_id, |
| 344 uintptr_t callback_key, | 345 uintptr_t callback_key, |
| 345 const mojo::Array<PermissionStatus>& result) { | 346 const mojo::Array<mojom::PermissionStatus>& result) { |
| 346 scoped_ptr<blink::WebPermissionsCallback> callback = | 347 scoped_ptr<blink::WebPermissionsCallback> callback = |
| 347 permissions_callbacks_.take_and_erase(callback_key); | 348 permissions_callbacks_.take_and_erase(callback_key); |
| 348 scoped_ptr<blink::WebVector<blink::WebPermissionStatus>> statuses( | 349 scoped_ptr<blink::WebVector<blink::WebPermissionStatus>> statuses( |
| 349 new blink::WebVector<blink::WebPermissionStatus>(result.size())); | 350 new blink::WebVector<blink::WebPermissionStatus>(result.size())); |
| 350 | 351 |
| 351 for (size_t i = 0; i < result.size(); i++) | 352 for (size_t i = 0; i < result.size(); i++) |
| 352 statuses->operator[](i) = GetWebPermissionStatus(result[i]); | 353 statuses->operator[](i) = GetWebPermissionStatus(result[i]); |
| 353 | 354 |
| 354 if (worker_thread_id != kNoWorkerThread) { | 355 if (worker_thread_id != kNoWorkerThread) { |
| 355 // If the worker is no longer running, ::PostTask() will return false and | 356 // If the worker is no longer running, ::PostTask() will return false and |
| 356 // gracefully fail, destroying the callback too. | 357 // gracefully fail, destroying the callback too. |
| 357 WorkerThread::PostTask( | 358 WorkerThread::PostTask( |
| 358 worker_thread_id, | 359 worker_thread_id, |
| 359 base::Bind(&PermissionDispatcher::RunPermissionsCallbackOnWorkerThread, | 360 base::Bind(&PermissionDispatcher::RunPermissionsCallbackOnWorkerThread, |
| 360 base::Passed(&callback), base::Passed(&statuses))); | 361 base::Passed(&callback), base::Passed(&statuses))); |
| 361 return; | 362 return; |
| 362 } | 363 } |
| 363 | 364 |
| 364 callback->onSuccess(blink::adoptWebPtr(statuses.release())); | 365 callback->onSuccess(blink::adoptWebPtr(statuses.release())); |
| 365 } | 366 } |
| 366 | 367 |
| 367 void PermissionDispatcher::OnPermissionChanged( | 368 void PermissionDispatcher::OnPermissionChanged(blink::WebPermissionType type, |
| 368 blink::WebPermissionType type, | 369 const std::string& origin, |
| 369 const std::string& origin, | 370 WebPermissionObserver* observer, |
| 370 WebPermissionObserver* observer, | 371 mojom::PermissionStatus status) { |
| 371 PermissionStatus status) { | |
| 372 if (!IsObserverRegistered(observer)) | 372 if (!IsObserverRegistered(observer)) |
| 373 return; | 373 return; |
| 374 | 374 |
| 375 observer->permissionChanged(type, GetWebPermissionStatus(status)); | 375 observer->permissionChanged(type, GetWebPermissionStatus(status)); |
| 376 | 376 |
| 377 GetNextPermissionChange(type, origin, observer, status); | 377 GetNextPermissionChange(type, origin, observer, status); |
| 378 } | 378 } |
| 379 | 379 |
| 380 void PermissionDispatcher::OnPermissionChangedForWorker( | 380 void PermissionDispatcher::OnPermissionChangedForWorker( |
| 381 int worker_thread_id, | 381 int worker_thread_id, |
| 382 const base::Callback<void(blink::WebPermissionStatus)>& callback, | 382 const base::Callback<void(blink::WebPermissionStatus)>& callback, |
| 383 PermissionStatus status) { | 383 mojom::PermissionStatus status) { |
| 384 DCHECK(worker_thread_id != kNoWorkerThread); | 384 DCHECK(worker_thread_id != kNoWorkerThread); |
| 385 | 385 |
| 386 WorkerThread::PostTask(worker_thread_id, | 386 WorkerThread::PostTask(worker_thread_id, |
| 387 base::Bind(callback, GetWebPermissionStatus(status))); | 387 base::Bind(callback, GetWebPermissionStatus(status))); |
| 388 } | 388 } |
| 389 | 389 |
| 390 void PermissionDispatcher::GetNextPermissionChange( | 390 void PermissionDispatcher::GetNextPermissionChange( |
| 391 blink::WebPermissionType type, | 391 blink::WebPermissionType type, |
| 392 const std::string& origin, | 392 const std::string& origin, |
| 393 WebPermissionObserver* observer, | 393 WebPermissionObserver* observer, |
| 394 PermissionStatus current_status) { | 394 mojom::PermissionStatus current_status) { |
| 395 GetPermissionServicePtr()->GetNextPermissionChange( | 395 GetPermissionServicePtr()->GetNextPermissionChange( |
| 396 GetPermissionName(type), | 396 GetPermissionName(type), |
| 397 origin, | 397 origin, |
| 398 current_status, | 398 current_status, |
| 399 base::Bind(&PermissionDispatcher::OnPermissionChanged, | 399 base::Bind(&PermissionDispatcher::OnPermissionChanged, |
| 400 base::Unretained(this), | 400 base::Unretained(this), |
| 401 type, | 401 type, |
| 402 origin, | 402 origin, |
| 403 base::Unretained(observer))); | 403 base::Unretained(observer))); |
| 404 } | 404 } |
| 405 | 405 |
| 406 } // namespace content | 406 } // namespace content |
| OLD | NEW |