OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "config.h" | 5 #include "config.h" |
6 #include "modules/permissions/Permissions.h" | 6 #include "modules/permissions/Permissions.h" |
7 | 7 |
8 #include "bindings/core/v8/ScriptPromise.h" | 8 #include "bindings/core/v8/ScriptPromise.h" |
9 #include "bindings/core/v8/ScriptPromiseResolver.h" | 9 #include "bindings/core/v8/ScriptPromiseResolver.h" |
| 10 #include "bindings/modules/v8/V8MidiPermissionDescriptor.h" |
| 11 #include "bindings/modules/v8/V8PermissionDescriptor.h" |
| 12 #include "bindings/modules/v8/V8PushPermissionDescriptor.h" |
10 #include "core/dom/DOMException.h" | 13 #include "core/dom/DOMException.h" |
11 #include "core/dom/Document.h" | 14 #include "core/dom/Document.h" |
12 #include "core/dom/ExceptionCode.h" | 15 #include "core/dom/ExceptionCode.h" |
13 #include "modules/permissions/PermissionController.h" | 16 #include "modules/permissions/PermissionController.h" |
| 17 #include "modules/permissions/PermissionDescriptor.h" |
14 #include "modules/permissions/PermissionQueryCallback.h" | 18 #include "modules/permissions/PermissionQueryCallback.h" |
| 19 #include "modules/permissions/PermissionStatus.h" |
15 #include "public/platform/Platform.h" | 20 #include "public/platform/Platform.h" |
16 #include "public/platform/modules/permissions/WebPermissionClient.h" | 21 #include "public/platform/modules/permissions/WebPermissionClient.h" |
17 | 22 |
18 namespace blink { | 23 namespace blink { |
19 | 24 |
20 namespace { | 25 namespace { |
21 | 26 |
22 WebPermissionClient* permissionClient(ExecutionContext* executionContext) | 27 WebPermissionClient* permissionClient(ExecutionContext* executionContext) |
23 { | 28 { |
24 if (executionContext->isDocument()) { | 29 if (executionContext->isDocument()) { |
25 Document* document = toDocument(executionContext); | 30 Document* document = toDocument(executionContext); |
26 if (!document->frame()) | 31 if (!document->frame()) |
27 return nullptr; | 32 return nullptr; |
28 PermissionController* controller = PermissionController::from(*document-
>frame()); | 33 PermissionController* controller = PermissionController::from(*document-
>frame()); |
29 return controller ? controller->client() : nullptr; | 34 return controller ? controller->client() : nullptr; |
30 } | 35 } |
31 return Platform::current()->permissionClient(); | 36 return Platform::current()->permissionClient(); |
32 } | 37 } |
33 | 38 |
34 } // anonymous namespace | 39 } // anonymous namespace |
35 | 40 |
36 ScriptPromise Permissions::query(ScriptState* scriptState, const AtomicString& p
ermissionName) | 41 ScriptPromise Permissions::query(ScriptState* scriptState, const ScriptValue& ra
wPermission) |
37 { | 42 { |
38 WebPermissionClient* client = permissionClient(scriptState->executionContext
()); | 43 WebPermissionClient* client = permissionClient(scriptState->executionContext
()); |
39 if (!client) | 44 if (!client) |
40 return ScriptPromise::rejectWithDOMException(scriptState, DOMException::
create(InvalidStateError, "In its current state, the global scope can't query pe
rmissions.")); | 45 return ScriptPromise::rejectWithDOMException(scriptState, DOMException::
create(InvalidStateError, "In its current state, the global scope can't query pe
rmissions.")); |
41 | 46 |
| 47 TrackExceptionState exceptionState; |
| 48 PermissionDescriptor permission = NativeValueTraits<PermissionDescriptor>::n
ativeValue(scriptState->isolate(), rawPermission.v8Value(), exceptionState); |
| 49 |
| 50 |
| 51 if (exceptionState.hadException()) |
| 52 return ScriptPromise::reject(scriptState, v8::Exception::TypeError(v8Str
ing(scriptState->isolate(), exceptionState.message()))); |
| 53 if (!permission.hasName()) |
| 54 return ScriptPromise::reject(scriptState, v8::Exception::TypeError(v8Str
ing(scriptState->isolate(), "'name' is a required property."))); |
| 55 |
| 56 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip
tState); |
| 57 ScriptPromise promise = resolver->promise(); |
| 58 |
| 59 String name = permission.name(); |
42 WebPermissionType type; | 60 WebPermissionType type; |
43 if (permissionName == "geolocation") { | 61 if (name == "geolocation") { |
44 type = WebPermissionTypeGeolocation; | 62 type = WebPermissionTypeGeolocation; |
45 } else if (permissionName == "notifications") { | 63 } else if (name == "notifications") { |
46 type = WebPermissionTypeNotifications; | 64 type = WebPermissionTypeNotifications; |
47 } else if (permissionName == "push-notifications") { | 65 } else if (name == "push") { |
| 66 PushPermissionDescriptor pushPermission = NativeValueTraits<PushPermissi
onDescriptor>::nativeValue(scriptState->isolate(), rawPermission.v8Value(), exce
ptionState); |
| 67 // The only "userVisible" push is supported for now. |
| 68 if (!pushPermission.userVisible()) { |
| 69 resolver->resolve(new PermissionStatus(scriptState->executionContext
(), WebPermissionStatusDenied)); |
| 70 return promise; |
| 71 } |
48 type = WebPermissionTypePushNotifications; | 72 type = WebPermissionTypePushNotifications; |
49 } else if (permissionName == "midi-sysex") { | 73 } else if (name == "midi") { |
| 74 MidiPermissionDescriptor midiPermission = NativeValueTraits<MidiPermissi
onDescriptor>::nativeValue(scriptState->isolate(), rawPermission.v8Value(), exce
ptionState); |
| 75 // Only sysex usage requires a permission for now. |
| 76 if (!midiPermission.sysex()) { |
| 77 resolver->resolve(new PermissionStatus(scriptState->executionContext
(), WebPermissionStatusGranted)); |
| 78 return promise; |
| 79 } |
50 type = WebPermissionTypeMidiSysEx; | 80 type = WebPermissionTypeMidiSysEx; |
51 } else { | 81 } else { |
52 ASSERT_NOT_REACHED(); | 82 ASSERT_NOT_REACHED(); |
53 type = WebPermissionTypeGeolocation; | 83 type = WebPermissionTypeGeolocation; |
54 } | 84 } |
55 | 85 |
56 RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scrip
tState); | |
57 ScriptPromise promise = resolver->promise(); | |
58 | |
59 // If the current origin is a file scheme, it will unlikely return a | 86 // If the current origin is a file scheme, it will unlikely return a |
60 // meaningful value because most APIs are broken on file scheme and no | 87 // meaningful value because most APIs are broken on file scheme and no |
61 // permission prompt will be shown even if the returned permission will most | 88 // permission prompt will be shown even if the returned permission will most |
62 // likely be "prompt". | 89 // likely be "prompt". |
63 client->queryPermission(type, KURL(KURL(), scriptState->executionContext()->
securityOrigin()->toString()), new PermissionQueryCallback(resolver, type)); | 90 client->queryPermission(type, KURL(KURL(), scriptState->executionContext()->
securityOrigin()->toString()), new PermissionQueryCallback(resolver, type)); |
64 return promise; | 91 return promise; |
65 } | 92 } |
66 | 93 |
67 } // namespace blink | 94 } // namespace blink |
OLD | NEW |