5

Jeśli tworzysz rozszerzenie dla jednej z aplikacji mozilla (np. Firefox, Thunderbird itp.), Zdefiniuj identyfikator rozszerzenia w pliku install.rdf.Rozszerzenie Mozilla (Firefox, Thunderbird): Jak uzyskać identyfikator rozszerzenia (z install.rdf)?

Jeśli z jakiegoś powodu musisz znać identyfikator rozszerzenia, np. aby pobrać katalog rozszerzeń w lokalnym systemie plików (1) lub jeśli chcesz wysłać go do usługi sieciowej (statystyki użycia) itp. byłoby miło pobrać ją z pliku install.rdf na korzyść, aby została zakodowana w kodzie javascript .

Ale jak uzyskać dostęp do identyfikatora rozszerzenia z mojego numeru wewnętrznego?

1) przykładowy kod:

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

myślę, że mam rację, ale dodam bounty jeśli to nie zostanie odpowiedział, tylko dla piekła tego. –

Odpowiedz

3

Jestem całkiem pewien, że „zakodowane ID” nigdy nie powinno się zmieniać przez cały okres przedłużenia. Taki jest cel identyfikatora: na stałe jest to unikalne dla tego rozszerzenia. Po prostu przechowuj go jako stałą i używaj tej stałej w swoich bibliotekach. Nie ma w tym nic złego.

Zła praktyka polega na użyciu pliku install.rdf, który istnieje wyłącznie w celu ... no, instalacji. Po opracowaniu rozszerzenia stan pliku install.rdf jest nieistotny i może być niespójny.

"An Install Oczywisty jest plik dodatek aplikacji XUL Manager włączona używa do określenia informacji o add-on, gdy jest on zainstalowany" [1]

Aby nadać jej analogii, to jak uzyskiwanie dostępu do pamięci usuniętego obiektu z przepełnienia. Ten obiekt nadal istnieje w pamięci, ale nie jest logicznie dłuższy, a wykorzystanie jego danych jest naprawdę złym pomysłem.

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

0

nie mogę udowodnić negatywny, ale robiłem rozeznanie i nie sądzę, jest to możliwe. Dowody:

Interfejs robi pozwala odzyskać pełną listę zainstalowanych rozszerzeń, dzięki czemu można uzyskać informacje o swoim rozszerzeniu za pomocą czegoś innego niż identyfikator. Zobacz this code, na przykład:

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

Ale chcesz być nadal opierając się na właściwościach zakodowanych, którego identyfikator jest jedyną gwarancją wyjątkowy.

2

Podobnie jak lwburk, nie sądzę, że jest dostępny za pośrednictwem interfejsów API Mozilli, ale mam pomysł, który działa, ale wygląda na skomplikowany hack. Podstawowe kroki są:

  1. Ustaw niestandardowy URL zasobów, aby wskazywał katalogu głównym swojego rozszerzenia
  2. Czytaj plik i przetwarza go na XML
  3. Pull id przy użyciu XPath

Dodaj następujący wiersz do pliku chrome.manifest

resource packagename-base-dir chrome/../ 

Następnie możemy pobrać i p ass plik z następującego kodu:

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

wybrałem użyć XMLHttpRequest (w przeciwieństwie do po prostu czytanie z pliku), aby pobrać zawartość od Firefox 4, rozszerzenia niekoniecznie są rozpakowane. Jednak XMLHttpRequest będzie nadal działał, jeśli rozszerzenie pozostaje spakowane (nie testowałem tego, ale przeczytałem o tym).

Należy pamiętać, że adresy URL zasobów są wspólne dla wszystkich zainstalowanych rozszerzeń, więc jeśli packagename-base-dir nie jest unikalny, wystąpią problemy. Być może uda Ci się wykorzystać Programmatically adding aliases, aby rozwiązać ten problem.

To pytanie skłoniło mnie do przyłączenia się do StackOverflow dziś w nocy, i czekam z niecierpliwością na kolejne ... Zobaczymy się z wami!

0

Spójrz na ten dodatek, może jego autor mógł pomóc, albo samemu można dowiedzieć się:

[Extension Manager] Rozszerzony jest bardzo prosty w użyciu. Po zainstalowaniu wystarczy otworzyć menedżera rozszerzeń, przechodząc do Narzędzia i klikając rozszerzenia. Ty zobaczysz teraz obok każdego rozszerzenia identyfikator tego rozszerzenia.

(nie kompatybilny jeszcze z Firefox 4.0)

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

1

jak Firefox teraz tylko używa Chrome WebExtension API można użyć @serg's answer na How to get my extension's id from JavaScript?:

Można ją uzyskać w ten sposób (bez dodatkowych uprawnień wymaganych) w dwóch inna sposoby:

  1. pomocą funkcji API środowiska wykonawczego: var myid = chrome.runtime.id;

  2. Korzystanie i18n API: var myid = chrome.i18n.getMessage("@@extension_id");

+1

To powinno być zaakceptowane odpowiedź teraz. –