Полезная информация

Будьте в курсе последних изменений в мире Mozilla, следя за нашим микроблогом в Twitter.

№104-04-2013 11:53:20

Najlus
Рррррррррррь!
 
Группа: Extensions
Откуда: Город N
Зарегистрирован: 11-01-2009
Сообщений: 1988

[CB] После обновления больше не работает QickBookmarks

Доброго всем дня.
После обновления Firefox до 20 версии (Linux версия). Перестали работать кнопка QickBookmarks, которую я когда-то просил написать.
Суть кнопки такова: она выполняет роль своего рода "ящика для вкладок" - т.е. при перетаскивании вкладки на данную кнопку она пропадала из панели вкладок, а в кнопке появлялась ссылка на страницу, которая была открыта в вкладке, с сохранением местоположения. При открытии вкладки из кнопки ссылка в ней пропадала. При открытии ЛКМ ссылка открывалась в текущей вкладке, при нажатии средней клавиши - в новой, а при нажатии ПКМ по ссылке последняя удалялась.

Текущий код кнопки
var profileDir = Components.classes["@mozilla.org/file/directory_service;1"]
    .getService(Components.interfaces.nsIProperties)
    .get("ProfD", Components.interfaces.nsILocalFile)
    .path;
var path = profileDir + "\\tabbookmarks.xml";
this. loadInBackground = true;
this. reload = true;

this. handleDragOver = function (event)
{
    var dt = event. dataTransfer;
    var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0);
    if (!tab)
        return;
    event. preventDefault ();
    event. stopPropagation ();
    return dt. effectAllowed = dt. dropEffect = "link";
}

this. handleDrop = function (event)
{
    var dt = event. dataTransfer;
    var url = dt. mozGetDataAt ("text/x-moz-text-internal", 0);
    var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0);
    this. addMenuitem (tab, url);
};

this. __defineGetter__
(
    "ss",
    function ()
    {
        delete this.ss;
        return this.ss = Components.classes["@mozilla.org/browser/sessionstore;1"]
            .getService(Components.interfaces.nsISessionStore);
    }
);

this. __defineGetter__
(
    "ios",
    function ()
    {
        delete this.ios;
        return this.ios = Components.classes["@mozilla.org/network/io-service;1"]
            .getService(Components.interfaces.nsIIOService);
    }
);

this. addMenuitem = function (tab, url)
{
    var label = tab. label;
    var image = tab. image;

    var menu = this. menu;
    var mi = document. createElement ("menuitem");
    mi. setAttribute ("label", label);
    mi. setAttribute ("tab_data", this.ss.getTabState(tab));
    mi. setAttribute ("tooltiptext", url);
    mi. className = "menuitem-iconic bookmark-item";
    image && mi. setAttribute ("image", "moz-anno:favicon:" + image);
    menu. appendChild (mi);
    this. type = "menu";
    this. flushMenu (menu);

    var br = gBrowser;
    //if (br. tabContainer. childNodes. length > 1)
        br. removeTab (tab);
};

this. deleteMenuitem = function (menuitem, dontFlush)
{
    var menu = this. menu;
    menu. removeChild (menuitem);
    this. checkEmpty (menu);
    !dontFlush && this. flushMenu (menu);
};

this. checkEmpty = function (menu)
{
    if (menu. getElementsByTagName ("menuitem"). length > 0)
        return;
    menu. hidePopup ();
    this. type = "";
};

this. flushMenu = function (menu)
{
    menu = menu || this. menu;
    var xs = new XMLSerializer ();
    var xmenu = xs. serializeToString (menu);
    var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
              createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
    suc. charset = "UTF-8";
    xmenu = suc. ConvertFromUnicode (xmenu);
    custombuttons. writeFile (path, xmenu);
};

this. getMenu = function (event)
{
    var menu = this. menu;
    if (menu)
        this. removeChild (menu);
    menu = "";
    try
    {
        file = Components. classes ["@mozilla.org/file/local;1"].
               createInstance (Components. interfaces. nsILocalFile);
        file. initWithPath (path);
        var fis = Components. classes ["@mozilla.org/network/file-input-stream;1"].
                  createInstance (Components. interfaces. nsIFileInputStream);
        fis.init (file, 0x01, 00004, null);
        var sis = Components. classes ["@mozilla.org/scriptableinputstream;1"].
                  createInstance (Components. interfaces. nsIScriptableInputStream);
        sis. init (fis);
        menu = sis. read (sis. available ());
        sis. close ();
        var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
                  createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
        suc. charset = "UTF-8";
        menu = suc. ConvertToUnicode (menu);
        menu = new XML (menu) || "";
    }
    catch (e)
    {
        menu = "";
    }
    if (!menu)
    {
        menu =
        <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
               onclick="this. parentNode. openTab (event);"/>
    }
    menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement;
    this. appendChild (menu);
    if (menu. getElementsByTagName ("menuitem"). length > 0)
        this. type = "menu";
    this. orient = "horizontal";
    return menu;
};

this. __defineGetter__
(
    "menu",
    function ()
    {
        return this. getElementsByTagName("menupopup") [0] || null;
    }
);

this. openTab = function (event, mi)
{
    mi = mi || event. target;
    var bg = event ? this. loadInBackground : true;
    var menu = mi. parentNode;
    if (!event || event. button < 2)
    {
        var tab;
        if (event && event. button == 0)
            tab = gBrowser. mCurrentTab;
        else
            tab = gBrowser. loadOneTab("about:blank", null, null, null, bg, false);
        menu. hidePopup ();
        var tabData = mi. getAttribute ("tab_data");
        this.ss.setTabState(tab, tabData);
        if(this.reload && !this.ios.offline)
        {
            var wn = Components.interfaces.nsIWebNavigation;
            gBrowser.getBrowserForTab(tab).reloadWithFlags(wn.LOAD_FLAGS_BYPASS_PROXY | wn.LOAD_FLAGS_BYPASS_CACHE);
        }
    }
    else
        event. stopPropagation ();
    this. deleteMenuitem (mi, !event);
};

this. onclick = function (event)
{
    if (event. button != 1 || event. target != this)
        return;
    var menu = this. menu;
    var mis = menu. getElementsByTagName ("menuitem");
    while (mis. length)
        this. openTab (null, mis[0]);
    this. flushMenu (menu);
};

this. setAttribute ("ondragdrop", "return this. handleDrop (event);");
this. setAttribute ("ondragover", "return this. handleDragOver (event);");
this. setAttribute ("onmouseover", "if (event. target == this) this. getMenu (event);");
this. getMenu ();


Огромная просьба починить работу сей кнопки (без неё, как без рук), т.к. я сам в этом полный ноль.

Заранее спасибо


Вы ленивы, следовательно вы изобретательны (Граф Де Гиш)
Список настроек About:config на русском языке с пояснениями и рекомендациями

Отсутствует

 

№204-04-2013 14:49:09

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 20.0

Re: [CB] После обновления больше не работает QickBookmarks

Najlus
Вроде, заработала кнопка:

Diff

Выделить код

Код:

--- a/qickBookmarks.js
+++ b/qickBookmarks.js
@@ -58,14 +58,17 @@
     mi. setAttribute ("tab_data", this.ss.getTabState(tab));
     mi. setAttribute ("tooltiptext", url);
     mi. className = "menuitem-iconic bookmark-item";
-    image && mi. setAttribute ("image", "moz-anno:favicon:" + image);
+    image && mi. setAttribute ("image", "moz-anno:favicon:" + image.replace(/#-moz-resolution=16,16$/, ""));
     menu. appendChild (mi);
     this. type = "menu";
     this. flushMenu (menu);
 
     var br = gBrowser;
     //if (br. tabContainer. childNodes. length > 1)
-        br. removeTab (tab);
+        //br. removeTab (tab);
+        setTimeout(function() {
+            br. removeTab (tab);
+        }, 0);
 };
 
 this. deleteMenuitem = function (menuitem, dontFlush)
@@ -119,7 +122,8 @@
                   createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
         suc. charset = "UTF-8";
         menu = suc. ConvertToUnicode (menu);
-        menu = new XML (menu) || "";
+        //menu = new XML (menu) || "";
+        menu = new DOMParser (). parseFromString (menu, "application/xml"). documentElement;
     }
     catch (e)
     {
@@ -127,11 +131,13 @@
     }
     if (!menu)
     {
-        menu =
-        <menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
-               onclick="this. parentNode. openTab (event);"/>
+        //menu =
+        //<menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+        //       onclick="this. parentNode. openTab (event);"/>
+        menu = document.createElement("menupopup");
+        menu.setAttribute("onclick", "this. parentNode. openTab (event);");
     }
-    menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement;
+    //menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement;
     this. appendChild (menu);
     if (menu. getElementsByTagName ("menuitem"). length > 0)
         this. type = "menu";


Результат

Выделить код

Код:

var profileDir = Components.classes["@mozilla.org/file/directory_service;1"]
    .getService(Components.interfaces.nsIProperties)
    .get("ProfD", Components.interfaces.nsILocalFile)
    .path;
var path = profileDir + "\\tabbookmarks.xml";
this. loadInBackground = true;
this. reload = true;

this. handleDragOver = function (event)
{
    var dt = event. dataTransfer;
    var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0);
    if (!tab)
        return;
    event. preventDefault ();
    event. stopPropagation ();
    return dt. effectAllowed = dt. dropEffect = "link";
}

this. handleDrop = function (event)
{
    var dt = event. dataTransfer;
    var url = dt. mozGetDataAt ("text/x-moz-text-internal", 0);
    var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0);
    this. addMenuitem (tab, url);
};

this. __defineGetter__
(
    "ss",
    function ()
    {
        delete this.ss;
        return this.ss = Components.classes["@mozilla.org/browser/sessionstore;1"]
            .getService(Components.interfaces.nsISessionStore);
    }
);

this. __defineGetter__
(
    "ios",
    function ()
    {
        delete this.ios;
        return this.ios = Components.classes["@mozilla.org/network/io-service;1"]
            .getService(Components.interfaces.nsIIOService);
    }
);

this. addMenuitem = function (tab, url)
{
    var label = tab. label;
    var image = tab. image;

    var menu = this. menu;
    var mi = document. createElement ("menuitem");
    mi. setAttribute ("label", label);
    mi. setAttribute ("tab_data", this.ss.getTabState(tab));
    mi. setAttribute ("tooltiptext", url);
    mi. className = "menuitem-iconic bookmark-item";
    image && mi. setAttribute ("image", "moz-anno:favicon:" + image.replace(/#-moz-resolution=16,16$/, ""));
    menu. appendChild (mi);
    this. type = "menu";
    this. flushMenu (menu);

    var br = gBrowser;
    //if (br. tabContainer. childNodes. length > 1)
        //br. removeTab (tab);
        setTimeout(function() {
            br. removeTab (tab);
        }, 0);
};

this. deleteMenuitem = function (menuitem, dontFlush)
{
    var menu = this. menu;
    menu. removeChild (menuitem);
    this. checkEmpty (menu);
    !dontFlush && this. flushMenu (menu);
};

this. checkEmpty = function (menu)
{
    if (menu. getElementsByTagName ("menuitem"). length > 0)
        return;
    menu. hidePopup ();
    this. type = "";
};

this. flushMenu = function (menu)
{
    menu = menu || this. menu;
    var xs = new XMLSerializer ();
    var xmenu = xs. serializeToString (menu);
    var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
              createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
    suc. charset = "UTF-8";
    xmenu = suc. ConvertFromUnicode (xmenu);
    custombuttons. writeFile (path, xmenu);
};

this. getMenu = function (event)
{
    var menu = this. menu;
    if (menu)
        this. removeChild (menu);
    menu = "";
    try
    {
        file = Components. classes ["@mozilla.org/file/local;1"].
               createInstance (Components. interfaces. nsILocalFile);
        file. initWithPath (path);
        var fis = Components. classes ["@mozilla.org/network/file-input-stream;1"].
                  createInstance (Components. interfaces. nsIFileInputStream);
        fis.init (file, 0x01, 00004, null);
        var sis = Components. classes ["@mozilla.org/scriptableinputstream;1"].
                  createInstance (Components. interfaces. nsIScriptableInputStream);
        sis. init (fis);
        menu = sis. read (sis. available ());
        sis. close ();
        var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
                  createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
        suc. charset = "UTF-8";
        menu = suc. ConvertToUnicode (menu);
        //menu = new XML (menu) || "";
        menu = new DOMParser (). parseFromString (menu, "application/xml"). documentElement;
    }
    catch (e)
    {
        menu = "";
    }
    if (!menu)
    {
        //menu =
        //<menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
        //       onclick="this. parentNode. openTab (event);"/>
        menu = document.createElement("menupopup");
        menu.setAttribute("onclick", "this. parentNode. openTab (event);");
    }
    //menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement;
    this. appendChild (menu);
    if (menu. getElementsByTagName ("menuitem"). length > 0)
        this. type = "menu";
    this. orient = "horizontal";
    return menu;
};

this. __defineGetter__
(
    "menu",
    function ()
    {
        return this. getElementsByTagName("menupopup") [0] || null;
    }
);

this. openTab = function (event, mi)
{
    mi = mi || event. target;
    var bg = event ? this. loadInBackground : true;
    var menu = mi. parentNode;
    if (!event || event. button < 2)
    {
        var tab;
        if (event && event. button == 0)
            tab = gBrowser. mCurrentTab;
        else
            tab = gBrowser. loadOneTab("about:blank", null, null, null, bg, false);
        menu. hidePopup ();
        var tabData = mi. getAttribute ("tab_data");
        this.ss.setTabState(tab, tabData);
        if(this.reload && !this.ios.offline)
        {
            var wn = Components.interfaces.nsIWebNavigation;
            gBrowser.getBrowserForTab(tab).reloadWithFlags(wn.LOAD_FLAGS_BYPASS_PROXY | wn.LOAD_FLAGS_BYPASS_CACHE);
        }
    }
    else
        event. stopPropagation ();
    this. deleteMenuitem (mi, !event);
};

this. onclick = function (event)
{
    if (event. button != 1 || event. target != this)
        return;
    var menu = this. menu;
    var mis = menu. getElementsByTagName ("menuitem");
    while (mis. length)
        this. openTab (null, mis[0]);
    this. flushMenu (menu);
};

this. setAttribute ("ondragdrop", "return this. handleDrop (event);");
this. setAttribute ("ondragover", "return this. handleDragOver (event);");
this. setAttribute ("onmouseover", "if (event. target == this) this. getMenu (event);");
this. getMenu ();


И еще есть Session Bookmarks с похожим функционалом.

Отредактировано Infocatcher (04-04-2013 14:50:06)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№304-04-2013 15:30:22

Najlus
Рррррррррррь!
 
Группа: Extensions
Откуда: Город N
Зарегистрирован: 11-01-2009
Сообщений: 1988

Re: [CB] После обновления больше не работает QickBookmarks

Спасибо, заработала, но: при открытии ссылки в текущей вкладке вкладка перезагружается, но новая страница не загружается.  При удалении закладки при помощи ПКМ ссылка убирается, но при этом список закрывается и появляется контекстное меню, что не совсем удобно.

Плюс довольно старнный глюк (Хотя скорее проблема в самом Custom Buttons) - после сохранения кода ничего нельзя редактировать  - при открытии код выстраивается в одну строку и при последующем сохранении кнопка прекращает работать и её становится невозможным удалить.

Infocatcher пишет

И еще есть Session Bookmarks с похожим функционалом.

Всё же немного не то - после открытия ссылки остаются.


Вы ленивы, следовательно вы изобретательны (Граф Де Гиш)
Список настроек About:config на русском языке с пояснениями и рекомендациями

Отсутствует

 

№404-04-2013 15:34:34

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 20.0

Re: [CB] После обновления больше не работает QickBookmarks

Najlus пишет

Плюс довольно старнный глюк (Хотя скорее проблема в самом Custom Buttons) - после сохранения кода ничего нельзя редактировать  - при открытии код выстраивается в одну строку и при последующем сохранении кнопка прекращает работать и её становится невозможным удалить.

https://forum.mozilla-russia.org/viewto … 60#p607960

Najlus пишет

Всё же немного не то - после открытия ссылки остаются.

Там можно поменять:

Выделить код

Код:

deleteAfterOpen: false, // Delete opened bookmarks

Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№504-04-2013 16:05:25

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 20.0

Re: [CB] После обновления больше не работает QickBookmarks

Najlus пишет

При удалении закладки при помощи ПКМ ссылка убирается, но при этом список закрывается и появляется контекстное меню, что не совсем удобно.

скрытый текст

Выделить код

Код:

--- a/qickBookmarks.js
+++ b/qickBookmarks.js
@@ -177,7 +177,10 @@
     }
     else
         event. stopPropagation ();
-    this. deleteMenuitem (mi, !event);
+    //this. deleteMenuitem (mi, !event);
+    setTimeout(function() {
+        this. deleteMenuitem (mi, !event);
+    }.bind(this), 0);
 };
 
 this. onclick = function (event)
@@ -189,6 +192,13 @@
     while (mis. length)
         this. openTab (null, mis[0]);
     this. flushMenu (menu);
+};
+this.oncontextmenu = function(e) {
+    if(
+        !e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey
+        && e.target.localName == "menuitem"
+    )
+        e.preventDefault();
 };
 
 this. setAttribute ("ondragdrop", "return this. handleDrop (event);");

Najlus пишет

при открытии ссылки в текущей вкладке вкладка перезагружается, но новая страница не загружается.

Пришлось скопировать кусок из Session Bookmarks :)

скрытый текст

Выделить код

Код:

--- a/qickBookmarks.js
+++ b/qickBookmarks.js
@@ -168,11 +168,27 @@
             tab = gBrowser. loadOneTab("about:blank", null, null, null, bg, false);
         menu. hidePopup ();
         var tabData = mi. getAttribute ("tab_data");
+        if(this.reload && !this.ios.offline) {
+            //var wn = Components.interfaces.nsIWebNavigation;
+            //gBrowser.getBrowserForTab(tab).reloadWithFlags(wn.LOAD_FLAGS_BYPASS_PROXY | wn.LOAD_FLAGS_BYPASS_CACHE);
+            tab.linkedBrowser.addProgressListener(this.progressListener);
+        }
         this.ss.setTabState(tab, tabData);
-        if(this.reload && !this.ios.offline)
-        {
-            var wn = Components.interfaces.nsIWebNavigation;
-            gBrowser.getBrowserForTab(tab).reloadWithFlags(wn.LOAD_FLAGS_BYPASS_PROXY | wn.LOAD_FLAGS_BYPASS_CACHE);
+
+        // Following is part of Session Bookmarks 0.2.1pre - 2013-04-01
+        // https://github.com/Infocatcher/Custom_Buttons/tree/master/Session_Bookmarks
+        if(
+            tab != gBrowser.selectedTab // Should be loaded automatically in this case
+            && (
+                tab.getAttribute("pending") == "true" // Gecko >= 9.0
+                || tab.linkedBrowser.contentDocument.readyState == "uninitialized"
+                // || tab.linkedBrowser.__SS_restoreState == 1
+            )
+        ) {
+            tab.linkedBrowser.reload();
+            // Show "Connecting…" instead of "New Tab"
+            // (disable browser.sessionstore.restore_on_demand to see this bug)
+            gBrowser.setTabTitleLoading && gBrowser.setTabTitleLoading(tab);
         }
     }
     else
@@ -181,6 +197,40 @@
     setTimeout(function() {
         this. deleteMenuitem (mi, !event);
     }.bind(this), 0);
+};
+
+this.progressListener = {
+    // Part of Session Bookmarks 0.2.1pre - 2013-04-01
+    // https://github.com/Infocatcher/Custom_Buttons/tree/master/Session_Bookmarks
+    // Based on code of Session Manager 0.7.5
+    QueryInterface: function(aIID) {
+        if(
+            aIID.equals(Components.interfaces.nsIWebProgressListener)
+            || aIID.equals(Components.interfaces.nsISupportsWeakReference)
+            || aIID.equals(Components.interfaces.nsISupports)
+        )
+            return this;
+        throw Components.results.NS_NOINTERFACE;
+    },
+    onStateChange: function(aWebProgress, aRequest, aFlag, aStatus) {
+        try {
+            if(aRequest.name == "about:blank")
+                return;
+        }
+        catch(e) { // view-source: protocol
+            if(e.name != "NS_ERROR_NOT_IMPLEMENTED")
+                Components.utils.reportError(e);
+        }
+        var wpl = Components.interfaces.nsIWebProgressListener;
+        if(aFlag & wpl.STATE_START) // Force load to bypass cache
+            aRequest.loadFlags |= aRequest.LOAD_BYPASS_CACHE;
+        else if(aFlag & wpl.STATE_STOP && aFlag & wpl.STATE_IS_NETWORK)
+            aWebProgress.chromeEventHandler.removeProgressListener(this);
+    },
+    onLocationChange: function(aProgress, aRequest, aURI) {},
+    onProgressChange: function(aWebProgress, aRequest, curSelf, maxSelf, curTot, maxTot) {},
+    onStatusChange:   function(aWebProgress, aRequest, aStatus, aMessage) {},
+    onSecurityChange: function(aWebProgress, aRequest, aState) {}
 };
 
 this. onclick = function (event)


Итого

Выделить код

Код:

var profileDir = Components.classes["@mozilla.org/file/directory_service;1"]
    .getService(Components.interfaces.nsIProperties)
    .get("ProfD", Components.interfaces.nsILocalFile)
    .path;
var path = profileDir + "\\tabbookmarks.xml";
this. loadInBackground = true;
this. reload = true;

this. handleDragOver = function (event)
{
    var dt = event. dataTransfer;
    var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0);
    if (!tab)
        return;
    event. preventDefault ();
    event. stopPropagation ();
    return dt. effectAllowed = dt. dropEffect = "link";
}

this. handleDrop = function (event)
{
    var dt = event. dataTransfer;
    var url = dt. mozGetDataAt ("text/x-moz-text-internal", 0);
    var tab = dt. mozGetDataAt (TAB_DROP_TYPE, 0);
    this. addMenuitem (tab, url);
};

this. __defineGetter__
(
    "ss",
    function ()
    {
        delete this.ss;
        return this.ss = Components.classes["@mozilla.org/browser/sessionstore;1"]
            .getService(Components.interfaces.nsISessionStore);
    }
);

this. __defineGetter__
(
    "ios",
    function ()
    {
        delete this.ios;
        return this.ios = Components.classes["@mozilla.org/network/io-service;1"]
            .getService(Components.interfaces.nsIIOService);
    }
);

this. addMenuitem = function (tab, url)
{
    var label = tab. label;
    var image = tab. image;

    var menu = this. menu;
    var mi = document. createElement ("menuitem");
    mi. setAttribute ("label", label);
    mi. setAttribute ("tab_data", this.ss.getTabState(tab));
    mi. setAttribute ("tooltiptext", url);
    mi. className = "menuitem-iconic bookmark-item";
    image && mi. setAttribute ("image", "moz-anno:favicon:" + image.replace(/#-moz-resolution=16,16$/, ""));
    menu. appendChild (mi);
    this. type = "menu";
    this. flushMenu (menu);

    var br = gBrowser;
    //if (br. tabContainer. childNodes. length > 1)
        //br. removeTab (tab);
        setTimeout(function() {
            br. removeTab (tab);
        }, 0);
};

this. deleteMenuitem = function (menuitem, dontFlush)
{
    var menu = this. menu;
    menu. removeChild (menuitem);
    this. checkEmpty (menu);
    !dontFlush && this. flushMenu (menu);
};

this. checkEmpty = function (menu)
{
    if (menu. getElementsByTagName ("menuitem"). length > 0)
        return;
    menu. hidePopup ();
    this. type = "";
};

this. flushMenu = function (menu)
{
    menu = menu || this. menu;
    var xs = new XMLSerializer ();
    var xmenu = xs. serializeToString (menu);
    var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
              createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
    suc. charset = "UTF-8";
    xmenu = suc. ConvertFromUnicode (xmenu);
    custombuttons. writeFile (path, xmenu);
};

this. getMenu = function (event)
{
    var menu = this. menu;
    if (menu)
        this. removeChild (menu);
    menu = "";
    try
    {
        file = Components. classes ["@mozilla.org/file/local;1"].
               createInstance (Components. interfaces. nsILocalFile);
        file. initWithPath (path);
        var fis = Components. classes ["@mozilla.org/network/file-input-stream;1"].
                  createInstance (Components. interfaces. nsIFileInputStream);
        fis.init (file, 0x01, 00004, null);
        var sis = Components. classes ["@mozilla.org/scriptableinputstream;1"].
                  createInstance (Components. interfaces. nsIScriptableInputStream);
        sis. init (fis);
        menu = sis. read (sis. available ());
        sis. close ();
        var suc = Components. classes ["@mozilla.org/intl/scriptableunicodeconverter"].
                  createInstance (Components. interfaces. nsIScriptableUnicodeConverter);
        suc. charset = "UTF-8";
        menu = suc. ConvertToUnicode (menu);
        //menu = new XML (menu) || "";
        menu = new DOMParser (). parseFromString (menu, "application/xml"). documentElement;
    }
    catch (e)
    {
        menu = "";
    }
    if (!menu)
    {
        //menu =
        //<menupopup xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
        //       onclick="this. parentNode. openTab (event);"/>
        menu = document.createElement("menupopup");
        menu.setAttribute("onclick", "this. parentNode. openTab (event);");
    }
    //menu = new DOMParser (). parseFromString (menu. toXMLString (), "application/xml"). documentElement;
    this. appendChild (menu);
    if (menu. getElementsByTagName ("menuitem"). length > 0)
        this. type = "menu";
    this. orient = "horizontal";
    return menu;
};

this. __defineGetter__
(
    "menu",
    function ()
    {
        return this. getElementsByTagName("menupopup") [0] || null;
    }
);

this. openTab = function (event, mi)
{
    mi = mi || event. target;
    var bg = event ? this. loadInBackground : true;
    var menu = mi. parentNode;
    if (!event || event. button < 2)
    {
        var tab;
        if (event && event. button == 0)
            tab = gBrowser. mCurrentTab;
        else
            tab = gBrowser. loadOneTab("about:blank", null, null, null, bg, false);
        menu. hidePopup ();
        var tabData = mi. getAttribute ("tab_data");
        if(this.reload && !this.ios.offline) {
            //var wn = Components.interfaces.nsIWebNavigation;
            //gBrowser.getBrowserForTab(tab).reloadWithFlags(wn.LOAD_FLAGS_BYPASS_PROXY | wn.LOAD_FLAGS_BYPASS_CACHE);
            tab.linkedBrowser.addProgressListener(this.progressListener);
        }
        this.ss.setTabState(tab, tabData);

        // Following is part of Session Bookmarks 0.2.1pre - 2013-04-01
        // https://github.com/Infocatcher/Custom_Buttons/tree/master/Session_Bookmarks
        if(
            tab != gBrowser.selectedTab // Should be loaded automatically in this case
            && (
                tab.getAttribute("pending") == "true" // Gecko >= 9.0
                || tab.linkedBrowser.contentDocument.readyState == "uninitialized"
                // || tab.linkedBrowser.__SS_restoreState == 1
            )
        ) {
            tab.linkedBrowser.reload();
            // Show "Connecting…" instead of "New Tab"
            // (disable browser.sessionstore.restore_on_demand to see this bug)
            gBrowser.setTabTitleLoading && gBrowser.setTabTitleLoading(tab);
        }
    }
    else
        event. stopPropagation ();
    //this. deleteMenuitem (mi, !event);
    setTimeout(function() {
        this. deleteMenuitem (mi, !event);
    }.bind(this), 0);
};

this.progressListener = {
    // Part of Session Bookmarks 0.2.1pre - 2013-04-01
    // https://github.com/Infocatcher/Custom_Buttons/tree/master/Session_Bookmarks
    // Based on code of Session Manager 0.7.5
    QueryInterface: function(aIID) {
        if(
            aIID.equals(Components.interfaces.nsIWebProgressListener)
            || aIID.equals(Components.interfaces.nsISupportsWeakReference)
            || aIID.equals(Components.interfaces.nsISupports)
        )
            return this;
        throw Components.results.NS_NOINTERFACE;
    },
    onStateChange: function(aWebProgress, aRequest, aFlag, aStatus) {
        try {
            if(aRequest.name == "about:blank")
                return;
        }
        catch(e) { // view-source: protocol
            if(e.name != "NS_ERROR_NOT_IMPLEMENTED")
                Components.utils.reportError(e);
        }
        var wpl = Components.interfaces.nsIWebProgressListener;
        if(aFlag & wpl.STATE_START) // Force load to bypass cache
            aRequest.loadFlags |= aRequest.LOAD_BYPASS_CACHE;
        else if(aFlag & wpl.STATE_STOP && aFlag & wpl.STATE_IS_NETWORK)
            aWebProgress.chromeEventHandler.removeProgressListener(this);
    },
    onLocationChange: function(aProgress, aRequest, aURI) {},
    onProgressChange: function(aWebProgress, aRequest, curSelf, maxSelf, curTot, maxTot) {},
    onStatusChange:   function(aWebProgress, aRequest, aStatus, aMessage) {},
    onSecurityChange: function(aWebProgress, aRequest, aState) {}
};

this. onclick = function (event)
{
    if (event. button != 1 || event. target != this)
        return;
    var menu = this. menu;
    var mis = menu. getElementsByTagName ("menuitem");
    while (mis. length)
        this. openTab (null, mis[0]);
    this. flushMenu (menu);
};
this.oncontextmenu = function(e) {
    if(
        !e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey
        && e.target.localName == "menuitem"
    )
        e.preventDefault();
};

this. setAttribute ("ondragdrop", "return this. handleDrop (event);");
this. setAttribute ("ondragover", "return this. handleDragOver (event);");
this. setAttribute ("onmouseover", "if (event. target == this) this. getMenu (event);");
this. getMenu ();


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№604-04-2013 17:20:22

Najlus
Рррррррррррь!
 
Группа: Extensions
Откуда: Город N
Зарегистрирован: 11-01-2009
Сообщений: 1988
UA: Firefox 20.0

Re: [CB] После обновления больше не работает QickBookmarks

Огромнейшее вам спасибо!
Session Bookmarks штука интересная, но немного не то: при добавлении закладки вкладка не убирается, да и что-то не нашёл я: есть ли там возможность явно указать используемый файл (например чтобы подцепить уже существующий)


Вы ленивы, следовательно вы изобретательны (Граф Де Гиш)
Список настроек About:config на русском языке с пояснениями и рекомендациями

Отсутствует

 

№704-04-2013 21:18:10

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 20.0

Re: [CB] После обновления больше не работает QickBookmarks

Najlus пишет

при добавлении закладки вкладка не убирается

А я как-то больше к классическим закладкам привык. :)
Но это просто, почему бы и не добавить.

Najlus пишет

да и что-то не нашёл я: есть ли там возможность явно указать используемый файл (например чтобы подцепить уже существующий)

Применительно к QickBookmarks там другой формат файла.
Закладки хранятся в файле %профиль%/custombuttons/bookmarks-%N.txt, где %N – номер из идентификатора кнопки. Задается это вот тут.


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]