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

Unified Diff: content/child/permissions/permission_dispatcher.cc

Issue 2108003002: Merge //content/child/permissions into Blink's permissions module. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased. Created 4 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: content/child/permissions/permission_dispatcher.cc
diff --git a/content/child/permissions/permission_dispatcher.cc b/content/child/permissions/permission_dispatcher.cc
deleted file mode 100644
index c643649e3e210f6a9938c402639d3d2a6370b8ea..0000000000000000000000000000000000000000
--- a/content/child/permissions/permission_dispatcher.cc
+++ /dev/null
@@ -1,414 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/child/permissions/permission_dispatcher.h"
-
-#include <stddef.h>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "content/public/child/worker_thread.h"
-#include "services/shell/public/cpp/interface_provider.h"
-#include "third_party/WebKit/public/platform/WebURL.h"
-#include "third_party/WebKit/public/platform/modules/permissions/WebPermissionObserver.h"
-#include "third_party/WebKit/public/web/WebUserGestureIndicator.h"
-
-using blink::WebPermissionObserver;
-using blink::mojom::PermissionName;
-using blink::mojom::PermissionStatus;
-
-namespace content {
-
-namespace {
-
-PermissionName GetPermissionName(blink::WebPermissionType type) {
- switch (type) {
- case blink::WebPermissionTypeGeolocation:
- return PermissionName::GEOLOCATION;
- case blink::WebPermissionTypeNotifications:
- return PermissionName::NOTIFICATIONS;
- case blink::WebPermissionTypePushNotifications:
- return PermissionName::PUSH_NOTIFICATIONS;
- case blink::WebPermissionTypeMidiSysEx:
- return PermissionName::MIDI_SYSEX;
- case blink::WebPermissionTypeDurableStorage:
- return PermissionName::DURABLE_STORAGE;
- case blink::WebPermissionTypeMidi:
- return PermissionName::MIDI;
- case blink::WebPermissionTypeBackgroundSync:
- return PermissionName::BACKGROUND_SYNC;
- default:
- // The default statement is only there to prevent compilation failures if
- // WebPermissionType enum gets extended.
- NOTREACHED();
- return PermissionName::GEOLOCATION;
- }
-}
-
-PermissionStatus GetPermissionStatus(blink::WebPermissionStatus status) {
- switch (status) {
- case blink::WebPermissionStatusGranted:
- return PermissionStatus::GRANTED;
- case blink::WebPermissionStatusDenied:
- return PermissionStatus::DENIED;
- case blink::WebPermissionStatusPrompt:
- return PermissionStatus::ASK;
- }
-
- NOTREACHED();
- return PermissionStatus::DENIED;
-}
-
-blink::WebPermissionStatus GetWebPermissionStatus(PermissionStatus status) {
- switch (status) {
- case PermissionStatus::GRANTED:
- return blink::WebPermissionStatusGranted;
- case PermissionStatus::DENIED:
- return blink::WebPermissionStatusDenied;
- case PermissionStatus::ASK:
- return blink::WebPermissionStatusPrompt;
- }
-
- NOTREACHED();
- return blink::WebPermissionStatusDenied;
-}
-
-const int kNoWorkerThread = 0;
-
-} // anonymous namespace
-
-// static
-bool PermissionDispatcher::IsObservable(blink::WebPermissionType type) {
- return type == blink::WebPermissionTypeGeolocation ||
- type == blink::WebPermissionTypeNotifications ||
- type == blink::WebPermissionTypePushNotifications ||
- type == blink::WebPermissionTypeMidiSysEx ||
- type == blink::WebPermissionTypeMidi ||
- type == blink::WebPermissionTypeBackgroundSync;
-}
-
-PermissionDispatcher::PermissionDispatcher(
- shell::InterfaceProvider* remote_interfaces)
- : remote_interfaces_(remote_interfaces) {
-}
-
-PermissionDispatcher::~PermissionDispatcher() {
-}
-
-void PermissionDispatcher::queryPermission(
- blink::WebPermissionType type,
- const blink::WebURL& origin,
- blink::WebPermissionCallback* callback) {
- QueryPermissionInternal(
- type, origin.string().utf8(), callback, kNoWorkerThread);
-}
-
-void PermissionDispatcher::requestPermission(
- blink::WebPermissionType type,
- const blink::WebURL& origin,
- blink::WebPermissionCallback* callback) {
- RequestPermissionInternal(
- type, origin.string().utf8(), callback, kNoWorkerThread);
-}
-
-void PermissionDispatcher::requestPermissions(
- const blink::WebVector<blink::WebPermissionType>& types,
- const blink::WebURL& origin,
- blink::WebPermissionsCallback* callback) {
- RequestPermissionsInternal(
- types, origin.string().utf8(), callback, kNoWorkerThread);
-}
-
-void PermissionDispatcher::revokePermission(
- blink::WebPermissionType type,
- const blink::WebURL& origin,
- blink::WebPermissionCallback* callback) {
- RevokePermissionInternal(
- type, origin.string().utf8(), callback, kNoWorkerThread);
-}
-
-void PermissionDispatcher::startListening(
- blink::WebPermissionType type,
- const blink::WebURL& origin,
- WebPermissionObserver* observer) {
- if (!IsObservable(type))
- return;
-
- RegisterObserver(observer);
-
- GetNextPermissionChange(type, origin.string().utf8(), observer,
- // We initialize with an arbitrary value because the
- // mojo service wants a value. Worst case, the
- // observer will get notified about a non-change which
- // should be a no-op. After the first notification,
- // GetNextPermissionChange will be called with the
- // latest known value.
- PermissionStatus::ASK);
-}
-
-void PermissionDispatcher::stopListening(WebPermissionObserver* observer) {
- UnregisterObserver(observer);
-}
-
-void PermissionDispatcher::QueryPermissionForWorker(
- blink::WebPermissionType type,
- const std::string& origin,
- blink::WebPermissionCallback* callback,
- int worker_thread_id) {
- QueryPermissionInternal(type, origin, callback, worker_thread_id);
-}
-
-void PermissionDispatcher::RequestPermissionForWorker(
- blink::WebPermissionType type,
- const std::string& origin,
- blink::WebPermissionCallback* callback,
- int worker_thread_id) {
- RequestPermissionInternal(type, origin, callback, worker_thread_id);
-}
-
-void PermissionDispatcher::RequestPermissionsForWorker(
- const blink::WebVector<blink::WebPermissionType>& types,
- const std::string& origin,
- blink::WebPermissionsCallback* callback,
- int worker_thread_id) {
- RequestPermissionsInternal(types, origin, callback, worker_thread_id);
-}
-
-void PermissionDispatcher::RevokePermissionForWorker(
- blink::WebPermissionType type,
- const std::string& origin,
- blink::WebPermissionCallback* callback,
- int worker_thread_id) {
- RevokePermissionInternal(type, origin, callback, worker_thread_id);
-}
-
-void PermissionDispatcher::StartListeningForWorker(
- blink::WebPermissionType type,
- const std::string& origin,
- int worker_thread_id,
- const base::Callback<void(blink::WebPermissionStatus)>& callback) {
- GetPermissionServicePtr()->GetNextPermissionChange(
- GetPermissionName(type), origin,
- // We initialize with an arbitrary value because the mojo service wants a
- // value. Worst case, the observer will get notified about a non-change
- // which should be a no-op. After the first notification,
- // GetNextPermissionChange will be called with the latest known value.
- PermissionStatus::ASK,
- base::Bind(&PermissionDispatcher::OnPermissionChangedForWorker,
- base::Unretained(this), worker_thread_id, callback));
-}
-
-void PermissionDispatcher::GetNextPermissionChangeForWorker(
- blink::WebPermissionType type,
- const std::string& origin,
- blink::WebPermissionStatus status,
- int worker_thread_id,
- const base::Callback<void(blink::WebPermissionStatus)>& callback) {
- GetPermissionServicePtr()->GetNextPermissionChange(
- GetPermissionName(type),
- origin,
- GetPermissionStatus(status),
- base::Bind(&PermissionDispatcher::OnPermissionChangedForWorker,
- base::Unretained(this),
- worker_thread_id,
- callback));
-}
-
-// static
-void PermissionDispatcher::RunPermissionCallbackOnWorkerThread(
- std::unique_ptr<blink::WebPermissionCallback> callback,
- blink::WebPermissionStatus status) {
- callback->onSuccess(status);
-}
-
-void PermissionDispatcher::RunPermissionsCallbackOnWorkerThread(
- std::unique_ptr<blink::WebPermissionsCallback> callback,
- std::unique_ptr<blink::WebVector<blink::WebPermissionStatus>> statuses) {
- callback->onSuccess(std::move(statuses));
-}
-
-blink::mojom::PermissionService*
-PermissionDispatcher::GetPermissionServicePtr() {
- if (!permission_service_.get()) {
- remote_interfaces_->GetInterface(mojo::GetProxy(&permission_service_));
- }
- return permission_service_.get();
-}
-
-void PermissionDispatcher::QueryPermissionInternal(
- blink::WebPermissionType type,
- const std::string& origin,
- blink::WebPermissionCallback* callback,
- int worker_thread_id) {
- // We need to save the |callback| in an ScopedPtrHashMap so if |this| gets
- // deleted, the callback will not leak. In the case of |this| gets deleted,
- // the |permission_service_| pipe will be destroyed too so OnQueryPermission
- // will not be called.
- uintptr_t callback_key = reinterpret_cast<uintptr_t>(callback);
- permission_callbacks_.add(
- callback_key, std::unique_ptr<blink::WebPermissionCallback>(callback));
-
- GetPermissionServicePtr()->HasPermission(
- GetPermissionName(type),
- origin,
- base::Bind(&PermissionDispatcher::OnPermissionResponse,
- base::Unretained(this),
- worker_thread_id,
- callback_key));
-}
-
-void PermissionDispatcher::RequestPermissionInternal(
- blink::WebPermissionType type,
- const std::string& origin,
- blink::WebPermissionCallback* callback,
- int worker_thread_id) {
- // We need to save the |callback| in an ScopedPtrHashMap so if |this| gets
- // deleted, the callback will not leak. In the case of |this| gets deleted,
- // the |permission_service_| pipe will be destroyed too so OnQueryPermission
- // will not be called.
- uintptr_t callback_key = reinterpret_cast<uintptr_t>(callback);
- permission_callbacks_.add(
- callback_key, std::unique_ptr<blink::WebPermissionCallback>(callback));
-
- GetPermissionServicePtr()->RequestPermission(
- GetPermissionName(type),
- origin,
- blink::WebUserGestureIndicator::isProcessingUserGesture(),
- base::Bind(&PermissionDispatcher::OnPermissionResponse,
- base::Unretained(this),
- worker_thread_id,
- callback_key));
-}
-
-void PermissionDispatcher::RequestPermissionsInternal(
- const blink::WebVector<blink::WebPermissionType>& types,
- const std::string& origin,
- blink::WebPermissionsCallback* callback,
- int worker_thread_id) {
- // We need to save the |callback| in an ScopedVector so if |this| gets
- // deleted, the callback will not leak. In the case of |this| gets deleted,
- // the |permission_service_| pipe will be destroyed too so OnQueryPermission
- // will not be called.
- uintptr_t callback_key = reinterpret_cast<uintptr_t>(callback);
- permissions_callbacks_.add(
- callback_key, std::unique_ptr<blink::WebPermissionsCallback>(callback));
-
- mojo::Array<PermissionName> names(types.size());
- for (size_t i = 0; i < types.size(); ++i)
- names[i] = GetPermissionName(types[i]);
-
- GetPermissionServicePtr()->RequestPermissions(
- std::move(names), origin,
- blink::WebUserGestureIndicator::isProcessingUserGesture(),
- base::Bind(&PermissionDispatcher::OnRequestPermissionsResponse,
- base::Unretained(this), worker_thread_id, callback_key));
-}
-
-void PermissionDispatcher::RevokePermissionInternal(
- blink::WebPermissionType type,
- const std::string& origin,
- blink::WebPermissionCallback* callback,
- int worker_thread_id) {
- // We need to save the |callback| in an ScopedPtrHashMap so if |this| gets
- // deleted, the callback will not leak. In the case of |this| gets deleted,
- // the |permission_service_| pipe will be destroyed too so OnQueryPermission
- // will not be called.
- uintptr_t callback_key = reinterpret_cast<uintptr_t>(callback);
- permission_callbacks_.add(
- callback_key, std::unique_ptr<blink::WebPermissionCallback>(callback));
-
- GetPermissionServicePtr()->RevokePermission(
- GetPermissionName(type),
- origin,
- base::Bind(&PermissionDispatcher::OnPermissionResponse,
- base::Unretained(this),
- worker_thread_id,
- callback_key));
-}
-
-void PermissionDispatcher::OnPermissionResponse(int worker_thread_id,
- uintptr_t callback_key,
- PermissionStatus result) {
- std::unique_ptr<blink::WebPermissionCallback> callback =
- permission_callbacks_.take_and_erase(callback_key);
- blink::WebPermissionStatus status = GetWebPermissionStatus(result);
-
- if (worker_thread_id != kNoWorkerThread) {
- // If the worker is no longer running, ::PostTask() will return false and
- // gracefully fail, destroying the callback too.
- WorkerThread::PostTask(
- worker_thread_id,
- base::Bind(&PermissionDispatcher::RunPermissionCallbackOnWorkerThread,
- base::Passed(&callback), status));
- return;
- }
-
- callback->onSuccess(status);
-}
-
-void PermissionDispatcher::OnRequestPermissionsResponse(
- int worker_thread_id,
- uintptr_t callback_key,
- mojo::Array<PermissionStatus> result) {
- std::unique_ptr<blink::WebPermissionsCallback> callback =
- permissions_callbacks_.take_and_erase(callback_key);
- std::unique_ptr<blink::WebVector<blink::WebPermissionStatus>> statuses(
- new blink::WebVector<blink::WebPermissionStatus>(result.size()));
-
- for (size_t i = 0; i < result.size(); i++)
- statuses->operator[](i) = GetWebPermissionStatus(result[i]);
-
- if (worker_thread_id != kNoWorkerThread) {
- // If the worker is no longer running, ::PostTask() will return false and
- // gracefully fail, destroying the callback too.
- WorkerThread::PostTask(
- worker_thread_id,
- base::Bind(&PermissionDispatcher::RunPermissionsCallbackOnWorkerThread,
- base::Passed(&callback), base::Passed(&statuses)));
- return;
- }
-
- callback->onSuccess(std::move(statuses));
-}
-
-void PermissionDispatcher::OnPermissionChanged(blink::WebPermissionType type,
- const std::string& origin,
- WebPermissionObserver* observer,
- PermissionStatus status) {
- if (!IsObserverRegistered(observer))
- return;
-
- observer->permissionChanged(type, GetWebPermissionStatus(status));
-
- GetNextPermissionChange(type, origin, observer, status);
-}
-
-void PermissionDispatcher::OnPermissionChangedForWorker(
- int worker_thread_id,
- const base::Callback<void(blink::WebPermissionStatus)>& callback,
- PermissionStatus status) {
- DCHECK(worker_thread_id != kNoWorkerThread);
-
- WorkerThread::PostTask(worker_thread_id,
- base::Bind(callback, GetWebPermissionStatus(status)));
-}
-
-void PermissionDispatcher::GetNextPermissionChange(
- blink::WebPermissionType type,
- const std::string& origin,
- WebPermissionObserver* observer,
- PermissionStatus current_status) {
- GetPermissionServicePtr()->GetNextPermissionChange(
- GetPermissionName(type),
- origin,
- current_status,
- base::Bind(&PermissionDispatcher::OnPermissionChanged,
- base::Unretained(this),
- type,
- origin,
- base::Unretained(observer)));
-}
-
-} // namespace content
« no previous file with comments | « content/child/permissions/permission_dispatcher.h ('k') | content/child/permissions/permission_dispatcher_thread_proxy.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698