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

Unified Diff: third_party/WebKit/Source/core/html/HTMLIFrameElementPermissions.cpp

Issue 2011763006: Add an iframe permissions= attribute for implementing permission delegation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@permission-delegation-1-flag
Patch Set: Blink-side Created 4 years, 6 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: third_party/WebKit/Source/core/html/HTMLIFrameElementPermissions.cpp
diff --git a/third_party/WebKit/Source/core/html/HTMLIFrameElementPermissions.cpp b/third_party/WebKit/Source/core/html/HTMLIFrameElementPermissions.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9117c092da68ee8f861f4c538caba6d0ced9b11b
--- /dev/null
+++ b/third_party/WebKit/Source/core/html/HTMLIFrameElementPermissions.cpp
@@ -0,0 +1,103 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSDstyle license that can be
+// found in the LICENSE file.
+
+#include "core/html/HTMLIFrameElementPermissions.h"
+
+#include "core/html/HTMLIFrameElement.h"
+#include "wtf/HashMap.h"
+#include "wtf/text/StringBuilder.h"
+
+namespace blink {
+
+namespace {
+
+struct SupportedPermission {
+ const char* name;
+ WebPermissionType type;
+};
+
+const SupportedPermission kSupportedPermissions[] = {
+ { "geolocation", WebPermissionTypeGeolocation },
+ { "notifications", WebPermissionTypeNotifications },
+ { "midi", WebPermissionTypeMidiSysEx },
+};
+
+// Returns true if the name is valid and the type is stored in |result|.
+bool getPermissionType(const AtomicString& name, WebPermissionType* result)
+{
+ for (const SupportedPermission& permission : kSupportedPermissions) {
+ if (name == permission.name) {
+ if (result)
+ *result = permission.type;
+ return true;
+ }
+ }
+ return false;
+}
+
+} // namespace
+
+HTMLIFrameElementPermissions::HTMLIFrameElementPermissions(HTMLIFrameElement* element)
+ : DOMTokenList(this)
+ , m_element(element)
+{
+}
+
+HTMLIFrameElementPermissions::~HTMLIFrameElementPermissions()
+{
+}
+
+DEFINE_TRACE(HTMLIFrameElementPermissions)
+{
+ visitor->trace(m_element);
+ DOMTokenList::trace(visitor);
+ DOMTokenListObserver::trace(visitor);
+}
+
+Vector<WebPermissionType> HTMLIFrameElementPermissions::parseDelegatedPermissions(String& invalidTokensErrorMessage) const
+{
+ Vector<WebPermissionType> permissions;
+ unsigned numTokenErrors = 0;
+ StringBuilder tokenErrors;
+ const SpaceSplitString& tokens = this->tokens();
+
+ for (size_t i = 0; i < tokens.size(); ++i) {
+ WebPermissionType type;
+ if (getPermissionType(tokens[i], &type)) {
+ permissions.append(type);
+ } else {
+ if (numTokenErrors)
+ tokenErrors.append(", '");
+ else
+ tokenErrors.append('\'');
+ tokenErrors.append(tokens[i]);
+ tokenErrors.append('\'');
+ ++numTokenErrors;
+ }
+ }
+
+ if (numTokenErrors) {
+ if (numTokenErrors > 1)
+ tokenErrors.append(" are invalid permissions flags.");
+ else
+ tokenErrors.append(" is an invalid permissions flag.");
+ invalidTokensErrorMessage = tokenErrors.toString();
+ }
+
+ return permissions;
+}
+
+bool HTMLIFrameElementPermissions::validateTokenValue(const AtomicString& tokenValue, ExceptionState&) const
+{
+ WebPermissionType unused;
+ return getPermissionType(tokenValue, &unused);
+}
+
+void HTMLIFrameElementPermissions::valueWasSet()
+{
+ if (m_element)
+ m_element->permissionsValueWasSet();
+}
+
+} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698