Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for Samsung Internet Browser #58

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 26 additions & 1 deletion lib/src/browser.dart
Original file line number Diff line number Diff line change
Expand Up @@ -53,26 +53,30 @@ class Browser {
safari,
wkWebView,
chrome,
samsungBrowser,
];

bool get isChrome => this == chrome;
bool get isFirefox => this == firefox;
bool get isSafari => this == safari;
bool get isInternetExplorer => this == internetExplorer;
bool get isWKWebView => this == wkWebView;
bool get isSamsungBrowser => this == samsungBrowser;
}

Browser chrome = _Chrome();
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")
Expand Down Expand Up @@ -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);
}
}
56 changes: 56 additions & 0 deletions test/browser_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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', () {
Expand All @@ -34,6 +35,7 @@ void main() {
expect(browser.isFirefox, false);
expect(browser.isSafari, false);
expect(browser.isInternetExplorer, false);
expect(browser.isSamsungBrowser, false);
});

test('Chrome', () {
Expand All @@ -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'));
});

Expand All @@ -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));
});

Expand All @@ -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));
});

Expand All @@ -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));
});

Expand All @@ -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));
});

Expand All @@ -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));
});

Expand All @@ -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));
});
});
Expand All @@ -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));
});
});
});
}
24 changes: 24 additions & 0 deletions test/constants.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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;
}