2010-04-11

Sleipnirスクリプトの変数汚染チェック

たまにしかプログラム書かないのでメモがてら実験。

一般的にブックマークレットなんかは変数汚染しないように
無名関数で実行するようになってますが
Sleipnir ではその辺どうなってるのかチェック。

まず、リンククリックで 変数str の値を表示するhtmlを用意。
(html,bodyタグを書くと投稿できなかったので補完してください。)

その次に 変数str の値を変更するスクリプトを用意。
/* Sleipnirスクリプト(WSH), UserActionスクリプト */
var pnir     = new ActiveXObject("Sleipnir.API");
var id       = pnir.GetDocumentID(pnir.ActiveIndex);
var window   = pnir.GetWindowObject(id);
var document = pnir.GetDocumentObject(id);

str = "fuga";
window.alert("str : " + str);
/* SeaHorseスクリプト (JavaScript) */
// ==UserScript==
// @name        変数汚染チェック (JavaScript)
// @include     *test.htm
// @description 変数汚染チェック (JavaScript)
// ==/UserScript== 

var pnir     = new ActiveXObject("Sleipnir.API");
var id       = pnir.GetDocumentID(pnir.ActiveIndex);
var window   = pnir.GetWindowObject(id);
var document = pnir.GetDocumentObject(id);

str = "fuga";
window.alert("str : " + str);
/* SeaHorseスクリプト (SleipnirScript) */
// ==UserScript==
// @name        変数汚染チェック (SleipnirScript)
// @include     *test.htm
// @description 変数汚染チェック (SleipnirScript)
// @type        SleipnirScript
// ==/UserScript== 

var pnir     = new ActiveXObject("Sleipnir.API");
var id       = pnir.GetDocumentID(pnir.ActiveIndex);
var window   = pnir.GetWindowObject(id);
var document = pnir.GetDocumentObject(id);

str = "fuga";
window.alert("str : " + str);
実行結果
Sleipnirスクリプト(WSH)
str : hoge // 変わらず

UserActionスクリプト
str : fuga // 変わった

SeaHorseスクリプト (JavaScript)
str : fuga // 変わった

SeaHorseスクリプト (SleipnirScript)
str : fuga // 変わった

Sleipnirスクリプト(WSH)以外は 変数str の値が変更されました。
WSH だと Sleipnir とは別スレッドで動くので影響を及ぼさないようです。

Sleipnirスクリプト(WSH)の場合、windowオブジェクト からたどらないと
アクセスできないので変数汚染の心配は少ない。
str = "fuga";
window.alert("str : " + str);
 ↓
window.str = "fuga";
window.alert("str : " + window.str); // fuga


では、次に var 宣言したらどうなるかの実験。
/* Sleipnirスクリプト(WSH), UserActionスクリプト */
var pnir     = new ActiveXObject("Sleipnir.API");
var id       = pnir.GetDocumentID(pnir.ActiveIndex);
var window   = pnir.GetWindowObject(id);
var document = pnir.GetDocumentObject(id);

var str = "fuga";
window.alert("var str : " + str);
/* SeaHorseスクリプト (JavaScript) */
// ==UserScript==
// @name var    var 変数汚染チェック (JavaScript)
// @include     *test.htm
// @description var 変数汚染チェック (JavaScript)
// ==/UserScript== 

var pnir     = new ActiveXObject("Sleipnir.API");
var id       = pnir.GetDocumentID(pnir.ActiveIndex);
var window   = pnir.GetWindowObject(id);
var document = pnir.GetDocumentObject(id);

var str = "fuga";
window.alert("var str : " + str);
/* SeaHorseスクリプト (SleipnirScript) */
// ==UserScript==
// @name        var 変数汚染チェック (SleipnirScript)
// @include     *test.htm
// @description var 変数汚染チェック (SleipnirScript)
// @type        SleipnirScript
// ==/UserScript== 

var pnir     = new ActiveXObject("Sleipnir.API");
var id       = pnir.GetDocumentID(pnir.ActiveIndex);
var window   = pnir.GetWindowObject(id);
var document = pnir.GetDocumentObject(id);

var str = "fuga";
window.alert("var str : " + str);
実行結果
Sleipnirスクリプト(WSH)
str : hoge // 変わらず

UserActionスクリプト
str : hoge // 変わらず

SeaHorseスクリプト (JavaScript)
str : fuga // 変わった

SeaHorseスクリプト (SleipnirScript)
str : hoge // 変わらず

SeaHorseスクリプト (JavaScript) だけ 変数str の値が変更されました。
ということはこんな感じなのかな。
// SeaHorseスクリプト (JavaScript)
window
 └ var str = "hoge";

// それ以外
window
 └ (function(){ var str = "hoge"; })();

結局のところ変数汚染が起こる場合もあるので
スクリプトは無名関数でラップして var 宣言しておくのが無難ですね。

2010-04-03

Sleipnir2.9.3 - ActiveXの妙なダイアログ

ActiveXの実行をオフにしてるとflashは実行されません。

この状態でflashの埋め込まれたページを開くと
デフォルトではTridentの情報バーが出るのですが、
鬱陶しいので情報バーをオフにしてます。

Sleipnir2.9.3にバージョン上げたら、今まで見たことないダイアログが。



なんじゃこれは?と調べてみたらありました。
2.9.3を導入後、ActiveXのダイアログが表示される - Fenrir User Community
%Sleipnir%/resources/languages/default/japanese/Client.ini

DialogActiveXTitle=Web ブラウザ 
↓ 
DialogActiveXTitle=Windows Internet Explorer 

こんな感じに変更すれば今まで通り。