PrestaShop Administração & Produtividade

DataFirefly Fix Dropzone CORS: Correção do Tainted Canvas em Multiloja no PrestaShop 8

A correção definitiva do erro «tainted canvas» no editor de produto em multiloja com vários domínios.

Se está em PrestaShop 8 em multiloja com vários domínios diferentes (loja-pt.com, loja-es.com, etc.), é provável que já tenha visto este erro na consola do navegador ao editar uma ficha de produto: SecurityError: tainted canvas. O formulário de imagens parte-se, a pré-visualização do Dropzone deixa de aparecer e fica bloqueado. É um erro conhecido do PrestaShop: as imagens são servidas de outro domínio, o canvas fica cross-origin e o getImageData rebenta. O DataFirefly Fix Dropzone CORS resolve o problema com um monkey patch ao Dropzone do lado do cliente: os URL das imagens existentes são reescritos para o domínio do back-office antes do carregamento, o canvas mantém-se limpo e o editor funciona. Instalar, ativar e o erro desaparece. Sem configuração, sem tabelas e com 70 linhas de JavaScript.

PrestaShop 8.0+ Multiloja com vários domínios Correção nativa Sem configuração 1 ficheiro JS Sem base de dados
  • Reembolso em 30 dias
  • 12 meses de atualizações
  • Suporte em 24h
www.datafirefly.com/pt/
Correção do erro tainted canvas do Dropzone em multiloja no PrestaShop 8
v1.0.0 · atualizado 2026-05-01
O que faz

A versão curta.

01

Resolve o erro tainted canvas em multiloja

Se o seu back-office está aberto em loja-pt.com e edita um produto atribuído a loja-es.com, as imagens vêm de loja-es.com, ficam cross-origin, o canvas fica tainted e surge o SecurityError. A correção reescreve os URL das imagens para o domínio atual do back-office antes de o Dropzone as carregar.

02

Monkey patch elegante e mínimo

O módulo reescreve Dropzone.prototype.displayExistingFile uma única vez no arranque, para intercetar os URL cross-origin. Sem polling, sem listeners permanentes e sem sobrecarga: o patch é invisível depois de instalado e não tem impacto mensurável no desempenho do back-office.

03

Pegada zero e sem configuração

O ficheiro JS do módulo é carregado apenas nos controladores de produto AdminProducts (legado) e admin_products_v2 (Symfony). O resto do back-office não é afetado. Sem base de dados e sem parâmetros a definir.

04

Sem mexer no core

Sem alterações ao core do PrestaShop, às miniaturas ou ao sistema de imagens. A correção atua apenas no navegador, sobre o Dropzone. Se o PrestaShop corrigir o erro de origem numa atualização futura, o módulo continua sem efeitos negativos (o patch é idempotente).

A versão longa

Tudo o que quer saber antes de instalar.

Uma análise detalhada de como o DataFirefly Fix Dropzone CORS: Correção do Tainted Canvas em Multiloja no PrestaShop 8 funciona, porque o construímos assim e o raciocínio por trás das funcionalidades acima.

§ 01

O erro, em claro

Está em PrestaShop 8 em multiloja, com vários domínios diferentes, por exemplo loja-pt.com para Portugal e loja-es.com para Espanha, cada um com o seu certificado HTTPS. Abre o back-office a partir de loja-pt.com e clica num produto associado à loja espanhola. As imagens desse produto são servidas a partir de loja-es.com, porque é o domínio canónico dessa loja. Para o navegador, isso é um recurso cross-origin e, como as imagens nativas do PrestaShop não enviam os cabeçalhos CORS certos (Access-Control-Allow-Origin), o canvas que gera a pré-visualização do Dropzone fica «tainted». Na chamada seguinte a ctx.getImageData, o navegador lança um SecurityError, o editor Dropzone parte e o formulário de produto fica inutilizável na zona de imagens. Erro na consola: main.bundle.js:274 Uncaught SecurityError: Failed to execute 'getImageData' on 'CanvasRenderingContext2D': The canvas has been tainted by cross-origin data. at main.bundle.js:274:137430 at L (main.bundle.js:274:137535) at main.bundle.js:274:123939 at o (main.bundle.js:274:123147) at l.onload (main.bundle.js:274:123297)

§ 02

Porque é que este erro é real e importante

Muitas lojas com vários domínios convivem há muito com este erro, evitando editar entre domínios (ligando-se sempre ao domínio «certo» de cada produto). Mas, numa equipa a sério, com o catálogo gerido por uma única pessoa e várias lojas internacionais, isso é insustentável. O PrestaShop tem uma correção oficial no Dropzone.vue em certas versões do novo editor Symfony, mas o erro persiste no editor antigo AdminProducts e nem sempre é retroportado para as versões estáveis. Este módulo resolve o problema nos dois editores ao mesmo tempo.

§ 03

Como funciona a correção, tecnicamente

Ao carregar uma página de produto do back-office, o módulo injeta um ficheiro JS de 70 linhas no cabeçalho, pelo hook displayBackOfficeHeader. O script espera que window.Dropzone esteja definido e substitui depois Dropzone.prototype.displayExistingFile por uma versão intercetada. Essa versão examina o URL recebido: se for cross-origin, analisa-o com new URL(url), força u.protocol e u.host aos de window.location.origin, recompõe o URL e passa-o ao método original. Resultado no navegador: o Dropzone recebe um URL da mesma origem, o canvas mantém-se limpo, o getImageData funciona e a imagem existente aparece normalmente na zona de arrastar e largar. O patch é idempotente (um sinalizador __dfCorsPatched impede a dupla aplicação) e à prova de falhas (URL inválidos voltam ao comportamento original).

§ 04

Porquê não um patch ao core ou um override

Um override do PrestaShop no controlador de produto seria frágil: partiria a cada atualização importante, e o código do Dropzone não está no controlador PHP. Uma alteração direta ao ficheiro JS do Dropzone seria substituída a cada atualização. O monkey patch do lado do cliente é totalmente não invasivo: nenhum ficheiro do PrestaShop é alterado, nenhum override é colocado e o patch aplica-se em tempo de execução, a partir de fora. Se o PrestaShop atualizar o Dropzone ou a sua integração, o patch continua a funcionar enquanto a assinatura de displayExistingFile não mudar (o que é extremamente estável desde o Dropzone 5.x). Se o método mudar ou se o PrestaShop corrigir de origem, pode desinstalar o módulo sem qualquer vestígio.

§ 05

Casos de utilização

Loja multipaís com um domínio por mercado (loja-pt.com, loja-es.com, loja-fr.com) gerida por uma equipa centralizada: o erro bloqueia a edição de produtos entre domínios e o módulo resolve de imediato. Marketplace ou rede de marcas em multiloja com vários domínios: mesma configuração, mesma solução. Agência que gere várias lojas de clientes em domínios distintos: o módulo torna o back-office utilizável sem andar a saltar de domínio em domínio. Migração de loja única para vários domínios: instalado preventivamente, evita a má surpresa depois da migração.