https://wiki.greasespot.net/Greasemonkey_Manual:API
Greasemonkey APIは通常、特権アクションであり、通常はすべての同期アクションです。 コンテンツスクリプトには(ほとんど)APIアクセスがないため、特権アクションを実行するにはメッセージを渡す必要があります。 Web拡張機能は、同期メッセージパッシングのみを取得
したがって、それぞれの方法には独自の課題があります。
より簡単に:
GM_getResourceURL
は同期して結果を生成する必要がありますが、計算するのは簡単です。GM_addStyle
は些細なことです。GM_log
はおそらく廃止するか、 console.log
マップする必要があります。GM_openInTab
機能的には結果を生成せず、順序付けも重要ではありません。GM_registerMenuCommand
には同期動作はありません。GM_setClipboard
は結果を生成しません。GM_xmlhttpRequest
は完全に非同期です。もっと強く:
GM_deleteValue
は結果を生成しません。 順序付けは依然として重要です(つまり、Xの削除は、将来のXのセットの前に行う必要があります)。GM_setValue
は削除と同等です。 同期結果はありませんが、順序は重要です。とても厳しい:
GM_getValue
は、同期して結果を生成する必要があります。GM_listValues
は、同期して結果を生成する必要があります。 (さらに、AFAICTストレージは優れたバッキングAPIを提供しません。唯一のオプションは、名前で1つの値をフェッチするか、すべての名前と値をフェッチすることです。スクリプトなどで分離する方法もありません。)GM_getResourceText
は同期して結果を生成する必要があり、非常に大きな値になる可能性があります。 (つまり、それらすべてをメモリに事前にキャッシュするのはコストがかかりすぎる可能性があります。)ここでは、 bug1332273が興味深いかもしれません。
ポインタをありがとう、私はそれらが両方とも非常に有用であることに同意します。
ああ、多分ある程度の同期メッセージパッシングが可能です!
これをテストします。これにより、上記で呼び出されたメソッドに単純な同期実装(バックグラウンドのみのAPIに基づく)を使用できるようになりますか?
これはコンテンツ側でpromiseを返すため、事実上非同期です。 ここでは「同期」は誤称だと思います。これは、子から親へのメッセージと応答をペアにして、保留中の応答を手動で追跡する必要がないようにするようなものです。
利用可能な唯一の同期APIは同期XHRであり、これはwebrequestなどでインターセプトされる可能性があります。
同期XHRがコンテンツスクリプトで正しく機能しない:https://bugzilla.mozilla.org/show_bug.cgi?id = 1360968したがって、現時点では、コンテンツ>バックグラウンドからの同期チャネルがありません。
GM_setValue
とGM_getValue
は同期操作として設計されているように見えます。単一のプロセスブラウザでは、複数のタブで操作する場合は問題なく動作しますが、e10sでは動作しません(https://github.com/greasemonkey / greasemonkey / issues / 2427)。 古い拡張APIを使用すると、簡単に修復できますが、WebExtでは修復できません。 同期メッセージがないと(小さなデータの場合でも、短い値のみを出力します)、より多くのタブ間で値を適切に同期することはできません。 ある時点で、これは常に競合状態になります。
WebExtバージョンで上記の問題をどのように解決するかに関係なく、非同期で設計された新しいset / getメソッドを取得する必要があるため、重要な場合は非同期でスクリプトを記述できます。 ドキュメントには、複数のタブを操作した場合のGM_setValue
およびGM_getValue
動作の欠如に関する情報が含まれている必要があります。
imo、複数のタブでGM_setValue
/ GM_getValue
を使用することはまれなユースケースであり、順序に従う必要があります。 結果として、コンテンツスクリプトに_GM_values_のコピー(キャッシュ)を保存し、常にキャッシュから読み取り、非同期を書き戻し、バックグラウンドスクリプトによってトリガーされたイベントでキャッシュを更新することは許容できる解決策です。
ところで、もしそうなら、可能であればGM_addValueChangeListener
と同等のAPIを追加するのは素晴らしいことです。 (そして私はaddValueChangeListener
という名前が嫌いです
私の開発ブランチでは、次のサポートがあります。
GM.getResourceURL
GM.deleteValue
、 GM.getValue
、 GM.listValues
、 GM.setValue
私は決して追加するつもりはあり
GM_log
GM_addStyle
まだ必要です:
GM_xmlhttpRequest
私は遅らせる(または多分落とす)予定です:
GM_registerMenuCommand
(これは常に莫大なサポートコストGM_getResourceText
つまり、ここでの進歩は実際には非常に近いということです。
上記のコミットでの良いフィードバック、忘れないでください。
新しいアドオンを試してみました。 クロスドメインxhrリクエストは、GM_xhr機能なしですでに有効になっているようです。 これは確かに動作ですか?
次のコードを使用して、userscript grantnoneを試してください。
fetch(prompt()).then(resp => resp.text()).then(text => alert(text)).catch(error => alert(error));
うーん、確認しました。 現在、拡張機能の「コンテンツスクリプト」としてユーザースクリプトを実行しており、拡張機能のすべての権限が付与されています。
私はこれを少し調べましたが、これまでのところ、非特権(「Webスコープ」-「コンテンツ」スコープがあいまいなため、これを何と呼びますか?!)コードを実行する方法については暗闇に包まれています。 私が見つけることができる最も近いものは、スクリプトタグの作成に関する
現在、CSPを変更する唯一の方法は、すべてのドキュメントリクエストのヘッダーをインターセプトして変更することです。 Web拡張機能をコンテンツCSPから免除するための未解決の問題がありますが、それらについてはあまり活動していないようです。
<script>
タグを挿入するだけでなく、 window.eval
もページスコープで実行する必要があると思います。
正式な用語は、「コンテンツスクリプトスコープ」と「ページスコープ」です。
もう1つの問題は、GMAPIを定義できる別のスコープでそれらをラップするために文字列処理が必要になることです。
また、webextensionsでSandbox
相当するバグを報告しましたが、優先度も高くありません。
スクリプトとevalの両方のAIUIは、CSPによるブロックに対して脆弱です。 しかし、私はevalが特権を削除することを確認しました。
https://bugzilla.mozilla.org/show_bug.cgi?id=1391669
任意のページでコンテンツスクリプトを実行する可能性がある場合は、 <all_urls>
必要です。 それを要求すると、コンテンツスクリプトがそれを取得するため、XHRをどこにでも送信できます。
少なくともFirefox( https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Content_scripts#Using_eval ()_in_content_scripts)では、ページスコープにドロップダウンできますが、実際にはページスコープになります。 APIをスクリプトに安全に公開するには、ページで実行されているすべてのもの/すべてに公開する必要があります(AFAIK)。これはさらに悪いことです。
フェッチとxhrをコンテンツスクリプトで上書きできますか?
たぶん、独自のCORSチェックを行う変更されたフェッチを提供します。
GM.xmlhttpRequest()
が60a50d05b1e565571d8a3e638b0683a1a9c2beaaに追加されましたGM.getResourceText()
は#2548でカバーされますGM.registerMenuCommand()
は意図的にスキップされています。@ the8472 https://github.com/greasemonkey/greasemonkey/issues/2232#issuecomment -326841025でwithUnsafeWindow()
実装を参照してください
これは、古いwith (object) ...
関数の動作を模倣しており、少しだけ安全です。 (最新のブラウザが必要です。)
Tampermonkeyでは、 GM_addStyle
は、CSP制限をバイパスできるスタイルを挿入する特別な機能があります(インライン<style>
が禁止されている場合)。 この機能をGreasemonkeyでも使用できるようになったら嬉しいです。
最も参考になるコメント
Tampermonkeyでは、
GM_addStyle
は、CSP制限をバイパスできるスタイルを挿入する特別な機能があります(インライン<style>
が禁止されている場合)。 この機能をGreasemonkeyでも使用できるようになったら嬉しいです。