Skip to content

Commit fc62a92

Browse files
Yuri SulymaCarlo s A. Guillen
Yuri Sulyma
authored and
Carlo s A. Guillen
committed
fix(Angular): nodeName should always be lowercase
XHTML uses lowercase node names, while HTML often uses uppercase. The generally accepted convention is to always lowercase them. Fixes angular#3987
1 parent 5e944a1 commit fc62a92

9 files changed

+25
-24
lines changed

src/Angular.js

+9-7
Original file line numberDiff line numberDiff line change
@@ -631,12 +631,14 @@ function makeMap(str) {
631631
if (msie < 9) {
632632
nodeName_ = function(element) {
633633
element = element.nodeName ? element : element[0];
634-
return (element.scopeName && element.scopeName != 'HTML')
635-
? uppercase(element.scopeName + ':' + element.nodeName) : element.nodeName;
634+
return lowercase(
635+
(element.scopeName && element.scopeName != 'HTML')
636+
? element.scopeName + ':' + element.nodeName : element.nodeName
637+
);
636638
};
637639
} else {
638640
nodeName_ = function(element) {
639-
return element.nodeName ? element.nodeName : element[0].nodeName;
641+
return lowercase(element.nodeName ? element.nodeName : element[0].nodeName);
640642
};
641643
}
642644

@@ -699,10 +701,10 @@ function arrayRemove(array, value) {
699701

700702
function isLeafNode (node) {
701703
if (node) {
702-
switch (node.nodeName) {
703-
case "OPTION":
704-
case "PRE":
705-
case "TITLE":
704+
switch (nodeName_(node)) {
705+
case "option":
706+
case "pre":
707+
case "title":
706708
return true;
707709
}
708710
}

src/jqLite.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -501,15 +501,15 @@ forEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','),
501501
});
502502
var BOOLEAN_ELEMENTS = {};
503503
forEach('input,select,option,textarea,button,form,details'.split(','), function(value) {
504-
BOOLEAN_ELEMENTS[uppercase(value)] = true;
504+
BOOLEAN_ELEMENTS[value] = true;
505505
});
506506

507507
function getBooleanAttrName(element, name) {
508508
// check dom last since we will most likely fail on name
509509
var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()];
510510

511511
// booleanAttr is here twice to minimize DOM access
512-
return booleanAttr && BOOLEAN_ELEMENTS[element.nodeName] && booleanAttr;
512+
return booleanAttr && BOOLEAN_ELEMENTS[nodeName_(element)] && booleanAttr;
513513
}
514514

515515
forEach({
@@ -622,7 +622,7 @@ forEach({
622622

623623
val: function(element, value) {
624624
if (isUndefined(value)) {
625-
if (nodeName_(element) === 'SELECT' && element.multiple) {
625+
if (element.multiple && nodeName_(element) === 'select') {
626626
var result = [];
627627
forEach(element.options, function (option) {
628628
if (option.selected) {

src/ng/anchorScroll.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ function $AnchorScrollProvider() {
6767
function getFirstAnchor(list) {
6868
var result = null;
6969
forEach(list, function(element) {
70-
if (!result && lowercase(element.nodeName) === 'a') result = element;
70+
if (!result && nodeName_(element) === 'a') result = element;
7171
});
7272
return result;
7373
}

src/ng/compile.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -739,8 +739,8 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
739739
nodeName = nodeName_(this.$$element);
740740

741741
// sanitize a[href] and img[src] values
742-
if ((nodeName === 'A' && key === 'href') ||
743-
(nodeName === 'IMG' && key === 'src')) {
742+
if ((nodeName === 'a' && key === 'href') ||
743+
(nodeName === 'img' && key === 'src')) {
744744
this[key] = value = $$sanitizeUri(value, key === 'src');
745745
}
746746

@@ -1007,7 +1007,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
10071007
case 1: /* Element */
10081008
// use the node name: <directive>
10091009
addDirective(directives,
1010-
directiveNormalize(nodeName_(node).toLowerCase()), 'E', maxPriority, ignoreDirective);
1010+
directiveNormalize(nodeName_(node)), 'E', maxPriority, ignoreDirective);
10111011

10121012
// iterate over the attributes
10131013
for (var attr, name, nName, ngAttrName, value, isNgAttr, nAttrs = node.attributes,
@@ -1847,8 +1847,8 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
18471847
var tag = nodeName_(node);
18481848
// maction[xlink:href] can source SVG. It's not limited to <maction>.
18491849
if (attrNormalizedName == "xlinkHref" ||
1850-
(tag == "FORM" && attrNormalizedName == "action") ||
1851-
(tag != "IMG" && (attrNormalizedName == "src" ||
1850+
(tag == "form" && attrNormalizedName == "action") ||
1851+
(tag != "img" && (attrNormalizedName == "src" ||
18521852
attrNormalizedName == "ngSrc"))) {
18531853
return $sce.RESOURCE_URL;
18541854
}
@@ -1862,7 +1862,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
18621862
if (!interpolateFn) return;
18631863

18641864

1865-
if (name === "multiple" && nodeName_(node) === "SELECT") {
1865+
if (name === "multiple" && nodeName_(node) === "select") {
18661866
throw $compileMinErr("selmulti",
18671867
"Binding to the 'multiple' attribute is not supported. Element: {0}",
18681868
startingTag(node));

src/ng/location.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -636,7 +636,7 @@ function $LocationProvider(){
636636
var elm = jqLite(event.target);
637637

638638
// traverse the DOM up to find first A tag
639-
while (lowercase(elm[0].nodeName) !== 'a') {
639+
while (nodeName_(elm[0]) !== 'a') {
640640
// ignore rewriting if no A tag (reached root element, or no parent - removed from document)
641641
if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return;
642642
}

src/ngScenario/browserTrigger.js

-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434

3535
var inputType = (element.type) ? element.type.toLowerCase() : null,
3636
nodeName = element.nodeName.toLowerCase();
37-
3837
if (!eventType) {
3938
eventType = {
4039
'text': 'change',

src/ngScenario/dsl.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ angular.scenario.dsl('element', function() {
377377
var href = elements.attr('href');
378378
var eventProcessDefault = elements.trigger('click')[0];
379379

380-
if (href && elements[0].nodeName.toUpperCase() === 'A' && eventProcessDefault) {
380+
if (href && elements[0].nodeName.toLowerCase() === 'a' && eventProcessDefault) {
381381
this.application.navigateTo(href, function() {
382382
done();
383383
}, done);
@@ -394,7 +394,7 @@ angular.scenario.dsl('element', function() {
394394
var href = elements.attr('href');
395395
var eventProcessDefault = elements.trigger('dblclick')[0];
396396

397-
if (href && elements[0].nodeName.toUpperCase() === 'A' && eventProcessDefault) {
397+
if (href && elements[0].nodeName.toLowerCase() === 'a' && eventProcessDefault) {
398398
this.application.navigateTo(href, function() {
399399
done();
400400
}, done);

test/AngularSpec.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -915,7 +915,7 @@ describe('angular', function() {
915915
var div = jqLite('<div xmlns:ngtest="http://angularjs.org/">' +
916916
'<ngtest:foo ngtest:attr="bar"></ngtest:foo>' +
917917
'</div>')[0];
918-
expect(nodeName_(div.childNodes[0])).toBe('NGTEST:FOO');
918+
expect(nodeName_(div.childNodes[0])).toBe('ngtest:foo');
919919
expect(div.childNodes[0].getAttribute('ngtest:attr')).toBe('bar');
920920
});
921921

@@ -924,7 +924,7 @@ describe('angular', function() {
924924
var div = jqLite('<div xmlns:ngtest="http://angularjs.org/">' +
925925
'<ngtest:foo ngtest:attr="bar"></ng-test>' +
926926
'</div>')[0];
927-
expect(nodeName_(div.childNodes[0])).toBe('NGTEST:FOO');
927+
expect(nodeName_(div.childNodes[0])).toBe('ngtest:foo');
928928
expect(div.childNodes[0].getAttribute('ngtest:attr')).toBe('bar');
929929
});
930930
}

test/ng/compileSpec.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -4350,7 +4350,7 @@ describe('$compile', function() {
43504350
inject(function($compile, $rootScope) {
43514351
var element = jqLite('<div>before<div transclude></div>after</div>').contents();
43524352
expect(element.length).toEqual(3);
4353-
expect(nodeName_(element[1])).toBe('DIV');
4353+
expect(nodeName_(element[1])).toBe('div');
43544354
$compile(element)($rootScope);
43554355
expect(nodeName_(element[1])).toBe('#comment');
43564356
expect(nodeName_(comment)).toBe('#comment');

0 commit comments

Comments
 (0)