Web Storage API を使う際は Cookie 無効環境も考慮しよう

東武鉄道のサイト(railway.tobu.co.jp)にアクセスしたら、ページレイアウトが大きく崩れていてびっくり。

サムネイル画像
レイアウトが崩れている様子オリジナル画像

なんでこんなことになっているか調べてみたところ、 JavaScript 経由で CSS ファイルを読み込もうとしている部分でエラーが発生していて、必要なスタイルが当たっていない状態でした。

当該ファイル(devicecChange.js)(railway.tobu.co.jp)でエラーになっている部分のソースはこんな感じです。

if (localStorage && localStorage.getItem('devicec-cange')==='sp'){
  spCange();
  spCss();
}else if(localStorage && localStorage.getItem('devicec-cange')==='pc'){
  pcCange();
}else{
  if (navigator.userAgent.search(/iPhone|iPod|Android.+Mobile/)!==-1){
    spCange();
    spCss();
  }else {
    pcCange();
  }
}

これはあかんやつですね。ブラウザの設定で Cookie を無効にしている状態で localStorage や sessionStorage にアクセスすると SecurityError が発生しますが、その対策がされていません。

サムネイル画像
ブラウザのコンソールで SecurityError が発生している様子を見たところオリジナル画像

この対策は簡単で、例外をキャッチすればいいだけです。

let myLocalStorage;
let mySessionStorage;
try {
  myLocalStorage = localStorage;
  mySessionStorage = sessionStorage;
} catch(e) {
  // Web Storage を無効にしている場合
}

if (myLocalStorage && myLocalStorage.getItem('devicec-cange') === 'sp'){
(以下省略)

非常に単純なことなのですが、サイト制作の関係者がたまたま全員 Cookie を有効にしている人だったりすると、こういうケースが見過ごされてしまうのでしょうね。

ECサイトやSNSサービスなどで、ログインすることが必須のサイトなら、訪問者が Cookie を有効にしていること前提の作りでもいいかもしれませんが、そうでない場合は Cookie がブロックされる可能性を考慮する必要があるでしょう。