From 95606b13126e82a5cf2534a05e107d0aa69ccc0a Mon Sep 17 00:00:00 2001 From: Chris Dumez Date: Thu, 29 Sep 2022 19:25:22 -0700 Subject: [PATCH] [WK2] Add initial implementation the Screen Wake Lock API behind an experimental flag https://bugs.webkit.org/show_bug.cgi?id=245712 Reviewed by Alex Christensen, Brent Fulgham and Geoffrey Garen. Add initial implementation the Screen Wake Lock API for WebKit2, behind an experimental flag: - https://w3c.github.io/screen-wake-lock The implementation should be complete but it is currently behind an experimental feature flag that is off by default. Some tests are still failing. The reason for that seems to be that our support for Feature Policy is only partial. In particular, we seem to support the `allow` attribute on iframes but not the Feature-Policy HTTP header. We also have to make a decision about whether or not we want to prompt the user when the Website tries to take a screen wake lock and if we need an indicator in the browser UI. Currently, my implementation only requires a user gesture. * LayoutTests/TestExpectations: * LayoutTests/imported/w3c/web-platform-tests/feature-policy/resources/feature-policy-screen-wakelock.html: Added. * LayoutTests/imported/w3c/web-platform-tests/feature-policy/resources/featurepolicy.js: (expect_reports): * LayoutTests/imported/w3c/web-platform-tests/resources/testdriver-vendor.js: (window.test_driver_internal.set_permission): * LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/idlharness.https.window-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-active-document.https.window-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-disabled-by-feature-policy.https.sub-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-disabled-by-feature-policy.https.sub.html: * LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-enabled-by-feature-policy-attribute-redirect-on-load.https.sub-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-enabled-by-feature-policy-attribute-redirect-on-load.https.sub.html: * LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-enabled-by-feature-policy-attribute.https.sub-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-enabled-by-feature-policy-attribute.https.sub.html: * LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-enabled-by-feature-policy.https.sub-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-enabled-by-feature-policy.https.sub.html: * LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-enabled-on-self-origin-by-feature-policy.https.sub-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-enabled-on-self-origin-by-feature-policy.https.sub.html: * LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-onrelease.https-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-released.https-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-request-denied.https-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-type.https.window-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelockpermissiondescriptor.https-expected.txt: * LayoutTests/platform/mac-wk1/TestExpectations: * LayoutTests/platform/win/TestExpectations: * Source/WebCore/Modules/permissions/PermissionName.h: * Source/WebCore/Modules/permissions/PermissionName.idl: * Source/WebCore/Modules/screen-wake-lock/NavigatorScreenWakeLock.cpp: (WebCore::NavigatorScreenWakeLock::NavigatorScreenWakeLock): (WebCore::NavigatorScreenWakeLock::wakeLock): * Source/WebCore/Modules/screen-wake-lock/NavigatorScreenWakeLock.h: * Source/WebCore/Modules/screen-wake-lock/WakeLock.cpp: (WebCore::WakeLock::WakeLock): (WebCore::WakeLock::request): (WebCore::WakeLock::document): * Source/WebCore/Modules/screen-wake-lock/WakeLock.h: (WebCore::WakeLock::create): * Source/WebCore/Modules/screen-wake-lock/WakeLockManager.cpp: Added. (WebCore::WakeLockManager::WakeLockManager): (WebCore::WakeLockManager::~WakeLockManager): (WebCore::WakeLockManager::addWakeLock): (WebCore::WakeLockManager::removeWakeLock): (WebCore::WakeLockManager::visibilityStateChanged): (WebCore::WakeLockManager::releaseAllLocks): * Source/WebCore/Modules/screen-wake-lock/WakeLockManager.h: Copied from Source/WebCore/Modules/screen-wake-lock/WakeLock.h. * Source/WebCore/Modules/screen-wake-lock/WakeLockSentinel.cpp: (WebCore::WakeLockSentinel::release): (WebCore::WakeLockSentinel::virtualHasPendingActivity const): (WebCore::WakeLockSentinel::eventListenersDidChange): (WebCore::WakeLockSentinel::wakeLockManager): * Source/WebCore/Modules/screen-wake-lock/WakeLockSentinel.h: * Source/WebCore/Modules/screen-wake-lock/WakeLockType.h: * Source/WebCore/Sources.txt: * Source/WebCore/WebCore.xcodeproj/project.pbxproj: * Source/WebCore/dom/Document.cpp: (WebCore::Document::wakeLockManager): (WebCore::Document::stopActiveDOMObjects): * Source/WebCore/dom/Document.h: * Source/WebCore/dom/TaskSource.h: * Source/WebCore/html/FeaturePolicy.cpp: (WebCore::policyTypeName): (WebCore::FeaturePolicy::parse): (WebCore::FeaturePolicy::allows const): * Source/WebCore/html/FeaturePolicy.h: * Source/WebKit/UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::queryPermission): * Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl: * Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.cpp: (WTR::InjectedBundle::setScreenWakeLockPermission): * Tools/WebKitTestRunner/InjectedBundle/InjectedBundle.h: * Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp: (WTR::TestRunner::setScreenWakeLockPermission): * Tools/WebKitTestRunner/InjectedBundle/TestRunner.h: * Tools/WebKitTestRunner/TestController.cpp: (WTR::TestController::handleQueryPermission): (WTR::TestController::resetStateToConsistentValues): (WTR::TestController::setScreenWakeLockPermission): * Tools/WebKitTestRunner/TestController.h: * Tools/WebKitTestRunner/TestInvocation.cpp: (WTR::TestInvocation::didReceiveMessageFromInjectedBundle): Canonical link: https://commits.webkit.org/255019@main --- LayoutTests/TestExpectations | 9 +- .../feature-policy-screen-wakelock.html | 18 +++ .../feature-policy/resources/featurepolicy.js | 18 ++- .../permissions/all-permissions-expected.txt | 2 +- .../resources/testdriver-vendor.js | 4 + .../idlharness.https.window-expected.txt | 14 +-- ...-active-document.https.window-expected.txt | 4 +- ...d-by-feature-policy.https.sub-expected.txt | 9 +- ...-disabled-by-feature-policy.https.sub.html | 3 +- ...te-redirect-on-load.https.sub-expected.txt | 7 +- ...-attribute-redirect-on-load.https.sub.html | 3 +- ...re-policy-attribute.https.sub-expected.txt | 8 +- ...by-feature-policy-attribute.https.sub.html | 3 +- ...d-by-feature-policy.https.sub-expected.txt | 10 +- ...k-enabled-by-feature-policy.https.sub.html | 3 +- ...n-by-feature-policy.https.sub-expected.txt | 10 +- ...lf-origin-by-feature-policy.https.sub.html | 3 +- .../wakelock-onrelease.https-expected.txt | 4 +- .../wakelock-released.https-expected.txt | 2 +- ...wakelock-request-denied.https-expected.txt | 2 +- .../wakelock-type.https.window-expected.txt | 2 +- ...ockpermissiondescriptor.https-expected.txt | 2 +- LayoutTests/platform/mac-wk1/TestExpectations | 3 + LayoutTests/platform/win/TestExpectations | 3 + .../Modules/permissions/PermissionName.h | 2 + .../Modules/permissions/PermissionName.idl | 1 + .../NavigatorScreenWakeLock.cpp | 5 +- .../NavigatorScreenWakeLock.h | 1 + .../Modules/screen-wake-lock/WakeLock.cpp | 62 ++++++++++- .../Modules/screen-wake-lock/WakeLock.h | 12 +- .../screen-wake-lock/WakeLockManager.cpp | 105 ++++++++++++++++++ .../screen-wake-lock/WakeLockManager.h | 58 ++++++++++ .../screen-wake-lock/WakeLockSentinel.cpp | 30 ++++- .../screen-wake-lock/WakeLockSentinel.h | 5 + .../Modules/screen-wake-lock/WakeLockType.h | 2 +- Source/WebCore/Sources.txt | 1 + .../WebCore/WebCore.xcodeproj/project.pbxproj | 6 + Source/WebCore/dom/Document.cpp | 12 ++ Source/WebCore/dom/Document.h | 4 + Source/WebCore/dom/TaskSource.h | 1 + Source/WebCore/html/FeaturePolicy.cpp | 14 ++- Source/WebCore/html/FeaturePolicy.h | 2 + Source/WebKit/UIProcess/WebPageProxy.cpp | 3 + .../InjectedBundle/Bindings/TestRunner.idl | 3 + .../InjectedBundle/InjectedBundle.cpp | 5 + .../InjectedBundle/InjectedBundle.h | 3 + .../InjectedBundle/TestRunner.cpp | 5 + .../InjectedBundle/TestRunner.h | 3 + Tools/WebKitTestRunner/TestController.cpp | 18 +++ Tools/WebKitTestRunner/TestController.h | 4 + Tools/WebKitTestRunner/TestInvocation.cpp | 5 + 51 files changed, 436 insertions(+), 82 deletions(-) create mode 100644 LayoutTests/imported/w3c/web-platform-tests/feature-policy/resources/feature-policy-screen-wakelock.html create mode 100644 Source/WebCore/Modules/screen-wake-lock/WakeLockManager.cpp create mode 100644 Source/WebCore/Modules/screen-wake-lock/WakeLockManager.h diff --git a/LayoutTests/TestExpectations b/LayoutTests/TestExpectations index 9b7ce3f51ce63..1f14d9683dc57 100644 --- a/LayoutTests/TestExpectations +++ b/LayoutTests/TestExpectations @@ -462,6 +462,8 @@ imported/w3c/web-platform-tests/html/webappapis/timers/negative-settimeout.any.w imported/w3c/web-platform-tests/html/webappapis/user-prompts/print-during-beforeunload.html [ DumpJSConsoleLogInStdErr ] imported/w3c/web-platform-tests/mixed-content/gen/top.http-rp/opt-in/xhr.https.html [ DumpJSConsoleLogInStdErr ] imported/w3c/web-platform-tests/notifications/instance.https.html [ DumpJSConsoleLogInStdErr ] +imported/w3c/web-platform-tests/screen-wake-lock/wakelock-disabled-by-feature-policy.https.sub.html [ DumpJSConsoleLogInStdErr ] +imported/w3c/web-platform-tests/screen-wake-lock/wakelock-enabled-on-self-origin-by-feature-policy.https.sub.html [ DumpJSConsoleLogInStdErr ] imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-resources.https.html [ DumpJSConsoleLogInStdErr ] imported/w3c/web-platform-tests/streams/readable-streams/patched-global.any.html [ DumpJSConsoleLogInStdErr ] imported/w3c/web-platform-tests/streams/transform-streams/terminate.any.html [ DumpJSConsoleLogInStdErr ] @@ -6026,13 +6028,6 @@ imported/w3c/web-platform-tests/html/semantics/scripting-1/the-script-element/js webkit.org/b/245164 css3/scroll-snap/scroll-snap-drag-scrollbar-thumb-with-relayouts.html [ Failure Pass ] -# Screen Wake Lock tests that are timing out since their import. -imported/w3c/web-platform-tests/screen-wake-lock/wakelock-disabled-by-feature-policy.https.sub.html [ Skip ] -imported/w3c/web-platform-tests/screen-wake-lock/wakelock-enabled-by-feature-policy-attribute-redirect-on-load.https.sub.html [ Skip ] -imported/w3c/web-platform-tests/screen-wake-lock/wakelock-enabled-by-feature-policy-attribute.https.sub.html [ Skip ] -imported/w3c/web-platform-tests/screen-wake-lock/wakelock-enabled-by-feature-policy.https.sub.html [ Skip ] -imported/w3c/web-platform-tests/screen-wake-lock/wakelock-enabled-on-self-origin-by-feature-policy.https.sub.html [ Skip ] - # Disable ShadowRealm (while running to ensure we do not crash) webkit.org/b/245680 http/tests/misc/iframe-shadow-realm.html [ Skip ] inspector/shadow-realm-console.html [ Pass Failure ] diff --git a/LayoutTests/imported/w3c/web-platform-tests/feature-policy/resources/feature-policy-screen-wakelock.html b/LayoutTests/imported/w3c/web-platform-tests/feature-policy/resources/feature-policy-screen-wakelock.html new file mode 100644 index 0000000000000..6feed51d49865 --- /dev/null +++ b/LayoutTests/imported/w3c/web-platform-tests/feature-policy/resources/feature-policy-screen-wakelock.html @@ -0,0 +1,18 @@ + + + diff --git a/LayoutTests/imported/w3c/web-platform-tests/feature-policy/resources/featurepolicy.js b/LayoutTests/imported/w3c/web-platform-tests/feature-policy/resources/featurepolicy.js index 9aba0ab8c6753..864c434c6633c 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/feature-policy/resources/featurepolicy.js +++ b/LayoutTests/imported/w3c/web-platform-tests/feature-policy/resources/featurepolicy.js @@ -13,9 +13,9 @@ function assert_feature_policy_supported() { // "/feature-policy/resources/feature-policy-payment.html", // "/feature-policy/resources/feature-policy-usb.html". // expect_feature_available: a callback(data, feature_description) to -// verify if a feature is avaiable or unavailable as expected. +// verify if a feature is available or unavailable as expected. // The file under the path "src" defines what "data" is sent back as a -// pistMessage. Inside the callback, some tests (e.g., EXPECT_EQ, +// postMessage. Inside the callback, some tests (e.g., EXPECT_EQ, // EXPECT_TRUE, etc) are run accordingly to test a feature's // availability. // Example: expect_feature_available_default(data, feature_description). @@ -24,8 +24,8 @@ function assert_feature_policy_supported() { // feature (https://wicg.github.io/feature-policy/#features). // See examples at: // https://github.com/WICG/feature-policy/blob/master/features.md -// allow_attribute: Optional argument, only used for testing fullscreen or -// payment: either "allowfullscreen" or "allowpaymentrequest" is passed. +// allow_attribute: Optional argument, only used for testing fullscreen: +// "allowfullscreen" function test_feature_availability( feature_description, test, src, expect_feature_available, feature_name, allow_attribute) { @@ -354,13 +354,9 @@ function test_subframe_header_policy( assert_feature_policy_supported() frame.src = src + '?pipe=sub|header(Feature-Policy,' + feature + ' ' + frame_header_policy + ';)'; - return new Promise(function(resolve, reject) { - let results = []; + return new Promise(function(resolve) { window.addEventListener('message', function handler(evt) { - results.push(evt.data); - if (results.length >= 6) { - resolve(results); - } + resolve(evt.data); }); document.body.appendChild(frame); }).then(function(results) { @@ -453,6 +449,6 @@ function expect_reports(report_count, policy_name, description) { if (num_received_reports >= report_count) { t.done(); } - }), {types: ['feature-policy-violation'], buffered: true}).observe(); + }), {types: ['permissions-policy-violation'], buffered: true}).observe(); }, description); } diff --git a/LayoutTests/imported/w3c/web-platform-tests/permissions/all-permissions-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/permissions/all-permissions-expected.txt index 638f014edd60e..9b1ad89ce3061 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/permissions/all-permissions-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/permissions/all-permissions-expected.txt @@ -12,7 +12,7 @@ FAIL Query "gyroscope" permission promise_test: Unhandled rejection with value: FAIL Query "magnetometer" permission promise_test: Unhandled rejection with value: object "NotSupportedError: Permissions::query does not support this API" FAIL Query "midi" permission promise_test: Unhandled rejection with value: object "NotSupportedError: Permissions::query does not support this API" FAIL Query "nfc" permission promise_test: Unhandled rejection with value: object "NotSupportedError: Permissions::query does not support this API" -FAIL Query "screen-wake-lock" permission promise_test: Unhandled rejection with value: object "TypeError: Type error" +PASS Query "screen-wake-lock" permission PASS Query "camera" permission FAIL Query "display-capture" permission promise_test: Unhandled rejection with value: object "NotSupportedError: Permissions::query does not support this API" PASS Query "microphone" permission diff --git a/LayoutTests/imported/w3c/web-platform-tests/resources/testdriver-vendor.js b/LayoutTests/imported/w3c/web-platform-tests/resources/testdriver-vendor.js index e51a1f90a645b..8e2307f84b98e 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/resources/testdriver-vendor.js +++ b/LayoutTests/imported/w3c/web-platform-tests/resources/testdriver-vendor.js @@ -305,6 +305,10 @@ window.test_driver_internal.set_permission = function(permission_params, context testRunner.setGeolocationPermission(permission_params.state == "granted"); return Promise.resolve(); } + if (window.testRunner && permission_params.descriptor.name == "screen-wake-lock") { + testRunner.setScreenWakeLockPermission(permission_params.state == "granted"); + return Promise.resolve(); + } return Promise.reject(new Error("unimplemented")); }; diff --git a/LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/idlharness.https.window-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/idlharness.https.window-expected.txt index a9a870fe9c29c..d456894bc15c4 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/idlharness.https.window-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/idlharness.https.window-expected.txt @@ -1,5 +1,5 @@ -FAIL idl_test setup promise_test: Unhandled rejection with value: object "Error: unimplemented" +PASS idl_test setup PASS idl_test validation PASS Partial interface Navigator: original interface defined PASS Partial interface Navigator: member names are unique @@ -32,12 +32,12 @@ PASS WakeLockSentinel interface: attribute released PASS WakeLockSentinel interface: attribute type PASS WakeLockSentinel interface: operation release() PASS WakeLockSentinel interface: attribute onrelease -FAIL WakeLockSentinel must be primary interface of sentinel assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: Can't find variable: sentinel" -FAIL Stringification of sentinel assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: Can't find variable: sentinel" -FAIL WakeLockSentinel interface: sentinel must inherit property "released" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: Can't find variable: sentinel" -FAIL WakeLockSentinel interface: sentinel must inherit property "type" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: Can't find variable: sentinel" -FAIL WakeLockSentinel interface: sentinel must inherit property "release()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: Can't find variable: sentinel" -FAIL WakeLockSentinel interface: sentinel must inherit property "onrelease" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: Can't find variable: sentinel" +PASS WakeLockSentinel must be primary interface of sentinel +PASS Stringification of sentinel +PASS WakeLockSentinel interface: sentinel must inherit property "released" with the proper type +PASS WakeLockSentinel interface: sentinel must inherit property "type" with the proper type +PASS WakeLockSentinel interface: sentinel must inherit property "release()" with the proper type +PASS WakeLockSentinel interface: sentinel must inherit property "onrelease" with the proper type PASS Navigator interface: attribute wakeLock PASS Navigator interface: navigator must inherit property "wakeLock" with the proper type diff --git a/LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-active-document.https.window-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-active-document.https.window-expected.txt index d74b0d05e3a92..526d7cf06ae46 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-active-document.https.window-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-active-document.https.window-expected.txt @@ -1,4 +1,4 @@ -FAIL navigator.wakeLock.request() aborts if the document is not active. promise_rejects_dom: Inactive document, so must throw NotAllowedError function "function () { throw e }" threw object "NotSupportedError: The operation is not supported." that is not a DOMException NotAllowedError: property "code" is equal to 9, expected 0 -FAIL navigator.wakeLock.request() aborts if the document is active, but not fully active. promise_rejects_dom: Active, but not fully active, so must throw NotAllowedError function "function () { throw e }" threw object "NotSupportedError: The operation is not supported." that is not a DOMException NotAllowedError: property "code" is equal to 9, expected 0 +PASS navigator.wakeLock.request() aborts if the document is not active. +PASS navigator.wakeLock.request() aborts if the document is active, but not fully active. diff --git a/LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-disabled-by-feature-policy.https.sub-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-disabled-by-feature-policy.https.sub-expected.txt index fc116b690c97d..d4ac3b1e3c460 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-disabled-by-feature-policy.https.sub-expected.txt +++ b/LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-disabled-by-feature-policy.https.sub-expected.txt @@ -1,9 +1,6 @@ -Blocked access to external URL https://www.localhost:9443/feature-policy/resources/feature-policy-screen-wakelock.html -Harness Error (TIMEOUT), message = null - -FAIL Feature-Policy header {"screen-wake-lock" : []} disallows the top-level document. promise_rejects_dom: function "function () { throw e }" threw object "NotSupportedError: The operation is not supported." that is not a DOMException NotAllowedError: property "code" is equal to 9, expected 0 -TIMEOUT Feature-Policy header {"screen-wake-lock" : []} disallows same-origin iframes. Test timed out -TIMEOUT Feature-Policy header {"screen-wake-lock" : []} disallows cross-origin iframes. Test timed out +PASS Feature-Policy header {"screen-wake-lock" : []} disallows the top-level document. +FAIL Feature-Policy header {"screen-wake-lock" : []} disallows same-origin iframes. assert_false: navigator.wakeLock.request("screen") expected false got true +PASS Feature-Policy header {"screen-wake-lock" : []} disallows cross-origin iframes. diff --git a/LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-disabled-by-feature-policy.https.sub.html b/LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-disabled-by-feature-policy.https.sub.html index 821ec62885d61..ba26028ca3514 100644 --- a/LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-disabled-by-feature-policy.https.sub.html +++ b/LayoutTests/imported/w3c/web-platform-tests/screen-wake-lock/wakelock-disabled-by-feature-policy.https.sub.html @@ -3,13 +3,14 @@ + + + + +