diff --git a/docs/src/example.js b/docs/src/example.js index 9471b3faa330..7a32ce042ff9 100644 --- a/docs/src/example.js +++ b/docs/src/example.js @@ -6,7 +6,8 @@ var makeUnique = { 'script.js': true, 'unit.js': true, 'spec.js': true, - 'scenario.js': true + 'scenario.js': true, + 'protractorTest.js': true } function ids(list) { @@ -14,7 +15,7 @@ function ids(list) { }; -exports.Example = function(scenarios) { +exports.Example = function(scenarios, protractorTests) { this.module = ''; this.deps = ['angular.js']; this.html = []; @@ -24,6 +25,8 @@ exports.Example = function(scenarios) { this.unit = []; this.scenario = []; this.scenarios = scenarios; + this.protractorTest = []; + this.protractorTests = protractorTests; } exports.Example.prototype.setModule = function(module) { @@ -44,6 +47,10 @@ exports.Example.prototype.addSource = function(name, content) { var ext = name == 'scenario.js' ? 'scenario' : name.split('.')[1], id = name; + if (name == 'protractorTest.js') { + ext = 'protractorTest'; + } + if (makeUnique[name] && usedIds[id]) { id = name + '-' + (seqCount++); } @@ -56,6 +63,9 @@ exports.Example.prototype.addSource = function(name, content) { if (ext == 'scenario') { this.scenarios.push(content); } + if (ext == 'protractorTest') { + this.protractorTests.push(content); + } }; exports.Example.prototype.enableAnimations = function() { @@ -92,6 +102,7 @@ exports.Example.prototype.toHtmlEdit = function() { out.push(' source-edit-json="' + ids(this.json) + '"'); out.push(' source-edit-unit="' + ids(this.unit) + '"'); out.push(' source-edit-scenario="' + ids(this.scenario) + '"'); + out.push(' source-edit-protractor="' + ids(this.protractorTest) + '"'); out.push('>\n'); return out.join(''); }; @@ -107,6 +118,7 @@ exports.Example.prototype.toHtmlTabs = function() { htmlTabs(this.json); htmlTabs(this.unit); htmlTabs(this.scenario); + htmlTabs(this.protractorTest); out.push(''); return out.join(''); @@ -119,7 +131,8 @@ exports.Example.prototype.toHtmlTabs = function() { if (name === 'index.html') { wrap = ' ng-html-wrap="' + self.module + ' ' + self.deps.join(' ') + '"'; } - if (name == 'scenario.js') name = 'End to end test'; + if (name == 'scenario.js') name = 'ngScenario e2e test'; + if (name == 'protractorTest.js') name = 'Protractor e2e test'; out.push( '
\n' + diff --git a/docs/src/gen-docs.js b/docs/src/gen-docs.js index abb001b5dde1..9fc5f8db4c90 100755 --- a/docs/src/gen-docs.js +++ b/docs/src/gen-docs.js @@ -17,6 +17,8 @@ writer.makeDir('build/docs/', true).then(function() { return writer.makeDir('build/docs/components/bootstrap'); }).then(function() { return writer.makeDir('build/docs/components/font-awesome'); +}).then(function() { + return writer.makeDir('build/docs/e2etests'); }).then(function() { console.log('Generating AngularJS Reference Documentation...'); return reader.collect(); @@ -53,6 +55,10 @@ writer.makeDir('build/docs/', true).then(function() { var id = doc.id.replace('angular.Module', 'angular.IModule'); fileFutures.push(writer.output('partials/' + doc.section + '/' + id + '.html', doc.html())); + // If it has a sample Protractor test, output that as well. + if (doc.protractorTests.length) { + fileFutures.push(writer.output('ptore2e/' + doc.section + '/' + id + '_test.js', ngdoc.writeProtractorTest(doc))); + } }); ngdoc.checkBrokenLinks(docs); diff --git a/docs/src/ngdoc.js b/docs/src/ngdoc.js index 37f5aeafc5a0..c009c9503aa7 100644 --- a/docs/src/ngdoc.js +++ b/docs/src/ngdoc.js @@ -35,6 +35,7 @@ var lookupMinerrMsg = function (doc) { exports.trim = trim; exports.metadata = metadata; exports.scenarios = scenarios; +exports.writeProtractorTest = writeProtractorTest; exports.merge = merge; exports.checkBrokenLinks = checkBrokenLinks; exports.Doc = Doc; @@ -155,6 +156,7 @@ function Doc(text, file, line) { this.line = line; } this.scenarios = this.scenarios || []; + this.protractorTests = this.protractorTests || []; this.requires = this.requires || []; this.param = this.param || []; this.properties = this.properties || []; @@ -292,7 +294,7 @@ Doc.prototype = { replace(/([\s\S]*?)<\/example>/gmi, function(_, module, deps, animations, content) { - var example = new Example(self.scenarios); + var example = new Example(self.scenarios, self.protractorTests); if(animations) { example.enableAnimations(); example.addDeps('angular-animate.js'); @@ -329,7 +331,7 @@ Doc.prototype = { }). replace(/^]*)?>([\s\S]*)<\/doc:example>/mi, function(_, attrs, content) { var html, script, scenario, - example = new Example(self.scenarios); + example = new Example(self.scenarios, self.protractorTests); example.setModule((attrs||'module=""').match(/^\s*module=["'](.*)["']\s*$/)[1]); content. @@ -347,6 +349,8 @@ Doc.prototype = { }). replace(/()([\s\S]*)(<\/doc:scenario>)/mi, function(_, before, content){ example.addSource('scenario.js', content); + }).replace(/()([\s\S]*)(<\/doc:protractor>)/mi, function(_, before, content){ + example.addSource('protractorTest.js', content); }); return placeholder(example.toHtml()); @@ -1106,6 +1110,22 @@ function scenarios(docs){ } } +function writeProtractorTest(doc){ + var lines = []; + lines.push('describe("' + doc.section + '/' + doc.id + '", function() {'); + lines.push(' beforeEach(function() {'); + lines.push(' browser.get("index-nocache.html#!/' + doc.section + '/' + doc.id + '");'); + lines.push(' });'); + lines.push(''); + doc.protractorTests.forEach(function(test){ + lines.push(indentCode(trim(test), 2)); + lines.push(''); + }); + lines.push('});'); + lines.push(''); + return lines.join('\n'); +} + ////////////////////////////////////////////////////////// function metadata(docs){ diff --git a/src/jqLite.js b/src/jqLite.js index e59805147886..a61e1146c068 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -299,9 +299,10 @@ function jqLiteHasClass(element, selector) { } function jqLiteRemoveClass(element, cssClasses) { - if (cssClasses && element.setAttribute) { + var setter = element.setAttribute ? function(value) { element.setAttribute('class', value) } : function(value) { element.className = value}; + if (cssClasses && (element.setAttribute || msie === 9)) { forEach(cssClasses.split(' '), function(cssClass) { - element.setAttribute('class', trim( + setter(trim( (" " + (element.getAttribute('class') || '') + " ") .replace(/[\n\t]/g, " ") .replace(" " + trim(cssClass) + " ", " ")) @@ -312,7 +313,7 @@ function jqLiteRemoveClass(element, cssClasses) { function jqLiteAddClass(element, cssClasses) { if (cssClasses && element.setAttribute) { - var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ') + var existingClasses = (' ' + (element.getAttribute('class') || element.className || '') + ' ') .replace(/[\n\t]/g, " "); forEach(cssClasses.split(' '), function(cssClass) { @@ -322,7 +323,8 @@ function jqLiteAddClass(element, cssClasses) { } }); - element.setAttribute('class', trim(existingClasses)); + (msie === 9 && !(element instanceof SVGElement)) ? element.className = trim(existingClasses) : + element.setAttribute('class', trim(existingClasses)); } } diff --git a/src/ng/directive/ngEventDirs.js b/src/ng/directive/ngEventDirs.js index e45f5cb71d98..03da8bc4a8ad 100644 --- a/src/ng/directive/ngEventDirs.js +++ b/src/ng/directive/ngEventDirs.js @@ -20,13 +20,13 @@ count: {{count}} - + it('should check ng-click', function() { - expect(binding('count')).toBe('0'); - element('.doc-example-live :button').click(); - expect(binding('count')).toBe('1'); + expect(element(by.binding('count')).getText()).toMatch('0'); + element(by.css('.doc-example-live button')).click(); + expect(element(by.binding('count')).getText()).toMatch('1'); }); - + */ /* diff --git a/test/jqLiteSpec.js b/test/jqLiteSpec.js index 931f9b2e5cb3..89f2a16c2611 100644 --- a/test/jqLiteSpec.js +++ b/test/jqLiteSpec.js @@ -579,6 +579,14 @@ describe('jqLite', function() { expect(jqLite(b).hasClass('abc')).toEqual(true); }); + it('should allow adding of class in IE9', function() { + if (msie !== 9) return; // IE9 doesn't support node.setAttribute + var selector = jqLite([a, b]); + expect(selector.addClass('abc')).toBe(selector); + expect(jqLite(a).hasClass('abc')).toBe(true); + expect(jqLite(b).hasClass('abc')).toBe(true); + }); + it('should ignore falsy values', function() { var jqA = jqLite(a);