Show More
@@ -9,6 +9,7 b' define([' | |||
|
9 | 9 | "use strict"; |
|
10 | 10 | |
|
11 | 11 | var KernelSelector = function(selector, notebook) { |
|
12 | var that = this; | |
|
12 | 13 | this.selector = selector; |
|
13 | 14 | this.notebook = notebook; |
|
14 | 15 | this.notebook.set_kernelselector(this); |
@@ -22,6 +23,11 b' define([' | |||
|
22 | 23 | this.bind_events(); |
|
23 | 24 | // Make the object globally available for user convenience & inspection |
|
24 | 25 | IPython.kernelselector = this; |
|
26 | this._finish_load = null; | |
|
27 | this.loaded = new Promise(function(resolve, reject) { | |
|
28 | that._finish_load = resolve; | |
|
29 | }); | |
|
30 | ||
|
25 | 31 | Object.seal(this); |
|
26 | 32 | }; |
|
27 | 33 | |
@@ -47,26 +53,29 b' define([' | |||
|
47 | 53 | return -1; |
|
48 | 54 | } |
|
49 | 55 | }); |
|
50 | ||
|
56 | ||
|
57 | var i, ks, ks_submenu_entry; | |
|
51 | 58 | // Create the Kernel > Change kernel submenu |
|
52 |
for ( |
|
|
53 |
|
|
|
54 |
|
|
|
59 | for (i = 0; i < keys.length; i++) { | |
|
60 | ks = this.kernelspecs[keys[i]]; | |
|
61 | ks_submenu_entry = $("<li>").attr("id", "kernel-submenu-"+ks.name).append($('<a>') | |
|
55 | 62 | .attr('href', '#') |
|
56 |
.click($.proxy(this. |
|
|
63 | .click($.proxy(this.set_kernel, this, ks.name)) | |
|
57 | 64 | .text(ks.spec.display_name)); |
|
58 | 65 | change_kernel_submenu.append(ks_submenu_entry); |
|
59 | 66 | } |
|
60 | 67 | |
|
61 | 68 | // Create the File > New Notebook submenu |
|
62 |
for ( |
|
|
63 |
|
|
|
64 |
|
|
|
69 | for (i = 0; i < keys.length; i++) { | |
|
70 | ks = this.kernelspecs[keys[i]]; | |
|
71 | ks_submenu_entry = $("<li>").attr("id", "new-notebook-submenu-"+ks.name).append($('<a>') | |
|
65 | 72 | .attr('href', '#') |
|
66 | 73 | .click($.proxy(this.new_notebook, this, ks.name)) |
|
67 | 74 | .text(ks.spec.display_name)); |
|
68 | 75 | new_notebook_submenu.append(ks_submenu_entry); |
|
69 | 76 | } |
|
77 | // trigger loaded promise | |
|
78 | this._finish_load(); | |
|
70 | 79 | }; |
|
71 | 80 | |
|
72 | 81 | KernelSelector.prototype._spec_changed = function (event, ks) { |
@@ -80,7 +89,7 b' define([' | |||
|
80 | 89 | if (cur_kernel_entry.length) { |
|
81 | 90 | cur_kernel_entry.parent().prepend($("<li>").attr("class","divider")) |
|
82 | 91 | .prepend(cur_kernel_entry); |
|
83 |
} |
|
|
92 | } | |
|
84 | 93 | |
|
85 | 94 | // load logo |
|
86 | 95 | var logo_img = this.element.find("img.current_kernel_logo"); |
@@ -118,28 +127,26 b' define([' | |||
|
118 | 127 | } |
|
119 | 128 | }; |
|
120 | 129 | |
|
121 |
KernelSelector.prototype. |
|
|
122 | /** | |
|
123 | * TODO, have a methods to set kernel spec directly ? | |
|
124 | **/ | |
|
130 | KernelSelector.prototype.set_kernel = function (kernel_name) { | |
|
131 | /** set the kernel by name, ensuring kernelspecs have been loaded, first */ | |
|
132 | var that = this; | |
|
133 | return this.loaded.then(function () { | |
|
134 | that._set_kernel(kernel_name); | |
|
135 | }); | |
|
136 | }; | |
|
137 | ||
|
138 | KernelSelector.prototype._set_kernel = function (kernel_name) { | |
|
139 | /** Actually set the kernel (kernelspecs have been loaded) */ | |
|
125 | 140 | if (kernel_name === this.current_selection) { |
|
141 | // only trigger event if value changed | |
|
126 | 142 | return; |
|
127 | 143 | } |
|
128 | 144 | var ks = this.kernelspecs[kernel_name]; |
|
129 | ||
|
130 | try { | |
|
131 | this.notebook.start_session(kernel_name); | |
|
132 | } catch (e) { | |
|
133 | if (e.name === 'SessionAlreadyStarting') { | |
|
134 | console.log("Cannot change kernel while waiting for pending session start."); | |
|
135 | } else { | |
|
136 | // unhandled error | |
|
137 | throw e; | |
|
138 | } | |
|
139 | // only trigger spec_changed if change was successful | |
|
145 | if (this.notebook._session_starting) { | |
|
146 | console.error("Cannot change kernel while waiting for pending session start."); | |
|
140 | 147 | return; |
|
141 | 148 | } |
|
142 | console.log('spec', kernel_name, ks); | |
|
149 | this.current_selection = kernel_name; | |
|
143 | 150 | this.events.trigger('spec_changed.Kernel', ks); |
|
144 | 151 | }; |
|
145 | 152 | |
@@ -181,13 +188,7 b' define([' | |||
|
181 | 188 | this.events.on('spec_changed.Kernel', $.proxy(this._spec_changed, this)); |
|
182 | 189 | |
|
183 | 190 | this.events.on('kernel_created.Session', function (event, data) { |
|
184 | if (data.kernel.name !== that.current_selection) { | |
|
185 | // If we created a 'python' session, we only know if it's Python | |
|
186 | // 3 or 2 on the server's reply, so we fire the event again to | |
|
187 | // set things up. | |
|
188 | var ks = that.kernelspecs[data.kernel.name]; | |
|
189 | that.events.trigger('spec_changed.Kernel', ks); | |
|
190 | } | |
|
191 | that.set_kernel(data.kernel.name); | |
|
191 | 192 | }); |
|
192 | 193 | |
|
193 | 194 | var logo_img = this.element.find("img.current_kernel_logo"); |
@@ -248,6 +248,10 b' define([' | |||
|
248 | 248 | this.events.on('spec_changed.Kernel', function(event, data) { |
|
249 | 249 | that.metadata.kernelspec = |
|
250 | 250 | {name: data.name, display_name: data.spec.display_name}; |
|
251 | // start session if the current session isn't already correct | |
|
252 | if (!(this.session && this.session.kernel && this.session.kernel.name === data.name)) { | |
|
253 | that.start_session(data.name); | |
|
254 | } | |
|
251 | 255 | }); |
|
252 | 256 | |
|
253 | 257 | this.events.on('kernel_ready.Kernel', function(event, data) { |
@@ -1763,19 +1767,6 b' define([' | |||
|
1763 | 1767 | this.notebook_path = data.path; |
|
1764 | 1768 | var trusted = true; |
|
1765 | 1769 | |
|
1766 | // Trigger an event changing the kernel spec - this will set the default | |
|
1767 | // codemirror mode | |
|
1768 | if (this.metadata.kernelspec !== undefined) { | |
|
1769 | // TODO shoudl probably not trigger here, | |
|
1770 | // should call the kernel selector, or custom.{js|css} not loaded. | |
|
1771 | if(this.kernel_selector){ | |
|
1772 | // technically not perfect, we should check that the kernelspec matches | |
|
1773 | this.kernel_selector.change_kernel(this.metadata.kernelspec.name); | |
|
1774 | } else { | |
|
1775 | console.log('do not have handle on kernel_selector'); | |
|
1776 | } | |
|
1777 | } | |
|
1778 | ||
|
1779 | 1770 | // Set the codemirror mode from language_info metadata |
|
1780 | 1771 | if (this.metadata.language_info !== undefined) { |
|
1781 | 1772 | var langinfo = this.metadata.language_info; |
@@ -2077,6 +2068,7 b' define([' | |||
|
2077 | 2068 | * @param {string} notebook_path - A notebook to load |
|
2078 | 2069 | */ |
|
2079 | 2070 | Notebook.prototype.load_notebook = function (notebook_path) { |
|
2071 | var that = this; | |
|
2080 | 2072 | this.notebook_path = notebook_path; |
|
2081 | 2073 | this.notebook_name = utils.url_path_split(this.notebook_path)[1]; |
|
2082 | 2074 | this.events.trigger('notebook_loading.Notebook'); |
@@ -2192,8 +2184,6 b' define([' | |||
|
2192 | 2184 | this.nbformat_minor = nbmodel.nbformat_minor; |
|
2193 | 2185 | } |
|
2194 | 2186 | |
|
2195 | // Create the session after the notebook is completely loaded to prevent | |
|
2196 | // code execution upon loading, which is a security risk. | |
|
2197 | 2187 | if (this.session === null) { |
|
2198 | 2188 | var kernel_name; |
|
2199 | 2189 | if (this.metadata.kernelspec) { |
@@ -2202,7 +2192,14 b' define([' | |||
|
2202 | 2192 | } else { |
|
2203 | 2193 | kernel_name = utils.get_url_param('kernel_name'); |
|
2204 | 2194 | } |
|
2205 |
|
|
|
2195 | if (kernel_name) { | |
|
2196 | // setting kernel_name here triggers start_session | |
|
2197 | this.kernel_selector.set_kernel(kernel_name); | |
|
2198 | } else { | |
|
2199 | // start a new session with the server's default kernel | |
|
2200 | // spec_changed events will fire after kernel is loaded | |
|
2201 | this.start_session(); | |
|
2202 | } | |
|
2206 | 2203 | } |
|
2207 | 2204 | // load our checkpoint list |
|
2208 | 2205 | this.list_checkpoints(); |
General Comments 0
You need to be logged in to leave comments.
Login now