Skip to content

Commit b437afb

Browse files
fix(angular.copy): support copying XML nodes
Closes angular#5429
1 parent df0921c commit b437afb

File tree

2 files changed

+10
-5
lines changed

2 files changed

+10
-5
lines changed

Diff for: src/Angular.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -825,8 +825,8 @@ function copy(source, destination, stackSource, stackDest) {
825825
} else if (isRegExp(source)) {
826826
destination = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]);
827827
destination.lastIndex = source.lastIndex;
828-
} else if (source.cloneNode) {
829-
destination = source.cloneNode();
828+
} else if (isFunction(source.cloneNode)) {
829+
destination = source.cloneNode(true);
830830
} else {
831831
var emptyObject = Object.create(getPrototypeOf(source));
832832
return copy(source, emptyObject, stackSource, stackDest);

Diff for: test/AngularSpec.js

+8-3
Original file line numberDiff line numberDiff line change
@@ -386,13 +386,18 @@ describe('angular', function() {
386386
expect(aCopy).toBe(aCopy.self);
387387
});
388388

389-
it("should support XML nodes", function() {
390-
var anElement = document.createElement("foo");
391-
var theCopy = anElement.cloneNode();
389+
it('should deeply copy XML nodes', function() {
390+
var anElement = document.createElement('foo');
391+
anElement.appendChild(document.createElement('bar'));
392+
var theCopy = anElement.cloneNode(true);
392393
expect(copy(anElement).outerHTML).toEqual(theCopy.outerHTML);
393394
expect(copy(anElement)).not.toBe(anElement);
394395
});
395396

397+
it('should not try to call a non-function called `cloneNode`', function() {
398+
expect(copy.bind(null, { cloneNode: 100 })).not.toThrow();
399+
});
400+
396401
it('should handle objects with multiple references', function() {
397402
var b = {};
398403
var a = [b, -1, b];

0 commit comments

Comments
 (0)