Safari用AutoPatchWork更新

ツールバーのアイコンがイマイチだったので、ページ下部にラインを表示してみました。なんか見事にAutoPagerizeの更新と被っているのに気がついたんですが、ホント偶然です。
ページの一番下にしたのは動作を止めたい時というのは大抵フッターを見たい時だと思うので、ページ下に止める機能があったほうが都合が良いんじゃないかと思ったからです。表示の仕方はまだ検討段階です。ご意見いただけると嬉しいです。ちなみに、position:fixedが重いとちょくちょく言われますが、(Firefoxだと確かに重いみたいだけど)WebKitではそうでもないと思っています。未検証ですが…。
インストールはSafari5の拡張作ってみた - 0xFFから(前のバージョンでは自動アップデートに対応してなかったので、このバージョンは手動でインストールが必要です。次回からはアップデートの対象になると思います)。

Safari拡張の自動更新方法

次のようなXMLを拡張子.plistで適当な名前で保存して、サーバーにアップします。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
   <key>Extension Updates</key>
   <array>
     <dict>
       <key>CFBundleIdentifier</key>
       <string>net.os0x.autopatchwork</string>
       <key>Developer Identifier</key>
       <string>LAM47A73AC</string>
       <key>CFBundleVersion</key>
       <string>1.2</string>
       <key>CFBundleShortVersionString</key>
       <string>1.2</string>
       <key>URL</key>
       <string>http://ss-o.net/safari/extension/AutoPatchWork.safariextz</string>
     </dict>
   </array>
</dict>
</plist>

Developer Identifierは開発者自身のID、CFBundleVersionは拡張のバージョン(実際に表示されるほう)、CFBundleShortVersionStringは内部用バージョン(こっそり更新したいとき用?)です。
あとは機能拡張ビルダーでマニフェストをアップデートのところにサーバーに置いたplistファイルのURLを設定すればOKです。

余談:公式のドキュメントにTeam Identifierって謎の用語があって後回しにしてたのだけど、ドキュメントが間違っていたそうだ。Developer Forumsでも確認できた。

NinjaKit

NinjaKit*1というChrome/Safari拡張を公開しました。
Chrome:Chrome Web Store - NinjaKit
Safari:NinjaKit for Safari
Source: os0x/NinjaKit · GitHub
これはFirefoxのアドオンであるGreasemonkey相当の機能を実装することを目指しています。
今のところ、

  • GM_xmlhttpRequest
  • GM_addStyle
  • GM_getValue
  • GM_setValue
  • GM_deleteValue(new in ver 0.7)
  • GM_listValues(new in ver 0.7)
  • GM_log
  • GM_openInTab
  • GM_registerMenuCommand(Safari版は未サポート)
  • Metadata
    • @include
    • @exclude
    • @require
    • @bookmarklet(独自APIbookmarkletとして実行するのでGM APIは使えないが、ページ側のJSに触れる)

あたりをサポートしています。とりあえず、AutoPagerizeが動く(AutoPagerize自体は拡張版が出ているのでそっちを使ったほうが良いですが)のを基準にしました。
大体実用的なレベルになったと思うので、公開しました。が、まだまだ問題は色々とあります。特にセキュリティリスクがないとは言い切れない(Greasemonkey自体の問題でもある)のでそのあたりはご了承を。

今後の予定

  • Safari拡張対応
  • E4X(一番重い…、ヒアドキュメントとして使っているだけのケースはなんとか動くようにしたい)
  • スクリプトの更新通知
  • @resource
  • その他細かいAPIなど

対応が難しそうな問題点

  • スクリプト同士の名前空間が完全には別れていないので、prototypeを拡張したときなどにスクリプト同士のコンフリクトが起きかねない
  • letとかIteratorsとかExpression closuresとか、Mozilla方言は無理そう

*1:思いつきでNinjaに。あとSafariにも対応しているのでKitに。