From 3566fc09da174c377c552a8232a547c35c1042f2 Mon Sep 17 00:00:00 2001 From: tugorez Date: Wed, 15 Apr 2020 08:37:42 -0700 Subject: [PATCH 1/8] Open url in same window when browser is in standalone mode. --- .../url_launcher_web/CHANGELOG.md | 4 ++++ .../url_launcher_web/lib/navigator.dart | 11 ++++++++++ .../lib/url_launcher_web.dart | 19 ++++++++++++----- .../url_launcher_web/pubspec.yaml | 3 ++- .../test/url_launcher_web_test.dart | 21 ++++++++++++++++--- 5 files changed, 49 insertions(+), 9 deletions(-) create mode 100644 packages/url_launcher/url_launcher_web/lib/navigator.dart diff --git a/packages/url_launcher/url_launcher_web/CHANGELOG.md b/packages/url_launcher/url_launcher_web/CHANGELOG.md index 0cb57ef924ad..119bf2ff364a 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.1+2 + +- Open urls with "_top" (instead of "_blank") as target on iOS PWAs. + # 0.1.1+1 - Make the pedantic dev_dependency explicit. diff --git a/packages/url_launcher/url_launcher_web/lib/navigator.dart b/packages/url_launcher/url_launcher_web/lib/navigator.dart new file mode 100644 index 000000000000..f97de9bb91eb --- /dev/null +++ b/packages/url_launcher/url_launcher_web/lib/navigator.dart @@ -0,0 +1,11 @@ +@JS() +library navigator.dart; + +import 'package:js/js.dart'; + +@JS('window.navigator.standalone') +external bool get _standalone; + +class Navigator { + bool get standalone => _standalone ?? false; +} 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 c37d8724d2c9..ce1c9defe56d 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 @@ -4,22 +4,31 @@ import 'dart:html' as html; 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'; +import 'navigator.dart'; /// The web implementation of [UrlLauncherPlatform]. /// /// This class implements the `package:url_launcher` functionality for the web. class UrlLauncherPlugin extends UrlLauncherPlatform { + final Navigator _navigator; + + UrlLauncherPlugin({Navigator navigator}) + : _navigator = navigator ?? Navigator(); + /// Registers this class as the default instance of [UrlLauncherPlatform]. static void registerWith(Registrar registrar) { UrlLauncherPlatform.instance = UrlLauncherPlugin(); } - /// Opens the given [url] in a new window. - /// + /// Opens the given [url]. + /// The url will be opened in a new window unless the browser is in standalone. /// Returns the newly created window. @visibleForTesting - html.WindowBase openNewWindow(String url) { - return html.window.open(url, ''); + html.WindowBase openUrl(String url) { + // We need to open on _top in ios browsers in standalone mode. + // See https://github.com/flutter/flutter/issues/51461 for reference. + final target = _navigator.standalone ? '_top' : ''; + return html.window.open(url, target); } @override @@ -42,6 +51,6 @@ class UrlLauncherPlugin extends UrlLauncherPlatform { @required bool universalLinksOnly, @required Map headers, }) { - return Future.value(openNewWindow(url) != null); + return Future.value(openUrl(url) != null); } } diff --git a/packages/url_launcher/url_launcher_web/pubspec.yaml b/packages/url_launcher/url_launcher_web/pubspec.yaml index 8e7467797f2e..a43a828af253 100644 --- a/packages/url_launcher/url_launcher_web/pubspec.yaml +++ b/packages/url_launcher/url_launcher_web/pubspec.yaml @@ -1,7 +1,7 @@ name: url_launcher_web description: Web platform implementation of url_launcher homepage: https://github.com/flutter/plugins/tree/master/packages/url_launcher/url_launcher_web -version: 0.1.1+1 +version: 0.1.1+2 flutter: plugin: @@ -17,6 +17,7 @@ dependencies: flutter_web_plugins: sdk: flutter meta: ^1.1.7 + js: ^0.6.0 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 3fb9b7884649..ee4f92e661a6 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 @@ -5,12 +5,17 @@ @TestOn('chrome') // Uses web-only Flutter SDK import 'dart:html' as html; - import 'package:flutter_test/flutter_test.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher_web/url_launcher_web.dart'; +import 'package:url_launcher_web/navigator.dart'; import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart'; +class NavigatorStandalone implements Navigator { + @override + bool get standalone => true; +} + void main() { group('URL Launcher for Web', () { setUp(() { @@ -45,15 +50,25 @@ void main() { expect(launch('mailto:name@mydomain.com'), completion(isTrue)); }); - test('the window that is launched is a new window', () { + test('the url is opened in a new window', () { final UrlLauncherPlugin urlLauncherPlugin = UrlLauncherPlugin(); final html.WindowBase newWindow = - urlLauncherPlugin.openNewWindow('https://www.google.com'); + urlLauncherPlugin.openUrl('https://www.google.com'); expect(newWindow, isNotNull); expect(newWindow, isNot(equals(html.window))); expect(newWindow.opener, equals(html.window)); }); + test('the url is opened in the same window', () { + final navigator = NavigatorStandalone(); + final UrlLauncherPlugin urlLauncherPlugin = + UrlLauncherPlugin(navigator: navigator); + final html.WindowBase window = + urlLauncherPlugin.openUrl('https://www.google.com'); + expect(window, isNotNull); + expect(window.opener, isNot(equals(html.window))); + }); + test('does not implement closeWebView()', () { expect(closeWebView(), throwsUnimplementedError); }); From d3b3e87dae46d013ca82542df4e3f3a94359cb37 Mon Sep 17 00:00:00 2001 From: tugorez Date: Thu, 16 Apr 2020 14:22:49 -0700 Subject: [PATCH 2/8] fixed analyzer issues --- packages/url_launcher/url_launcher_web/lib/navigator.dart | 2 ++ .../url_launcher/url_launcher_web/lib/url_launcher_web.dart | 2 ++ 2 files changed, 4 insertions(+) diff --git a/packages/url_launcher/url_launcher_web/lib/navigator.dart b/packages/url_launcher/url_launcher_web/lib/navigator.dart index f97de9bb91eb..074b2d533fd7 100644 --- a/packages/url_launcher/url_launcher_web/lib/navigator.dart +++ b/packages/url_launcher/url_launcher_web/lib/navigator.dart @@ -6,6 +6,8 @@ import 'package:js/js.dart'; @JS('window.navigator.standalone') external bool get _standalone; +/// Utility class to access the window.navigator DOM property. class Navigator { + /// The window.navigator.standalone DOM property. bool get standalone => _standalone ?? false; } 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 ce1c9defe56d..b8e87a7e9d44 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 @@ -12,6 +12,8 @@ import 'navigator.dart'; class UrlLauncherPlugin extends UrlLauncherPlatform { final Navigator _navigator; + /// [UrlLauncherPlugin] constructor. + @visibleForTesting UrlLauncherPlugin({Navigator navigator}) : _navigator = navigator ?? Navigator(); From 4c1e78d3eb807f796f401fc854b80604ec05539d Mon Sep 17 00:00:00 2001 From: tugorez Date: Fri, 17 Apr 2020 12:33:28 -0700 Subject: [PATCH 3/8] Expose navigator.standalone for testing --- .../url_launcher_web/lib/navigator.dart | 12 +++++++----- .../lib/url_launcher_web.dart | 19 ++++++------------- .../test/url_launcher_web_test.dart | 18 +++++++----------- 3 files changed, 20 insertions(+), 29 deletions(-) diff --git a/packages/url_launcher/url_launcher_web/lib/navigator.dart b/packages/url_launcher/url_launcher_web/lib/navigator.dart index 074b2d533fd7..466244540435 100644 --- a/packages/url_launcher/url_launcher_web/lib/navigator.dart +++ b/packages/url_launcher/url_launcher_web/lib/navigator.dart @@ -2,12 +2,14 @@ library navigator.dart; import 'package:js/js.dart'; +import 'package:meta/meta.dart'; @JS('window.navigator.standalone') external bool get _standalone; -/// Utility class to access the window.navigator DOM property. -class Navigator { - /// The window.navigator.standalone DOM property. - bool get standalone => _standalone ?? false; -} +/// The window.navigator.standalone DOM property. +bool get standalone => _standalone ?? false; + +@visibleForTesting +@JS('window.navigator.standalone') +external set standalone(bool enabled); 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 b8e87a7e9d44..ab0f2226a68b 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 @@ -4,32 +4,25 @@ import 'dart:html' as html; 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'; -import 'navigator.dart'; +import 'navigator.dart' as navigator; /// The web implementation of [UrlLauncherPlatform]. /// /// This class implements the `package:url_launcher` functionality for the web. class UrlLauncherPlugin extends UrlLauncherPlatform { - final Navigator _navigator; - - /// [UrlLauncherPlugin] constructor. - @visibleForTesting - UrlLauncherPlugin({Navigator navigator}) - : _navigator = navigator ?? Navigator(); - /// Registers this class as the default instance of [UrlLauncherPlatform]. static void registerWith(Registrar registrar) { UrlLauncherPlatform.instance = UrlLauncherPlugin(); } - /// Opens the given [url]. - /// The url will be opened in a new window unless the browser is in standalone. + /// Opens the given [url] in a new window. + /// /// Returns the newly created window. @visibleForTesting - html.WindowBase openUrl(String url) { + html.WindowBase openNewWindow(String url) { // We need to open on _top in ios browsers in standalone mode. // See https://github.com/flutter/flutter/issues/51461 for reference. - final target = _navigator.standalone ? '_top' : ''; + final target = navigator.standalone ? '_top' : ''; return html.window.open(url, target); } @@ -53,6 +46,6 @@ class UrlLauncherPlugin extends UrlLauncherPlatform { @required bool universalLinksOnly, @required Map headers, }) { - return Future.value(openUrl(url) != null); + return Future.value(openNewWindow(url) != null); } } 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 ee4f92e661a6..230f74ac03fb 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 @@ -8,14 +8,9 @@ import 'dart:html' as html; import 'package:flutter_test/flutter_test.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher_web/url_launcher_web.dart'; -import 'package:url_launcher_web/navigator.dart'; +import 'package:url_launcher_web/navigator.dart' as navigator; import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart'; -class NavigatorStandalone implements Navigator { - @override - bool get standalone => true; -} - void main() { group('URL Launcher for Web', () { setUp(() { @@ -53,18 +48,19 @@ void main() { test('the url is opened in a new window', () { final UrlLauncherPlugin urlLauncherPlugin = UrlLauncherPlugin(); final html.WindowBase newWindow = - urlLauncherPlugin.openUrl('https://www.google.com'); + urlLauncherPlugin.openNewWindow('https://www.google.com'); expect(newWindow, isNotNull); expect(newWindow, isNot(equals(html.window))); expect(newWindow.opener, equals(html.window)); }); test('the url is opened in the same window', () { - final navigator = NavigatorStandalone(); - final UrlLauncherPlugin urlLauncherPlugin = - UrlLauncherPlugin(navigator: navigator); + // Simulate the navigator is in standalone mode on iOS devices. + // https://developer.mozilla.org/en-US/docs/Web/API/Navigator + navigator.standalone = true; + final UrlLauncherPlugin urlLauncherPlugin = UrlLauncherPlugin(); final html.WindowBase window = - urlLauncherPlugin.openUrl('https://www.google.com'); + urlLauncherPlugin.openNewWindow('https://www.google.com'); expect(window, isNotNull); expect(window.opener, isNot(equals(html.window))); }); From ccefd0d4bae0f210a8ae93cd8f5ae79827d571bf Mon Sep 17 00:00:00 2001 From: tugorez Date: Fri, 17 Apr 2020 13:02:31 -0700 Subject: [PATCH 4/8] fix test descriptions --- .../url_launcher_web/test/url_launcher_web_test.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 230f74ac03fb..057e0c2bb088 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 @@ -45,7 +45,7 @@ void main() { expect(launch('mailto:name@mydomain.com'), completion(isTrue)); }); - test('the url is opened in a new window', () { + test('the window that is launched is a new window', () { final UrlLauncherPlugin urlLauncherPlugin = UrlLauncherPlugin(); final html.WindowBase newWindow = urlLauncherPlugin.openNewWindow('https://www.google.com'); @@ -54,7 +54,7 @@ void main() { expect(newWindow.opener, equals(html.window)); }); - test('the url is opened in the same window', () { + test('the window that is launched is in the same window', () { // Simulate the navigator is in standalone mode on iOS devices. // https://developer.mozilla.org/en-US/docs/Web/API/Navigator navigator.standalone = true; From 48fd041d0f8293873f72054c0ff70e7c83bf6c5c Mon Sep 17 00:00:00 2001 From: tugorez Date: Fri, 17 Apr 2020 13:04:52 -0700 Subject: [PATCH 5/8] reset the navigator state --- .../url_launcher_web/test/url_launcher_web_test.dart | 2 ++ 1 file changed, 2 insertions(+) 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 057e0c2bb088..3ef3c08a4763 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 @@ -55,6 +55,7 @@ void main() { }); test('the window that is launched is in the same window', () { + final originalStandalone = navigator.standalone; // Simulate the navigator is in standalone mode on iOS devices. // https://developer.mozilla.org/en-US/docs/Web/API/Navigator navigator.standalone = true; @@ -63,6 +64,7 @@ void main() { urlLauncherPlugin.openNewWindow('https://www.google.com'); expect(window, isNotNull); expect(window.opener, isNot(equals(html.window))); + navigator.standalone = originalStandalone; }); test('does not implement closeWebView()', () { From beb27b297eba2c0b9d92fc5132602652ced078b6 Mon Sep 17 00:00:00 2001 From: tugorez Date: Fri, 17 Apr 2020 13:19:45 -0700 Subject: [PATCH 6/8] Move navigator to lib/src --- .../url_launcher/url_launcher_web/lib/{ => src}/navigator.dart | 2 +- .../url_launcher/url_launcher_web/lib/url_launcher_web.dart | 2 +- .../url_launcher_web/test/url_launcher_web_test.dart | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename packages/url_launcher/url_launcher_web/lib/{ => src}/navigator.dart (93%) diff --git a/packages/url_launcher/url_launcher_web/lib/navigator.dart b/packages/url_launcher/url_launcher_web/lib/src/navigator.dart similarity index 93% rename from packages/url_launcher/url_launcher_web/lib/navigator.dart rename to packages/url_launcher/url_launcher_web/lib/src/navigator.dart index 466244540435..4c7a99d4c486 100644 --- a/packages/url_launcher/url_launcher_web/lib/navigator.dart +++ b/packages/url_launcher/url_launcher_web/lib/src/navigator.dart @@ -1,5 +1,5 @@ @JS() -library navigator.dart; +library navigator; import 'package:js/js.dart'; import 'package:meta/meta.dart'; 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 ab0f2226a68b..688df43ec84a 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 @@ -4,7 +4,7 @@ import 'dart:html' as html; 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'; -import 'navigator.dart' as navigator; +import 'src/navigator.dart' as navigator; /// The web implementation of [UrlLauncherPlatform]. /// 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 3ef3c08a4763..87110136072c 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 @@ -8,7 +8,7 @@ import 'dart:html' as html; import 'package:flutter_test/flutter_test.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher_web/url_launcher_web.dart'; -import 'package:url_launcher_web/navigator.dart' as navigator; +import 'package:url_launcher_web/src/navigator.dart' as navigator; import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart'; void main() { From 7d737be6fa65341a00d1f3581232aff7d435850c Mon Sep 17 00:00:00 2001 From: Juanjo Tugores Date: Fri, 17 Apr 2020 13:37:29 -0700 Subject: [PATCH 7/8] Update CHANGELOG.md --- packages/url_launcher/url_launcher_web/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/url_launcher/url_launcher_web/CHANGELOG.md b/packages/url_launcher/url_launcher_web/CHANGELOG.md index 119bf2ff364a..deeb2aa0d94c 100644 --- a/packages/url_launcher/url_launcher_web/CHANGELOG.md +++ b/packages/url_launcher/url_launcher_web/CHANGELOG.md @@ -1,6 +1,6 @@ # 0.1.1+2 -- Open urls with "_top" (instead of "_blank") as target on iOS PWAs. +- Open urls with target "_top" (instead of default "_blank") on iOS PWAs. # 0.1.1+1 From 1f18d28473bd2a5b1e3da4161364201f0b602eb9 Mon Sep 17 00:00:00 2001 From: Juanjo Tugores Date: Fri, 17 Apr 2020 13:53:32 -0700 Subject: [PATCH 8/8] Update CHANGELOG.md --- packages/url_launcher/url_launcher_web/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/url_launcher/url_launcher_web/CHANGELOG.md b/packages/url_launcher/url_launcher_web/CHANGELOG.md index deeb2aa0d94c..f8416aff9943 100644 --- a/packages/url_launcher/url_launcher_web/CHANGELOG.md +++ b/packages/url_launcher/url_launcher_web/CHANGELOG.md @@ -1,6 +1,6 @@ # 0.1.1+2 -- Open urls with target "_top" (instead of default "_blank") on iOS PWAs. +- Open urls with target "_top" on iOS PWAs. # 0.1.1+1