Hatena::Groupos0x

FFFF RSSフィード

0xFFのメモです。

2008 May 14th Wednesday

Greasemonkeyは(function(){\nと\n})()を付加しなくなる(という夢を見た)

| 11:03 | Greasemonkeyは(function(){\nと\n})()を付加しなくなる(という夢を見た) - FFFF を含むブックマーク はてなブックマーク - Greasemonkeyは(function(){\nと\n})()を付加しなくなる(という夢を見た) - FFFF

2009/02/21追記: 0.8.20090123.1からは、再び(function(){\nと\n})()を付加するようになった

ちょっと久しぶりにtrunk眺めたらこんな修正が入っていた。

http://greasemonkey.devjavu.com/changeset/737/trunk/src/components/greasemonkey.js

Greasemonkeyのソースがかなりアレな件 - hogehoge @teramakoBig Sky :: Greasemonkeyで実行されるスクリプトはイケてるのか?で取り上げられていた、Greasemonkeyとして実行されるScriptには前に"(function(){\n"が、後ろに"\n})()"が付加されて実行されるという話について、これが付加されなくなっている。

これによって、いきなりreturnしちゃうとエラーになるから、その場合だけfunctionをくっつけてあげて実行し直すという処理になっている*1

Greasemonkeyの小話 - FFFF - 0xで書いたように、このfunctionはスコープには全く影響しないので影響はほとんどないと思うけど、AutoPagerizeのようにいきなりreturnしているScriptは修正したほうが良さそう。

*1:実行し直す部分は、将来的にはなくなるかも?

2008 March 18th Tuesday

Greasemonkeyの小話

| 15:26 | Greasemonkeyの小話 - FFFF を含むブックマーク はてなブックマーク - Greasemonkeyの小話 - FFFF

Big Sky :: Greasemonkeyで実行されるスクリプトはイケてるのか?より、

// ==UserScript==
// @name           broken source
// @namespace      xxxxxx
// @description    broken source
// @include        http://*
// ==/UserScript==

})();
(function () {

これがエラーにならないって話。

http://svn.devjavu.com/greasemonkey/trunk/src/components/greasemonkey.js

で、

      var scriptSrc = "(function(){\n" +
                         requires.join("\n") +
                         "\n" +
                         contents +
                         "\n})()";
      this.evalInSandbox(scriptSrc,
                         url,
                         sandbox,
                         script);

こんな風にしてるから、確かに1個上のはエラーにならない。(このevalInSandboxは独自メソッドで、実際にevalInSandboxしてるのはそのメソッドの中で、Components.utils.evalInSandboxを呼んでいる)

じゃあ、この無理やり関数を切った間で変数を作ったらそいつの扱いはどうなるんだろうと思い、少し調べてみた。

// ==UserScript==
// @name           broken source
// @namespace      xxxxxx
// @description    broken source
// @include        http://*
// ==/UserScript==

})();

var hoge = {};

(function () {

こんな風に関数を切ったところで変数を宣言してみる。これは以下のパターンが考えられる。

  1. thisのプロパティに追加 (this.hoge)
  2. windowのプロパティに追加(普通のHTMLページでの挙動) (window.hoge)
  3. unsafeWindowのプロパティに追加(これはどう考えてもないけど) (unsafeWindow.hoge)
  4. どのプロパティにも追加されない

結果、thisのプロパティだけに追加されて、windowのプロパティにはならなかった。そもそも、evalInSandboxで実行されるとき、thisとwindowは違うものになっているので当然な挙動。

で、その後に実行されるScriptでその変数が参照可能か調べてみた。

// ==UserScript==
// @name           broken source2
// @namespace      xxxxxx
// @description    broken source
// @include        http://*
// ==/UserScript==

})();

console.log(typeof(hoge), this.hoge, window.hoge, unsafeWindow.hoge);

(function () {

結果は全てundefined

そんな気はしてたけど、Greasemonkeyグローバル変数を汚染しないのは無名関数で囲ってあるからではなく、evalInSandboxで安全に実行されているから。気持ちの悪い"(function(){" "})()"はおそらくそれが必要だったころの名残かなにかで、現在は不要なんじゃないかと思われる。いきなりreturn;できるってメリット?はあるな。というか、そう書かれている(AutoPagerizeとかの)Scriptがエラーにならないように互換性のため残ってるのかもしれない。

2008 February 20th Wednesday

GM_xmlhttpRequestでリダイレクト先URL取得?

| 11:00 | GM_xmlhttpRequestでリダイレクト先URL取得? - FFFF を含むブックマーク はてなブックマーク - GM_xmlhttpRequestでリダイレクト先URL取得? - FFFF

GM_xmlhttpRequest - GreaseSpot Wikiにも書いてあるけど、ver0.8以降ではリダイレクトURLを取得できる。具体的には、[responseObject].finalUrlにリダイレクト先のURLが入っている。ver0.8以降なので、普通に使えるようになるのはまだ先になりそうだけど、お世話になりそうなのでメモメモ。

no title

ちなみに、このchannel.URIFirefox Onlyで、且つ特権がないと取得できないみたい。

[追記:2008/04/01]drryさん曰く

最近の trunk で GM_xhR() の finalUrl が XD 制限対象になってしまったので、実質価値が無くなった。悲しい。

ただ、一応trunkは見てるつもりなんですが、それらしい変更がわからず未確認。

[追記2:2008/04/24]

Google Bookmarks IncSearch - Firefox Extension が、Firefox3でブックマーク同期化が出来ない問題に対処しました。 - Enjoy*Studyより、Firefox3の特権付XMLHttpRequestでは、リダイレクトが発生しないそうです。(BASIC認証の件と同じく、GETかPOSTかで違いがあるかもしれませんが) finalUrl は確かに価値がなくなってしまいそうです。残念。

(drryさんが言うtrunkはGreasemonkeyのtrunkじゃなくて、Firefox本体のtrunkだったみたい)

2008 January 31st Thursday

ローカルなどでUseGoogleWebHistoryが動かないように

| 14:41 | ローカルなどでUseGoogleWebHistoryが動かないように - FFFF を含むブックマーク はてなブックマーク - ローカルなどでUseGoogleWebHistoryが動かないように - FFFF

UseGoogleWebHistoryがローカルサーバーなどでも動いてしまって困るのでとりあえず下記の一行を入れてみた。

if (!location.host.match(/\./) || !location.host.match(/[^\d\.]+/)) return;

ドメインにドットが含まれていない場合と、ドメインがドットと数字だけの場合はキャンセル。

あとは、@include を http://* に。これでSSLページでも実行されない。

とりあえずはこれでOKかな。


追記

if (window != window.parent) return;

も加えた

quaaquaa2008/01/31 20:49>ところで、Operaだとdocument.postMessageなんだよね。なんで違うんだ?

以前のHTML 5の仕様(http://www.whatwg.org/specs/web-apps/2006-01-01/#postmessageなど)ではpostMessageはDocumentの方に属していたので、おそらく実装時期によって違いが出ているんだと思います。

os0xos0x2008/01/31 20:57>quaaさん
おお、なるほど。納得です。
考えてみるとdocument同士のやり取りというより、window同士のやり取りに使う感じだからwindowのほうがしっくりきますね。

nanto_vinanto_vi2008/05/16 02:41'_' + Math.pow(10,len)
の代わりに
(1 << len).toString(2)
とすれば扱える桁数がちょっと増えるけど、ぱっとFirefoxで試した限り速度は遅くなるみたいですね。

それから「ユーザーエージェントに頼らないブラウザの判定」の追記部分「Firefox(Geckoエンジン)がNGでした」にins要素のタグ閉じ忘れがあります。

os0xos0x2008/05/16 03:11>nanto_viさん
なるほど。ぱっと見そちらのほうが速くなりそうですが、toStringがコスト高めなのかな。

タグ閉じ忘れの指摘ありがとうございます、修正しました。