Firefox3beta5のGreasemonkeyでGM_xmlhttpRequest使うときにBASIC認証ダイアログが出ない件の回避方法
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); }
力技過ぎる。もっとスマートな方法はないものか。