Title: [289534] trunk
Revision
289534
Author
[email protected]
Date
2022-02-10 07:49:15 -0800 (Thu, 10 Feb 2022)

Log Message

Check for feature policy when querying permission state
https://bugs.webkit.org/show_bug.cgi?id=236299

Reviewed by Eric Carlson.

LayoutTests/imported/w3c:

* web-platform-tests/permissions/permissions-query-feature-policy-attribute.https.sub-expected.txt:

Source/WebCore:

Added feature policy check for camera, microphone and geolocation, which after https://bugs.webkit.org/show_bug.cgi?id=236292
are the only one returning anything else than NotSupported.

Covered by updated test.

* Modules/permissions/Permissions.cpp:
(WebCore::isAllowedByFeaturePolicy):
(WebCore::Permissions::query):

Modified Paths

Diff

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (289533 => 289534)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2022-02-10 15:45:10 UTC (rev 289533)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2022-02-10 15:49:15 UTC (rev 289534)
@@ -1,3 +1,12 @@
+2022-02-10  Youenn Fablet  <[email protected]>
+
+        Check for feature policy when querying permission state
+        https://bugs.webkit.org/show_bug.cgi?id=236299
+
+        Reviewed by Eric Carlson.
+
+        * web-platform-tests/permissions/permissions-query-feature-policy-attribute.https.sub-expected.txt:
+
 2022-02-10  Chris Dumez  <[email protected]>
 
         Fail synchronously when constructing a SharedWorker with an URL that is not same-origin

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/permissions/permissions-query-feature-policy-attribute.https.sub-expected.txt (289533 => 289534)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/permissions/permissions-query-feature-policy-attribute.https.sub-expected.txt	2022-02-10 15:45:10 UTC (rev 289533)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/permissions/permissions-query-feature-policy-attribute.https.sub-expected.txt	2022-02-10 15:49:15 UTC (rev 289534)
@@ -2,5 +2,5 @@
 PASS Permissions.state is "prompt" with allow="geolocation" in same-origin iframes.
 PASS Permissions.state is "prompt" with allow="geolocation" in cross-origin iframes.
 PASS Permission.state is "prompt" in same-origin iframes.
-FAIL Permission.state is "denied" in cross-origin iframes. assert_equals: navigator.permissions.query("geolocation") expected "denied" but got "prompt"
+PASS Permission.state is "denied" in cross-origin iframes.
 

Modified: trunk/Source/WebCore/ChangeLog (289533 => 289534)


--- trunk/Source/WebCore/ChangeLog	2022-02-10 15:45:10 UTC (rev 289533)
+++ trunk/Source/WebCore/ChangeLog	2022-02-10 15:49:15 UTC (rev 289534)
@@ -1,5 +1,21 @@
 2022-02-10  Youenn Fablet  <[email protected]>
 
+        Check for feature policy when querying permission state
+        https://bugs.webkit.org/show_bug.cgi?id=236299
+
+        Reviewed by Eric Carlson.
+
+        Added feature policy check for camera, microphone and geolocation, which after https://bugs.webkit.org/show_bug.cgi?id=236292
+        are the only one returning anything else than NotSupported.
+
+        Covered by updated test.
+
+        * Modules/permissions/Permissions.cpp:
+        (WebCore::isAllowedByFeaturePolicy):
+        (WebCore::Permissions::query):
+
+2022-02-10  Youenn Fablet  <[email protected]>
+
         Settling of a fetch promise should be delayed in case page is entering page cache
         https://bugs.webkit.org/show_bug.cgi?id=236292
         <rdar://88452971>

Modified: trunk/Source/WebCore/Modules/permissions/Permissions.cpp (289533 => 289534)


--- trunk/Source/WebCore/Modules/permissions/Permissions.cpp	2022-02-10 15:45:10 UTC (rev 289533)
+++ trunk/Source/WebCore/Modules/permissions/Permissions.cpp	2022-02-10 15:49:15 UTC (rev 289534)
@@ -27,6 +27,7 @@
 #include "Permissions.h"
 
 #include "Exception.h"
+#include "FeaturePolicy.h"
 #include "Frame.h"
 #include "JSDOMPromiseDeferred.h"
 #include "JSPermissionDescriptor.h"
@@ -60,6 +61,20 @@
 
 Permissions::~Permissions() = default;
 
+static bool isAllowedByFeaturePolicy(const Document& document, PermissionName name)
+{
+    switch (name) {
+    case PermissionName::Camera:
+        return isFeaturePolicyAllowedByDocumentAndAllOwners(FeaturePolicy::Type::Camera, document, LogFeaturePolicyFailure::No);
+    case PermissionName::Geolocation:
+        return isFeaturePolicyAllowedByDocumentAndAllOwners(FeaturePolicy::Type::Geolocation, document, LogFeaturePolicyFailure::No);
+    case PermissionName::Microphone:
+        return isFeaturePolicyAllowedByDocumentAndAllOwners(FeaturePolicy::Type::Microphone, document, LogFeaturePolicyFailure::No);
+    default:
+        return true;
+    }
+}
+
 void Permissions::query(JSC::Strong<JSC::JSObject> permissionDescriptorValue, DOMPromiseDeferred<IDLInterface<PermissionStatus>>&& promise)
 {
     // FIXME: support permissions in WorkerNavigator.
@@ -87,6 +102,13 @@
         return;
     }
 
+    if (is<Document>(context) && !isAllowedByFeaturePolicy(downcast<Document>(*context), parameterDescriptor.name)) {
+        context->postTask([parameterDescriptor, promise = WTFMove(promise)](auto& context) mutable {
+            promise.resolve(PermissionStatus::create(context, PermissionState::Denied, parameterDescriptor));
+        });
+        return;
+    }
+
     auto* origin = context->securityOrigin();
     auto originData = origin ? origin->data() : SecurityOriginData { };
     auto permissionState = m_controller->query(ClientOrigin { context->topOrigin().data(), originData }, PermissionDescriptor { parameterDescriptor });
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to