SSブログ

bookmarklet で cookie を使うと [NT]

bookmarklet でも良かったかもしれない の続き。

smart.fm の進捗状況一覧を表示する Greasemonkey スクリプトを Greasemonkey for smart.fm (iKnow! を改良しよう その7改題) で公開した。しかし、これって、bookmarklet で出来るんじゃない?というのが昨日の記事の話。

そこで試して見た。結論からすると技術的には可能だがたぶんやらない方が良さそうとの結論になった。詳しくは後述。

問題はキャッシュにある。何をキャッシュしたいかというと、smart.fm のマイリストに表示される、

  • 各リストの進捗状況(iKnow/Dictation)
  • 各リストの今日の進捗状況(iKnow/Dictation) 
  • 今日の日付

の 3 つ。これをキャッシュしておかないと、smart.fm/home から他のページに移動して、また smart.fm/home に戻る度に、マイリストに追加されているリスト数 * 2 の XmlHttpRequest が発生する。XmlHttpRequest によって XML を読みに行き各リストの今日の進捗状況(iKnow/Dictation) を取得しているからである。

これは非常に無駄である。XmlHttpRequest した結果を保存しておいて後で再利用すれば XmlHttpRequest を再度送信せずにすむ。この保存する機能をここではキャッシュと呼んでいる。

昨日の記事では、このキャッシュを cookie を使えば出来るんじゃないかと述べた。結論からすると出来る。しかし、smart.fm に対して cookie が送信されてしまう。理由は次の通り。

  • bookmarklet は smart.fm/home に対して javascript を書き込む。
  • ブラウザは書き込まれた javascript が smart.fm/home にあるものとして処理される。
  • javascript から cookie を書き込むと、その値は smart.fm に対して設定された cookie となる。

だから、当然、smart.fm に対して cookie が送信される。これは筆者としては行儀が悪いスクリプトに見える。なぜなら、smart.fm としては cookie を設定していないのに、勝手に smart.fm の cookie として送信されるから。

実例を挙げると下図のようになる。

image.png

smart.fm/home を表示した後に cookie を設定する bookmarklet を実行し、smart.fm/home を再表示した。そして、その様子を HttpFox を使って送信した cookie を表示している。この図の cookieKey Hello というのが bookmarklet が設定した cookie。

筆者としては、smart.fm/home に cookie を送りたくない。 smart.fm のサーバから見ると、変な cookie が送られてきているんですけど?みたいな状態になるから。

当たり前のことなんだけど、WWW 関係の知識不足だった。

この状態を回避するためには、キャッシュ機能をあきらめるしか方法がない。iframe とか駆使して別のドメインに対して情報を送ってしまえば何とかなるかもしれないが、それって、ログイン後にページに表示されている情報を他のドメインに送りつけていることとなり、セキュリティ的に問題だと筆者は思う。

しょうがないので bookmarklet はあきらめた。素直に Greasemonkey for smart.fm を使いましょう。あるいは、キャッシュの機能なんて作らなくても良いくらい smart.fm が便利な API を整備するか、smart.fm のサイトデザインがより使いやすくリニューアルされるように祈って下さい。


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。