備忘録

私的メモ

Firefox userChrome.js: ナビゲーションバーを垂直化 2

Firefox userChrome.js: ナビゲーションバーを垂直化を改良。
ナビゲーションバーの表示切替に伴うブックマークツールバーのレイアウト変更を廃止。
userChrome.css での表示位置の調整に変更。

 

ロケーションバーをタブバー左に移動させるスクリプトと併用。

 

Firefox 72 以降での使用を推奨。
Firefox 68 ESR でも使用可。

 

ボタンでナビゲーションバーを水平⇔垂直切り替え。

ボタンでブックマークツールバーの表示切り替え。

 

ナビゲーションバーのカスタマイズは水平表示で編集可。

アドオンのインストール、更新は水平表示推奨。

全画面表示は水平表示推奨。

 

オーバーフローメニュー

垂直配置でウインドウを縮小すると
格納無効(overflows="false")に設定しているアイテム以外は全て
オーバーフローメニューに格納されてしまう。
復元は水平表示でのみ可。

 

userChrome.js


( () => {

const uNavToolbox = document.getElementById("navigator-toolbox");
const uNavBar = document.getElementById("nav-bar");
const uNBTrg = document.getElementById("nav-bar-customization-target");
const uPersonalToolbar = document.getElementById("PersonalToolbar");
const uBrowser = document.getElementById("browser");

// 配置されたアイテムを読み込むためブックマークツールバーを一時表示
// ブックマークツールバーボタンを使用しないなら不要
if(uPersonalToolbar.collapsed == true) {
    uPersonalToolbar.collapsed = false;
    setTimeout( () => {uPersonalToolbar.collapsed = true;}, 500 );
};


let uVerNavbar = {
    init() {
        this.cloneToolbarButton(); // 68ESRでは不要
        this.setPersonalToolbarButton(); // 使用しないなら不要
        this.setNavBarButton();
        this.disableOverflows();
        this.setPersonalToolbarObserver(); // 表示位置を調整しないなら不要
        this.eventToggleNavBar();
        uVerNavbar = null;
    },

    toolbarButton: null, // 68ESRでは不要

    cloneToolbarButton() {
        // Document.createElement("toolbarbutton") で生成したツールバーボタンが機能しないため
        // 既存のものを複製、属性全除去、クラス設定
        // 68ESRでは不要
        this.toolbarButton = uNBTrg.querySelector("toolbarbutton").cloneNode(false);
        do {
            this.toolbarButton.removeAttribute( this.toolbarButton.getAttributeNames()[0] );
        } while ( this.toolbarButton.hasAttributes() );
        this.toolbarButton.className = "toolbarbutton-1 chromeclass-toolbar-additional";
    },

    setPersonalToolbarButton() {
        // ブックマークツールバーの表示を切り替えるボタンを設置
        // 使用しないなら不要
        let ptButton = this.toolbarButton.cloneNode(false); // 68ESRでは不要
        /* let ptButton = document.createElement("toolbarbutton"); // 68ESRで使用 */
        uNBTrg.insertBefore(ptButton, uNBTrg.firstChild); // ボタン挿入
        ptButton.id = "personalToolbar-button";
        /* ptButton.className = "toolbarbutton-1 chromeclass-toolbar-additional"; // 68ESRで使用 */
        ptButton.setAttribute("label", "ブックマークツールバー");
        ptButton.setAttribute("tooltiptext", "ブックマークツールバーを表示します");
        ptButton.setAttribute("style", "list-style-image: url('chrome://browser/skin/bookmarks-toolbar.svg');");
        ptButton.onclick = () => { uPersonalToolbar.collapsed = !uPersonalToolbar.collapsed; };
        ptButton = null;
    },

    setNavBarButton() {
        let nbButton = this.toolbarButton.cloneNode(false); // 68ESRでは不要
        /* let nbButton = document.createElement("toolbarbutton"); // 68ESRで使用 */
        uNBTrg.insertBefore(nbButton, uNBTrg.firstChild); // ボタン挿入
        nbButton.id = "navbar-button";
        /* nbButton.className = "toolbarbutton-1 chromeclass-toolbar-additional"; // 68ESRで使用 */
        nbButton.setAttribute("label", "ツールバー切り替え");
        nbButton.setAttribute("tooltiptext", "ツールバーの配置を切り替えます");
        nbButton.setAttribute("style", "list-style-image: url('chrome://devtools/skin/images/command-frames.svg');");
        nbButton.onclick = this.eventToggleNavBar;
        nbButton = null;
    },

    eventToggleNavBar() {
        if (uNavBar.orient == "") {
            // ナビゲーションバー垂直表示
            uNavBar.orient = "vertical";
            uNBTrg.orient = "vertical";

            // ナビゲーションバー移動
            // 左配置
            uBrowser.insertBefore(uNavBar, uBrowser.firstChild);
            /*
            // 右配置
            uNavBar.ordinal = "6"; // 配置順序指定
            uBrowser.appendChild(uNavBar);
            */
        } else {
            // ナビゲーションバー水平表示
            uNavBar.removeAttribute("orient");
            uNBTrg.removeAttribute("orient");
            // 配置順序指定削除
            uNavBar.removeAttribute("ordinal");
            // ナビゲーションバー移動
            uNavToolbox.insertBefore(uNavBar, uPersonalToolbar);
        };
    },

    disableOverflows() {
        // ナビゲーションバーに配置された任意のアイテムに
        // オーバーフローメニューへの格納無効を設定
        /*
        document.getElementById("sidebar-button").setAttribute("overflows", false);
        */

        // ナビゲーションバーに配置された全てのアイテムに
        // オーバーフローメニューへの格納無効を設定
        let nbTrgItems = uNBTrg.childNodes;
        for (let i = 0; i < nbTrgItems.length; i++) {
            nbTrgItems[i].setAttribute("overflows", false);
        };
        nbTrgItems = null;
    },

    setPersonalToolbarObserver() {
        // ブックマークツールバーの表示切替を検知するオブザーバを設置
        // ブックマークツールバーの表示位置を調整しないなら不要
        
        // ナビゲーションバーにブックマークツールバーの表示状態を示す属性を設定
        uNavBar.setAttribute("PersonalToolbar", !uPersonalToolbar.collapsed);

        // オブザーバを設置
        let ptObserver = new MutationObserver(
            () => {
                uNavBar.setAttribute("PersonalToolbar", !uPersonalToolbar.collapsed);
            }
        );
        ptObserver.observe(uPersonalToolbar, {attributeFilter: ["collapsed"]});
        ptObserver = null;
    }
};

// 初期化
setTimeout( () => { uVerNavbar.init(); });

} ) ();

 

userChrome.css


/* ナビゲーションバー */
/* 垂直表示でのナビゲーションバーの幅 */
#nav-bar[orient="vertical"] {
    max-width: 30px !important;
    min-width: 30px !important;
}

/* ブックマークツールバー */
/* 垂直表示でのブックマークツールバーの表示位置調整 */
#titlebar + #PersonalToolbar {
    padding-left: 30px !important; /* ナビゲーションバー左配置 */
/*    padding-right: 30px !important; */ /* ナビゲーションバー右配置 */
}
#nav-bar[orient="vertical"][PersonalToolbar="true"] {
    margin-top: -21px !important;
}

/* コンバインドボタン */
/* 垂直表示での2つ以上結合したボタンの表示調整 */
#nav-bar-customization-target[orient="vertical"] > .toolbaritem-combined-buttons {
    -moz-box-orient: vertical !important;
    margin: 2px 0 !important;
    padding: 0 1px !important;
}
#nav-bar-customization-target[orient="vertical"] > .toolbaritem-combined-buttons > separator {
    height: 1px !important;
    background-size: 24px 1px !important;
}

/* ズームボタン */
/* 垂直表示でのボタン順序とフォントサイズ調整 */
#nav-bar-customization-target[orient="vertical"] > #zoom-controls > #zoom-out-button { -moz-box-ordinal-group: 5 !important; }
#nav-bar-customization-target[orient="vertical"] > #zoom-controls > #zoom-out-button + separator { -moz-box-ordinal-group: 2 !important; }
#nav-bar-customization-target[orient="vertical"] > #zoom-controls > #zoom-reset-button { -moz-box-ordinal-group: 3 !important; }
#nav-bar-customization-target[orient="vertical"] > #zoom-controls > #zoom-reset-button > .toolbarbutton-text {
    font-size: 11px !important;
    min-width: 28px !important;
    padding: 5px 0 !important;
  }
#nav-bar-customization-target[orient="vertical"] > #zoom-controls > #zoom-reset-button + separator { -moz-box-ordinal-group: 4 !important; }
#nav-bar-customization-target[orient="vertical"] > #zoom-controls > #zoom-in-button { -moz-box-ordinal-group: 1 !important; }