Greasemonkey: WebExt:すべてのGMAPIをサポート

作成日 2017年03月03日  ·  19コメント  ·  ソース: greasemonkey/greasemonkey

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は同期して結果を生成する必要があり、非常に大きな値になる可能性があります。 (つまり、それらすべてをメモリに事前にキャッシュするのはコストがかかりすぎる可能性があります。)

最も参考になるコメント

Tampermonkeyでは、 GM_addStyleは、CSP制限をバイパスできるスタイルを挿入する特別な機能があります(インライン<style>が禁止されている場合)。 この機能をGreasemonkeyでも使用できるようになったら嬉しいです。

全てのコメント19件

ここではbug1332273が興味深いかもしれません。

ポインタをありがとう、私はそれらが両方とも非常に有用であることに同意します。

ああ、多分ある程度の同期メッセージパッシングが可能です!

https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/runtime/onMessage#Sending_a_synchronous_response

これをテストします。これにより、上記で呼び出されたメソッドに単純な同期実装(バックグラウンドのみのAPIに基づく)を使用できるようになりますか?

これはコンテンツ側でpromiseを返すため、事実上非同期です。 ここでは「同期」は誤称だと思います。これは、子から親へのメッセージと応答をペアにして、保留中の応答を手動で追跡する必要がないようにするようなものです。

利用可能な唯一の同期APIは同期XHRであり、これはwebrequestなどでインターセプトされる可能性があります。

同期XHRがコンテンツスクリプトで正しく機能しない:https://bugzilla.mozilla.org/show_bug.cgi?id = 1360968したがって、現時点では、コンテンツ>バックグラウンドからの同期チャネルがありません。

GM_setValueGM_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.deleteValueGM.getValueGM.listValuesGM.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()は意図的にスキップされています。
  • cross-origin-fetch(上記のコメントによる)を継承するすべてのスクリプトは#2549です

@ the8472 https://github.com/greasemonkey/greasemonkey/issues/2232#issuecomment -326841025でwithUnsafeWindow()実装を参照してください

これは、古いwith (object) ...関数の動作を模倣しており、少しだけ安全です。 (最新のブラウザが必要です。)

@arantius7月25日に書い

私は決して追加するつもりはあり

GM_log
GM_addStyle

これらは、このチケットの作成時に( 3月3日に@arantiusによって)些細なものとして示されました(GM_logからconsole.logへのマッピングを想定)。

私の経験では、これらは最も一般的に使用される2つのAPI呼び出しです。 それらを放棄することは、理由もなく多くの古いスクリプトを壊しませんか? それとも、devブランチだけを参照していましたか?

Tampermonkeyでは、 GM_addStyleは、CSP制限をバイパスできるスタイルを挿入する特別な機能があります(インライン<style>が禁止されている場合)。 この機能をGreasemonkeyでも使用できるようになったら嬉しいです。

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