mirror of
https://github.com/Hopiu/angular.js.git
synced 2026-03-16 23:30:23 +00:00
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:
parent
cbedf55641
commit
d0f459c56f
9 changed files with 71 additions and 4 deletions
1
Rakefile
1
Rakefile
|
|
@ -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',
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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, {
|
||||
|
|
|
|||
1
src/angular-bootstrap.js
vendored
1
src/angular-bootstrap.js
vendored
|
|
@ -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
24
src/service/sniffer.js
Normal 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']);
|
||||
38
test/service/snifferSpec.js
Normal file
38
test/service/snifferSpec.js
Normal 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);
|
||||
});
|
||||
});
|
||||
Loading…
Reference in a new issue