[e2e] e2e web changes part1: registering web extension. (#2502)

* e2e web changes part1: registering web extension.

* update pubspec yaml version

* update changelog

* changes by format tool
diff --git a/packages/e2e/CHANGELOG.md b/packages/e2e/CHANGELOG.md
index 93cf094..da2d71b 100644
--- a/packages/e2e/CHANGELOG.md
+++ b/packages/e2e/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.2.4+1
+
+* Registering web service extension for using e2e with web.
+
 ## 0.2.4
 
 * Fixed problem with XCTest in XCode 11.3 where the testing bundles were getting
diff --git a/packages/e2e/lib/_extension_io.dart b/packages/e2e/lib/_extension_io.dart
new file mode 100644
index 0000000..a8e66fc
--- /dev/null
+++ b/packages/e2e/lib/_extension_io.dart
@@ -0,0 +1,13 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/// The dart:io implementation of [registerWebServiceExtension].
+///
+/// See also:
+///
+///  * [_extension_web.dart], which has the dart:html implementation
+void registerWebServiceExtension(
+    Future<Map<String, dynamic>> Function(Map<String, String>) call) {
+  throw UnsupportedError('Use registerServiceExtension instead');
+}
diff --git a/packages/e2e/lib/_extension_web.dart b/packages/e2e/lib/_extension_web.dart
new file mode 100644
index 0000000..8bf5950
--- /dev/null
+++ b/packages/e2e/lib/_extension_web.dart
@@ -0,0 +1,32 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:html' as html;
+import 'dart:js';
+import 'dart:js_util' as js_util;
+
+/// The dart:html implementation of [registerWebServiceExtension].
+///
+/// Registers Web Service Extension for Flutter Web application.
+///
+/// window.$flutterDriver will be called by Flutter Web Driver to process
+/// Flutter command.
+///
+/// See also:
+///
+///  * [_extension_io.dart], which has the dart:io implementation
+void registerWebServiceExtension(
+    Future<Map<String, dynamic>> Function(Map<String, String>) call) {
+  js_util.setProperty(html.window, '\$flutterDriver',
+      allowInterop((dynamic message) async {
+    // ignore: undefined_function, undefined_identifier
+    final Map<String, String> params = Map<String, String>.from(
+        jsonDecode(message as String) as Map<String, dynamic>);
+    final Map<String, dynamic> result =
+        Map<String, dynamic>.from(await call(params));
+    context['\$flutterDriverResult'] = json.encode(result);
+  }));
+}
diff --git a/packages/e2e/lib/e2e.dart b/packages/e2e/lib/e2e.dart
index 5682ae2..afcbeb0 100644
--- a/packages/e2e/lib/e2e.dart
+++ b/packages/e2e/lib/e2e.dart
@@ -8,6 +8,8 @@
 import 'package:flutter/services.dart';
 import 'package:flutter/widgets.dart';
 
+import '_extension_io.dart' if (dart.library.html) '_extension_web.dart';
+
 /// A subclass of [LiveTestWidgetsFlutterBinding] that reports tests results
 /// on a channel to adapt them to native instrumentation test format.
 class E2EWidgetsFlutterBinding extends LiveTestWidgetsFlutterBinding {
@@ -70,6 +72,10 @@
       };
     }
 
+    if (kIsWeb) {
+      registerWebServiceExtension(callback);
+    }
+
     registerServiceExtension(name: 'driver', callback: callback);
   }
 
diff --git a/packages/e2e/pubspec.yaml b/packages/e2e/pubspec.yaml
index 7cecccc..760d0b8 100644
--- a/packages/e2e/pubspec.yaml
+++ b/packages/e2e/pubspec.yaml
@@ -1,6 +1,6 @@
 name: e2e
 description: Runs tests that use the flutter_test API as integration tests.
-version: 0.2.4
+version: 0.2.4+1
 homepage: https://github.com/flutter/plugins/tree/master/packages/e2e
 
 environment: