1 /* See license.txt for terms of usage */
  2 
  3 // ********************************************************************************************* //
  4 
  5 /**
  6  * This file should be loaded by script tags ahead of bindings.xml and module loading.
  7  * It synchronizes the panelBar initialization with the module loading.
  8  */
  9 window.panelBarWaiter = function()
 10 {
 11     var panelBarWaiter = {};
 12     var waitingPanelBarCount = 2;
 13     var waitLimit = 200;
 14     var chromeFactory = false;  // set when the module loader is ready
 15     var preInitializeCallback = null;
 16     var postInitializeCallback = null;
 17 
 18     /**
 19      * Called by module loader to signal modules loaded
 20      */
 21     panelBarWaiter.waitForPanelBar = function(chromeFactoryIn, preInitializeCallbackIn,
 22         postInitializeCallbackIn)
 23     {
 24         // set these via closure scope, we don't know which call will be fire
 25         if (chromeFactoryIn)
 26             chromeFactory = chromeFactoryIn;
 27 
 28         if (preInitializeCallbackIn)
 29             preInitializeCallback = preInitializeCallbackIn;
 30 
 31         if (postInitializeCallbackIn)
 32             postInitializeCallback = postInitializeCallbackIn;
 33 
 34         waitLimit -= 1;
 35 
 36         if (!panelBarWaiter.initializeWhenReady() && waitLimit > 0)
 37         {
 38             if (FBTrace.DBG_INITIALIZE)
 39             {
 40                 var msg = "panelBarWaiter; waitForPanelBar "+waitLimit;
 41                 msg += " waitingPanelBarCount: "+waitingPanelBarCount;
 42                 msg += " chromeFactory: "+ chromeFactory;
 43                 FBTrace.sysout(msg);
 44             }
 45 
 46             if (!chromeFactory)
 47                 setTimeout(panelBarWaiter.waitForPanelBar, 10);
 48         }
 49     };
 50 
 51     panelBarWaiter.initializeWhenReady = function()
 52     {
 53         try
 54         {
 55             // Wait until all panelBar bindings and modules are ready before initializing
 56             if (waitingPanelBarCount == 0 && chromeFactory)
 57             {
 58                 if (FBTrace.DBG_INITIALIZE)
 59                     FBTrace.sysout("panelBarWaiter; initializing now");
 60 
 61                 var chrome = chromeFactory.createFirebugChrome(window);
 62 
 63                 if (FBTrace.DBG_INITIALIZE)
 64                 {
 65                     FBTrace.sysout("panelBarWaiter; callbacks ",
 66                     {
 67                         preInitializeCallback: preInitializeCallback,
 68                         postInitializeCallback: postInitializeCallback
 69                     });
 70                 }
 71 
 72                 if (preInitializeCallback)
 73                     preInitializeCallback(chrome);
 74 
 75                 chrome.initialize(); // This needs to be the window-specific chrome
 76 
 77                 if (postInitializeCallback)
 78                     postInitializeCallback(chrome);
 79 
 80                 delete window.panelBarWaiter;
 81                 return true; // the panel bar is ready
 82             }
 83         }
 84         catch (exc)
 85         {
 86             // Disaster!
 87             var msg = exc.toString() +" "+(exc.fileName || exc.sourceName) + "@" + exc.lineNumber;
 88             Components.utils.reportError(msg);
 89             if (FBTrace.sysout)
 90                 FBTrace.sysout("chrome.panelBarReady FAILS: "+msg, exc);
 91             window.dump("getStackDump:"+FBL.getStackDump()+"\n");
 92         }
 93         return false;
 94     };
 95 
 96     /**
 97      * Called by binding.xml to signal ctor for a panel.
 98      */
 99     panelBarWaiter.panelBarReady = function()
100     {
101         // We initialize Firebug from here instead of from the onload event because
102         // we need to make sure it is initialized before the browser starts loading
103         // the home page
104         try
105         {
106             waitingPanelBarCount -= 1;
107 
108             if (FBTrace.DBG_INITIALIZE)
109             {
110                 FBTrace.sysout("chrome; panelBarReady (" + waitingPanelBarCount + ") " +
111                     (chromeFactory ? "Modules loaded" : "Modules not yet loaded") +
112                     " in " + window.location);
113             }
114 
115             panelBarWaiter.initializeWhenReady();
116         }
117         catch (e)
118         {
119             dump("bindings panelBar ctor FAILs: " + e + "\n");
120             dump("window.top " + window.top.location + " window.opener: " + window.opener + "\n");
121         }
122     }
123 
124     return panelBarWaiter;
125 }();
126 
127 // ********************************************************************************************* //
128