ユーザスクリプトがロードされるタイミング

先日のGreasemonkeyのソースがかなりアレな件
id:poolmmjp さんから

クロージャ不要の件もonload不要の件も、今の実装がそうってだけで、今後のバージョンもそうだっていうのはあるのかなあ?仕様書に書いてあるならそうなんだろうけど、コードがそうなってるだけなら、たまたまかも。

というブクマコメントを頂いたので回答。

仰るとおり。たまたまかもしれません。

ただ、クロージャに関してはGreasemonkey製作者の気まぐれで変更される可能性がありますが、DOMContentLoadedイベント発行時にユーザスクリプトが読み込まれる方は簡単には変わらないでしょう。

理由.1

読み込んだページのURLが確定していないといけない

  • ユーザスクリプト@includeにマッチし、かつ@excludeにマッチしないURLで読み込まれる必要がある
  • 301とか302,307 のステータスが返ってきてリダイレクトして全く別のURLになったけどユーザスクリプトを読み込んじゃった...てへっ♪ じゃぁ話にならない

理由.2

DOMが生成されている必要がある
new Components.utils.Snadbox()上でスクリプトを実行させるのだが、この生成されたオブジェクトは最初からwindowdocumentオブジェクトを持っているわけではない。

sandbox.window = safeWin;
sandbox.document = sandbox.window.document;
sandbox.unsafeWindow = unsafeContentWin;

というようなことしてオブジェクトをわざわざ配置しているのである。これをするためには当然のことながらsafeWinやらunsafeContentWinnullだったりundefinedではいけない。

理由.1は理由.2が保障されれれば解決なので実質理由.2が解決されれば良い。んで、そのタイミングは? っていうとDOMContentLoadedイベントが発行された時でしょ。




というか、ドキュメントに書いてあった