feat($sniffer): basic implementation of browser feature testing

This only extracts our 'hashchange' event and html5 history api detection from
$browser.

Closes #400
This commit is contained in:
Vojta Jina 2011-06-23 20:01:25 +02:00
parent cbedf55641
commit d0f459c56f
9 changed files with 71 additions and 4 deletions

View file

@ -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',

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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, {

View file

@ -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',

24
src/service/sniffer.js Normal file
View file

@ -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']);

View file

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