Reverse logic for willReadFrequently flag

With the New Canvas2D API (crbug.com/1201359) there is one instance
where we are changing existent behavior. Previously, an accelerated
canvas would be turned into a software canvas upon any readback. Now
developers have explicit control with the willReadFrequently creation
attribute:
https://github.com/fserb/canvas2D/blob/master/spec/will-read-frequently.md
  Now accelerated canvases will remain accelerated on readback. This
will result in performance regressions for websites that were relying on
the old behavior until they add {willReadFrequently: true} to their
context creation.

  This flag allows us to roll out the feature slowly and measure
performance regressions with a finch experiment. It needs to be part of
content/public/common/content_switch_dependent_feature_overrides.cc
because a couple of tests expect canvas readback to not de-accelerate
canvases.

Bug: 1288118
Change-Id: I2d051f30b0df617e60df756626ad66e1255f4ec3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3402979
Reviewed-by: Justin Novosad <junov@chromium.org>
Reviewed-by: Avi Drissman <avi@chromium.org>
Reviewed-by: Aaron Krajeski <aaronhk@chromium.org>
Commit-Queue: Aaron Krajeski <aaronhk@chromium.org>
Cr-Commit-Position: refs/heads/main@{#961951}
diff --git a/content/public/common/content_switch_dependent_feature_overrides.cc b/content/public/common/content_switch_dependent_feature_overrides.cc
index 2036d25..307e11d 100644
--- a/content/public/common/content_switch_dependent_feature_overrides.cc
+++ b/content/public/common/content_switch_dependent_feature_overrides.cc
@@ -104,6 +104,9 @@
     {switches::kEnableExperimentalWebPlatformFeatures,
      std::cref(blink::features::kClipboardCustomFormats),
      base::FeatureList::OVERRIDE_ENABLE_FEATURE},
+    {switches::kEnableExperimentalWebPlatformFeatures,
+     std::cref(blink::features::kCanvas2dStaysGPUOnReadback),
+     base::FeatureList::OVERRIDE_ENABLE_FEATURE},
 
     // Overrides for --enable-experimental-cookie-features.
     {switches::kEnableExperimentalCookieFeatures,
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 20327731..7f73a6c 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -1805,6 +1805,28 @@
             ]
         }
     ],
+    "Canvas2DStaysGPUOnReadback": [
+        {
+            "platforms": [
+                "android",
+                "android_weblayer",
+                "android_webview",
+                "chromeos",
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "Canvas2DStaysGPUOnReadback"
+                    ]
+                }
+            ]
+        }
+    ],
     "CanvasOutOfProcessRasterization": [
         {
             "platforms": [
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index 1f080bf..403ba32 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -629,10 +629,10 @@
 const base::Feature kWebviewAccelerateSmallCanvases{
     "WebviewAccelerateSmallCanvases", base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Use old behavior for accelerated canvases: de-accelerate after first call to
-// ctx.getImageData (crbug.com/1288118)
-const base::Feature kSoftwareCanvas2DOnReadback{
-    "SoftwareCanvas2DOnReadback", base::FEATURE_DISABLED_BY_DEFAULT};
+// Let accelerated canvases remain accelerated after readback
+// (crbug.com/1288118)
+const base::Feature kCanvas2dStaysGPUOnReadback{
+    "Canvas2dStaysGPUOnReadback", base::FEATURE_DISABLED_BY_DEFAULT};
 
 // When enabled, frees up CachedMetadata after consumption by script resources
 // and modules. Needed for the experiment in http://crbug.com/1045052.
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h
index 0772551..a922ccd 100644
--- a/third_party/blink/public/common/features.h
+++ b/third_party/blink/public/common/features.h
@@ -200,7 +200,7 @@
 
 BLINK_COMMON_EXPORT extern const base::Feature kWebviewAccelerateSmallCanvases;
 
-BLINK_COMMON_EXPORT extern const base::Feature kSoftwareCanvas2DOnReadback;
+BLINK_COMMON_EXPORT extern const base::Feature kCanvas2dStaysGPUOnReadback;
 
 BLINK_COMMON_EXPORT extern const base::Feature kDiscardCodeCacheAfterFirstUse;
 
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
index b051edd..0afcf2e 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
@@ -2003,14 +2003,8 @@
   // that those get drawn here
   FinalizeFrame();
 
-  // TODO(crbug.com/1101055): Remove the check for NewCanvas2DAPI flag once
-  // released.
-  // TODO(crbug.com/1090180): New Canvas2D API utilizes willReadFrequently
-  // attribute that let the users indicate if a canvas will be read frequently
-  // through getImageData, thus uses CPU rendering from the start in such cases.
-  if (!RuntimeEnabledFeatures::NewCanvas2DAPIEnabled(
-          GetTopExecutionContext()) ||
-      base::FeatureList::IsEnabled(features::kSoftwareCanvas2DOnReadback)) {
+  if (!RuntimeEnabledFeatures::Canvas2dStaysGPUOnReadbackEnabled(
+          GetTopExecutionContext())) {
     // GetImagedata is faster in Unaccelerated canvases.
     // In Desynchronized canvas disabling the acceleration will break
     // putImageData: crbug.com/1112060.
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 246518b0..8cf410ab 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -349,6 +349,10 @@
       status: "experimental",
     },
     {
+      name: "Canvas2dStaysGPUOnReadback",
+      status: "experimental",
+    },
+    {
       name: "CanvasColorManagement",
       status: "stable",
     },