Hatena::Grouporera

もし高校野球の女子マネージャーがOpera Browserを使ったら

logo
 | 

2010-10-21

Extension 公開

20:15

ついに Extension 対応版が公開された。

上からダウンロードできる。

とりあえず一つ作って公開してみた。

と言っても pixivreaderUserJS 版そのままだけど。

Ctrl+Shift+E (Mac なら Cmd+Shift+E)でインストールされてる Extension の一覧が見られるよ。メニューからも辿れるけどちょっと面倒。


Extension 公開にあたって知っとくべきこと

もしかしたら後で修正されるものも含まれるかもしれないけど。

  • アイコンは 18px と 64px が必須。別のサイズでアップロードしようとしたら拒否された。
  • スクリーンショットも1枚必須。3枚までアップロードできる。
    • 中身は UserJS と同じなのにアイコンとスクリーンショットのせいで公開への精神的敷居がとても高くなる。
  • どの言語ですか?というところで英語とロシア語しか選択肢がない。
    • 何も言うまい。
  • 説明のところで改行つきで書いても出力は改行がなくなる。
    • だから上の Extension みたいな状態に…
  • 説明を修正しようと思ったら、Extension のバージョンを上げないといけないらしい。
  • Opera hosting License か Apache License しか選べない。Extension 内にある LICENSE.txt というファイルは消されるよと書いてあった。
  • 公開される URL にバージョン番号が入ってしまう…常に最新版へ飛ぶ URL がない。Unite のときに文句言って直してもらったのをまた繰り返すのか。
  • パーマリンクにバージョン番号が含まれてしまう。問答無用で最新版に飛ばして欲しい。ブログに貼りつけたリンクを手動で書き換えさせる気ですか?

Extension の作り方

基本的に Opera Widget と同じように作ればいいのだけど、config.xml の名前空間は W3C Widget の名前空間を使わないといけない。

<?xml version="1.0" encoding="utf-8"?>
<widget xmlns="http://www.w3.org/ns/widgets">
  <name>sample</name>
  <description>sample</description>
  <author href="http://d.hatena.ne.jp/edvakf/">edvakf</author>
  <access origin="http://google.co.uk" subdomains="true"/>
</widget>

こんな感じで。だから、background page から XMLHttpRequest したい場合は Opera の Widget 仕様の <security> タグではなくて、<access> タグを使わないといけない。

ここで W3C Widget の仕様を確認したのだけど、access 要素なんて定義されてないな。どうなってんだか。あ、ちゃんとあった

Widget の構成は .oex という拡張子の zip で、中身は

  • config.xml
  • index.html
  • includes/
    • user.js (名前は何でもいい)

みたいな感じになってる。config.xml は必須、index.html はあってもなくてもいいけど、ある場合は background page となる。includes の中の .js ファイルはすべて UserJS として読み込まれる。

どのページで読み込まれるかは UserJS と同じように @include/exclude をスクリプトの頭に書く。

ただし Opera 用の UserJS をそのまま持ってこれば動くかというと、ちょっとそういうわけにはいかない。

まず、グローバルオブジェクトがページ側の window ではない。ページ側の window は window という変数としてアクセスできる。

UserJS のグローバルにはこれ↓だけしかオブジェクトがないので、location.href は window.location.href と書かないといけないし、XMLHttpRequest は window.XMLHttpRequest と書かないといけない。(document は document でいい)

document
self
window
alert
confirm
prompt
setTimeout
setInterval
clearInterval
clearTimeout
addEventListener
removeEventListener
console
opera
Image
MessageChannel
MessageEvent

かといって UserJS 全体を with({window:window}){...} で囲むのはあまり良い方法ではない

ここの alert を使うと、alert のダイアログが出てる間にもページの JavaScript は動き続ける。つまり Extension の UserJS は一種の Worker みたいな感じになっていて、ページ側とは同じイベントループを共有してない。ただし、だからといって OS でいうところの別プロセスになっているわけではない。Opera の発表の中で「別プロセス」という文言があったと思うが、これはそういう意味でのプロセスではなくて、イベントループが別だという意味なのだと思う。(top でプロセス確認したらわかる)

background page との通信は opera.extension.postMessage/onmessage でいけるはず。postMessage あたりはまだ出来てないらしい。 background のほうでも opera.extensions.onmessage で受けられるらしい。


background page のことについても書きたかったけど次回にまわす。

トラックバック - http://orera.g.hatena.ne.jp/edvakf/20101021
 |