diff --git a/IPython/html/widgets/base.py b/IPython/html/widgets/base.py
index 83a73aa..0d3dd95 100644
--- a/IPython/html/widgets/base.py
+++ b/IPython/html/widgets/base.py
@@ -8,7 +8,7 @@ import os
import IPython
from IPython.kernel.comm import Comm
from IPython.config import LoggingConfigurable
-from IPython.utils.traitlets import Unicode, Dict
+from IPython.utils.traitlets import Unicode, Dict, List
from IPython.display import Javascript, display
from IPython.utils.py3compat import string_types
@@ -18,6 +18,7 @@ class Widget(LoggingConfigurable):
### Public declarations
target_name = Unicode('widget')
default_view_name = Unicode()
+ js_requirements = List()
### Private/protected declarations
@@ -122,6 +123,10 @@ class Widget(LoggingConfigurable):
if not view_name:
view_name = self.default_view_name
+ # Require traitlet specified widget js
+ for requirement in self.js_requirements:
+ self._require_js(requirement)
+
# Create a comm.
if self.comm is None:
self.comm = Comm(target_name=self.target_name)
@@ -154,4 +159,17 @@ class Widget(LoggingConfigurable):
pass # Eat errors, nom nom nom
self.comm.send({"method": "update",
"state": state})
-
\ No newline at end of file
+
+ ### Private methods
+
+ def _require_js(self, js_path):
+ # Since we are loading requirements that must be loaded before this call
+ # returns, preform async js load.
+ display(Javascript(data="""
+$.ajax({
+ url: '{0}',
+ async: false,
+ dataType: "script",
+ timeout: 1000, // Wait a maximum of one second for the script to load.
+});
+ """.format(js_path)))
\ No newline at end of file
diff --git a/IPython/html/widgets/container.py b/IPython/html/widgets/container.py
index d83a44a..9b81d17 100644
--- a/IPython/html/widgets/container.py
+++ b/IPython/html/widgets/container.py
@@ -1,11 +1,12 @@
import os
from base import Widget
-from IPython.utils.traitlets import Unicode
+from IPython.utils.traitlets import Unicode, List
from IPython.utils.javascript import display_all_js
class ContainerWidget(Widget):
target_name = Unicode('container_widget')
default_view_name = Unicode('ContainerView')
+ js_requirements = List(["notebook/js/widgets/container.js"])
_keys = []
diff --git a/IPython/html/widgets/float_range.py b/IPython/html/widgets/float_range.py
index 3227b52..3a03ea7 100644
--- a/IPython/html/widgets/float_range.py
+++ b/IPython/html/widgets/float_range.py
@@ -1,12 +1,13 @@
import os
from base import Widget
-from IPython.utils.traitlets import Unicode, Float, Bool
+from IPython.utils.traitlets import Unicode, Float, Bool, List
from IPython.utils.javascript import display_all_js
class FloatRangeWidget(Widget):
target_name = Unicode('FloatRangeWidgetModel')
default_view_name = Unicode('FloatSliderView')
+ js_requirements = List(["notebook/js/widgets/float_range.js"])
_keys = ['value', 'step', 'max', 'min', 'disabled', 'orientation']
value = Float(0.0)
diff --git a/IPython/html/widgets/int_range.py b/IPython/html/widgets/int_range.py
index 541565c..b35ca75 100644
--- a/IPython/html/widgets/int_range.py
+++ b/IPython/html/widgets/int_range.py
@@ -1,12 +1,13 @@
import os
from base import Widget
-from IPython.utils.traitlets import Unicode, Int, Bool
+from IPython.utils.traitlets import Unicode, Int, Bool, List
from IPython.utils.javascript import display_all_js
class IntRangeWidget(Widget):
target_name = Unicode('IntRangeWidgetModel')
default_view_name = Unicode('IntSliderView')
+ js_requirements = List(["notebook/js/widgets/int_range.js"])
_keys = ['value', 'step', 'max', 'min', 'disabled', 'orientation']
value = Int(0)
diff --git a/IPython/html/widgets/selection.py b/IPython/html/widgets/selection.py
index 2406fe9..3f6d856 100644
--- a/IPython/html/widgets/selection.py
+++ b/IPython/html/widgets/selection.py
@@ -7,6 +7,7 @@ from IPython.utils.javascript import display_all_js
class SelectionWidget(Widget):
target_name = Unicode('SelectionWidgetModel')
default_view_name = Unicode('DropdownView')
+ js_requirements = List(["notebook/js/widgets/selection.js"])
_keys = ['value', 'values', 'disabled']
value = Unicode()
diff --git a/IPython/html/widgets/string.py b/IPython/html/widgets/string.py
index b268057..1f76429 100644
--- a/IPython/html/widgets/string.py
+++ b/IPython/html/widgets/string.py
@@ -1,12 +1,13 @@
import os
from base import Widget
-from IPython.utils.traitlets import Unicode, Bool
+from IPython.utils.traitlets import Unicode, Bool, List
from IPython.utils.javascript import display_all_js
class StringWidget(Widget):
target_name = Unicode('StringWidgetModel')
default_view_name = Unicode('TextboxView')
+ js_requirements = List(["notebook/js/widgets/string.js"])
_keys = ['value', 'row_count', 'disabled']
value = Unicode()