diff --git a/src/plots/plots.js b/src/plots/plots.js index 3f9e06fb1ae..ad838cd39b2 100644 --- a/src/plots/plots.js +++ b/src/plots/plots.js @@ -1338,7 +1338,8 @@ plots.graphJson = function(gd, dataonly, mode, output, useDefaults) { } var data = (useDefaults) ? gd._fullData : gd.data, - layout = (useDefaults) ? gd._fullLayout : gd.layout; + layout = (useDefaults) ? gd._fullLayout : gd.layout, + frames = (gd._transitionData || {})._frames; function stripObj(d) { if(typeof d === 'function') { @@ -1411,6 +1412,8 @@ plots.graphJson = function(gd, dataonly, mode, output, useDefaults) { if(gd.framework && gd.framework.isPolar) obj = gd.framework.getConfig(); + if(frames) obj.frames = stripObj(frames); + return (output === 'object') ? obj : JSON.stringify(obj); }; diff --git a/test/jasmine/tests/plots_test.js b/test/jasmine/tests/plots_test.js index 364e348b3a5..60afb54d805 100644 --- a/test/jasmine/tests/plots_test.js +++ b/test/jasmine/tests/plots_test.js @@ -494,4 +494,59 @@ describe('Test Plots', function() { assert(dest, src, expected); }); }); + + describe('Plots.graphJson', function() { + + it('should serialize data, layout and frames', function(done) { + var mock = { + data: [{ + x: [1, 2, 3], + y: [2, 1, 2] + }], + layout: { + title: 'base' + }, + frames: [{ + data: [{ + y: [1, 2, 1], + }], + layout: { + title: 'frame A' + }, + name: 'A' + }, null, { + data: [{ + y: [1, 2, 3], + }], + layout: { + title: 'frame B' + }, + name: 'B' + }, { + data: [null, false, undefined], + layout: 'garbage', + name: 'garbage' + }] + }; + + Plotly.plot(createGraphDiv(), mock).then(function(gd) { + var str = Plots.graphJson(gd, false, 'keepdata'); + var obj = JSON.parse(str); + + expect(obj.data).toEqual(mock.data); + expect(obj.layout).toEqual(mock.layout); + expect(obj.frames[0]).toEqual(mock.frames[0]); + expect(obj.frames[1]).toEqual(mock.frames[2]); + expect(obj.frames[2]).toEqual({ + data: [null, false, null], + layout: 'garbage', + name: 'garbage' + }); + }) + .then(function() { + destroyGraphDiv(); + done(); + }); + }); + }); });