Estensioni Firefox

Da Skypedia.

Le estensioni sono piccoli programmi (o plug-in) che aggiungono nuove funzionalità a Mozilla Firefox. Possono aggiungere un semplice pulsante alle barre degli strumenti ma anche funzionalità completamente nuove al browser. Il grande vantaggio delle estensioni è che essendo al massimo di qualche Kbyte permettono a Mozilla Firefox di mantenere la sua leggerezza nonostante se ne possano installare di infinite. Firefox comprende una Gestione delle Estensioni(XPInstall) per semplificare le procedure di installazione, rimozione ed aggiornamento automatico delle estensioni, inoltre avvisa l'utente nel caso in cui siano disponibili degli aggiornamenti per le estensioni installate. In questo modo, non si è più obbligati a verificare manualmente la presenza di versioni aggiornate delle proprie estensioni.


Creazione dell'estensione

Le estensioni firefox sono file con estenzione .xpi. I file con estension xpi sono i tipici pacchetti con cui sono distribuite le estensioni Firefox/Mozilla, non è altro però che un file compresso in formato ZIP e rinominato, insomma lo stesso che succede in altri ambiti come ad esempio in Java con i file jar .


Per creare l'estensione, ho implementato uno script bash che effettua le operazioni per creare appunto il pacchetto xpi per qualsiasi estensione. Lo script è il seguente:

#!/bin/bash
echo "Creo archivio jar..."
cd chrome
zip -r $1 ./*
cd ..
echo "Creo package xpi..."
zip -r $2 install.rdf chrome/*
echo "Rimuovo file jar..."
rm chrome/$1

Per richiamare lo script basta ecitare il seguente comando:

$ffext firetorrent.jar firetorrent.xpi

L'Output per un estensione chiamata FireTorrent sarà:

Creo archivio jar...
  adding: content/ (stored 0%)
  adding: content/firetorrent/ (stored 0%)
  adding: content/firetorrent/contents.rdf (deflated 64%)
  adding: content/firetorrent/firetorrentOverlay.xul (deflated 60%)
  [...]
Creo package xpi...
updating: install.rdf (deflated 55%)
updating: chrome/content/ (stored 0%)
updating: chrome/content/firetorrent/ (stored 0%)
updating: chrome/content/firetorrent/contents.rdf (deflated 64%)
[...]
Rimuovo file jar...


Struttura di una Estensione

Un'estensione è un file in formato ZIP con estensione xpi per essere riconosciuto dal gestore delle estensioni XPInstall.

Es. NomeEstensione.xpi

Ecco una visione generale della struttura minima standard dell'estensione:

  • /chrome
    • /content
      • /NomeEstensione
        • contents.rdf
        • File js e xul
    • /skin
      • /classic
        • /NomeEstensione
          • contents.rdf
          • Immagini e fogli di stile
        • /............
  • install.rdf



  • Varie da aggiungere(da fare)



La directory /chrome

Questa directory ha lo stesso nome della directory nella quale vengono installate tutte le estensioni di Mozilla.Essa contiene i file l'estensione vera e propria compressa in un file .jar. La parola 'chrome' si riferisce agli elementi dell'interfaccia utente in un'applicazione. Per esempio, in un browser, la parte chrome della finestra sarebbero le toolbars, il menu e la barra di stato. L'area del contenuto del browser visualizza un documento diverso.



Struttura della directory /chrome

  • /chrome
    • /content


  • Varie ed eventuali(da fare)


La directory /content

  • /content
    • /NomeEstensione
      • contents.rdf
      • File xul e js

All'interno della directory NomeEstensione si trovano i file .xul, .js e un file contents.rdf. Questa directory contiene le dichiarazioni delle finestre e degli elementi dell'interfaccia utente contenute in esse, sono memorizzati in file XUL. Un package content può avere diversi file XUL, la finestra principale Ha un nome che viene specificato nel fil contents.rdf. Nel caso il del package “NomeEstensione” avrà un file chiamato NomeEstensione.xul. Gli script sono messi in file separati js se necessario. I file possono essere divisi in sottocartelle solo se sono specificate nel file install.rdf.



Il file contents.rdf

Questo file specifica le caratteristiche della nostra estensione.Descrive il contenuto di un package. Può essere anche usato per descrivere una skin o una localizzazione posto nella directory corrispondente. Contiene i riferimenti ai contenuti della directory in cui si trova(è presente anche nella directory “/skin”), ed in particolar modo alle informazioni sull'interfaccia dell'estensione contenuta nei file XUL.



File XUL e js

Sono i file che definiscono le funzionalità principali e che descrivono l'interfaccia grafica.



La directory ./skin

Fogli di stile, immagini e vari e anke content.rdf...da fare



Il File install.rdf

E' un file XML, il dialetto si chiama RDF ed è usato per descrivere la semantica di una particolare risorsa , in questo caso è usato per descrivere come deve essere gestita l'installazione dell'estensione. Al suo interno sono presenti le informazioni sulla struttura delle directory dell'estensione, il creatore, l'ID, i linguaggi supportati etc. La configurazione mediante RDF è possibile solo a partire da Firefox 0.9, nelle precendenti versioni si doveva usare un javascript che si doveva chiamare install.js.


Il linguaggio XUL

XUL è l’acronimo di “eXtendible User interface Language”


Cos'è XUL

XUL è un linguaggio creato dalla Mozilla Foundation per scrivere in maniera veloce e semplice le interfacce grafiche dei suoi prodotti, tra cui Firefox. XUL, che si basa su XML e sullo standard W3C XML 1.0, permette la creazione di applicazioni portabili su tutti i sistemi operativi su cui gira Mozilla. Le caratteristiche principali di questo linguaggio sono: l'elevato grado di portabilità, la semplicità del linguaggio stesso e l'utilizzo di standard aperti e gratuiti:

  • XML 1.0;
  • XHTML 1.x;
  • CSS 1 e 2;
  • DOM 1 e 2;
  • Javascript 1.5.

XUL (XML User Interface Language) è un linguaggio di Mozilla basato su XML che permette di creare applicazioni multipiattaforma, ricche di funzionalità, che possono funzionare connesse a Internet oppure no. Queste applicazioni possono essere facilmente personalizzate con testi alternativi, elementi grafici, e layout, in modo che possano essere facilmente personalizzate o localizzate. Gli sviluppatori web che già conoscono l'HTML dinamico (DHTML) possono imparare XUL e iniziare a sviluppare rapidamente. Aprendo la pagina XUL Periodic Table con Firefox o un qualsiasi altro browser basato su Gecko si vedranno alcuni esempi dimostrativi di XUL.

Tecnologie Sfruttate da XUL

  • XBL (eXtensible Binding Language): è un linguaggio di markup che deriva da XML e permette di definire nuovi elementi per le interfacce basate su XUL.Gli Overlays permettono di modificare il numero degli elementi di un'interfaccia senza mettere mano al codice, ad esempio è possibile applicare alcune modifiche per il branding o includere alcune caratteristiche personalizzate;
  • XPCOM (cross-Platform Components Object Model) che permette di scrivere oggetti in C, C++ e Javascript.


Descrizione del linguaggio

Attraverso questo linguaggio è possibile creare applicazioni desktop, con il vantaggio di poter effettuare aggiunte o modifiche (come ad esempio un logo o un marchio) per ogni cliente, o definire un'interfaccia diversa (ad esempio in base alla lingua) senza dover necessariamente modificare il codice. XUL permette di fare una distinzione tra la presentazione (formata dai CSS e dalle immagini) e la logica di programmazione. Sebbene XUL non sia uno standard pubblico, esso riutilizza molte tecnologie standard preesistenti, come i CSS, Javascript, DTD e RDF, che lo rende molto semplice da imparare per persone che hanno un conoscenza di sviluppo e design di applicazioni web. La maggior parte delle applicazioni hanno bisogno di essere sviluppate utilizzando le caratteristiche di una specifica piattaforma, rendendo lo sviluppo cross-platform dispendioso in termini di tempo e risorse. Questo può non essere un problema per alcuni, ma gli utenti possono voler usare un'applicazione in altri dispositivi, come i palmari. Sono state sviluppate diverse soluzioni cross-platform in passato. Java, per esempio, ha come principale punto di forza la portabilità. XUL è un linguaggio progettato per costruire interfacce utente portabili. E' necessario utilizzare molto tempo per sviluppare un'applicazione soltanto per una piattaforma. Il tempo richiesto per compilare e fare il debug può essere lungo. Con XUL, su può implementare e modificare un'interfaccia velocemente e facilmente. XUL possiede la capacità di creare la maggior parte degli elementi trovati nelle interfacce grafiche moderne. E' abbastanza generico da poter essere applicato alle necessità di particolari dispositivi e abbastanza potente da permettere agli sviluppatori di creare interfacce complesse.

Tra gli elementi che si possono creare ci sono:

  • Controlli per l'inputo come textbox e checkbox
  • Toolbars con pulsanti o altro contenuto
  • Menù su una barra dei menu o popup
  • Tabbed dialogs
  • Alberi (trees) per informazioni gerarchiche o tabulari
  • Scorciatoie da tastiera

È possibile usare, all'interno di documenti XUL, anche altri documenti XML, come XHTML SVG e MathML, grazie all'uso dei namespace. Il contenuto visualizzato può essere creato dai contenuti di un file XUL o con dati da una datasource. In Mozilla, queste datasource includono la mailbox di un utente, i bookmarks e i risultati di ricerca. I contenuti di menu, tree e altri elementi possono essere popolati con questi dati, o con i dati forniti da un file RDF . Il contenuto di XUL può essere caricato da un file locale o da un sito remoto. Può anche essere confezionato in un installer che l'utente può scaricare e installare. Questo ultimo metodo dà all'applicazione privilegi addizionali, come la lettura di file locali e la possibilità di modificare le preferenze utente. XUL è generalmente memorizzato in file con estensione .xul. Un file xul si apre normalmente con Mozilla, usando il comando Apri File, dal menu File o scrivendo l'URL nella barra degli indirizzi. Quando viene caricato il contenuto XUL da un sito remoto, bisogna impostare il proprio web server per impostare file XUL con il tipo di contenuto 'application/vnd.mozilla.xul+xml'.



Sintassi XUL

Le linee guida per la programmazione xul sono le seguenti: Gli elementi XUL e gli attributi dovrebbero essere scritti sempre in minuscolo, visto che l'XML è case-sensitive (a differenza di HTML) I valori degli attributi in XUL devono essere compresi tra virgolette, anche se sono numeri. I file XUL sono in genere divisi in quattro file, un per l'aspetto e gli elementi, per le dichiarazioni di stile, per le entity (utilizzate per la localizzazione) e per gli script. Inoltre ci possono essere file aggiuntivi per le immagini o per dati specifici per la piattaforma. XUL è supportato in Mozilla e in browsers che sono basati sul motore Gecko, come Netscape 6 o superiore e Mozilla Firefox.


Linguaggio RDF

Il Resource Description Framework (RDF) è un framework per la descrizione della conoscenza nel web. Esso è stato specificatamente creato, secondo una recommendation del W3C, per la descrizione dei metadati relativi alle risorse. Questo framework è alla base del cosiddetto semantic web, e permette la condivisione di conoscenza sul web.


Cos'è RDF

RDF è sostanzialmente un modello formale di dati dotato di sintassi di interscambio, un sistema di schemi di tipo ed un linguaggio d’interrogazione.

L’RDF si basa su tre principi chiave:

  1. Qualunque cosa può essere identificato da un URI.
  2. The least power: utilizzare il linguaggio meno espressivo per definire qualunque cosa.
  3. Qualunque cosa può dire qualunque cosa su qualunque cosa.:)


Principi e Data Model

Qualunque cosa descritta da RDF è detta risorsa. Principalmente una risorsa è reperibile sul web, ma RDF può descrivere anche risorse che non si trovano direttamente sul web. Ogni risorsa è identificata da un URI (Universal Resource Identifier). L’URI è, quindi, un identificatore univoco di risorse e può essere un URL o un URN. Il modello di dati RDF è formato da risorse, proprietà e valori. Le proprietà sono delle relazioni che legano tra loro risorse e valori, e sono anch’esse identificate da URI. Un valore, invece, o è una risorsa o è un tipo di dato primitivo. L’unità base per rappresentare un’informazione in RDF è lo statement. Uno statement è una tripla del tipo:

Soggetto – Predicato – Oggetto

dove il soggetto è una risorsa, il predicato è una proprietà e l’oggetto è un valore. Il data model RDF permette di definire un modello semplice per descrivere le relazioni tra le risorse, in termini di proprietà identificate da un nome e relativi valori. Tuttavia, RDF data model non fornisce nessun meccanismo per dichiarare queste proprietà, né per definire le relazioni tra queste proprietà ed altre risorse. Per poter dichiarare un vocabolario è necessario definire classi e propietà ad uno Schema RDF. Rappresentazione fisica del modello Un modello RDF è quindi rappresentabile da un grafo orientato sui cui nodi ci sono risorse o tipi primitivi e i cui archi rappresentano le proprietà. Un grafo RDF è rappresentato fisicamente mediante una serializzazione.

Le principali serializzazioni adottabili per un grafo RDF sono:

  • XML: l’RDF è serializzato in un file XML
  • N-TRIPLE: si serializza il grafo come un insieme di triple soggetto - predicato - oggetto
  • N3: si serializza il grafo descrivendo, una per volta, una risorsa e tutte le sue proprietà

In particolare la serializzazione in XML può avvenire secondo due metodi, quello classico e quello abbreviato, più leggibile per l’uomo. Spesso si avrà bisogno di memorizzare RDF in un file o trasferire i dati da qualche altra parte. C'è un formato XML comune per memorizzare RDF. Questo formato è detto RDF/XML. Ci sono diverse altre maniere di memorizzare dati RDF, ma questo formato è il più comune. Un semplice file RDF/XML apparirà come quello qui sotto. Il tag RDF è il nodo radice e circonda i dati. Le triple non sono ancora nel file; le aggiungeremo tra un momento. Dichiariamo gli spazi di nomi nel tag RDF, come gli altri vocabolari XML.

<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:people="http://www.xulplanet.com/rdf/people/">
</rdf:RDF>


XPCOM

XPCOM è una delle cose principali che rendono Mozilla un ambiente di sviluppo che fornisce le seguenti caratteristiche per la programmazione multipiattaforma:

  • Gestione del componente
  • Astrazione dei file
  • Trasmissione dei messaggi tra gli oggetti
  • Gestione della memoria


Questo componente rende in pratica disponibili tutte le funzionalità di Gecko come una serie di componenti, o come librerie cross-platform riutilizzabili, accessibili da un browser web o come script da qualsiasi applicazione Mozilla. Le applicazioni che vogliono accedere alle varie librerie Mozilla XPCOM (networking, sicurezza, DOM, ecc.) usano un layer speciale di XPCOM, chiamato XPConnect, che riflette le interfacce della libreria in JavaScript (o altri linguaggi). XPConnect incolla il front end ai componenti basati su C++ di XPCOM, e può essere esteso per comprendere il supporto allo scripting per altri linguaggi: PyXPCOM già offre supporto per Python.PerlConnect fornisce supporto per il Perl, e sono in corso sforzi per aggiungere il supporto di .NET e Ruby. Dal punto di vista degli sviluppatori, XPCOM permette di scrivere componenti in C++, JavaScript, Python, o altri linguaggi per cui sono stati creati speciali collegamenti, e permette di compilare ed eseguire tali componenti su dozzine di piattaforme differenti, tra cui queste e altre dove lo stesso Mozilla viene supportato. La flessibilità di riuso dei componenti XPCOM dalla libreria Gecko e dello sviluppo di nuovi componenti che girano su piattaforme diverse, facilita il rapid application development e risulta in applicazioni che sono più produttive e facili da manutenere. La libreria per il networking, ad esempio, è un insieme di componenti XPCOM accessibile ed utilizzabile da qualsiasi applicazione Mozilla. Mozilla è costruito da un insieme di componenti, ognuno dei quali esegue un certo compito. Per esempio, c'è un componente per ogni menu, pulsante ed elemento. I componenti sono costruiti da un numero di definizioni chiamate interfacce. Un'interfaccia in Mozilla è una definizione di un set di funzionalità che possono essere implementate dai componenti. I componenti sono quelli che in Mozilla implementano il codice che fa le cose. Ogni componente implementa le funzionalità come descritto dalle interfacce. Un singolo componente può implementare più interfacce. E più componenti possono implementare la stessa interfaccia. Non ci interessa come il componente implementi tutto, finché implementa correttamente l'interfaccia. Naturalmente, avremo comunque diverse implementazioni, una per ogni piattaforma. Le versioni Windows e Macintosh di un componente file potrebbero essere molto diverse. Comunque, implementerebbero la stessa interfaccia. Perciò possiamo usare un componente accedendo ad esso tramite le funzioni che conosciamo dell'interfaccia. In Mozilla, le interfacce sono precedute da 'nsI' in modo da poter essere facilmente riconosciute. Per esempio, nsIAddressBook è l'interfaccia per interagire con una rubrica, nsISound è usata per ascoltare i file e nsILocalFile per i file. I componenti XPCOM sono in genere implementati in maniera nativa, che significa che generalemente fanno cose che JavaScript non può fare.



Creare oggetti XPCOM

Ci sono tre passaggi per chiamare un componente XPCOM.

  1. Ottenere un componente
  2. Ottieni la parte del componente che implementa l'interfaccia che vogliamo usare
  3. Chiamare la funzione che ci serve

Una volta eseguiti i primi due passaggi, si può ripetere l'ultimo passaggio tutte le volte necessarie. Diciamo che vogliamo rinominare un file. Per questo usiamo l'interfaccia nsILocalFile. Il primo passo è ottenere un componente file. Poi facciamo una richiesta a quest'ultimo e otteniamo la porzione che implementa l'interfaccia nsILocalFile. Infine, chiamiamo le funzioni fornite dall'interfaccia. Questa interfaccia è usata per rappresentare un solo file. Abbiamo visto che le interfacce sono sempre nominate con il prefisso nsI. I componenti, comunque, sono richiamati utilizzando una sintassi URI. Mozilla contiene una lista dei componenti disponibili nel proprio registro. Un utente particolare può installare nuovi componenti se necessario. Mozilla fornisce un componente file, che implementa nsILocalFile. Questo può essere indicato usando l'URI @mozilla.org/file/local;1. Gli altri componenti possono essere indicati in maniera analoga. Si può ottenere un componente utilizzando il seguente codice Javascript:

var aFile=Components.classes["@mozilla.org/file/local;1"].createInstance();

Il componente file viene recuperato e memorizzato nella variabile aFile. Qui otteniamo una classe componente dalla proprietà classes. La proprietà classes è un array di tutti i componenti disponibili. Per ottenere un componente diverso, si sostituisce l'URI nelle parentesi quadre con l'URI del componente che si vuole usare. Infine, viene creata un'istanza con la funzione createInstance. Bisogna controllare il valore ritornato da createInstance per assicurarci che non sia nullo, il che indicherebbe che il componente non esiste. Comunque, a questo punto, abbiamo solo una referenza allo stesso componente file. Per chiamare le funzioni del componente abbiamo bisogno di ottenere una delle sue interfacce, per esempio nsILocalFile.

Bisogna aggiungere una seconda linea di codice:

if (aFile) aFile.QueryInterface(Components.interfaces.nsILocalFile);


La funzione QueryInterface è una funzione fornita da tutti i componenti che possono essere usati per ottenere un'interfaccia specifica di quel componente. Questa funzione ha bisogno di un parametro, l'interfaccia che si vuole ottenere. La proprietà interfaces dell'oggetto Components contiene una lista di tutte le interfacce disponibili. Qui, usiamo l'interfaccia nsILocalFile e la passiamo come parametro a QueryInterface. Il risultato è che aFile sarà un riferimento alla parte del componente che implementa l'interfaccia nsILocalFile. Le due linee di JavaScript sopra possono essere usate per ottenere qualunque interfaccia di qualunque componente. Basta sostituire il nome del componente con il nome del componente che vuoi usare e cambiare il nome dell'interfaccia.


Questo articolo è stato scritto da ing. Mastroeni Giuseppe


Correlati

Risorse