Atualizando extensões para o Firefox 3.5

  • Revision slug: Atualizando_extensões_para_o_Firefox_3.5
  • Revision title: Atualizando_extensões_para_o_Firefox_3.5
  • Revision id: 274479
  • Created:
  • Creator: Verruckt
  • Is current revision? Não
  • コメント 180 words added, 63 words removed

Revision Content

{{ fx_minversion_header("3") }}

Este artigo proporciona informação útil para desenvolvedores tentando atualizar suas extensões para trabalharem corretamente no Firefox 3.5.

Atualizações básicas

Esta seção cobre o básico do que você necessita fazer sempre que você atualiza uma extensão para uma nova versão do Firefox.

Teste sua extensão

Começe editando o arquivo install.rdf da sua extensão, atualizando maxVersion para 3.5b4 (if you're testing on Firefox 3.5 beta 4), e aumente a versão da sua extensão.

Crie então um novo perfil no Firefox, para que os testes não coloquem em risco seu perfil usual. Navegue até o diretório contendo Firefox, e então digite o comando:

firefox -createProfile testBeta4

No Mac, você precisa navegar por todo o caminho da bundle aplicação Firefox:

cd /Applications/Firefox.app/Contents/MacOS/
firefox -createProfile testBeta4

Inicie o Firefox usando o novo perfil digitando este comando na linha de comeando:

firefox -P testBeta4

Teste a sua extensão cuidadosamente. Nós sugerimos que você configure as seguintes preferências para verdadeiro (true) com a finalidade de ser alertado para qualquer advertência ou exceção do JavaScript:

  • javascript.options.strict
  • javascript.options.showInConsole

Atualize sua extensão

Se você encontrar algum problema durante o teste, atualize seu código para corrigir os problemas. Este artigo contém informação sobre coisas que podem requisitar algum trabalho.

Uma vez que tenha feito isto, tente usar sua extensão novamente, desta vez com o perfil normal. Isto ajudará a assegurar a compatibilidade com qualquer dado existente salvo.

Atualize sua extensão em addons.mozilla.org

Finalmente, é hora de lançar sua extensão atualizada. Se a sua extensão não necessita de qualquer mudança no código, você pode simplesmente conectar-se ao painel AMO e atualizar a compatibilidade da versão por ali. Caso contrário será necessário enviar uma nova versão para o AMO.

Veja Submitting an add-on to AMO (EN) para informações adicionais.

Acessando o banco de dados do Places

Antes do Firefox 3.5, acessar o banco de dados do Places diretamente usando a API de Armazenamento (Storage API (EN)) requeria alguns truques:

var places = Components.classes["@mozilla.org/file/directory_service;1"].
                        getService(Components.interfaces.nsIProperties).
                        get("ProfD", Components.interfaces.nsIFile);
places.append("places.sqlite");
var db = Components.classes["@mozilla.org/storage/service;1"].
                    getService(Components.interfaces.mozIStorageService).openDatabase(places);

Isto constrói um caminho manual para o arquivo do banco de dados places.sqlite database, então abre o arquivo para o acesso ao armazenamento.

O Firefox 3.5 adiciona um serviço dedicado que oferece uma maneira mais conveniente para acessar o banco de dados do Places; a técnica a seguir não funciona no Firefox 3.5 ou anteriores.

var db = Components.classes["@mozilla.org/browser/nav-history-service;1"].
                    getService(Components.interfaces.nsPIPlacesDatabase).DBConnection;

Caixas de texto de Pesquisa

O tipo de caixa de texto (textbox (EN)) timed está depreciado; ao invés disso, você deve usar search.

No Firefox 3, você pode ter usado:

<textbox type="timed" timeout="1000" oncommand="alert(this.value);"/>

No Firefox 3.5, você deve mudar para:

<textbox type="search" timeout="1000" oncommand="alert(this.value);"/>

JSON

O módulo JavaScript JSON.jsm foi removido no Firefox 3.5 em favor do suporte nativo ao objeto JSON. Para detalhes, veja Using JSON in Firefox (EN) e o artigo em JSON (EN) para uma introdução mais geral sobre o JSON e como usá-lo em várias versões do Firefox.

Para assegurar a compatibilidade com o Firefox 3 e Firefox 3.5, você pode fazer o que segue:

if (typeof(JSON) == "undefined") {
  Components.utils.import("resource://gre/modules/JSON.jsm");
  JSON.parse = JSON.fromString;
  JSON.stringify = JSON.toString;
}

Isto funciona importando o módulo JavaScript JSON.jsm se o JSON não for suportado nativamente, mapeando então os métodos proporcionados por este módulo aos usados nativamente no JSON, então as mesmas chamadas funcinam.

Você pode também contornar este problema usando a interface {{ interface("nsIJSON") }} diretamente.

Mudanças nos menus de contexto

Com o objetivo de suportar as novas características de áudio e vídeo adicionadas ao Gecko 1.9.1, a classe de nsContextMenu foi renomeada de imageURL para mediaURL; entretanto, imageURL foi adicionado novamente em 9 de junho de, 2009.

Mudanças no registro chrome

O Firefox 3.5 corrige falhas de segurança que tornam possível o uso remoto do chrome. Isto afetará qualquer complemento que inclua recursos em seu arquivo chrome.manifest que referencie a um web site, dados ou urls de recursos. Veja Security changes in Firefox 3.5 (EN) para detalhes.

Conseguindo um contexto carregado através de requisição

Anteriormente, era possível conseguir um contexto carregado a partir de uma requisição por consulta a várias APIs docShell. Uma maneira correta e confiável de fazer isso é usar um {{ interface("nsILoadContext") }}.

Com o C++, você pode fazer como mostrado abaixo:

nsCOMPtr<nsILoadContext> loadContext;
nsCOMPtr<nsIChannel> channel = do_QueryInterface(aRequest);
NS_QueryNotificationCallbacks(channel, loadContext);

Com o JavaScript, você pode fazer desta maneira:

var loadContext;
try {
  loadContext = 
    aRequest.queryInterface(Components.interfaces.nsIChannel)
            .notificationCallbacks
            .getInterface(Components.interfaces.nsILoadContext);
} catch (ex) {
  try {
    loadContext =
      aRequest.loadGroup.notificationCallbacks
              .getInterface(Components.interfaces.nsILoadContext);
  } catch (ex) {
    loadContext = null;
  }
}

Barra de ferramentas customizável

No Firefox 3.5, o comportamento da barra de ferramentas customizável mudou, tal que o vínculo <xul:toolbar/> agora remove itens da barra de ferramentas do seu associado <xul:toolbarpalette/> e os adiciona na barra de ferramentas, ao invés de cloná-los e copiá-os para a barra de ferramentas. Isto significa que a paleta conterá agora somente itens não presentes na barra de ferramentas, ao contrário do comportamento anterior de conter todos os elementos, customizáveis ou não, exibidos na barra de ferramentas. Isto pode causar problemas para complementos dependendo da possibilidade de recuperar os itens da barra de ferramentas customizável através de <xul:toolbarpalette/>, ou de tentar dinamicamente inserir itens na paleta para torná-la disponível durante a customização da barra de ferramentas. Mais informações está disponível em {{ Bug("407725") }} e {{ Bug("467045") }}.

XPCNativeWrapper

Iniciando o Firefox 3.5, você não pode mais usar data: you can no longer use data: bindings em pacotes chromeque possuem automatização XPCNativeWrapper. Isto resolve um potencial problema de segurança.

Documentos XUL agora tem o tratamento XPCNativeWrapper, então você agora precisa usar o método getAttribute() para buscar valores de atributo ao invés de simplesmente lê-los diretamente.

Se a sua extensão está usando xpcnativewrappers=no (o que não deveria ser feito em primeiro lugar, uma vez que não é seguro fazê-lo), o XBL desta extensão não será aplicado a documentos que estejam usando automatização XPCNativeWrapper, começando no Firefox 3.5.

Novas características interessantes

"Listening" eventos em todas as abas

O Firefox 3.5 adicionou suporte para a adição e remoção de listeners que listen em todas as abas. Veja Listening to events on all tabs (EN) para detalhes.

Para desenvolvedores de temas:

  • Cheque Theme changes in Firefox 3.1 (EN).
  • Acesse o fórum Mozillazine Theme changes for FF3.1 (EN) para uma introdução/listagem de todas as mudanças entre o Firefox 3.0 e 3.5 que trazem impactos para os desenvolvedores. Isto diz respeito às novas características do CSS (como nth-child, -moz-box-shadow, etc), mudanças para widgets existentes, todas as melhorias da UI (User Interface - Interface do Usuário) e novas características do FF3.5 (suporte de áudio/vídeo, navegação privada, restauração de sessão extendida, sombras de caixas/janelas/textos).

 

Revision Source

<p>{{ fx_minversion_header("3") }}</p>
<p>Este artigo proporciona informação útil para desenvolvedores tentando atualizar suas extensões para trabalharem corretamente no Firefox 3.5.<strong><br>
</strong></p>
<h2 id="Atualiza.C3.A7.C3.B5es_b.C3.A1sicas">Atualizações básicas</h2>
<p>Esta seção cobre o básico do que você necessita fazer sempre que você atualiza uma extensão para uma nova versão do Firefox.</p>
<h3 id="Teste_sua_extens.C3.A3o">Teste sua extensão</h3>
<p>Começe editando o arquivo <code>install.rdf</code> da sua extensão, atualizando maxVersion para 3.5b4 (if you're testing on Firefox 3.5 beta 4), e aumente a versão da sua extensão.<br>
<br>
Crie então um novo perfil no Firefox, para que os testes não coloquem em risco seu perfil usual. Navegue até o diretório contendo Firefox, e então digite o comando:</p>
<pre>firefox -createProfile testBeta4
</pre>
<p>No Mac, você precisa navegar por todo o caminho da <strong>bundle</strong> aplicação Firefox:</p>
<pre>cd /Applications/Firefox.app/Contents/MacOS/
firefox -createProfile testBeta4
</pre>
<p>Inicie o Firefox usando o novo perfil digitando este comando na linha de comeando:</p>
<pre>firefox -P testBeta4
</pre>
<p>Teste a sua extensão cuidadosamente. Nós sugerimos que você configure as seguintes preferências para verdadeiro (true) com a finalidade de ser alertado para qualquer advertência ou exceção do JavaScript:</p>
<ul> <li><code>javascript.options.strict</code></li> <li><code>javascript.options.showInConsole</code></li>
</ul>
<h3 id="Atualize_sua_extens.C3.A3o">Atualize sua extensão</h3>
<p>Se você encontrar algum problema durante o teste, atualize seu código para corrigir os problemas. Este artigo contém informação sobre coisas que podem requisitar algum trabalho.<br>
<br>
Uma vez que tenha feito isto, tente usar sua extensão novamente, desta vez com o perfil normal. Isto ajudará a assegurar a compatibilidade com qualquer dado existente salvo.</p>
<h3 id="Atualize_sua_extens.C3.A3o_em_addons.mozilla.org">Atualize sua extensão em addons.mozilla.org</h3>
<p>Finalmente, é hora de lançar sua extensão atualizada. Se a sua extensão não necessita de qualquer mudança no código, você pode simplesmente conectar-se ao painel AMO e atualizar a compatibilidade da versão por ali. Caso contrário será necessário enviar uma nova versão para o AMO.<br>
<br>
Veja <a class="internal" href="/en/Submitting_an_add-on_to_AMO" title="En/Submitting an add-on to AMO">Submitting an add-on to AMO</a> (EN) para informações adicionais.</p>
<h2 id="Acessando_o_banco_de_dados_do_Places">Acessando o banco de dados do Places</h2>
<p>Antes do Firefox 3.5, acessar o banco de dados do Places diretamente usando a API de Armazenamento (<a class="internal" href="/en/Storage" title="En/Storage">Storage API</a> (EN)) requeria alguns truques:</p>
<pre class="brush: js">var places = Components.classes["@mozilla.org/file/directory_service;1"].
                        getService(Components.interfaces.nsIProperties).
                        get("ProfD", Components.interfaces.nsIFile);
places.append("places.sqlite");
var db = Components.classes["@mozilla.org/storage/service;1"].
                    getService(Components.interfaces.mozIStorageService).openDatabase(places);
</pre>
<p>Isto constrói um caminho manual para o arquivo do banco de dados <code>places.sqlite</code> database, então abre o arquivo para o acesso ao armazenamento.</p>
<p>O Firefox 3.5 adiciona um serviço dedicado que oferece uma maneira mais conveniente para acessar o banco de dados do Places; a técnica a seguir não funciona no Firefox 3.5 ou anteriores.</p>
<pre class="brush: js">var db = Components.classes["@mozilla.org/browser/nav-history-service;1"].
                    getService(Components.interfaces.nsPIPlacesDatabase).DBConnection;
</pre>
<h2 id="Caixas_de_texto_de_Pesquisa">Caixas de texto de Pesquisa</h2>
<p>O tipo de caixa de texto (<a class="internal" href="/en/XUL/textbox" title="En/XUL/Textbox"><code>textbox</code></a> (EN)) <code>timed</code> está depreciado; ao invés disso, você deve usar <code>search</code>.</p>
<p>No Firefox 3, você pode ter usado:</p>
<pre>&lt;textbox type="timed" timeout="1000" oncommand="alert(this.value);"/&gt;
</pre>
<p>No Firefox 3.5, você deve mudar para:</p>
<pre>&lt;textbox type="search" timeout="1000" oncommand="alert(this.value);"/&gt;
</pre>
<h2 id="JSON">JSON</h2>
<p>O módulo JavaScript JSON.jsm foi removido no Firefox 3.5 em favor do suporte nativo ao objeto JSON. Para detalhes, veja <a class="internal" href="/En/Using_native_JSON" title="/en/Using JSON in Firefox">Using JSON in Firefox</a> (EN) e o artigo em <a class="internal" href="/en/JSON" title="En/JSON">JSON</a> (EN) para uma introdução mais geral sobre o JSON e como usá-lo em várias versões do Firefox.</p>
<p>Para assegurar a compatibilidade com o Firefox 3 e Firefox 3.5, você pode fazer o que segue:</p>
<pre class="brush: js">if (typeof(JSON) == "undefined") {
  Components.utils.import("resource://gre/modules/JSON.jsm");
  JSON.parse = JSON.fromString;
  JSON.stringify = JSON.toString;
}
</pre>
<p>Isto funciona importando o módulo JavaScript JSON.jsm se o JSON não for suportado nativamente, mapeando então os métodos proporcionados por este módulo aos usados nativamente no JSON, então as mesmas chamadas funcinam.</p>
<p>Você pode também contornar este problema usando a interface {{ interface("nsIJSON") }} diretamente.</p>
<h2 id="Mudan.C3.A7as_nos_menus_de_contexto">Mudanças nos menus de contexto</h2>
<p>Com o objetivo de suportar as novas características de áudio e vídeo adicionadas ao Gecko 1.9.1, a classe de <code>nsContextMenu</code> foi renomeada de <code>imageURL</code> para <code>mediaURL</code>; entretanto, <code>imageURL</code> foi adicionado novamente em 9 de junho de, 2009.</p>
<h2 id="Mudan.C3.A7as_no_registro_chrome">Mudanças no registro chrome</h2>
<p>O Firefox 3.5 corrige falhas de segurança que tornam possível o uso remoto do chrome. Isto afetará qualquer complemento que inclua recursos em seu arquivo <code>chrome.manifest</code> que referencie a um web site, dados ou urls de recursos. Veja <a class="internal" href="/En/Security_changes_in_Firefox_3.5" title="En/Security changes in Firefox 3.5">Security changes in Firefox 3.5</a> (EN) para detalhes.</p>
<h2 id="Conseguindo_um_contexto_carregado_atrav.C3.A9s_de_requisi.C3.A7.C3.A3o">Conseguindo um contexto carregado através de requisição</h2>
<p>Anteriormente, era possível conseguir um contexto carregado a partir de uma requisição por consulta a várias APIs docShell. Uma maneira correta e confiável de fazer isso é usar um {{ interface("nsILoadContext") }}.</p>
<p>Com o C++, você pode fazer como mostrado abaixo:</p>
<pre class="brush: cpp">nsCOMPtr&lt;nsILoadContext&gt; loadContext;
nsCOMPtr&lt;nsIChannel&gt; channel = do_QueryInterface(aRequest);
NS_QueryNotificationCallbacks(channel, loadContext);
</pre>
<p>Com o JavaScript, você pode fazer desta maneira:</p>
<pre class="brush: js">var loadContext;
try {
  loadContext = 
    aRequest.queryInterface(Components.interfaces.nsIChannel)
            .notificationCallbacks
            .getInterface(Components.interfaces.nsILoadContext);
} catch (ex) {
  try {
    loadContext =
      aRequest.loadGroup.notificationCallbacks
              .getInterface(Components.interfaces.nsILoadContext);
  } catch (ex) {
    loadContext = null;
  }
}
</pre>
<h2 id="Barra_de_ferramentas_customiz.C3.A1vel">Barra de ferramentas customizável</h2>
<p>No Firefox 3.5, o comportamento da barra de ferramentas customizável mudou, tal que o vínculo<code> &lt;xul:toolbar/&gt; <span style="font-family: Verdana,Tahoma,sans-serif;">agora remove itens da barra de ferramentas do seu associado</span></code> <code>&lt;xul:toolbarpalette/&gt;</code> e os adiciona na barra de ferramentas, ao invés de cloná-los e copiá-os para a barra de ferramentas. Isto significa que a paleta conterá agora somente itens não presentes na barra de ferramentas, ao contrário do comportamento anterior de conter todos os elementos, customizáveis ou não, exibidos na barra de ferramentas. Isto pode causar problemas para complementos dependendo da possibilidade de recuperar os itens da barra de ferramentas customizável através de <code>&lt;xul:toolbarpalette/&gt;</code>, ou de tentar dinamicamente inserir itens na paleta para torná-la disponível durante a customização da barra de ferramentas. Mais informações está disponível em {{ Bug("407725") }} e {{ Bug("467045") }}.</p>
<h2 id="XPCNativeWrapper">XPCNativeWrapper</h2>
<p>Iniciando o Firefox 3.5, você não pode mais usar <code><span style="font-family: Verdana,Tahoma,sans-serif;">data</span>:</code> you can no longer use <code>data:</code> <strong>bindings</strong> em pacotes chromeque possuem automatização <code>XPCNativeWrapper</code>. Isto resolve um potencial problema de segurança.</p>
<p>Documentos XUL agora tem o tratamento <code>XPCNativeWrapper</code>, então você agora precisa usar o método <code>getAttribute()</code> para buscar valores de atributo ao invés de simplesmente lê-los diretamente.</p>
<p>Se a sua extensão está usando <code>xpcnativewrappers=no</code> (o que não deveria ser feito em primeiro lugar, uma vez que não é seguro fazê-lo), o XBL desta extensão não será aplicado a documentos que estejam usando automatização <code>XPCNativeWrapper</code>, começando no Firefox 3.5.</p>
<h2 id="Novas_caracter.C3.ADsticas_interessantes">Novas características interessantes</h2>
<h3 id='"Listening"_eventos_em_todas_as_abas'>"Listening" eventos em todas as abas</h3>
<p>O Firefox 3.5 adicionou suporte para a adição e remoção de <em>listeners</em> que <em>listen</em> em todas as abas. Veja <a class="internal" href="/En/Listening_to_events_on_all_tabs" title="en/Listening to events on all tabs">Listening to events on all tabs</a> (EN) para detalhes.</p>
<h2 id="Para_desenvolvedores_de_temas:">Para desenvolvedores de temas:</h2>
<ul> <li>Cheque <a class="internal" href="../../../../En/Theme_changes_in_Firefox_3.1" rel="internal">Theme changes in Firefox 3.1</a> (EN).</li> <li>Acesse o fórum Mozillazine <a class="topictitle external" href="http://forums.mozillazine.org/viewtopic.php?f=18&amp;t=665138" title="http://forums.mozillazine.org/viewtopic.php?f=18&amp;t=665138">Theme changes for FF3.1</a> (EN) para uma introdução/listagem de todas as mudanças entre o Firefox 3.0 e 3.5 que trazem impactos para os desenvolvedores. Isto diz respeito às novas características do CSS (como nth-child, -moz-box-shadow, etc), mudanças para <em>widgets</em> existentes, todas as melhorias da UI (<em>User Interface</em> - Interface do Usuário) e novas características do FF3.5 (suporte de áudio/vídeo, navegação privada, restauração de sessão extendida, sombras de caixas/janelas/textos).</li>
</ul>
<p> </p>
Revert to this revision