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)
Отсутствует
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); });
Отсутствует
Недавно заметил, что кнопка Save page as PNG / PDF перестала работать... можно её как-то поправить?
Отсутствует
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
Отсутствует
Всем привет
Существует ли код для очистки всей истории посещений?
Среди присутствующих я нашел только Clear Cache, но историю посещений она не трогает.
Отсутствует
Благодарю за такой развернутый ответ
За это время расковырял какой-то плагин и вытащил этот код, который также работает:
/*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()
Отсутствует
Как я написал выше, я нашел рабочий код (для ФФ 19). Можно его добавить в раздел Custom Buttons.
Отсутствует
Как я написал выше, я нашел рабочий код (для ФФ 19). Можно его добавить в раздел Custom Buttons.
Код не работает:
Отсутствует
AlexandrDa пишетКак я написал выше, я нашел рабочий код (для ФФ 19). Можно его добавить в раздел Custom Buttons.
Код не работает:
Выходит, что он запускается только с установленным плагом https://addons.mozilla.org/ru/firefox/addon/clear-history/
Отсутствует
А кто-нибудь знает, как в кнопке сделать 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()
Отсутствует
как в кнопке сделать include (или append) внешнего js-файла по ссылке chrome://browser/content/sanitize.js ?
https://developer.mozilla.org/en-US/doc … riptLoader
Только не стоит все подряд в главное окно загружать – лучше использовать временный объект.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
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()
Отсутствует
Тестируем, пишем результаты
Работает. Только вот похоже, что прочитал
Только не стоит все подряд в главное окно загружать – лучше использовать временный объект.
а сделал наоборот
Отсутствует
Я пока не знаю, как создавать временный объект.
Кто справится - код в студию.
Отсутствует
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);
Отсутствует
Лёша
Попробуй
var e = document.createEvent("KeyboardEvent"); e.initKeyEvent ( "keypress", true, true, null, false, false, false, false, e.DOM_VK_HOME, 0 ); window.dispatchEvent(e);
как можно в кнопке вызывать функцию из внешнего js файла? так чтоб и функция если она использует другие оттуда же
нормально срабатывала и чтоб лишнее не запускалось?
Увы, я не знаю, как такое сделать
Кстати, шутка про эти алерты
var tmp = {alert: function() {}}; Services.scriptloader.loadSubScript(url, tmp); delete tmp.alert; //tmp.test2();
Отредактировано Dumby (21-03-2013 19:23:55)
Отсутствует
Есть сайты, например такие http://livefootball.ws/, которые грузятся и грузятся, а троббер крутится и крутится не останавливаясь, раздражает, но есть такая кнопка, специально выведенная на панель Stop
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
Может есть какое то решение.
KillSpinners :: Дополнения Firefox
или жест
Отсутствует
Доброго времени суток, не подскажите есть ли кнопочка аналогична кнопке "Home" на клавиатуре?
Если имелся виду Home( Перейти в начало страницы ) для браузера:
Отредактировано bunda1 (21-03-2013 20:29:23)
Отсутствует
villa7
no script -> forbid scripts globally.
killspinners - говно, которое на самом деле не останавливает загрузку повисших скриптов, а просто заменяет иконку троббера обратно на фавиконку.
mzfx
Отсутствует
Dumby и bunda1, спасибо... работает
Только после перезапуска, кнопка пропадает и приходится каждый раз делать снова... В чем может быть проблема?
Отредактировано Лёша (22-03-2013 09:06:44)
Отсутствует
Как правильно закрыть все вкладки с адресом "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)
Отсутствует