Olá pessoal,

Para começar com os posts técnicos, vou falar sobre um assunto polêmico: compatibilidade de aplicações web.

O Internet Explorer sempre recebeu muitas críticas ao longo dos últimos anos a respeito da forma como ele interpreta páginas HTML e implementa padrões da web. Muitas pessoas falam mal do IE, especialmente desenvolvedores que precisam criar sites que abram perfeitamente iguais no Internet Explorer, Firefox, Chrome e Opera. Eu mesmo já passei por esse problema alguns anos atrás. É realmente frustrante criar uma interface aparentemente simples e ver que ele abre de uma forma completamente diferente em cada browser que é testada. Resolvi então ir a fundo no real motivo dos problemas de compatibilidade e descobri que o problema na maioria das vezes é bastante simples... E que a culpa quase sempre é do desenvolvedor desavisado.

Aviso! Vou falar apenas do IE8 e 9, que são as versões suportadas e mais recentes do navegador (considerando a data desse artigo, claro). Ter que suportar IE6 nos dias de hoje é realmente um problema, e eu não faria isso se o número de usuários afetados não fosse importante. Ele nem é suportado mais em alguns casos. No caso dos meus blogs, o número de usuários com IE6 é bastante pequeno. Há diversas campanhas, brincadeiras e iniciativas na internet, inclusive do próprio time do IE, para tentar convencer usuários e empresas a atualizarem seus navegadores para versões mais recentes. Eu atualmente estou trabalhando em um projeto desses, testando e indicando alternativas para compatibilização. Browsers modernos são melhores para desenvolvedores, empresas e, no fim, os próprios usuários.

O IE é diferente do restante?

 Para responder a essa pergunta, precisamos voltar alguns anos no tempo. As diferenças que existem hoje são reflexos, dentro outros motivos, da grande disputa no mercado de browsers no final dos anos 90. Diversos browsers foram criados seguindo especificações que não haviam sido finalizadas, ou ainda com falhas nas implementações dos padrões. E muitos sites, criados naquela época, passaram a representar impedimentos para os padrões web. De um lado, os browsers deveriam continuar suportando-os. De outro, os browsers deveriam suportar sites feitos considerando os padrões mais recentes. 

Modos de compatibilidade foram então criados para não afetar sites e sistemas antigos na época, em todos os browsers. No IE, os modos compatíveis com sites antigos eram o ativados por padrão até o lançamento do IE8. A partir dessa versão, a intenção passou a ser suportar por padrão a versão mais recente dos padrões usados na internet e usar os modos de compatibilidade apenas quando solicitado (seja por meio de cabeçalhos HTTP, meta tags ou a pedido do próprio usuário por meio das compatibility view lists). Esse foi um passo tão importante que foi divulgado até mesmo em nota da Microsoft.

Browser Modes e Document Modes

Os modos de compatibilidade são uma real necessidade para suportar sistemas que não podem ser atualizados de maneira alguma. Como exemplo disso temos CDs promocionais com páginas HTML, páginas usadas na configurações de roteadores domésticos ou sistemas corporativos sem suporte por motivos de força maior: falência do fornecedor, por exemplo. Os diversos modos de compatibilidade são adotados por quase todos os navegadores recentes.

No Internet Explorer, os modos de compatibilidade são ativados configurando o que chamamos de Browser Mode e Document Mode. De maneira bastante simples, o primeiro define com o navegador vai se apresentar para um determinado site, configurando detalhes antes da renderização da página como a requisição vai ser formada, que cabeçalhos vão ser enviados, user-agent, quantas conexões vão ser abertas. O Document Mode define como o navegador vai interpretar a página que foi baixada do servidor, se vai usar o modo Quirks e DOM semelhantes aos do IE5.5 ou se irá usar um modo que respeita os padrões mais recentes do HTML, CSS e JavaScript. Você pode saber mais sobre eles nesta página do MSDN.

Os Document Modes disponíveis são os seguintes:

  • IEx Standards Mode, modo que renderiza a página de acordo com os padrões mais recentes durante a criação do IE versão x.
  • IEx Compatibility Mode, modo que renderiza a página de acordo com os padrões mais recentes durante a criação do IE versão x.
  • Quirks Mode, modo de compatibilidade que simula o comportamento de versões antigas do navegador.

Doctype Switching

De maneira geral, temos controle sobre o Document Mode, mas não sobre o Browser Mode. O Browser Mode é configurado pelo usuário ou por meio de GPOs em ambiente corporativo, e não podemos fazer nada sobre ele do ponto de vista do web-server e do desenvolvedor. Podemos, no entanto, indicar por meio de algumas instruções como queremos que o navegador se comporte ao renderizar o HTML e CSS e interpretar scripts. Podemos fazer isso de diversas formas, e as mais comuns são o uso de Doctypes específicos, o uso de cabeçalhos HTTP (o famoso X-UA-Compatible), ou o uso de uma tag META no código HTML. O Doctype Switching é a principal delas, em parte porque está nas mãos do desenvolvedor ao criar as páginas ou o template delas.

O Doctype é uma instrução associada ao arquivo HTML que serve para indicar que o arquivo em si está em conformidade com um padrão específico. Normalmente aparece na primeira linha do arquivo, e dependendo do seu valor, informa o browser sobre qual modo de renderização deve ser utilizada. Esse é um padrão adotado por vários browsers.

Em outras palavras, aquela primeira linha com um comentário no HTML é bem mais importante do que parece. O valor dela define diretamente como o IE vai se comportar, se vai usar padrões de internet ou simular comportamento antigo. E retirar essa linha implica em configurar o browser para o Quirks Mode. Esse é o problema mais comum que encontro em sistemas web corporativos, principalmente por falta de conhecimento sobre esse recurso mesmo.

A árvore de decisão que o Internet Explorer usa é que aparece na figura a seguir. Mais detalhes foram apresentados em um outro post, no blog oficial do time do IE.

Origem: http://blogs.msdn.com/b/ie/archive/2010/03/02/how-ie8-determines-document-mode.aspx

Nossos problemas acabaram? Não mesmo... 

Após sofrer várias críticas ao longo dos anos, o time do IE deixou bastante claro que só utilizará padrões que tenham sido formalizados pelo W3C. Nenhuma tecnologia nova será liberada nas versões oficiais enquanto estiver com status de Draft ou Working Draft no W3C. Testes e implementações alternativas vão ser sempre prefixadas com ms- (no caso do CSS) ou disponibilizadas separadamente para os desenvolvedores que se interessarem. Isso ajuda no sentido de indicar exatamente o que pode ser usado de forma segura na construção de sites. Uma longa discussão sobre o assunto foi publicada no blog do Giorgio Sardo no MSDN.

Na minha visão, problemas de compatibilidade vão continuar acontecendo com diferentes versões de navegadores e padrões web. Por mais que o time do IE e a Microsoft se comprometam com políticas sérias de upgrade, suporte e adoção de padrões, ainda estamos sujeitos a duas possibilidades:

  • Outros fabricantes podem influenciar e encorajar o uso de tecnologias cujas especificações não foram finalizadas e formalizadas (e já estão fazendo isso, vide caso dos Web Workers e Web Database no HTML5). Os que seguirem estas implementações ou os que adotarem recursos específicos de um único browser vão ter problemas de compatibilidade no futuro quando a versão final da especificação sair do forno.
  • Desenvolvedores e empresas podem criar sistemas web incluindo em suas especificações iniciais a versão de um browser ao invés de especificar qual versão dos padrões web deve ser usada (HTML5, CSS 2.1, ECMAScript 5)

Você pode até não gostar do IE por quaisquer motivos... mas há de concordar que, atualmente, ele tem uma abordagem segura para o uso como plataforma de desenvolvimento. Você sabe o que esperar dele nas versões futuras. Nos próximos posts vou comentar sobre os erros mais comuns e o que podemos fazer para remediar aplicações web, se possível sem alterar o código delas.

Até a próxima,

-- Vinicius Canto Xavier - Consultor - Microsoft Services