Greasemonkey: ドキュメント開始スクリプトランタイムのサポート

作成日 2017年07月25日  ·  17コメント  ·  ソース: greasemonkey/greasemonkey

サポートdocument-startのために@run-at

詳細については、#2483を参照してください。 これは「不可能」かもしれません。

全てのコメント17件

content_scriptsマニフェストキーのrun_atプロパティを使用できます。

4年前にChromeについての同情をあなたと共有しました。 さて、Firefoxについてです。 😭

https://bugs.chromium.org/p/chromium/issues/detail?id=257956で私の提案を言い換えたいと思い

tabs.insertCSS / executeScriptは、タブのURLが空でない(nullでない、未定義ではない、空でない文字列 "")に設定されるまでCSS / JSを挿入し、タブが削除/変更された場合はキャンセルする必要があります

WebExtensionAPIを改善する必要があります。

@iologyなぜ私の提案に反対票を投じたのですか? それは完全に有効です。 さらに、コンテンツスクリプトを使用するだけで、ユーザースクリプトを含むスクリプトタグをドキュメントに挿入できます。

以下は、私の方法を使用してこれを行う方法を説明する必要があります:(確実に機能するはずです)

/**
 * <strong i="8">@typedef</strong> UserScript
 * <strong i="9">@property</strong> {Object} header The parsed header of a script
 * <strong i="10">@property</strong> {String} script The raw script data
 * <strong i="11">@property</strong> {String} type The script media type (in case a script is WebAssembly
 *                         or something other than JavaScript)
 */

/** The load state of this script. Used by the `matches()` function */
const READY_STATE = document.readyState;

(async () => {
    (await (browser.storage.local.get({scripts: []}) // Excuse this horrible code style
        .then(ret => ret.scripts)))                  // of combining `await` and `.then()`
        .forEach(/* <strong i="12">@param</strong> {UserScript} script */ script => {
            if (matches(script.header)) {
                let scriptTag = document.createElement("script");
                scriptTag.setAttribute("type", script.type)
                scriptTag.textContent = script.script;
                document.appendChild(scriptTag);
            }
        });
})();

/**
 * Checks if this script matches this page and @run-at property.
 * 
 * <strong i="13">@param</strong> {Object} scriptHeader The parsed header of a script
 * <strong i="14">@return</strong> {boolean} `true` if this page matches, `false` otherwise
 */
function matches(scriptHeader) {
    // Uses window.location and READY_STATE.
    // TODO: Implement
}

@ ExE-Boss拡張ストレージからスクリプトを取得するまでに、ページの一部はすでにロードされています。

私はそれを知っていますが、WebExtensionsは本質的に非同期であるという事実のために、そうするための別の方法を実際には見ていません。

@ ExE-ボス、バグジラhttps://bugzilla.mozilla.org/show_bug.cgi?id=1332273があります。これは順調に進んでいるようで、@ document-startの問題を解決するのに役立つはずです。 FF57に上陸するかどうかはわかりません。

私はそれを知っていますが、WebExtensionsは本質的に非同期であるという事実のために、そうするための別の方法を実際には見ていません。

@ ExE-ボスそれは文字通り私たちが解決しようとしている問題です。

私もそれを解決しようとしていますが、その時点でページ全体が完全に読み込まれているため、私の解決策は#2525に対してのみ十分に機能します。

Violentmonkeyにもこの問題があり、Tampermonkeyが使用する黒魔術はわかりませんが、実際のdocument-startスクリプトを確実に挿入できます。

Tampermonkey 2.9以前はGPL-3.0であり、GitHubsync XHRを使っていると思っていたのですが、少し調べてみるとどういう風になっているのかわかりませんが、バージョン2.6でサポートが.2767

Tampermonekeyがクローズドソースになった理由については、こちらをご覧ください。

私は海賊版には興味がありません。Tampermonkeyの論理を逆にするのはそれほど難しいことではありませんが、それを行うことは合法ではありません。

@Sxderpこれは

参考までに、Tampermonkeyはドキュメントの開始時にも信頼できません。 処理を高速化する「インスタント」インジェクションオプション(非常にハッキー)がありますが、xkcd.comのような単純なページでは、CSS(ドキュメントの開始時に常にインジェクトされます)が読み込まれる前にフラッシュが表示されます。 他のサイトでも時々フラッシュが出ます。

Tampermonkeyのコードを逆にすることは、これを理解する方法ではありません。 さらに、彼らが使用する実際の方法は、他のユーザーによって提案されたフォーラムで見つけることができます。 メソッドのコピーはcopy-vioではなく、コード自体をコピーするだけです。

しかし、それが不完全な解決策であることはわかっているので、完璧な解決策が必要です。

これを機能させるメソッドが見つかった場合、スクリプトがその構成オプションの少なくともサブセットを同期的に読み取る方法はありますか? これが解決する問題の種類の例として、 https://github.com/ccd0/4chan-x/issues/1627を参照してlocalStorageをクリアします。

これを機能させるメソッドが見つかった場合、スクリプトがその構成オプションの少なくともサブセットを同期的に読み取る方法はありますか?

短期的ではありません。 (get | set)Valueストレージと同期的に通信する方法はありません。 おそらく、構成値を持つ変数がスクリプトのグローバルスコープに注入されるGM側のある種の注入です。 それは私が考えることができる最高のものです、そしてそれはあまり良くありません。

おそらく、構成値を持つ変数がスクリプトのグローバルスコープに注入されるGM側のある種の注入です。 それは私が考えることができる最高のものです、そしてそれはあまり良くありません。

おそらく、それはGMオブジェクトの一部になるでしょう。 GM.initValues.yourVariableようなもの。

このページは役に立ちましたか?
0 / 5 - 0 評価