diff options
| author | Vojta Jina | 2011-06-23 20:01:25 +0200 |
|---|---|---|
| committer | Vojta Jina | 2011-09-08 20:37:28 +0200 |
| commit | d0f459c56fdb3dae692c359a2915acb2fd063c79 (patch) | |
| tree | 302a6a0aea894a9b496c950d106214af01e4e58a | |
| parent | cbedf556416522a0a4b08abd3101e856e59c6a6a (diff) | |
| download | angular.js-d0f459c56fdb3dae692c359a2915acb2fd063c79.tar.bz2 | |
feat($sniffer): basic implementation of browser feature testing
This only extracts our 'hashchange' event and html5 history api detection from
$browser.
Closes #400
| -rw-r--r-- | Rakefile | 1 | ||||
| -rw-r--r-- | jsTestDriver-coverage.conf | 1 | ||||
| -rw-r--r-- | jsTestDriver-jquery.conf | 1 | ||||
| -rw-r--r-- | jsTestDriver-perf.conf | 1 | ||||
| -rw-r--r-- | jsTestDriver.conf | 1 | ||||
| -rw-r--r-- | src/AngularPublic.js | 7 | ||||
| -rw-r--r-- | src/angular-bootstrap.js | 1 | ||||
| -rw-r--r-- | src/service/sniffer.js | 24 | ||||
| -rw-r--r-- | test/service/snifferSpec.js | 38 |
9 files changed, 71 insertions, 4 deletions
@@ -28,6 +28,7 @@ ANGULAR = [ 'src/service/resource.js', 'src/service/route.js', 'src/service/routeParams.js', + 'src/service/sniffer.js', 'src/service/window.js', 'src/service/xhr.bulk.js', 'src/service/xhr.cache.js', diff --git a/jsTestDriver-coverage.conf b/jsTestDriver-coverage.conf index f9d9f93c..0b8907b6 100644 --- a/jsTestDriver-coverage.conf +++ b/jsTestDriver-coverage.conf @@ -30,6 +30,7 @@ load: - src/service/log.js - src/service/resource.js - src/service/route.js + - src/service/sniffer.js - src/service/window.js - src/service/xhr.bulk.js - src/service/xhr.cache.js diff --git a/jsTestDriver-jquery.conf b/jsTestDriver-jquery.conf index 705ade10..7dc2b447 100644 --- a/jsTestDriver-jquery.conf +++ b/jsTestDriver-jquery.conf @@ -31,6 +31,7 @@ load: - src/service/resource.js - src/service/route.js - src/service/routeParams.js + - src/service/sniffer.js - src/service/window.js - src/service/xhr.bulk.js - src/service/xhr.cache.js diff --git a/jsTestDriver-perf.conf b/jsTestDriver-perf.conf index 0fee61af..2a3dbabe 100644 --- a/jsTestDriver-perf.conf +++ b/jsTestDriver-perf.conf @@ -29,6 +29,7 @@ load: - src/service/resource.js - src/service/route.js - src/service/routeParams.js + - src/service/sniffer.js - src/service/window.js - src/service/xhr.bulk.js - src/service/xhr.cache.js diff --git a/jsTestDriver.conf b/jsTestDriver.conf index 24349094..b2500b01 100644 --- a/jsTestDriver.conf +++ b/jsTestDriver.conf @@ -31,6 +31,7 @@ load: - src/service/resource.js - src/service/route.js - src/service/routeParams.js + - src/service/sniffer.js - src/service/window.js - src/service/xhr.bulk.js - src/service/xhr.cache.js diff --git a/src/AngularPublic.js b/src/AngularPublic.js index f63948d8..8683b379 100644 --- a/src/AngularPublic.js +++ b/src/AngularPublic.js @@ -2,15 +2,14 @@ var browserSingleton; -angularService('$browser', function($log){ +angularService('$browser', function($log, $sniffer) { if (!browserSingleton) { - // TODO(vojta): inject $sniffer service when implemented browserSingleton = new Browser(window, jqLite(window.document), jqLite(window.document.body), - XHR, $log, {}); + XHR, $log, $sniffer); browserSingleton.bind(); } return browserSingleton; -}, {$inject:['$log']}); +}, {$inject: ['$log', '$sniffer']}); extend(angular, { diff --git a/src/angular-bootstrap.js b/src/angular-bootstrap.js index f88973e0..9f08ff94 100644 --- a/src/angular-bootstrap.js +++ b/src/angular-bootstrap.js @@ -115,6 +115,7 @@ 'service/resource.js', 'service/route.js', 'service/routeParams.js', + 'service/sniffer.js', 'service/window.js', 'service/xhr.bulk.js', 'service/xhr.cache.js', diff --git a/src/service/sniffer.js b/src/service/sniffer.js new file mode 100644 index 00000000..c71a9bde --- /dev/null +++ b/src/service/sniffer.js @@ -0,0 +1,24 @@ +'use strict'; + +/** + * @workInProgress + * @ngdoc service + * @name angular.service.$sniffer + * @requires $window + * + * @property {boolean} history Does the browser support html5 history api ? + * @property {boolean} hashchange Does the browser support hashchange event ? + * + * @description + * This is very simple implementation of testing browser's features. + */ +angularServiceInject('$sniffer', function($window) { + if ($window.Modernizr) return $window.Modernizr; + + return { + history: !!($window.history && $window.history.pushState), + hashchange: 'onhashchange' in $window && + // IE8 compatible mode lies + (!$window.document.documentMode || $window.document.documentMode > 7) + }; +}, ['$window']); diff --git a/test/service/snifferSpec.js b/test/service/snifferSpec.js new file mode 100644 index 00000000..72c32046 --- /dev/null +++ b/test/service/snifferSpec.js @@ -0,0 +1,38 @@ +'use strict'; + +describe('$sniffer', function() { + + function sniffer($window) { + return angular.service('$sniffer')($window); + } + + describe('history', function() { + it('should be true if history.pushState defined', function() { + expect(sniffer({history: {pushState: noop, replaceState: noop}}).history).toBe(true); + }); + + it('should be false if history or pushState not defined', function() { + expect(sniffer({history: {}}).history).toBe(false); + expect(sniffer({}).history).toBe(false); + }); + }); + + describe('hashchange', function() { + it('should be true if onhashchange property defined', function() { + expect(sniffer({onhashchange: true, document: {}}).hashchange).toBe(true); + }); + + it('should be false if onhashchange property not defined', function() { + expect(sniffer({document: {}}).hashchange).toBe(false); + }); + + it('should be false if documentMode is 7 (IE8 comp mode)', function() { + expect(sniffer({onhashchange: true, document: {documentMode: 7}}).hashchange).toBe(false); + }); + }); + + it('should use Modernizr if defined', function() { + var Modernizr = {}; + expect(sniffer({Modernizr: Modernizr})).toBe(Modernizr); + }); +}); |
