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 の 動作は
- set を call して 値を更新
- 値が変更されたら、storage 経由で 全windowに変更を通知
- 各 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) ); }); })() ;