O sistema de IPC (Inter-Process Communication) legado do Chrome, centralizado no diretório //ipc, foi substituído pelo Mojo. A migração de mensagens legadas para o Mojo é essencial para a modernização da infraestrutura do navegador, garantindo maior escalabilidade e isolamento.
Abordagem de Migração
A arquitetura legada baseava-se em um único canal (FIFO) entre processos, o que frequentemente resultava em dependências de ordenação implícitas e acoplamento excessivo. Ao converter para Mojo, o objetivo principal é a decomposição em serviços independentes ou interfaces isoladas.
1. Transição para Serviços
Sempre que possível, mensagens devem ser movidas para serviços definidos em //services. Isso promove o desacoplamento e permite o versionamento claro das interfaces públicas.
2. Interfaces Independentes vs. Associadas
Por padrão, conexões Mojo operam de forma independente. Se a ordenação das mensagens for crítica — algo comum em navegação e frames —, deve-se utilizar interfacse associadas (Channel-associated interfaces), que preservam a ordem FIFO em relação ao canal legado durante o período de transição.
Exemplo Prático: Definição de Interface
Para migrar um sistema simples de decodificação, defina a interface em um arquivo .mojom:
module processamento.mojom;
interface Decodificador {
Executar(array<uint8> dados) => (int32 status, array<uint8> resultado);
};
A implementação no lado do servidor deve registrar o binder correspondente:
class DecodificadorImpl : public processamento::mojom::Decodificador {
public:
static void CriarBinding(processamento::mojom::DecodificadorRequest request) {
mojo::MakeStrongBinding(std::make_unique<DecodificadorImpl>(), std::move(request));
}
void Executar(const std::vector<uint8_t>& dados, ExecutarCallback callback) override {
// Lógica de decodificação
}
};
Uso do Connector
O Connector é a peça fundamental para interações entre serviços. Em processos de renderização, utilize o ServiceManagerConnection para estabelecer a conexão:
processamento::mojom::DecodificadorPtr decodificador;
content::RenderThread::Get()->GetConnector()->BindInterface(
"nome_do_servico", &decodificador);
decodificador->Executar(dados_brutos, base::BindOnce(&OnResultado));
Tratamento de Tipos Nativos
Caso precise reutilizar estruturas C++ existentes sem redefini-las no Mojo, utilize o atributo [Native]:
[Native]
struct EstruturaComplexa;
O mapeamento deve ser configurado via arquivo .typemap, apontando para os traits de serialização legados (IPC::ParamTraits). Isso permite que a estrutura seja transmitida pelo Mojo utilizando a lógica de serialização já existente, minimizando riscos durante a migração.