set が 上手く動作しない件

無限callの件がなんとかなったのでメモ

vimp の問題のようです。
修正箇所は

--- a.js  2009-10-28 19:04:52.000000000 +0900
+++ b.js  2010-02-16 22:44:37.893849800 +0900
@@ -438,7 +438,7 @@
         // Trigger any setters.
         let opt = options.get(option);
         if (event == "change" && opt)
-            opt.set(opt.value, options.OPTION_SCOPE_GLOBAL);
+            opt.set(opt.globalValue, options.OPTION_SCOPE_GLOBAL);
     }
 
     storage.newMap("options", false);

です。

上記コードは、change イベント 受け部位となります。


setglobal の 動作は

  1. set を call して 値を更新
  2. 値が変更されたら、storage 経由で 全windowに変更を通知
  3. 各 window 毎に opt.value を 代入して set を call

となっています。


しかし、opt.value は、local が 優先されるので、
local 値を global 値に 代入することになります。
結果、local 値と global 値が 一致していない場合は、
再帰的に "change" が 発生し続けます。


以下、直接修正したくなかったので、pluginでfixしました。

(function(){
	//http://vimperator.g.hatena.ne.jp/teramako/20090227/1235749155
	liberator.registerObserver("enter",function(){
		const optionsContext = options.add;
		storage.addObserver("options",
		function(key, event, option){
			let opt = options.get(option);
			if (event == "change" && opt)
				opt.set(opt.globalValue, options.OPTION_SCOPE_GLOBAL);
		},optionsContext, window);
		storage.removeObserver("options",
			liberator.eval("optionObserver", optionsContext)
		);
	});
})()
;