Расширение Mozilla (Firefox, Thunderbird): как получить идентификатор расширения (из install.rdf)?

Если вы разрабатываете расширение для одного из приложений Mozilla (например, Firefox, Thunderbird и т. д.), вы определяете идентификатор расширения в файле install.rdf.

Если по какой-то причине вам нужно знать идентификатор расширения, например. чтобы получить расширение каталога в локальной файловой системе (1) или если вы хотите отправить его в веб-службу (статистика использования) и т. д. было бы неплохо получить его из install.rdf, чтобы он был жестко запрограммирован в вашем коде javascript .

Но как получить доступ к идентификатору расширения из моего расширения?

1) пример кода:

var extId = "[email protected]";
var filename = "install.rdf";
var file = extManager.getInstallLocation(extId).getItemFile(extId, filename);
var fullPathToFile = file.path;

person DanielaWaranie    schedule 23.03.2011    source источник
comment
Я думаю, что я прав, но я добавлю награду, если на это не будет ответа, просто черт возьми.   -  person Wayne    schedule 23.03.2011
comment
Возможный дубликат Как получить идентификатор моего расширения из JavaScript?   -  person Philipp Claßen    schedule 26.07.2018


Ответы (5)


Я совершенно уверен, что «жестко закодированный идентификатор» никогда не должен меняться на протяжении всего срока службы расширения. В этом вся цель идентификатора: он уникален для этого расширения навсегда. Просто сохраните его как константу и используйте эту константу в своих библиотеках. В этом нет ничего плохого.

Что ЯВЛЯЕТСЯ плохой практикой, так это использование файла install.rdf, который существует с единственной целью... ну, установки. После того как расширение разработано, состояние файла install.rdf не имеет значения и вполне может быть несовместимым.

«Манифест установки — это файл, который XUL-приложение с поддержкой Add-on Manager использует для определения информации о надстройке во время ее установки» [1]

Если провести аналогию, это похоже на доступ к памяти удаленного объекта из переполнения. Этот объект все еще существует в памяти, но он логически больше не актуален, и использование его данных — очень, очень плохая идея.

[1] https://developer.mozilla.org/en/install_manifests

person Rushyo    schedule 01.04.2011

Как и lwburk, я не думаю, что он доступен через API Mozilla, но у меня есть идея, которая работает, но это похоже на сложный хак. Основные шаги:

  1. Настройте URL-адрес пользовательского ресурса, чтобы он указывал на базовый каталог вашего расширения.
  2. Прочитайте файл и разберите его в XML
  3. Извлеките идентификатор, используя XPath.

Добавьте следующую строку в файл chrome.manifest.

resource    packagename-base-dir chrome/../

Затем мы можем захватить и проанализировать файл с помощью следующего кода:

function myId(){
    var req = new XMLHttpRequest();

    // synchronous request
    req.open('GET', "resource://packagename-base-dir/install.rdf", false); 
    req.send(null);

    if( req.status !== 0){
        throw("file not found");
    }

    var data = req.responseText;

    // this is so that we can query xpath with namespaces
    var nsResolver = function(prefix){
        var ns = {
            "rdf" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
            "em" : "http://www.mozilla.org/2004/em-rdf#"
        };
        return ns[prefix] || null;
    };

    var parser = CCIN("@mozilla.org/xmlextras/domparser;1", Ci.nsIDOMParser);
    var doc = parser.parseFromString(data, "text/xml");
    // you might have to change this xpath expression a bit to fit your setup
    var myExtId = doc.evaluate("//em:targetApplication//em:id", doc, nsResolver, 
                            Ci.nsIDOMXPathResult.FIRST_ORDERED_NODE_TYPE, null);

    return myExtId.singleNodeValue.textContent;
}

Я решил использовать XMLHttpRequest (в отличие от простого чтения из файла) для извлечения содержимого, поскольку в Firefox 4 расширения не обязательно распаковываются. Однако XMLHttpRequest по-прежнему будет работать, если расширение останется упакованным (не проверял, но читал об этом).

Обратите внимание, что URL-адреса ресурсов являются общими для всех установленных расширений, поэтому, если packagename-base-dir не уникален, у вас возникнут проблемы. Вы можете использовать программное добавление псевдонимов для решения этой проблемы.

Этот вопрос побудил меня присоединиться к StackOverflow сегодня вечером, и я с нетерпением жду возможности поучаствовать еще... Увидимся, ребята, здесь!

person skabbes    schedule 30.03.2011

Поскольку Firefox теперь использует только Chrome WebExtension API, вы можете использовать @serg answer в Как получить идентификатор моего расширения из JavaScript?:

Вы можете получить его вот так (дополнительных разрешений не требуется) двумя разными способами:

  1. Использование API среды выполнения: var myid = chrome.runtime.id;

  2. Использование i18n API: var myid = chrome.i18n.getMessage("@@extension_id");

person serv-inc    schedule 02.03.2017

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

  • Этот вопрос, который показывает, что интерфейс nsIExtensionManager ожидает, что вы получите информацию о расширении по идентификатору
  • Полное nsIExtensionManager описание интерфейса, в котором не показано ни одного помогающего метода.

Интерфейс позволяет вам получить полный список установленных расширений, поэтому можно получить информацию о вашем расширении, используя что-то другое, кроме идентификатора. См. этот код, например:

var em = Cc['@mozilla.org/extensions/manager;1']
  .getService(Ci.nsIExtensionManager);
const nsIUpdateItem = Ci.nsIUpdateItem;

var extension_type = nsIUpdateItem.TYPE_EXTENSION;
items = em.getItemList(extension_type, {});
items.forEach(function(item, index, array) {
    alert(item.name + " / " + item.id + " version: " + item.version);
});

Но вы по-прежнему будете полагаться на жестко запрограммированные свойства, из которых только ID гарантированно будет уникальным.

person Wayne    schedule 23.03.2011

Взгляните на это дополнение, возможно, его автор сможет вам помочь, или вы сами разберетесь:

[Extension Manager] Extended очень прост в использовании. После установки просто откройте диспетчер расширений, перейдя в «Инструменты» и нажав «Расширения». Теперь вы увидите рядом с каждым расширением идентификатор этого расширения.

(Пока не совместим с Firefox 4.0)

https://addons.mozilla.org/firefox/addon/2195

person Francisco Alvarado    schedule 01.04.2011