Angular.js: Problema de $ localização para urls decodificados e não codificados

Criado em 11 jul. 2017  ·  4Comentários  ·  Fonte: angular/angular.js

Estou enviando um ...

  • [x] relatório de bug
  • [] solicitação de recurso
  • [] outro (por favor, não envie solicitações de suporte aqui (veja acima))

Comportamento atual:

Oi, pessoal.
Após uma discussão em um PR que criei para corrigir um erro no serviço $ location para url que contém apóstrofos @gkalpak, observe que apóstrofos em potencial em url não são o problema principal, em vez disso, o problema é usar urls decodificados e não decodificados.

veja o PR para mais detalhes. https://github.com/angular/angular.js/pull/16098

Esperado / novo comportamento:
url não decodificado e decodificado deve funcionar usando o serviço $ location

Versão angular: 1.x.

Navegador: todos

Algo mais:

Como corrigi-lo

Em src / ng / browser.js há uma função fireStateOrUrlChange que tem esta validação

if (lastBrowserUrl === self.url () && prevLastHistoryState === cachedState) {{
Retorna;
}
O principal problema parece ser que estamos comparando self.url () com lastBrowserUrl, mas lastBrowserUrl pode ser definido a partir de fontes diferentes, nem sempre com a mesma codificação / decodificação

$location low broken expected use bug

Comentários muito úteis

Corrigimos isso parcialmente usando o navegador <a href> para normalizar URLs em algumas áreas principais (https://github.com/angular/angular.js/commit/e68697e2e30695f509e6c2c1e43c2c02b7af41f0, https://github.com/ angular / angular.js / commit / 2f72a69ded53a122afad3ec28d91f9bd2f41eb4f). No entanto, nenhum navegador normaliza tudo com este método. Para realmente corrigir isso, precisaríamos implementar a normalização por conta própria.

Implementei um POC para fazer essa normalização manualmente, mas decidimos que essa é uma mudança muito grande neste ponto. FYI 15 dos testados adicionados naquele commit falham atualmente no cromo.

Por essas razões, vamos colocar isso em um estado de "não consertar".

Todos 4 comentários

@gkalpak, você quer dizer (a partir do seu comentário ) fazer algo como url = urlResolve(url).href dentro de $browser.url ou alterar todas as chamadas para $browser.url(val) para ser consistente? Adicionar urlResolve parece funcionar, embora mude alguns testes (alguns URLs agora terminam em / ).

@jbedard , não pensei nos detalhes da implementação. Eu estava me referindo ao resultado final: sorriso:

@dmartres você pode confirmar se isso ainda é um problema no 1.7.3? Acho que aee7d53a6b5d3d7bc0a1124fd3df9b263777e72e (corrigindo # 16592) pode ter corrigido isso.

Corrigimos isso parcialmente usando o navegador <a href> para normalizar URLs em algumas áreas principais (https://github.com/angular/angular.js/commit/e68697e2e30695f509e6c2c1e43c2c02b7af41f0, https://github.com/ angular / angular.js / commit / 2f72a69ded53a122afad3ec28d91f9bd2f41eb4f). No entanto, nenhum navegador normaliza tudo com este método. Para realmente corrigir isso, precisaríamos implementar a normalização por conta própria.

Implementei um POC para fazer essa normalização manualmente, mas decidimos que essa é uma mudança muito grande neste ponto. FYI 15 dos testados adicionados naquele commit falham atualmente no cromo.

Por essas razões, vamos colocar isso em um estado de "não consertar".

Esta página foi útil?
0 / 5 - 0 avaliações