[url_launcher_web] Adds "tel" and "sms" URL support (#2847)

diff --git a/packages/url_launcher/url_launcher_web/CHANGELOG.md b/packages/url_launcher/url_launcher_web/CHANGELOG.md
index df1b2c9..e9f7bde 100644
--- a/packages/url_launcher/url_launcher_web/CHANGELOG.md
+++ b/packages/url_launcher/url_launcher_web/CHANGELOG.md
@@ -1,3 +1,7 @@
+# 0.1.2
+
+- Adds "tel" and "sms" support 
+
 # 0.1.1+6
 
 - Open "mailto" urls with target set as "\_top" on Safari browsers.
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 e55ceb2..1bac4d5 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
@@ -7,7 +7,11 @@
 
 import 'package:platform_detect/platform_detect.dart' show browser;
 
-const _mailtoScheme = 'mailto';
+const _safariTargetTopSchemes = {
+  'mailto',
+  'tel',
+  'sms',
+};
 
 /// The web implementation of [UrlLauncherPlatform].
 ///
@@ -16,7 +20,10 @@
   html.Window _window;
 
   // The set of schemes that can be handled by the plugin
-  static final _supportedSchemes = {'http', 'https', _mailtoScheme};
+  static final _supportedSchemes = {
+    'http',
+    'https',
+  }.union(_safariTargetTopSchemes);
 
   /// A constructor that allows tests to override the window object used by the plugin.
   UrlLauncherPlugin({@visibleForTesting html.Window window})
@@ -29,16 +36,18 @@
 
   String _getUrlScheme(String url) => Uri.tryParse(url)?.scheme;
 
-  bool _isMailtoScheme(String url) => _getUrlScheme(url) == _mailtoScheme;
+  bool _isSafariTargetTopScheme(String url) =>
+      _safariTargetTopSchemes.contains(_getUrlScheme(url));
 
   /// Opens the given [url] in a new window.
   ///
   /// Returns the newly created window.
   @visibleForTesting
   html.WindowBase openNewWindow(String url) {
-    // We need to open mailto urls on the _top window context on safari browsers.
+    // We need to open mailto, tel and sms urls on the _top window context on safari browsers.
     // See https://github.com/flutter/flutter/issues/51461 for reference.
-    final target = browser.isSafari && _isMailtoScheme(url) ? '_top' : '';
+    final target =
+        browser.isSafari && _isSafariTargetTopScheme(url) ? '_top' : '';
     return _window.open(url, target);
   }
 
diff --git a/packages/url_launcher/url_launcher_web/pubspec.yaml b/packages/url_launcher/url_launcher_web/pubspec.yaml
index 207f2dc..9a5beac 100644
--- a/packages/url_launcher/url_launcher_web/pubspec.yaml
+++ b/packages/url_launcher/url_launcher_web/pubspec.yaml
@@ -4,7 +4,7 @@
 # 0.1.y+z is compatible with 1.0.0, if you land a breaking change bump
 # the version to 2.0.0.
 # See more details: https://github.com/flutter/flutter/wiki/Package-migration-to-1.0.0
-version: 0.1.1+6
+version: 0.1.2
 
 flutter:
   plugin:
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 4cf9206..b7e107d 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
@@ -36,8 +36,13 @@
             plugin.canLaunch('mailto:name@mydomain.com'), completion(isTrue));
       });
 
-      test('"tel" URLs -> false', () {
-        expect(plugin.canLaunch('tel:5551234567'), completion(isFalse));
+      test('"tel" URLs -> true', () {
+        expect(plugin.canLaunch('tel:5551234567'), completion(isTrue));
+      });
+
+      test('"sms" URLs -> true', () {
+        expect(plugin.canLaunch('sms:+19725551212?body=hello%20there'),
+            completion(isTrue));
       });
     });
 
@@ -48,6 +53,9 @@
             .thenReturn(MockWindow());
         when(mockWindow.open('mailto:name@mydomain.com', ''))
             .thenReturn(MockWindow());
+        when(mockWindow.open('tel:5551234567', '')).thenReturn(MockWindow());
+        when(mockWindow.open('sms:+19725551212?body=hello%20there', ''))
+            .thenReturn(MockWindow());
       });
 
       test('launching a URL returns true', () {
@@ -77,6 +85,34 @@
             ),
             completion(isTrue));
       });
+
+      test('launching a "tel" returns true', () {
+        expect(
+            plugin.launch(
+              'tel:5551234567',
+              useSafariVC: null,
+              useWebView: null,
+              universalLinksOnly: null,
+              enableDomStorage: null,
+              enableJavaScript: null,
+              headers: null,
+            ),
+            completion(isTrue));
+      });
+
+      test('launching a "sms" returns true', () {
+        expect(
+            plugin.launch(
+              'sms:+19725551212?body=hello%20there',
+              useSafariVC: null,
+              useWebView: null,
+              universalLinksOnly: null,
+              enableDomStorage: null,
+              enableJavaScript: null,
+              headers: null,
+            ),
+            completion(isTrue));
+      });
     });
 
     group('openNewWindow', () {
@@ -98,6 +134,18 @@
         verify(mockWindow.open('mailto:name@mydomain.com', ''));
       });
 
+      test('tel urls should be launched on a new window', () {
+        plugin.openNewWindow('tel:5551234567');
+
+        verify(mockWindow.open('tel:5551234567', ''));
+      });
+
+      test('sms urls should be launched on a new window', () {
+        plugin.openNewWindow('sms:+19725551212?body=hello%20there');
+
+        verify(mockWindow.open('sms:+19725551212?body=hello%20there', ''));
+      });
+
       group('Safari', () {
         setUp(() {
           platform.configurePlatformForTesting(browser: platform.safari);
@@ -120,6 +168,19 @@
 
           verify(mockWindow.open('mailto:name@mydomain.com', '_top'));
         });
+
+        test('tel urls should be launched on the same window', () {
+          plugin.openNewWindow('tel:5551234567');
+
+          verify(mockWindow.open('tel:5551234567', '_top'));
+        });
+
+        test('sms urls should be launched on the same window', () {
+          plugin.openNewWindow('sms:+19725551212?body=hello%20there');
+
+          verify(
+              mockWindow.open('sms:+19725551212?body=hello%20there', '_top'));
+        });
       });
     });
   });