Update dart2wasm module runner (#2286)

Update dart2wasm module instantiation, compilation, and invoking `main`
to support all the ways dart2wasm implemented.
diff --git a/pkgs/test/lib/src/runner/browser/static/run_wasm_chrome.js b/pkgs/test/lib/src/runner/browser/static/run_wasm_chrome.js
index d8628b9..6e3bda0 100644
--- a/pkgs/test/lib/src/runner/browser/static/run_wasm_chrome.js
+++ b/pkgs/test/lib/src/runner/browser/static/run_wasm_chrome.js
@@ -7,15 +7,41 @@
 // affect chrome.
 (async () => {
   // Fetch and compile Wasm binary.
-  let data = document.getElementById('WasmBootstrapInfo').dataset;
-  let modulePromise = WebAssembly.compileStreaming(fetch(data.wasmurl));
+  let data = document.getElementById("WasmBootstrapInfo").dataset;
 
   // Instantiate the Dart module, importing from the global scope.
-  let dart2wasm = await import('./' + data.jsruntimeurl);
-  let dartInstance = await dart2wasm.instantiate(modulePromise, {});
+  let dart2wasmJsRuntime = await import("./" + data.jsruntimeurl);
 
-  // Call `main`. If tasks are placed into the event loop (by scheduling tasks
-  // explicitly or awaiting Futures), these will automatically keep the script
-  // alive even after `main` returns.
-  await dart2wasm.invoke(dartInstance);
+  // Support three versions of dart2wasm:
+  //
+  // (1) Versions before 3.6.0-167.0.dev require the user to compile using the
+  // browser's `WebAssembly` API, the compiled module needs to be instantiated
+  // using the JS runtime.
+  //
+  // (2) Versions starting with 3.6.0-167.0.dev added helpers for compiling and
+  // instantiating.
+  //
+  // (3) Versions starting with 3.6.0-212.0.dev made compilation functions
+  // return a new type that comes with instantiation and invoke methods.
+
+  if (dart2wasmJsRuntime.compileStreaming !== undefined) {
+    // Version (2) or (3).
+    let compiledModule = await dart2wasmJsRuntime.compileStreaming(
+      fetch(data.wasmurl),
+    );
+    if (compiledModule.instantiate !== undefined) {
+      // Version (3).
+      let instantiatedModule = await compiledModule.instantiate();
+      instantiatedModule.invokeMain();
+    } else {
+      // Version (2).
+      let dartInstance = await dart2wasmJsRuntime.instantiate(compiledModule, {});
+      await dart2wasmJsRuntime.invoke(dartInstance);
+    }
+  } else {
+    // Version (1).
+    let modulePromise = WebAssembly.compileStreaming(fetch(data.wasmurl));
+    let dartInstance = await dart2wasmJsRuntime.instantiate(modulePromise, {});
+    await dart2wasmJsRuntime.invoke(dartInstance);
+  }
 })();