aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVojta Jina2011-06-23 20:01:25 +0200
committerVojta Jina2011-09-08 20:37:28 +0200
commitd0f459c56fdb3dae692c359a2915acb2fd063c79 (patch)
tree302a6a0aea894a9b496c950d106214af01e4e58a
parentcbedf556416522a0a4b08abd3101e856e59c6a6a (diff)
downloadangular.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--Rakefile1
-rw-r--r--jsTestDriver-coverage.conf1
-rw-r--r--jsTestDriver-jquery.conf1
-rw-r--r--jsTestDriver-perf.conf1
-rw-r--r--jsTestDriver.conf1
-rw-r--r--src/AngularPublic.js7
-rw-r--r--src/angular-bootstrap.js1
-rw-r--r--src/service/sniffer.js24
-rw-r--r--test/service/snifferSpec.js38
9 files changed, 71 insertions, 4 deletions
diff --git a/Rakefile b/Rakefile
index a9c1ee6c..9e13eacb 100644
--- a/Rakefile
+++ b/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',
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);
+ });
+});