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

Unified Diff: third_party/WebKit/Source/modules/permissions/Permissions.cpp

Issue 2108003002: Merge //content/child/permissions into Blink's permissions module. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixing presubmits. Created 4 years, 6 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: third_party/WebKit/Source/modules/permissions/Permissions.cpp
diff --git a/third_party/WebKit/Source/modules/permissions/Permissions.cpp b/third_party/WebKit/Source/modules/permissions/Permissions.cpp
index a0530be3093ef71ecafdc7deafd483de7a9eab06..3044338aaf3f85b09c8d3b89d8e8269f26230e85 100644
--- a/third_party/WebKit/Source/modules/permissions/Permissions.cpp
+++ b/third_party/WebKit/Source/modules/permissions/Permissions.cpp
@@ -14,14 +14,15 @@
#include "core/dom/DOMException.h"
#include "core/dom/Document.h"
#include "core/dom/ExceptionCode.h"
-#include "modules/permissions/PermissionCallback.h"
-#include "modules/permissions/PermissionController.h"
+#include "core/frame/LocalFrame.h"
#include "modules/permissions/PermissionDescriptor.h"
#include "modules/permissions/PermissionStatus.h"
-#include "modules/permissions/PermissionsCallback.h"
#include "platform/Logging.h"
+#include "platform/UserGestureIndicator.h"
+#include "platform/mojo/MojoHelper.h"
#include "public/platform/Platform.h"
-#include "public/platform/modules/permissions/WebPermissionClient.h"
+#include "public/platform/ServiceRegistry.h"
+#include "wtf/Functional.h"
#include "wtf/NotFound.h"
#include "wtf/PtrUtil.h"
#include "wtf/Vector.h"
@@ -29,26 +30,29 @@
namespace blink {
+using mojom::blink::PermissionName;
+using mojom::blink::PermissionService;
+
namespace {
-WebPermissionType getPermissionType(ScriptState* scriptState, const Dictionary& rawPermission, const PermissionDescriptor& permission, ExceptionState& exceptionState)
+PermissionName getPermissionName(ScriptState* scriptState, const Dictionary& rawPermission, const PermissionDescriptor& permission, ExceptionState& exceptionState)
{
const String& name = permission.name();
if (name == "geolocation")
- return WebPermissionTypeGeolocation;
+ return PermissionName::GEOLOCATION;
if (name == "notifications")
- return WebPermissionTypeNotifications;
+ return PermissionName::NOTIFICATIONS;
if (name == "push")
- return WebPermissionTypePushNotifications;
+ return PermissionName::PUSH_NOTIFICATIONS;
if (name == "midi") {
MidiPermissionDescriptor midiPermission = NativeValueTraits<MidiPermissionDescriptor>::nativeValue(scriptState->isolate(), rawPermission.v8Value(), exceptionState);
- return midiPermission.sysex() ? WebPermissionTypeMidiSysEx : WebPermissionTypeMidi;
+ return midiPermission.sysex() ? PermissionName::MIDI_SYSEX : PermissionName::MIDI;
}
if (name == "background-sync")
- return WebPermissionTypeBackgroundSync;
+ return PermissionName::BACKGROUND_SYNC;
ASSERT_NOT_REACHED();
- return WebPermissionTypeGeolocation;
+ return PermissionName::GEOLOCATION;
}
// Parses the raw permission dictionary and returns the PermissionType if
@@ -56,62 +60,66 @@ WebPermissionType getPermissionType(ScriptState* scriptState, const Dictionary&
// |exceptionState| and null will be returned. Therefore, the |exceptionState|
// should be checked before attempting to use the returned permission as the
// non-null assert will be fired otherwise.
-Nullable<WebPermissionType> parsePermission(ScriptState* scriptState, const Dictionary rawPermission, ExceptionState& exceptionState)
+Nullable<PermissionName> parsePermission(ScriptState* scriptState, const Dictionary rawPermission, ExceptionState& exceptionState)
{
PermissionDescriptor permission = NativeValueTraits<PermissionDescriptor>::nativeValue(scriptState->isolate(), rawPermission.v8Value(), exceptionState);
if (exceptionState.hadException()) {
exceptionState.throwTypeError(exceptionState.message());
- return Nullable<WebPermissionType>();
+ return Nullable<PermissionName>();
}
- WebPermissionType type = getPermissionType(scriptState, rawPermission, permission, exceptionState);
+ PermissionName name = getPermissionName(scriptState, rawPermission, permission, exceptionState);
if (exceptionState.hadException()) {
exceptionState.throwTypeError(exceptionState.message());
- return Nullable<WebPermissionType>();
+ return Nullable<PermissionName>();
}
// Here we reject any permissions which are not yet supported by Blink.
- if (type == WebPermissionTypePushNotifications) {
+ if (name == PermissionName::PUSH_NOTIFICATIONS) {
PushPermissionDescriptor pushPermission = NativeValueTraits<PushPermissionDescriptor>::nativeValue(scriptState->isolate(), rawPermission.v8Value(), exceptionState);
if (exceptionState.hadException()) {
exceptionState.throwTypeError(exceptionState.message());
- return Nullable<WebPermissionType>();
+ return Nullable<PermissionName>();
}
// Only "userVisibleOnly" push is supported for now.
if (!pushPermission.userVisibleOnly()) {
exceptionState.throwDOMException(NotSupportedError, "Push Permission without userVisibleOnly:true isn't supported yet.");
- return Nullable<WebPermissionType>();
+ return Nullable<PermissionName>();
}
}
- return Nullable<WebPermissionType>(type);
+ return Nullable<PermissionName>(name);
}
} // anonymous namespace
// static
-WebPermissionClient* Permissions::getClient(ExecutionContext* executionContext)
+bool Permissions::connectToService(ExecutionContext* executionContext, mojom::blink::PermissionServiceRequest request)
{
+ ServiceRegistry* serviceRegistry = nullptr;
if (executionContext->isDocument()) {
Document* document = toDocument(executionContext);
- if (!document->frame())
- return nullptr;
- PermissionController* controller = PermissionController::from(*document->frame());
- return controller ? controller->client() : nullptr;
+ if (document->frame())
+ serviceRegistry = document->frame()->serviceRegistry();
+ } else {
+ serviceRegistry = Platform::current()->serviceRegistry();
}
- return Platform::current()->permissionClient();
+
+ if (serviceRegistry)
+ serviceRegistry->connectToRemoteService(std::move(request));
+ return serviceRegistry;
}
ScriptPromise Permissions::query(ScriptState* scriptState, const Dictionary& rawPermission)
{
- WebPermissionClient* client = getClient(scriptState->getExecutionContext());
- if (!client)
+ PermissionService* service = getService(scriptState->getExecutionContext());
+ if (!service)
return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(InvalidStateError, "In its current state, the global scope can't query permissions."));
ExceptionState exceptionState(ExceptionState::GetterContext, "query", "Permissions", scriptState->context()->Global(), scriptState->isolate());
- Nullable<WebPermissionType> type = parsePermission(scriptState, rawPermission, exceptionState);
+ Nullable<PermissionName> name = parsePermission(scriptState, rawPermission, exceptionState);
if (exceptionState.hadException())
return exceptionState.reject(scriptState);
@@ -122,82 +130,120 @@ ScriptPromise Permissions::query(ScriptState* scriptState, const Dictionary& raw
// meaningful value because most APIs are broken on file scheme and no
// permission prompt will be shown even if the returned permission will most
// likely be "prompt".
- client->queryPermission(type.get(), KURL(KURL(), scriptState->getExecutionContext()->getSecurityOrigin()->toString()), new PermissionCallback(resolver, type.get()));
+ service->HasPermission(name.get(), scriptState->getExecutionContext()->getSecurityOrigin()->toString(), createBaseCallback(bind(&Permissions::taskComplete, wrapPersistent(this), wrapPersistent(resolver), name.get())));
return promise;
}
ScriptPromise Permissions::request(ScriptState* scriptState, const Dictionary& rawPermission)
{
- WebPermissionClient* client = getClient(scriptState->getExecutionContext());
- if (!client)
+ PermissionService* service = getService(scriptState->getExecutionContext());
+ if (!service)
return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(InvalidStateError, "In its current state, the global scope can't request permissions."));
ExceptionState exceptionState(ExceptionState::GetterContext, "request", "Permissions", scriptState->context()->Global(), scriptState->isolate());
- Nullable<WebPermissionType> type = parsePermission(scriptState, rawPermission, exceptionState);
+ Nullable<PermissionName> name = parsePermission(scriptState, rawPermission, exceptionState);
if (exceptionState.hadException())
return exceptionState.reject(scriptState);
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
- client->requestPermission(type.get(), KURL(KURL(), scriptState->getExecutionContext()->getSecurityOrigin()->toString()), new PermissionCallback(resolver, type.get()));
+ service->RequestPermission(name.get(), scriptState->getExecutionContext()->getSecurityOrigin()->toString(), UserGestureIndicator::processingUserGesture(), createBaseCallback(bind(&Permissions::taskComplete, wrapPersistent(this), wrapPersistent(resolver), name.get())));
return promise;
}
ScriptPromise Permissions::revoke(ScriptState* scriptState, const Dictionary& rawPermission)
{
- WebPermissionClient* client = getClient(scriptState->getExecutionContext());
- if (!client)
+ PermissionService* service = getService(scriptState->getExecutionContext());
+ if (!service)
return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(InvalidStateError, "In its current state, the global scope can't revoke permissions."));
ExceptionState exceptionState(ExceptionState::GetterContext, "revoke", "Permissions", scriptState->context()->Global(), scriptState->isolate());
- Nullable<WebPermissionType> type = parsePermission(scriptState, rawPermission, exceptionState);
+ Nullable<PermissionName> name = parsePermission(scriptState, rawPermission, exceptionState);
if (exceptionState.hadException())
return exceptionState.reject(scriptState);
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
- client->revokePermission(type.get(), KURL(KURL(), scriptState->getExecutionContext()->getSecurityOrigin()->toString()), new PermissionCallback(resolver, type.get()));
+ service->RevokePermission(name.get(), scriptState->getExecutionContext()->getSecurityOrigin()->toString(), createBaseCallback(bind(&Permissions::taskComplete, wrapPersistent(this), wrapPersistent(resolver), name.get())));
return promise;
}
ScriptPromise Permissions::requestAll(ScriptState* scriptState, const Vector<Dictionary>& rawPermissions)
{
- WebPermissionClient* client = getClient(scriptState->getExecutionContext());
- if (!client)
+ PermissionService* service = getService(scriptState->getExecutionContext());
+ if (!service)
return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(InvalidStateError, "In its current state, the global scope can't request permissions."));
ExceptionState exceptionState(ExceptionState::GetterContext, "request", "Permissions", scriptState->context()->Global(), scriptState->isolate());
- std::unique_ptr<Vector<WebPermissionType>> internalPermissions = wrapUnique(new Vector<WebPermissionType>());
- std::unique_ptr<Vector<int>> callerIndexToInternalIndex = wrapUnique(new Vector<int>(rawPermissions.size()));
+ Vector<PermissionName> internalPermissions;
+ Vector<int> callerIndexToInternalIndex;
+ callerIndexToInternalIndex.resize(rawPermissions.size());
for (size_t i = 0; i < rawPermissions.size(); ++i) {
const Dictionary& rawPermission = rawPermissions[i];
- Nullable<WebPermissionType> type = parsePermission(scriptState, rawPermission, exceptionState);
+ Nullable<PermissionName> name = parsePermission(scriptState, rawPermission, exceptionState);
if (exceptionState.hadException())
return exceptionState.reject(scriptState);
// Only append permissions to the vector that is passed to the client if it is not already
// in the vector (i.e. do not duplicate permisison types).
int internalIndex;
- auto it = internalPermissions->find(type.get());
+ auto it = internalPermissions.find(name.get());
if (it == kNotFound) {
- internalIndex = internalPermissions->size();
- internalPermissions->append(type.get());
+ internalIndex = internalPermissions.size();
+ internalPermissions.append(name.get());
} else {
internalIndex = it;
}
- callerIndexToInternalIndex->operator[](i) = internalIndex;
+ callerIndexToInternalIndex[i] = internalIndex;
}
ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
- WebVector<WebPermissionType> internalWebPermissions = *internalPermissions;
- client->requestPermissions(internalWebPermissions, KURL(KURL(), scriptState->getExecutionContext()->getSecurityOrigin()->toString()),
- new PermissionsCallback(resolver, std::move(internalPermissions), std::move(callerIndexToInternalIndex)));
+ Vector<PermissionName> internalPermissionsCopy(internalPermissions);
+ service->RequestPermissions(std::move(internalPermissions), scriptState->getExecutionContext()->getSecurityOrigin()->toString(), UserGestureIndicator::processingUserGesture(),
+ createBaseCallback(bind(&Permissions::batchTaskComplete, wrapPersistent(this), wrapPersistent(resolver), std::move(internalPermissionsCopy), std::move(callerIndexToInternalIndex))));
return promise;
}
+PermissionService* Permissions::getService(ExecutionContext* executionContext)
+{
+ if (!m_service) {
+ if (connectToService(executionContext, mojo::GetProxy(&m_service)))
+ m_service.set_connection_error_handler(createBaseCallback(bind(&Permissions::serviceConnectionError, wrapWeakPersistent(this))));
mlamouri (slow - plz ping) 2016/07/18 10:25:57 See below (in Storage)
Reilly Grant (use Gerrit) 2016/07/19 20:10:28 Done.
+ }
+ return m_service.get();
+}
+
+void Permissions::serviceConnectionError()
+{
+ m_service.reset();
+}
+
+void Permissions::taskComplete(ScriptPromiseResolver* resolver, PermissionName name, mojom::blink::PermissionStatus result)
+{
+ if (!resolver->getExecutionContext() || resolver->getExecutionContext()->activeDOMObjectsAreStopped())
+ return;
+ resolver->resolve(PermissionStatus::take(resolver, result, name));
+}
+
+void Permissions::batchTaskComplete(ScriptPromiseResolver* resolver, Vector<PermissionName> names, Vector<int> callerIndexToInternalIndex, mojo::WTFArray<mojom::blink::PermissionStatus> results)
+{
+ if (!resolver->getExecutionContext() || resolver->getExecutionContext()->activeDOMObjectsAreStopped())
+ return;
+
+ // Create the response vector by finding the status for each index by
+ // using the caller to internal index mapping and looking up the status
+ // using the internal index obtained.
+ HeapVector<Member<PermissionStatus>> result(callerIndexToInternalIndex.size());
esprehn 2016/07/19 04:00:05 this is actually calling the default constructor,
Reilly Grant (use Gerrit) 2016/07/19 20:10:28 Done.
+ for (size_t i = 0; i < callerIndexToInternalIndex.size(); ++i) {
+ int internalIndex = callerIndexToInternalIndex[i];
+ result[i] = PermissionStatus::createAndListen(resolver->getExecutionContext(), results[internalIndex], names[internalIndex]);
+ }
+ resolver->resolve(result);
+}
+
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698