NPAPI

Informatica

La NPAPI (o Netscape Plugin Application Programming Interface) è un architettura multipiattaforma per i plugin utilizzata da molti browser web. Sviluppata inizialmente per la famiglia di browser Netscape, a partire da Netscape Navigator 2.0, è stata implementata in seguito in altri browser, tra cui Mozilla Application Suite, Mozilla Firefox, Safari, Opera, Konqueror ed alcune versioni di Microsoft Internet Explorer.

Il suo successo può essere in parte attribuito alla sua semplicità. Un plugin dichiara di gestire alcuni tipi MIME (ad esempio "audio/mp3") mediante le informazioni sui file presentati. Quando il browser incontra tale tipo di contenuti carica il plugin associato, delimita lo spazio all'interno dell'area di visualizzazione da assegnare al plugin, e infine vi trasferisce dati. Al plugin viene, quindi, assegnato il compito di gestire i dati nel modo più opportuno, sia esso visivo, audio o qualunque altra cosa. In questo modo, un plugin viene eseguito nella propria parte di pagina, a differenza dei browser precedenti, che dovevano lanciare un'applicazione esterna per gestire i tipi di contenuto a loro ignoti.

L'API richiede che ogni plugin implementi e pubblichi un numero abbastanza piccolo di funzioni. Si tratta approsimativamente 15 funzioni in totale per l'inizializzazione, la creazione, la distruzione e il posizionamento dei plugin. La NPAPI supporta anche lo scripting, la stampa, la visualizzazione a schermo intero, i plugin windowless e lo streaming dei contenuti.

Storia

L'origine della funzionalità dei plugin Netscape va ricercata non in Netscape, ma in Adobe Systems. John Warnock, amministratore delegato di Adobe, ed Allan Padget, uno dei principali autori di Acrobat Reader, speravano che il formato di file di punta di Adobe, PDF, potesse espandere la propria sfera d'uso ben oltre l'ambito desktop.

Perciò, poco tempo dopo il rilascio della prima versione di Navigator da parte di Netscape, Padgett, insieme all'ingegner Eshwar Priyadrshan, tentò di trovare un modo per rendere PDF parte integrante dell'esperienza del Web. Il risultato fu un'applicazione dimostrativa mostrata a Warnock e a Jim Clark, amministratore delegato di Netscape. Prima di quella demo, gli unici formati nativi sul Web erano le pagine HTML e le immagini mostrate al loro interno. I collegamenti ad ogni altro tipo di file comportavano la richiesta all'utente di scaricare il file: fatto ciò, l'utente poteva aprire il file con l'applicazione più appropriata. In quella dimostrazione, tuttavia, quando un utente faceva click su un collegamento ad un file PDF, il file veniva aperto immediatamente all'interno della finestra del browser, mescolando indifferentemente la fruizione di pagine HTML e documenti PDF. Clark chiese con eccitazione chi di Netscape avesse fornito supporto tecnico per rendere possibile l'integrazione, ma scoprì che essa era stata raggiunta senza il coinvolgimento di Netscape, ma con un po' di reverse engineering del browser.

Le aziende stabilirono di incontrarsi la settimana successiva per trovare il modo di rendere appetibile quello che era conosciuto come "l'hack di Allan" per il mercato. Sebbene Netscape fosse pronta ad incorporare i PDF direttamente all'interno del browser, e certamente Adobe ne avrebbe guadagnato, Padgett propose un approccio diverso: un'architettura basata sui plugin. Gli ingegneri Adobe Gordon Dow e Nabeel Al-Shamma avevano da poco aggiunto un'architettura a plugin ad Acrobat Reader, per ridurre gli sforzi degli sviluppatori di terze parti. Padgett aveva partecipato allo sviluppo, e riteneva che se si fosse fornita l'occasione, altre aziende (e magari altri team all'interno di Adobe) avrebbero scelto di estendere le capacità del Web. Clark ed il team alla fine si convinsero, e cominciarono a disegnare l'API che avrebbe dovuto supportare il nuovo modello di sviluppo. Sebbene PDF sia stato il pioniere, si potrebbe affermare che plugin successivi, quali Macromedia Flash e Java, abbiano inciso molto di più sul panorama del web.

Supporto agli script

La possibilità di aggiungere degli script ai plugin è una caratteristica che permette al codice JavaScript presente in una pagina di interagire con un plugin. Diverse versioni di Netscape, ed in seguito di Mozilla, hanno supportato questa caratteristica utilizzando tecnologie fra loro differenti: LiveConnect, XPConnect e npruntime.

LiveConnect

Con Netscape 4, la NPAPI venne estesa per permettere di sfruttare i plugin tramite degli script. Questa funzionalità venne chiamata LiveConnect. Un plugin poteva implementare e restituire un'istanza di una classe Java. I metodi pubblici esposti da questa classe rappresentavano l'interfaccia cui potevano essere applicati degli script. La classe poteva essere chiamata tramite codice JavaScript, come anche da altre applet Java in esecuzione all'interno della pagina, mentre il browser vigilava sulle chiamate tra i diversi contesti d'esecuzione.

Lo svantaggio di LiveConnect risiedeva nell'essere legato a doppio filo con la versione di Java integrata all'interno del browsr Netscape. Ciò impediva al browser di utilizzare altri runtime, ed appesantiva significativamente il download del browser, dal momento che Java era un componente fondamentale per lo scripting dei plugin.

Inoltre, la programmazione di LiveConnect non era affatto immediata. Lo sviluppatore doveva definire una classe Java per il plugin, eseguirla tramite un compilatore di intestazioni Java specializzato ed implementare i metodi nativi. La gestione delle stringhe, delle eccezioni e degli altri oggetti Java dal C++ era frustrante e certamente non lapalissiana. A peggiorare le cose era il fatto che LiveConnect utilizzava un'API adesso obsoleta per invocare metodi C++ nativi da Java, chiamato JRI. La tecnologia JRI è stata da tempo sostituita dalla JNI.

XPConnect

LiveConnect si rivelò estremamente problematico per Mozilla. La dipendenza da un runtime Java obsoleto e proprietario e dall'API JRI implicava l'impossibilità per LiveConnect di funzionare.

Mozilla stava già utilizzando XPCOM per definire le interfacce a molti oggetti implementati in C++. Ogni interfaccia veniva definita tramite un file IDL (Interface Definition Language), e passata ad un compilatore IDL che produceva file d'intestazione ed una libreria indipendente dal linguaggio di programmazione che costituiva la rappresentazione binaria dell'interfaccia: quest'ultima descriveva l'interfaccia, i metodi, i parametri, le strutture dati e le enumerazioni.

XPCOM usa le informazioni sul tipo di libreria per regolamentare le chiamate tra diversi contesti di thread e tra JavaScript codice nativo C++ compilato. Dal momento che XPConnect viene utilizzato pesantemente da Mozilla, è molto robusto, supportato e documentato. A partire da Netscape 6.1 e Mozilla 0.9.2, la NPAPI è stata estesa in modo tale che un plugin potesse restituire un'interfaccia a se stesso gestibile tramite script, mentre XPConnect si occupa di gestire le chiamate a detto plugin da JavaScript e dal codice C++.

Ciò rese non più necessaria la dipendenza da Java, ma provocò alcuni problemi. In particolare, poichè l'implementazione viene effettuata utilizzando componenti XPCOM, una tecnologia simile a Microsoft COM, lo sviluppatore del plugin deve saper gestire il reference counting, le interfacce, l'IDL e così via per poter implementare lo scripting. Inoltre, la dipendenza da XPCOM comportava alcuni problemi nel collegamento dinamico delle librerie (ad esempio il problema della classe base fragile) che dovevano essere risolti per permettere al plugin di funzionare correttamente con browser differenti. XPCOM è stato in seguito modificato in modo tale da fornire una versione collegata staticamente per risolvere tali problemi. Quest'approccio richiede anche l'installazione di un file .xpt nella stessa locazione scelta per la DLL, altrimenti il plugin sembrerà funzionare, mentre la funzionalità di scripting non sara disponibile.

npruntime

Alla fine del 2004, tutti i maggiori sviluppatori di browser (eccetto Microsoft) scelsero congiuntamente npruntime come estensione alla NPAPI originaria per fornire funzionalità di scripting, tramite un'API simile alla vecchia API stile C, ed indipendente da altre tecnologie quali Java o XPCOM.

npruntime è supportato dalla generazione più recente di browser Mozilla (1.7.5+) / Firefox, Safari ed Opera. Tutti i nuovi plugin dovrebbero usare questa API.

= Confronto tra NPAPI e i controlli ActiveX

Microsoft sviluppò OLE2 (Object Linking and Embedding) per rendere possibile la creazione di documenti composti in applicazioni quali Microsoft word. Per esempio, un documento scritto in un word processor potrebbe contenere un foglio di calcolo incorporato che potrebbe essere lanciato all'interno della finestra del word processor.