Расширение Mozilla (Firefox, Thunderbird): Как получить идентификатор расширения (из install.rdf)? - PullRequest
5 голосов
/ 23 марта 2011

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

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

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

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

var extId = "myspecialthunderbirdextid@mydomain.com";
var filename = "install.rdf";
var file = extManager.getInstallLocation(extId).getItemFile(extId, filename);
var fullPathToFile = file.path;

Ответы [ 5 ]

3 голосов
/ 01 апреля 2011

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

Что IS плохая практика - использовать install.rdf, который существует с единственной целью ... ну, для установки. Как только расширение разработано, состояние файла install.rdf не имеет значения и вполне может быть несовместимым.

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

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

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

3 голосов
/ 30 марта 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 сегодня вечером, и я с нетерпением жду возможности участвовать еще ... Увидимся, ребята!

1 голос
/ 03 марта 2017

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

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

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

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

0 голосов
/ 01 апреля 2011

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

[Менеджер расширений] Расширенный очень прост в использовании. После установки просто Откройте диспетчер расширений, перейдя в Инструменты и кликающие Расширения. Вы теперь будет видеть рядом с каждым расширением идентификатор этого расширения.

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

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

0 голосов
/ 23 марта 2011

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

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

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);
});

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

...