Chromium Code Reviews| Index: Source/modules/permissions/Permissions.cpp |
| diff --git a/Source/modules/permissions/Permissions.cpp b/Source/modules/permissions/Permissions.cpp |
| index 013111d01a81a1e106a947bbe7f3db360b2772df..9d8242cb23c464f1c4bbb05a6de99d8c857485da 100644 |
| --- a/Source/modules/permissions/Permissions.cpp |
| +++ b/Source/modules/permissions/Permissions.cpp |
| @@ -13,9 +13,9 @@ |
| #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 "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" |
| @@ -36,6 +36,27 @@ WebPermissionClient* permissionClient(ExecutionContext* executionContext) |
| return Platform::current()->permissionClient(); |
| } |
| +bool quickHandlePermissions( |
|
mlamouri (slow - plz ping)
2015/07/17 13:16:18
Could you call that "handleDefaultBehaviour()" and
Lalit Maganti
2015/07/17 13:47:35
Done. The name you suggest is nice - I couldn't re
|
| + ScriptState* scriptState, const ScriptValue& rawPermission, PassRefPtr<ScriptPromiseResolver> resolver, WebPermissionType type, TrackExceptionState& exceptionState) |
| +{ |
| + if (type == WebPermissionTypePushNotifications) { |
| + PushPermissionDescriptor pushPermission = NativeValueTraits<PushPermissionDescriptor>::nativeValue(scriptState->isolate(), rawPermission.v8Value(), exceptionState); |
| + // Only "userVisibleOnly" push is supported for now. |
| + if (!pushPermission.userVisibleOnly()) { |
| + resolver->reject(DOMException::create(NotSupportedError, "Push Permission without userVisibleOnly:true isn't supported yet.")); |
| + return true; |
| + } |
| + } else if (type == WebPermissionTypeMidiSysEx) { |
| + MidiPermissionDescriptor midiPermission = NativeValueTraits<MidiPermissionDescriptor>::nativeValue(scriptState->isolate(), rawPermission.v8Value(), exceptionState); |
| + // Only sysex usage requires a permission, otherwise it is granted. |
| + if (!midiPermission.sysex()) { |
| + resolver->resolve(PermissionStatus::create(scriptState->executionContext(), WebPermissionStatusGranted, WebPermissionTypeMidi)); |
| + return true; |
| + } |
| + } |
| + return false; |
| +} |
| + |
| } // anonymous namespace |
| ScriptPromise Permissions::query(ScriptState* scriptState, const ScriptValue& rawPermission) |
| @@ -55,38 +76,59 @@ ScriptPromise Permissions::query(ScriptState* scriptState, const ScriptValue& ra |
| ScriptPromise promise = resolver->promise(); |
| String name = permission.name(); |
| - WebPermissionType type; |
| - if (name == "geolocation") { |
| - type = WebPermissionTypeGeolocation; |
| - } else if (name == "notifications") { |
| - type = WebPermissionTypeNotifications; |
| - } else if (name == "push") { |
| - PushPermissionDescriptor pushPermission = NativeValueTraits<PushPermissionDescriptor>::nativeValue(scriptState->isolate(), rawPermission.v8Value(), exceptionState); |
| - // Only "userVisibleOnly" push is supported for now. |
| - if (!pushPermission.userVisibleOnly()) { |
| - resolver->reject(DOMException::create(NotSupportedError, "Push Permission without userVisibleOnly:true isn't supported yet.")); |
| - return promise; |
| - } |
| - type = WebPermissionTypePushNotifications; |
| - } else if (name == "midi") { |
| - MidiPermissionDescriptor midiPermission = NativeValueTraits<MidiPermissionDescriptor>::nativeValue(scriptState->isolate(), rawPermission.v8Value(), exceptionState); |
| - // Only sysex usage requires a permission, otherwise it is granted. |
| - if (!midiPermission.sysex()) { |
| - resolver->resolve(PermissionStatus::create(scriptState->executionContext(), WebPermissionStatusGranted, WebPermissionTypeMidi)); |
| - return promise; |
| - } |
| - type = WebPermissionTypeMidiSysEx; |
| - } else { |
| - ASSERT_NOT_REACHED(); |
| - type = WebPermissionTypeGeolocation; |
| - } |
| + WebPermissionType type = convertPermissionStringToType(name); |
| + bool handled = quickHandlePermissions(scriptState, rawPermission, resolver, type, exceptionState); |
| + |
| + if (handled) |
| + return promise; |
|
mlamouri (slow - plz ping)
2015/07/17 13:16:18
if (handleDefaultBehaviour(...))
return promis
Lalit Maganti
2015/07/17 13:47:35
Done. This is a pattern I've got to get used to.
|
| // 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 |
| // likely be "prompt". |
| - client->queryPermission(type, KURL(KURL(), scriptState->executionContext()->securityOrigin()->toString()), new PermissionQueryCallback(resolver, type)); |
| + client->queryPermission(type, KURL(KURL(), scriptState->executionContext()->securityOrigin()->toString()), new PermissionCallback(resolver, type)); |
| + return promise; |
| +} |
| + |
| +ScriptPromise Permissions::revoke(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 revoke 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()))); |
| + |
| + RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState); |
| + ScriptPromise promise = resolver->promise(); |
| + |
| + String name = permission.name(); |
| + WebPermissionType type = convertPermissionStringToType(name); |
| + bool handled = quickHandlePermissions(scriptState, rawPermission, resolver, type, exceptionState); |
| + |
| + if (handled) |
| + return promise; |
|
mlamouri (slow - plz ping)
2015/07/17 13:16:18
ditto
Lalit Maganti
2015/07/17 13:47:35
Done.
|
| + |
| + client->revokePermission(type, KURL(KURL(), scriptState->executionContext()->securityOrigin()->toString()), new PermissionCallback(resolver, type)); |
| return promise; |
| } |
| +WebPermissionType Permissions::convertPermissionStringToType(const String& name) |
| +{ |
| + if (name == "geolocation") |
| + return WebPermissionTypeGeolocation; |
| + if (name == "notifications") |
| + return WebPermissionTypeNotifications; |
| + if (name == "push") |
| + return WebPermissionTypePushNotifications; |
| + if (name == "midi") |
| + return WebPermissionTypeMidiSysEx; |
| + |
| + ASSERT_NOT_REACHED(); |
| + return WebPermissionTypeGeolocation; |
| +} |
| + |
| } // namespace blink |