| 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
|
|
|