diff --git a/IPython/html/static/widgets/js/manager.js b/IPython/html/static/widgets/js/manager.js index 5696f03f9..d1bcd6161 100644 --- a/IPython/html/static/widgets/js/manager.js +++ b/IPython/html/static/widgets/js/manager.js @@ -381,16 +381,18 @@ define([ }; // Get the views that are displayed *now*. - model_promises.push(utils.resolve_promises_dict(model.views).then(function(model_views) { - for (var id in model_views) { - if (model_views.hasOwnProperty(id)) { - var view = model_views[id]; - if (view.options.cell_index) { - state[model_id].views.push(view.options.cell_index); + (function(local_state) { + model_promises.push(utils.resolve_promises_dict(model.views).then(function(model_views) { + for (var id in model_views) { + if (model_views.hasOwnProperty(id)) { + var view = model_views[id]; + if (view.options.cell_index) { + local_state.views.push(view.options.cell_index); + } } } - } - })); + })); + })(state[model_id]); } } } diff --git a/IPython/html/tests/widgets/manager.js b/IPython/html/tests/widgets/manager.js index 3a0120325..296e52d0d 100644 --- a/IPython/html/tests/widgets/manager.js +++ b/IPython/html/tests/widgets/manager.js @@ -42,4 +42,53 @@ casper.notebook_test(function () { var slider_id = this.evaluate(function() { return window.slider_id; }); this.test.assertEquals(output, slider_id, "Widget created from the front-end."); }); + + // Widget persistence tests. + index = this.append_cell( + 'from IPython.html.widgets import HTML\n' + + 'from IPython.display import display\n' + + 'display(HTML(value="
"))'); + this.execute_cell_then(index, function() {}); + + index = this.append_cell( + 'display(HTML(value="
"))'); + this.execute_cell_then(index, function() {}); + + var that = this; + this.then(function() { + // Wait for the widgets to be shown. + that.waitForSelector('#hello', function() { + that.waitForSelector('#world', function() { + that.test.assertExists('#hello', 'Hello HTML widget constructed.'); + that.test.assertExists('#world', 'World HTML widget constructed.'); + + // Save the notebook. + that.evaluate(function() { + IPython.notebook.save_notebook(false).then(function() { + window.was_saved = true; + }); + }); + that.waitFor(function check() { + return that.evaluate(function() { + return window.was_saved; + }); + }, function then() { + + // Reload the page + that.reload(function() { + + // Wait for the elements to show up again. + that.waitForSelector('#hello', function() { + that.waitForSelector('#world', function() { + that.test.assertExists('#hello', 'Hello HTML widget persisted.'); + that.test.assertExists('#world', 'World HTML widget persisted.'); + }); + }); + }); + }); + }); + }); + }); + + });