diff --git a/lib/src/browser.dart b/lib/src/browser.dart index 12b57e2..fe84e07 100644 --- a/lib/src/browser.dart +++ b/lib/src/browser.dart @@ -53,6 +53,7 @@ class Browser { safari, wkWebView, chrome, + samsungBrowser, ]; bool get isChrome => this == chrome; @@ -60,6 +61,7 @@ class Browser { bool get isSafari => this == safari; bool get isInternetExplorer => this == internetExplorer; bool get isWKWebView => this == wkWebView; + bool get isSamsungBrowser => this == samsungBrowser; } Browser chrome = _Chrome(); @@ -67,12 +69,14 @@ Browser firefox = _Firefox(); Browser safari = _Safari(); Browser internetExplorer = _InternetExplorer(); Browser wkWebView = _WKWebView(); +Browser samsungBrowser = _SamsungBrowser(); class _Chrome extends Browser { _Chrome() : super('Chrome', _isChrome, _getVersion); static bool _isChrome(NavigatorProvider navigator) => - navigator.vendor.contains('Google'); + navigator.vendor.contains('Google') && + !_SamsungBrowser._isSamsungBrowser(navigator); static Version _getVersion(NavigatorProvider navigator) { Match? match = RegExp(r"Chrome/(\d+)\.(\d+)\.(\d+)\.(\d+)\s") @@ -179,3 +183,24 @@ class _InternetExplorer extends Browser { return Version(0, 0, 0); } } + +class _SamsungBrowser extends Browser { + _SamsungBrowser() : super('SamsungBrowser', _isSamsungBrowser, _getVersion); + static bool _isSamsungBrowser(NavigatorProvider navigator) => + navigator.appVersion.contains('SamsungBrowser'); + + static Version _getVersion(NavigatorProvider navigator) { + Match match = RegExp(r'SamsungBrowser/(\d+)(?:\.(\d+))?(?:\.(\d+))?') + .firstMatch(navigator.appVersion)!; + var major = int.parse(match.group(1)!); + var minor = 0; + if (match.group(2) != null) { + minor = int.parse(match.group(2)!); + } + var patch = 0; + if (match.group(3) != null) { + patch = int.parse(match.group(3)!); + } + return Version(major, minor, patch); + } +} diff --git a/test/browser_test.dart b/test/browser_test.dart index d69f4c3..10fc897 100644 --- a/test/browser_test.dart +++ b/test/browser_test.dart @@ -24,6 +24,7 @@ void main() { expect(browser.isFirefox, false); expect(browser.isSafari, false); expect(browser.isInternetExplorer, false); + expect(browser.isSamsungBrowser, false); }); test('Fake Browser', () { @@ -34,6 +35,7 @@ void main() { expect(browser.isFirefox, false); expect(browser.isSafari, false); expect(browser.isInternetExplorer, false); + expect(browser.isSamsungBrowser, false); }); test('Chrome', () { @@ -45,6 +47,7 @@ void main() { expect(browser.isFirefox, false); expect(browser.isSafari, false); expect(browser.isInternetExplorer, false); + expect(browser.isSamsungBrowser, false); expect(browser.version, Version(53, 0, 2785, build: '143')); }); @@ -57,6 +60,7 @@ void main() { expect(browser.isFirefox, false); expect(browser.isSafari, false); expect(browser.isInternetExplorer, false); + expect(browser.isSamsungBrowser, false); expect(browser.version, Version(0, 0, 0)); }); @@ -69,6 +73,7 @@ void main() { expect(browser.isFirefox, false); expect(browser.isSafari, false); expect(browser.isInternetExplorer, true); + expect(browser.isSamsungBrowser, false); expect(browser.version, Version(11, 0, 0)); }); @@ -81,6 +86,7 @@ void main() { expect(browser.isFirefox, true); expect(browser.isSafari, false); expect(browser.isInternetExplorer, false); + expect(browser.isSamsungBrowser, false); expect(browser.version, Version(48, 0, 0)); }); @@ -98,6 +104,7 @@ void main() { expect(browser.isFirefox, false); expect(browser.isSafari, true); expect(browser.isInternetExplorer, false); + expect(browser.isSamsungBrowser, false); expect(browser.version, Version(9, 1, 3)); }); @@ -113,6 +120,7 @@ void main() { expect(browser.isFirefox, false); expect(browser.isSafari, true); expect(browser.isInternetExplorer, false); + expect(browser.isSamsungBrowser, false); expect(browser.version, Version(10, 1, 0)); }); @@ -128,6 +136,7 @@ void main() { expect(browser.isFirefox, false); expect(browser.isSafari, true); expect(browser.isInternetExplorer, false); + expect(browser.isSamsungBrowser, false); expect(browser.version, Version(11, 0, 0)); }); }); @@ -142,7 +151,54 @@ void main() { expect(browser.isSafari, false); expect(browser.isWKWebView, true); expect(browser.isInternetExplorer, false); + expect(browser.isSamsungBrowser, false); expect(browser.version, Version(601, 7, 8)); }); + + group('Samsung Internet Browser', () { + tearDown(() { + Browser.navigator = null; + }); + + test('major and minor version', () { + Browser.navigator = testSamsungBrowser(); + browser = Browser.getCurrentBrowser(); + + expect(browser.name, 'SamsungBrowser'); + expect(browser.isSamsungBrowser, true); + expect(browser.isChrome, false); + expect(browser.isFirefox, false); + expect(browser.isSafari, false); + expect(browser.isWKWebView, false); + expect(browser.isInternetExplorer, false); + expect(browser.version, Version(14, 2, 0)); + }); + test('only major version', () { + Browser.navigator = testSamsungBrowser(appVersion: samsungBrowserAppVersionOnlyMajorTestString); + browser = Browser.getCurrentBrowser(); + + expect(browser.name, 'SamsungBrowser'); + expect(browser.isSamsungBrowser, true); + expect(browser.isChrome, false); + expect(browser.isFirefox, false); + expect(browser.isSafari, false); + expect(browser.isWKWebView, false); + expect(browser.isInternetExplorer, false); + expect(browser.version, Version(14, 0, 0)); + }); + test('major, minor and patch version', () { + Browser.navigator = testSamsungBrowser(appVersion: samsungBrowserAppVersionPatchTestString); + browser = Browser.getCurrentBrowser(); + + expect(browser.name, 'SamsungBrowser'); + expect(browser.isSamsungBrowser, true); + expect(browser.isChrome, false); + expect(browser.isFirefox, false); + expect(browser.isSafari, false); + expect(browser.isWKWebView, false); + expect(browser.isInternetExplorer, false); + expect(browser.version, Version(14, 2, 3)); + }); + }); }); } diff --git a/test/constants.dart b/test/constants.dart index 0291060..b8854e1 100644 --- a/test/constants.dart +++ b/test/constants.dart @@ -45,6 +45,17 @@ const String wkWebViewAppVersionTestString = const String wkWebViewAppNameTestString = 'Netscape'; const String wkWebViewVendorTestString = 'Apple Computer, Inc.'; +const String samsungBrowserUserAgentTestString = + 'Mozilla/5.0 (Linux; Android 8.1.0; Land Rover Explore) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/14.2 Chrome/87.0.4280.141 Mobile Safari/537.36'; +const String samsungBrowserAppVersionTestString = + '5.0 (Linux; Android 8.1.0; Land Rover Explore) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/14.2 Chrome/87.0.4280.141 Mobile Safari/537.36'; +const String samsungBrowserAppVersionOnlyMajorTestString = + '5.0 (Linux; Android 8.1.0; Land Rover Explore) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/14 Chrome/87.0.4280.141 Mobile Safari/537.36'; +const String samsungBrowserAppVersionPatchTestString = + '5.0 (Linux; Android 8.1.0; Land Rover Explore) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/14.2.3 Chrome/87.0.4280.141 Mobile Safari/537.36'; +const String samsungBrowserAppNameTestString = 'Netscape'; +const String samsungBrowserVendorTestString = 'Google Inc.'; + TestNavigator testChrome({ userAgent = chromeUserAgentTestString, appVersion = chromeAppVersionTestString, @@ -122,3 +133,16 @@ TestNavigator testWkWebView({ ..appName = appName ..vendor = vendor; } + +TestNavigator testSamsungBrowser({ + userAgent = samsungBrowserUserAgentTestString, + appVersion = samsungBrowserAppVersionTestString, + appName = samsungBrowserAppNameTestString, + vendor = samsungBrowserVendorTestString, +}) { + return TestNavigator() + ..userAgent = userAgent + ..appVersion = appVersion + ..appName = appName + ..vendor = vendor; +}