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

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

№1677630-04-2023 21:26:09

beggrr
Участник
 
Группа: Members
Зарегистрирован: 04-02-2014
Сообщений: 128
UA: Firefox 102.0

Re: Custom Buttons

В Панели разработчика (по F12) в консоли есть строка поиска, в которой можно отфильтровать, какие сообщения показывать, какие нет. У меня есть сообщения, которые я хотел бы заблокировать на постоянно. Можно это сделать через СВ?

Отсутствует

 

№1677730-04-2023 23:14:01

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 106.0

Re: Custom Buttons

vending_machine

vending_machine пишет

открытия и закрытия боковой панели?

SidebarUI.toggle('viewHistorySidebar');

Отсутствует

 

№1677830-04-2023 23:30:51

vending_machine
Участник
 
Группа: Members
Зарегистрирован: 10-01-2020
Сообщений: 549
UA: Firefox 102.0

Re: Custom Buttons

ВВП пишет

vending_machine

vending_machine пишет

открытия и закрытия боковой панели?

SidebarUI.toggle('viewHistorySidebar');

Спасибо, но что-то не действует на Gesturefy. Может это должна быть какая-то другая эмуляция нажатия кнопки Показать боковые панели? Или спереди чего дописать?
e2eb282b5e3263dc22faff1321bb936d.png

Отсутствует

 

№1677901-05-2023 13:41:19

Ultima2m
Участник
 
Группа: Members
Откуда: Россия
Зарегистрирован: 28-11-2013
Сообщений: 608
UA: Firefox 72.0

Re: Custom Buttons

Была у меня старая кнопка Fit to Page Width и я ее в ЧатГПТ загрузил с просьбой оптимизировать. И он ее даже не испортил, а что-то подправил и все расписал. Поэтому я загрузил следом кнопку Save+... И получил диссертацию с вот таким примерно содержанием (только для 1 функции пример):

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

Некоторые предложения по оптимизации кода:

- Вместо использования addEventListener, лучше использовать this.oncontextmenu, тогда не нужно искать контекстное меню по ID.
- Вместо использования e.button !== 2, можно использовать e.which === 3 для более надежной проверки на правую кнопку мыши.
- При вызове document.getElementById("contentAreaContextMenu").hidePopup(), можно использовать e.preventDefault() в начале обработчика события, чтобы контекстное меню не отображалось вообще.


Второй блок кода скрипта сохраняет выделенный текст в файл на рабочем столе.

Некоторые предложения по оптимизации кода:

- Использование nsISupportsString для конвертации строки в нужную кодировку данных строк будет более корректным.
- Вместо использования convertFromUnicode, можно использовать encodeURIComponent, чтобы сохранить текст в UTF-8.
- Лучше использовать Date.now() вместо new Date() для повышения производительности.
- Если вы используете nsIAlertsService.showAlertNotification, вы можете получить значок текущего документа, используя content.document.icon.
- При использовании метода nsIFile.create(), вы можете проверить, существует ли файл, и выбрать между записью или добавлением текста в существующий файл, используя один вызов init().

Отсутствует

 

№1678002-05-2023 16:50:19

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

Re: Custom Buttons

Ultima2m пишет

Была у меня старая кнопка Fit to Page Width и я ее в ЧатГПТ загрузил с просьбой оптимизировать. И он ее даже не испортил, а что-то подправил и все расписал. Поэтому я загрузил следом кнопку Save+... И получил диссертацию с вот таким примерно содержанием (только для 1 функции пример):

Интересные замечания от ЧатГПТ :/

Отсутствует

 

№1678111-05-2023 22:21:04

beggrr
Участник
 
Группа: Members
Зарегистрирован: 04-02-2014
Сообщений: 128
UA: Firefox 102.0

Re: Custom Buttons

Можно сделать удаление из папки Storage в профиле (подпапка Default) папки, созданной конкретным сайтом?
Скажем, сайтом, на котором сейчас находишься.


Ну и чтоб два раза не вставать - что насчет моего вопроса https://forum.mozilla-russia.org/viewto … 85#p804785 на этой же странице?

Отсутствует

 

№1678212-05-2023 19:26:38

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 336
UA: Firefox 106.0

Re: Custom Buttons

beggrr

Выделить код

Код:

Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_DOM_STORAGES, () => {});

Отсутствует

 

№1678312-05-2023 23:24:35

beggrr
Участник
 
Группа: Members
Зарегистрирован: 04-02-2014
Сообщений: 128
UA: Firefox 102.0

Re: Custom Buttons

ВВП пишет

beggrr

Выделить код

Код:

Services.clearData.deleteData(Ci.nsIClearDataService.CLEAR_DOM_STORAGES, () => {});

Я запустил этот код из консоли и он удалил из папки Default все, кроме папок с настройками расширений. Это так и должно быть?

Я просил код чтобы удалить папку одного конкретного сайта, а не полностью очистить.

Отсутствует

 

№1678412-05-2023 23:45:46

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

Re: Custom Buttons

beggrr
Ну не стоит воспринимать всё так буквально.
Видимо, это было предложение помедитировать над Services.clearData как таковым.

Отсутствует

 

№1678513-05-2023 10:02:22

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1739
UA: Firefox 113.0

Re: Custom Buttons

Dumby
У меня в профиле появилась папка с файлом -> Temp_ExternalEditor/custombuttons.76952, что это...?


Win7

Отсутствует

 

№1678613-05-2023 10:38:10

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

Re: Custom Buttons

kokoss пишет

появилась папка

Надо полагать, в окне CB-редактора
была нажата кнопка «Внешний редактор…»

с файлом -> Temp_ExternalEditor/custombuttons.76952

Такой файл должен иметь расширение .js,
и должен сам удаляться при возвращении в окно CB-редактора.
Значит что-то пошло не так.

Добавлено 13-05-2023 10:51:50
kokoss

Dumby пишет

нажата кнопка «Внешний редактор…»

Да, такое произволение, зачем-то, ещё и на СКМ повешено.

Отредактировано Dumby (13-05-2023 10:51:50)

Отсутствует

 

№1678713-05-2023 11:07:58

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1739
UA: Firefox 113.0

Re: Custom Buttons

Dumby пишет

Надо полагать, в окне CB-редактора
была нажата кнопка «Внешний редактор…»

Скорее всего, удалил папку -> открыл окно CB-редактора -> нажал кнопку "Внешний редактор" -> закрыл окно CB-редактора -> появилась папка с файлом .js

и должен сам удаляться при возвращении в окно CB-редактора.

не удаляется.

Да, такое произволение, зачем-то, ещё и на СКМ повешено.

ясненько


Win7

Отсутствует

 

№1678813-05-2023 11:57:24

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

Re: Custom Buttons

kokoss пишет

не удаляется

Странно. У меня удаляется.
Но, это если окно CB-редактора явным образом
было обретено как снова видимое.


А если что-то неожиданное, типа закрыть окно CB-редактора
прямо с панели задач, или, например, с ней же, заказать показать
окно самого браузера и там нажать рестарт, или что-то иное подобное прочее,
тогда, конечно, не удаляется.


Вобщем, это древний и не совсем продуманный стафф.
Лучше не пользоваться совсем, или пользоваться, но с учётом сказанного.

Отсутствует

 

№1678913-05-2023 12:14:36

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1739
UA: Firefox 113.0

Re: Custom Buttons

Dumby пишет

Вобщем, это древний и не совсем продуманный стафф.
Лучше не пользоваться совсем, или пользоваться, но с учётом сказанного.

Я не пользуюсь этой функцией, видимо случайно нажал, по мне так лучше бы этой кнопки вообще небыло, раз это древний и не совсем продуманный стафф.


Win7

Отсутствует

 

№1679013-05-2023 13:07:54

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

Re: Custom Buttons

kokoss пишет

лучше бы этой кнопки вообще небыло

Какие-то проблемы скрыть?

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

Выделить код

Код:

@-moz-document url-prefix("chrome://custombuttons/content/editor.x") {
	[dlgtype=extra1] {
		display: none !important;
	}
}

Отсутствует

 

№1679113-05-2023 13:36:06

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1739
UA: Firefox 113.0

Re: Custom Buttons

Dumby пишет

Какие-то проблемы скрыть?

Да, потому что не вариант узнать селектор этой кнопки ни с помощью инструментов..., и  attributes inspector...

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

Спасибо!!!

Отредактировано kokoss (13-05-2023 13:44:25)


Win7

Отсутствует

 

№1679213-05-2023 15:49:36

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

Re: Custom Buttons

kokoss пишет

Да, потому что не вариант узнать селектор этой кнопки ни с помощью инструментов

Эээ... about:config
Поиск: devtools.inspector.show
Всё — в true


Вот она

скриншот

Выделить код

Код:

data:image/gif;base64,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

Отсутствует

 

№1679313-05-2023 16:13:30

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1739
UA: Firefox 113.0

Re: Custom Buttons

Dumby пишет

Поиск: devtools.inspector.show
Всё — в true

Без изменений!
add. Спасибо, разобрался...

Отредактировано kokoss (14-05-2023 00:34:42)


Win7

Отсутствует

 

№1679413-05-2023 22:13:41

beggrr
Участник
 
Группа: Members
Зарегистрирован: 04-02-2014
Сообщений: 128
UA: Firefox 102.0

Re: Custom Buttons

Dumby пишет

beggrr
Ну не стоит воспринимать всё так буквально.
Видимо, это было предложение помедитировать над Services.clearData как таковым.

К сожалению, мой уровень чайника не позволяет медитировать над этим Services.clearData. Увы...

Все что я смог родить, это

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

Выделить код

Код:

Services.clearData.deleteDataFromBaseDomain(
   "my domain",
   true,
   CLEAR_ALL = 0xFFFFFFFF,
   alert("Готово")
)


Алерт выскакивает, но ничего не происходит.

Отсутствует

 

№1679514-05-2023 00:20:13

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

Re: Custom Buttons

beggrr пишет

мой уровень чайника не позволяет медитировать

Уровень чайника — это уже немало.
Просто медитация тогда может длиться дольше.

alert("Готово")

Не-не, это ты скормил четвёртым аргументом
результат (прям сразу) вызова функции alert(),
а не саму функцию.


Если бы я был веб-человеком, то попробовал бы начать с чего-то такого

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

Выделить код

Код:

Services.clearData.deleteDataFromPrincipal(
	gBrowser.contentPrincipal,
	true,
	Services.clearData.CLEAR_DOM_STORAGES,
	() => alert("Готово")
);

Отредактировано Dumby (14-05-2023 00:22:09)

Отсутствует

 

№1679615-05-2023 02:28:24

beggrr
Участник
 
Группа: Members
Зарегистрирован: 04-02-2014
Сообщений: 128
UA: Firefox 102.0

Re: Custom Buttons

Спасибо, Dumby, получилось.

Вот мне бы еще в консоли как то скрыть некоторые сообщения. Дело в том, что я заблокировал в Ublock Origin некоторые домены скажем play.google.com и теперь в консоли полно записей о том, что загрузка с этого адреса не удалась. Среди этой кучи ошибок бывает трудно найти то, что нужно. Каждый раз фильтровать сообщения через строку поиска не очень удобно.

Отсутствует

 

№1679716-05-2023 07:57:41

vitalii201
Участник
 
Группа: Members
Зарегистрирован: 24-03-2011
Сообщений: 679
UA: Firefox 113.0

Re: Custom Buttons

Не знаю с какой версии [firefox]

стало так:
RjBuLvn.png

custom_buttons-0.0.7.0.0.31-fx-bootstrap
config.js

Выделить код

Код:

//
try {(jsval => {
	var dbg, gref, genv = func => {
		var sandbox = new Cu.Sandbox(g, {freshCompartment: true});
		Cc["@mozilla.org/jsdebugger;1"].createInstance(Ci.IJSDebugger).addClass(sandbox);
		(dbg = new sandbox.Debugger()).addDebuggee(g);
		gref = dbg.makeGlobalObjectReference(g);
		return (genv = func => func && gref.makeDebuggeeValue(func).environment)(func);
	}
	var g = Cu.getGlobalForObject(jsval), o = g.Object, {freeze} = o, disleg;

	var lexp = () => lockPref("extensions.experiments.enabled", true);
	var MRS = "MOZ_REQUIRE_SIGNING", AC = "AppConstants", uac = `resource://gre/modules/${AC}.`;

	if (o.isFrozen(o)) { // Fx 102.0b7+
		lexp(); disleg = true; genv();

		dbg.onEnterFrame = frame => {
			var {script} = frame;
			try {if (!script.url.startsWith(uac)) return;} catch {return;}
			dbg.onEnterFrame = undefined;

			if (script.isModule) { // ESM, Fx 108+
				var env = frame.environment;
				frame.onPop = () => env.setVariable(AC, gref.makeDebuggeeValue(freeze(
					o.assign(new o(), env.getVariable(AC).unsafeDereference(), {[MRS]: false})
				)));
			}
			else { // JSM
				var nsvo = frame.this.unsafeDereference();
				nsvo.Object = {freeze(ac) {
					ac[MRS] = false;
					delete nsvo.Object;
					return freeze(ac);
				}};
			}
		}
	}
	else o.freeze = obj => {
		if (!Components.stack.caller.filename.startsWith(uac)) return freeze(obj);
		obj[MRS] = false;

		if ((disleg = "MOZ_ALLOW_ADDON_SIDELOAD" in obj)) lexp();
		else
			obj.MOZ_ALLOW_LEGACY_EXTENSIONS = true,
			lockPref("extensions.legacy.enabled", true);

		return (o.freeze = freeze)(obj);
	}
	lockPref("xpinstall.signatures.required", false);
	lockPref("extensions.langpacks.signatures.required", false);

	var useDbg = true, xpii = "resource://gre/modules/addons/XPIInstall.";
	if (Ci.nsINativeFileWatcherService) { // Fx < 100
		jsval = Cu.import(xpii + "jsm", {});
		var shouldVerify = jsval.shouldVerifySignedState;
		if (shouldVerify.length == 1)
			useDbg = false,
			jsval.shouldVerifySignedState = addon => !addon.id && shouldVerify(addon);
	}
	if (useDbg) { // Fx 99+
		try {var exp = ChromeUtils.importESModule(xpii + "sys.mjs");}
		catch {exp = g.ChromeUtils.import(xpii + "jsm");}
		jsval = o.assign({}, exp);

		var env = genv(jsval.XPIInstall.installTemporaryAddon);
		var ref = name => {try {return env.find(name).getVariable(name).unsafeDereference();} catch {}}
		jsval.XPIDatabase = (ref("lazy") || {}).XPIDatabase || ref("XPIDatabase");

		var proto = ref("Package").prototype;
		var verify = proto.verifySignedState;
		proto.verifySignedState = function(id) {
			return id ? {cert: null, signedState: undefined} : verify.apply(this, arguments);
		}
		dbg.removeAllDebuggees();
	}
	if (disleg) jsval.XPIDatabase.isDisabledLegacy = () => false;
})(
	"permitCPOWsInScope" in Cu ? Cu.import("resource://gre/modules/WebRequestCommon.jsm", {}) : Cu
);}
catch(ex) {Cu.reportError(ex);}

// bootstrap-loader.js https://forum.mozilla-russia.org/viewtopic.php?pid=795196#p795196
try {(ios => {
	var subst = "bootstrap-loader-config-script";
	ios.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler).setSubstitution(subst, ios.newURI(String.raw`
		data:,/%2A%2A%2A RDFDataSource.jsm %2A%2A%2A/%0A%0Aconst NS_XML = "http://www.w3.org/XML/1998/namespace";%0Aconst NS_XMLNS = "http://www.w3.org/2000/xmlns/";%0Aconst NS_RDF = "http://www.w3.org/1999/02/22-rdf-syntax-ns%23";%0Aconst NS_NC = "http://home.netscape.com/NC-rdf%23";%0A%0Afunction isElement(obj) {%0A  return Element.isInstance(obj);%0A}%0Afunction isText(obj) {%0A  return obj && typeof obj == "object" && ChromeUtils.getClassName(obj) == "Text";%0A}%0A%0A/%2A%2A%0A %2A Returns either an rdf namespaced attribute or an un-namespaced attribute%0A %2A value. Returns null if neither exists,%0A %2A/%0Afunction getRDFAttribute(element, name) {%0A  if (element.hasAttributeNS(NS_RDF, name))%0A    return element.getAttributeNS(NS_RDF, name);%0A  if (element.hasAttribute(name))%0A    return element.getAttribute(name);%0A  return undefined;%0A}%0A%0A/%2A%2A%0A %2A Represents an assertion in the datasource%0A %2A/%0Aclass RDFAssertion {%0A  constructor(subject, predicate, object) {%0A    // The subject on this assertion, an RDFSubject%0A    this._subject = subject;%0A    // The predicate, a string%0A    this._predicate = predicate;%0A    // The object, an RDFNode%0A    this._object = object;%0A    // The datasource this assertion exists in%0A    this._ds = this._subject._ds;%0A    // Marks that _DOMnode is the subject's element%0A    this._isSubjectElement = false;%0A    // The DOM node that represents this assertion. Could be a property element,%0A    // a property attribute or the subject's element for rdf:type%0A    this._DOMNode = null;%0A  }%0A%0A  getPredicate() {%0A    return this._predicate;%0A  }%0A%0A  getObject() {%0A    return this._object;%0A  }%0A}%0A%0Aclass RDFNode {%0A  equals(rdfnode) {%0A    return (rdfnode.constructor === this.constructor &&%0A            rdfnode._value == this._value);%0A  }%0A}%0A%0A/%2A%2A%0A %2A A simple literal value%0A %2A/%0Aclass RDFLiteral extends RDFNode {%0A  constructor(value) {%0A    super();%0A    this._value = value;%0A  }%0A%0A  getValue() {%0A    return this._value;%0A  }%0A}%0A%0A/%2A%2A%0A %2A This is an RDF node that can be a subject so a resource or a blank node%0A %2A/%0Aclass RDFSubject extends RDFNode {%0A  constructor(ds) {%0A    super();%0A    // A lookup of the assertions with this as the subject. Keyed on predicate%0A    this._assertions = {};%0A    // A lookup of the assertions with this as the object. Keyed on predicate%0A    this._backwards = {};%0A    // The datasource this subject belongs to%0A    this._ds = ds;%0A    // The DOM elements in the document that represent this subject. Array of Element%0A    this._elements = [];%0A  }%0A%0A  /%2A%2A%0A   %2A Parses the given Element from the DOM document%0A   %2A/%0A  /%2A eslint-disable complexity %2A/%0A  _parseElement(element) {%0A    this._elements.push(element);%0A%0A    // There might be an inferred rdf:type assertion in the element name%0A    if (element.namespaceURI != NS_RDF ||%0A        element.localName != "Description") {%0A      var assertion = new RDFAssertion(this, RDF_R("type"),%0A                                       this._ds.getResource(element.namespaceURI + element.localName));%0A      assertion._DOMnode = element;%0A      assertion._isSubjectElement = true;%0A      this._addAssertion(assertion);%0A    }%0A%0A    // Certain attributes can be literal properties%0A    for (let attr of element.attributes) {%0A      if (attr.namespaceURI == NS_XML || attr.namespaceURI == NS_XMLNS ||%0A          attr.nodeName == "xmlns")%0A        continue;%0A      if ((attr.namespaceURI == NS_RDF || !attr.namespaceURI) &&%0A          (["nodeID", "about", "resource", "ID", "parseType"].includes(attr.localName)))%0A        continue;%0A      var object = null;%0A      if (attr.namespaceURI == NS_RDF) {%0A        if (attr.localName == "type")%0A          object = this._ds.getResource(attr.nodeValue);%0A      }%0A      if (!object)%0A        object = new RDFLiteral(attr.nodeValue);%0A      assertion = new RDFAssertion(this, attr.namespaceURI + attr.localName, object);%0A      assertion._DOMnode = attr;%0A      this._addAssertion(assertion);%0A    }%0A%0A    var child = element.firstChild;%0A    element.listCounter = 1;%0A    while (child) {%0A      if (isElement(child)) {%0A        object = null;%0A        var predicate = child.namespaceURI + child.localName;%0A        if (child.namespaceURI == NS_RDF) {%0A          if (child.localName == "li") {%0A            predicate = RDF_R(%60_%24{element.listCounter}%60);%0A            element.listCounter++;%0A          }%0A        }%0A%0A        // Check for and bail out on unknown attributes on the property element%0A        for (let attr of child.attributes) {%0A          // Ignore XML namespaced attributes%0A          if (attr.namespaceURI == NS_XML)%0A            continue;%0A          // These are reserved by XML for future use%0A          if (attr.localName.substring(0, 3).toLowerCase() == "xml")%0A            continue;%0A          // We can handle these RDF attributes%0A          if ((!attr.namespaceURI || attr.namespaceURI == NS_RDF) &&%0A              ["resource", "nodeID"].includes(attr.localName))%0A            continue;%0A          // This is a special attribute we handle for compatibility with Mozilla RDF%0A          if (attr.namespaceURI == NS_NC &&%0A              attr.localName == "parseType")%0A            continue;%0A        }%0A%0A        var parseType = child.getAttributeNS(NS_NC, "parseType");%0A%0A        var resource = getRDFAttribute(child, "resource");%0A        var nodeID = getRDFAttribute(child, "nodeID");%0A%0A        if (resource !== undefined) {%0A          var base = Services.io.newURI(element.baseURI);%0A          object = this._ds.getResource(base.resolve(resource));%0A        } else if (nodeID !== undefined) {%0A          object = this._ds.getBlankNode(nodeID);%0A        } else {%0A          var hasText = false;%0A          var childElement = null;%0A          var subchild = child.firstChild;%0A          while (subchild) {%0A            if (isText(subchild) && /\S/.test(subchild.nodeValue)) {%0A              hasText = true;%0A            } else if (isElement(subchild)) {%0A              childElement = subchild;%0A            }%0A            subchild = subchild.nextSibling;%0A          }%0A%0A          if (childElement) {%0A            object = this._ds._getSubjectForElement(childElement);%0A            object._parseElement(childElement);%0A          } else%0A            object = new RDFLiteral(child.textContent);%0A        }%0A%0A        assertion = new RDFAssertion(this, predicate, object);%0A        this._addAssertion(assertion);%0A        assertion._DOMnode = child;%0A      }%0A      child = child.nextSibling;%0A    }%0A  }%0A  /%2A eslint-enable complexity %2A/%0A%0A  /%2A%2A%0A   %2A Adds a new assertion to the internal hashes. Should be called for every%0A   %2A new assertion parsed or created programmatically.%0A   %2A/%0A  _addAssertion(assertion) {%0A    var predicate = assertion.getPredicate();%0A    if (predicate in this._assertions)%0A      this._assertions[predicate].push(assertion);%0A    else%0A      this._assertions[predicate] = [ assertion ];%0A%0A    var object = assertion.getObject();%0A    if (object instanceof RDFSubject) {%0A      // Create reverse assertion%0A      if (predicate in object._backwards)%0A        object._backwards[predicate].push(assertion);%0A      else%0A        object._backwards[predicate] = [ assertion ];%0A    }%0A  }%0A%0A  /%2A%2A%0A   %2A Returns all objects in assertions with this subject and the given predicate.%0A   %2A/%0A  getObjects(predicate) {%0A    if (predicate in this._assertions)%0A      return Array.from(this._assertions[predicate],%0A                        i => i.getObject());%0A%0A    return [];%0A  }%0A%0A  /%2A%2A%0A   %2A Retrieves the first property value for the given predicate.%0A   %2A/%0A  getProperty(predicate) {%0A    if (predicate in this._assertions)%0A      return this._assertions[predicate][0].getObject();%0A    return null;%0A  }%0A}%0A%0A/%2A%2A%0A %2A Creates a new RDFResource for the datasource. Private.%0A %2A/%0Aclass RDFResource extends RDFSubject {%0A  constructor(ds, uri) {%0A    super(ds);%0A    // This is the uri that the resource represents.%0A    this._uri = uri;%0A  }%0A}%0A%0A/%2A%2A%0A %2A Creates a new blank node. Private.%0A %2A/%0Aclass RDFBlankNode extends RDFSubject {%0A  constructor(ds, nodeID) {%0A    super(ds);%0A    // The nodeID of this node. May be null if there is no ID.%0A    this._nodeID = nodeID;%0A  }%0A%0A  /%2A%2A%0A   %2A Sets attributes on the DOM element to mark it as representing this node%0A   %2A/%0A  _applyToElement(element) {%0A    if (!this._nodeID)%0A      return;%0A    if (USE_RDFNS_ATTR) {%0A      var prefix = this._ds._resolvePrefix(element, RDF_R("nodeID"));%0A      element.setAttributeNS(prefix.namespaceURI, prefix.qname, this._nodeID);%0A    } else {%0A      element.setAttribute("nodeID", this._nodeID);%0A    }%0A  }%0A%0A  /%2A%2A%0A   %2A Creates a new Element in the document for holding assertions about this%0A   %2A subject. The URI controls what tagname to use.%0A   %2A/%0A  _createNewElement(uri) {%0A    // If there are already nodes representing this in the document then we need%0A    // a nodeID to match them%0A    if (!this._nodeID && this._elements.length > 0) {%0A      this._ds._createNodeID(this);%0A      for (let element of this._elements)%0A        this._applyToElement(element);%0A    }%0A%0A    return super._createNewElement.call(uri);%0A  }%0A%0A  /%2A%2A%0A   %2A Adds a reference to this node to the given property Element.%0A   %2A/%0A  _addReferenceToElement(element) {%0A    if (this._elements.length > 0 && !this._nodeID) {%0A      // In document elsewhere already%0A      // Create a node ID and update the other nodes referencing%0A      this._ds._createNodeID(this);%0A      for (let element of this._elements)%0A        this._applyToElement(element);%0A    }%0A%0A    if (this._nodeID) {%0A      if (USE_RDFNS_ATTR) {%0A        let prefix = this._ds._resolvePrefix(element, RDF_R("nodeID"));%0A        element.setAttributeNS(prefix.namespaceURI, prefix.qname, this._nodeID);%0A      } else {%0A        element.setAttribute("nodeID", this._nodeID);%0A      }%0A    } else {%0A      // Add the empty blank node, this is generally right since further%0A      // assertions will be added to fill this out%0A      var newelement = this._ds._addElement(element, RDF_R("Description"));%0A      newelement.listCounter = 1;%0A      this._elements.push(newelement);%0A    }%0A  }%0A%0A    /%2A%2A%0A     %2A Removes any reference to this node from the given property Element.%0A     %2A/%0A    _removeReferenceFromElement(element) {%0A      if (element.hasAttributeNS(NS_RDF, "nodeID"))%0A        element.removeAttributeNS(NS_RDF, "nodeID");%0A      if (element.hasAttribute("nodeID"))%0A        element.removeAttribute("nodeID");%0A    }%0A%0A  getNodeID() {%0A    return this._nodeID;%0A  }%0A}%0A%0A/%2A%2A%0A %2A Creates a new RDFDataSource from the given document. The document will be%0A %2A changed as assertions are added and removed to the RDF. Pass a null document%0A %2A to start with an empty graph.%0A %2A/%0Aclass RDFDataSource {%0A  constructor(document) {%0A    // All known resources, indexed on URI%0A    this._resources = {};%0A    // All blank nodes%0A    this._allBlankNodes = [];%0A%0A    // The underlying DOM document for this datasource%0A    this._document = document;%0A    this._parseDocument();%0A  }%0A%0A  static loadFromString(text) {%0A    let parser = new DOMParser();%0A    let document = parser.parseFromString(text, "application/xml");%0A%0A    return new this(document);%0A  }%0A%0A  /%2A%2A%0A   %2A Returns an rdf subject for the given DOM Element. If the subject has not%0A   %2A been seen before a new one is created.%0A   %2A/%0A  _getSubjectForElement(element) {%0A    var about = getRDFAttribute(element, "about");%0A%0A    if (about !== undefined) {%0A      let base = Services.io.newURI(element.baseURI);%0A      return this.getResource(base.resolve(about));%0A    }%0A    return this.getBlankNode(null);%0A  }%0A%0A  /%2A%2A%0A   %2A Parses the document for subjects at the top level.%0A   %2A/%0A  _parseDocument() {%0A    var domnode = this._document.documentElement.firstChild;%0A    while (domnode) {%0A      if (isElement(domnode)) {%0A        var subject = this._getSubjectForElement(domnode);%0A        subject._parseElement(domnode);%0A      }%0A      domnode = domnode.nextSibling;%0A    }%0A  }%0A%0A  /%2A%2A%0A   %2A Gets a blank node. nodeID may be null and if so a new blank node is created.%0A   %2A If a nodeID is given then the blank node with that ID is returned or created.%0A   %2A/%0A  getBlankNode(nodeID) {%0A    var rdfnode = new RDFBlankNode(this, nodeID);%0A    this._allBlankNodes.push(rdfnode);%0A    return rdfnode;%0A  }%0A%0A  /%2A%2A%0A   %2A Gets the resource for the URI. The resource is created if it has not been%0A   %2A used already.%0A   %2A/%0A  getResource(uri) {%0A    if (uri in this._resources)%0A      return this._resources[uri];%0A%0A    var resource = new RDFResource(this, uri);%0A    this._resources[uri] = resource;%0A    return resource;%0A  }%0A}%0A%0A%0A/%2A%2A%2A RDFManifestConverter.jsm %2A%2A%2A/%0A%0Aconst RDFURI_INSTALL_MANIFEST_ROOT = "urn:mozilla:install-manifest";%0A%0Afunction EM_R(aProperty) {%0A  return %60http://www.mozilla.org/2004/em-rdf%23%24{aProperty}%60;%0A}%0A%0Afunction getValue(literal) {%0A  return literal && literal.getValue();%0A}%0A%0Afunction getProperty(resource, property) {%0A  return getValue(resource.getProperty(EM_R(property)));%0A}%0A%0Aclass Manifest {%0A  constructor(ds) {%0A    this.ds = ds;%0A  }%0A%0A  static loadFromString(text) {%0A    return new this(RDFDataSource.loadFromString(text));%0A  }%0A}%0A%0Aclass InstallRDF extends Manifest {%0A  _readProps(source, obj, props) {%0A    for (let prop of props) {%0A      let val = getProperty(source, prop);%0A      if (val != null) {%0A        obj[prop] = val;%0A      }%0A    }%0A  }%0A%0A  _readArrayProp(source, obj, prop, target, decode = getValue) {%0A    let result = Array.from(source.getObjects(EM_R(prop)),%0A                            target => decode(target));%0A    if (result.length) {%0A      obj[target] = result;%0A    }%0A  }%0A%0A  _readArrayProps(source, obj, props, decode = getValue) {%0A    for (let [prop, target] of Object.entries(props)) {%0A      this._readArrayProp(source, obj, prop, target, decode);%0A    }%0A  }%0A%0A  _readLocaleStrings(source, obj) {%0A    this._readProps(source, obj, ["name", "description", "creator", "homepageURL"]);%0A    this._readArrayProps(source, obj, {%0A      locale: "locales",%0A      developer: "developers",%0A      translator: "translators",%0A      contributor: "contributors",%0A    });%0A  }%0A%0A  decode() {%0A    let root = this.ds.getResource(RDFURI_INSTALL_MANIFEST_ROOT);%0A    let result = {};%0A%0A    let props = ["id", "version", "type", "updateURL", "optionsURL",%0A                 "optionsType", "aboutURL", "iconURL",%0A                 "bootstrap", "unpack", "strictCompatibility"];%0A    this._readProps(root, result, props);%0A%0A    let decodeTargetApplication = source => {%0A      let app = {};%0A      this._readProps(source, app, ["id", "minVersion", "maxVersion"]);%0A      return app;%0A    };%0A%0A    let decodeLocale = source => {%0A      let localized = {};%0A      this._readLocaleStrings(source, localized);%0A      return localized;%0A    };%0A%0A    this._readLocaleStrings(root, result);%0A%0A    this._readArrayProps(root, result, {"targetPlatform": "targetPlatforms"});%0A    this._readArrayProps(root, result, {"targetApplication": "targetApplications"},%0A                         decodeTargetApplication);%0A    this._readArrayProps(root, result, {"localized": "localized"},%0A                         decodeLocale);%0A    this._readArrayProps(root, result, {"dependency": "dependencies"},%0A                         source => getProperty(source, "id"));%0A%0A    return result;%0A  }%0A}%0A%0A%0A/%2A%2A%2A BootstrapLoader.jsm %2A%2A%2A/%0A%0Avar {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");%0Avar {XPCOMUtils} = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");%0A%0AXPCOMUtils.defineLazyModuleGetters(this, {%0A  ConsoleAPI: "resource://gre/modules/Console.jsm",%0A  Blocklist: "resource://gre/modules/Blocklist.jsm",%0A  XPIProvider: "resource://gre/modules/addons/XPIProvider.jsm"%0A});%0A%0Avar OPTIONS_TYPE_DIALOG = 1;%0A%0AServices.obs.addObserver(doc => {%0A  if (doc.location.protocol + doc.location.pathname === 'about:addons' ||%0A      doc.location.protocol + doc.location.pathname === 'chrome:/content/extensions/aboutaddons.html') {%0A    const win = doc.defaultView;%0A    let handleEvent_orig = win.customElements.get('addon-card').prototype.handleEvent;%0A    win.customElements.get('addon-card').prototype.handleEvent = function (e) {%0A      if (e.type === 'click' &&%0A          e.target.getAttribute('action') === 'preferences' &&%0A          this.addon.optionsType == OPTIONS_TYPE_DIALOG) {%0A        var windows = Services.wm.getEnumerator(null);%0A        while (windows.hasMoreElements()) {%0A          var win2 = windows.getNext();%0A          if (win2.closed) {%0A            continue;%0A          }%0A          if (win2.document.documentURI == this.addon.optionsURL) {%0A            win2.focus();%0A            return;%0A          }%0A        }%0A        var features = 'chrome,titlebar,toolbar,centerscreen';%0A        var instantApply = Services.prefs.getBoolPref('browser.preferences.instantApply');%0A        features += instantApply ? ',dialog=no' : '';%0A        win.docShell.rootTreeItem.domWindow.openDialog(this.addon.optionsURL, this.addon.id, features); %0A      } else {%0A        handleEvent_orig.apply(this, arguments);%0A      }%0A    }%0A    let update_orig = win.customElements.get('addon-options').prototype.update;%0A    win.customElements.get('addon-options').prototype.update = function (card, addon) {%0A      update_orig.apply(this, arguments);%0A      if (addon.optionsType == OPTIONS_TYPE_DIALOG)%0A        this.querySelector('panel-item[data-l10n-id="preferences-addon-button"]').hidden = false;%0A    }%0A  }%0A}, 'chrome-document-loaded');%0A%0Aconst {AddonManager} = ChromeUtils.import("resource://gre/modules/AddonManager.jsm");%0Aconst {XPIDatabase, AddonInternal} = ChromeUtils.import("resource://gre/modules/addons/XPIDatabase.jsm");%0A%0ACu.import("resource://gre/modules/addons/XPIDatabase.jsm", {}).defineAddonWrapperProperty("optionsType", function optionsType() {%0A  if (!this.isActive) {%0A    return null;%0A  }%0A%0A  let addon = this.__AddonInternal__;%0A  let hasOptionsURL = !!this.optionsURL;%0A%0A  if (addon.optionsType) {%0A    switch (parseInt(addon.optionsType, 10)) {%0A      case OPTIONS_TYPE_DIALOG:%0A      case AddonManager.OPTIONS_TYPE_TAB:%0A      case AddonManager.OPTIONS_TYPE_INLINE_BROWSER:%0A        return hasOptionsURL ? addon.optionsType : null;%0A    }%0A    return null;%0A  }%0A%0A  return null;%0A});%0A%0AXPIDatabase.isDisabledLegacy = () => false;%0A%0AXPCOMUtils.defineLazyGetter(this, 'BOOTSTRAP_REASONS', () => XPIProvider.BOOTSTRAP_REASONS);%0A%0Aconst {Log} = ChromeUtils.import('resource://gre/modules/Log.jsm');%0Avar logger = Log.repository.getLogger('addons.bootstrap');%0A%0A/%2A%2A%0A %2A Valid IDs fit this pattern.%0A %2A/%0Avar gIDTest = /^(\{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\}|[a-z0-9-\._]%2A\@[a-z0-9-\._]+)$/i;%0A%0A// Properties that exist in the install manifest%0Aconst PROP_METADATA      = ['id', 'version', 'type', 'internalName', 'updateURL',%0A                            'optionsURL', 'optionsType', 'aboutURL', 'iconURL'];%0Aconst PROP_LOCALE_SINGLE = ['name', 'description', 'creator', 'homepageURL'];%0Aconst PROP_LOCALE_MULTI  = ['developers', 'translators', 'contributors'];%0A%0A// Map new string type identifiers to old style nsIUpdateItem types.%0A// Retired values:%0A// 32 = multipackage xpi file%0A// 8 = locale%0A// 256 = apiextension%0A// 128 = experiment%0A// theme = 4%0Aconst TYPES = {%0A  extension: 2,%0A  dictionary: 64,%0A};%0A%0Aconst COMPATIBLE_BY_DEFAULT_TYPES = {%0A  extension: true,%0A  dictionary: true,%0A};%0A%0Aconst hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);%0A%0Afunction isXPI(filename) {%0A  let ext = filename.slice(-4).toLowerCase();%0A  return ext === '.xpi' || ext === '.zip';%0A}%0A%0A/%2A%2A%0A %2A Gets an nsIURI for a file within another file, either a directory or an XPI%0A %2A file. If aFile is a directory then this will return a file: URI, if it is an%0A %2A XPI file then it will return a jar: URI.%0A %2A%0A %2A @param {nsIFile} aFile%0A %2A        The file containing the resources, must be either a directory or an%0A %2A        XPI file%0A %2A @param {string} aPath%0A %2A        The path to find the resource at, '/' separated. If aPath is empty%0A %2A        then the uri to the root of the contained files will be returned%0A %2A @returns {nsIURI}%0A %2A        An nsIURI pointing at the resource%0A %2A/%0Afunction getURIForResourceInFile(aFile, aPath) {%0A  if (!isXPI(aFile.leafName)) {%0A    let resource = aFile.clone();%0A    if (aPath)%0A      aPath.split('/').forEach(part => resource.append(part));%0A%0A    return Services.io.newFileURI(resource);%0A  }%0A%0A  return buildJarURI(aFile, aPath);%0A}%0A%0A/%2A%2A%0A %2A Creates a jar: URI for a file inside a ZIP file.%0A %2A%0A %2A @param {nsIFile} aJarfile%0A %2A        The ZIP file as an nsIFile%0A %2A @param {string} aPath%0A %2A        The path inside the ZIP file%0A %2A @returns {nsIURI}%0A %2A        An nsIURI for the file%0A %2A/%0Afunction buildJarURI(aJarfile, aPath) {%0A  let uri = Services.io.newFileURI(aJarfile);%0A  uri = 'jar:' + uri.spec + '!/' + aPath;%0A  return Services.io.newURI(uri);%0A}%0A%0Avar BootstrapLoader = {%0A  name: 'bootstrap',%0A  manifestFile: 'install.rdf',%0A  async loadManifest(pkg) {%0A    /%2A%2A%0A     %2A Reads locale properties from either the main install manifest root or%0A     %2A an em:localized section in the install manifest.%0A     %2A%0A     %2A @param {Object} aSource%0A     %2A        The resource to read the properties from.%0A     %2A @param {boolean} isDefault%0A     %2A        True if the locale is to be read from the main install manifest%0A     %2A        root%0A     %2A @param {string[]} aSeenLocales%0A     %2A        An array of locale names already seen for this install manifest.%0A     %2A        Any locale names seen as a part of this function will be added to%0A     %2A        this array%0A     %2A @returns {Object}%0A     %2A        an object containing the locale properties%0A     %2A/%0A    function readLocale(aSource, isDefault, aSeenLocales) {%0A      let locale = {};%0A      if (!isDefault) {%0A        locale.locales = [];%0A        for (let localeName of aSource.locales || []) {%0A          if (!localeName) {%0A            logger.warn('Ignoring empty locale in localized properties');%0A            continue;%0A          }%0A          if (aSeenLocales.includes(localeName)) {%0A            logger.warn('Ignoring duplicate locale in localized properties');%0A            continue;%0A          }%0A          aSeenLocales.push(localeName);%0A          locale.locales.push(localeName);%0A        }%0A%0A        if (locale.locales.length == 0) {%0A          logger.warn('Ignoring localized properties with no listed locales');%0A          return null;%0A        }%0A      }%0A%0A      for (let prop of [...PROP_LOCALE_SINGLE, ...PROP_LOCALE_MULTI]) {%0A        if (hasOwnProperty(aSource, prop)) {%0A          locale[prop] = aSource[prop];%0A        }%0A      }%0A%0A      return locale;%0A    }%0A%0A    let manifestData = await pkg.readString('install.rdf');%0A    let manifest = InstallRDF.loadFromString(manifestData).decode();%0A%0A    let addon = new AddonInternal();%0A    for (let prop of PROP_METADATA) {%0A      if (hasOwnProperty(manifest, prop)) {%0A        addon[prop] = manifest[prop];%0A      }%0A    }%0A%0A    if (!addon.type) {%0A      addon.type = 'extension';%0A    } else {%0A      let type = addon.type;%0A      addon.type = null;%0A      for (let name in TYPES) {%0A        if (TYPES[name] == type) {%0A          addon.type = name;%0A          break;%0A        }%0A      }%0A    }%0A%0A    if (!(addon.type in TYPES))%0A      throw new Error('Install manifest specifies unknown type: ' + addon.type);%0A%0A    if (!addon.id)%0A      throw new Error('No ID in install manifest');%0A    if (!gIDTest.test(addon.id))%0A      throw new Error('Illegal add-on ID ' + addon.id);%0A    if (!addon.version)%0A      throw new Error('No version in install manifest');%0A%0A    addon.strictCompatibility = (!(addon.type in COMPATIBLE_BY_DEFAULT_TYPES) ||%0A                                 manifest.strictCompatibility == 'true');%0A%0A    // Only read these properties for extensions.%0A    if (addon.type == 'extension') {%0A      if (manifest.bootstrap != 'true') {%0A        throw new Error('Non-restartless extensions no longer supported');%0A      }%0A%0A      if (addon.optionsType &&%0A          addon.optionsType != OPTIONS_TYPE_DIALOG &&%0A          addon.optionsType != AddonManager.OPTIONS_TYPE_INLINE_BROWSER &&%0A          addon.optionsType != AddonManager.OPTIONS_TYPE_TAB) {%0A            throw new Error('Install manifest specifies unknown optionsType: ' + addon.optionsType);%0A      }%0A%0A      if (addon.optionsType)%0A        addon.optionsType = parseInt(addon.optionsType);%0A    }%0A%0A    addon.defaultLocale = readLocale(manifest, true);%0A%0A    let seenLocales = [];%0A    addon.locales = [];%0A    for (let localeData of manifest.localized || []) {%0A      let locale = readLocale(localeData, false, seenLocales);%0A      if (locale)%0A        addon.locales.push(locale);%0A    }%0A%0A    let dependencies = new Set(manifest.dependencies);%0A    addon.dependencies = Object.freeze(Array.from(dependencies));%0A%0A    let seenApplications = [];%0A    addon.targetApplications = [];%0A    for (let targetApp of manifest.targetApplications || []) {%0A      if (!targetApp.id || !targetApp.minVersion ||%0A          !targetApp.maxVersion) {%0A            logger.warn('Ignoring invalid targetApplication entry in install manifest');%0A            continue;%0A      }%0A      if (seenApplications.includes(targetApp.id)) {%0A        logger.warn('Ignoring duplicate targetApplication entry for ' + targetApp.id +%0A                    ' in install manifest');%0A        continue;%0A      }%0A      seenApplications.push(targetApp.id);%0A      addon.targetApplications.push(targetApp);%0A    }%0A%0A    // Note that we don't need to check for duplicate targetPlatform entries since%0A    // the RDF service coalesces them for us.%0A    addon.targetPlatforms = [];%0A    for (let targetPlatform of manifest.targetPlatforms || []) {%0A      let platform = {%0A        os: null,%0A        abi: null,%0A      };%0A%0A      let pos = targetPlatform.indexOf('_');%0A      if (pos != -1) {%0A        platform.os = targetPlatform.substring(0, pos);%0A        platform.abi = targetPlatform.substring(pos + 1);%0A      } else {%0A        platform.os = targetPlatform;%0A      }%0A%0A      addon.targetPlatforms.push(platform);%0A    }%0A%0A    addon.userDisabled = false;%0A    addon.softDisabled = addon.blocklistState == Blocklist.STATE_SOFTBLOCKED;%0A    addon.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DEFAULT;%0A%0A    addon.userPermissions = null;%0A%0A    addon.icons = {};%0A    if (await pkg.hasResource('icon.png')) {%0A      addon.icons[32] = 'icon.png';%0A      addon.icons[48] = 'icon.png';%0A    }%0A%0A    if (await pkg.hasResource('icon64.png')) {%0A      addon.icons[64] = 'icon64.png';%0A    }%0A%0A    return addon;%0A  },%0A%0A  loadScope(addon) {%0A    let file = addon.file || addon._sourceBundle;%0A    let uri = getURIForResourceInFile(file, 'bootstrap.js').spec;%0A    let principal = Services.scriptSecurityManager.getSystemPrincipal();%0A%0A    let sandbox = new Cu.Sandbox(principal, {%0A      sandboxName: uri,%0A      addonId: addon.id,%0A      wantGlobalProperties: ['ChromeUtils'],%0A      metadata: { addonID: addon.id, URI: uri },%0A    });%0A%0A    try {%0A      Object.assign(sandbox, BOOTSTRAP_REASONS);%0A%0A      XPCOMUtils.defineLazyGetter(sandbox, 'console', () =>%0A        new ConsoleAPI({ consoleID: %60addon/%24{addon.id}%60 }));%0A%0A      Services.scriptloader.loadSubScript(uri, sandbox);%0A    } catch (e) {%0A      logger.warn(%60Error loading bootstrap.js for %24{addon.id}%60, e);%0A    }%0A%0A    function findMethod(name) {%0A      if (sandbox[name]) {%0A        return sandbox[name];%0A      }%0A%0A      try {%0A        let method = Cu.evalInSandbox(name, sandbox);%0A        return method;%0A      } catch (err) { }%0A%0A      return () => {%0A        logger.warn(%60Add-on %24{addon.id} is missing bootstrap method %24{name}%60);%0A      };%0A    }%0A%0A    let install = findMethod('install');%0A    let uninstall = findMethod('uninstall');%0A    let startup = findMethod('startup');%0A    let shutdown = findMethod('shutdown');%0A%0A    return {%0A      install(...args) {%0A        install(...args);%0A        // Forget any cached files we might've had from this extension.%0A        Services.obs.notifyObservers(null, 'startupcache-invalidate');%0A      },%0A%0A      uninstall(...args) {%0A        uninstall(...args);%0A        // Forget any cached files we might've had from this extension.%0A        Services.obs.notifyObservers(null, 'startupcache-invalidate');%0A      },%0A%0A      startup(...args) {%0A        if (addon.type == 'extension') {%0A          logger.debug(%60Registering manifest for %24{file.path}\n%60);%0A          Components.manager.addBootstrappedManifestLocation(file);%0A        }%0A        return startup(...args);%0A      },%0A%0A      shutdown(data, reason) {%0A        try {%0A          return shutdown(data, reason);%0A        } catch (err) {%0A          throw err;%0A        } finally {%0A          if (reason != BOOTSTRAP_REASONS.APP_SHUTDOWN) {%0A            logger.debug(%60Removing manifest for %24{file.path}\n%60);%0A            Components.manager.removeBootstrappedManifestLocation(file);%0A          }%0A        }%0A      },%0A    };%0A  },%0A};%0A%0AAddonManager.addExternalExtensionLoader(BootstrapLoader);%0A%0Aif (AddonManager.isReady) {%0A  AddonManager.getAllAddons().then(addons => {%0A    addons.forEach(addon => {%0A      if (addon.type == 'extension' && !addon.isWebExtension && !addon.userDisabled) {%0A        addon.reload();%0A      };%0A    });%0A  });%0A}%0A%0AObject.defineProperty(%0A  AddonInternal.prototype,%0A  "providesUpdatesSecurely",%0A  {enumerable: true, value: true}%0A);%0A
	`.trim()));
	Cc["@mozilla.org/moz/jssubscript-loader;1"].getService(Ci.mozIJSSubScriptLoader)
		.loadSubScript("resource://" + subst, new Cu.Sandbox(Cu.getObjectPrincipal(this), {wantGlobalProperties: ["ChromeUtils", "DOMParser", "Element", "fetch"]}));
})(Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService));} catch(ex) {Cu.reportError(ex);}

// https://forum.mozilla-russia.org/viewtopic.php?pid=780458#p780458
//(async xp => {
//	var imprt, ids = [
//		"custombuttons@xsms.org",
//	];
//	if (Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime).inSafeMode) return;
//
//	if (Cr.NS_ERROR_FILE_TARGET_DOES_NOT_EXIST)
//		var {XPIInternal} = (imprt = url => Cu.import(url, {}))(xp);

//	else { // Fx 101+
//		var g = Cu.getGlobalForObject(Cu), te = new g.TextEncoder();
//		var imp = g.ChromeUtils.import, {XPIInternal} = imp(xp);
//		var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
//		var rph = ios.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler);
//		imprt = (url, id) => {
//			var subst = te.encode(id).join("");
//			rph.setSubstitution(subst, ios.newURI(url));
//			return imp(`resource://${subst}/`);
//		}
//	}
//	var load = async (file, id) => {
//		var rootURI = XPIInternal.getURIForResourceInFile(file, "");
//		imprt(rootURI.resolve("startup.jsm"), id).start(rootURI);
//	}
//	var proto = XPIInternal.BootstrapScope.prototype;
//	var func = proto._beforeCallBootstrapMethod;

//	proto._beforeCallBootstrapMethod = () => {
//		proto._beforeCallBootstrapMethod = func;
//		for(var {id, loader, file} of XPIInternal.XPIStates.enabledAddons())
//			ids.includes(id) && !loader && load(file, id);
//	}
//})("resource://gre/modules/addons/XPIProvider.jsm");//


Из-за чего? Как исправить?

Отредактировано vitalii201 (16-05-2023 10:00:57)

Отсутствует

 

№1679816-05-2023 09:08:30

Farby
Участник
 
Группа: Members
Зарегистрирован: 21-11-2012
Сообщений: 306
UA: Google 2.1

Re: Custom Buttons

vitalii201 пишет

Из-за чего? Как исправить?

начать с этого


Жизнь иногда такое выкидывает, что хочется подобрать...

Отсутствует

 

№1679916-05-2023 10:02:16

vitalii201
Участник
 
Группа: Members
Зарегистрирован: 24-03-2011
Сообщений: 679
UA: Firefox 113.0

Re: Custom Buttons

Farby, забыл указать. Добавил ↑.

Отсутствует

 

№1680016-05-2023 12:26:03

Farby
Участник
 
Группа: Members
Зарегистрирован: 21-11-2012
Сообщений: 306
UA: Google 2.1

Re: Custom Buttons

vitalii201
Странно, но мне удалось такое воспроизвести на версии custom_buttons-0.0.7.0.0.30-fx-bootstrap, то есть сжатые поля для редактирования. Попробуте почистит папку startupCache в ручную, и стиль для черного режима в userChrome.css, если надо

userChrome.css

Выделить код

Код:

@import url("custombuttons.css"); /**/


custombuttons.css

Выделить код

Код:

/*
 * Edit this file and copy it as userChrome.css into your
 * profile-directory/chrome/
 * https://forum.mozilla-russia.org/viewtopic.php?pid=799907#p799907
 */
 
 @-moz-document url-prefix(chrome://custombuttons/content/editor.xul) {
	@media (prefers-color-scheme: dark) {
		* {
			color: #eee !important;
		}
		tab, tabpanels,  #accelkey,
		[anonid=qstextbox], image.checkbox-check:not([checked]) {
			border: 1px solid gray !important;
		}
		tab, tabpanels, caption, #accelkey, [anonid=qstextbox],
		menupopup, menuitem, menuseparator, toolbox, textbox[multiline] {
			appearance: none !important;
		}
		caption, input, textarea, menupopup,
		#accelkey, [anonid=qstextbox], menuitem:not([_moz-menuactive]),
		image.checkbox-check:not([checked]), scrollbox, textbox[multiline] {
			background-color: #23222b !important;
		}

		tab {
			height: 24px !important;
			border-bottom: none !important;
			margin-inline-end: -1px !important;
		}
		tab:hover, menuitem[_moz-menuactive], checkbox:not([checked]):hover > .checkbox-check {
			background-color: #52525e !important;
		}
		tab[selected] {
			background-color: navy !important;
		}
		tab[selected]:hover {
			background-color: mediumblue !important;
		}

		fieldset {
			border-color: gray !important;
		}
		.cbeditor-textbox {
			padding: 2px 3px !important;
		}
		label[control]:hover {
			color: #ffa !important;
		}

		#textbox-contextmenu > menuitem {
			min-height: 22px !important;
		}
		#textbox-contextmenu > menuseparator {
			padding: 0 !important;
			height: 1px !important;
			border: none !important;
			margin-block: 3px !important;
			background-color: gray !important;
		}
	}
}


Жизнь иногда такое выкидывает, что хочется подобрать...

Отсутствует

 

Board footer

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