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

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

Issue 1045283002: Implement PermissionDescriptor usage in Permissions API. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: no find copies Created 5 years, 9 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: Source/modules/permissions/Permissions.cpp
diff --git a/Source/modules/permissions/Permissions.cpp b/Source/modules/permissions/Permissions.cpp
index 17160526a4212012e7cf66738de554b1c32ff637..0fdb4d44b5e335c9a03b5f11e047e8eb1c72a1aa 100644
--- a/Source/modules/permissions/Permissions.cpp
+++ b/Source/modules/permissions/Permissions.cpp
@@ -7,11 +7,16 @@
#include "bindings/core/v8/ScriptPromise.h"
#include "bindings/core/v8/ScriptPromiseResolver.h"
+#include "bindings/modules/v8/V8MidiPermissionDescriptor.h"
+#include "bindings/modules/v8/V8PermissionDescriptor.h"
+#include "bindings/modules/v8/V8PushPermissionDescriptor.h"
#include "core/dom/DOMException.h"
#include "core/dom/Document.h"
#include "core/dom/ExceptionCode.h"
#include "modules/permissions/PermissionController.h"
+#include "modules/permissions/PermissionDescriptor.h"
#include "modules/permissions/PermissionQueryCallback.h"
+#include "modules/permissions/PermissionStatus.h"
#include "public/platform/Platform.h"
#include "public/platform/modules/permissions/WebPermissionClient.h"
@@ -33,29 +38,51 @@ WebPermissionClient* permissionClient(ExecutionContext* executionContext)
} // anonymous namespace
-ScriptPromise Permissions::query(ScriptState* scriptState, const AtomicString& permissionName)
+ScriptPromise Permissions::query(ScriptState* scriptState, const ScriptValue& rawPermission)
{
WebPermissionClient* client = permissionClient(scriptState->executionContext());
if (!client)
return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(InvalidStateError, "In its current state, the global scope can't query permissions."));
+ TrackExceptionState exceptionState;
+ PermissionDescriptor permission = NativeValueTraits<PermissionDescriptor>::nativeValue(scriptState->isolate(), rawPermission.v8Value(), exceptionState);
+
+
+ if (exceptionState.hadException())
+ return ScriptPromise::reject(scriptState, v8::Exception::TypeError(v8String(scriptState->isolate(), exceptionState.message())));
+ if (!permission.hasName())
+ return ScriptPromise::reject(scriptState, v8::Exception::TypeError(v8String(scriptState->isolate(), "'name' is a required property.")));
+
+ RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
+ ScriptPromise promise = resolver->promise();
+
+ String name = permission.name();
WebPermissionType type;
- if (permissionName == "geolocation") {
+ if (name == "geolocation") {
type = WebPermissionTypeGeolocation;
- } else if (permissionName == "notifications") {
+ } else if (name == "notifications") {
type = WebPermissionTypeNotifications;
- } else if (permissionName == "push-notifications") {
+ } else if (name == "push") {
+ PushPermissionDescriptor pushPermission = NativeValueTraits<PushPermissionDescriptor>::nativeValue(scriptState->isolate(), rawPermission.v8Value(), exceptionState);
+ // The only "userVisible" push is supported for now.
+ if (!pushPermission.userVisible()) {
+ resolver->resolve(new PermissionStatus(scriptState->executionContext(), WebPermissionStatusDenied));
+ return promise;
+ }
type = WebPermissionTypePushNotifications;
- } else if (permissionName == "midi-sysex") {
+ } else if (name == "midi") {
+ MidiPermissionDescriptor midiPermission = NativeValueTraits<MidiPermissionDescriptor>::nativeValue(scriptState->isolate(), rawPermission.v8Value(), exceptionState);
+ // Only sysex usage requires a permission for now.
+ if (!midiPermission.sysex()) {
+ resolver->resolve(new PermissionStatus(scriptState->executionContext(), WebPermissionStatusGranted));
+ return promise;
+ }
type = WebPermissionTypeMidiSysEx;
} else {
ASSERT_NOT_REACHED();
type = WebPermissionTypeGeolocation;
}
- RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
- ScriptPromise promise = resolver->promise();
-
// If the current origin is a file scheme, it will unlikely return a
// meaningful value because most APIs are broken on file scheme and no
// permission prompt will be shown even if the returned permission will most

Powered by Google App Engine
This is Rietveld 408576698