Search code examples
javascriptfirefox-addonbookmarksseamonkey

How to access sidebar Bookmarks Panel page in SeaMonkey


I'm trying to convert my overlay add-on to restartless.
I can't access the bookmarks panel (on the sidebar) in SeaMonkey, in order to load my overlay UI.
Specifically, I need to do load my overlay to the bm-panel.xul similar to the following: myListener.document.loadOverlay("chrome://myBookmarksPanelOverlay.xul");

For that, I need the window of bm-panel.xul but I only have the main window of the browser.

SeaMonkey has a different structure from Firefox, so the following example
var sidebarPanels = window.document.getElementById('sidebar');
which is in documentation, does not work for SeaMonkey.

I can see the bm-panel.xul window in the Dom Inspector, but I can't get to it with Javascript.

I was able to access only the sidebar panels but that's as far as I can go:
var sidebarPanels = window.document.getElementById('sidebar-panels');

How do I access the bookmarksPanel page itself?


Solution

  • This may not be the only way or the best, but here is what I am doing:

    1. Find the sidebar element (sidebar-panels)
    2. search the sidebar childNodes for the element with attribute src=chrome://communicator/content/bookmarks/bm-panel.xul

    Searching the childNodes must be delayed until the relevant frames are loaded, and the search itself is a recursive iteration over all elements.

    following is a minimal stripped code:

        var sidebarE =  domWindow.document.getElementById('sidebar-panels');
        setTimeout(function() {
            var sbPanelE = searchChildNodes(sidebarE);
        }, 350);
    
        function searchChildNodes (aElement) {
            var stackNew = [];
            var current;
            var i, lenArr;
    
            iterate(aElement); 
            function iterate(current) { 
                var childrenE = current.childNodes;
                for (var i = 0, lenArr = childrenE.length; i < lenArr; i++) {
                    iterate(childrenE[i]);
                    foundE = checkElement(childrenE[i]);
                    if (e.nodeType == 1){ // Element node
                        if (e.getAttribute('src') == loc){
                            stackNew.push({ //pass args via object or array
                                element: childrenE[i],
                            });
                            return;
                        }
                    }
                }
            }
    
            for (i=0;i<stackNew.length ;i++ ){
                var itm = stackNew[i].element;
                return itm;
            }
        } // searchChildNodes