From 1e8df6860b1ba2294de290a0d32c11fe820877e4 Mon Sep 17 00:00:00 2001 From: Yuri Sulyma Date: Tue, 12 Nov 2013 17:46:11 -0700 Subject: [PATCH] fix(nodeName_): always return lowercase Fixes #3987. Changed nodeName_ to always return lowercase. Changed code directly using .nodeName to use nodeName() instead. --- src/Angular.js | 16 +++++++++------- src/jqLite.js | 6 +++--- src/ng/anchorScroll.js | 2 +- src/ng/compile.js | 10 +++++----- src/ng/location.js | 2 +- src/ngScenario/browserTrigger.js | 4 ++-- src/ngScenario/dsl.js | 4 ++-- test/AngularSpec.js | 4 ++-- test/ng/compileSpec.js | 2 +- 9 files changed, 26 insertions(+), 24 deletions(-) diff --git a/src/Angular.js b/src/Angular.js index 797e4b811ed5..0963e3f120ff 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -585,12 +585,14 @@ function makeMap(str){ if (msie < 9) { nodeName_ = function(element) { element = element.nodeName ? element : element[0]; - return (element.scopeName && element.scopeName != 'HTML') - ? uppercase(element.scopeName + ':' + element.nodeName) : element.nodeName; + return lowercase( + (element.scopeName && element.scopeName != 'HTML') + ? element.scopeName + ':' + element.nodeName : element.nodeName + ); }; } else { nodeName_ = function(element) { - return element.nodeName ? element.nodeName : element[0].nodeName; + return lowercase(element.nodeName ? element.nodeName : element[0].nodeName); }; } @@ -653,10 +655,10 @@ function arrayRemove(array, value) { function isLeafNode (node) { if (node) { - switch (node.nodeName) { - case "OPTION": - case "PRE": - case "TITLE": + switch (nodeName_(node)) { + case "option": + case "pre": + case "title": return true; } } diff --git a/src/jqLite.js b/src/jqLite.js index 218efe244be1..598e4f6a7e6c 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -409,7 +409,7 @@ forEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), }); var BOOLEAN_ELEMENTS = {}; forEach('input,select,option,textarea,button,form,details'.split(','), function(value) { - BOOLEAN_ELEMENTS[uppercase(value)] = true; + BOOLEAN_ELEMENTS[value] = true; }); function getBooleanAttrName(element, name) { @@ -417,7 +417,7 @@ function getBooleanAttrName(element, name) { var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()]; // booleanAttr is here twice to minimize DOM access - return booleanAttr && BOOLEAN_ELEMENTS[element.nodeName] && booleanAttr; + return booleanAttr && BOOLEAN_ELEMENTS[nodeName_(element)] && booleanAttr; } forEach({ @@ -530,7 +530,7 @@ forEach({ val: function(element, value) { if (isUndefined(value)) { - if (nodeName_(element) === 'SELECT' && element.multiple) { + if (element.multiple && nodeName_(element) === 'select') { var result = []; forEach(element.options, function (option) { if (option.selected) { diff --git a/src/ng/anchorScroll.js b/src/ng/anchorScroll.js index 4cef2bdf830b..3a5bfecb807c 100644 --- a/src/ng/anchorScroll.js +++ b/src/ng/anchorScroll.js @@ -66,7 +66,7 @@ function $AnchorScrollProvider() { function getFirstAnchor(list) { var result = null; forEach(list, function(element) { - if (!result && lowercase(element.nodeName) === 'a') result = element; + if (!result && nodeName_(element) === 'a') result = element; }); return result; } diff --git a/src/ng/compile.js b/src/ng/compile.js index 2e3d78677b52..4b4be8a1b671 100644 --- a/src/ng/compile.js +++ b/src/ng/compile.js @@ -703,8 +703,8 @@ function $CompileProvider($provide) { nodeName = nodeName_(this.$$element); // sanitize a[href] and img[src] values - if ((nodeName === 'A' && key === 'href') || - (nodeName === 'IMG' && key === 'src')) { + if ((nodeName === 'a' && key === 'href') || + (nodeName === 'img' && key === 'src')) { // NOTE: urlResolve() doesn't support IE < 8 so we don't sanitize for that case. if (!msie || msie >= 8 ) { normalizedVal = urlResolve(value).href; @@ -967,7 +967,7 @@ function $CompileProvider($provide) { case 1: /* Element */ // use the node name: addDirective(directives, - directiveNormalize(nodeName_(node).toLowerCase()), 'E', maxPriority, ignoreDirective); + directiveNormalize(nodeName_(node)), 'E', maxPriority, ignoreDirective); // iterate over the attributes for (var attr, name, nName, ngAttrName, value, nAttrs = node.attributes, @@ -1735,7 +1735,7 @@ function $CompileProvider($provide) { function getTrustedContext(node, attrNormalizedName) { // maction[xlink:href] can source SVG. It's not limited to . if (attrNormalizedName == "xlinkHref" || - (nodeName_(node) != "IMG" && (attrNormalizedName == "src" || + (nodeName_(node) != "img" && (attrNormalizedName == "src" || attrNormalizedName == "ngSrc"))) { return $sce.RESOURCE_URL; } @@ -1749,7 +1749,7 @@ function $CompileProvider($provide) { if (!interpolateFn) return; - if (name === "multiple" && nodeName_(node) === "SELECT") { + if (name === "multiple" && nodeName_(node) === "select") { throw $compileMinErr("selmulti", "Binding to the 'multiple' attribute is not supported. Element: {0}", startingTag(node)); diff --git a/src/ng/location.js b/src/ng/location.js index 6ec7d337794c..be5369e0f87d 100644 --- a/src/ng/location.js +++ b/src/ng/location.js @@ -583,7 +583,7 @@ function $LocationProvider(){ var elm = jqLite(event.target); // traverse the DOM up to find first A tag - while (lowercase(elm[0].nodeName) !== 'a') { + while (nodeName_(elm[0]) !== 'a') { // ignore rewriting if no A tag (reached root element, or no parent - removed from document) if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return; } diff --git a/src/ngScenario/browserTrigger.js b/src/ngScenario/browserTrigger.js index f74a04c15110..bec029cd4ac8 100644 --- a/src/ngScenario/browserTrigger.js +++ b/src/ngScenario/browserTrigger.js @@ -33,7 +33,7 @@ var y = eventData.y; var inputType = (element.type) ? element.type.toLowerCase() : null, - nodeName = element.nodeName.toLowerCase(); + nodeName = nodeName_(element); if (!eventType) { eventType = { @@ -80,7 +80,7 @@ var ret = element.fireEvent('on' + eventType); if (inputType == 'submit') { while(element) { - if (element.nodeName.toLowerCase() == 'form') { + if (nodeName_(element) == 'form') { element.fireEvent('onsubmit'); break; } diff --git a/src/ngScenario/dsl.js b/src/ngScenario/dsl.js index 50d20c9510c9..ebad4d579401 100644 --- a/src/ngScenario/dsl.js +++ b/src/ngScenario/dsl.js @@ -377,7 +377,7 @@ angular.scenario.dsl('element', function() { var href = elements.attr('href'); var eventProcessDefault = elements.trigger('click')[0]; - if (href && elements[0].nodeName.toUpperCase() === 'A' && eventProcessDefault) { + if (href && nodeName_(elements[0]) === 'a' && eventProcessDefault) { this.application.navigateTo(href, function() { done(); }, done); @@ -394,7 +394,7 @@ angular.scenario.dsl('element', function() { var href = elements.attr('href'); var eventProcessDefault = elements.trigger('dblclick')[0]; - if (href && elements[0].nodeName.toUpperCase() === 'A' && eventProcessDefault) { + if (href && nodeName_(elements[0]) === 'a' && eventProcessDefault) { this.application.navigateTo(href, function() { done(); }, done); diff --git a/test/AngularSpec.js b/test/AngularSpec.js index 1b08a18e078d..104247d40595 100644 --- a/test/AngularSpec.js +++ b/test/AngularSpec.js @@ -846,7 +846,7 @@ describe('angular', function() { var div = jqLite('
' + '' + '
')[0]; - expect(nodeName_(div.childNodes[0])).toBe('NGTEST:FOO'); + expect(nodeName_(div.childNodes[0])).toBe('ngtest:foo'); expect(div.childNodes[0].getAttribute('ngtest:attr')).toBe('bar'); }); @@ -855,7 +855,7 @@ describe('angular', function() { var div = jqLite('
' + '' + '
')[0]; - expect(nodeName_(div.childNodes[0])).toBe('NGTEST:FOO'); + expect(nodeName_(div.childNodes[0])).toBe('ngtest:foo'); expect(div.childNodes[0].getAttribute('ngtest:attr')).toBe('bar'); }); } diff --git a/test/ng/compileSpec.js b/test/ng/compileSpec.js index 5bdbad42c776..c970866e836f 100755 --- a/test/ng/compileSpec.js +++ b/test/ng/compileSpec.js @@ -3532,7 +3532,7 @@ describe('$compile', function() { inject(function($compile, $rootScope) { var element = jqLite('
before
after
').contents(); expect(element.length).toEqual(3); - expect(nodeName_(element[1])).toBe('DIV'); + expect(nodeName_(element[1])).toBe('div'); $compile(element)($rootScope); expect(nodeName_(element[1])).toBe('#comment'); expect(nodeName_(comment)).toBe('#comment');