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

fix(nodeName_): always return lowercase #4932

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions src/Angular.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
};
}

Expand Down Expand Up @@ -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;
}
}
Expand Down
6 changes: 3 additions & 3 deletions src/jqLite.js
Original file line number Diff line number Diff line change
Expand Up @@ -409,15 +409,15 @@ 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) {
// check dom last since we will most likely fail on 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({
Expand Down Expand Up @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion src/ng/anchorScroll.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
10 changes: 5 additions & 5 deletions src/ng/compile.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -967,7 +967,7 @@ function $CompileProvider($provide) {
case 1: /* Element */
// use the node name: <directive>
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,
Expand Down Expand Up @@ -1735,7 +1735,7 @@ function $CompileProvider($provide) {
function getTrustedContext(node, attrNormalizedName) {
// maction[xlink:href] can source SVG. It's not limited to <maction>.
if (attrNormalizedName == "xlinkHref" ||
(nodeName_(node) != "IMG" && (attrNormalizedName == "src" ||
(nodeName_(node) != "img" && (attrNormalizedName == "src" ||
attrNormalizedName == "ngSrc"))) {
return $sce.RESOURCE_URL;
}
Expand All @@ -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));
Expand Down
2 changes: 1 addition & 1 deletion src/ng/location.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
4 changes: 2 additions & 2 deletions src/ngScenario/browserTrigger.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
var y = eventData.y;

var inputType = (element.type) ? element.type.toLowerCase() : null,
nodeName = element.nodeName.toLowerCase();
nodeName = nodeName_(element);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the ngScenario module does not have access to private functions in angular.js, they're wrapped in a closure so it can't see them.


if (!eventType) {
eventType = {
Expand Down Expand Up @@ -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;
}
Expand Down
4 changes: 2 additions & 2 deletions src/ngScenario/dsl.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions test/AngularSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -846,7 +846,7 @@ describe('angular', function() {
var div = jqLite('<div xmlns:ngtest="http://angularjs.org/">' +
'<ngtest:foo ngtest:attr="bar"></ngtest:foo>' +
'</div>')[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');
});

Expand All @@ -855,7 +855,7 @@ describe('angular', function() {
var div = jqLite('<div xmlns:ngtest="http://angularjs.org/">' +
'<ngtest:foo ngtest:attr="bar"></ng-test>' +
'</div>')[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');
});
}
Expand Down
2 changes: 1 addition & 1 deletion test/ng/compileSpec.js
Original file line number Diff line number Diff line change
Expand Up @@ -3532,7 +3532,7 @@ describe('$compile', function() {
inject(function($compile, $rootScope) {
var element = jqLite('<div>before<div transclude></div>after</div>').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');
Expand Down