<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.multitheftauto.com/wiki/PT-BR/Tutorial_CEF?action=history&amp;feed=atom</id>
	<title>PT-BR/Tutorial CEF - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.multitheftauto.com/wiki/PT-BR/Tutorial_CEF?action=history&amp;feed=atom"/>
	<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=PT-BR/Tutorial_CEF&amp;action=history"/>
	<updated>2026-05-01T03:10:40Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=PT-BR/Tutorial_CEF&amp;diff=69034&amp;oldid=prev</id>
		<title>Cristiano Cardoso: [+] tradução para Tutorial CEF (navegador)</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=PT-BR/Tutorial_CEF&amp;diff=69034&amp;oldid=prev"/>
		<updated>2021-02-16T22:03:32Z</updated>

		<summary type="html">&lt;p&gt;[+] tradução para Tutorial CEF (navegador)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Esta página possui uma breve introdução ao CEF.&lt;br /&gt;
&lt;br /&gt;
=O que é CEF?=&lt;br /&gt;
CEF é um acrônimo para '''C'''hromium '''E'''mbedded '''F'''ramework. Consiste em um ''framework'' para embutir navegadores baseados no Chromium em outras aplicações, neste caso, o MTA. CEF é construido a partir do projeto Chromium mantido pela Google, este por sua vez consiste em um motor web rápido, estável e seguro. É possível encontrar mais informações sobre o CEF em sua página do GoogleCode: https://bitbucket.org/chromiumembedded/cef&lt;br /&gt;
&lt;br /&gt;
=Conceitos Básicos=&lt;br /&gt;
Criar uma nova instância do navegador é bem simples. Segue o exemplo para abrir a página do Youtube:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Criar um novo navegador remoto (seu tamanho é 800x600px), com transparência habilitada&lt;br /&gt;
local browser = createBrowser(800, 600, true, true)&lt;br /&gt;
&lt;br /&gt;
-- Aguardar pelo navegador (isso é necessário porque o CEF roda em uma thread separada, portanto é necessário adotar o sistema de eventos assíncronos)&lt;br /&gt;
addEventHandler(&amp;quot;onClientBrowserCreated&amp;quot;, browser,&lt;br /&gt;
    function()&lt;br /&gt;
        -- Agora é possível carregar a URL (o &amp;quot;source&amp;quot; desse evento é o navegador que foi criado)&lt;br /&gt;
        loadBrowserURL(source, &amp;quot;https://youtube.com/&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Este exemplo não requer solicitação de domínio já que o Youtube está na lista de domínios autorizados do MTA.&lt;br /&gt;
&lt;br /&gt;
=Sistema de Requisição de Domínios=&lt;br /&gt;
De modo a prevenir abuso quanto as possibilidades que o CEF oferece, decidiu-se introduzir um sistema de controle. Isso significa que domínios desconhecidos não serão carregados automaticamente caso não cumprir com pelo menos uma das exigências a seguir:&lt;br /&gt;
* estar incluso na lista mantida pelo time de desenvolvimento do MTA&lt;br /&gt;
* ser autorizado pelo usuário após a chamada via ''script'' da função &amp;lt;code&amp;gt;requestBrowserDomains/Browser.requestDomains&amp;lt;/code&amp;gt;&lt;br /&gt;
* estar incluso na lista de domínios permitidos do usuário, esta disponível em: Configurações do MTA &amp;amp;rarr; Aba: Navegador &amp;amp;rarr; ''Whitelist''&lt;br /&gt;
&lt;br /&gt;
Alguns domínios são conhecidos por conter conteúdo malicioso, portanto há uma chance desse estar na lista proibida - esta gerenciada automaticamente pelo MTA. Neste caso, nenhuma das alternativas citadas acima funcionará, portanto, todas as solicitações a ele serão negadas. Não há nada que o usuário ou o desenvolvedor possa fazer. Caso haja algum engano, é sugerido contatar nosso time de suporte.&lt;br /&gt;
&lt;br /&gt;
=Modo remoto versus local=&lt;br /&gt;
Existem dois modos que o CEF pode rodar:&lt;br /&gt;
&lt;br /&gt;
1. Modo local:&lt;br /&gt;
* é possível executar código em Javascript sem restrição (vide: [[executeBrowserJavascript]])&lt;br /&gt;
* é possível carregar sítios hospedados somente na pasta &amp;lt;code&amp;gt;resource&amp;lt;/code&amp;gt;&lt;br /&gt;
* ''não'' é permitido carregar conteúdo remoto (e.g. www.mtasa.com)&lt;br /&gt;
&lt;br /&gt;
2. Modo remoto:&lt;br /&gt;
* ''não'' é permitido executar código em Javascript&lt;br /&gt;
* é permitido carregar somente conteúdo remoto&lt;br /&gt;
* lembre-se que o usuário pode desabilitar o carregamento de ''websites'' remotos ou a execução de Javascript nas configurações&lt;br /&gt;
&lt;br /&gt;
Vale ressaltar que não é possível mudar o modo do navegador após sua criação devido a limitações técnicas.&lt;br /&gt;
&lt;br /&gt;
=Gerenciamento de Recursos=&lt;br /&gt;
==Como carregar arquivos HTML locais==&lt;br /&gt;
Carregar um arquivo HTML local funciona de forma similar a carregar imagens.&lt;br /&gt;
&lt;br /&gt;
Adicione o caminho para o arquivo HTML no &amp;lt;code&amp;gt;meta.xml&amp;lt;/code&amp;gt; usando a seguinte tag:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;file src=&amp;quot;html/minhaInterface.html&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Como carregar arquivos locais dentro do HTML==&lt;br /&gt;
Suponha que seja necessário carregar uma imagem ou reproduzir um vídeo que foi incluso no seu pacote do MTA. Isso é possível através de um URI específico no formato: '''''&amp;quot;http://mta/&amp;quot;'''''&lt;br /&gt;
&lt;br /&gt;
===Exemplo===&lt;br /&gt;
Este exemplo mostra como reproduzir um vídeo. Note que é necessário habilitar programação orientada a objeto.&lt;br /&gt;
====Lua====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Cria um navegador (modo local também é obrigatório para acessar arquivos locais)&lt;br /&gt;
local janelaNavegador = Browser(640, 480, true, true)&lt;br /&gt;
&lt;br /&gt;
addEventHandler(&amp;quot;onClientBrowserCreated&amp;quot;, janelaNavegador,&lt;br /&gt;
     function()&lt;br /&gt;
          -- Carregar interface em HTML&lt;br /&gt;
          janelaNavegador:loadURL(&amp;quot;http://mta/local/html/meuVideo.html&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
     end&lt;br /&gt;
)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
====meta.xml====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;file src=&amp;quot;html/meuVideo.html&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;file src=&amp;quot;midia/meuVideo.webm&amp;quot;/&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
====HTML====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!DOCTYPE HTML&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;video width=&amp;quot;640&amp;quot; height=&amp;quot;480&amp;quot; controls&amp;gt;&lt;br /&gt;
         &amp;lt;!-- todo arquivo local deve ter o prefixo http://mta/local --&amp;gt;&lt;br /&gt;
         &amp;lt;source src=&amp;quot;http://mta/local/midia/meuVideo.webm&amp;quot; type=&amp;quot;video/webm&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/video&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Comunicação bidirecional entre Lua e JS=&lt;br /&gt;
A comunicação entre Lua e Javascript (JS) está somente disponível no modo local devido à razões de segurança.&lt;br /&gt;
&lt;br /&gt;
==Lua para JS==&lt;br /&gt;
É possível chamar código em Javascript a partir do Lua usando a função [[executeBrowserJavascript]].&lt;br /&gt;
&lt;br /&gt;
Os links a seguir contém mais detalhes de como isso é implementado:&lt;br /&gt;
* https://github.com/Jusonex/mtasa_cef_tools/blob/master/webui/src/WebWindow.lua#L180-189&lt;br /&gt;
* https://github.com/Jusonex/mtasa_cef_tools/blob/master/webui/src/mtaevents.js#L9-L15&lt;br /&gt;
&lt;br /&gt;
==JS para Lua==&lt;br /&gt;
É possível adicionar um evento-cliente no Javascript usando a função ''triggerEvent'' a qual é parte da classe estática ''mta''.&lt;br /&gt;
Segue a sintaxe:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
mta.triggerEvent(string evento, var parametro1, var parametro2, var parametro3, ...)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
A fonte (variável &amp;quot;source&amp;quot;) desse evento é sempre o elemento navegador que acionou este evento.&lt;br /&gt;
&lt;br /&gt;
Estão disponíveis exemplos nos seguintes links:&lt;br /&gt;
* https://github.com/Jusonex/mtasa_cef_tools/blob/master/webui/examples/html/ui2.html#L66&lt;br /&gt;
* https://github.com/Jusonex/mtasa_cef_tools/blob/master/webui/examples/Main.lua#L35-L40&lt;br /&gt;
&lt;br /&gt;
=Depuração=&lt;br /&gt;
O modo ''desenvolvedor'' pode ser habilitado da seguinte forma (digite no console após pressionar F8):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;start runcode&lt;br /&gt;
crun setDevelopmentMode(true, true)&lt;br /&gt;
debugscript 3&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Agora é possível visualizar os erros no navegador e os domínios/URLs bloqueados na janela de depuração no canto inferior da tela.&lt;br /&gt;
&lt;br /&gt;
=Pontos de atenção=&lt;br /&gt;
Importante lembrar que nem todas os recursos de um navegador recente estão disponíveis nos computadores de seus usuários. Um exemplo disso é o '''WebGL'''.&lt;br /&gt;
&lt;br /&gt;
'''Adobe Flash''' também é um recurso problemático. É um complemento habilitado por padrão, porém deve ser evitado porque é possível desabilita-lo nas configurações. Além disso, o Flash, por ser uma tecnologia defasada, não oferece muitas oportunidades para o desenvolvimento de funcionalidades que atendam às expectativas do usuário. Mais especificamente, o flash roda em um processo separado que está limitado a uma interface antiga (aquele dos anos 2010), o qual o desenvolvedor possui pouco controle sob ela. A alternativa recomendada é o ''HTML5'', porque além de ser amplamente adotada, possui uma ótima API para reprodução de áudio/vídeo (http://www.w3schools.com/tags/ref_av_dom.asp). Até mesmo há suporte a áudio 3D.&lt;br /&gt;
&lt;br /&gt;
=Uso Avançado=&lt;br /&gt;
Como a implementação do CEF não contempla o ''z-ordering'' por padrão, é necessária uma implementação própria. A especificação sobre esse mecanismo pode ser encontrada em: https://github.com/Jusonex/mtasa_cef_tools&lt;br /&gt;
Há também algumas funções auxiliares para integrar essas classes facilmente com sua própria interface usando OOP. Será também criado um tutorial de como usar o CEF com o CEGUI.&lt;br /&gt;
&lt;br /&gt;
=Desempenho=&lt;br /&gt;
Criar várias instâncias de navegador não afeta o MTA diretamente porque o CEF roda em um processo distinto. Porém, devido a limitações técnicas, o MTA necessita de uma cópia dos dados de texturas na ''thread'' principal do GTA.&lt;br /&gt;
&lt;br /&gt;
Caso não seja necessário manter o navegador visível, é recomendado encerra-lo para economizar recursos. Porém, caso ainda seja importante deixar o navegador rodando (e.g. manter o estado da página), é possível otimizar o desempenho desabilitando a renderização da página via [[setBrowserRenderingPaused]]. Isso faz com que o CEF pare de atualizar novos quadros e o MTA também irá pausar a cópia de textura.&lt;br /&gt;
&lt;br /&gt;
=Solução de Problemas=&lt;br /&gt;
===google.com não funciona===&lt;br /&gt;
Por padrão, ao acessar o endereço &amp;lt;code&amp;gt;google.com&amp;lt;/code&amp;gt;, o usuário é redirecionado para um site filial específico dependendo do país em que está. No Brasil, por exemplo, o internauta é transferido para o &amp;lt;code&amp;gt;google.com.br&amp;lt;/code&amp;gt;. É possível contornar esse problema ao acessar o seguinte endereço: https://www.google.com/ncr.&lt;br /&gt;
&lt;br /&gt;
=Funções de Scripting=&lt;br /&gt;
{{CEF_functions}}&lt;br /&gt;
=Eventos de Scripting=&lt;br /&gt;
{{CEF_events}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]]&lt;br /&gt;
&lt;br /&gt;
[[en:CEF_Tutorial]]&lt;/div&gt;</summary>
		<author><name>Cristiano Cardoso</name></author>
	</entry>
</feed>