1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
|
---
title: Actualizar extensiones para Firefox 3
slug: Mozilla/Firefox/Releases/3/Updating_extensions
tags:
- Firefox 3
translation_of: Mozilla/Firefox/Releases/3/Updating_extensions
original_slug: Actualizar_extensiones_para_Firefox_3
---
<div>{{FirefoxSidebar}}</div>
<p>Este artículo ofrece información que será de utilidad para desarrolladores que deseen actualizar sus extensiones, para que éstas funcionen correctamente con Firefox 3.<br>
<br>
Antes de continuar, queremos sugerirte algo: si el único cambio que requiere tu extensión es modificar el campo maxVersion en el manifiesto de instalación, la extensión está disponible en el servidor <a class="link-https" href="https://addons.mozilla.org/es-ES/firefox/" title="https://addons.mozilla.org/es-ES/firefox/">addons.mozilla.org</a> y ¡no necesitarás actualizar tu extensión a una nueva versión! Simplemente usa el Panel de Control para desarrolladores en AMO para modificar <code>maxVersion</code>. De esta manera, puedes evitar el trabajo de tener que volver a revisar tu extensión.</p>
<p> </p>
<h3 id="1er_paso:_Actualiza_el_manifiesto_de_instalaci.C3.B3n" name="1er_paso:_Actualiza_el_manifiesto_de_instalaci.C3.B3n">Paso 1: Actualiza el manifiesto de instalación</h3>
<p>El primer paso —y para la mayoría de las extensiones, el único que será necesario— es actualizar el archivo <code>install.rdf</code> dentro del <a href="/es/Manifiesto_de_instalaci%C3%B3n" title="es/Manifiesto_de_instalación">manifiesto de instalación</a> para indicar la compatibilidad con Firefox 3.</p>
<p>Sólo debes buscar la línea que indica la máxima versión compatible de Firefox, lo que para Firefox 2, probablemente sea:</p>
<pre class="eval"> <span class="nowiki"><em:maxVersion>2.0.*</em:maxVersion></span>
</pre>
<p>Cámbiala para indicar compatibilidad con Firefox 3:</p>
<pre class="eval"> <span class="nowiki"><em:maxVersion>3.0.*</em:maxVersion></span>
</pre>
<p>A continuación, reinstala la extensión.</p>
<p>Recuerda que en Firefox 3 no necesitas incluir el ".0" extra en el número de la versión. Por lo tanto, en lugar de escribir "3.0.0.*", sólo necesitas usar "3.0.*".</p>
<p>Ha habido (y continuará habiendo) una serie de cambios en las APIs, lo que muy probablemente averiará algunas extensiones. Aún estamos trabajando para confeccionar una lista completa de estos cambios.</p>
<p>Si tu extensión todavía usa un script <code><a href='\"es/Install.js\"'>Install.js</a></code> en vez de un <a href='\"es/Manifiesto_de_instalaci%c3%b3n\"'>manifiesto de instalación</a>, necesitas hacer la transición a un manifiesto de instalación lo más pronto posible. Firefox 3 no implementará el script <code>install.js</code> en documentos XPI.</p>
<h4 id="A.C3.B1ade_descripciones_al_manifiesto_de_instalaci.C3.B3n" name="A.C3.B1ade_descripciones_al_manifiesto_de_instalaci.C3.B3n">Agregar localizaciones al manifiesto de instalación</h4>
<p>Firefox 3 cuenta con tres nuevas propiedades en el manifiesto de instalación para especificar descripciones de localización. Los métodos antiguos todavía funcionan. Sin embargo, los nuevos permiten que Firefox escoja la localización, aún cuando la extensión esté deshabilitada o pendiente de instalación. Visita <a href="/es/Traducir_las_descripciones_de_las_extensiones" title="es/Traducir_las_descripciones_de_las_extensiones">Localizar las_descripciones_de_las_extensiones</a> para más detalles.</p>
<h3 id="2do_paso:_Aseg.C3.BArese_de_proveer_actualizaciones_seguras" name="2do_paso:_Aseg.C3.BArese_de_proveer_actualizaciones_seguras">Paso 2: Asegúrate de suministrar actualizaciones seguras</h3>
<p>Si suministras extensiones por tu propia cuenta y no usas un proveedor de hosting seguro como <a class="link-https" href="https://addons.mozilla.org">addons.mozilla.org</a>, debes asegurarte de suministrar algún método seguro para la actualización de tus extensiones. Esto puede hacerse de dos formas: puedes usar un hosting con servicio de SSL o bien, puedes usar claves criptográficas para firmar la información de actualización. Lee <a href="/es/Versionado,_actualizaci%C3%B3n_y_compatibilidad_de_extensiones" title="es/Versionado,_actualización_y_compatibilidad_de_extensiones">Cómo hacer actualizaciones seguras</a> para más información.</p>
<h3 id="3er_paso:_Resolviendo_problemas_con_APIs_cambiados" name="3er_paso:_Resolviendo_problemas_con_APIs_cambiados">Paso 3: Debes estar al tanto de los cambios en las APIs</h3>
<p>Muchas APIs han sido modificadas de forma significativa. Los cambios más importantes, que seguramente afectarán a muchas extensiones son:</p>
<h4 id="DOM" name="DOM">DOM</h4>
<p>Los nodos de documentos externos deberán copiarse idénticamente usando <code><a href="../../../../en/DOM/document.importNode" rel="internal">importNode()</a></code> (o adoptarlos usando <code><a href="../../../../en/DOM/document.adoptNode" rel="internal">adoptNode()</a></code>) antes de poder insertarlos en el documento actual. Para más información acerca de cuestiones relacionadas con <code><a href="../../../../en/DOM/element.ownerDocument" rel="internal">ownerDocument</a></code>, visita <a class="external" href="http://www.w3.org/DOM/faq.html#ownerdoc" rel="external nofollow" title="http://www.w3.org/DOM/faq.html#ownerdoc">W3C DOM FAQ</a>.</p>
<p>Actualmente, Firefox no exige hacerlo aunque sí lo hizo durante algún tiempo, durante el desarrollo de Firefox 3. Lo que ocurrió fue que muchos sitios sufrían averías cuando esta política era obligatoria. Nuestra recomendación para los desarrolladores web es que corrijan su código para cumplir con esta regla y así lograr una mejor compatibilidad a futuro.</p>
<h4 id="Enlaces_e_Historia" name="Enlaces_e_Historia">Marcadores e Historial</h4>
<p>Si de alguna forma tu extensión tiene acceso a Marcadores o Historial, necesitarás un gran esfuerzo para hacer que sea compatible con Firefox 3. Las APIs antiguas que daban acceso a esta información han sido reemplazadas por la nueva arquitectura <a href="/es/Cat%C3%A1logo" title="es/Catálogo">Catálogo (Biblioteca)</a>. Visita la <a href="/es/Lugares/Gu%C3%ADa_para_migraci%C3%B3n_con_lugares" title="es/Lugares/Guía_para_migración_con_lugares">Guía para la migración a Catálogo (Biblioteca)</a> para más detalles acerca de cómo actualizar tus extensiones para el uso de las APIs de Catálogo (Biblioteca).</p>
<h4 id="Control_de_descargas" name="Control_de_descargas"><span><span>Administrador de descargas</span></span></h4>
<p>La API del Administrador de descargas ha cambiado ligeramente debido a la transición del almacén de datos RDF al uso de la API <a href="/es/Almacenamiento" title="es/Almacenamiento">Almacenamiento</a>. Esto debería ser una transición sencilla y fácil. Además , se ha modificado la API que controla los procesos de descarga para permitir varios receptores del administrador de descargas. Visita {{ Interface("nsIDownloadManager") }}, {{ Interface("nsIDownloadProgressListener") }} y <a href="../../../../en/Monitoring_downloads" rel="internal">Controlar descargas</a> para más información.</p>
<h4 id="Control_de_contrase.C3.B1a" name="Control_de_contrase.C3.B1a">Administrador de contraseñas</h4>
<p>Si tu extensión tiene acceso a información de inicio de sesión de usuario en el Administrador de contraseñas, deberás actualizarla para poder utilizar la nueva API para el Administrador de inicio de sesión.</p>
<ul>
<li>El artículo <a class="new" href="../../../../es/Using_nsILoginManager" rel="internal">Utilizar nsILoginManager</a> incluye ejemplos y hasta una demostración de cómo debes escribir extensiones que funcionen tanto con el Administrador de contraseñas como con el Administrador de inicio de sesión, de manera que ambos funcionen con Firefox 3 y versiones anteriores.</li>
<li><code><a href="/en/nsILoginInfo" title="en/nsILoginInfo">nsILoginInfo</a></code></li>
<li><code><a href="/en/nsILoginManager" title="en/nsILoginManager">nsILoginManager</a></code></li>
</ul>
<p style="text-align: left;">También puedes sobrescribir el almacén del administrador de contraseñas interno si quieres ofrecer tu propia implementación del almacén de contraseñas en la extensión. Visita <a class="new" href="../../../../es/Creating_a_Login_Manager_storage_module" rel="internal">Crear un módulo de almacenamiento para el Administrador de inicio de sesión</a> para más detalles</p>
<h4 id="Ventanas_emergentes_(Menús_Menús_contextuales_Tooltips_y_Paneles)"><span><span>Ventanas emergentes (Menús, Menús contextuales, Tooltips y Paneles)</span></span></h4>
<p>En Firefox 3, se ha modificado sustancialmente el sistema XUL de ventanas emergentes. El sistema de ventanas emergentes ahora contempla menús principales, menús contextuales y paneles. Se ha creado una guía para <a class="new" href="../../../../es/XUL/PopupGuide" rel="internal">Utilizar Ventanas emergentes</a> que detalla cómo funciona este sistema. Algo que debes tener en cuenta, es que se desaconseja el uso de <code>popup.<span class="lang lang-en"><a href="../../../../en/XUL/Method/showPopup" rel="internal">showPopup</a></span></code> en favor de los nuevos <code>popup.<span class="lang lang-en"><a href="../../../../en/XUL/Method/openPopup" rel="internal">openPopup</a></span></code> y <code>popup.<span class="lang lang-en"><a href="../../../../en/XUL/Method/openPopupAtScreen" rel="internal">openPopupAtScreen</a></span></code>.</p>
<div id="section_10">
<h4 class="editable" id="Autocompletar"><span><span>Autocompletar</span> </span></h4>
</div>
<p>El método <code><a class="new" href="../../../../es/NsIAutoCompleteController#handleEnter.28.29" rel="internal">handleEnter()</a></code> de la interfaz <span class="lang lang-es"><code><a class="new" href="../../../../es/nsIAutoCompleteController" rel="internal">nsIAutoCompleteController</a></code></span> ha cambiado para aceptar un argumento que indique si el texto ha sido seleccionado desde una ventana emergente para Autocompletar o bien, por el usuario que ha pulsado la tecla Entrar (Enter) después de ingresar texto.</p>
<h4 id="DOMParser" name="DOMParser">DOMParser</h4>
<ul>
<li>Cuando se inicia una instancia de <code>DOMParser</code>, ésta hereda el código de la llamada principal, además de los códigos <code>documentURI</code> y <code>baseURI</code> de la ventana del constructor de donde proviene.</li>
<li>Si el llamante tiene privilegios UniversalXPConnect, puede pasar parámetros a <code>new DOMParser()</code>. Si se pasan menos de tres parámetros, los parámetros restantes se pasarán con el valor <code>null</code> de forma predeterminada.
<ul>
<li>El primer parámetro es el principal que se debe utilizar y por esto, se sobrescribe el valor principal predeterminado generalmente heredado.</li>
<li>El segundo parámetro es el <code>documentURI</code> que se debe utilizar.</li>
<li>El tercer parámetro es el <code>baseURI</code> que se debe utilizar.</li>
</ul>
</li>
<li>Si inicias un <code>DOMParser</code> usando una instrucción como <code>createInstance()</code> y no llamas al método <code>init()</code> de <code>DOMParser</code>, al intentar iniciar la operación de análisis, se creará e iniciará automáticamente un <code>DOMParser</code> con un principal nulo y punteros <code>null</code> para <code>documentURI</code> y <code>baseURI</code>.</li>
</ul>
<h4 id="Interfaces_removidas" name="Interfaces_removidas">Interfaces eliminadas</h4>
<p>Las siguientes interfaces han sido eliminadas en Gecko 1.9, el motor de renderizado de Firefox 3. Si tu extensión utiliza cualquiera de estas interfaces, deberás actualizar tu código:</p>
<ul>
<li><code>nsIDOMPaintListener</code></li>
<li><code>nsIDOMScrollListener</code></li>
<li><code>nsIDOMMutationListener</code></li>
<li><code>nsIDOMPageTransitionListener</code></li>
<li><code>nsICloseAllWindows</code> (Lee el {{ Bug(386200) }})</li>
</ul>
<h3 id="4to_paso:_Buscar_cambios_importantes_a_chrome" name="4to_paso:_Buscar_cambios_importantes_a_chrome">Paso 4: Comprueba los cambios importantes en el chrome</h3>
<p>Se ha producido un cambio menor en el chrome que puede requerir cambios en tu código. Se ha añadido un nuevo <code>vbox</code> llamado "browser-bottombox", que integra la barra de búsqueda y la barra de estado en la parte inferior de la ventana del navegador. Aunque esto no afecta la apariencia de la pantalla, puede que afecte tu extensión si el chrome se superpone, en relación a los elementos descriptos.</p>
<p>Por ejemplo, si has superpuesto algún elemento del chrome antes de la barra de estado de la siguiente manera:</p>
<pre><window id="main-window">
<something insertbefore="status-bar" />
</window>
</pre>
<p>Debes cambiar tu código a algo que se parezca a:</p>
<pre><vbox id="browser-bottombox">
<something insertbefore="status-bar" />
</vbox>
</pre>
<p>O bien, emplear la siguiente técnica para hacer que la superposición funcione en Firefox 2 y Firefox 3 por igual:</p>
<pre><window id="main-window">
<vbox id="browser-bottombox" insertbefore="status-bar">
<something insertbefore="status-bar" />
<vbox>
</window>
</pre>
<p>{{ Note("Este cambio es efectivo para Firefox 3 beta 4 y la prebeta 4.") }}</p>
<h4 id="Otros_cambios" name="Otros_cambios">Otros cambios</h4>
<p><em>Añade aquí cambios sencillos que debas realizar cuando actualizas tu extensión para que funcione con Firefox 3</em><em>.</em></p>
<ul>
<li>Por razones de seguridad, se ha dejado de implementar <code><a class="external" rel="freelink">chrome://browser/base/utilityOverlay.js</a></code>. Si lo estabas usando, deberás cambiarlo por <code><a class="external" rel="freelink">chrome://browser/content/utilityOverlay.js</a></code>.</li>
<li>Para implementar <span class="lang lang-es"><code><a class="new" href="../../../../es/nsIAboutModule" rel="internal">nsIAboutModule</a></code></span> ahora debes incluir el método <code>getURIFlags</code>. Visita <span class="lang lang-en"><a class="external" href="http://mxr.mozilla.org/mozilla-central/source/netwerk/protocol/about/public/nsIAboutModule.idl" rel="external nofollow" title="http://mxr.mozilla.org/mozilla-central/source/netwerk/protocol/about/public/nsIAboutModule.idl">nsIAboutModule.idl</a></span> para consultar la documentación. Esto afecta a las extensiones que brinden nuevas URIs del tipo <code>about:</code>. ( <span class="lang lang-*"><a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=337746" rel="external nofollow" title="https://bugzilla.mozilla.org/show_bug.cgi?id=337746">bug 337746</a> </span>)</li>
<li>El elemento <span class="lang lang-*"><a href="../../../../en/XUL/tabbrowser" rel="internal">tabbrowser</a></span> ya no forma parte del "conjunto de herramientas" ( <span class="lang lang-es"><a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=339964" rel="external nofollow" title="https://bugzilla.mozilla.org/show_bug.cgi?id=339964">bug 339964</a> </span>). Esto significa que este elemento ya no está disponible en aplicaciones y extensiones XUL. Este elemento sigue siendo parte de la ventana principal de Firefox (browser.xul).</li>
<li>Es necesario documentar los cambios en <a class="new" href="../../../../es/NsISupports_proxies" rel="internal">nsISupports proxies</a> <a class="external" href="http://groups.google.com/group/mozilla.dev.platform/browse_thread/thread/78236a4b312a2de4/939240fc3f5123a8?lnk=st&rnum=1#939240fc3f5123a8" rel="external nofollow" title="http://groups.google.com/group/mozilla.dev.platform/browse_thread/thread/78236a4b312a2de4/939240fc3f5123a8?lnk=st&rnum=1#939240fc3f5123a8">[1]</a> y posiblemente, también aquellos relacionados con el procesamiento de interfaces.</li>
<li>Si utilizas instrucciones de proceso XML, como por ejemplo <code><?xml-stylesheet ?></code> en tus archivos XUL, ten en cuenta los cambios descriptos en el <span class="lang lang-es"><a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=319654" rel="external nofollow" title="https://bugzilla.mozilla.org/show_bug.cgi?id=319654">bug 319654</a> </span>:
<ol>
<li>Se han añadido los XML PIs al DOM del documento XUL. Esto significa que no se garantiza que <span class="lang lang-*"><code><a href="../../../../en/DOM/document.firstChild" rel="internal">document.firstChild</a></code></span> sea el elemento raíz. Si necesitas hacer referencia al documento raíz en tu script, usa <span class="lang lang-*"><code><a href="../../../../en/DOM/document.documentElement" rel="internal">document.documentElement</a></code></span> en su lugar.</li>
<li>Las instrucciones de procesamiento <code><?xml-stylesheet ?></code> y <code><?xul-overlay ?></code> ahora no tienen efecto fuera del prólogo del documento.</li>
</ol>
</li>
<li>Cuando se carga contenido web (es decir, se carga la página en el navegador) no se inicia <code>window.addEventListener("load", myFunc, true)</code>. Esto ocurre debido a que el <span class="lang lang-es"><a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=296639" rel="external nofollow" title="https://bugzilla.mozilla.org/show_bug.cgi?id=296639">bug 296639</a> </span>cambia la forma de comunicación entre las ventanas internas y externas. Para corregir esto en forma sencilla, emplea <code>gBrowser.addEventListener("load", myFunc, true)</code>, según se describe <a class="new" href="../../../../es/Code_snippets/Tabbed_browser#Detecting_page_load" rel="internal">aquí</a>. Además, funciona también para Firefox 2.</li>
<li><code>content.window.getSelection()</code> ofrece un objeto (que puede ser convertido en cadena con <code>toString()</code>). Se desaconseja el uso de <code>content.document.getSelection()</code> que devuelve una cadena.</li>
<li>A partir de Firefox 2, se desaconsejó el uso de <code>event.preventBubble()</code> y actualmente, ha desaparecido en Firefox 3. En su lugar, usa <a class="new" href="../../../../es/DOM/event.stopPropagation" rel="internal"><code>event.stopPropagation()</code></a>, que también funciona en Firefox 2.</li>
<li>Los contadores de tiempo que se inician usando <code>setTimeout()</code> ahora están bloqueados por las ventanas en modo 'modal' gracias a la corrección hecha en el <span class="lang lang-es"><a class="link-https" href="https://bugzilla.mozilla.org/show_bug.cgi?id=52209" rel="external nofollow" title="https://bugzilla.mozilla.org/show_bug.cgi?id=52209">bug 52209</a> </span>. En su lugar, podrías usar <code>nsITimer</code>.</li>
<li>Si en tu extensión necesitas permitir una fuente no fiable (un sitio web, por ejemplo) para acceder al chrome de la extensión, debes usar el nuevo flag <a class="new" href="../../../../es/Chrome_Registration#contentaccessible" rel="internal"><code>contentaccessible</code> flag</a>.</li>
</ul>
|