[url_launcher] Migrate url_launcher_web to the platform interface (#2237)

* [url_launcher] Migrate url_launcher_web to the platform interface

* Fix analyzer errors

* Add doc comments
diff --git a/packages/url_launcher/url_launcher_web/CHANGELOG.md b/packages/url_launcher/url_launcher_web/CHANGELOG.md
index a6ea2c9..e20f5fb 100644
--- a/packages/url_launcher/url_launcher_web/CHANGELOG.md
+++ b/packages/url_launcher/url_launcher_web/CHANGELOG.md
@@ -1,3 +1,7 @@
+# 0.0.2
+
+- Switch to using `url_launcher_platform_interface`.
+
 # 0.0.1
 
 - Initial open-source release.
diff --git a/packages/url_launcher/url_launcher_web/lib/url_launcher_web.dart b/packages/url_launcher/url_launcher_web/lib/url_launcher_web.dart
index e000c1f..8882303 100644
--- a/packages/url_launcher/url_launcher_web/lib/url_launcher_web.dart
+++ b/packages/url_launcher/url_launcher_web/lib/url_launcher_web.dart
@@ -1,49 +1,46 @@
 import 'dart:async';
 import 'dart:html' as html;
 
-import 'package:flutter/services.dart';
 import 'package:flutter_web_plugins/flutter_web_plugins.dart';
 import 'package:meta/meta.dart';
+import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart';
 
-class UrlLauncherPlugin {
+/// The web implementation of [UrlLauncherPlatform].
+///
+/// This class implements the `package:url_launcher` functionality for the web.
+class UrlLauncherPlugin extends UrlLauncherPlatform {
+  /// Registers this class as the default instance of [UrlLauncherPlatform].
   static void registerWith(Registrar registrar) {
-    final MethodChannel channel = MethodChannel(
-        'plugins.flutter.io/url_launcher',
-        const StandardMethodCodec(),
-        registrar.messenger);
-    final UrlLauncherPlugin instance = UrlLauncherPlugin();
-    channel.setMethodCallHandler(instance.handleMethodCall);
+    UrlLauncherPlatform.instance = UrlLauncherPlugin();
   }
 
-  Future<dynamic> handleMethodCall(MethodCall call) async {
-    switch (call.method) {
-      case 'canLaunch':
-        final String url = call.arguments['url'];
-        return _canLaunch(url);
-      case 'launch':
-        final String url = call.arguments['url'];
-        return _launch(url);
-      default:
-        throw PlatformException(
-            code: 'Unimplemented',
-            details: "The url_launcher plugin for web doesn't implement "
-                "the method '${call.method}'");
-    }
-  }
-
-  bool _canLaunch(String url) {
-    final Uri parsedUrl = Uri.tryParse(url);
-    if (parsedUrl == null) return false;
-
-    return parsedUrl.isScheme('http') || parsedUrl.isScheme('https');
-  }
-
-  bool _launch(String url) {
-    return openNewWindow(url) != null;
-  }
-
+  /// Opens the given [url] in a new window.
+  ///
+  /// Returns the newly created window.
   @visibleForTesting
   html.WindowBase openNewWindow(String url) {
     return html.window.open(url, '');
   }
+
+  @override
+  Future<bool> canLaunch(String url) {
+    final Uri parsedUrl = Uri.tryParse(url);
+    if (parsedUrl == null) return Future<bool>.value(false);
+
+    return Future<bool>.value(
+        parsedUrl.isScheme('http') || parsedUrl.isScheme('https'));
+  }
+
+  @override
+  Future<bool> launch(
+    String url, {
+    @required bool useSafariVC,
+    @required bool useWebView,
+    @required bool enableJavaScript,
+    @required bool enableDomStorage,
+    @required bool universalLinksOnly,
+    @required Map<String, String> headers,
+  }) {
+    return Future<bool>.value(openNewWindow(url) != null);
+  }
 }
diff --git a/packages/url_launcher/url_launcher_web/pubspec.yaml b/packages/url_launcher/url_launcher_web/pubspec.yaml
index b76aea1..e94a4d0 100644
--- a/packages/url_launcher/url_launcher_web/pubspec.yaml
+++ b/packages/url_launcher/url_launcher_web/pubspec.yaml
@@ -2,7 +2,7 @@
 description: Web platform implementation of url_launcher
 author: Flutter Team <flutter-dev@googlegroups.com>
 homepage: https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher_web
-version: 0.0.1
+version: 0.0.2
 
 flutter:
   plugin:
@@ -17,6 +17,7 @@
   flutter_web_plugins:
     sdk: flutter
   meta: ^1.1.7
+  url_launcher_platform_interface: ^1.0.1
 
 dev_dependencies:
   flutter_test:
diff --git a/packages/url_launcher/url_launcher_web/test/url_launcher_web_test.dart b/packages/url_launcher/url_launcher_web/test/url_launcher_web_test.dart
index 0bf9678..6109ea7 100644
--- a/packages/url_launcher/url_launcher_web/test/url_launcher_web_test.dart
+++ b/packages/url_launcher/url_launcher_web/test/url_launcher_web_test.dart
@@ -7,18 +7,18 @@
 import 'dart:html' as html;
 
 import 'package:flutter_test/flutter_test.dart';
-import 'package:flutter_web_plugins/flutter_web_plugins.dart';
 import 'package:url_launcher/url_launcher.dart';
 import 'package:url_launcher_web/url_launcher_web.dart';
+import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart';
 
 void main() {
   group('URL Launcher for Web', () {
     setUp(() {
-      TestWidgetsFlutterBinding.ensureInitialized();
-      webPluginRegistry.registerMessageHandler();
-      final Registrar registrar =
-          webPluginRegistry.registrarFor(UrlLauncherPlugin);
-      UrlLauncherPlugin.registerWith(registrar);
+      UrlLauncherPlatform.instance = UrlLauncherPlugin();
+    });
+
+    test('$UrlLauncherPlugin is the live instance', () {
+      expect(UrlLauncherPlatform.instance, isA<UrlLauncherPlugin>());
     });
 
     test('can launch "http" URLs', () {
@@ -45,5 +45,9 @@
       expect(newWindow, isNot(equals(html.window)));
       expect(newWindow.opener, equals(html.window));
     });
+
+    test('does not implement closeWebView()', () {
+      expect(closeWebView(), throwsUnimplementedError);
+    });
   });
 }