2017-01-17 1 views
0

次のエラーを回避するにはどうすればできますか? エラー:[オブジェクト]または[配列]のプロパティとしてクロスオリジンオブジェクトを定義できませんXrayWrapper

編集:特権スコープのオブジェクトを、それほど特権のないスコープに見えるようにする方法を尋ねる必要があります。

私の目標は、以前にクローンされた/挿入された機能の戻り値として、動的に作成されたオブジェクトをページスクリプトにエクスポート/返すことです。

manifest.jsonを

{ 
    "manifest_version": 2, 
    "name": "foo", 
    "version": "1.0.0", 
    "description": "Does something", 
    "content_scripts": [ 
    { 
     "matches": ["<all_urls>"], 
     "js": ["content-script.js"] 
    } 
    ] 
} 

コンテンツ-script.js

function foo (obj) { 
    obj.x = {"xxx": 444}; 
} 
window.wrappedJSObject.foo = exportFunction(foo, window); 

ページスクリプト(Webコンソールに挿入することができます)

foo({"sss": 333}) 
// Error: Not allowed to define cross-origin object as property on [Object] or [Array] XrayWrapper 
0123私はこれを取得brwoserコンソールでディーパー:

"ObjectActor.prototype.grip previewer function threw an exception: Error: Permission denied to access object 
Stack: [email protected]://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/server/actors/object.js:1797:16 
[email protected]://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/server/actors/object.js:131:15 
[email protected]://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/server/actors/webconsole.js:483:12 
[email protected]://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/server/actors/object.js:2187:14 
[email protected]://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/server/actors/webconsole.js:429:12 
[email protected]://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/server/actors/webconsole.js:900:21 
[email protected]://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/server/actors/webconsole.js:857:20 
[email protected]://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/server/main.js:1743:15 
[email protected]://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/shared/transport/transport.js:761:7 
Line: 0, column: 0" 

私は、私は完全にX線の挙動を理解していなかったと思うので、これが原因scurityメカニズムにも、可能であれば私はSHUREていませんよ。詳細にXray vision仕事は私の能力の範囲内ではありませんが、ここでの問題は、あなたがxにアクセスしようとしているページのスクリプト以外の許可を得て、スクリプトのコンテキストで{"xxx": 444}を作成していることがどうあるべきかを説明しようとすると

+0

[編集]に、トピックなるように質問してください:**完全なを含めるには、** [MCVE] * *問題を複製することを。 * manifest.json *、背景/コンテンツ/ポップアップスクリプト/ HTMLの一部を含みます。デバッグの助けを求める質問(「**なぜこのコードは動作しないのですか?**」)には、以下が含まれていなければなりません:►必要な動作、►特定の問題またはエラー*、および►問題を再現するのに必要な最短コード自体**。明確な問題文がない質問は、他の読者にとって有用ではありません。参照してください: "**どのように[mcve] **を作成するか"、[ここで私はどんな話題を聞くことができますか?](http://stackoverflow.com/help/on-topic)、[ask] – Makyen

+0

一般:ページ・コンテキストに挿入するスクリプトから、コンテンツ・スクリプト内の関数を直接呼び出そうとしているようです。あなたはこれをすることはできません。 2つのコンテキスト間でメッセージを渡す必要があります。つまり、通信は非同期になります。あなたは基本的に言うページコンテキストからメッセージを送ることができます:私にこれらのパラメータを使ってこの関数の結果を送ってください。しかし、あなたがしたいことが、オリジナルの関数(ページ内)を上書きされた関数(ページ内)から「秘密に」呼び出すのであれば、それを行うことができます。 – Makyen

+0

[mcve]は**完全**を意味しますが、* minimal *を意味します。問題を再現するために必要なものはすべて*与えてください。 WebExtensionの場合は、ほとんどの場合* manifest.json *が必要です。通常これには、問題を再現するために必要なその他のJavaScriptファイルやHTMLファイルも含まれます。 – Makyen

答えて

1

。つまり、ページスクリプトはこのデータへのアクセスを許可されません。解決策は、ページコンテキスト内でオブジェクトを作成することです。これはcloneIntoで行うことができます。

コンテンツ-script.js

function foo (obj) { 
    obj.x = cloneInto({"xxx": 444}, obj); 
} 
window.wrappedJSObject.foo = exportFunction(foo, window); 
+0

私は誓い、cloneInto()を約1000回試みましたが、愚かなことに私はいつもウィンドウをtargetScopeとして使用しました...ありがとう! – Robbendebiene

関連する問題