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

Commit 6639ca9

Browse files
committed
fix(ngInclude): correctly add svg-namespaced template content
It is now possible for ngInclude to correctly load SVG content in non-blink browsers, which do not sort out the namespace when parsing HTML. Closes #7538 Closes #8981 Closes #8997
1 parent 719f42e commit 6639ca9

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

src/ng/directive/ngInclude.js

+12
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,18 @@ var ngIncludeFillContentDirective = ['$compile',
267267
priority: -400,
268268
require: 'ngInclude',
269269
link: function(scope, $element, $attr, ctrl) {
270+
if (/SVG/.test($element[0].toString())) {
271+
// WebKit: https://bugs.webkit.org/show_bug.cgi?id=135698 --- SVG elements do not
272+
// support innerHTML, so detect this here and try to generate the contents
273+
// specially.
274+
$element.empty();
275+
$compile(jqLiteBuildFragment(ctrl.template, document).childNodes)(scope,
276+
function namespaceAdaptedClone(clone) {
277+
$element.append(clone);
278+
}, undefined, undefined, $element);
279+
return;
280+
}
281+
270282
$element.html(ctrl.template);
271283
$compile($element.contents())(scope);
272284
}

test/ng/directive/ngIncludeSpec.js

+40
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,46 @@ describe('ngInclude', function() {
362362
}));
363363

364364

365+
it('should construct SVG template elements with correct namespace', function() {
366+
if (!window.SVGRectElement) return;
367+
module(function($compileProvider) {
368+
$compileProvider.directive('test', valueFn({
369+
templateNamespace: 'svg',
370+
templateUrl: 'my-rect.html',
371+
replace: true
372+
}));
373+
});
374+
inject(function($compile, $rootScope, $httpBackend) {
375+
$httpBackend.expectGET('my-rect.html').respond('<g ng-include="\'include.svg\'"></g>');
376+
$httpBackend.expectGET('include.svg').respond('<rect></rect><rect></rect>');
377+
element = $compile('<svg><test></test></svg>')($rootScope);
378+
$httpBackend.flush();
379+
var child = element.find('rect');
380+
expect(child.length).toBe(2);
381+
expect(child[0] instanceof SVGRectElement).toBe(true);
382+
});
383+
});
384+
385+
386+
it('should compile only the template content of an SVG template', function() {
387+
if (!window.SVGRectElement) return;
388+
module(function($compileProvider) {
389+
$compileProvider.directive('test', valueFn({
390+
templateNamespace: 'svg',
391+
templateUrl: 'my-rect.html',
392+
replace: true
393+
}));
394+
});
395+
inject(function($compile, $rootScope, $httpBackend) {
396+
$httpBackend.expectGET('my-rect.html').respond('<g ng-include="\'include.svg\'"><a></a></g>');
397+
$httpBackend.expectGET('include.svg').respond('<rect></rect><rect></rect>');
398+
element = $compile('<svg><test></test></svg>')($rootScope);
399+
$httpBackend.flush();
400+
expect(element.find('a').length).toBe(0);
401+
});
402+
});
403+
404+
365405
describe('autoscroll', function() {
366406
var autoScrollSpy;
367407

0 commit comments

Comments
 (0)