Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# Source du Binding "tabbrowser.xml" : Je ne parviens pas à gérer les icônes des onglets

Envoyé par : Raphael

Date : 11/07/2007 11:08

Bonjour, depuis plusieurs semaines maintenant, j'essaie de parvenir à gérer les icônes (favicon dans le cas de pages web) des onglets d'un tabbrowser... en vain. Je me sers de Tabbrowser pour charger des pages .xul et je voudrais pouvoir affecter un type d'icône selon la page ouverte.

  • J'ai tenté ma chance sur Googlegroups, on m'a aiguillé vers du CSS, mais après avoir essayé de nombreuses choses, je ne pense pas que ce soit la solution car :
    • Soit mon icône s'affiche "par dessus" mon icône par défaut (icône de page blanche, ou icône de chargement circulaire)
    • Soit mon onglet se transforme en Tab simple (plus d'effet arrondi, plus de bouton de fermeture)
  • J'ai tenté de décortiquer le binding de tabbrowser.xml contenu dans le toolkit.jar de mon XR 1.9 mais je ne suis pas en réussite :
    • Je vois des méthodes setIcon et updateIcon reposant sur du setAttribute("image", aURI) mais même en essayant ça, ça ne semble pas marcher (est-ce mon aURI qui serait faux ? Je créé un nsILocalFile, puis je mets "file://" + icon.path pour mon aURI...)
    • Je vois aussi qu'un tabbrowser-tab semble inclure une balise image avec en héritage src mais je ne sais pas trop si c'est important.

Voici les méthodes de tabbrowser.xml que je trouve les plus pertinentes :

<method name="setIcon">
<parameter name="aTab"/>
<parameter name="aURI"/>
<body>
           var browser = this.getBrowserForTab(aTab);
           browser.mIconURL = aURI;
           this.updateIcon(aTab);
           for (var i = 0; i < this.mProgressListeners.length; i++) {
             var p = this.mProgressListeners[i];
             if ('onLinkIconAvailable' in p)
               p.onLinkIconAvailable(browser);
           }        
 </body>
</method>
<method name="updateIcon">
<parameter name="aTab"/>
<body>
           var browser = this.getBrowserForTab(aTab);
           if (!aTab.hasAttribute("busy") && browser.mIconURL)
             aTab.setAttribute("image", browser.mIconURL);
           else
             aTab.removeAttribute("image");  
</body>
</method>
<method name="shouldLoadFavIcon">
<parameter name="aURI"/>
<body>
           return (aURI && this.mPrefs.getBoolPref("browser.chrome.site_icons") &&
                   this.mPrefs.getBoolPref("browser.chrome.favicons") &&
                   ("schemeIs" in aURI) && (aURI.schemeIs("http") || aURI.schemeIs("https")));       
</body>
</method>
<method name="useDefaultIcon">
<parameter name="aTab"/>
<body>
           var browser = this.getBrowserForTab(aTab);
           if (browser.contentDocument instanceof ImageDocument) {
             if (this.mPrefs.getBoolPref("browser.chrome.site_icons")) {
               try {
                 var sz = this.mPrefs.getIntPref("browser.chrome.image_icons.max_size");
                 if (!sz)
                   return;
                 var req = browser.contentDocument.imageRequest;
                 if (!req || !req.image ||
                     req.image.width > sz ||
                     req.image.height > sz)
                   return;
                 this.setIcon(aTab, browser.currentURI.spec);
               } catch (e) { }
             }
           }
           else if (this.shouldLoadFavIcon(browser.currentURI)) {
             var url = browser.currentURI.prePath + "/favicon.ico";
             if (!this.isIconKnownMissing(url))
               this.setIcon(aTab, url);
           }   
</body>
</method>
<method name="addToMissedIconCache">
<parameter name="aURI"/>
<body>
           var entry = this.openCacheEntry(aURI, Components.interfaces.nsICache.ACCESS_READ_WRITE);
           if (!entry)
             return;
           if (entry.accessGranted == Components.interfaces.nsICache.ACCESS_WRITE)
             // It's a new entry.  Just write a bit of metadata in to the entry.
             entry.setMetaDataElement("Icon", "Missed");
           entry.markValid();
           entry.close();  
</body>
</method>

Et voici le descriptif d'un tabbrowser-tab :

<binding id="tabbrowser-tab" display="xul:box" extends="chrome://global/content/bindings/tabbox.xml#tab">
<content chromedir="ltr" closetabtext="Fermer l'onglet">
<xul:hbox class="tab-middle box-inherit" xbl:inherits="align,dir,pack,orient,selected" flex="1">
<xul:image class="tab-icon" xbl:inherits="validate,src=image"/>
<xul:label class="tab-text" xbl:inherits="value=label,accesskey,crop,disabled" flex="1"/>
</xul:hbox>
<xul:toolbarbutton anonid="close-button" tabindex="-1" class="tab-close-button"/>
</content>
<implementation>
<field name="mOverCloseButton">false</field>
<field name="mCorrespondingMenuitem">null</field>
</implementation>
<handlers>
<handler event="mouseover">
       var anonid = event.originalTarget.getAttribute("anonid");
       if (anonid == "close-button")
         this.mOverCloseButton = true;
</handler>
<handler event="mouseout">
       var anonid = event.originalTarget.getAttribute("anonid");
       if (anonid == "close-button")
         this.mOverCloseButton = false;
</handler>
<handler event="mousedown" button="0" phase="capturing">
       if (this.mOverCloseButton)
         event.stopPropagation(); 
</handler>
</handlers>
</binding>

Voilà, sachant que je ne souhaite faire qu'une seule chose : pouvoir mettre l'icône que je désire sur l'onglet que j'aurais désigné...

Je tourne en rond depuis des semaines donc je vous serais vraiment reconnaissant si vous aviez un début de solution, merci d'avance.

# Re: Source du Binding "tabbrowser.xml" : Je ne parviens pas à gérer les icônes des onglets

Envoyé par : Raphael

Date : 18/08/2007 22:18

J'up mon problème, on ne sait jamais, car je suis vraiment bloqué et à 2 doigts d'abandonner tabbrowser pour du iframe + tabs normaux, ce qui serait dommage quand même... =)

Il n'est plus possible de poster des messages dans ce forum.


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.