Καλωσορίσατε, επισκέπτη!

Φαίνεται πως έρχεστε για πρώτη φορά εδώ. Αν θέλετε να συμμετέχετε, πάτησε ένα από αυτά τα πλήκτρα!

【済】[Firefox] Function.bind() + Promise.prototype.then()が機能しておらず再生できない

About: ZenzaWatch DEV版
ytyt
επεξεργάστηκε October 20 σε Συζητήσεις κώδικα [?]

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で解決しました。ありがとうございます。

Συνδεθείτε ή Εγγραφείτε για να σχολιάσετε.