diff --git a/src/shapes/image.class.js b/src/shapes/image.class.js index d0dbf537c36..089db6a07d3 100644 --- a/src/shapes/image.class.js +++ b/src/shapes/image.class.js @@ -630,7 +630,8 @@ * @param {Object} object Object to create an instance from * @param {Function} callback Callback to invoke when an image instance is created */ - fabric.Image.fromObject = function(object, callback) { + fabric.Image.fromObject = function(_object, callback) { + var object = fabric.util.object.clone(_object); fabric.util.loadImage(object.src, function(img, error) { if (error) { callback && callback(null, error); diff --git a/test/unit/image.js b/test/unit/image.js index 679a4ca891a..c7e05c6e5ea 100644 --- a/test/unit/image.js +++ b/test/unit/image.js @@ -337,6 +337,39 @@ }); }); + QUnit.test('fromObject does not mutate data', function(assert) { + var done = assert.async(); + assert.ok(typeof fabric.Image.fromObject === 'function'); + + var obj = fabric.util.object.extend(fabric.util.object.clone(REFERENCE_IMG_OBJECT), { + src: IMG_SRC + }); + var brightness = { + type: 'Brightness', + brightness: 0.1 + }; + var contrast = { + type: 'Contrast', + contrast: 0.1 + }; + obj.filters = [brightness]; + obj.resizeFilter = contrast; + var copyOfFilters = obj.filters; + var copyOfBrighteness = brightness; + var copyOfContrast = contrast; + var copyOfObject = obj; + fabric.Image.fromObject(obj, function(){ + assert.ok(copyOfFilters === obj.filters, 'filters array did not mutate'); + assert.ok(copyOfBrighteness === copyOfFilters[0], 'filter is same object'); + assert.deepEqual(copyOfBrighteness, obj.filters[0], 'did not mutate filter'); + assert.deepEqual(copyOfFilters, obj.filters, 'did not mutate array'); + assert.deepEqual(copyOfContrast, obj.resizeFilter, 'did not mutate object'); + assert.deepEqual(copyOfObject, obj, 'did not change any value'); + assert.ok(copyOfContrast === obj.resizeFilter, 'resizefilter is same object'); + done(); + }); + }); + QUnit.test('fromURL', function(assert) { var done = assert.async(); assert.ok(typeof fabric.Image.fromURL === 'function');