[v8][wasm] Allow enabling experimental wasm features in about:flags

In Chrome there exists the umbrella flag
chrome://flags/#enable-javascript-harmony to enable all new JavaScript
feature which have been implemented already in V8 and which are staged
for shipping. This flag allows web developers to experiment with new
JavaScript language features to find issues both in their website or
in our implementation.

With this CL we introduce a similar flag for new WebAssembly language
features.

Bug: chromium:851428
Change-Id: I2aa23979ca4fb4b893b7153237b480c27853ea5d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1772161
Reviewed-by: Avi Drissman <[email protected]>
Commit-Queue: Andreas Haas <[email protected]>
Cr-Commit-Position: refs/heads/master@{#691267}
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 42d16a88..8d1f1553 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -1515,6 +1515,10 @@
     {"enable-javascript-harmony", flag_descriptions::kJavascriptHarmonyName,
      flag_descriptions::kJavascriptHarmonyDescription, kOsAll,
      SINGLE_VALUE_TYPE(switches::kJavaScriptHarmony)},
+    {"enable-experimental-webassembly-features",
+     flag_descriptions::kExperimentalWebAssemblyFeaturesName,
+     flag_descriptions::kExperimentalWebAssemblyFeaturesDescription, kOsAll,
+     SINGLE_VALUE_TYPE(switches::kEnableExperimentalWebAssemblyFeatures)},
     {"enable-webassembly-baseline", flag_descriptions::kEnableWasmBaselineName,
      flag_descriptions::kEnableWasmBaselineDescription, kOsAll,
      FEATURE_VALUE_TYPE(features::kWebAssemblyBaseline)},
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 0f41514..a7caa8e 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -2197,6 +2197,7 @@
 #endif
       switches::kForceUIDirection,
       switches::kJavaScriptHarmony,
+      switches::kEnableExperimentalWebAssemblyFeatures,
       switches::kOriginTrialDisabledFeatures,
       switches::kOriginTrialDisabledTokens,
       switches::kOriginTrialPublicKey,
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 1d47574..2a1e816 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1181,6 +1181,13 @@
     "expiry_milestone": -1
   },
   {
+    "name": "enable-experimental-webassembly-features",
+    "owners": [ "adamk", "hablich" ],
+    // This flag is used by web developers to test upcoming WebAssembly
+    // features.
+    "expiry_milestone": -1
+  },
+  {
     "name": "enable-filesystem-in-incognito",
     "owners": [ "rhalavati" ],
     "expiry_milestone": 78
diff --git a/chrome/browser/flag-never-expire-list.json b/chrome/browser/flag-never-expire-list.json
index ccba741..a3f6b9f 100644
--- a/chrome/browser/flag-never-expire-list.json
+++ b/chrome/browser/flag-never-expire-list.json
@@ -34,6 +34,7 @@
   "enable-data-reduction-proxy-server-experiment",
   "enable-devtools-experiments",
   "enable-experimental-web-platform-features",
+  "enable-experimental-webassembly-features",
   "enable-future-v8-vm-features",
   "enable-gpu-rasterization",
   "enable-gpu-service-logging",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 976b72d..d70d203 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -922,6 +922,10 @@
     "Enable the cloud-assisted pairingless BLE protocol for use with "
     "the Web Authentication API.";
 
+const char kExperimentalWebAssemblyFeaturesName[] = "Experimental WebAssembly";
+const char kExperimentalWebAssemblyFeaturesDescription[] =
+    "Enable web pages to use experimental WebAssembly features.";
+
 const char kEnableWasmBaselineName[] = "WebAssembly baseline compiler";
 const char kEnableWasmBaselineDescription[] =
     "Enables WebAssembly baseline compilation and tier up.";
@@ -938,7 +942,7 @@
 const char kEnableWasmSimdDescription[] =
     "Enables support for the WebAssembly SIMD proposal.";
 
-const char kEnableWasmThreadsName[] = "WebAssembly threads support.";
+const char kEnableWasmThreadsName[] = "WebAssembly threads support";
 const char kEnableWasmThreadsDescription[] =
     "Enables support for the WebAssembly Threads proposal. Implies "
     "#shared-array-buffer and #enable-webassembly.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 5ffd030..13c1345 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -555,6 +555,9 @@
 extern const char kEnableWebUsbName[];
 extern const char kEnableWebUsbDescription[];
 
+extern const char kExperimentalWebAssemblyFeaturesName[];
+extern const char kExperimentalWebAssemblyFeaturesDescription[];
+
 extern const char kEnableWasmBaselineName[];
 extern const char kEnableWasmBaselineDescription[];
 
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc
index 94dd114..8abae00 100644
--- a/content/public/common/content_switches.cc
+++ b/content/public/common/content_switches.cc
@@ -349,6 +349,10 @@
 // just a keyboard. See https://crbug.com/977390 for links to i2i.
 const char kEnableCaretBrowsing[] = "enable-caret-browsing";
 
+// Enables experimental WebAssembly features.
+const char kEnableExperimentalWebAssemblyFeatures[] =
+    "enable-experimental-webassembly-features";
+
 // Enables Web Platform features that are in development.
 const char kEnableExperimentalWebPlatformFeatures[] =
     "enable-experimental-web-platform-features";
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h
index 1048d9e..92786bba 100644
--- a/content/public/common/content_switches.h
+++ b/content/public/common/content_switches.h
@@ -113,6 +113,7 @@
 CONTENT_EXPORT extern const char kEnableCanvas2dSwapChain[];
 CONTENT_EXPORT extern const char kEnableCaretBrowsing[];
 CONTENT_EXPORT extern const char kEnableDisplayList2dCanvas[];
+CONTENT_EXPORT extern const char kEnableExperimentalWebAssemblyFeatures[];
 CONTENT_EXPORT extern const char kEnableExperimentalWebPlatformFeatures[];
 CONTENT_EXPORT extern const char kEnableGpuMemoryBufferCompositorResources[];
 CONTENT_EXPORT extern const char kEnableGpuMemoryBufferVideoFrames[];
diff --git a/content/renderer/render_process_impl.cc b/content/renderer/render_process_impl.cc
index 17384942..9b73dd91 100644
--- a/content/renderer/render_process_impl.cc
+++ b/content/renderer/render_process_impl.cc
@@ -118,6 +118,8 @@
   SetV8FlagIfHasSwitch(switches::kDisableJavaScriptHarmonyShipping,
                        "--noharmony-shipping");
   SetV8FlagIfHasSwitch(switches::kJavaScriptHarmony, "--harmony");
+  SetV8FlagIfHasSwitch(switches::kEnableExperimentalWebAssemblyFeatures,
+                       "--wasm-staging");
 
   constexpr char kModuleFlags[] =
       "--harmony-dynamic-import --harmony-import-meta";
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 0b87831..2edd289f 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -34479,6 +34479,7 @@
   <int value="-1939003674" label="NetworkServiceInProcess:disabled"/>
   <int value="-1938263248" label="enable-extension-info-dialog"/>
   <int value="-1937077699" label="http-form-warning"/>
+  <int value="-1936032607" label="enable-experimental-webassembly-features"/>
   <int value="-1934661084" label="ForceUnifiedConsentBump:disabled"/>
   <int value="-1933425042" label="OfflinePreviews:enabled"/>
   <int value="-1932609987" label="CSSBackdropFilter:disabled"/>