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

Хотите узнать больше о расширениях? Посмотрите ролики, рассказывающие о работе с расширениями Firefox.

№607619-03-2013 12:34:13

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 10.0

Re: Custom Buttons

okkamas_knife

Жму - вроде работает...

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

Выделить код

Код:

var doc = content.document;
var trs = doc.getElementsByTagName("tr");

Array.slice(trs).forEach(function(tr, count) {

    if (!count) return;
    var node = doc.createElement("tr");
    node.innerHTML = "<td><div>тут мой div</div></td>";
    tr.parentNode.insertBefore(node, tr.nextSibling);
});

Отредактировано Dumby (19-03-2013 12:39:13)

Отсутствует

 

№607719-03-2013 18:10:16

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 10.0

Re: Custom Buttons

okkamas_knife

Вторая попытка :)

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

Выделить код

Код:

const maxDivCount = 1;

var doc = content.document;
var th1 = doc.querySelector("th.tcmod");
var th2 = doc.querySelector("th.tcl");
var divWidth = Math.ceil(
    th1.getBoundingClientRect().width +
    th2.getBoundingClientRect().width
);
function insertDiv(url, tr) {

    var req = new XMLHttpRequest();
    req.open("GET", url, true);
    req.responseType = "text";
    req.onload = function() {

        var text = req.responseText;
        if (!text) return;
        var suHTML = Cc["@mozilla.org/feed-unescapehtml;1"].getService(Ci.nsIScriptableUnescapeHTML);
        var doc = document.implementation.createHTMLDocument("");
        doc.body.appendChild(suHTML.parseFragment(text, false, null, doc.body));

        var div = doc.querySelector("div.postmsg");
        div.style.backgroundColor = "white";
        div.style.width = divWidth  + "px";
//        div.innerHTML = div.textContent.substring(0, 400);
        tr.parentNode.insertBefore(div, tr.nextSibling);
    }
    req.send(null);
}
Array.slice(doc.getElementsByTagName("tr")).forEach(function(tr, count) {
    if (count && count <= maxDivCount) insertDiv(tr.querySelector("a"), tr);
});

Отсутствует

 

№607820-03-2013 07:31:45

Zaycoff
Участник
 
Группа: Extensions
Зарегистрирован: 18-02-2012
Сообщений: 1411
UA: Firefox 19.0

Re: Custom Buttons

Недавно заметил, что кнопка Save page as PNG / PDF перестала работать... можно её как-то поправить?

Отсутствует

 

№607920-03-2013 14:30:16

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 10.0

Re: Custom Buttons

Zaycoff

Попробовать можно

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

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ESave%20page%20as%20PNG%20/%20PDF%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%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%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bthis.onclick%20%3D%20function%28e%29%20%7B%0A%0A%09if%20%28e.button%20%3D%3D%201%29%20%7B%0A%09%09document.popupNode%20%3D%20e.target%3B%0A%09%09document.getElementById%28%22custombuttons-contextpopup%22%29%0A%09%09.openPopupAtScreen%28e.screenX%2C%20e.screenY%29%3B%0A%09%7D%0A%09if%20%28e.button%20%3D%3D%202%29%20%7B%0A%09%09if%20%28e.shiftKey%20%7C%7C%20e.ctrlKey%20%7C%7C%20e.metaKey%29%20return%3B%0A%09%09e.preventDefault%28%29%3B%0A%09%09var%20loc%20%3D%20content.location%3B%0A%09%09if%20%28loc.protocol.slice%280%2C%204%29%20%3D%3D%20%22http%22%29%0A%09%09loadURI%28%22http%3A//pdfmyurl.com%3Furl%3D%22%20+%20loc%29%3B%0A%09%7D%0A%09if%20%28%21e.button%29%20%7B%0A%09%09var%20canvas%20%3D%20document.createElementNS%28%22http%3A//www.w3.org/1999/xhtml%22%2C%20%22canvas%22%29%3B%0A%09%09canvas.width%20%3D%20Math.min%28content.innerWidth%20+%20content.scrollMaxX%2C%2032766%29%3B%0A%09%09canvas.height%20%3D%20Math.min%28content.innerHeight%20+%20content.scrollMaxY%2C%2032766%29%3B%0A%09%09var%20context%20%3D%20canvas.getContext%28%222d%22%29%3B%0A%09%09context.drawWindow%28content%2C%200%2C%200%2C%20canvas.width%2C%20canvas.height%2C%20%22white%22%29%3B%0A%09%09var%20uri%20%3D%20makeURI%28canvas.toDataURL%28%22image/png%22%29%29%3B%0A%0A%09%09var%20fp%20%3D%20Cc%5B%27@mozilla.org/filepicker%3B1%27%5D.createInstance%28Ci.nsIFilePicker%29%3B%0A%09%09fp.init%28window%2C%20%22Save%20Screenshot%20As%22%2C%20fp.modeSave%29%3B%0A%09%09fp.appendFilter%28%22%22%2C%20%22*.png%22%29%3B%0A%09%09fp.appendFilters%28fp.filterImages%20%7C%20fp.filterAll%29%3B%0A%09%09fp.defaultExtension%20%3D%20%22png%22%3B%0A%09%09fp.defaultString%20%3D%20content.document.title%20+%20%22.png%22%3B%0A%09%09if%20%28fp.show%28%29%20%3D%3D%20fp.returnCancel%20%7C%7C%20%21fp.file%29%20return%3B%0A%0A%09%09Cc%5B%27@mozilla.org/embedding/browser/nsWebBrowserPersist%3B1%27%5D%0A%09%09.createInstance%28Ci.nsIWebBrowserPersist%29%0A%09%09.saveURI%28uri%2C%20null%2C%20null%2C%20null%2C%20null%2C%20fp.file%2C%20null%29%3B%0A%09%7D%0A%7D%3B%0Athis.tooltipText%20%3D%20%22L%20%3D%20Save%20web%20page%20as%20PNG%20%5CnM%20%3D%20CB%20Menu%20%5CnR%20%3D%20Save%20web%20page%20as%20PDF%22%3B%0A%0A%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bif%20%28%21event.target%29%20this.click%28%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отсутствует

 

№608020-03-2013 15:21:24

Zaycoff
Участник
 
Группа: Extensions
Зарегистрирован: 18-02-2012
Сообщений: 1411
UA: Firefox 19.0

Re: Custom Buttons

Dumby
Супер! Спасибо огромное. :music:

Отсутствует

 

№608120-03-2013 19:08:17

AlexandrDa
Участник
 
Группа: Members
Зарегистрирован: 02-03-2013
Сообщений: 41
UA: Firefox 19.0

Re: Custom Buttons

Всем привет

Существует ли код для очистки всей истории посещений?

Среди присутствующих я нашел только  Clear Cache, но историю посещений она не трогает.

Отсутствует

 

№608220-03-2013 19:41:18

AlexandrDa
Участник
 
Группа: Members
Зарегистрирован: 02-03-2013
Сообщений: 41
UA: Firefox 19.0

Re: Custom Buttons

Благодарю за такой развернутый ответ

За это время расковырял какой-то плагин и вытащил этот код, который также работает:

Выделить код

Код:

/*CODE*/
if(!com) var com={};
    if(!com.youpinadi) com.youpinadi={};
    if(!com.youpinadi.clearHistory) com.youpinadi.clearHistory={};

    com.youpinadi.clearHistory = {
        clearHistory: function()
        {
            let s = new Sanitizer();
            try
            {
                s.clearItem('history');
            }
            catch(err)
            {
                alert('There was an error while clearing your history');
            }
        }
    }
    
    com.youpinadi.clearHistory.clearHistory()

Отсутствует

 

№608320-03-2013 19:52:10

AlexandrDa
Участник
 
Группа: Members
Зарегистрирован: 02-03-2013
Сообщений: 41
UA: Firefox 19.0

Re: Custom Buttons

Как я написал выше, я нашел рабочий код (для ФФ 19). Можно его добавить в раздел Custom Buttons.

Отсутствует

 

№608420-03-2013 20:06:36

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

AlexandrDa пишет

Как я написал выше, я нашел рабочий код (для ФФ 19). Можно его добавить в раздел Custom Buttons.

Код не работает:

Выделить код

Код:

Ошибка: ReferenceError: Sanitizer is not defined

Отсутствует

 

№608520-03-2013 21:03:19

AlexandrDa
Участник
 
Группа: Members
Зарегистрирован: 02-03-2013
Сообщений: 41
UA: Firefox 19.0

Re: Custom Buttons

bunda1 пишет
AlexandrDa пишет

Как я написал выше, я нашел рабочий код (для ФФ 19). Можно его добавить в раздел Custom Buttons.

Код не работает:

Выделить код

Код:

Ошибка: ReferenceError: Sanitizer is not defined

Выходит, что он запускается только с установленным плагом https://addons.mozilla.org/ru/firefox/addon/clear-history/

Отсутствует

 

№608620-03-2013 21:39:32

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

AlexandrDa
Да, похоже на то.

Отсутствует

 

№608720-03-2013 22:03:22

AlexandrDa
Участник
 
Группа: Members
Зарегистрирован: 02-03-2013
Сообщений: 41
UA: Firefox 19.0

Re: Custom Buttons

А кто-нибудь знает, как в кнопке сделать include (или append) внешнего js-файла по ссылке chrome://browser/content/sanitize.js  ?

Если взять его содержимое и замиксовать с кодом из http://forum.mozilla-russia.org/viewtop … 67#p606267 , то все работает.
Привожу полный код кнопки на удаление истории:

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

Выделить код

Код:

function Sanitizer() {}
Sanitizer.prototype = {
  // warning to the caller: this one may raise an exception (e.g. bug #265028)
  clearItem: function (aItemName)
  {
    if (this.items[aItemName].canClear)
      this.items[aItemName].clear();
  },

  canClearItem: function (aItemName)
  {
    return this.items[aItemName].canClear;
  },
  
  prefDomain: "",
  
  getNameFromPreference: function (aPreferenceName)
  {
    return aPreferenceName.substr(this.prefDomain.length);
  },
  
  /**
   * Deletes privacy sensitive data in a batch, according to user preferences
   *
   * @returns  null if everything's fine;  an object in the form
   *           { itemName: error, ... } on (partial) failure
   */
  sanitize: function ()
  {
    var psvc = Components.classes["@mozilla.org/preferences-service;1"]
                         .getService(Components.interfaces.nsIPrefService);
    var branch = psvc.getBranch(this.prefDomain);
    var errors = null;

    // Cache the range of times to clear
    if (this.ignoreTimespan)
      var range = null;  // If we ignore timespan, clear everything
    else
      range = this.range || Sanitizer.getClearRange();
      
    for (var itemName in this.items) {
      var item = this.items[itemName];
      item.range = range;
      if ("clear" in item && item.canClear && branch.getBoolPref(itemName)) {
        // Some of these clear() may raise exceptions (see bug #265028)
        // to sanitize as much as possible, we catch and store them, 
        // rather than fail fast.
        // Callers should check returned errors and give user feedback
        // about items that could not be sanitized
        try {
          item.clear();
        } catch(er) {
          if (!errors) 
            errors = {};
          errors[itemName] = er;
          dump("Error sanitizing " + itemName + ": " + er + "\n");
        }
      }
    }
    return errors;
  },
  
  // Time span only makes sense in certain cases.  Consumers who want
  // to only clear some private data can opt in by setting this to false,
  // and can optionally specify a specific range.  If timespan is not ignored,
  // and range is not set, sanitize() will use the value of the timespan
  // pref to determine a range
  ignoreTimespan : true,
  range : null,
  
  items: {
    cache: {
      clear: function ()
      {
        var cacheService = Cc["@mozilla.org/network/cache-service;1"].
                          getService(Ci.nsICacheService);
        try {
          // Cache doesn't consult timespan, nor does it have the
          // facility for timespan-based eviction.  Wipe it.
          cacheService.evictEntries(Ci.nsICache.STORE_ANYWHERE);
        } catch(er) {}

        var imageCache = Cc["@mozilla.org/image/tools;1"].
                         getService(Ci.imgITools).getImgCacheForDocument(null);
        try {
          imageCache.clearCache(false); // true=chrome, false=content
        } catch(er) {}
      },
      
      get canClear()
      {
        return true;
      }
    },
    
    cookies: {
      clear: function ()
      {
        var cookieMgr = Components.classes["@mozilla.org/cookiemanager;1"]
                                  .getService(Ci.nsICookieManager);
        if (this.range) {
          // Iterate through the cookies and delete any created after our cutoff.
          var cookiesEnum = cookieMgr.enumerator;
          while (cookiesEnum.hasMoreElements()) {
            var cookie = cookiesEnum.getNext().QueryInterface(Ci.nsICookie2);
            
            if (cookie.creationTime > this.range[0])
              // This cookie was created after our cutoff, clear it
              cookieMgr.remove(cookie.host, cookie.name, cookie.path, false);
          }
        }
        else {
          // Remove everything
          cookieMgr.removeAll();
        }

        // Clear plugin data.
        const phInterface = Ci.nsIPluginHost;
        const FLAG_CLEAR_ALL = phInterface.FLAG_CLEAR_ALL;
        let ph = Cc["@mozilla.org/plugin/host;1"].getService(phInterface);

        // Determine age range in seconds. (-1 means clear all.) We don't know
        // that this.range[1] is actually now, so we compute age range based
        // on the lower bound. If this.range results in a negative age, do
        // nothing.
        let age = this.range ? (Date.now() / 1000 - this.range[0] / 1000000)
                             : -1;
        if (!this.range || age >= 0) {
          let tags = ph.getPluginTags();
          for (let i = 0; i < tags.length; i++) {
            try {
              ph.clearSiteData(tags[i], null, FLAG_CLEAR_ALL, age);
            } catch (e) {
              // If the plugin doesn't support clearing by age, clear everything.
              if (e.result == Components.results.
                    NS_ERROR_PLUGIN_TIME_RANGE_NOT_SUPPORTED) {
                try {
                  ph.clearSiteData(tags[i], null, FLAG_CLEAR_ALL, -1);
                } catch (e) {
                  // Ignore errors from the plugin
                }
              }
            }
          }
        }

        // clear any network geolocation provider sessions
        var psvc = Components.classes["@mozilla.org/preferences-service;1"]
                             .getService(Components.interfaces.nsIPrefService);
        try {
            var branch = psvc.getBranch("geo.wifi.access_token.");
            branch.deleteBranch("");
        } catch (e) {}

      },

      get canClear()
      {
        return true;
      }
    },

    offlineApps: {
      clear: function ()
      {
        Components.utils.import("resource:///modules/offlineAppCache.jsm");
        OfflineAppCacheHelper.clear();
      },

      get canClear()
      {
        return true;
      }
    },

    history: {
      clear: function ()
      {
        var globalHistory = Components.classes["@mozilla.org/browser/global-history;2"]
                                      .getService(Components.interfaces.nsIBrowserHistory);
        if (this.range)
          globalHistory.removeVisitsByTimeframe(this.range[0], this.range[1]);
        else
          globalHistory.removeAllPages();
        
        try {
          var os = Components.classes["@mozilla.org/observer-service;1"]
                             .getService(Components.interfaces.nsIObserverService);
          os.notifyObservers(null, "browser:purge-session-history", "");
        }
        catch (e) { }
        
        // Clear last URL of the Open Web Location dialog
        var prefs = Components.classes["@mozilla.org/preferences-service;1"]
                              .getService(Components.interfaces.nsIPrefBranch);
        try {
          prefs.clearUserPref("general.open_location.last_url");
        }
        catch (e) { }
      },
      
      get canClear()
      {
        // bug 347231: Always allow clearing history due to dependencies on
        // the browser:purge-session-history notification. (like error console)
        return true;
      }
    },
    
    formdata: {
      clear: function ()
      {
        // Clear undo history of all searchBars
        var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1']
                                      .getService(Components.interfaces.nsIWindowMediator);
        var windows = windowManager.getEnumerator("navigator:browser");
        while (windows.hasMoreElements()) {
          var searchBar = windows.getNext().document.getElementById("searchbar");
          if (searchBar)
            searchBar.textbox.reset();
        }

        var formHistory = Components.classes["@mozilla.org/satchel/form-history;1"]
                                    .getService(Components.interfaces.nsIFormHistory2);
        if (this.range)
          formHistory.removeEntriesByTimeframe(this.range[0], this.range[1]);
        else
          formHistory.removeAllEntries();
      },

      get canClear()
      {
        var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1']
                                      .getService(Components.interfaces.nsIWindowMediator);
        var windows = windowManager.getEnumerator("navigator:browser");
        while (windows.hasMoreElements()) {
          var searchBar = windows.getNext().document.getElementById("searchbar");
          if (searchBar) {
            var transactionMgr = searchBar.textbox.editor.transactionManager;
            if (searchBar.value ||
                transactionMgr.numberOfUndoItems ||
                transactionMgr.numberOfRedoItems)
              return true;
          }
        }

        var formHistory = Components.classes["@mozilla.org/satchel/form-history;1"]
                                    .getService(Components.interfaces.nsIFormHistory2);
        return formHistory.hasEntries;
      }
    },
    
    downloads: {
      clear: function ()
      {
        var dlMgr = Components.classes["@mozilla.org/download-manager;1"]
                              .getService(Components.interfaces.nsIDownloadManager);

        var dlIDsToRemove = [];
        if (this.range) {
          // First, remove the completed/cancelled downloads
          dlMgr.removeDownloadsByTimeframe(this.range[0], this.range[1]);
          
          // Queue up any active downloads that started in the time span as well
          var dlsEnum = dlMgr.activeDownloads;
          while(dlsEnum.hasMoreElements()) {
            var dl = dlsEnum.next();
            if(dl.startTime >= this.range[0])
              dlIDsToRemove.push(dl.id);
          }
        }
        else {
          // Clear all completed/cancelled downloads
          dlMgr.cleanUp();
          
          // Queue up all active ones as well
          var dlsEnum = dlMgr.activeDownloads;
          while(dlsEnum.hasMoreElements()) {
            dlIDsToRemove.push(dlsEnum.next().id);
          }
        }
        
        // Remove any queued up active downloads
        dlIDsToRemove.forEach(function(id) {
          dlMgr.removeDownload(id);
        });
      },

      get canClear()
      {
        var dlMgr = Components.classes["@mozilla.org/download-manager;1"]
                              .getService(Components.interfaces.nsIDownloadManager);
        return dlMgr.canCleanUp;
      }
    },
    
    passwords: {
      clear: function ()
      {
        var pwmgr = Components.classes["@mozilla.org/login-manager;1"]
                              .getService(Components.interfaces.nsILoginManager);
        // Passwords are timeless, and don't respect the timeSpan setting
        pwmgr.removeAllLogins();
      },
      
      get canClear()
      {
        var pwmgr = Components.classes["@mozilla.org/login-manager;1"]
                              .getService(Components.interfaces.nsILoginManager);
        var count = pwmgr.countLogins("", "", ""); // count all logins
        return (count > 0);
      }
    },
    
    sessions: {
      clear: function ()
      {
        // clear all auth tokens
        var sdr = Components.classes["@mozilla.org/security/sdr;1"]
                            .getService(Components.interfaces.nsISecretDecoderRing);
        sdr.logoutAndTeardown();

        // clear FTP and plain HTTP auth sessions
        var os = Components.classes["@mozilla.org/observer-service;1"]
                           .getService(Components.interfaces.nsIObserverService);
        os.notifyObservers(null, "net:clear-active-logins", null);
      },
      
      get canClear()
      {
        return true;
      }
    },
    
    siteSettings: {
      clear: function ()
      {
        // Clear site-specific permissions like "Allow this site to open popups"
        var pm = Components.classes["@mozilla.org/permissionmanager;1"]
                           .getService(Components.interfaces.nsIPermissionManager);
        pm.removeAll();
        
        // Clear site-specific settings like page-zoom level
        var cps = Components.classes["@mozilla.org/content-pref/service;1"]
                            .getService(Components.interfaces.nsIContentPrefService);
        cps.removeGroupedPrefs();
        
        // Clear "Never remember passwords for this site", which is not handled by
        // the permission manager
        var pwmgr = Components.classes["@mozilla.org/login-manager;1"]
                              .getService(Components.interfaces.nsILoginManager);
        var hosts = pwmgr.getAllDisabledHosts();
        for each (var host in hosts) {
          pwmgr.setLoginSavingEnabled(host, true);
        }
      },
      
      get canClear()
      {
        return true;
      }
    }
  }
};



// "Static" members
Sanitizer.prefDomain          = "privacy.sanitize.";
Sanitizer.prefShutdown        = "sanitizeOnShutdown";
Sanitizer.prefDidShutdown     = "didShutdownSanitize";

// Time span constants corresponding to values of the privacy.sanitize.timeSpan
// pref.  Used to determine how much history to clear, for various items
Sanitizer.TIMESPAN_EVERYTHING = 0;
Sanitizer.TIMESPAN_HOUR       = 1;
Sanitizer.TIMESPAN_2HOURS     = 2;
Sanitizer.TIMESPAN_4HOURS     = 3;
Sanitizer.TIMESPAN_TODAY      = 4;

// Return a 2 element array representing the start and end times,
// in the uSec-since-epoch format that PRTime likes.  If we should
// clear everything, return null.  Use ts if it is defined; otherwise
// use the timeSpan pref.
Sanitizer.getClearRange = function (ts) {
  if (ts === undefined)
    ts = Sanitizer.prefs.getIntPref("timeSpan");
  if (ts === Sanitizer.TIMESPAN_EVERYTHING)
    return null;
  
  // PRTime is microseconds while JS time is milliseconds
  var endDate = Date.now() * 1000;
  switch (ts) {
    case Sanitizer.TIMESPAN_HOUR :
      var startDate = endDate - 3600000000; // 1*60*60*1000000
      break;
    case Sanitizer.TIMESPAN_2HOURS :
      startDate = endDate - 7200000000; // 2*60*60*1000000
      break;
    case Sanitizer.TIMESPAN_4HOURS :
      startDate = endDate - 14400000000; // 4*60*60*1000000
      break;
    case Sanitizer.TIMESPAN_TODAY :
      var d = new Date();  // Start with today
      d.setHours(0);      // zero us back to midnight...
      d.setMinutes(0);
      d.setSeconds(0);
      startDate = d.valueOf() * 1000; // convert to epoch usec
      break;
    default:
      throw "Invalid time span for clear private data: " + ts;
  }
  return [startDate, endDate];
};

Sanitizer._prefs = null;
Sanitizer.__defineGetter__("prefs", function() 
{
  return Sanitizer._prefs ? Sanitizer._prefs
    : Sanitizer._prefs = Components.classes["@mozilla.org/preferences-service;1"]
                         .getService(Components.interfaces.nsIPrefService)
                         .getBranch(Sanitizer.prefDomain);
});

// Shows sanitization UI
Sanitizer.showUI = function(aParentWindow) 
{
  var ww = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
                     .getService(Components.interfaces.nsIWindowWatcher);
//@line 438 "e:\builds\moz2_slave\rel-m-rel-w32-bld\build\browser\base\content\sanitize.js"
  ww.openWindow(aParentWindow,
//@line 440 "e:\builds\moz2_slave\rel-m-rel-w32-bld\build\browser\base\content\sanitize.js"
                "chrome://browser/content/sanitize.xul",
                "Sanitize",
                "chrome,titlebar,dialog,centerscreen,modal",
                null);
};

/** 
 * Deletes privacy sensitive data in a batch, optionally showing the 
 * sanitize UI, according to user preferences
 */
Sanitizer.sanitize = function(aParentWindow) 
{
  Sanitizer.showUI(aParentWindow);
};

Sanitizer.onStartup = function() 
{
  // we check for unclean exit with pending sanitization
  Sanitizer._checkAndSanitize();
};

Sanitizer.onShutdown = function() 
{
  // we check if sanitization is needed and perform it
  Sanitizer._checkAndSanitize();
};

// this is called on startup and shutdown, to perform pending sanitizations
Sanitizer._checkAndSanitize = function() 
{
  const prefs = Sanitizer.prefs;
  if (prefs.getBoolPref(Sanitizer.prefShutdown) && 
      !prefs.prefHasUserValue(Sanitizer.prefDidShutdown)) {
    // this is a shutdown or a startup after an unclean exit
    var s = new Sanitizer();
    s.prefDomain = "privacy.clearOnShutdown.";
    s.sanitize() || // sanitize() returns null on full success
      prefs.setBoolPref(Sanitizer.prefDidShutdown, true);
  }
};





if(!com) var com={};
    if(!com.youpinadi) com.youpinadi={};
    if(!com.youpinadi.clearHistory) com.youpinadi.clearHistory={};

    com.youpinadi.clearHistory = {
        clearHistory: function()
        {
            let s = new Sanitizer();
            try
            {
                s.clearItem('history');
            }
            catch(err)
            {
                alert('There was an error while clearing your history');
            }
        }
    }
    
    com.youpinadi.clearHistory.clearHistory()

Отсутствует

 

№608820-03-2013 22:54:26

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

Re: Custom Buttons

AlexandrDa пишет

как в кнопке сделать include (или append) внешнего js-файла по ссылке chrome://browser/content/sanitize.js  ?

https://developer.mozilla.org/en-US/doc … riptLoader
Только не стоит все подряд в главное окно загружать – лучше использовать временный объект.


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

Отсутствует

 

№608920-03-2013 23:18:51

AlexandrDa
Участник
 
Группа: Members
Зарегистрирован: 02-03-2013
Сообщений: 41
UA: Firefox 19.0

Re: Custom Buttons

Infocatcher пишет
AlexandrDa пишет

как в кнопке сделать include (или append) внешнего js-файла по ссылке chrome://browser/content/sanitize.js  ?

https://developer.mozilla.org/en-US/doc … riptLoader
Только не стоит все подряд в главное окно загружать – лучше использовать временный объект.

Похоже на правду!
Обобщая вышесказанное, получил следующий код. Тестируем, пишем результаты:

Выделить код

Код:

/*CODE*/

var mainLoader =
Components.classes["@mozilla.org/moz/jssubscript-loader;1"].getService(Components.interfaces.mozIJSSubScriptLoader);

const url = 'chrome://browser/content/sanitize.js'; 

mainLoader.loadSubScript(url);


if(!com) var com={};
    if(!com.youpinadi) com.youpinadi={};
    if(!com.youpinadi.clearHistory) com.youpinadi.clearHistory={};

    com.youpinadi.clearHistory = {
        clearHistory: function()
        {
            let s = new Sanitizer();
            try
            {
                s.clearItem('history');
            }
            catch(err)
            {
                alert('There was an error while clearing your history');
            }
        }
    }
    
    com.youpinadi.clearHistory.clearHistory()

Отсутствует

 

№609020-03-2013 23:57:15

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 10.0

Re: Custom Buttons

AlexandrDa пишет

Тестируем, пишем результаты

Работает. Только вот похоже, что прочитал

Только не стоит все подряд в главное окно загружать – лучше использовать временный объект.

а сделал наоборот :)

Отсутствует

 

№609121-03-2013 00:01:52

AlexandrDa
Участник
 
Группа: Members
Зарегистрирован: 02-03-2013
Сообщений: 41
UA: Firefox 19.0

Re: Custom Buttons

Я пока не знаю, как создавать временный объект.
Кто справится - код в студию.

Отсутствует

 

№609221-03-2013 01:10:18

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 10.0

Re: Custom Buttons

okkamas_knife пишет

TypeError: redeclaration of const nsPK11TokenDB
chrome://pippki/content/password.js
Вопрос почему такое произошло

А причина такая же.
Первым кликом ты засунул всё это добро прямо в окно.
Вторым кликом - попытка сделать это снова, но теперь
в окне уже есть эти константы, отсюда и ошибка.
Вот, кликай сколько хочешь.

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

Выделить код

Код:

var tmp = {};
Services.scriptloader.loadSubScript("chrome://pippki/content/password.js", tmp);
var aaa="test";
tmp.doPrompt(aaa);

Отсутствует

 

№609321-03-2013 16:01:20

Лёша
Участник
 
Группа: Members
Откуда: Отсюда
Зарегистрирован: 29-11-2004
Сообщений: 47
UA: Firefox 20.0

Re: Custom Buttons

Доброго времени суток, не подскажите есть ли кнопочка аналогична кнопке "Home" на клавиатуре?

Отсутствует

 

№609421-03-2013 19:23:32

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 10.0

Re: Custom Buttons

Лёша
Попробуй

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

Выделить код

Код:

var e = document.createEvent("KeyboardEvent");
e.initKeyEvent (

    "keypress", true, true, null, 
    false, false, false, false,
    e.DOM_VK_HOME, 0
);
window.dispatchEvent(e);

okkamas_knife пишет

как можно в кнопке вызывать функцию из внешнего js файла? так чтоб и функция если она использует другие оттуда же
нормально срабатывала и чтоб лишнее не запускалось?

Увы, я не знаю, как такое сделать :(
Кстати, шутка про эти алерты :)

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

Выделить код

Код:

var tmp = {alert: function() {}};
Services.scriptloader.loadSubScript(url, tmp);
delete tmp.alert;
//tmp.test2();

Отредактировано Dumby (21-03-2013 19:23:55)

Отсутствует

 

№609521-03-2013 19:40:18

villa7
Участник
 
Группа: Members
Зарегистрирован: 21-07-2012
Сообщений: 2235
UA: unknown 0.0

Re: Custom Buttons

Есть сайты, например такие http://livefootball.ws/, которые грузятся и грузятся, а троббер крутится и крутится не останавливаясь, раздражает, но есть такая кнопка, специально выведенная на панель  Stop


которая хоть как-то спасает нервы. Вот возник вопрос, а можно сделать так что-бы она автоматом нажималась при открытии новых вкладок спустя к примеру 5-10 секунд, или на это кнопки не способны. Проще конечно скрыть троббер с глаз долой, но браузер все равно пашет впустую бедолага, жалко его. NoScriptом не пользуюсь по идейным соображениям(шутка), просто для меня он неудобен. Может есть какое то решение.


Лучше спросить у знающих - чем лезть не зная.

Отсутствует

 

№609621-03-2013 20:12:05

Pony_Smile_Pack
Участник
 
Группа: Members
Зарегистрирован: 13-01-2012
Сообщений: 1144
UA: Firefox 19.0

Re: Custom Buttons

villa7 пишет

Может есть какое то решение.

KillSpinners :: Дополнения Firefox
или жест

остановить загрузку всех вкладок
var len = gBrowser.mPanelContainer.childNodes.length;
for (var i = 0; i < len; i++) {
  gBrowser.getBrowserAtIndex(i).stop();
}

Отсутствует

 

№609721-03-2013 20:21:16

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

Лёша пишет

Доброго времени суток, не подскажите есть ли кнопочка аналогична кнопке "Home" на клавиатуре?

Если имелся виду Home( Перейти в начало страницы ) для браузера:

Выделить код

Код:

goDoCommand('cmd_scrollTop');

Отредактировано bunda1 (21-03-2013 20:29:23)

Отсутствует

 

№609821-03-2013 20:37:32

iDev.Pi
баг-репортёр
 
Группа: Extensions
Зарегистрирован: 31-01-2010
Сообщений: 2718
UA: Firefox 20.0

Re: Custom Buttons

villa7
no script -> forbid scripts globally.
killspinners - говно, которое на самом деле не останавливает загрузку повисших скриптов, а просто заменяет иконку троббера обратно на фавиконку.


mzfx

Отсутствует

 

№609921-03-2013 22:10:35

Лёша
Участник
 
Группа: Members
Откуда: Отсюда
Зарегистрирован: 29-11-2004
Сообщений: 47
UA: Firefox 20.0

Re: Custom Buttons

Dumby и bunda1, спасибо... работает :D

Только после перезапуска, кнопка пропадает и приходится каждый раз делать снова... В чем может быть проблема? :(

Отредактировано Лёша (22-03-2013 09:06:44)

Отсутствует

 

№610024-03-2013 01:30:14

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

Как правильно закрыть все вкладки с адресом "chrome://browser/content/places/places.xul"
Я намутил вот такое:

Выделить код

Код:

const library = "chrome://browser/content/places/places.xul";
   (function () {
      for ( var i = 0; i < gBrowser.tabs.length; i++) {
            var tab = gBrowser.mTabs[i];
            if ( tab.linkedBrowser.currentURI.spec !== library ) continue;
                 gBrowser.removeTab(tab);
                 arguments.callee();
            }
   })();

Подскажите более производительной код. Как удалить вкладку использую её linkedPanel

Добавлено 24-03-2013 01:35:08

Лёша пишет

Только после перезапуска, кнопка пропадает и приходится каждый раз делать снова... В чем может быть проблема? :(

Что значит пропадает? Нужны подробности.

Отредактировано bunda1 (24-03-2013 01:38:30)

Отсутствует

 

Board footer

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