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

Firefox3beta5のGreasemonkeyでGM_xmlhttpRequest使うときにBASIC認証ダイアログが出ない件の回避方法

Greasemonkey

Firefox 3が落ちまくるので常用するのやめた - むぅもぉ.jp
落ちるのはFirebugがらみだと思う。特にgoogle adsとの相性が。でもfirebug-1.2.0a18Xが結構いい感じという噂。

で、本題のGM_xmlhttpRequestを使うとBasic認証のダイアログが出ない問題。
Twit Fav commandでも同様の問題があって、やっつけで対応した方法のメモ。

問題:BASIC認証ダイアログが出ない

TwitterにPOSTしたり、favしたりするにはBASIC認証で認証しないといけないんだけど、その認証ダイアログがFirefox3のGreasemonkeyでGM_xmlhttpRequestを使ったときには出現しない。で、onloadにはstatusコード401が返ってくる。

回避策:status401が返ってきたら、iframeで認証ダイアログを強制的に呼び出す

http://twitter.com/statuses/update.xml のようなBASIC認証がでるページをiframeで呼び出してBASIC認証を通してから再度POSTする。コード片は下記のような感じ。認証が通らないときにループしないように、2度目かどうかをチェックしている。

  ,onload:function(res){
    if (res.readyState == 4 && res.status == 200) {
      callback(res);
    } else if (res.status == 401) {
      if (re) { // 2度目の認証失敗の場合
        window.Minibuffer.status('twitautherror','401 Authorization Required',2000);
        return callback();
      }
      var api = 'http://twitter.com/statuses/update.xml';
      frameRequest({url:api,onload:function(){
        self.gpost(id,link,callback,1);
      }});
    }
  }
function frameRequest(param){
  var url = param.url;
  var node = param.node || document.body;
  var iframe = document.createElement('iframe');
  iframe.setAttribute('style','margin:0;padding:0;border:none;height:1px;width:1px;visibility:hidden;');
  iframe.addEventListener('load', function(){
    if (param.onload) {
      param.onload.call(iframe,url);
    }
    setTimeout(function(){node.removeChild(iframe);},1000);
  },false);
  iframe.name = param.name || '_blank';
  iframe.src = url;
  node.appendChild(iframe);
}

力技過ぎる。もっとスマートな方法はないものか。