Φαίνεται πως έρχεστε για πρώτη φορά εδώ. Αν θέλετε να συμμετέχετε, πάτησε ένα από αυτά τα πλήκτρα!
Firefoxで2.4.29以降、AntiPrototypeJsした場合に、bindとPromise.thenの組み合わせが機能しなくなっています。
その結果、以下の箇所で処理が停止して「動画読込中」の表示のまま再生されません。
Promise.all([
VideoInfoLoader.load(watchId, options.videoLoadOptions),
WatchInfoCacheDb.get(this._watchId),
this._initializePlaylist() //videoinfo取得に300msくらいかかってるぽいから他のことやろうか
]).then(this._onVideoInfoLoaderLoad.bind(this, this._requestId)
).catch(this._onVideoInfoLoaderFail.bind(this, this._requestId));
検証コード
new Promise(res => res()).then(
(function (x) { window.console.log("called") }).bind(this)
)
expected result: calledが表示される
actual result: 何も表示されない
これはbindの結果が別のiframe由来のオブジェクトであるために
Functionであると認識されていないのではないかと考えられます。
onFulfilled
これが関数ではない場合は、内部的に "Identity" 関数 (受け取った引数を返す関数) に置き換えられます。
-- https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/then
次のように新しいFunctionでラップしてやると動作します。
}
+ Function.prototype._bind = Function.prototype.bind;
+ Function.prototype.bind = function(...args1) { let f = this._bind(...args1); return (...args2) => f(...args2) };
console.info('Decontamination result', decontaminated);
動作しないバージョン: 2.4.29, 2.4.30
動作するバージョン: 2.4.28
検証環境: Firefox 69.0.2 + Tampermonkey 4.9.5941
比較検証環境: Chromium 77 + Tampermonkey 4.8.41
Σχόλια
v2.4.31のrevertで解決しました。ありがとうございます。