Desenvolvimento com DCEF3 no Delphi: Configurações e Integração JavaScript

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 CefShutdown encerra 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.

Tags: delphi dcef3 chromium-embedded-framework Pascal v8-engine

Publicado em 6-26 04:08