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

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

Issue 1234023002: blink: permissions: add plumbing to revoke permissions (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Add Runtime flag for permissions Created 5 years, 5 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 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

Powered by Google App Engine
This is Rietveld 408576698