@grant値が設定されているときに `window`(ターゲットページ)オブジェクトにアクセスするにはどうすればいいですか?

How to access `window` (Target page) objects when @grant values are set?


質問 written by Brock Adams @2015-09-20 18:54:32Z

: 4 : 1 : 5

次のWebページを使って作業しているとしましょう。

<html>
<body>
<span id="click">click me</span>
<script>
var hello = function() {
    alert('hello');
}

document.getElementById('click').addEventListener('click', function(e) {
    hello();
});
</script>
</body>
</html>

私のGreasemonkeyスクリプトは次のとおりです。

// ==UserScript==
// @name        My Script
// @include     http://example.com/hello.html
// @version     1
// @grant       none
// ==/UserScript==

window.hello = function() {
    alert('goodbye');
}

Greasemonkeyスクリプトを無効にした#clickで、ページ上の#click要素をクリックすると、「hello」アラートが表示されます。 スクリプトを有効にした状態で、要素をクリックすると「さようなら」という警告が表示されます。

とても簡単です。 Webページのhello関数は、Greasemonkeyスクリプトの関数に置き換えられています。

それでは、Greasemonkey APIを使いたいとしましょう。 @grant値を 'none'以外の有効な値に設定すると( // @grant GM_setClipboard )、Greasemonkeyは 'none'のようにページのスコープ内ではなく「コンテンツスクリプト」としてスクリプトを実行します。 ]、Greasemonkeyスクリプトが機能しません。

window.helloは、ページ上の正しいオブジェクトをターゲットにしなくなりました。

window.hellounsafeWindow.hello置き換えるとunsafeWindow.helloように見えますが、代わりに次のエラーがJSコンソールにスローされます。

エラー:アクセスオブジェクトへのアクセスが拒否されました

@grant GM_setClipboardをターゲットに設定し、ページ上の元のhello関数を置き換えながら、Greasemonkeyスクリプトを書き換える方法はありますか。

システムインフォメーション:

  • Windows 7 64ビット
  • Firefox 32.0
  • グリースモンキー2.2
コメント 1

wiki.greasespot.net/をご覧になるとよいかもしれません2014

written by カンタス航空94ヘビー @2014-09-11 04:04:34Z

回答 1 written by Community @2017-05-23 12:07:17Z
16

none以外の@grant値を設定すると、Greasemonkeyはそのサンドボックスをアクティブにし、 Greasemonkey 2.0は根本的に変更された安全でないウィンドウ処理を変更しました

さて、ターゲットページのスコープで変数を作成または上書きするためには、テクニックのメニューから正しく選択しなければなりません。 例えば:

読むために:

  • 簡単な変数:

     Target page sets: var foo = "bar"; GM script can read: unsafeWindow.foo //-- "bar" 
  • 単純なオブジェクト

     Target page sets: var obj = {A: 1}; GM script can read: unsafeWindow.obj //-- Object { A: 1 } 
  • 複雑なオブジェクト:これは必ずしも可能ではありません。

電話するには:

書く/設定する:

  • 簡単な変数:

     unsafeWindow.foo = "Apple"; 
  • 単純なオブジェクト

     var gmObject = {X: "123"}; unsafeWindow.obj = cloneInto (gmObject, unsafeWindow); 
  • 簡単な機能:

     function gmFunc () { console.log ("Lorem ipsum"); //-- Can use GM_ functions in here! :) } unsafeWindow.func = exportFunction (gmFunc, unsafeWindow); 

このHTMLを考えてください。

<button id="helloBtn">Say "Hello".</button>

そして、このJavaScript:

And this javascript:

あなたはこのjsFiddleページでライブを見ることができます

このページに対してこのGreasemonkeyスクリプトをインストールして実行すると、次のようになります。

which you can see live at this jsFiddle page.


コンソールを開いてボタンを押すと、GMスクリプトがページの変数と機能を読み取って変更できることがわかります。


ノート:

  1. これはFirefox特有のものです。
  2. クロスプラットフォームのコードや複雑な状況では、代わりにスクリプトインジェクションを使用できます。 しかし、注入されたコードはGM_関数に直接アクセスすることはできません。
  3. これらのテクニックは、グローバルなJavaScriptの変数と関数に対してのみ機能することに注意してください。
コメント 1

このような徹底的で明確な答えをありがとうございます。できます!

written by iglvzx 2014 @2014-09-11 12:18:57Z

コメント 2

どういたしまして;助けてうれしい!

written by Brock Adams @2014-09-11 12:40:17Z

コメント 3

このブログ記事にあるように、新しいunsafeWindowないunsafeWindow動作は実際にはFirefox 30からのものではないでしょうか。おそらく、GM 2.0の関連する変更は、新しいAPIがGMスクリプトで利用可能であることを確認すること、およびおそらくGM自体が古い動作に頼るのではなくそれらを適切に使用したことに関係していました。

written by SamB @2015-01-03 19:34:23Z

コメント 4

正確ではありません。そのブログエントリはFirefoxに関するものではなく、SDKに関するものであることに注意してください。GMはSDKを使用していないので、その時点で変更を加える必要はありませんでした。将来的にFFへの変更を計画しても変更が強制されるかどうかは定かではありませんが、新しい方法の方がGM関数をターゲットページのコードに簡単に統合できるという点で優れています(危険な方法)。

written by Brock Adams @2015-01-03 19:42:28Z