MDN may have intermittent access issues April 18 13:00 - April 19 01:00 UTC. See whistlepig.mozilla.org for all notifications.

mozilla
Los resultados de tu búsqueda

    Usar XPInstall para instalar plugins

    XPInstall es una tecnología de instalación basada en JavaScript que funciona en todas las plataformas en las que pueden instalarse los navegadores de Mozilla y los de Netscape basados en Mozilla. Puede ser un modo para asegurarle al usuario una plácida experiencia a la hora de obtener plugins, sin obligarlo a abandonar el entorno de navegación para ejecutar un instalador binario (el típico setup.exe en Windows) ni forzarlo a reiniciar su navegador. Los fabricantes de plugins que ya hayan escrito un instalador en código nativo (p.e., EXE) pueden incluir dicho instalador y ejecutarlo para que el usuario no tenga que abandonar el entorno del navegador y hacer clic en el EXE para ejecutarlo. Este artículo muestra una guía de estilo para mejorar la experiencia en la instalación de un plugin para los navegadores de Netscape Gecko utilizando XPInstall.

    Definición de términos

    XPInstall es una tecnología de instalación. El propio nombre significa "Cross Platform Install" (instalador multiplataforma) y de ahí lo de "XP" (abreviatura en inglés de "multiplataforma"). Un paquete XPInstall es generalmente llamado un paquete XPI para abreviar (y pronunciado generalmente "zippy" en inglés). Este artículo explica cómo se puede usar XPInstall para instalar plugin en los navegadores que soporten XPInstall.

    Un paquete XPI es de hecho un fichero ZIP con la extensión XPI (p.e., myPluginInstaller.xip) y puede ser creado en Windows con utilidades tipo WinZip. Los paquetes XPI, como los ficheros ZIP, contienen otros ficheros, normalmente:

    • El componente software que va a ser instalado. En nuestro caso es el software del plugin.
    • Un fichero JavaScript llamado install.js, el cual contiene la lógica que conduce la instalación. Esto incluye instrucciones que indican dónde se va a instalar el software y mensajes para informar al usuario.

    Un fichero XPInstall se puede crear empaquetando primero los elementos que se quieran instalar con WinZip (es decir, crear un fichero ZIP) y renombrarlo con la extensión XPI en lugar de ZIP.

    A diferencia de los instaladores compilados para código nativo (p.e., los típicos ficheros setup.exe), el lenguaje de programación para las operaciones de instalación en XPI es JavaScript. Como el formato de fichero que contiene al software y al fichero JavaScript install.js es multiplataforma (Zip) y ya que los navegadores de Mozilla para todas las plataformas reconocen JavaScript, generalmente un único paquete XPI sirve para todas las plataformas. Así es, de hecho, cómo las pieles y los temas son instalados en los navegadores de Mozilla, cambiando su aspecto y apariencia. Este artículo se centra en cómo instalar plugins.

    ¿Qué navegadores soportan XPInstall?

    Actualmente, todos los navegadores de Mozilla liberados por mozilla.org y la familia de navegadores basados en el código de Mozilla soportan XPInstall. Concretamente, están incluidos:

    • Los navegadores recientes de Netscape tales como Netscape 6.2.x y Netscape 7.0, ambos basados en Netscape Gecko que es el núcleo del navegador Mozilla.
    • Las versiones recientes sólo beta del software de AOL basado en Netscape Gecko, el motor de renderizado del proyecto Mozilla.

    Advertencias:

    • El navegador CompuServe de AOL Time Warner, basado también en Netscape Gecko, no soporta XPInstall.
    • Netscape Communicator 4.x no soporta XPInstall.

    ¿En qué consiste un plugin?

    Los plugins pueden estar compuestos de los siguientes tipos de fichero, pudiendo ser todos ellos instalados desde un paquete XPI:

    • Bibliotecas compartidas (p.e., en Windows, son DLLs, en Unix son los ficheros *.so). Dichos ficheros están compilados en código nativo con la API para plugins de Netscape.
    • Si el plugin es scriptable, entonces también consistirá en un fichero XPT. Un ejemplo podría ser Flash 6r47 en Windows, el cual está compuesto por una DLL (llamada npswf32.dll) y un fichero XPT para la programación (llamado flashplayer.xpt). Si estás desarrollando un plugin y quieres hacerlo scriptable, mírate las partes importantes de la API para plugins.
    • Software adicional. Muchos plugins son parte de software adicional para tipos multimedia. Por ejemplo, RealPlayer para Windows consta de un plugin DLL pero también de la aplicación RealPlayer (EXE), de la que el plugin DLL es subconjunto. En este caso, el plugin es parte del paquete de software específico del navegador como mecanismo para darle a la aplicación ganchos adicionales en el navegador.

    XPInstall puede ser utilizado para instalar cualquier combinación de estos ficheros en el ordenador del usuario final. Para aquellos que les suene la tecnología SmartUpdate de Netscape Communicator 4.x, esto les resultará familiar.

    Breve historia de las tecnologías de instalación de Netscape

    Esta sección es importante si estás familiarizado con la tecnología de instalación SmartUpdate de Netscape Communicator 4.x. El uso de JavaScript como lógica de instalación no tiene precedentes en los navegadores de Netscape. Netscape Communicator 4.x utilizaba la noción de SmartUpdate para instalar el software, concretamente los plugins y los applets de Java para que fuesen ejecutados localmente. SmartUpdate no está soportado por los navegadores de Mozilla (ni los navegadores de Netscape/AOL basados en Mozilla tales como Netscape 7) pero debido a la similitud entre ambas tecnologías de instalación, es fácil convertir los ficheros SmartUpdate a ficheros XPInstall. SmartUpdate utiliza un fichero JAR firmado digitalmente que contiene los componentes de software a instalar además del fichero JavaScript install.js (el llamado script de instalación) como lógica del instalador. Las descargas y los instaladores deberían empezar mostrando un cuadro de diálogo de seguridad que aclarase la autoridad certificadora y el firmante. Frecuentemente, la descarga SmartUpdate era disparada a través del atributo pluginurl de la etiqueta <embed>.

    <embed type="application/x-randomtype" src="myfile.typ" width="50" height="50"
    pluginurl="http://mytypecompany.xyz/jarpacks/mytypeplugin.jar"></embed>
    

    En el ejemplo anterior, el atributo pluginurl referencia a un fichero firmado JAR, el cual sería descargado por Netscape Communicator 4.x (dependiendo de la elección en el cuadro de diálogo de seguridad) si el plugin no estuviera instalado en la máquina del usuario. SmartUpdate difiere de XPInstall en esto:

    • XPInstall utiliza ficheros ZIP renombrados a XPI (*.xpi) y SmartUpdate utiliza ficheros JAR (*.jar)
    • A diferencia de los ficheros JAR de SmartUpdate, los paquetes XPI no tienen que estar firmados digitalmente con un certificado digital.
    • Los paquetes XPI hacen uso de diferentes APIs dentro de install.js, aunque el concepto es el mismo.

    XPInstall para los navegadores basados en Mozilla es análogo a SmartUpdate en el navegador Netscape Communicator 4.x. Portar SmartUpdate a XPInstall es trivial tras haberse familiarizado con la nueva API de XPInstall.

    Proceso de instalación recomendado

    XPInstall suministra una API unificada para llevar a cabo una rápida instalación y configuración del software del plugin para los usuarios finales. Los beneficios de usar XPInstall son porporcionar un mecanismo de instalación para descargas en flujo. Esta sección explica lo que tendría que hacer un paquete XPInstall ideal, además de descubrir algunas de las llamadas API de JavaScript que llevan a cabo estas tareas. Un paquete XPI ideal debería:

    1. Instalarse en el navegador actual que ha llamado a la instalación XPInstall vía HTML o que la ha ejecutado a través de un script. Usaremos el término "navegador actual" para referirnos al navegador que inicia la descarga del XPInstall visitando un sitio que requiere un plugin que el navegador actual no encuentra localmente. Este paso implica el uso de la llamada a la API initInstall para inicializarlo todo y además la llamada getFolder que ayuda a encontrar el directorio de plugins del navegador actual.
    2. Instalar el software del plugin en otra ubicación del disco duro del usuario para que otros navegadores basados en Mozilla que el usuario pudiese instalar más tarde encontrasen y pudieran utilizar el plugin (los componentes específicos del navegador). La meta es asegurar que futuros navegadores Netscape Gecko que pudieran ser instalados más adelante puedan beneficiarse de la instalación iniciada por el usuario con el navegador actual. Un ejemplo lo tenemos si el navegador actual fuese Netscape 7 y más adelante el usuario descargase una beta del software de AOL que usase Netscape Gecko. En lugar de descargar de nuevo el plugin con el otro navegador, éste podría detectar que ya se llevó a cabo la instalación. Este mecanismo de descubrimiento necesita que la creación de la localización secundaria quede reflejada en algún repositorio común de metadatos. En Windows es el registro del sistema. De nuevo, este paso implica llamadas a getFolder para localizar un directorio "bien conocido" y usarlo como localización secundaria.
    3. En Windows: escribir claves de registro que pudiesen ser analizadas por los navegadores Netscape Gecko (instalados tras el navegador actual) para detectar dónde está instalado el plugin en el ordenador. En particular, las claves de registro deberían referenciar a la localización de instalación secundaria para que los futuros navegadores Netscape Gecko pudiesen encontrar y añadir su lista de ubicaciones de plugins disponibles. El formato exacto de dichas claves y cómo deberían ser escritas es tratado en la sección #Problemas con la primera instalación. Para crear y escribir realmente claves en el registro de sistema de Windows se debe usar las funciones del objeto WinReg.
    4. Asegurar que el plugin recién instalado es actualizado correctamente llamando a la API refreshPlugins. Actualizando el plugin, te estarás asegurando de que el plugin está disponible para uso inmediato, sin obligar al usuario a reiniciar su navegador. Esta es una de las ventajas clave de una experiencia con XPInstall depurada.

    El problema de la primera instalación

    El problema de la primera instalación hace referencia a los problemas que surgen cuando un plugin es instalado en el ordenador de un usuario antes de instalar un navegador. El proceso de instalación recomendado intenta resolver este problema instalando el plugin en una ubicación secundaria tras instalar el navegador actual. En pocas palabras, el problema de la primera instalación podría resumirse con la pregunta: ¿cómo puede un navegador instalado en el ordenador de un usuario después de que un plugin haya sido instalado previamente con el beneplácito del usuario desde una instalación existente en lugar de haber descargado el mismo plugin de nuevo? Para resolver este incoveniente, se aconseja a los vendedores a:

    • Instalar los componentes del software del plugin para el navegador (p.e., DLLs en Windows y ficheros XPT si procede) a una ubicación secundaria además de en el directorio de plugins del navegador actual.
    • Escribir claves en el registro de Windows para que guarden la información de esta ubicación secundaria, en particular la ruta de los plugins y la de los XPT (si procede) para que los navegadores de Netscape Gecko puedan buscar el plugin desde la ubicación secundaria si son instalados después de que lo fuese el plugin (o si un navegador de Netscape Gecko concreto reemplaza al navegador actual). La información que deberían contener las claves es explicada con detalle en la especificación publicada en mozilla.org. Existe además un ejemplo de una entrada de registro creada por una compañía imaginaria que ilustra lo que se explica en la especificación para dichas claves de registro.
    • En Windows, las claves del registro mencionadas antes siguen una nomenclatura usando el concepto de identificador de plugin como nombre de clave bajo la subclave MozillaPlugins. El identificador de plugin (o PLID) es un concepto útil que es también aplicable cuando se inicializa la instalación a través de la API initInstall.

    Disección de las APIs utilizadas

    El proceso recomendado de instalación de plugins hace uso de las APIs de XPInstall para instalarlos en el directorio Plugins del navegador actual, en una ubicación secundaria y para escribir una clave en el registro del sistema de Windows que permita recuperar esta última ubicación. Esta sección describe algunas de las APIs de XPInstall que pueden hacer esto y muestra además una plantilla completa de un paquete XPI. No todo el trabajo necesita ser hecho en JavaScript (si tienes un instalador nativo (EXE) que reconoce a los navegadores Netscape Gecko y simplemente deseas incluir el instalador ejecutable en un paquete XPI para que el usuario pueda descargarlo, puedes hacerlo fácilmente). Esta sección hace referencia de modo extensivo a la documentación API de XPInstall.

    Inicializar la instalación con el identificador del plugin

    Toda instalación XPInstall es inicializada con el método initInstall del objeto Install. Ya que el objeto Install está disponible para el script de instalación no necesita ser mencionado en dicho script (p.e., no hay necesidad de utilizar Install.initInstall. Con invocar simplemente a initInstall será suficiente). El método initInstall es polimórfico aunque a continuación se muestra el mecanismo de invocación recomendado:

    initInstall("My Plugin Software", "@myplugin.com/MyPlugin,version=2.5", "2.5.0.0");
    

    En el trozo de código anterior, el método initInstall es invocado con tres parámetros:

    • Una cadena con el nombre de la aplicación.
    • Una cadena representando el identificador del plugin asociado con el plugin. En realidad, este valor se guarda en el registro de versión de cliente tras la instalación, un fichero de los navegadores Mozilla que guarda metadatos con el software que acaba de ser instalado. Este valor puede ser consultado con JavaScript a través de una página web y es útil para inicializar descargas XPInstall vía scripts disparados. Se puede determinar la versión del software que ha sido instalado y determinar si se tiene que actualizar o no, todo esto utilizando JavaScript en una página web.
    • Una cadena que represnta la versión de cuatro dígitos del software.

    Advertencia: Ciertas versiones de los navegadores basados en Mozilla (tales como Netscape 6.x) tratan al carácter igual ("=") como un token ilegal, por lo que no permitirán la invocación de initInstall con cadenas que contengan "=". Un truco podría ser detectar si initInstall ha fallado y, en caso afirmativo, invocarlo de nuevo sin el "=". A continuación se muestra un ejemplo:

    var PLID = "MyPlugin.plug/version=6.5";
    err = initInstall(SOFTWARE_NAME, PLID, VERSION);
    
    if (err != 0)
    {
    	// la instalación debería fallar: se usa N6 y =
    	// reemplazamos PLID con una cadena simple
    	err = initInstall(SOFTWARE_NAME, "MyPluginString", VERSION);
    	if (err != 0)
    		cancelInstall(err);
    }
    

    Nótese que en el ejemplo anterior el PLID contiene un "=" y, en caso de que el paquete XPI esté siendo ejecutado en navegadores que tratan a "=" como un token ilegal, el truco capturará el error e invocará de nuevo a initInstall.

    Usar XPInstall junto con un instalador ejecutable (código nativo)

    Si lo que deseas es ejecutar un instalador nativo (EXE) para instalar el software de un plugin pero prefieres que el instalador sea descargado dentro del proceso del navegador entonces probablemente deberías considerar incluirlo en un paquete XPI. Desde JavaScript, puedes llamar al método execute del objeto Install del XPInstall para ejecutar el binario. Además puedes llamar al método execute del objeto File si lo que realmente quieres instalar es el fichero que estás ejecutando en lugar de borrarlo. Puedes pasar parámetros de línea de comandos al ejecutable. Un ejemplo de llamada al método execute desde el objeto Install sobre un ejecutable que tiene un período de vida temporal (y no se necesita tras la instalación) es:

    // Initialize the installation ....
    
    // initInstall(..... ) has already been called
    
    // Using the Install Object's execute method to block on a native installer
    
    execute("setup.exe", "-s", true);	
    
    // En el ejemplo anterior, se supone que se ha ejecutado "setup -s" desde
    // la línea de comandos que arranca el instalador y que "-s" es algún
    // tipo de parámetro definido por el fichero setup.exe, quizá para forzar
    // al instalador a ejecutarse en modo silencioso. Se pasa el "-s" al instalador.
    // Pasando 'true' le estamos diciendo al script de instalación que bloquee
    // la ejecución del instalador y que lo haga síncronamente.
    
    // Se debería llamar a performInstall para hacer que suceda...
    
    err = getLastError();
    if (!err)
       performInstall();
    else
      cancelInstall(err);
    

    Instalar los ficheros del plugin en el navegador actual

    La instalación en el navegador actual es la tarea más importante que debe de hacerse bien para un paquete XPI. A continuación se muestra un trozo de código que lleva a cabo esto:

    // Name of the files to be installed
    var PLUGIN_FILE    = "NPMyPlugin.dll";
    var COMPONENT_FILE = "NPMyPluginScriptablePeer.xpt";
    
    // invoke initInstall to start the installation
    
    ....
    
    var pluginFolder = getFolder("Plugins");
    
    // verify disk space is appropriate
    
    ....
    
    err = addFile("@myplugin.com/MyPlugin,version=2.5.0.0",
                         "2.5.0.0", PLUGIN_FILE, pluginsFolder, null);
        if (err != 0)
        {
    	//alert("Installation of MyPlugin plug-in failed. Error code "+err);
    	logComment("adding file "+PLUGIN_FILE+" failed. Errror conde: " + err);
    	return err;
        }
    
    err = addFile(null, CULT_VERSION, COMPONENT_FILE, componentsFolder, null);
        if (err != 0)
        {
    	alert("Installation of MyPlugin component failed. Error code "+err);
    	logComment("adding file "+COMPONENT_FILE+" failed. Error conde: " + err);
    	return err;
        }
    

    Instalación en una ubicación secundaria

    Para solventar el problema de la primera instalación es necesario instalar en una segunda ubicación para asegurar que otros navegadores de Netscape Gecko puedan encontrar el plugin, además del navegador actual. Una buena elección para esta ubicación secundaria podría ser el directorio Windows en ordenadores con Windows. Advertencia: Debido a posibles problemas de permisos se aconseja manejar los errores con sumo cuidado.

    // Obtenemos el directorio de sistema de Windows, p.e., el directorio C:\WINNT\system32\
    
    var winDirectory = getFolder("Win System");
    
    // Create the Folder C:\WINNT\system32\MyPlugin
    
    var dllWin32Folder = getFolder("file:///", winDirectory+"\\MyPlugin\\");
    //Install DLL to C:\Windows Folder
    	copyErr = addFile("", VERSION, PLUGIN_FILE, dllWin32Folder, null);	
        if (copyErr != 0)
        {
        	logComment("First Install:"+copyErr);
        	return copyErr;
        }
    
    // Install the XPT file to C:\WINNT\system32\MyPlugin folder
    
    var xptWin32Folder = getFolder("file:///", winDirectory+"\\MyPlugin\\");
    	copyErr = addFile("", VERSION, COMPONENT_FILE, xptWin32Folder, null);		
        if (copyErr != 0)
        {
        	logComment("First Install:"+copyErr);
        	return copyErr;
        }
    

    Una vez decidida la ubicación secundaria, el registro de windows ha de ser actualizado con la ruta de dicha ubicación para que futuros navegadores puedan recuperarla. Esto es realizado con el objeto WinReg proporcionado por XPInstall. Todas las piezas quedan ensambladas en la plantilla mostrada a continuación.

    Plantilla XPInstall

    Se ha mostrado una plantilla para un script de instalación que quizá te gustaría abrir en otra pestaña o ventana. Dicho script de instalación hace lo siguiente:

    • Instala tanto el fichero DLL como el XPT en el directorio de plugins del navegador. El propio plugin es imaginario: MyPlugin. Sin embargo, las variables que determinan el nombre del plugin pueden ser modificadas fácilmente. Este fichero install.js supone que el software del plugin que va a ser instalado está compuesto por un fichero DLL y por otro XBT, lo cual no siempre es cierto. Muchos plugins pueden traer más de una DLL o quizá código nativo adicional. No obstante, es una suposición más que segura para la mayoría de los plugins, especialmente para el plugin Flash de Macromedia compuesto por una única DLL (en Windows es npswf32.dll) y un único fichero XPT para script (llamado flashplayer.xpt).
    • Adicionalmente, instala el plugin en una ubicación secundaria en el ordenador del usuario. Concretamente, como muchos ficheros OCX (los controles ActiveX), se instala en un directorio especial dentro de C:\WINNT\System32, llamado C:\WINNT\System32\MyPlugin. XPInstall es capaz de determinar cuál es este directorio gracias a la llamada API getFolder. Hemos escrito nuestra propia función de JavaScript que contiene todo el código de la instalación secundaria (la función createSecondaryInstall()).
    • Y por último, escribe las claves de registro requeridas en Windows. Esto se hace a través de la función creada, llamada registerPLID().

    Es cierto que este secript se centra en Windows, pero es fácil portarlo a cualquier otra plataforma. Quizá esto sea todavía más fácil, ya que ni en Linux ni en Mac OSX hay que trabajar con la tediosa manipulación del registro de Windows. La API getFolder proporciona suficientes "golosinas sintácticas" como para determinar otras ubicaciones del ordenador del usuario en distintas plataformas y sistemas operativos. Un único install.js es casi siempre capaz de ejecutarse en muchas plataformas diferentes.

    Algunas notas sobre la instalación

    Esta sección comprende algunas de las notas clave sobre el envío de paquetes XPI, en particular: ¿cómo puede ser iniciada la descarga de un plugin vía XPI? ¿Y qué pasa con la desinstalación de plugins?

    Ejecutar una descarga XPInstall con un script autoejecutable

    Un script autoejecutable es un trozo de JavaScript de una página web que puede iniciar automáticamente una descarga XPInstall. Esto puede estar condicionado al hecho de que los scripts autodisparados pueden detectar además el software que ya está instalado en el ordenador del usuario a través de XPInstall. Esta opción es útil para los sitios web porque:

    • Las páginas HTML y JavaScript ya poseen un modo de detectar qué plugins están instalados. Además, gracias al objeto InstallTrigger el cual es accesible por las páginas web, se puede conocer la última versión del paquete XPI instalado.
    • El objeto InstallTrigger también puede iniciar una descarga XPI automáticamente. Esto es útil ya que los usuarios pueden visitar un sitio web y, de forma opcional, obtener el software del servidor (mediante flujo de datos) ofrecido al usuario por la página web.

    Los scripts autoejecutables son la forma recomendada de iniciar las descargas XPInstall.

    Ejecutar una descarga XPInstall desde HTML

    De manera análoga a como son inicializadas las descargas SmartUpdate por el atributo pluginurl de la etiqueta <embed>, las descargas XPInstall pueden ser también iniciadas por las etiquetas HTML que invocan a plugins, sobre todo a través del atributo codebase de la etiqueta <object>. Esto es análogo a cómo Internet Explorer descarga ficheros CAB referenciados por el atributo codebase de la etiqueta <object>. A continuación se muestra un ejemplo de una hipotética etiqueta <object> usada para invocar a MyPlugin (una aplicación imaginaria):

    	<object id="thePlugin" type="application/x-myplugin" width="100" 
    	height="100" codebase="http://location/XPI/myplugin.xpi">
    
    <param .... >
    

    En el caso anterior, el atributo codebase apunta directamente al paquete XPI y si el navegador no pudiese identificar ningún plugin para manejar el tipo MIME (imaginario) application/x-myplugin, entonces descargaría el paquete XPI.

    Nota: Los paquetes XPI (los ficheros con extensión xpi) utilizan el tipo MIME application/x-xpinstall. Al servir los paquetes XPI a los clientes desde el servidor, asegúrate de que los paquetes son servidos con este tipo MIME en las cabeceras HTTP. Asocia el tipo MIME application/x-xpinstall con los paquetes XPI.

    El problema de la desinstalación

    En su versión actual, XPInstall no posee una tecnología de desinstalación. Ya que sólo puede ser usado para instalar ficheros o para servir de transporte a instaladores de código nativo para el cliente, sería una buena idea escribir un desinstalador de código nativo para el cliente, si es procedente. XPInstall puede por tanto ser un "agente de transporte" para llevar el software del ejecutable y con éste la lógica de instalación y desinstalación que será manejada por él, el cual puede crear ficheros y entradas de registro además de limpiarlo todo después de eliminarlo.

    Información original del documento

    Etiquetas y colaboradores del documento

    Contributors to this page: Superruzafa, Fedora-core, Floot
    Última actualización por: Superruzafa,