From bff10f318f458e74155f23d3567fcec946518ee0 2014-12-29 07:59:12
From: Min RK <benjaminrk@gmail.com>
Date: 2014-12-29 07:59:12
Subject: [PATCH] load kernel js, css, logo on spec_changed event

Ensures kernel.js is always loaded.
It wasn't being loaded when creating a new notebook with a particular kernel because `change_kernel` wasn't being called. Only the `spec_changed` event is triggered by all the various ways a kernel can be loaded,
so load kernel stuff on that event.

---

diff --git a/IPython/html/static/notebook/js/kernelselector.js b/IPython/html/static/notebook/js/kernelselector.js
index 3cd13d3..cd3535b 100644
--- a/IPython/html/static/notebook/js/kernelselector.js
+++ b/IPython/html/static/notebook/js/kernelselector.js
@@ -54,37 +54,32 @@ define([
             change_kernel_submenu.append(ks_submenu_entry);
         }
     };
-
-    KernelSelector.prototype.change_kernel = function(kernel_name) {
-        /**
-         * TODO, have a methods to set kernel spec directly ?
-         **/
-        if (kernel_name === this.current_selection) {
-            return;
+    
+    KernelSelector.prototype._spec_changed = function (event, ks) {
+        /** event handler for spec_changed */
+        
+        // update selection
+        this.current_selection = ks.name;
+        
+        // load logo
+        var logo_img = this.element.find("img.current_kernel_logo");
+        $("#kernel_indicator").find('.kernel_indicator_name').text(ks.spec.display_name);
+        if (ks.resources['logo-64x64']) {
+            logo_img.attr("src", ks.resources['logo-64x64']);
+            logo_img.show();
+        } else {
+            logo_img.hide();
         }
-        var ks = this.kernelspecs[kernel_name];
         
+        // load kernel css
         var css_url = ks.resources['kernel.css'];
         if (css_url) {
             $('#kernel-css').attr('href', css_url);
         } else {
             $('#kernel-css').attr('href', '');
         }
-
-        try {
-            this.notebook.start_session(kernel_name);
-        } catch (e) {
-            if (e.name === 'SessionAlreadyStarting') {
-                console.log("Cannot change kernel while waiting for pending session start.");
-            } else {
-                // unhandled error
-                throw e;
-            }
-            // only trigger spec_changed if change was successful
-            return;
-        }
-        this.events.trigger('spec_changed.Kernel', ks);
         
+        // load kernel js
         if (ks.resources['kernel.js']) {
             require([ks.resources['kernel.js']],
                 function (kernel_mod) {
@@ -100,7 +95,31 @@ define([
                 }
             );
         }
+    };
 
+    KernelSelector.prototype.change_kernel = function (kernel_name) {
+        /**
+         * TODO, have a methods to set kernel spec directly ?
+         **/
+        if (kernel_name === this.current_selection) {
+            return;
+        }
+        var ks = this.kernelspecs[kernel_name];
+        
+        try {
+            this.notebook.start_session(kernel_name);
+        } catch (e) {
+            if (e.name === 'SessionAlreadyStarting') {
+                console.log("Cannot change kernel while waiting for pending session start.");
+            } else {
+                // unhandled error
+                throw e;
+            }
+            // only trigger spec_changed if change was successful
+            return;
+        }
+        console.log('spec', kernel_name, ks);
+        this.events.trigger('spec_changed.Kernel', ks);
     };
 
     KernelSelector.prototype.lock_switch = function() {
@@ -112,19 +131,9 @@ define([
 
     KernelSelector.prototype.bind_events = function() {
         var that = this;
-        var logo_img = this.element.find("img.current_kernel_logo");
-        this.events.on('spec_changed.Kernel', function(event, data) {
-            that.current_selection = data.name;
-            $("#kernel_indicator").find('.kernel_indicator_name').text(data.spec.display_name);
-            if (data.resources['logo-64x64']) {
-                logo_img.attr("src", data.resources['logo-64x64']);
-                logo_img.show();
-            } else {
-                logo_img.hide();
-            }
-        });
+        this.events.on('spec_changed.Kernel', $.proxy(this._spec_changed, this));
 
-        this.events.on('kernel_created.Session', function(event, data) {
+        this.events.on('kernel_created.Session', function (event, data) {
             if (data.kernel.name !== that.current_selection) {
                 // If we created a 'python' session, we only know if it's Python
                 // 3 or 2 on the server's reply, so we fire the event again to
@@ -134,6 +143,7 @@ define([
             }
         });
         
+        var logo_img = this.element.find("img.current_kernel_logo");
         logo_img.on("load", function() {
             logo_img.show();
         });