Done!

See issue 1187: http://code.google.com/p/fbug/issues/detail?id=1187

Hope this helps!

Kind regards,
Alex


On Oct 1, 12:37 am, John J Barton <[EMAIL PROTECTED]> wrote:
> Hi Alex. This looks promising as a solution to problems many folks
> have. We'd like to take a look as soon as we can. Also we'll see if we
> can allow this kind of work in an extension.
>
> Please open a bug report with your patch as an attachment (against
> branches/firebug1.3)http://code.google.com/p/fbug/issues/list
> Please include a testcase and procedure to see the effect of the
> patch. Be explicit in the report that you contribute the code under
> BSD and that any one employing you for coding is ok with that.
>
> John
>
> On Sep 30, 6:38 am, Alex <[EMAIL PROTECTED]> wrote:
>
> > Hello again everybody!
>
> > I now implemented a mechanism that allows to persist Firebug panels.
> > That is, a panel will survive page loads as long as it is marked
> > persistent. This might be useful when visualing logged information or
> > events etc (see also above).
>
> > The changes necessary to achieve such a behaviour are in fact minimal.
> > The intuition, as outlined by John, is the following. The moment we
> > destroy the current webpage's context, we store the panels marked
> > persistent in persistedState (tabContext.destroy()). Later, when the
> > new context is about to be created, we recover the persisted panels
> > from persistedState.
>
> > I will now detail the code changes.
>
> > 1) Firebug.Panel
>
> >     - We need to add a boolean attribute termed "persistent". If true,
> > the panel will not be erased when a new context is loaded.
> >     - A method called reinitialize() (or loadedContext() ?!) is used
> > to handle the actions that shall be executed when a new context has
> > been loaded. For example, reinitialize would NOT erase the panelNode,
> > but add a log message.
>
> > 2) Firebug.TabContext
>
> >      - destroy():
>
> >        We will save persistent panels in persistedState.panelMap.
> > First, initialize such an object:
> >            state.panelMap = {};
>
> >       Then, if a panel is marked persistent, store it in
> > persistedState.panelMap, otherwise destroy it as usual:
>
> >         for (var panelName in this.panelMap)
> >         {
>
> >             if (panel.persistent) {
> >                 // Do not destroy persistent panel
> >                 state.panelMap[panelName] = panel;
> >             } else {
>
> >                 // Destroy the panel and allow it to persist extra
> > info to the state object
> >                 panel.destroy(panelState);
>
> >                 // Remove the panel node from the DOM
> >                 var panelNode = panel.panelNode;
> >                 if (panelNode && panelNode.parentNode && !
> > panel.persistent)
> >                     panelNode.parentNode.removeChild(panelNode);
> >             }
> >         }
>
> >      - TabContext constructor:
>
> >        Here we need to restore the saved panels from persistedState
> > and put them into the new context's panelMap. In addition, we call the
> > panel's reinitialize() method here.
>
> >        Firebug.TabContext = function(win, browser, chrome,
> > persistedState, persistedPanelMap)
> >        {
> >           this.panelMap = persistedPanelMap ? persistedPanelMap : {};
>
> >           for (var panelName in this.panelMap) {
> >               var panel = this.panelMap[panelName];
> >               var panelType = Firebug.getPanelType(panelName);
> >               var doc = panelType ?
> > this.chrome.getPanelDocument(panelType) : null;
> >               panel.reinitialize(this, doc);
> >          }
> >      };
>
> > 3) TabWatcher
>
> >     -  watchTopWindow:
>
> >        Here we need to recover the panelMap from persistedState and
> > call TabContext constructor with the persisted panelMap. This looks as
> > follows:
>
> >             // Restore persistent panels.
> >             var persistedPanelMap = persistedState &&
> > persistedState.panelMap ? persistedState.panelMap : null;
>
> >            and shortly after
>
> >            context = this.owner.createTabContext(win, browser,
> > browser.chrome, persistedState, persistedPanelMap);
>
> > 4) Firebug.createTabContext needs to become
>
> >      Firebug.createTabContext: function(win, browser, chrome, state,
> > panelMap)
> >      {
> >          return new Firebug.TabContext(win, browser, chrome, state,
> > panelMap);
> >      }
>
> > That's it. I will finally provide patches for tabContext.js and
> > tabWatcher.js (based on revision r1119 from today) and a simple panel
> > that logs urls to demonstrate the idea. =)
>
> > tabContext.js:
>
> > 17c17
> > < Firebug.TabContext = function(win, browser, chrome, persistedState)
> > ---> Firebug.TabContext = function(win, browser, chrome, persistedState, 
> > persistedPanelMap)
>
> > 32c32
> > <     this.panelMap = {};
> > --->     this.panelMap = persistedPanelMap ? persistedPanelMap : {};
> > 35a36,44
> > >     for (var panelName in this.panelMap) {
> > >         var panel = this.panelMap[panelName];
>
> > >         var panelType = Firebug.getPanelType(panelName);
> > >         var doc = panelType ? this.chrome.getPanelDocument(panelType) : 
> > > null;
>
> > >         if (panel.persistent) panel.reinitialize(this, doc);
> > >     }
>
> > 82a92
> > >         state.panelMap = {};
>
> > 99,105c109,120
> > <             // Destroy the panel and allow it to persist extra info
> > to the state object
> > <             panel.destroy(panelState);
> > <
> > <             // Remove the panel node from the DOM
> > <             var panelNode = panel.panelNode;
> > <             if (panelNode && panelNode.parentNode)
> > <                 panelNode.parentNode.removeChild(panelNode);
> > ---
>
> > >             if (panel.persistent) {
> > >                 // Do not destroy persistent panel
> > >                 state.panelMap[panelName] = panel;
> > >             } else {
> > >                 // Destroy the panel and allow it to persist extra info 
> > > to the state object
> > >                 panel.destroy(panelState);
>
> > >                 // Remove the panel node from the DOM
> > >                 var panelNode = panel.panelNode;
> > >                 if (panelNode && panelNode.parentNode)
> > >                     panelNode.parentNode.removeChild(panelNode);
> > >             }
>
> > tabWatcher.js:
>
> > 125a126,129
>
> > >             // Restore persistent panels.
> > >             var persistedPanelMap = persistedState && 
> > > persistedState.panelMap ? persistedState.panelMap : null;
>
> > 129c133,134
> > <             context = this.owner.createTabContext(win, browser,
> > browser.chrome, persistedState);
> > ---
>
> > >             context = this.owner.createTabContext(win, browser, 
> > > browser.chrome, persistedState, persistedPanelMap);
>
> > And the panel:
>
> > FBL.ns(function() { with (FBL) {
>
> > Firebug.PersistentPanel = function() {};
>
> > Firebug.PersistentPanel.prototype = extend(Firebug.Panel,
> > {
> >     name: "persistent",
> >     title: "Persistent",
> >     //parentPanel: "html",
> >     persistent: true,
> >     counter: 0,
>
> >     initialize: function() {
> >         Firebug.Panel.initialize.apply(this, arguments);
> >     },
>
> >     initializeNode: function(oldPanelNode) {
>
> >         this.persistent = true;
> >         this.counter += 1;
> >         var newPage = this.document.createElement("p");
> >         newPage.textContent = "["+this.counter+"] Current URL: " +
> > this.context.window.document.URL;
>
> >         this.panelNode.appendChild(newPage);
> >     },
>
> >     reinitialize: function(context, doc) {
> >         this.context = context;
> >         this.document = doc;
>
> >         this.counter += 1;
> >         var newPage = this.document.createElement("p");
> >         newPage.textContent = "["+this.counter+"] Current URL: " +
> > this.context.window.document.URL;
>
> >         this.panelNode.appendChild(newPage);
>
> >         if (this.counter == 5)
> >             this.persistent = false;
> >     },
>
> >     clear: function() {}
>
> > });
>
> > Firebug.registerPanel(Firebug.PersistentPanel);
>
> > }});
>
> > Please note that I cannot make this work as an extension (overwriting
> > TabContext constructor and TabWatcher.watchTopWindow has strange side
> > effects). I would thus be glad if this code will somehow be included
> > in future versions of Firebug (in particular, given that the changes
> > are of minor nature).
>
> > Alright. That's it already! =)
>
> > Have a good day!
>
> > Alex
>
> > On Sep 24, 10:48 pm, John J Barton <[EMAIL PROTECTED]>
> > wrote:
>
> > > Each context has a set of panels; each context corresponds to a page.
> > > I'd start by tracing with DBG_WINDOWS to understand the order of
> > > events: does the destroyContext come before the initContext for new
> > > page or not? My guess is yes.  So then you need to decide: how to
> > > prevent destroyContext only in cases where I want to retain the
> > > panel?
>
> > > hth,
> > > jjb
>
> > > On Sep 24, 1:23 pm, Alex <[EMAIL PROTECTED]> wrote:
>
> > > > Thanks for the quick reply!
>
> > > > In fact, I want the "easy" feature: One panel that doesn't reload when
> > > > a new page is loaded into the current browser tab. Let's say I want to
> > > > protocol the text content of all title tags of all pages loaded into
> > > > the browser tab. Of course, I could just remember all title tags and
> > > > write them to the fresh panel, which is (obviously) not what I want to
> > > > do. So I guess the question is: How do I communicate to tabWatcher
> > > > that I do not want to delete the panel? How can I keep a panel over a
> > > > page reload?
>
> > > > History-dependent panels are pretty appealing, too. But the easy
> > > > version would do fine for now; in particular,
>
> ...
>
> read more »
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Firebug" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/firebug?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to