Commit 1ed40516 authored by Fergal Daly's avatar Fergal Daly Committed by Commit Bot

Disable bfcache when WebLocks API is used.

This adds WebSchedulerTrackedFeature::kWebLocks and registers its use from
LockManager::request.

The test I added failed before I add the code to disable bfcache.

Bug: 1013069
Change-Id: I534cb3b712875459e8e991161b444fe8a03a87c2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1851634
Commit-Queue: Victor Costan <pwnall@chromium.org>
Reviewed-by: default avatarArthur Sonzogni <arthursonzogni@chromium.org>
Reviewed-by: default avatarVictor Costan <pwnall@chromium.org>
Reviewed-by: default avatarAlexander Timin <altimin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#705055}
parent 14c40b97
...@@ -103,7 +103,8 @@ uint64_t GetDisallowedFeatures() { ...@@ -103,7 +103,8 @@ uint64_t GetDisallowedFeatures() {
ToFeatureBit(WebSchedulerTrackedFeature::kWebVR) | ToFeatureBit(WebSchedulerTrackedFeature::kWebVR) |
ToFeatureBit(WebSchedulerTrackedFeature::kWebXR) | ToFeatureBit(WebSchedulerTrackedFeature::kWebXR) |
ToFeatureBit(WebSchedulerTrackedFeature::kSharedWorker) | ToFeatureBit(WebSchedulerTrackedFeature::kSharedWorker) |
ToFeatureBit(WebSchedulerTrackedFeature::kWebXR); ToFeatureBit(WebSchedulerTrackedFeature::kWebXR) |
ToFeatureBit(WebSchedulerTrackedFeature::kWebLocks);
uint64_t result = kAlwaysDisallowedFeatures; uint64_t result = kAlwaysDisallowedFeatures;
......
...@@ -73,6 +73,8 @@ const char* FeatureToString(WebSchedulerTrackedFeature feature) { ...@@ -73,6 +73,8 @@ const char* FeatureToString(WebSchedulerTrackedFeature feature) {
return "WebVR"; return "WebVR";
case WebSchedulerTrackedFeature::kWebXR: case WebSchedulerTrackedFeature::kWebXR:
return "WebXR"; return "WebXR";
case WebSchedulerTrackedFeature::kWebLocks:
return "WebLocks";
} }
} }
......
...@@ -71,8 +71,10 @@ enum class WebSchedulerTrackedFeature { ...@@ -71,8 +71,10 @@ enum class WebSchedulerTrackedFeature {
kSharedWorker = 32, kSharedWorker = 32,
kWebLocks = 33,
// NB: This enum is used in a bitmask, so kMaxValue must be less than 64. // NB: This enum is used in a bitmask, so kMaxValue must be less than 64.
kMaxValue = kSharedWorker kMaxValue = kWebLocks
}; };
static_assert(static_cast<uint32_t>(WebSchedulerTrackedFeature::kMaxValue) < 64, static_assert(static_cast<uint32_t>(WebSchedulerTrackedFeature::kMaxValue) < 64,
......
...@@ -270,4 +270,17 @@ TEST_F(SchedulingAffectingFeaturesTest, Plugins) { ...@@ -270,4 +270,17 @@ TEST_F(SchedulingAffectingFeaturesTest, Plugins) {
SchedulingPolicy::Feature::kContainsPlugins)); SchedulingPolicy::Feature::kContainsPlugins));
} }
TEST_F(SchedulingAffectingFeaturesTest, WebLocks) {
SimRequest main_resource("https://foo.com/", "text/html");
LoadURL("https://foo.com/");
main_resource.Complete(
"(<script>"
" navigator.locks.request('my_resource', async lock => {}); "
"</script>)");
EXPECT_THAT(
GetNonTrivialMainFrameFeatures(),
testing::UnorderedElementsAre(SchedulingPolicy::Feature::kWebLocks));
}
} // namespace blink } // namespace blink
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
#include "third_party/blink/renderer/platform/heap/heap.h" #include "third_party/blink/renderer/platform/heap/heap.h"
#include "third_party/blink/renderer/platform/heap/persistent.h" #include "third_party/blink/renderer/platform/heap/persistent.h"
#include "third_party/blink/renderer/platform/instrumentation/use_counter.h" #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
#include "third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h"
#include "third_party/blink/renderer/platform/scheduler/public/scheduling_policy.h"
#include "third_party/blink/renderer/platform/weborigin/security_origin.h" #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
#include "third_party/blink/renderer/platform/wtf/functional.h" #include "third_party/blink/renderer/platform/wtf/functional.h"
#include "third_party/blink/renderer/platform/wtf/vector.h" #include "third_party/blink/renderer/platform/wtf/vector.h"
...@@ -215,6 +217,10 @@ ScriptPromise LockManager::request(ScriptState* script_state, ...@@ -215,6 +217,10 @@ ScriptPromise LockManager::request(ScriptState* script_state,
ExecutionContext* context = ExecutionContext::From(script_state); ExecutionContext* context = ExecutionContext::From(script_state);
DCHECK(context->IsContextThread()); DCHECK(context->IsContextThread());
context->GetScheduler()->RegisterStickyFeature(
blink::SchedulingPolicy::Feature::kWebLocks,
{blink::SchedulingPolicy::RecordMetricsForBackForwardCache()});
// 5. If origin is an opaque origin, then reject promise with a // 5. If origin is an opaque origin, then reject promise with a
// "SecurityError" DOMException. // "SecurityError" DOMException.
if (!context->GetSecurityOrigin()->CanAccessLocks()) { if (!context->GetSecurityOrigin()->CanAccessLocks()) {
......
...@@ -43,6 +43,7 @@ bool SchedulingPolicy::IsFeatureSticky(SchedulingPolicy::Feature feature) { ...@@ -43,6 +43,7 @@ bool SchedulingPolicy::IsFeatureSticky(SchedulingPolicy::Feature feature) {
case Feature::kRequestedVideoCapturePermission: case Feature::kRequestedVideoCapturePermission:
case Feature::kRequestedSensorsPermission: case Feature::kRequestedSensorsPermission:
case Feature::kRequestedBackgroundWorkPermission: case Feature::kRequestedBackgroundWorkPermission:
case Feature::kWebLocks:
return true; return true;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment