Descontinuações e remoções de APIs no Chrome 49

Em quase todas as versões do Chrome, vemos um número significativo de atualizações e melhorias no produto, no desempenho dele e também nos recursos da plataforma da Web.

No Chrome 49 (Beta, 2 de fevereiro de 2016. data estável estimada: março de 2016), há diversas mudanças no Chrome

O uso do prefixo "css" em getComputedStyle(e).cssX foi descontinuado

Texto longo, leia o resumo: o uso do prefixo "css" em getComputedStyle(e) foi descontinuado porque não fazia parte da spec formal.

getComputedStyle é uma ótima função pequena. Ela vai retornar todos os valores CSS dos estilos do elemento DOM conforme foram calculados pelo mecanismo de renderização. Por exemplo, é possível executar getComputedStyle(_someElement_).height e retornar 224,1 px, porque essa é a altura do elemento que está sendo mostrada no momento.

Parece uma API bem útil. Então, o que estamos mudando?

Antes do mecanismo de renderização do Chrome mudar para o Blink, ele usava a WebKit e permitia usar o prefixo "css" no início de uma propriedade. Por exemplo, getComputedStyle(e).cssHeight em vez de getComputedStyle(e).height. Ambas retornarão os mesmos dados, conforme mapeados para os mesmos valores subjacentes, mas esse uso do prefixo "css" não é padrão e foi descontinuado e removido.

Observação: cssFloat é uma propriedade padrão e não será afetada por essa descontinuação.

Se você acessar uma propriedade dessa maneira no Chrome 49, ela retornará undefined e você precisará corrigir seu código.

O uso de initTouchEvent foi descontinuado

Texto longo, leia o resumo: o initTouchEvent foi descontinuado e substituído pelo TouchEvent constructor para melhorar a conformidade com as especificações e será totalmente removido no Chrome 54.

Intenção de remover Chromestatus Tracker Problema do CRBug (em inglês)

Há muito tempo, você pode criar eventos de toque sintéticos no Chrome usando a API initTouchEvent. Eles são usados com frequência para simular eventos de toque, seja para testar ou automatizar parte da interface no seu site. No Chrome 49, suspendemos o uso dessa API e exibirá o seguinte aviso com a intenção de removê-la completamente no Chrome 53.

O uso de "TouchEvent.initTouchEvent" foi descontinuado e será removido na versão M53, 
    por volta de setembro de 2016. Use o construtor TouchEvent.
O uso de "TouchEvent.initTouchEvent" foi descontinuado e será removido na versão M53, por volta de setembro de 2016. Use o construtor TouchEvent. Consulte https://www.chromestatus.com/features/5730982598541312 para saber mais.

Essa mudança é boa por vários motivos. Ela também não está na especificação de eventos de toque. A implementação de initTouchEvent no Chrome não era compatível com a API initTouchEvent do Safari e era diferente do Firefox no Android. Por fim, o construtor TouchEvent é muito mais fácil de usar.

Foi decidido que nosso objetivo seria seguir a especificação, em vez de manter uma API que não é especificada nem compatível com a única outra implementação. Como resultado, primeiro vamos descontinuar e remover a função initTouchEvent e exigir que os desenvolvedores usem o construtor TouchEvent.

Essa API uso na Web, mas sabemos que ela é usada por um número relativamente baixo de sites. Por isso, não a removemos tão rapidamente quanto fazemos normalmente. Acreditamos que parte do uso não está funcionando porque sites não processam a versão da assinatura do Chrome.

Como as implementações do iOS e do Android/Chrome da API initTouchEvent eram muito diferentes, muitas vezes você teria algum código ao longo das linhas de (geralmente esquecendo o Firefox).

    var event = document.createEvent('TouchEvent');
    
    if(ua === 'Android') {
      event.initTouchEvent(touchItem, touchItem, touchItem, "touchstart", window,
        300, 300, 200, 200, false, false, false, false);
    } else {
      event.initTouchEvent("touchstart", false, false, window, 0, 300, 300, 200,
        200, false, false, false, false, touches, targetTouches, changedTouches, 0, 0);
    }
    
    document.body.dispatchEvent(touchEvent);

Em primeiro lugar, isso é ruim porque procura por "Android" no user agent, e o Chrome no Android vai corresponder e atingir essa descontinuação. Ela ainda não pode ser removida, mas haverá outros navegadores WebKit e mais antigos baseados no Blink no Android por um tempo e você ainda vai precisar oferecer suporte à API mais antiga.

Para processar corretamente TouchEvents na Web, altere seu código para oferecer suporte ao Firefox, IE Edge e Chrome. Para isso, verifique a existência de TouchEvent no objeto window e, se ele tem um "comprimento" positivo (indicando que é um construtor que recebe um argumento), use isso.

    if('TouchEvent' in window && TouchEvent.length > 0) {
      var touch = new Touch({
        identifier: 42,
        target: document.body,
        clientX: 200,
        clientY: 200,
        screenX: 300,
        screenY: 300,
        pageX: 200,
        pageY: 200,
        radiusX: 5,
        radiusY: 5
      });
    
      event = new TouchEvent("touchstart", {
        cancelable: true,
        bubbles: true,
        touches: [touch],
        targetTouches: [touch],
        changedTouches: [touch]
      });
    }
    else {
      event = document.createEvent('TouchEvent');
    
      if(ua === 'Android') {
        event.initTouchEvent(touchItem, touchItem, touchItem, "touchstart", window,
          300, 300, 200, 200, false, false, false, false);
      } else {
        event.initTouchEvent("touchstart", false, false, window, 0, 300, 300, 200,
          200, false, false, false, false, touches, targetTouches, 
          changedTouches, 0, 0);
      }
    }
    
    document.body.dispatchEvent(touchEvent);

Manipuladores de erros e sucessos necessários nos métodos RTCPeerConnection

Texto longo, leia o resumo:os métodos RTCPeerConnection createOffer() e createAnswer() WebRTC agora exigem um gerenciador de erros e de sucesso. Anteriormente, era possível chamar esses métodos apenas com um gerenciador de sucesso. Esse uso foi descontinuado.

No Chrome 49, também adicionamos um aviso se você chamar setLocalDescription() ou setRemoteDescription() sem fornecer um gerenciador de erros. Esperamos tornar o argumento do gerenciador de erros obrigatório para esses métodos no Chrome 50.

Isso faz parte da liberação de promessas nesses métodos, conforme exigido pela especificação WebRTC.

Confira um exemplo da demonstração do RTCPeerConnection (main.js, linha 126) do WebRTC:

    function onCreateOfferSuccess(desc) {
      pc1.setLocalDescription(desc, function() {
         onSetLocalSuccess(pc1);
      }, onSetSessionDescriptionError);
      pc2.setRemoteDescription(desc, function() {
        onSetRemoteSuccess(pc2);
      }, onSetSessionDescriptionError);
      pc2.createAnswer(onCreateAnswerSuccess, onCreateSessionDescriptionError);
    }

Observe que setLocalDescription() e setRemoteDescription() sempre tiveram um parâmetro de gerenciador de erros. Portanto, simplesmente especificar esse parâmetro é uma alteração segura.

Em geral, para aplicativos WebRTC de produção, recomendamos usar adapter.js, um paliativo, mantido pelo projeto WebRTC, para isolar apps de mudanças nas especificações e diferenças de prefixo.

O uso de Document.defaultCharset foi descontinuado

Texto longo, leia o resumo: Document.defaultCharset foi descontinuado para melhorar a conformidade com as especificações.

Intenção de remover Chromestatus Tracker Problema do CRBug (em inglês)

O Document.defaultCharset é uma propriedade somente leitura que retorna a codificação de caracteres padrão do sistema do usuário com base nas configurações regionais. Não é útil manter esse valor devido à maneira como os navegadores usam as informações de codificação de caracteres na resposta HTTP ou na metatag incorporada à página.

Ao usar document.characterSet, você receberá o primeiro valor especificado no cabeçalho HTTP. Se ele não estiver presente, você vai receber o valor especificado no atributo charset do elemento <meta> (por exemplo, <meta charset="utf-8">). Por fim, se nenhum deles estiver disponível, o document.characterSet vai ser a configuração do sistema do usuário.

O Gecko não é compatível com essa propriedade e ela não tem especificações claras. Por isso, essa propriedade será descontinuada do Blink no Chrome 49 (Beta em janeiro de 2016). O seguinte aviso aparecerá no seu console até a remoção da propriedade no Chrome 50:

O uso de &quot;Document.defaultCharset&quot; foi descontinuado e será removido na versão M50 por volta de
    abril de 2016.
"Document.defaultCharset" foi descontinuado e será removido na versão M50 por volta de abril de 2016. Consulte https://www.chromestatus.com/features/6217124578066432 para saber mais.

Mais discussão sobre o raciocínio para não especificar isso pode ser lida no GitHub https://github.com/whatwg/dom/issues/58 (link em inglês)

getStorageUpdates() foi removido

Texto longo, leia o resumo: Navigator.getStorageUpdates() foi removido porque não faz mais parte da especificação do navegador.

Intenção de remover Chromestatus Tracker Problema do CRBug (em inglês)

Se isso afetar alguém, vou comer meu chapéu. O getStorageUpdates() quase nunca foi usado na Web.

Citando a versão muito antiga da especificação HTML5:

Parece legal, não é? A especificação também usa a palavra "whence" (que, por acaso, é a única instância de quando na especificação). No nível da especificação, havia um StorageMutex que controlava o acesso ao armazenamento de bloqueio, como localStorage e cookies, e essa API ajudaria a liberar esse mutex para que outros scripts não fossem bloqueados por esse StorageMutex. No entanto, ele nunca foi implementado e não tem suporte no IE ou no Gecko, e a implementação do WebKit (e, portanto, do Blink) é um ambiente autônomo.

Ele foi removido das especificações por um tempo e foi removido completamente do Blink. Há muito tempo, ele não funciona mais e não faz nada, mesmo que seja chamado.

Se você tiver um código que chamou navigator.getStorageUpdates(), será necessário verificar a presença da função antes de chamá-la.

O uso de Object.observe() foi descontinuado.

Texto longo, leia o resumo: Object.observe() foi descontinuado porque não está mais na faixa de padronização e será removido em uma versão futura.

Intenção de remover Chromestatus Tracker Problema do CRBug (em inglês)

Em novembro de 2015, foi anunciado que o Object.Observe seria removido do TC39. Ele foi descontinuado no Chrome 49. Você verá o seguinte aviso no console se tentar usá-lo:

O uso de &quot;Object.observe&quot; foi descontinuado e será removido na M50 por volta de abril de 
    2016.
O uso de "Object.observe" foi descontinuado e será removido na versão M50 por volta de abril de 2016. Consulte https://www.chromestatus.com/features/6147094632988672 para saber mais.

Muitos desenvolvedores gostaram dessa API. Se você está fazendo testes com ela e agora está buscando um caminho de transição, use um polyfill, como MaxArt2501/object-observe, ou uma biblioteca de wrapper, como polymer/observe-js (links em inglês).