В последней версии кода как дубликат вкладки оставить?
Не закрывать дубликаты вкладок? Из последнего варианта отвечавшая за это строчка уже удалена.
Добавлено 03-04-2017 14:35:44
if ((~urlMap.indexOf(url)) && !tab.getAttribute("customizemode")) browser.removeTab(tab); // else urlMap.push(url); // если нужно закрывать дубликаты вкладок
Отредактировано yup (03-04-2017 14:35:44)
Отсутствует
bunda1 пишетЯ такой глюк не наблюдаю даже если открыть не существующий адрес.
В такой ситуации и у меня не закрывалось. Возможно, потому, что это другой этап процесса - ожидание ответа не от сервера HTTP, а от сервера DNS.
Вроде исправил:
// Блокировать открытие указанных адресов, от 03.04.2017. ..................... (()=> { var urls = ["about:newtab", "about:blank", "https://wdfiles.ru/thank.html"]; function stopSpecificURL(uri, tab) { ~urls.indexOf(uri) && setTimeout(()=> !tab.getAttribute("customizemode") && gBrowser.removeTab(tab), 500); }; var handle = gBrowser.addTab; eval("gBrowser.addTab = " + handle.toString().replace('return t;', 'stopSpecificURL(arguments[0], t); return t;')); addDestructor(()=> eval("gBrowser.addTab = " + handle) ); })();
Отсутствует
Вроде исправил:
А что изменилось? Судя по исходникам функции addTab(), arguments[0] - это aURI и есть. Соответственно, и работает новый вариант точно так же, как и старый.
И ещё одно наблюдение (вчерашнее ещё): если по ссылке щёлкнуть, то она открывается в новой вкладке, которая тут же закрывается. Но если ссылку открыть через "Открыть ссылку в новой вкладке", то новая вкладка не закрывается!
Добавлено 03-04-2017 22:24:19
Вообще-то проверку ~urls.indexOf(uri) было бы логичнее засунуть в функцию, вызываемую по таймеру. Но проблему с сайтом wdfiles.ru это не решает...
Добавлено 03-04-2017 22:40:16
Возможно, функция addTab() - не совсем то место, в которое стоит врезаться. Потому что не в wdfiles.ru дело. Точно так же закрывается всё, что открывается по ссылкам, приводящим к открытию новой вкладки (<a href="URL" target="abc">).
Отредактировано yup (03-04-2017 22:42:27)
Отсутствует
bunda1 пишетВроде исправил:
А что изменилось? Судя по исходникам функции addTab(), arguments[0] - это aURI и есть. Соответственно, и работает новый вариант точно так же, как и старый.
Мда, похоже я поспешил.
И ещё одно наблюдение (вчерашнее ещё): если по ссылке щёлкнуть, то она открывается в новой вкладке, которая тут же закрывается. Но если ссылку открыть через "Открыть ссылку в новой вкладке", то новая вкладка не закрывается!
Похоже что ту разные Firefox функции запускают addTab, надо будет отследить какие именно и тогда возможно появится решение. Кстати если там убрать у ссылок атрибут target="_blank" то проблем с СКМ по ссылке нет, новая вкладка не закрывается.
Добавлено 03-04-2017 22:51:33
Вообще-то проверку ~urls.indexOf(uri) было бы логичнее засунуть в функцию, вызываемую по таймеру. Но проблему с сайтом wdfiles.ru это не решает...
Не логичней, потому что тогда открытие каждой новой вкладки будет запускать таймер а это лишняя трата ресурсов.
Добавлено 03-04-2017 22:53:02
Возможно, функция addTab() - не совсем то место, в которое стоит врезаться. Потому что не в wdfiles.ru дело. Точно так же закрывается всё, что открывается по ссылкам, приводящим к открытию новой вкладки (<a href="URL" target="abc">).
Возможно. Надо подумать.
Отредактировано bunda1 (03-04-2017 22:53:02)
Отсутствует
Кстати если там убрать у ссылок атрибут target="_blank" то проблем с СКМ по ссылке нет, новая вкладка не закрывается.
Точнее так: у вкладок, открываемых по СКМ, проблем нет в любом случае, независимо от наличия "target=" в ссылке.
Не логичней, потому что тогда открытие каждой новой вкладки будет запускать таймер а это лишняя трата ресурсов.
Такой ещё вопрос возникает: если URL ссылки, по которой щёлкнули, после нескольких редиректов превращается во что-то другое, то в вызове addTab() у параметра aURI какое значение - исходный URL или окончательный?
Отредактировано yup (03-04-2017 23:04:13)
Отсутствует
Такой ещё вопрос возникает: если URL ссылки, по которой щёлкнули, после нескольких редиректов превращается во что-то другое, то в вызове addTab() у параметра aURI какое значение - исходный URL или окончательный?
Исходный URL.
Отсутствует
Не могу понять, как получается с окнами, открываемыми скриптом. Вот я открываю окошко
После полной загрузки вызываю алерт alert (w) - он показывает "w is not defined". А если это мое новосозданное окошко не в фокусе, а в фокусе любое другое окно, я вызываю в скратчпаде alert (w) и он пишет "[object Window]" т. е. скрипт это окно w уже видит.
Почему получается что окошко недоступно по ссылке, если на нем фокус?
Отсутствует
1.Есть Userscript.
https://github.com/YePpHa/YouTubeCenter/wiki/Developer-Version
можно его урезать чтобы остался только запрет авто воспроизведения видео?Или может есть кнопка с этой функцией.А если есть другой метод как отключить авто воспроизведение на YouTube то подскажите пожалуйста.
2.На rutracker.org и на некоторых других сайтах после нажатия на кнопку назад часто происходит такое -Документ просрочен этот документ более не доступен.и тд.
Есть ли кнопка которая устраняла бы эту заморочку.
У меня Pale Moon-27.2.1 пробовал Firefox-52.0.1 там всё нормально может в луне какие настройки подшаманить подскажите кто в курсе.
Отсутствует
bunda1
Есть у тебя кнопка для запуска программ
http://forum.mozilla-russia.org/viewtop … 81#p708281
Но мне надо чтобы запускалась с ярлыка с параметрами запуска
--select-exit UA --start --minimize --QuickStart "0"
если вписывать так var arg = [--select-exit UA --start --minimize --QuickStart "0"];
кнопка не работает. Не подскажешь как запускать программу с нужными параметрами.
P.S.
Создаю .bat, с нужными параметрами, потом компилирую в .ехе тогда запускается как надо. А просто через ярлык не хочет.
Отредактировано villa7 (05-04-2017 19:01:38)
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
Есть Userscript.
Добрый день. Попробуйте https://greasyfork.org/ru/scripts/593-y … ube-script
Отсутствует
Duche
это не я а Rag а то товарищ не увидит что ему ответили.
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
bunda1
Но мне надо чтобы запускалась с ярлыка с параметрами запуска
--select-exit UA --start --minimize --QuickStart "0"
если вписывать так var arg = [--select-exit UA --start --minimize --QuickStart "0"];
кнопка не работает. Не подскажешь как запускать программу с нужными параметрами.
Должно быть так var arg = ["параметр1", "параметр2", "параметр3", "'0'"];
Отсутствует
Так тоже не хочет запускаться. Тут 0 именно так "0" должен в команде быть.
Отсутствует
Duche пишет:
Попробуйте https://greasyfork.org/ru/scripts/593-y … ube-script
Спасибо за ссылку.Но чёйто не хочет этот скрипт у меня работать.Может потому что я пользуюсь UserScriptLoader
(function (css) {
const GLOBAL_EXCLUDES = [
"chrome:*"
,"jar:*"
,"resource:*"
];
const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
if (!window.Services) Cu.import("resource://gre/modules/Services.jsm");
if (window.USL) {
window.USL.destroy();
delete window.USL;
}
var USL = {};
// mögliche Positionen des Icons
USL.POSITION_MOVABLE = 0; // verschiebbar
USL.POSITION_URLBAR = 1; // URL-Leiste
USL.POSITION_STATUSBAR = 2; // Statusleiste
// Festlegen der Position, Standardposition ist URL-Leiste, mögliche Positionen:
// USL.POSITION_MOVABLE = verschiebbar, USL.POSITION_URLBAR = in URL-Leiste, USL.POSITION_STATUSBAR = in Statusleiste
USL.position = USL.POSITION_URLBAR;
// Class
USL.PrefManager = function (str) {
var root = 'UserScriptLoader.';
if (str)
root += str;
this.pref = Services.prefs.getBranch(root);
};
USL.PrefManager.prototype = {
setValue: function(name, value) {
try {
switch(typeof value) {
case 'string' :
var str = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
str.data = value;
this.pref.setComplexValue(name, Ci.nsISupportsString, str);
break;
case 'number' : this.pref.setIntPref(name, value); break;
case 'boolean': this.pref.setBoolPref(name, value); break;
}
} catch(e) { }
},
getValue: function(name, defaultValue){
var value = defaultValue;
try {
switch(this.pref.getPrefType(name)) {
case Ci.nsIPrefBranch.PREF_STRING: value = this.pref.getComplexValue(name, Ci.nsISupportsString).data; break;
case Ci.nsIPrefBranch.PREF_INT : value = this.pref.getIntPref(name); break;
case Ci.nsIPrefBranch.PREF_BOOL : value = this.pref.getBoolPref(name); break;
}
} catch(e) { }
return value;
},
deleteValue: function(name) {
try {
this.pref.deleteBranch(name);
} catch(e) { }
},
listValues: function() this.pref.getChildList("", {}),
};
USL.ScriptEntry = function (aFile) {
this.init.apply(this, arguments);
};
USL.ScriptEntry.prototype = {
includeRegExp: /^https?:\/\/.*/,
excludeRegExp: /^$/,
init: function(aFile) {
this.file = aFile;
this.leafName = aFile.leafName;
this.path = aFile.path;
this.lastModifiedTime = aFile.lastModifiedTime;
this.code = USL.loadText(aFile);
this.getMetadata();
this.disabled = false;
this.requireSrc = "";
this.resources = {};
this.run_at = "run-at" in this.metadata ? this.metadata["run-at"][0] : "document-end";
this.name = "name" in this.metadata ? this.metadata.name[0] : this.leafName;
if (this.metadata.delay) {
let delay = parseInt(this.metadata.delay[0], 10);
this.delay = isNaN(delay) ? 0 : Math.max(delay, 0);
} else if (this.run_at === "document-idle") {
this.delay = 0;
}
if (this.metadata.match) {
this.includeRegExp = this.createRegExp(this.metadata.match, true);
this.includeTLD = this.isTLD(this.metadata.match);
} else if (this.metadata.include) {
this.includeRegExp = this.createRegExp(this.metadata.include);
this.includeTLD = this.isTLD(this.metadata.include);
}
if (this.metadata.unmatch) {
this.excludeRegExp = this.createRegExp(this.metadata.unmatch, true);
this.excludeTLD = this.isTLD(this.metadata.unmatch);
} else if (this.metadata.exclude) {
this.excludeRegExp = this.createRegExp(this.metadata.exclude);
this.excludeTLD = this.isTLD(this.metadata.exclude);
}
this.prefName = 'scriptival.' + (this.metadata.namespace || 'nonamespace/') + '/' + this.name + '.';
this.__defineGetter__('pref', function() {
delete this.pref;
return this.pref = new USL.PrefManager(this.prefName);
});
if (this.metadata.resource) {
this.metadata.resource.forEach(function(r){
let res = r.split(/\s+/);
this.resources[res[0]] = { url: res[1] };
}, this);
}
this.getRequire();
this.getResource();
},
getMetadata: function() {
this.metadata = {};
let m = this.code.match(/\/\/\s*==UserScript==[\s\S]+?\/\/\s*==\/UserScript=);
if (!m)
return;
m = (m+'').split(/[\r\n]+/);
for (let i = 0; i < m.length; i++) {
if (!/\/\/\s*?@(\S+)($|\s+([^\r\n]+))/.test(m[i]))
continue;
let name = RegExp.$1.toLowerCase().trim();
let value = RegExp.$3;
if (this.metadata[name]) {
this.metadata[name].push(value);
} else {
this.metadata[name] = [value];
}
}
},
createRegExp: function(urlarray, isMatch) {
let regstr = urlarray.map(function(url) {
url = url.replace(/([()[\]{}|+.,^$?\\])/g, "\\$1");
if (isMatch) {
url = url.replace(/\*+|:\/\/\*\\\./g, function(str, index, full){
if (str === "\\^") return "(?:^|$|\\b)";
if (str === "/*\\.") return "/(?:[^/]+\\.)?";
if (str[0] === "*" && index === 0) return "(?:https?|ftp|file)";
if (str[0] === "*") return ".*";
return str;
});
} else {
url = url.replace(/\*+/g, ".*");
url = url.replace(/^\.\*\:?\/\//, "https?/");
url = url.replace(/^\.\*/, "https?:.*");
}
//url = url.replace(/^([^:]*?:\/\/[^\/\*]+)\.tld\b/,"$1\.(?:com|net|org|info|(??:co|ne|or)\\.)?jp)");
//url = url.replace(/\.tld\//,"\.(?:com|net|org|info|(??:co|ne|or)\\.)?jp)/");
return "^" + url + "$";
}).join('|');
return new RegExp(regstr);
},
isTLD: function(urlarray) {
return urlarray.some(function(url) /^.+?:\/{2,3}?[^\/]+\.tld\b/.test(url));
},
makeTLDURL: function(aURL) {
try {
var uri = Services.io.newURI(aURL, null, null);
uri.host = uri.host.slice(0, -Services.eTLD.getPublicSuffix(uri).length) + "tld";
return uri.spec;
} catch (e) {}
return "";
},
isURLMatching: function(url) {
if (this.disabled) return false;
if (this.excludeRegExp.test(url)) return false;
var tldurl = this.excludeTLD || this.includeTLD ? this.makeTLDURL(url) : "";
if (this.excludeTLD && tldurl && this.excludeRegExp.test(tldurl)) return false;
if (this.includeRegExp.test(url)) return true;
if (this.includeTLD && tldurl && this.includeRegExp.test(tldurl)) return true;
return false;
},
getResource: function() {
if (!this.metadata.resource) return;
var self = this;
for (let [name, aaa] in Iterator(this.resources)) {
let obj = aaa;
let url = obj.url;
let aFile = USL.REQUIRES_FOLDER.clone();
aFile.QueryInterface(Ci.nsILocalFile);
aFile.appendRelativePath(encodeURIComponent(url));
if (aFile.exists() && aFile.isFile()) {
let fileURL = Services.io.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler).getURLSpecFromFile(aFile);
USL.getLocalFileContents(fileURL, function(bytes, contentType){
let ascii = /^text|javascript/.test(contentType);
if (ascii) {
try { bytes = decodeURIComponent(escape(bytes)); } catch(e) {}
}
obj.bytes = bytes;
obj.contentType = contentType;
});
continue;
}
USL.getContents(url, function(bytes, contentType){
let ascii = /^text|javascript/.test(contentType);
if (ascii) {
try { bytes = decodeURIComponent(escape(bytes)); } catch(e) {}
}
let data = ascii ? USL.saveText(aFile, bytes) : USL.saveFile(aFile, bytes);
obj.bytes = data;
obj.contentType = contentType;
});
}
},
getRequire: function() {
if (!this.metadata.require) return;
var self = this;
this.metadata.require.forEach(function(url){
let aFile = USL.REQUIRES_FOLDER.clone();
aFile.QueryInterface(Ci.nsILocalFile);
aFile.appendRelativePath(encodeURIComponent(url));
if (aFile.exists() && aFile.isFile()) {
self.requireSrc += USL.loadText(aFile) + ";\r\n";
return;
}
USL.getContents(url, function(bytes, contentType){
let ascii = /^text|javascript/.test(contentType);
if (ascii) {
try { bytes = decodeURIComponent(escape(bytes)); } catch(e) {}
}
let data = ascii ? USL.saveText(aFile, bytes) : USL.saveFile(aFile, bytes);
self.requireSrc += data + ';\r\n';
});
}, this);
},
};
USL.API = function(script, sandbox, win, doc) {
var self = this;
this.GM_log = function() {
var arr = Array.slice(arguments);
arr.unshift('[' + script.name + ']');
win.console.log.apply(win.console, arr);
// Services.console.logStringMessage("["+ script.name +"] " + Array.slice(arguments).join(", "));
};
this.GM_xmlhttpRequest = function(obj) {
if(typeof(obj) != 'object' || (typeof(obj.url) != 'string' && !(obj.url instanceof String))) return;
var baseURI = Services.io.newURI(win.location.href, null, null);
obj.url = Services.io.newURI(obj.url, null, baseURI).spec;
var req = new XMLHttpRequest();
req.open(obj.method || 'GET',obj.url,true);
if(typeof(obj.headers) == 'object') for(var i in obj.headers) req.setRequestHeader(i,obj.headers[i]);
['onload','onerror','onreadystatechange'].forEach(function(k) {
// thx! script uploader
let obj_k = (obj.wrappedJSObject) ? new XPCNativeWrapper(obj.wrappedJSObject[k]) : obj[k];
if(obj_k && (typeof(obj_k) == 'function' || obj_k instanceof Function)) req[k] = function() {
obj_k({
__exposedProps__: {
status: "r",
statusText: "r",
responseHeaders: "r",
responseText: "rw",
readyState: "r",
finalUrl: "r"
},
status : (req.readyState == 4) ? req.status : 0,
statusText : (req.readyState == 4) ? req.statusText : '',
responseHeaders : (req.readyState == 4) ? req.getAllResponseHeaders() : '',
responseText : req.responseText,
readyState : req.readyState,
finalUrl : (req.readyState == 4) ? req.channel.URI.spec : '' });
};
});
if(obj.overrideMimeType) req.overrideMimeType(obj.overrideMimeType);
var c = 0;
var timer = setInterval(function() { if(req.readyState == 1 || ++c > 100) { clearInterval(timer); req.send(obj.data || null); } },10);
USL.debug(script.name + ' GM_xmlhttpRequest ' + obj.url);
};
this.GM_addStyle = function GM_addStyle(code) {
var head = doc.getElementsByTagName('head')[0];
if (head) {
var style = doc.createElement('style');
style.type = 'text/css';
style.appendChild(doc.createTextNode(code+''));
head.appendChild(style);
return style;
}
};
this.GM_setValue = function(name, value) {
return USL.USE_STORAGE_NAME.indexOf(name) >= 0?
USL.database.pref[script.prefName + name] = value:
script.pref.setValue(name, value);
};
this.GM_getValue = function(name, def) {
return USL.USE_STORAGE_NAME.indexOf(name) >= 0?
USL.database.pref[script.prefName + name] || def:
script.pref.getValue(name, def);
};
this.GM_listValues = function() {
var p = script.pref.listValues();
//var s = [x for(x in USL.database.pref[script.prefName + name])];
var s = Object.keys(USL.database.pref[script.prefName + name]);
s.forEach(function(e, i, a) a[i] = e.replace(script.prefName, ''));
p.push.apply(p, s);
return p;
};
this.GM_deleteValue = function(name) {
return USL.USE_STORAGE_NAME.indexOf(name) >= 0?
delete USL.database.pref[script.prefName + name]:
script.pref.deleteValue(name);
};
this.GM_registerMenuCommand = function(label, func, aAccelKey, aAccelModifiers, aAccessKey) {
let uuid = self.GM_generateUUID();
win.USL_registerCommands[uuid] = {
label: label,
func: func,
accelKey: aAccelKey,
accelModifiers: aAccelModifiers,
accessKey: aAccessKey,
tooltiptext: script.name
};
return uuid;
};
this.GM_unregisterMenuCommand = function(aUUID) {
return delete win.USL_registerCommands[aUUID];
};
this.GM_enableMenuCommand = function(aUUID) {
let item = win.USL_registerCommands[aUUID];
if (item) delete item.disabled;
};
this.GM_disableMenuCommand = function(aUUID) {
let item = win.USL_registerCommands[aUUID];
if (item) item.disabled = "true";
};
this.GM_getResourceText = function(name) {
let obj = script.resources[name];
if (obj) return obj.bytes;
};
this.GM_getResourceURL = function(name) {
let obj = script.resources[name];
try {
if (obj) return 'data:' + obj.contentType + ';base64,' + btoa(obj.bytes);
} catch (e) {
USL.error(e);
}
};
this.GM_getMetadata = function(key) {
return script.metadata[key] ? script.metadata[key].slice() : void 0;
};
this.GM_notification = function(msg, title, icon, callback) {
if (!icon) {
icon = 'data:image/png;base64,\
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACOElEQVQ4ja3Q3UtTcRgH8N8f4K11\
FaRrVGumlTXndPYiyQqkCyPoLroOCbyJSCGJUhOGUSnShVqtFpYlW/lCKiPmy5zinObZdJtn29nZ\
cW7nnB39TapvF+WdI4W+95/n+zwPIf8zwnRFt+AyIj5VDn7CAN5ZiphDD25Mh+jIaUSGixEePAnW\
XhTaeYCr/OdWogMZoR2Z2DPQyBNsrpqxEWiF4muG4LwK9nOhvCOOT5Y1iks3sSV0IP29CrLnAkS3\
EalxPRR/CxJTN8Dai35kXZ+fNGQyfBs2Q7chz1dCcp9FasIAxd+E5GwtwoNl8H3QqnZuHy+tSc5f\
RybejvTCRUiz55CaKoPsvQV5sR7ciAnBvoJLWdtjTn1aCTWARlshz52HOG1E0lkCxd+C+LdrCH7S\
1mXHjhLd2nQ1MvxzyF4TxJlKpCYrsD6mQ3rpEUL92l+BPg1d6T1Kl98dpr43asq8OkSZ7nyeEEII\
59DzElMHGm3DJmvGRvAxFH8TFF8T0osPIXkaIc7UI+W6i+TEHbD9VWC68hRPx4E//+BGz6QiX4tp\
eOgUZQdO0FV7IQ3ZCqi8+ACC7TjWhkwQ3Q2IfrmCZcsxMF0HX2Q9ZzuBj9rRdVctpLn7EN33ELaZ\
wPSoRE/nvv3/xIQQEnivgeRpBDdcg5W3BWB68s27gn/xDDdUjejAZfheqxOezrzdtRJCiNeamxPo\
1WLFqgHzUtW8a7idZesRr9+i5r1Pc3P2jAkhhLGodXs1vwEkf3FKAtNVEwAAAABJRU5ErkJggg==';
}
let aBrowser = win.QueryInterface(Ci.nsIDOMWindow)
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIWebNavigation)
.QueryInterface(Ci.nsIDocShell).chromeEventHandler;
let buttons = [{
label: msg,
accessKey: 'U',
callback: function (aNotification, aButton) {
try {
if (callback)
callback.call(win);
} catch (e) {
self.GM_log(new Error(e));
}
}.bind(this)
}];
let notificationBox = gBrowser.getNotificationBox(aBrowser);
let notification = notificationBox.appendNotification(
title, 'USL_notification', icon,
notificationBox.PRIORITY_INFO_MEDIUM,
buttons);
};
this.GM_safeHTMLParser = function(code) {
let doc1 = doc.implementation.createDocument("", "",
doc.implementation.createDocumentType("html", "", ""));
doc1.appendChild(doc1.createElement("html"));
doc1.documentElement.appendChild(doc1.createElement("body"));
let gUnescapeHTML = Components.classes["@mozilla.org/feed-unescapehtml;1"]
.getService(Components.interfaces.nsIScriptableUnescapeHTML);
let frag = gUnescapeHTML.parseFragment(code, false, null, doc1.body);
doc1.adoptNode(frag);
doc1.body.appendChild(frag);
return doc1;
};
};
USL.API.prototype = {
GM_openInTab: function(url, loadInBackground, reuseTab) {
openLinkIn(url, loadInBackground ? "tabshifted" : "tab", {});
},
GM_setClipboard: function(str) {
if (str.constructor === String || str.constructor === Number) {
Cc['@mozilla.org/widget/clipboardhelper;1'].getService(Ci.nsIClipboardHelper).copyString(str);
}
},
/*
GM_safeHTMLParser: function(code) {
let HTMLNS = "http://www.w3.org/1999/xhtml";
let gUnescapeHTML = Cc["@mozilla.org/feed-unescapehtml;1"].getService(Ci.nsIScriptableUnescapeHTML);
let doc = document.implementation.createDocument(HTMLNS, "html", null);
let body = document.createElementNS(HTMLNS, "body");
body.appendChild(gUnescapeHTML.parseFragment(code, false, null, body));
doc.documentElement.appendChild(body);
return doc;
},
*/
GM_generateUUID: function() {
return Cc["@mozilla.org/uuid-generator;1"].getService(Ci.nsIUUIDGenerator).generateUUID().toString();
},
};
USL.database = { pref: {}, resource: {} };
USL.readScripts = [];
USL.USE_STORAGE_NAME = ['cache', 'cacheInfo'];
USL.initialized = false;
USL.__defineGetter__("pref", function(){
delete this.pref;
return this.pref = new USL.PrefManager();
});
USL.__defineGetter__("SCRIPTS_FOLDER", function(){
let folderPath = this.pref.getValue('SCRIPTS_FOLDER', "");
let aFolder = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile)
if (!folderPath) {
aFolder.initWithPath(Services.dirsvc.get("UChrm", Ci.nsIFile).path);
aFolder.appendRelativePath('UserScriptLoader');
} else {
aFolder.initWithPath(folderPath);
}
if ( !aFolder.exists() || !aFolder.isDirectory() ) {
aFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0664);
}
delete this.SCRIPTS_FOLDER;
return this.SCRIPTS_FOLDER = aFolder;
});
USL.__defineGetter__("REQUIRES_FOLDER", function(){
let aFolder = this.SCRIPTS_FOLDER.clone();
aFolder.QueryInterface(Ci.nsILocalFile);
aFolder.appendRelativePath('require');
if ( !aFolder.exists() || !aFolder.isDirectory() ) {
aFolder.create(Ci.nsIFile.DIRECTORY_TYPE, 0664);
}
delete this.REQUIRES_FOLDER;
return this.REQUIRES_FOLDER = aFolder;
});
USL.__defineGetter__("EDITOR", function(){
delete this.EDITOR;
return this.EDITOR = this.pref.getValue('EDITOR', "") || Services.prefs.getCharPref("view_source.editor.path");
});
USL.__defineGetter__("disabled_scripts", function(){
let ds = this.pref.getValue('script.disabled', '');
delete this.disabled_scripts;
return this.disabled_scripts = ds? ds.split('|') : [];
});
USL.__defineGetter__("GLOBAL_EXCLUDES_REGEXP", function(){
let regexp = null;
let ge = USL.pref.getValue('GLOBAL_EXCLUDES', null);
ge = ge ? ge.trim().split(/\s*\,\s*/) : GLOBAL_EXCLUDES;
try {
regexp = new RegExp(ge.map(USL.wildcardToRegExpStr).join("|"));
} catch (e) {
regexp = /^(?:chrome|resource|jar);
}
delete this.GLOBAL_EXCLUDES_REGEXP;
return this.GLOBAL_EXCLUDES_REGEXP = regexp;
});
var DISABLED = true;
USL.__defineGetter__("disabled", function() DISABLED);
USL.__defineSetter__("disabled", function(bool){
if (bool) {
this.icon.setAttribute("state", "disable");
// gBrowser.mPanelContainer.removeEventListener("DOMWindowCreated", this, false);
this.icon.setAttribute("tooltiptext", "inaktiv: Mit Linksklick aktivieren, Rechtsklick Menü öffnen");
} else {
this.icon.setAttribute("state", "enable");
// gBrowser.mPanelContainer.addEventListener("DOMWindowCreated", this, false);
this.icon.setAttribute("tooltiptext", "aktiv: Mit Linksklick deaktivieren, Rechtsklick Menü öffnen");
}
return DISABLED = bool;
});
var DEBUG = USL.pref.getValue('DEBUG', false);
USL.__defineGetter__("DEBUG", function() DEBUG);
USL.__defineSetter__("DEBUG", function(bool) {
DEBUG = !!bool;
let elem = $("UserScriptLoader-debug-mode");
if (elem) elem.setAttribute("checked", DEBUG);
return bool;
});
var HIDE_EXCLUDE = USL.pref.getValue('HIDE_EXCLUDE', false);
USL.__defineGetter__("HIDE_EXCLUDE", function() HIDE_EXCLUDE);
USL.__defineSetter__("HIDE_EXCLUDE", function(bool){
HIDE_EXCLUDE = !!bool;
let elem = $("UserScriptLoader-hide-exclude");
if (elem) elem.setAttribute("checked", HIDE_EXCLUDE);
return bool;
});
var CACHE_SCRIPT = USL.pref.getValue('CACHE_SCRIPT', true);
USL.__defineGetter__("CACHE_SCRIPT", function() CACHE_SCRIPT);
USL.__defineSetter__("CACHE_SCRIPT", function(bool){
CACHE_SCRIPT = !!bool;
let elem = $("UserScriptLoader-cache-script");
if (elem) elem.setAttribute("checked", CACHE_SCRIPT);
return bool;
});
var MY_EDITOR = USL.pref.getValue('MY_EDITOR', true);
USL.__defineGetter__("MY_EDITOR", function() MY_EDITOR);
USL.__defineSetter__("MY_EDITOR", function(bool){
MY_EDITOR = !!bool;
let elem = $("UserScriptLoader-use-myeditor");
if (elem) elem.setAttribute("checked", MY_EDITOR);
return bool;
});
USL.getFocusedWindow = function () {
return Services.focus.focusedWindow;
};
USL.init = function(){
USL.loadSetting();
USL.style = addStyle(css);
if (this.position == this.POSITION_STATUSBAR) {
USL.icon = $('status-bar').appendChild($C("statusbarpanel", {
id: "UserScriptLoader-icon",
class: "statusbarpanel-iconic",
context: "UserScriptLoader-popup",
onclick: "USL.iconClick(event);"
}));
} else if (this.position == this.POSITION_URLBAR) {
USL.icon = $('urlbar-icons').appendChild($C("image", {
id: "UserScriptLoader-icon",
context: "UserScriptLoader-popup",
onclick: "USL.iconClick(event);",
style: "padding: 0px 2px;",
}));
} else {
try {
CustomizableUI.createWidget({
id: 'UserScriptLoader-icon',
type: 'custom',
defaultArea: CustomizableUI.AREA_NAVBAR,
onBuild: function(aDocument) {
var btn = aDocument.createElementNS('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul', 'toolbarbutton');
var attributes = {
id: 'UserScriptLoader-icon',
class: 'toolbarbutton-1 chromeclass-toolbar-additional',
removable: 'true',
context: 'UserScriptLoader-popup',
onclick: 'USL.iconClick(event)',
label: 'UserScriptLoader',
style: 'padding: 0px 2px;'
};
for (var a in attributes)
btn.setAttribute(a, attributes[a]);
return btn;
}
});
} catch(e) { };
USL.icon = $('UserScriptLoader-icon');
};
var xml = '\
<menupopup id="UserScriptLoader-popup" \
onpopupshowing="USL.onPopupShowing(event);"\
onpopuphidden="USL.onPopupHidden(event);"\
onclick="USL.menuClick(event);">\
<menuseparator id="UserScriptLoader-menuseparator"/>\
<menu label="Script Einstellungen"\
id="UserScriptLoader-register-menu"\
accesskey="E">\
<menupopup id="UserScriptLoader-register-popup"/>\
</menu>\
<menuitem label="Script speichern"\
id="UserScriptLoader-saveMenu"\
accesskey="S"\
oncommand="USL.saveScript();"/>\
<menu label="Menu" id="UserScriptLoader-submenu">\
<menupopup id="UserScriptLoader-submenu-popup">\
<menuitem label="Einstellungen löschen"\
oncommand="USL.deleteStorage(\'pref\');" />\
<menuseparator/>\
<menuitem label="Inaktive Scripte ausblenden"\
id="UserScriptLoader-hide-exclude"\
accesskey="a"\
type="checkbox"\
checked="' + USL.HIDE_EXCLUDE + '"\
oncommand="USL.HIDE_EXCLUDE = !USL.HIDE_EXCLUDE;" />\
<menuitem label="Scriptordner öffnen"\
id="UserScriptLoader-openFolderMenu"\
accesskey="o"\
oncommand="USL.openFolder();" />\
<menuitem label="Script importieren"\
accesskey="i"\
oncommand="USL.rebuild();" />\
<menuitem label="Script Zwischenspeicher"\
id="UserScriptLoader-cache-script"\
accesskey="z"\
type="checkbox"\
checked="' + USL.CACHE_SCRIPT + '"\
oncommand="USL.CACHE_SCRIPT = !USL.CACHE_SCRIPT;" />\
<menuitem label="Eigenen Editor verwenden"\
id="UserScriptLoader-use-myeditor"\
accesskey="E"\
type="checkbox"\
checked="' + USL.MY_EDITOR + '"\
oncommand="USL.MY_EDITOR = !USL.MY_EDITOR;" />\
<menuitem label="Testmodus"\
id="UserScriptLoader-debug-mode"\
accesskey="T"\
type="checkbox"\
checked="' + USL.DEBUG + '"\
oncommand="USL.DEBUG = !USL.DEBUG;" />\
</menupopup>\
</menu>\
</menupopup>\
';
var range = document.createRange();
range.selectNodeContents($('mainPopupSet'));
range.collapse(false);
range.insertNode(range.createContextualFragment(xml.replace(/\n|\t/g, '')));
range.detach();
USL.popup = $('UserScriptLoader-popup');
USL.menuseparator = $('UserScriptLoader-menuseparator');
USL.registMenu = $('UserScriptLoader-register-menu');
USL.saveMenu = $('UserScriptLoader-saveMenu');
USL.rebuild();
USL.disabled = USL.pref.getValue('disabled', false);
Array.from(gBrowser.browsers, browser => {
browser.addEventListener('DOMWindowCreated', USL, false);
});
gBrowser.mTabContainer.addEventListener('TabOpen', USL, false);
gBrowser.mTabContainer.addEventListener('TabClose', USL, false);
window.addEventListener('unload', USL, false);
USL.initialized = true;
};
USL.uninit = function () {
Array.from(gBrowser.browsers, browser => {
browser.removeEventListener('DOMWindowCreated', USL, false);
});
gBrowser.mTabContainer.removeEventListener('TabOpen', USL, false);
gBrowser.mTabContainer.removeEventListener('TabClose', USL, false);
window.removeEventListener('unload', USL, false);
};
USL.destroy = function () {
USL.saveSetting();
USL.uninit();
var e = document.getElementById("UserScriptLoader-icon");
if (e) e.parentNode.removeChild(e);
var e = document.getElementById("UserScriptLoader-popup");
if (e) e.parentNode.removeChild(e);
if (USL.style) USL.style.parentNode.removeChild(USL.style);
USL.disabled = true;
};
USL.handleEvent = function (event) {
switch(event.type) {
case "DOMWindowCreated":
var win = event.target.defaultView;
win.USL_registerCommands = {};
win.USL_run = [];
if (USL.disabled) return;
if (USL.readScripts.length === 0) return;
USL.injectScripts(win);
break;
case 'TabOpen':
event.target.linkedBrowser.addEventListener('DOMWindowCreated', USL, false);
break;
case 'TabClose':
event.target.linkedBrowser.removeEventListener('DOMWindowCreated', USL, false);
break;
case "unload":
USL.saveSetting();
USL.uninit();
break;
}
};
USL.createMenuitem = function () {
if (USL.popup.firstChild != USL.menuseparator) {
var range = document.createRange();
range.setStartBefore(USL.popup.firstChild);
range.setEndBefore(USL.menuseparator);
range.deleteContents();
range.detach();
}
USL.readScripts.forEach(function(script){
let m = document.createElement('menuitem');
m.setAttribute('label', script.name);
m.setAttribute("class", "UserScriptLoader-item");
m.setAttribute('checked', !script.disabled);
m.setAttribute('type', 'checkbox');
m.setAttribute('oncommand', 'this.script.disabled = !this.script.disabled;');
m.script = script;
USL.popup.insertBefore(m, USL.menuseparator);
});
};
USL.rebuild = function() {
//USL.disabled_scripts = [x.leafName for each(x in USL.readScripts) if (x.disabled)];
USL.disabled_scripts = USL.readScripts.map(function(x){ if(x.disabled) return x.leafName });
USL.pref.setValue('script.disabled', USL.disabled_scripts.join('|'));
let newScripts = [];
let ext = /\.user\.js$/i;
let files = USL.SCRIPTS_FOLDER.directoryEntries.QueryInterface(Ci.nsISimpleEnumerator);
while (files.hasMoreElements()) {
let file = files.getNext().QueryInterface(Ci.nsIFile);
if (!ext.test(file.leafName)) continue;
let script = loadScript(file);
newScripts.push(script);
}
USL.readScripts = newScripts;
USL.createMenuitem();
function loadScript(aFile) {
var script,
leafName = aFile.leafName,
lastModifiedTime = aFile.lastModifiedTime;
USL.readScripts.some(function(s, i){
if (s.leafName === leafName) {
if (s.lastModifiedTime !== lastModifiedTime && USL.initialized) {
USL.log(s.name + " reload.");
return true;
}
script = s;
return true;
}
});
if (!script) {
script = new USL.ScriptEntry(aFile);
if (USL.disabled_scripts.indexOf(leafName) !== -1)
script.disabled = true;
}
return script;
}
};
USL.reloadScripts = function() {
USL.readScripts.forEach(function(script){
let aFile = script.file;
if (aFile.exists() && script.lastModifiedTime !== aFile.lastModifiedTimeOfLink) {
script.init(aFile);
USL.log(script.name + " reload.");
}
});
};
USL.openFolder = function() {
USL.SCRIPTS_FOLDER.launch();
};
USL.saveScript = function() {
var win = USL.getFocusedWindow();
var doc = win.document;
var name = /\/\/\s*@name\s+(.*)/i.exec(doc.body.textContent);
var filename = (name && name[1] ? name[1] : win.location.href.split("/").pop()).replace(/\.user\.js$|$/i, ".user.js");
// https://developer.mozilla.org/ja/XUL_Tutorial/Open_and_Save_Dialogs
var fp = Cc["@mozilla.org/filepicker;1"].createInstance(Ci.nsIFilePicker);
fp.init(window, "", Ci.nsIFilePicker.modeSave);
fp.appendFilter("JS Files","*.js");
fp.appendFilters(Ci.nsIFilePicker.filterAll);
fp.displayDirectory = USL.SCRIPTS_FOLDER; // nsILocalFile
fp.defaultExtension = "js";
fp.defaultString = filename;
var callbackObj = {
done: function(res) {
if (res != fp.returnOK && res != fp.returnReplace) return;
var wbp = Cc["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].createInstance(Ci.nsIWebBrowserPersist);
wbp.persistFlags = wbp.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION;
var uri = doc.documentURIObject;
var loadContext = win.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIWebNavigation)
.QueryInterface(Ci.nsILoadContext);
try {
wbp.saveURI(uri, null, uri, null, null, fp.file, loadContext);
} catch(ex) {
wbp.saveURI(uri, null, uri, Ci.nsIHttpChannel.REFERRER_POLICY_NO_REFERRER_WHEN_DOWNGRADE, null, null, fp.file, loadContext);
}
}
}
fp.open(callbackObj);
};
USL.deleteStorage = function(type) {
var data = USL.database[type];
//var list = [x for(x in data)];
var list = Object.keys(data);
if (list.length == 0)
return alert(type + ' is none.');
list.push('All ' + type);
var selected = {};
var ok = Services.prompt.select(
window, "UserScriptLoader " + type, "Löschen URL auswählen.", list.length, list, selected);
if (!ok) return;
if (selected.value == list.length -1) {
list.pop();
list.forEach(function(url, i, a) {
delete data[url]});
return;
}
delete data[list[selected.value]];
};
USL.onPopupShowing = function(event) {
var win = USL.getFocusedWindow();
var popup = event.target;
switch(popup.id) {
case 'UserScriptLoader-popup':
let run = win.USL_run;
Array.slice(popup.children).some(function(menuitem){
if (!menuitem.classList.contains("UserScriptLoader-item")) return true;
let index = run ? run.indexOf(menuitem.script) : -1;
menuitem.style.fontWeight = index !== -1 ? "bold" : "";
menuitem.hidden = USL.HIDE_EXCLUDE && index === -1;
});
USL.saveMenu.hidden = win.document.contentType.indexOf("javascript") === -1;
b:if (win.USL_registerCommands) {
for (let n in win.USL_registerCommands) {
USL.registMenu.disabled = false;
break b;
}
USL.registMenu.disabled = true;
} else {
USL.registMenu.disabled = true;
}
break;
case 'UserScriptLoader-register-popup':
var registers = win.USL_registerCommands;
if (!registers) return;
for (let [uuid, item] in Iterator(registers)) {
let m = document.createElement('menuitem');
m.setAttribute('label', item.label);
m.setAttribute('tooltiptext', item.tooltiptext);
m.setAttribute('oncommand', 'this.registCommand();');
if (item.accessKey)
m.setAttribute("accesskey", item.accessKey);
if (item.disabled)
m.setAttribute("disabled", item.disabled);
m.registCommand = item.func;
popup.appendChild(m);
}
break;
}
};
USL.onPopupHidden = function(event) {
var popup = event.target;
switch(popup.id) {
case 'UserScriptLoader-register-popup':
var child = popup.firstChild;
while (child && child.localName == 'menuitem') {
popup.removeChild(child);
child = popup.firstChild;
}
break;
}
};
USL.menuClick = function(event){
var menuitem = event.target;
if (event.button == 0 || menuitem.getAttribute('type') != 'checkbox')
return;
event.preventDefault();
event.stopPropagation();
if (event.button == 1) {
menuitem.doCommand();
menuitem.setAttribute('checked', menuitem.getAttribute('checked') == 'true'? 'false' : 'true');
} else if (event.button == 2 && menuitem.script) {
USL.edit(menuitem.script);
}
};
USL.edit = function(script) {
if (!USL.MY_EDITOR || !USL.EDITOR)
return USL.editByScratchpad(script);
try {
var UI = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
UI.charset = window.navigator.platform.toLowerCase().indexOf("win") >= 0? "Shift_JIS": "UTF-8";
var path = UI.ConvertFromUnicode(script.path);
var app = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
app.initWithPath(USL.EDITOR);
var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
process.init(app);
process.run(false, [path], 1);
} catch (e) {}
};
USL.editByScratchpad = function(script) {
var win = Scratchpad.ScratchpadManager.openScratchpad({
filename: script.path,
text: USL.loadText(script.file),
saved: true,
});
var onload = (event) => {
win.removeEventListener('load', onload, false);
['sp-cmd-newWindow'
,'sp-cmd-openFile'
,'sp-cmd-clearRecentFiles'
,'sp-cmd-run'
,'sp-cmd-inspect'
,'sp-cmd-display'
,'sp-cmd-reloadAndRun'
].forEach(id => {
var elem = win.document.getElementById(id);
if (!elem) return;
elem.setAttribute('disabled', 'true');
});
};
win.addEventListener('load', onload, false);
};
USL.iconClick = function(event){
if (!event || !event.button) {
USL.disabled = !USL.disabled;
USL.pref.setValue('disabled', USL.disabled);
} else if (event.button == 1) {
USL.rebuild();
}
};
USL.retryInject = function(safeWin) {
function func(event) {
safeWin.removeEventListener("readystatechange", func, true);
if (event.target.URL === "about:blank") return;
USL.injectScripts(event.target.defaultView, true);
}
safeWin.addEventListener("readystatechange", func, true);
};
USL.injectScripts = function(safeWindow, rsflag) {
var aDocument = safeWindow.document;
var locationHref = safeWindow.location.href;
// document-start でフレームを開いた際にちょっとおかしいので…
if (!rsflag && locationHref == ""/* && safeWindow.frameElement*/)
return USL.retryInject(safeWindow);
// target="_blank" In about:blank öffnen
if (!rsflag && locationHref == 'about:blank')
return USL.retryInject(safeWindow);
if (USL.GLOBAL_EXCLUDES_REGEXP.test(locationHref)) return;
if (!USL.CACHE_SCRIPT)
USL.reloadScripts();
var documentEnds = [];
var windowLoads = [];
USL.readScripts.filter(function(script, index) {
//if (!/^(?:https?|data|file|chrome).test(locationHref)) return;
if (!script.isURLMatching(locationHref)) return false;
if ("noframes" in script &&
safeWindow.frameElement &&
!(safeWindow.frameElement instanceof HTMLFrameElement))
return false;
if (script.run_at === "document-start") {
"delay" in script ? safeWindow.setTimeout(run, script.delay, script) : run(script)
} else if (script.run_at === "window-load") {
windowLoads.push(script);
} else {
documentEnds.push(script);
}
});
/* 画像を開いた際に実行されないので適当に実行する */
if (aDocument instanceof ImageDocument) {
safeWindow.setTimeout(function() {
documentEnds.forEach(function(s) "delay" in s ?
safeWindow.setTimeout(run, s.delay, s) :
run(s));
}, 10);
safeWindow.setTimeout(function() {
windowLoads.forEach(function(s) "delay" in s ?
safeWindow.setTimeout(run, s.delay, s) :
run(s));
}, 300);
} else {
if (documentEnds.length) {
safeWindow.addEventListener("DOMContentLoaded", function(event){
event.currentTarget.removeEventListener(event.type, arguments.callee, false);
documentEnds.forEach(function(s) "delay" in s ?
safeWindow.setTimeout(run, s.delay, s) : run(s));
}, false);
}
if (windowLoads.length) {
safeWindow.addEventListener("load", function(event) {
event.currentTarget.removeEventListener(event.type, arguments.callee, false);
windowLoads.forEach(function(s) "delay" in s ?
safeWindow.setTimeout(run, s.delay, s) : run(s));
}, false);
}
}
function run(script) {
if (safeWindow.USL_run.indexOf(script) >= 0) {
USL.debug('DABUTTAYO!!!!! ' + script.name + locationHref);
return false;
}
if ("bookmarklet" in script.metadata) {
let func = new Function(script.code);
safeWindow.location.href = "javascript:" + encodeURIComponent(func.toSource()) + "();";
safeWindow.USL_run.push(script);
return;
}
let sandbox = new Cu.Sandbox(safeWindow, {sandboxPrototype: safeWindow, 'wantXrays': true,});
try {
var unsafeWindowGetter = new sandbox.Function('return window.wrappedJSObject || window;');
Object.defineProperty(sandbox, 'unsafeWindow', {get: unsafeWindowGetter});
} catch(e) {
sandbox = new Cu.Sandbox([safeWindow], {sandboxPrototype: safeWindow});
unsafeWindowGetter = new sandbox.Function('return window.wrappedJSObject || window;');
Object.defineProperty(sandbox, 'unsafeWindow', {get: unsafeWindowGetter});
}
let GM_API = new USL.API(script, sandbox, safeWindow, aDocument);
for (let n in GM_API)
sandbox[n] = GM_API[n];
sandbox["exportFunction"] = Cu.exportFunction;
sandbox.XPathResult = Ci.nsIDOMXPathResult;
// sandbox.unsafeWindow = safeWindow.wrappedJSObject;
sandbox.document = safeWindow.document;
sandbox.console = safeWindow.console;
sandbox.window = safeWindow;
if (parseInt(Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo).version) < 35)
sandbox.__proto__ = safeWindow;
USL.evalInSandbox(script, sandbox);
safeWindow.USL_run.push(script);
}
};
USL.evalInSandbox = function(aScript, aSandbox) {
try{
var lineFinder = new Error();
Cu.evalInSandbox('(function() {' + aScript.requireSrc + '\r\n' + aScript.code + '\r\n})();', aSandbox, "1.8");
} catch(e) {
let line = e.lineNumber - lineFinder.lineNumber - aScript.requireSrc.split("\n").length;
USL.error(aScript.name + ' / line:' + line + "\n" + e);
}
};
USL.log = console.log.bind(console);
USL.debug = function() {
if (!USL.DEBUG) return;
var arr = ['[USL DEBUG]'].concat(Array.from(arguments));
console.log.apply(console, arr);
};
USL.error = console.error.bind(console);
USL.loadText = function(aFile) {
var fstream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
var sstream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream);
fstream.init(aFile, -1, 0, 0);
sstream.init(fstream);
var data = sstream.read(sstream.available());
try { data = decodeURIComponent(escape(data)); } catch(e) {}
sstream.close();
fstream.close();
return data;
};
USL.loadBinary = function(aFile){
var istream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
istream.init(aFile, -1, -1, false);
var bstream = Cc["@mozilla.org/binaryinputstream;1"].createInstance(Ci.nsIBinaryInputStream);
bstream.setInputStream(istream);
return bstream.readBytes(bstream.available());
};
USL.saveText = function(aFile, data) {
var suConverter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
suConverter.charset = "UTF-8";
data = suConverter.ConvertFromUnicode(data);
return USL.saveFile(aFile, data);
};
USL.saveFile = function (aFile, data) {
var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
foStream.init(aFile, 0x02 | 0x08 | 0x20, 0664, 0);
foStream.write(data, data.length);
foStream.close();
return data;
};
USL.loadSetting = function() {
try {
var aFile = Services.dirsvc.get('UChrm', Ci.nsILocalFile);
aFile.appendRelativePath("UserScriptLoader.json");
var data = USL.loadText(aFile);
data = JSON.parse(data);
USL.database.pref = data.pref;
//USL.database.resource = data.resource;
USL.debug('UserScriptLoader.json geladen');
} catch(e) {
USL.debug('UserScriptLoader.json kann nicht geladen werden');
}
};
USL.saveSetting = function() {
//let disabledScripts = [x.leafName for each(x in USL.readScripts) if (x.disabled)];
let disabledScripts = USL.readScripts.map(function(x){ if(x.disabled) return x.leafName });
USL.pref.setValue('script.disabled', disabledScripts.join('|'));
USL.pref.setValue('disabled', USL.disabled);
USL.pref.setValue('HIDE_EXCLUDE', USL.HIDE_EXCLUDE);
USL.pref.setValue('CACHE_SCRIPT', USL.CACHE_SCRIPT);
USL.pref.setValue('MY_EDITOR', USL.MY_EDITOR);
USL.pref.setValue('DEBUG', USL.DEBUG);
var aFile = Services.dirsvc.get('UChrm', Ci.nsILocalFile);
aFile.appendRelativePath("UserScriptLoader.json");
USL.saveText(aFile, JSON.stringify(USL.database));
};
USL.getContents = function(aURL, aCallback){
try {
urlSecurityCheck(aURL, gBrowser.contentPrincipal, Ci.nsIScriptSecurityManager.DISALLOW_INHERIT_PRINCIPAL);
} catch(ex) {
return;
}
var uri = Services.io.newURI(aURL, null, null);
if (uri.scheme != 'http' && uri.scheme != 'https')
return USL.error('getContents nur "http" oder "https" möglich');
let aFile = USL.REQUIRES_FOLDER.clone();
aFile.QueryInterface(Ci.nsILocalFile);
aFile.appendRelativePath(encodeURIComponent(aURL));
var wbp = Cc["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].createInstance(Ci.nsIWebBrowserPersist);
if (aCallback) {
wbp.progressListener = {
onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus) {
if (aStateFlags & Ci.nsIWebProgressListener.STATE_STOP){
let channel = aRequest.QueryInterface(Ci.nsIHttpChannel);
let bytes = USL.loadBinary(aFile);
aCallback(bytes, channel.contentType);
return;
}
},
onLocationChange: function(aProgress, aRequest, aURI){},
onProgressChange: function(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress) {},
onStatusChange: function(aWebProgress, aRequest, aStatus, aMessage) {},
onSecurityChange: function(aWebProgress, aRequest, aState) {},
onLinkIconAvailable: function(aIconURL) {},
}
}
wbp.persistFlags = Ci.nsIWebBrowserPersist.PERSIST_FLAGS_BYPASS_CACHE;
wbp.persistFlags |= Ci.nsIWebBrowserPersist.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION;
try {
wbp.saveURI(uri, null, null, null, null, aFile, null);
} catch(ex) {
wbp.saveURI(uri, null, null, Ci.nsIHttpChannel.REFERRER_POLICY_NO_REFERRER_WHEN_DOWNGRADE, null, null, aFile, null);
}
USL.debug("getContents: " + aURL);
};
USL.getLocalFileContents = function(aURL, callback) {
var channel = Services.io.newChannel(aURL, null, null);
if (channel.URI.scheme != 'file')
return USL.error('getLocalFileContents is "file" only');
var input = channel.open();
var binaryStream = Cc['@mozilla.org/binaryinputstream;1'].createInstance(Ci.nsIBinaryInputStream);
binaryStream.setInputStream(input);
var bytes = binaryStream.readBytes(input.available());
binaryStream.close();
input.close();
callback(bytes, channel.contentType);
};
USL.wildcardToRegExpStr = function(urlstr) {
if (urlstr instanceof RegExp) return urlstr.source;
let reg = urlstr.replace(/[()\[\]{}|+.,^$?\\]/g, "\\$&").replace(/\*+/g, function(str){
return str === "*" ? ".*" : "[^/]*";
});
return "^" + reg + "$";
};
USL.init();
window.USL = USL;
function log(str) { console.log(Array.slice(arguments)); }
function debug() { if (USL.DEBUG) console.log('[USL DEBUG] ' + Array.slice(arguments));}
function $(id) document.getElementById(id);
function $C(name, attr) {
var el = document.createElement(name);
if (attr) Object.keys(attr).forEach(function(n) el.setAttribute(n, attr[n]));
return el;
}
function addStyle(css) {
var pi = document.createProcessingInstruction(
'xml-stylesheet',
'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"'
);
return document.insertBefore(pi, document.documentElement);
}
})('\
/* http://www.famfamfam.com/lab/icons/silk/preview.php */\
#UserScriptLoader-icon {\
list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAAALHRFWHRDcmVhdGlvbiBUaW1lAFN1biAzMCBNYXIgMjAwOCAxNzoyMjo0NyAtMDUwMNSe%2BEoAAAAHdElNRQfYBAYRMSwLM2%2FoAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGPC%2FxhBQAAAtBJREFUeNpdU11IU3EU%2F93tTje1vJujzS1xZVNnhdeMStG8ha%2FVDYKUICYk9RLYW1FBIERv0atFTSgqCllPvRiaDyp9qFPLsTQ12nB96Fzuy3117nVL24HD%2F3DO%2Bf3u%2F57z%2BzNWqxWJRAKpVEr2ZDIpe9Yu2fy1dAhzyxCW1sBPhQy7sjW%2F3w82GAwi1whUTkcXufgrDMvsMhBLyKVbub0swzD%2FJS5WL93NgCEBvRn%2BYjVg1UHQ%2FPDbIwnw7qhxVSbIAY%2FTwXMlWrgXV8AqgAodwKk36vMBCAQWsmDJmJtHcQoM7NI9bHV7RdHeBnVBISZGPsL56AnEjnPgG%2BoRDYfgdDzDzPgnZ1pCpuHoHsIrNqXSOHbX2LhvU2OQwYXbAEUe%2BOYWcDtMsFRZqTlJeZbq7XBP3BDL9x%2FA188zAhDRskarjdOXlkIRq6CmIgLnw%2FH%2BHbDOwt4iwDH6Vp6gvemwTG6prICO%2BsNxcHgzBgVUGoRWAzCWmemHVESgQu%2FIPK70vACUGvQOeyjuo1qeXJP64rEoJJxkikmXe0EKOD1Ni6GpMSwGXw8isBgggoLNWKGkmpL6SmRgFqc0qCIBZeineLazHWyeRv6KRVcKsakJfE0lLJweYmM9%2BKoymkUceoMWz3sew%2FP9Txet2cUe2gknp9VArVHj3sN%2BHG%2Bshf1EszwLJCOwn6Q4uY7paQ8Ghidx%2BXwjVKkoXGFTL%2BDb0EHg9wqtKQyxdR%2B6b%2Fch4V2BdXsR9LTbVdrZbDAEhZnDteun5XVuNcZkMqGz0jfANxwUxI62zLAkl7gV8sKRJh2n4uQx0sZT0siHwfse0zGfz%2FdPiV2UdNJNLEdam1FdR%2B8nLZWYDEES7nEXRvuHsOCZW8hKXb6B2WyWgwtWb7F%2FDVdJtmfyWezJfTQkhdlAFC8NRbjz4ItZlrLX690kyBolLXQYydVb0rR4LFHvQk4v%2FgIj%2FRRmaCXZ1wAAAABJRU5ErkJggg%3D%3D);\
}\
\
#UserScriptLoader-icon[state="disable"] {\
list-style-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAAALHRFWHRDcmVhdGlvbiBUaW1lAFN1biAzMCBNYXIgMjAwOCAxNzoyMjo1MCAtMDUwMN2TxloAAAAHdElNRQfYBBYRHhhogvSvAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGPC%2FxhBQAAAsxJREFUeNqFk%2F1LU1EYx7%2F3Zdt1yt7cdHPD5st0rqFD%2BkEoTDCoH5KoJJV%2BCQl6oz8miuqnmhBRoZn0QxGW07QgpDRTZ5ibON2cNje33W3urXNvKTmMzuXhnPuc5%2FPc5z7neyj8Z5xpc5STyRwMbZsjsYR%2Bbsl%2F6%2B999h%2BQkkwtxKxRPqkKhqLIZLLClqswlj0APvkHBvkqtrZ50V%2FESVGuUZglLONIZ7L33d5ASvBTBfAVMulVahWWV%2FwggaBpCnICC%2BNnOIYYn3ISeHmXoTpam%2BopCg7hxWY%2FbD3f1YkiuRxfJj%2Bj%2F8kzdHZfQPORZvA8j4Gn%2FZj7NusWYvN5TL0cm15g7LXGyw77IX0gGNFevXkN8uJiMIwEpspK1NTVwd7YBIqmIWFZWOosGHONapsbzdrNULR23uOfYK0WA2cyqBGO05DLf8NvJiaQzwGn29vxanQEmXQGp463ismrqqtgMiixk85weAvQEgmDrQgPg7GC%2FC8j2uLKBu4%2BfASWleL78jruOR%2BDIX6KmMFoRDKVhsAJg56c9oSFhVqtJh2hxHKdTid8Xh8YiXRvLcAURUOjUYvgLsdwEkkyHk9Zuy72QCaVgWYYVOj0aCcl2xsaUK7Voe1oC6yWGuRyWWi1GvT19cPj23xN9LHOVpt0boVSCY7j4FsL4M7tB%2BAjUZjKdPB8mkIyncZqcAMfXR9w%2FcYllJVpSKI8ZhZXp%2FeEFN4KI5FIYPjde%2FT29qDBVk96wZKSKeSFJ5vFvHsBwyPjONtxYp%2FwmAVvIGs1683RaFTV3X0OpaUa4ZTFg86RoxBgoXSVSgG7zYKh54MIrPm9hBMrEFtJEgSIs9bzY4mTcTJodVrCEziXE2HBZme%2BYmhgEPOz80LzXpAE8X1SJjKWbccSx4jmbUTvmsI7QmQdSiR35hQlReNDrqnUnpQPuIwqYiUFFy1DLCa0qzD4F7GAIpao5twhAAAAAElFTkSuQmCC);\
}\
'.replace(/[\r\n\t]/g, ''));
Отсутствует
bunda1
yup
Может я не правильно команду задаю --QuickStart "0", но с ярлыка запускается почему то. 0 это имя приложения, которое она должна запускать. Есть прога Advanced Onion Router
http://forum.ru-board.com/topic.cgi?for … start=3080
почему именно она, потому что только в ней можно выходить через прокси Украины, Латвии, Казахстана, других бесплатных с таким функционалам не встречал.
Нужно чтобы прога при запуске сразу запускала другой браузер через функцию Быстрого старта. В файле Help программы есть команды.Но почему то не получается.
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
0 это имя приложения, которое она должна запускать.
И его вот так нужно указывать - без расширения и пути?
Нужно чтобы прога при запуске сразу запускала другой браузер через функцию Быстрого старта.
Если одна программа запускается из другой и файл запускаемой программы указывается без каталога, то он ищется в каталоге, являющемся для запускающей программы текущим, а если там нет, то в пути (PATH).
Если программа запускается ярлыком, то правила поиска файла те же (включая поиск в PATH), но в ярлыке практически всегда путь к файлу указан полностью.
только в ней можно выходить через прокси Украины, Латвии, Казахстана, других бесплатных с таким функционалам не встречал.
Нужно чтобы прога при запуске сразу запускала другой браузер через функцию Быстрого старта.
Почему нельзя использовать кнопку "Открыть ссылку в другом браузере", где в качестве браузера используется TOR Browser, а TOR настроен на выход в нужной стране?
Или почему бы не использовать расширение, позволяющее на определённые сайты ходить через прокси, а в качестве прокси использовать всё тот же TOR?
Отредактировано yup (06-04-2017 00:37:09)
Отсутствует
villa7
Сейчас как строчка скрипта выглядит? Так?
Отсутствует