SlideShare uma empresa Scribd logo
1 de 28
Baixar para ler offline
Desenvolvendo Extensões
                        para o Google Chrome
                         Sérgio Vilar
                         Desenvolvedor de Interfaces, Redesoft




terça-feira, 29 de janeiro de 13
Introdução a extensões




terça-feira, 29 de janeiro de 13
O que são extensões
             • Programas que incrementam funcionalidades ao Google Chrome
             • São escritas em HTML, CSS e Javascript
             • Se integram ao navegador fazendo uso da API de extensões
             • Rodam em processos separados




terça-feira, 29 de janeiro de 13
O que uma extensão pode fazer?
             • Consultar dados de serviços externos via XMLHttpRequest (permissão
                 necessária no manifest.json)

             • Modificar uma página, adicionar ou remover elementos
             • Detectar eventos causados pelo usuário (click, hover, load, etc)




terça-feira, 29 de janeiro de 13
Interação com o usuário
             • Browser Action
                 A extensão é acessível o tempo inteiro

             • Page Action
                 A extensão é acessível apenas sob determinadas condições

             • Background Tasks
                 A extensão roda em plano de fundo e não fica visível para o usuário




terça-feira, 29 de janeiro de 13
Browser Action
             • A extensão fica visível na forma
                 de um botão na barra de
                 extensões e pode ser
                 visualizada/acessada a qualquer
                 momento.

             • Pode-se adicionar uma popup
                 que abre quando o botão da
                 extensão for acionado




terça-feira, 29 de janeiro de 13
Page Action
             • A extensão fica visível na forma
                 de um ícone na barra de
                 endereços

             • O Ícone da extensão só é visível
                 se atender algumas condições

             • No exemplo ao lado, o ícone só
                 é visível quando página possui
                 um endereço para um Feed




terça-feira, 29 de janeiro de 13
Background Tasks
             • A extensão roda em background e não fica visível para o usuário, uma
                 Background Page é automaticamente criada.




terça-feira, 29 de janeiro de 13
Construindo uma extensão




terça-feira, 29 de janeiro de 13
Componentes de uma extensão
             • manifest.json
             • background.htm
             • Content Scripts (todo o seu Javascript)
             • Assets (CSS, Imagens, etc)




terça-feira, 29 de janeiro de 13
manifest.json
             • Arquivo de configuração da extensão
             • Definição de nome da extensão, descrição, ícones, etc.
             • Especifica a Background Page, Content Scripts, Actions, etc.
             • Permissões para XMLHttpRequest
             • Este arquivo é obrigatório e caso tenha algum erro de sintaxe, a
                 extensão não será carregada




terça-feira, 29 de janeiro de 13
manifest.json
             Exemplo:

                  {
                    "name": "Grooveshark Keyboard Shortcuts",
                    "description": "Use the F7, F8 and F9 keys to play, pause, advance
                  and return your songs on Grooveshark",
                    "version": "1.1",
                    "background": {
                       "scripts": ["jquery.js", "background.js"]
                    },
                    "permissions": [
                       "tabs", "http://*/*", "https://*/*"
                    ],
                    "manifest_version": 2,
                    "icons" : {
                       "48" : "icon-48.png",
                       "128" : "icon-128.png"
                    }
                  }




terça-feira, 29 de janeiro de 13
background.htm
             • Uma extensão pode ter apenas uma Background Page
             • A Background Page estará rodando enquanto o Google Chrome estiver
                 aberto

             • Uma extensão que possua Content Scripts, terá automaticamente uma
                 Background Page




terça-feira, 29 de janeiro de 13
Content Scripts
             • Arquivos Javascript onde se concentra toda a lógica da sua extensão
             • Você pode incluir jQuery nos Content Scripts (OH YEAH!!)
             • Podem acessar o objeto DOM da página
             • São usados para acessar a API de Extensões do Google Chrome




terça-feira, 29 de janeiro de 13
APIs




terça-feira, 29 de janeiro de 13
APIs
             • chrome.extension.*
             • chrome.tabs.*
             • chrome.bookmarks*
             • chrome.windows*
             • etc...




terça-feira, 29 de janeiro de 13
APIs Assíncronas
             • 80% das APIs de extensão do Google Chrome são Assíncronas, isso
                 quer dizer que você quase sempre deve usar uma função de retorno:



                    chrome.tabs.query({windowType : 'normal'}, function(tabs){

                    !        $(tabs).each(function(i, item){

                    !        !     if(strpos(item.title, "Grooveshark")){
                    !        !     ! tab = item;! ! ! !
                    !        !     }

                    !        });

                    !        chrome.tabs.executeScript(tab.id, {file: "jquery.js"})
                    !        chrome.tabs.executeScript(tab.id, {file: "play.js"})

                    });




terça-feira, 29 de janeiro de 13
Message Passing
             • Permite a comunicação entre Content Scripts, Background Page, etc




                              Background Page        Content Scripts




terça-feira, 29 de janeiro de 13
Estudo de caso
                        Grooveshark Keyboard Shortcuts




terça-feira, 29 de janeiro de 13
Grooveshark Keyboard Shortcuts

             • Extensão que dá ao usuário a
                 possibilidade de pausar, avançar e
                 retroceder as músicas do
                 Grooveshark através das teclas F7,
                 F8 e F9




terça-feira, 29 de janeiro de 13
Arquivos que compõem a extensão
             • manifest.json
             • jquery.js
             • inject.js
             • background.js
             • play.js, next.js e prev.js




terça-feira, 29 de janeiro de 13
Workflow da extensão




                                                inject.js




                                             background.js




                                   prev.js      play.js      next.js



terça-feira, 29 de janeiro de 13
Workflow da extensão: inject.js
             • Possui uma instância carregada em cada página do navegador
             • Quando detecta uma das teclas de atalho, envia uma mensagem para o
                 background.js




terça-feira, 29 de janeiro de 13
Workflow da extensão




                                                inject.js




                                             background.js




                                   prev.js      play.js      next.js



terça-feira, 29 de janeiro de 13
Workflow da extensão: background.js
             • Recebe a mensagem do inject.js e identifica a aba na qual o Grooveshark
                 está aberto

             • Insere o arquivo correspodente (next.js, play.js ou prev.js) na aba na qual o
                 Grooveshark está aberto




terça-feira, 29 de janeiro de 13
Workflow da extensão




                                                inject.js




                                             background.js




                                   prev.js      play.js      next.js



terça-feira, 29 de janeiro de 13
next.js, play.js e prev.js
             • Ao ser inserido numa aba, aciona o botão correspondente para pausar,
                 avançar ou retroceder




terça-feira, 29 de janeiro de 13
É isso aí, até a próxima!
                       vilar@me.com
                       http://about.me/vilar
                       http://slideshare.net/sergiovilar
                       http://github.com/sergiovilar




terça-feira, 29 de janeiro de 13

Mais conteúdo relacionado

Destaque

Sistema operativo google chrome os
Sistema operativo google chrome osSistema operativo google chrome os
Sistema operativo google chrome osKevin Melgar
 
Sistema operativo google chrome os
Sistema operativo google chrome osSistema operativo google chrome os
Sistema operativo google chrome osChristian Sanchez
 
Sistema Operativo Google Chrome OS
Sistema Operativo Google Chrome OSSistema Operativo Google Chrome OS
Sistema Operativo Google Chrome OSaleceles
 
Catalogue Aspirateur centralisé ZCV
Catalogue Aspirateur centralisé ZCV Catalogue Aspirateur centralisé ZCV
Catalogue Aspirateur centralisé ZCV Homexity
 
Tutorial google chrome
Tutorial google chromeTutorial google chrome
Tutorial google chromeFabiola López
 
Planification de la gestion et de l’entretien d’infrastructures à...
Planification de la gestion et de l’entretien d’infrastructures à...Planification de la gestion et de l’entretien d’infrastructures à...
Planification de la gestion et de l’entretien d’infrastructures à...VisionGÉOMATIQUE2012
 
Case 580 k_schema_hydraulique
Case 580 k_schema_hydrauliqueCase 580 k_schema_hydraulique
Case 580 k_schema_hydrauliqueelmandoub
 
Le contrôle des Petites Installations d’Assainissement
Le contrôle des Petites Installations d’AssainissementLe contrôle des Petites Installations d’Assainissement
Le contrôle des Petites Installations d’Assainissementidealconnaissances
 
Assainissement du sol_epfl
Assainissement du sol_epflAssainissement du sol_epfl
Assainissement du sol_epfltchamouz
 
Litiges et contentieux entre les acteurs de l’ANC, causes récurrentes et cons...
Litiges et contentieux entre les acteurs de l’ANC, causes récurrentes et cons...Litiges et contentieux entre les acteurs de l’ANC, causes récurrentes et cons...
Litiges et contentieux entre les acteurs de l’ANC, causes récurrentes et cons...idealconnaissances
 
Desenvolvimento inteligente com Google Chrome DevTools
Desenvolvimento inteligente com Google Chrome DevToolsDesenvolvimento inteligente com Google Chrome DevTools
Desenvolvimento inteligente com Google Chrome DevToolsFábio Assunção
 
Avaliação Heurística dos Principais Navegadores
Avaliação Heurística dos Principais NavegadoresAvaliação Heurística dos Principais Navegadores
Avaliação Heurística dos Principais NavegadoresAllan Denis
 
Developing_Browsers_Extensions
Developing_Browsers_ExtensionsDeveloping_Browsers_Extensions
Developing_Browsers_ExtensionsGabriel Godoy
 
Leather Tanning
Leather TanningLeather Tanning
Leather Tanningsblack0206
 

Destaque (20)

Sistema operativo google chrome os
Sistema operativo google chrome osSistema operativo google chrome os
Sistema operativo google chrome os
 
Sistema operativo google chrome os
Sistema operativo google chrome osSistema operativo google chrome os
Sistema operativo google chrome os
 
1 google chrome presentación para ttt (méxico)
1 google chrome   presentación para ttt (méxico)1 google chrome   presentación para ttt (méxico)
1 google chrome presentación para ttt (méxico)
 
En 20 minutos ... Chrome Developer Tools
En 20 minutos ... Chrome Developer ToolsEn 20 minutos ... Chrome Developer Tools
En 20 minutos ... Chrome Developer Tools
 
Google chrome OS
Google chrome OS Google chrome OS
Google chrome OS
 
Google chrome os
Google chrome osGoogle chrome os
Google chrome os
 
Sistema Operativo Google Chrome OS
Sistema Operativo Google Chrome OSSistema Operativo Google Chrome OS
Sistema Operativo Google Chrome OS
 
Sonaca : La collaboration Universités-Entreprises
Sonaca : La collaboration Universités-EntreprisesSonaca : La collaboration Universités-Entreprises
Sonaca : La collaboration Universités-Entreprises
 
Catalogue Aspirateur centralisé ZCV
Catalogue Aspirateur centralisé ZCV Catalogue Aspirateur centralisé ZCV
Catalogue Aspirateur centralisé ZCV
 
Tutorial google chrome
Tutorial google chromeTutorial google chrome
Tutorial google chrome
 
Planification de la gestion et de l’entretien d’infrastructures à...
Planification de la gestion et de l’entretien d’infrastructures à...Planification de la gestion et de l’entretien d’infrastructures à...
Planification de la gestion et de l’entretien d’infrastructures à...
 
Case 580 k_schema_hydraulique
Case 580 k_schema_hydrauliqueCase 580 k_schema_hydraulique
Case 580 k_schema_hydraulique
 
Le contrôle des Petites Installations d’Assainissement
Le contrôle des Petites Installations d’AssainissementLe contrôle des Petites Installations d’Assainissement
Le contrôle des Petites Installations d’Assainissement
 
Assainissement du sol_epfl
Assainissement du sol_epflAssainissement du sol_epfl
Assainissement du sol_epfl
 
Litiges et contentieux entre les acteurs de l’ANC, causes récurrentes et cons...
Litiges et contentieux entre les acteurs de l’ANC, causes récurrentes et cons...Litiges et contentieux entre les acteurs de l’ANC, causes récurrentes et cons...
Litiges et contentieux entre les acteurs de l’ANC, causes récurrentes et cons...
 
Desenvolvimento inteligente com Google Chrome DevTools
Desenvolvimento inteligente com Google Chrome DevToolsDesenvolvimento inteligente com Google Chrome DevTools
Desenvolvimento inteligente com Google Chrome DevTools
 
Avaliação Heurística dos Principais Navegadores
Avaliação Heurística dos Principais NavegadoresAvaliação Heurística dos Principais Navegadores
Avaliação Heurística dos Principais Navegadores
 
Developing_Browsers_Extensions
Developing_Browsers_ExtensionsDeveloping_Browsers_Extensions
Developing_Browsers_Extensions
 
Leather Tanning
Leather TanningLeather Tanning
Leather Tanning
 
Chrome for Work | CLOUDPILOTS FastTrack Update
Chrome for Work | CLOUDPILOTS FastTrack UpdateChrome for Work | CLOUDPILOTS FastTrack Update
Chrome for Work | CLOUDPILOTS FastTrack Update
 

Semelhante a Desenvolvendo Chrome Extensões em

PHP, Gearman e Memcache
PHP, Gearman e MemcachePHP, Gearman e Memcache
PHP, Gearman e MemcacheAndre Golvea
 
Firefox os campusparty
Firefox os campuspartyFirefox os campusparty
Firefox os campuspartyFábio Magnoni
 
Introdução básica aos Navegadores de Internet
Introdução básica aos Navegadores de InternetIntrodução básica aos Navegadores de Internet
Introdução básica aos Navegadores de InternetClayton de Almeida Souza
 
Plone total#2 - Gerenciamento de conteúdos
Plone total#2 - Gerenciamento de conteúdosPlone total#2 - Gerenciamento de conteúdos
Plone total#2 - Gerenciamento de conteúdosLucas Aquino
 
Ao infinito e além com PHP memcached e Gearman
Ao infinito e além com PHP memcached e GearmanAo infinito e além com PHP memcached e Gearman
Ao infinito e além com PHP memcached e GearmanElton Minetto
 
App Web Escalaveis Fisl
App Web Escalaveis FislApp Web Escalaveis Fisl
App Web Escalaveis FislElton Minetto
 
Mozilla Firefox
Mozilla FirefoxMozilla Firefox
Mozilla Firefoxjuewesley
 
20101213164657 info inss_todos_data_29_11_10
20101213164657 info inss_todos_data_29_11_1020101213164657 info inss_todos_data_29_11_10
20101213164657 info inss_todos_data_29_11_10Patricia Munhoz
 
Flex e acessibilidade. Sim, é possível!
Flex e acessibilidade. Sim, é possível!Flex e acessibilidade. Sim, é possível!
Flex e acessibilidade. Sim, é possível!Odair Seixas
 
Programação Concorrente - Aula 02
Programação Concorrente - Aula 02Programação Concorrente - Aula 02
Programação Concorrente - Aula 02thomasdacosta
 
Tutorial visão automação de testes e casper js
Tutorial visão automação de testes e casper jsTutorial visão automação de testes e casper js
Tutorial visão automação de testes e casper js4ALL Tests
 
Tutorial - Visão sobre Automação de Testes com CasperJS
Tutorial - Visão sobre Automação de Testes com CasperJSTutorial - Visão sobre Automação de Testes com CasperJS
Tutorial - Visão sobre Automação de Testes com CasperJSFrederico Allan
 
Chrome dev tools google io extended 2016
Chrome dev tools   google io extended 2016Chrome dev tools   google io extended 2016
Chrome dev tools google io extended 2016Diego Melo
 
Softblue logic-ide
Softblue logic-ideSoftblue logic-ide
Softblue logic-idemateusvini
 
Joomla!: uma visão geral
Joomla!: uma visão geralJoomla!: uma visão geral
Joomla!: uma visão geralMarcelo Andrade
 
04 sistemas operacionais
04   sistemas operacionais04   sistemas operacionais
04 sistemas operacionaismorgannaprata
 
Ferramentas eformador
Ferramentas eformadorFerramentas eformador
Ferramentas eformadorHenrique Melo
 

Semelhante a Desenvolvendo Chrome Extensões em (20)

PHP, Gearman e Memcache
PHP, Gearman e MemcachePHP, Gearman e Memcache
PHP, Gearman e Memcache
 
Firefox os campusparty
Firefox os campuspartyFirefox os campusparty
Firefox os campusparty
 
Introdução básica aos Navegadores de Internet
Introdução básica aos Navegadores de InternetIntrodução básica aos Navegadores de Internet
Introdução básica aos Navegadores de Internet
 
Plone total#2 - Gerenciamento de conteúdos
Plone total#2 - Gerenciamento de conteúdosPlone total#2 - Gerenciamento de conteúdos
Plone total#2 - Gerenciamento de conteúdos
 
Ao infinito e além com PHP memcached e Gearman
Ao infinito e além com PHP memcached e GearmanAo infinito e além com PHP memcached e Gearman
Ao infinito e além com PHP memcached e Gearman
 
App Web Escalaveis Fisl
App Web Escalaveis FislApp Web Escalaveis Fisl
App Web Escalaveis Fisl
 
Mozilla Firefox
Mozilla FirefoxMozilla Firefox
Mozilla Firefox
 
20101213164657 info inss_todos_data_29_11_10
20101213164657 info inss_todos_data_29_11_1020101213164657 info inss_todos_data_29_11_10
20101213164657 info inss_todos_data_29_11_10
 
Flex e acessibilidade. Sim, é possível!
Flex e acessibilidade. Sim, é possível!Flex e acessibilidade. Sim, é possível!
Flex e acessibilidade. Sim, é possível!
 
Instalação de Servidor de Arquivo
Instalação de Servidor de ArquivoInstalação de Servidor de Arquivo
Instalação de Servidor de Arquivo
 
Aula pf 24.04.17
Aula pf 24.04.17Aula pf 24.04.17
Aula pf 24.04.17
 
Programação Concorrente - Aula 02
Programação Concorrente - Aula 02Programação Concorrente - Aula 02
Programação Concorrente - Aula 02
 
Tutorial visão automação de testes e casper js
Tutorial visão automação de testes e casper jsTutorial visão automação de testes e casper js
Tutorial visão automação de testes e casper js
 
Tutorial - Visão sobre Automação de Testes com CasperJS
Tutorial - Visão sobre Automação de Testes com CasperJSTutorial - Visão sobre Automação de Testes com CasperJS
Tutorial - Visão sobre Automação de Testes com CasperJS
 
Chrome dev tools google io extended 2016
Chrome dev tools   google io extended 2016Chrome dev tools   google io extended 2016
Chrome dev tools google io extended 2016
 
Softblue logic-ide
Softblue logic-ideSoftblue logic-ide
Softblue logic-ide
 
Joomla!: uma visão geral
Joomla!: uma visão geralJoomla!: uma visão geral
Joomla!: uma visão geral
 
04 sistemas operacionais
04   sistemas operacionais04   sistemas operacionais
04 sistemas operacionais
 
Web 3.0
Web 3.0Web 3.0
Web 3.0
 
Ferramentas eformador
Ferramentas eformadorFerramentas eformador
Ferramentas eformador
 

Desenvolvendo Chrome Extensões em

  • 1. Desenvolvendo Extensões para o Google Chrome Sérgio Vilar Desenvolvedor de Interfaces, Redesoft terça-feira, 29 de janeiro de 13
  • 3. O que são extensões • Programas que incrementam funcionalidades ao Google Chrome • São escritas em HTML, CSS e Javascript • Se integram ao navegador fazendo uso da API de extensões • Rodam em processos separados terça-feira, 29 de janeiro de 13
  • 4. O que uma extensão pode fazer? • Consultar dados de serviços externos via XMLHttpRequest (permissão necessária no manifest.json) • Modificar uma página, adicionar ou remover elementos • Detectar eventos causados pelo usuário (click, hover, load, etc) terça-feira, 29 de janeiro de 13
  • 5. Interação com o usuário • Browser Action A extensão é acessível o tempo inteiro • Page Action A extensão é acessível apenas sob determinadas condições • Background Tasks A extensão roda em plano de fundo e não fica visível para o usuário terça-feira, 29 de janeiro de 13
  • 6. Browser Action • A extensão fica visível na forma de um botão na barra de extensões e pode ser visualizada/acessada a qualquer momento. • Pode-se adicionar uma popup que abre quando o botão da extensão for acionado terça-feira, 29 de janeiro de 13
  • 7. Page Action • A extensão fica visível na forma de um ícone na barra de endereços • O Ícone da extensão só é visível se atender algumas condições • No exemplo ao lado, o ícone só é visível quando página possui um endereço para um Feed terça-feira, 29 de janeiro de 13
  • 8. Background Tasks • A extensão roda em background e não fica visível para o usuário, uma Background Page é automaticamente criada. terça-feira, 29 de janeiro de 13
  • 10. Componentes de uma extensão • manifest.json • background.htm • Content Scripts (todo o seu Javascript) • Assets (CSS, Imagens, etc) terça-feira, 29 de janeiro de 13
  • 11. manifest.json • Arquivo de configuração da extensão • Definição de nome da extensão, descrição, ícones, etc. • Especifica a Background Page, Content Scripts, Actions, etc. • Permissões para XMLHttpRequest • Este arquivo é obrigatório e caso tenha algum erro de sintaxe, a extensão não será carregada terça-feira, 29 de janeiro de 13
  • 12. manifest.json Exemplo: { "name": "Grooveshark Keyboard Shortcuts", "description": "Use the F7, F8 and F9 keys to play, pause, advance and return your songs on Grooveshark", "version": "1.1", "background": { "scripts": ["jquery.js", "background.js"] }, "permissions": [ "tabs", "http://*/*", "https://*/*" ], "manifest_version": 2, "icons" : { "48" : "icon-48.png", "128" : "icon-128.png" } } terça-feira, 29 de janeiro de 13
  • 13. background.htm • Uma extensão pode ter apenas uma Background Page • A Background Page estará rodando enquanto o Google Chrome estiver aberto • Uma extensão que possua Content Scripts, terá automaticamente uma Background Page terça-feira, 29 de janeiro de 13
  • 14. Content Scripts • Arquivos Javascript onde se concentra toda a lógica da sua extensão • Você pode incluir jQuery nos Content Scripts (OH YEAH!!) • Podem acessar o objeto DOM da página • São usados para acessar a API de Extensões do Google Chrome terça-feira, 29 de janeiro de 13
  • 15. APIs terça-feira, 29 de janeiro de 13
  • 16. APIs • chrome.extension.* • chrome.tabs.* • chrome.bookmarks* • chrome.windows* • etc... terça-feira, 29 de janeiro de 13
  • 17. APIs Assíncronas • 80% das APIs de extensão do Google Chrome são Assíncronas, isso quer dizer que você quase sempre deve usar uma função de retorno: chrome.tabs.query({windowType : 'normal'}, function(tabs){ ! $(tabs).each(function(i, item){ ! ! if(strpos(item.title, "Grooveshark")){ ! ! ! tab = item;! ! ! ! ! ! } ! }); ! chrome.tabs.executeScript(tab.id, {file: "jquery.js"}) ! chrome.tabs.executeScript(tab.id, {file: "play.js"}) }); terça-feira, 29 de janeiro de 13
  • 18. Message Passing • Permite a comunicação entre Content Scripts, Background Page, etc Background Page Content Scripts terça-feira, 29 de janeiro de 13
  • 19. Estudo de caso Grooveshark Keyboard Shortcuts terça-feira, 29 de janeiro de 13
  • 20. Grooveshark Keyboard Shortcuts • Extensão que dá ao usuário a possibilidade de pausar, avançar e retroceder as músicas do Grooveshark através das teclas F7, F8 e F9 terça-feira, 29 de janeiro de 13
  • 21. Arquivos que compõem a extensão • manifest.json • jquery.js • inject.js • background.js • play.js, next.js e prev.js terça-feira, 29 de janeiro de 13
  • 22. Workflow da extensão inject.js background.js prev.js play.js next.js terça-feira, 29 de janeiro de 13
  • 23. Workflow da extensão: inject.js • Possui uma instância carregada em cada página do navegador • Quando detecta uma das teclas de atalho, envia uma mensagem para o background.js terça-feira, 29 de janeiro de 13
  • 24. Workflow da extensão inject.js background.js prev.js play.js next.js terça-feira, 29 de janeiro de 13
  • 25. Workflow da extensão: background.js • Recebe a mensagem do inject.js e identifica a aba na qual o Grooveshark está aberto • Insere o arquivo correspodente (next.js, play.js ou prev.js) na aba na qual o Grooveshark está aberto terça-feira, 29 de janeiro de 13
  • 26. Workflow da extensão inject.js background.js prev.js play.js next.js terça-feira, 29 de janeiro de 13
  • 27. next.js, play.js e prev.js • Ao ser inserido numa aba, aciona o botão correspondente para pausar, avançar ou retroceder terça-feira, 29 de janeiro de 13
  • 28. É isso aí, até a próxima! vilar@me.com http://about.me/vilar http://slideshare.net/sergiovilar http://github.com/sergiovilar terça-feira, 29 de janeiro de 13