Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 1e8df68

Browse files
author
Yuri Sulyma
committed
fix(nodeName_): always return lowercase
Fixes #3987. Changed nodeName_ to always return lowercase. Changed code directly using .nodeName to use nodeName() instead.
1 parent fa82a31 commit 1e8df68

File tree

9 files changed

+26
-24
lines changed

9 files changed

+26
-24
lines changed

src/Angular.js

+9-7
Original file line numberDiff line numberDiff line change
@@ -585,12 +585,14 @@ function makeMap(str){
585585
if (msie < 9) {
586586
nodeName_ = function(element) {
587587
element = element.nodeName ? element : element[0];
588-
return (element.scopeName && element.scopeName != 'HTML')
589-
? uppercase(element.scopeName + ':' + element.nodeName) : element.nodeName;
588+
return lowercase(
589+
(element.scopeName && element.scopeName != 'HTML')
590+
? element.scopeName + ':' + element.nodeName : element.nodeName
591+
);
590592
};
591593
} else {
592594
nodeName_ = function(element) {
593-
return element.nodeName ? element.nodeName : element[0].nodeName;
595+
return lowercase(element.nodeName ? element.nodeName : element[0].nodeName);
594596
};
595597
}
596598

@@ -653,10 +655,10 @@ function arrayRemove(array, value) {
653655

654656
function isLeafNode (node) {
655657
if (node) {
656-
switch (node.nodeName) {
657-
case "OPTION":
658-
case "PRE":
659-
case "TITLE":
658+
switch (nodeName_(node)) {
659+
case "option":
660+
case "pre":
661+
case "title":
660662
return true;
661663
}
662664
}

src/jqLite.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -409,15 +409,15 @@ forEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','),
409409
});
410410
var BOOLEAN_ELEMENTS = {};
411411
forEach('input,select,option,textarea,button,form,details'.split(','), function(value) {
412-
BOOLEAN_ELEMENTS[uppercase(value)] = true;
412+
BOOLEAN_ELEMENTS[value] = true;
413413
});
414414

415415
function getBooleanAttrName(element, name) {
416416
// check dom last since we will most likely fail on name
417417
var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()];
418418

419419
// booleanAttr is here twice to minimize DOM access
420-
return booleanAttr && BOOLEAN_ELEMENTS[element.nodeName] && booleanAttr;
420+
return booleanAttr && BOOLEAN_ELEMENTS[nodeName_(element)] && booleanAttr;
421421
}
422422

423423
forEach({
@@ -530,7 +530,7 @@ forEach({
530530

531531
val: function(element, value) {
532532
if (isUndefined(value)) {
533-
if (nodeName_(element) === 'SELECT' && element.multiple) {
533+
if (element.multiple && nodeName_(element) === 'select') {
534534
var result = [];
535535
forEach(element.options, function (option) {
536536
if (option.selected) {

src/ng/anchorScroll.js

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

src/ng/compile.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -703,8 +703,8 @@ function $CompileProvider($provide) {
703703
nodeName = nodeName_(this.$$element);
704704

705705
// sanitize a[href] and img[src] values
706-
if ((nodeName === 'A' && key === 'href') ||
707-
(nodeName === 'IMG' && key === 'src')) {
706+
if ((nodeName === 'a' && key === 'href') ||
707+
(nodeName === 'img' && key === 'src')) {
708708
// NOTE: urlResolve() doesn't support IE < 8 so we don't sanitize for that case.
709709
if (!msie || msie >= 8 ) {
710710
normalizedVal = urlResolve(value).href;
@@ -967,7 +967,7 @@ function $CompileProvider($provide) {
967967
case 1: /* Element */
968968
// use the node name: <directive>
969969
addDirective(directives,
970-
directiveNormalize(nodeName_(node).toLowerCase()), 'E', maxPriority, ignoreDirective);
970+
directiveNormalize(nodeName_(node)), 'E', maxPriority, ignoreDirective);
971971

972972
// iterate over the attributes
973973
for (var attr, name, nName, ngAttrName, value, nAttrs = node.attributes,
@@ -1735,7 +1735,7 @@ function $CompileProvider($provide) {
17351735
function getTrustedContext(node, attrNormalizedName) {
17361736
// maction[xlink:href] can source SVG. It's not limited to <maction>.
17371737
if (attrNormalizedName == "xlinkHref" ||
1738-
(nodeName_(node) != "IMG" && (attrNormalizedName == "src" ||
1738+
(nodeName_(node) != "img" && (attrNormalizedName == "src" ||
17391739
attrNormalizedName == "ngSrc"))) {
17401740
return $sce.RESOURCE_URL;
17411741
}
@@ -1749,7 +1749,7 @@ function $CompileProvider($provide) {
17491749
if (!interpolateFn) return;
17501750

17511751

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

src/ng/location.js

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

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

src/ngScenario/browserTrigger.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
var y = eventData.y;
3434

3535
var inputType = (element.type) ? element.type.toLowerCase() : null,
36-
nodeName = element.nodeName.toLowerCase();
36+
nodeName = nodeName_(element);
3737

3838
if (!eventType) {
3939
eventType = {
@@ -80,7 +80,7 @@
8080
var ret = element.fireEvent('on' + eventType);
8181
if (inputType == 'submit') {
8282
while(element) {
83-
if (element.nodeName.toLowerCase() == 'form') {
83+
if (nodeName_(element) == 'form') {
8484
element.fireEvent('onsubmit');
8585
break;
8686
}

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 && nodeName_(elements[0]) === '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 && nodeName_(elements[0]) === '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
@@ -846,7 +846,7 @@ describe('angular', function() {
846846
var div = jqLite('<div xmlns:ngtest="http://angularjs.org/">' +
847847
'<ngtest:foo ngtest:attr="bar"></ngtest:foo>' +
848848
'</div>')[0];
849-
expect(nodeName_(div.childNodes[0])).toBe('NGTEST:FOO');
849+
expect(nodeName_(div.childNodes[0])).toBe('ngtest:foo');
850850
expect(div.childNodes[0].getAttribute('ngtest:attr')).toBe('bar');
851851
});
852852

@@ -855,7 +855,7 @@ describe('angular', function() {
855855
var div = jqLite('<div xmlns:ngtest="http://angularjs.org/">' +
856856
'<ngtest:foo ngtest:attr="bar"></ng-test>' +
857857
'</div>')[0];
858-
expect(nodeName_(div.childNodes[0])).toBe('NGTEST:FOO');
858+
expect(nodeName_(div.childNodes[0])).toBe('ngtest:foo');
859859
expect(div.childNodes[0].getAttribute('ngtest:attr')).toBe('bar');
860860
});
861861
}

test/ng/compileSpec.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -3532,7 +3532,7 @@ describe('$compile', function() {
35323532
inject(function($compile, $rootScope) {
35333533
var element = jqLite('<div>before<div transclude></div>after</div>').contents();
35343534
expect(element.length).toEqual(3);
3535-
expect(nodeName_(element[1])).toBe('DIV');
3535+
expect(nodeName_(element[1])).toBe('div');
35363536
$compile(element)($rootScope);
35373537
expect(nodeName_(element[1])).toBe('#comment');
35383538
expect(nodeName_(comment)).toBe('#comment');

0 commit comments

Comments
 (0)