Bonjour à tous,

Je travaille sous Linux avec Firefox depuis belle lurette et ma version actuelle est 37.0.1.

J'ai enregistré énormément de marques-pages (environ 5000) que Firefox gère très bien. Je les classe dans un grand nombre de sous-dossiers proprement organisés, avec parfois des étiquettes. Tout ceci me convient très bien, à ceci près que la boîte de dialogue « Ajouter un marque-page » ou « Modifier un marque-page » (c'est la même) me propose des fenêtres trop petites pour mon usage habituel, ainsi qu'un historique des derniers dossiers trop court. J'étends en général la hauteur des premières de 150 à 450, ainsi que la longueur de l'historique de 5 à 25 entrées. Jusqu'à présent, je faisais cela en allant directement modifier « editBookmarkOverlay.js|xul » dans le fichier omni.ja (et même directement le sous-répertoire concerné sur le disque avant qu'il n'apparaisse).

Comme cela implique de refaire la même manip' à chaque mise à jour, je me suis décidé à en faire une vraie extension. J'arrive à les faire, celles-ci s'installent correctement, leur icône s'affiche bien et les ressources déclarées sont bien visibles à travers les URL « chrome://… ». Mon extension n'est PAS une extension bootstrap et n'est pas déclarée comme telle.

Par contre, quand l'extension est en fonction, mon overlay semble ne pas s'intégrer proprement au panneau en question mais, au contraire, le faire disparaître complètement. L'overlay en question est :
Code XUL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
<?xml version="1.0"?>
<!DOCTYPE overlay SYSTEM "chrome://monextension/content/monextensionEditBookmarkOverlay.dtd">
<overlay id="monextensionOverlay"
         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
        <row id="editBMPanel_tagsSelectorRow">
          <listbox id="editBMPanel_tagsSelector"
                   height="450"/>
        </row>
</overlay>

Il est volontairement minimaliste pour le moment : il ne modifie que le paramètre « height » de la lucarne des étiquettes. Le fichier chrome.manifest contient :

content monextension chrome/content/
overlay chrome://browser/content/places/editBookmarkOverlay.xul chrome://monextension/content/monextensionEditBookmarkOverlay.xul
Quand je saisis Ctrl-D, la page est marquée silencieusement sans passer par l'étape de la boîte de dialogue. Le débogueur intégré m'indique une erreur ici :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
TypeError: this._element(...) is null — browser.js:4658:19
… ce qui correspond à la ligne suivante de omni/chrome/browser/content/browser/browser.js :

Code Javascript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
    this._overlayLoading = true;
    document.loadOverlay(
      "chrome://browser/content/places/editBookmarkOverlay.xul",
      (function (aSubject, aTopic, aData) {
        // Move the header (star, title, button) into the grid,
        // so that it aligns nicely with the other items (bug 484022).
        let header = this._element("editBookmarkPanelHeader");
        let rows = this._element("editBookmarkPanelGrid").lastChild;
        rows.insertBefore(header, rows.firstChild);
        header.hidden = false;

… où « editBookmarkPanel » est un des éléments du document « editBookmarkOverlay.xul » original.

J'ai tâtonné sans beaucoup de succès, même en essayant de réduire ce code au minimum. Ce qui est étrange, c'est que cela fonctionne dans quelques très rares cas, lorsque je viens non seulement de démarrer le navigateur mais également d'allumer ma machine. Ce n'est pas systématique (c'est même assez rare), ce n'est pas reproductible, réinstaller la même extension sans changement me ramène dans le cas présenté ici, et démarrer le navigateur avec --purgeCache ou en le vidant à la main ne change rien non plus.

Est-ce que je m'y prends mal ? Y a-t-il quelque chose qu'il faut prendre en compte au moment de l'interaction des codes Javascript avec les overlays (un chargement préalable explicite éventuel ?) ou bien la technologie est-elle réellement dépréciée ?

Merci à tous.