• リファレンス類
  • unsafeWindowの使い方
  • GM_xmlhttpRequestで取得した内容が文字化けする
  • GreasemonkeyでGmailをいじる
    • ドメインはhttps://mail.google.com/mail/* とhttp://mail.google.com/mail/*
    • 新インターフェースと旧インタフェースでDOMの中身がかなり異なる
    • 新インターフェースではGreasemonkey用のAPIが使える
      • 以下新インターフェースとGreasemonkeyでいじったときの覚書('07/11)
        • gmonkey.loadは、window.onloadのときに呼ばないとエラーになる
          • なのでまず、window.onloadにアタッチしてgmonkey.loadしてGmailAPIオブジェクトを取得しておく
          • window.onloadが呼ばれたときには広告など、いくつかの要素の表示が終わっていない
        • メールの本文などが表示されるビュー部分はiframeとなっている。
        • メールのオリジナルへのURLは以下の関数で取れた
          function gmail_get_original() {
                  //ikクエリの値を取得。body直下のformのactionから取れる
                  var ik = null;
                  for( var index = 0; index < document.body.childNodes.length; ++index ) {
                          var node = document.body.childNodes[index]
                          if( "FORM" == node.tagName ) {
                                  ik = node.getAttribute( "action" ).match(/ik=([^&]+)/)[1]
                                  break;
                          }
                  }
                  //間違ったikでリクエストを発行してしまうとログアウトしてしまうので念のためチェック
                  if( !ik )
                          return;
                  //メールのidは、新インターフェースではURLの末尾についてる。
                  var hrefs = location.href.split("/")
                  return location.protocol + "//" + location.host + "/mail?ui=2&ik=" + ik + "&view=om&th=" + hrefs[hrefs.length-1]
          }
          
          • メールはオリジナルのデータに沿ってエンコードされてる。ただ、Content-Typeにエンコードが書かれてることが多いので、一旦GM_xmlhttpRequestしてヘッダを読んで、Content-TypeをGM_xmlhttpRequestのoverrideMimeTypeに渡せば、正しくエンコードを解釈して読み込んでくれる。
          • もしContent-Transfer-Encodingがbase64だったら高度な JavaScript 技集のbase64.jsが使える。中のエンコードがUTF-16以外のとき、UTF-8なら同じサイトのutf.jsで変換できる。
          • メールデータのパース
            function mail_parse( data ) {
                    var mail_data = data.replace(/\r/mg,"").split("\n\n")
                    var headers = {}
                    array_each( mail_data[0].replace(/;\n/mg, ";").split("\n"),
                            function( header ){
                                    header = header.split(": ")
                                    headers[header[0]] = header[1]
                            }
                    )
                    mail_data.shift()
                    return [headers, mail_data.join("\n\n")]
            }
            
            • ヘッダの辞書と本文のペアが帰る。
          • Gmailの本文表示部分のElementはgetActiveViewElement?().getElementsByTagName("BR")して得られる要素の親要素にid属性があるかどうかでとることができる。
          • Gmailのなかでpreを使うと、長い行も右端で折り返すようなCSSが設定されている。