Configuração Inicial e Parâmetros de Linha de Comando
Para configurar o comportamento do Chromium Embedded Framework (DCEF3) logo na inicialização, utilizamos o evento CefOnBeforeCommandLineProcessing. Este ponto é crucial para definir permissões de segurança, suporte a plugins e configurações de rede.
procedure ConfigurarParametrosCef(const ProcessType: ustring; const CommandLine: ICefCommandLine);
begin
// Ativa o suporte ao Flash Player instalado no sistema
CommandLine.AppendSwitch('--enable-system-flash');
// Desativa políticas de mesma origem (útil para testes de integração JS)
CommandLine.AppendSwitch('--disable-web-security');
// Ignora configurações de proxy
CommandLine.AppendSwitch('no-proxy-server');
// Otimização: Um processo por site
CommandLine.AppendSwitch('--process-per-site');
end;
// No código de inicialização do projeto (.dpr)
begin
CefCache := 'cache_dados';
CefLocale := 'pt-BR';
CefOnBeforeCommandLineProcessing := ConfigurarParametrosCef;
CefSingleProcess := False; // Multi-processo é o recomendado para produção
if not CefLoadLibDefault then
Exit;
Application.Initialize;
Application.CreateForm(TFormPrincipal, FormPrincipal);
Application.Run;
end.
Extensão de Métodos JavaScript com RTTI
O DCEF3 permite expor classes Delphi diretamente para o motor V8 do JavaScript. Isso é feito através do registro de extensões RTTI no manipulador de processo de renderização.
type
TAppExtension = class
class function ObterVersao: string;
class procedure DispararEvento(const Dados: string);
end;
TCustomRenderHandler = class(TCefRenderProcessHandlerOwn)
protected
procedure OnWebKitInitialized; override;
end;
procedure TCustomRenderHandler.OnWebKitInitialized;
begin
// Registra a classe Delphi sob o namespace 'hostApp' no JavaScript
TCefRTTIExtension.Register('hostApp', TAppExtension);
end;
class procedure TAppExtension.DispararEvento(const Dados: string);
var
Msg: ICefProcessMessage;
begin
// Cria uma mensagem para comunicação entre processos (IPC)
Msg := TCefProcessMessageRef.New('EventoCustomizado');
Msg.ArgumentList.SetString(0, Dados);
// Envia a mensagem do processo de renderização para o processo do browser
TCefv8ContextRef.Current.Browser.SendProcessMessage(PID_BROWSER, Msg);
end;
class function TAppExtension.ObterVersao: string;
begin
Result := '1.0.0.0';
end;
Execução de JavaScript a partir do Delphi
Para interagir com a página carregada, o componente permite a execução direta de scripts através do frame principal do navegador.
procedure TFormPrincipal.BtnExecutarScriptClick(Sender: TObject);
begin
if ChromiumBrowser.Browser <> nil then
begin
ChromiumBrowser.Browser.MainFrame.ExecuteJavaScript(
'console.log("Comando enviado pelo Delphi");',
'about:blank',
0
);
end;
end;
Gestão de Processos: Debug vs. Release
A escolha entre o modo de processo único (SingleProcess) e multi-processo impacta diretamente a estabilidade e a facilidade de depuração:
- Modo SingleProcess (CefSingleProcess := True): Recomendado apenas para depuração técnica. Facilita o rastreamento de breakpoints, pois o código do Browser e do Renderer rodam na mesma thread. No entanto, é instável e frequentemente causa violações de acesso ao chamar
CefShutdown. - Modo Multi-Processo (CefSingleProcess := False): É o padrão para versões de produção (Release). Oferece maior isolamento e estabilidade. Neste modo, o
CefShutdownencerra corretamente os processos auxiliares e a aplicação libera a memória de forma limpa.
Nota técnica: Em ambientes de desenvolvimento, o modo multi-processo pode dificultar a depuração de funções dentro do RenderProcessHandler, pois o debugger do Delphi não se anexa automaticamente aos processos filhos criados pelo Chromium.