file i/o #3: hey, poll

OAuth を用いた api の使用認可を行うわけなので、途中で dropbox.com のページ上で wasavi アプリケーションに対してアクセスを許可していいか? と聞かれる。ページには「許可」ボタンと「拒否」ボタンがある。また、拒否の意味を込めてページを閉じる場合もありえる。あるいは件の認可に関係のない別のページへ遷移する場合もある。

  1. 許可ボタンをアクセスした場合はその情報がページから dropbox へ送信される。サーバからのレスポンスで oauth_callback で指定した url へリダイレクトされる
  2. 拒否ボタンをアクセスした場合はその情報がページから dropbox へ送信される。ページは dropbox.com/home へリダイレクトされる
  3. ページを閉じた場合は、当然だがそのタブは消滅する
  4. 他のページへ遷移した場合はそのタブが指すアドレスが変化する

そういったユーザのアクションをエクステンションのバックグラウンド側で受け取りたい。wasavi の実行はユーザのアクションを待って止まっている状態なので、許可であれ拒否であれ全てのアクションを認識する必要がある。

コールバックで指定した url に対してコンテントスクリプトを仕掛けておく単純な方法では、1. 以外を受け取れない。どうするかなー。

 * * *

ということで表題の通り、ポーリングすることにする。とりあえず Opera に限って考えると、タブに新しい文書が読み込まれるごとにバックグラウンド側の opera.extension.onconnect でイベントを取れる。この中で、https://www.dropbox.com/1/oauth/authorize を指す文書が生成されたら opera.extension.tabs.getAll() でタブの管理情報(BrowserTab オブジェクト)みたいなものを得る:

opera.extension.onconnect = function (e) {
var targets = [];
opera.extension.tabs.getAll().some(function (tab) {
if (tab.port == e.source) {
targets.push({tab:tab, startUrl:tab.url, callback:function () { ... }});
return true;
}
});
};

この管理情報は、スナップショットではなくライブなので、これを監視すればナビゲーションの変化を追跡できる。適当な間隔(1秒くらい)でタイマを動かし、タブが指す url が変わっていたら認可処理を続行する。特に、コールバック先の url になっていたら api の使用を許可されたとみなすことができる(もちろんリクエストトークンを受け取ってユーザの認可待ちという oauth の内部状態とも合致する必要がある)。

Leave a Reply

Your email address will not be published. Required fields are marked *