NicoCommunity New Res Checkerの不具合(多分解消済み)に関するメモ

教訓。AutoPagerizeクローンのことを忘れるべからず。

不具合が起きていたバージョン

    var callback = function() {};
    if (typeof window.AutoPagerize != 'undefined') {
        try {
            var ap = eval('ap', window.AutoPagerize.addFilter);
            callback = function() { ap.request(); };
        } catch(e) {
            callback = function() {};
        }
    }
  • 実行時に出たエラーメッセージ: ap is null

修正版

完璧な対策ではないけど,ここまでやればまあ十分じゃないかな,と思う。

    var callback = function() {};
    if (typeof window.AutoPagerize != 'undefined') {
        try {
            var ap = eval('ap', window.AutoPagerize.addFilter);
            if(typeof ap == "object" && ap != null && typeof ap.request == 'function')
                callback = function() { ap.request(); };
        } catch(e) {
            callback = function() {};
        }
    }

window.AutoPagerizeがあるからといって,それはAutoPagerizeとは限らないよ,というお話。AutoPagerizeクローンの存在は知っているのに頭からすっぽり抜け落ちていた。

22:35 追記。

AutoPagerizeのソースを眺めていたらこんな記述を発見。

var ap = null

なにか根本的な勘違いをしていたかもしれない…。
ページのURLに対応するSITEINFOが見つかった時にapにオブジェクトが代入されるので,Autopagerizeが読み込み済みでもapはnullのまま,ということが十分にあり得る。
というわけでapが取得できる可能性ができるだけ高くなるように書き換えてきた。

    var callback = function() {};
    if (typeof window.AutoPagerize != 'undefined') {
        var ap = null;
        var callback = function() {
            if(ap != null)
                return ap.request();
            try {
                var _ap = eval('ap', window.AutoPagerize.addFilter);
                if(typeof _ap == 'object' && _ap != null && typeof _ap.request == 'function') {
                    ap = _ap;
                    return ap.request();
                }
            } catch(e) {
                ap = null;
            }
        };
    }