diff --git a/lib/src/browser.dart b/lib/src/browser.dart index 1cf7304..e852952 100644 --- a/lib/src/browser.dart +++ b/lib/src/browser.dart @@ -42,19 +42,22 @@ class Browser { _chrome, _firefox, _safari, - _internetExplorer + _internetExplorer, + _wkWebView ]; 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; } Browser _chrome = new _Chrome(); Browser _firefox = new _Firefox(); Browser _safari = new _Safari(); Browser _internetExplorer = new _InternetExplorer(); +Browser _wkWebView = new _WKWebView(); class _Chrome extends Browser { _Chrome() : super('Chrome', _isChrome, _getVersion); @@ -95,7 +98,11 @@ class _Safari extends Browser { _Safari() : super('Safari', _isSafari, _getVersion); static bool _isSafari(NavigatorProvider navigator) { - return navigator.vendor.contains('Apple'); + // An web view running in an iOS app does not have a 'Version/X.X.X' string in the appVersion + var vendor = navigator.vendor; + return vendor != null && + vendor.contains('Apple') && + navigator.appVersion.contains('Version'); } static Version _getVersion(NavigatorProvider navigator) { @@ -108,6 +115,27 @@ class _Safari extends Browser { } } +class _WKWebView extends Browser { + _WKWebView() : super('WKWebView', _isWKWebView, _getVersion); + + static bool _isWKWebView(NavigatorProvider navigator) { + // An web view running in an iOS app does not have a 'Version/X.X.X' string in the appVersion + var vendor = navigator.vendor; + return vendor != null && + vendor.contains('Apple') && + !navigator.appVersion.contains('Version'); + } + + static Version _getVersion(NavigatorProvider navigator) { + Match match = new RegExp(r'AppleWebKit/(\d+)\.(\d+)\.(\d+)') + .firstMatch(navigator.appVersion); + var major = int.parse(match.group(1)); + var minor = int.parse(match.group(2)); + var patch = int.parse(match.group(3)); + return new Version(major, minor, patch); + } +} + class _InternetExplorer extends Browser { _InternetExplorer() : super('Internet Explorer', _isInternetExplorer, _getVersion); diff --git a/smithy.yml b/smithy.yml index 710c0dd..1b01d8f 100644 --- a/smithy.yml +++ b/smithy.yml @@ -26,4 +26,4 @@ artifacts: documentation: - ./doc/api/api.tar.gz pub: - - ./platform_detect.pub.tgz \ No newline at end of file + - ./platform_detect.pub.tgz diff --git a/test/browser_test.dart b/test/browser_test.dart index bd1df2f..1d2ed1a 100644 --- a/test/browser_test.dart +++ b/test/browser_test.dart @@ -96,5 +96,24 @@ void main() { expect(browser.isInternetExplorer, false); expect(browser.version, new Version(9, 1, 3)); }); + + test('WKWebView', () { + var navigator = new TestNavigator() + ..vendor = 'Apple Computer, Inc.' + ..userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/601.7.8 (KHTML, like Gecko) Version/9.1.3 Safari/601.7.8' + ..appVersion = '5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/601.7.8 (KHTML, like Gecko) Safari/601.7.8' + ..appName = 'Netscape'; + + Browser.navigator = navigator; + Browser browser = Browser.getCurrentBrowser(); + + expect(browser.name, 'WKWebView'); + expect(browser.isChrome, false); + expect(browser.isFirefox, false); + expect(browser.isSafari, false); + expect(browser.isWKWebView, true); + expect(browser.isInternetExplorer, false); + expect(browser.version, new Version(601, 7, 8)); + }); }); }