読者です 読者をやめる 読者になる 読者になる

IE10 で JavaScript から localStorage を使おうとすると「アクセスが拒否されました( Access is denied )」エラーで実行時エラーになる問題

ここからもともとの本文

ずっと前から悩まされていたこの問題、検索すると、世界中でちらほらと困っている人がいて、そして、大抵「俺のところでは再現しない」と言われてみんな落ち込んでいる。私も落ち込みました。何が辛いって、 window.localStorage プロパティにアクセスした時点で実行時エラーになってしまうところ。

直接の原因はわからず仕舞いながら、「 Internet Explorer の設定をリセット&個人情報を削除する」では効果が無く、管理者権限で IE10 を起動する、または新規にユーザを作ってそのユーザで IE10 を起動すると正常通り localStorage にアクセスできることから、どっかのディレクトリやファイルのユーザ権限周りの問題であろうか…と想像される。

改めて検索し直してみると、おおむね corrupt user profile が問題だろう…。と言われている。自分も色々とレジストリIE の使うディレクトリのアクセス権を確かめたり変更したり削除したりしてみたものの上手くいかず、結局新しいユーザを作って切り替えてしまった。

おそらくこの件について、開発者の側から出来ることはなさそう。自分が制作会社に勤務していて、万が一代理店のお偉いさんの IE10 がこうなっていたとしたら、もう泣いて全部 Flash に作り替えるしか無い感じだ。

どんなブラウザでも localStorage はユーザ側で拒否する設定が可能なので、そういう設定を施されたブラウザの一つだとして取り扱うことが必要で、つまるところここでも UA スニッフィングじゃなくて機能で振り分けましょう…。という話になのだが、

if ( window.localStorage ) {
//...
}

だと実行時エラーでここで JavaScript が止まってしまい、以降の処理が全部行われなくなってしまう。だから try catch をするのだけど、普通は機能振り分けの度に try catch なんてしないわけで、これってつまり IE10 の localStorage 専用対応になる…。

(追記) @azu_re さんに、 modernizr も localStorage の扱いに手を焼いていたという歴史を教えていただいた。

Firefox 、及び iOS Safari のプライベートモードも runtime error になるということ。つまり、 localStorage の機能振り分けに関しては、 try catch しかないのだった。(さらに "If DOM storage disabled in IE, window.localStorage is present but === null." ってのもえげつねーですなー)。最終的に modernizr は

  Modernizr.addTest('localstorage', function() {
    var mod = 'modernizr';
    try {
      localStorage.setItem(mod, mod);
      localStorage.removeItem(mod);
      return true;
    } catch(e) {
      return false;
    }
  });

こうしてる…。

ユーザプロファイルが壊れる?

可能性として考えてみた。

等々あり得るが、そもそも「どう壊れたら localStorage に触れなくなるのか」が判らないのだから、これ以上どうしようも無い。どなたかご存じでしたら教えて下さい…。