Subscribed unsubscribe Subscribe Subscribe

枕を欹てて聴く

香炉峰の雪は簾を撥げて看る

Taberareloo 2.0.0 : context menus

Chrome Extension Tumblr

stable channelがversion 6になりました.
Chrome Releases: Stable and Beta Channel Updates
といっても驚かれないかもしれませんが, context menusが追加できるようになったといえば, 感慨深くなりませんか?

というわけでTaberarelooを2.0.0にmajor updateし, context menu他を追加しました.
f:id:Constellation:20100904031413p:image

という感じです. contextMenus APIはこちらを見ればいいと思います.
chrome.contextMenus - Google Chrome

Chromeではprocessが分かれていて, すべての拡張のprocessは別ですので, 基本的に動的(contextMenuクリック時)にcontext menuを作ることはできません. もしそうしようとすればすべての拡張に通信しなければいけなくなり, context menuの表示が非常に待たされるという結果になりかねません. このため, ページごとにコンテキストメニューをscriptableに変更することはできません. (もちろん, URL baseの制御や, clickされたelement baseの制御はできます. これは標準のAPIに備わっています)
また, ページ自体と拡張とのプロセスも別なので, 生のnodeを拡張側に通知することができません. よってChrome側が集めた, クリック先情報(OnClickData)を利用するという形になります. ここら辺は初期のdesign docでは「やります!」とか言っていたので, 「無理じゃろー」とか思いながらも見ていたのですが, やはり難しいですね...

その他追加

  1. Amazon Extractorを追加しました
    • これで, Amazonのページの情報を抽出することができます
  2. GoogleCalendarへのPostを追加しました
    • cookies APIが追加されたためできるようになりました. cookies APIもver 6から利用できます.
    • 実はcookiesの取得はAPIなしでもやろうと思えばできたという状況であり, もっとやたらとhackな感じでやることはできましたが, APIがexperimentalまできていて待ってたらよさそうだったのでサボってましたすみません... その聞くと「やばい, 黒すぎる!!」ってなるsuper hackyなcodeを知りたい方は, 発案者の @ さんへお問い合わせください.

uplaod from cacheについて

Pixivのuploadができないだとか, captureがhatena fotolifeにしかuploadできないのはbugではなく仕様であり, その手のものは基本的にはupload from cacheが実装されていないことに起因します. そして, upload from cacheを実装する方法は, Chromeの拡張APIでは今のところ存在しません.
canvas / XHR でimgのdataをbinary / base64でとることはできます. しかしそれをXHRでuploadする手段がないのです. FirefoxにはXHR#sendAsBinaryがありますが標準ではないのでChromeには実装されていません.

しかし, XMLHttpRequest Level 2 によるとXHRはFormDataをsendでき, そしてFormDataにはBlobをappendできること, そして, File API: Writer の BlobBuilder interfaceを使えば, DOMStringからBlobを作ることができるということに気づいたら, 幸福実現への道が見えてきますね. まだ策定中なのでChromeも実装していませんが, 一緒にw3cの活躍を期待しましょう!

補足

GoogleCalendarへの追加はcookiesができたらあとあとやろうかなー的に考えていたのです. が, TomblooにおけるAmazon Extractorの拡張で発売日がGoogleCalendarに送れるようになったのが, ラノベやらゲームやら本やらなんやらの情報を集めるのにちょう便利で, 「これはChromeにもいる!!」と思って必死で追加しました.