[FIX] fix reloading problem (crash) in web client
authorGéry Debongnie <ged@odoo.com>
Mon, 1 Dec 2014 15:28:09 +0000 (16:28 +0100)
committerGéry Debongnie <ged@odoo.com>
Tue, 2 Dec 2014 09:19:09 +0000 (10:19 +0100)
The previous viewmanager (before its refactoring in sept/oct 2014) was
ignoring some promises in its do_load_state method.  The refactoring
actually fixed that, but of course, some other code was dependent on
the broken implementation.  This commit removes the use of promises in
do_load_state, which is functionally equivalent to the previous code.

As a result, it relies on some subtle timing of the creation and
initialization of various views.  It is somewhat fragile, but it is
actually what the former code did, only in a more explicit way.

addons/web/static/src/js/views.js

index 35c424c..e5bb93e 100644 (file)
@@ -828,16 +828,15 @@ instance.web.ViewManager =  instance.web.Widget.extend({
         }
     },    
     do_load_state: function(state, warm) {
-        var self = this,
-            def = this.active_view.created;
         if (state.view_type && state.view_type !== this.active_view.type) {
-            def = def.then(function() {
-                return self.switch_mode(state.view_type, true);
-            });
+            // warning: this code relies on the fact that switch_mode has an immediate side
+            // effect (setting the 'active_view' to its new value) AND an async effect (the
+            // view is created/loaded).  So, the next statement (do_load_state) is executed 
+            // on the new view, after it was initialized, but before it is fully loaded and 
+            // in particular, before the do_show method is called.
+            this.switch_mode(state.view_type, true);
         } 
-        def.done(function() {
-            self.active_view.controller.do_load_state(state, warm);
-        });
+        this.active_view.controller.do_load_state(state, warm);
     },
     on_debug_changed: function (evt) {
         var self = this,