aboutsummaryrefslogtreecommitdiffstats
path: root/src/service/compiler.js
diff options
context:
space:
mode:
authorMisko Hevery2012-03-12 16:49:28 -0700
committerMisko Hevery2012-03-12 21:59:50 -0700
commit48096048cf92bcada9b8c4f54d7002fbcf239416 (patch)
treeb41a4354fbdb9583686521e5c4ffe0a6eaed48c2 /src/service/compiler.js
parent317adb36a480c60f41b6f69bc67d66fe1b08bdae (diff)
downloadangular.js-48096048cf92bcada9b8c4f54d7002fbcf239416.tar.bz2
fix(svg): normalize class access for SVG
Diffstat (limited to 'src/service/compiler.js')
-rw-r--r--src/service/compiler.js31
1 files changed, 21 insertions, 10 deletions
diff --git a/src/service/compiler.js b/src/service/compiler.js
index 5fb9035d..d23fd6e5 100644
--- a/src/service/compiler.js
+++ b/src/service/compiler.js
@@ -247,7 +247,7 @@ function $CompileProvider($provide) {
var element = cloneConnectFn
? JQLitePrototype.clone.call(templateElement) // IMPORTANT!!!
: templateElement;
- element.data('$scope', scope).addClass('ng-scope');
+ safeAddClass(element.data('$scope', scope), 'ng-scope');
if (cloneConnectFn) cloneConnectFn(element, scope);
if (linkingFn) linkingFn(scope, element, element);
return element;
@@ -258,6 +258,15 @@ function $CompileProvider($provide) {
throw Error("Unsupported '" + mode + "' for '" + localName + "'.");
}
+ function safeAddClass(element, className) {
+ try {
+ element.addClass(className);
+ } catch(e) {
+ // ignore, since it means that we are trying to set class on
+ // SVG element, where class name is read-only.
+ }
+ }
+
/**
* Compile function matches each node in nodeList against the directives. Once all directives
* for a particular node are collected their compile functions are executed. The compile
@@ -387,12 +396,14 @@ function $CompileProvider($provide) {
// use class as directive
className = node.className;
- while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) {
- nName = directiveNormalize(match[2]);
- if (addDirective(directives, nName, 'C', maxPriority)) {
- attrs[nName] = trim(match[3]);
+ if (isString(className)) {
+ while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) {
+ nName = directiveNormalize(match[2]);
+ if (addDirective(directives, nName, 'C', maxPriority)) {
+ attrs[nName] = trim(match[3]);
+ }
+ className = className.substr(match.index + match[0].length);
}
- className = className.substr(match.index + match[0].length);
}
break;
case 3: /* Text Node */
@@ -459,10 +470,10 @@ function $CompileProvider($provide) {
if (directiveValue = directive.scope) {
assertNoDuplicate('isolated scope', newIsolatedScopeDirective, directive, element);
if (isObject(directiveValue)) {
- element.addClass('ng-isolate-scope');
+ safeAddClass(element, 'ng-isolate-scope');
newIsolatedScopeDirective = directive;
}
- element.addClass('ng-scope');
+ safeAddClass(element, 'ng-scope');
newScopeDirective = newScopeDirective || directive;
}
@@ -725,7 +736,7 @@ function $CompileProvider($provide) {
// copy the new attributes on the old attrs object
forEach(src, function(value, key) {
if (key == 'class') {
- element.addClass(value);
+ safeAddClass(element, value);
} else if (key == 'style') {
element.attr('style', element.attr('style') + ';' + value);
} else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) {
@@ -837,7 +848,7 @@ function $CompileProvider($provide) {
var parent = node.parent(),
bindings = parent.data('$binding') || [];
bindings.push(interpolateFn);
- parent.data('$binding', bindings).addClass('ng-binding');
+ safeAddClass(parent.data('$binding', bindings), 'ng-binding');
scope.$watch(interpolateFn, function(value) {
node[0].nodeValue = value;
});