##// END OF EJS Templates
Fix race condition in javascript kernel message processing...
Fix race condition in javascript kernel message processing Because the binary messages are now deserialized using the asynchronous FileReader API, we need to have some way to force the messages to still be processed in the order they are received. This patch implements a simple processing queue using promises.

File last commit:

r20335:407d0710
r20441:834cd9c4
Show More
manager.js
94 lines | 3.5 KiB | application/javascript | JavascriptLexer
Jonathan Frederic
Clarified API for the create_model function,...
r18512 // Test the widget manager.
casper.notebook_test(function () {
var index;
this.then(function () {
// Check if the WidgetManager class is defined.
this.test.assert(this.evaluate(function() {
return IPython.WidgetManager !== undefined;
}), 'WidgetManager class is defined');
// Check if the widget manager has been instantiated.
this.test.assert(this.evaluate(function() {
return IPython.notebook.kernel.widget_manager !== undefined;
}), 'Notebook widget manager instantiated');
// Try creating a widget from Javascript.
Jonathan Frederic
Rebase fixes
r18517 this.evaluate(function() {
IPython.notebook.kernel.widget_manager.create_model({
model_name: 'WidgetModel',
Jonathan Frederic
Initial stab at adding promises to the widget framework.
r18882 widget_class: 'IPython.html.widgets.widget_int.IntSlider'})
.then(function(model) {
Jonathan Frederic
Rebase fixes
r18517 console.log('Create success!', model);
window.slider_id = model.id;
Jonathan Frederic
Initial stab at adding promises to the widget framework.
r18882 }, function(error) { console.log(error); });
Jonathan Frederic
Rebase fixes
r18517 });
});
// Wait for the state to be recieved.
this.waitFor(function check() {
return this.evaluate(function() {
return window.slider_id !== undefined;
Jonathan Frederic
Clarified API for the create_model function,...
r18512 });
});
index = this.append_cell(
'from IPython.html.widgets import Widget\n' +
Jonathan Frederic
Address some more review comments...
r18514 'widget = list(Widget.widgets.values())[0]\n' +
Jonathan Frederic
Clarified API for the create_model function,...
r18512 'print(widget.model_id)');
this.execute_cell_then(index, function(index) {
var output = this.get_output_cell(index).text.trim();
Jonathan Frederic
Rebase fixes
r18517 var slider_id = this.evaluate(function() { return window.slider_id; });
this.test.assertEquals(output, slider_id, "Widget created from the front-end.");
Jonathan Frederic
Clarified API for the create_model function,...
r18512 });
Jonathan Frederic
Test for persistence.
r20335
// Widget persistence tests.
index = this.append_cell(
'from IPython.html.widgets import HTML\n' +
'from IPython.display import display\n' +
'display(HTML(value="<div id=\'hello\'></div>"))');
this.execute_cell_then(index, function() {});
index = this.append_cell(
'display(HTML(value="<div id=\'world\'></div>"))');
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.');
});
});
});
});
});
});
});
Jonathan Frederic
Clarified API for the create_model function,...
r18512 });