Summary

  • O primeiro rascunho do W3C sobre Web Storage, de 23 de abril de 2009, imaginou duas compras de passagens no mesmo site. Um cookie que registra apenas a reserva corrente pode levar a escolha de uma janela para a outra.
  • sessionStorage acompanha a janela principal e a origem; localStorage oferece à origem um espaço compartilhado entre janelas e disponível depois da sessão, sem anexar os valores automaticamente a cada pedido HTTP.

Comprar uma passagem às seis da manhã já exige alguma coragem. Comprar a passagem errada às seis da manhã exige uma explicação ao cartão de crédito. A pessoa está comparando dois voos da mesma companhia em janelas separadas. Em uma, escolhe bagagem; na outra, confere o horário. Volta à primeira para fechar a compra e descobre que o site passou a se lembrar da segunda. O cookie fez exatamente o que lhe pediram: guardou o voo atual. Só havia dois candidatos ao cargo.

O rascunho inicial de Web Storage publicado pelo W3C em 23 de abril de 2009 conta essa história de modo direto. Se um site usa um cookie para manter o voo em andamento, as duas janelas podem interferir uma na outra. O texto chega à possibilidade de o cliente comprar duas passagens para o mesmo voo sem perceber. É um exemplo de especificação que sabe onde o erro aparece: no recibo.

O cookie acompanha requisições destinadas ao site, o que ajuda o servidor a reconhecer o navegador. Quando a pessoa conduz duas transações paralelas, porém, uma única informação compartilhada sobre “a compra atual” tem um problema de endereço. O navegador sabe a qual janela principal cada página pertence. Web Storage transformou essa divisão em algo que os programas da página podiam usar para guardar dados.

A primeira gaveta recebeu o nome sessionStorage. A Recomendação de 2013 atribui áreas próprias a cada contexto de navegação principal, separadas também por origem. A escolha de assento continua disponível quando a pessoa avança pelas páginas da reserva naquela janela. Uma segunda janela mantém seu próprio conjunto. Se ela nasce de uma janela relacionada, pode começar com uma cópia; daí em diante, as duas cópias seguem caminhos independentes. A opção pelo voo noturno já não toma de assalto o formulário do voo matinal.

A origem acrescenta o outro endereço. Cada site tem suas áreas, e outro site não recebe livre acesso a elas. Para achar os dados da reserva, importam tanto a origem quanto a janela. A diferença parece burocracia até o momento em que o comprador alterna entre duas telas e espera que cada uma conserve suas próprias escolhas.

A segunda gaveta é localStorage. Ela pertence à origem, aparece para suas diferentes janelas e pode durar além de uma sessão de navegação. O rascunho pensava em documentos escritos pelo usuário ou dados de uma caixa de mensagens guardados no cliente. Também oferecia um exemplo miúdo: o número de visitas à página. Um cookie vai junto com cada requisição à qual se aplica; o valor em armazenamento local fica no navegador até o script consultá-lo e a aplicação decidir enviá-lo. Não é preciso carimbar o contador de visitas em toda correspondência com o servidor.

A segunda edição da Recomendação, de 2016, descreve os puxadores dessas gavetas. setItem, getItem, removeItem e clear manipulam chaves e valores. Uma alteração que falha mantém a área como estava. Se o espaço acabar ou o armazenamento estiver bloqueado, setItem pode lançar QuotaExceededError. Outros documentos com acesso à mesma área recebem um evento storage quando ela muda. Os scripts devem enxergar dados coerentes; a norma não obriga cada chamada a esperar a gravação física no disco.

O projeto ainda teve sua briga nos bastidores. A seção de questões da Recomendação de 2013 registra que alguns implementadores consideravam caro demais o bloqueio pensado para evitar disputas entre scripts de janelas diferentes. Uma gaveta compartilhada precisa de ordem quando várias mãos a abrem. A conveniência visível para quem escreve a página produz trabalho invisível para quem constrói o navegador.

A linha do tempo publicada pelo W3C acompanha o rascunho de 2009 e as Recomendações de 2013 e 2016. O caso das passagens permanece útil porque nomeia a pergunta certa. Uma compra em andamento mora na janela. Um rascunho duradouro mora na origem. Um cookie segue para o servidor nas requisições. Quando cada lembrança ganha endereço, as duas viagens podem finalmente ser comparadas sem que uma se fantasie de outra.