2017-01-17 15 views
0

Как я могу избежать следующей ошибки и почему я ее получу?Ошибка: не разрешено определять объект перекрестного происхождения как свойство на [Object] или [Array] 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); 

страница сценария (можно вставить в веб-консоли)

foo({"sss": 333}) 
// Error: Not allowed to define cross-origin object as property on [Object] or [Array] XrayWrapper 

Глубже в консоли 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" 

Я думаю, что я не вполне понимаю поведение XRay, поэтому я не уверен, если это вообще возможно благодаря механизмам scurity.

+0

Пожалуйста [править] вопрос быть на тему: включать ** полный ** [mcve], что * дублирует проблему *. Включая * manifest.json *, некоторые из сценариев background/content/popup/HTML. Вопросы, требующие помощи по отладке («** почему этот код не работает? **)) должны включать: ► желаемое поведение, ► конкретную проблему или ошибку * и * самый короткий код, необходимый для его воспроизведения ** в вопросе сам**. Вопросы без четкого описания проблемы не полезны другим читателям. Смотрите: «** Как создать [mcve] **», [о каких темах я могу спросить здесь?] (Http://stackoverflow.com/help/on-topic) и [ask]. – Makyen

+0

Общие сведения. Кажется, вы хотите напрямую вызвать функцию в сценарии содержимого из сценария, который вы вставляете в контекст страницы. Ты не сможешь это сделать. Вам нужно передать сообщения между двумя контекстами. Это означает, что связь будет асинхронной. Вы можете отправить сообщение из контекста страницы, который в основном говорит: Пожалуйста, пришлите мне результаты этой функции с этими параметрами. Однако, если то, что вы хотите сделать, это «тайно» вызывать исходную функцию (на странице) из перезаписанной функции (на странице), вы можете это сделать. – Makyen

+0

[mcve] означает ** совершенно **, но * минимальный *. Пожалуйста, дайте * все *, чтобы дублировать вопрос. Для WebExtension это почти всегда требует * manifest.json *. Обычно это также включает в себя различные другие файлы JavaScript и HTML, необходимые для дублирования проблемы. – Makyen

ответ

1

Пытаясь объяснить, как Xray vision работа в деталях не в моей способности, но проблема здесь должна быть, что вы создаете {"xxx": 444} в контексте сценария с другим разрешением, чем сценарий страницы, который пытается получить доступ к x. Это означает, что скрипт страницы не будет иметь доступа к этим данным. Решение состоит в том, чтобы создать объект в контексте страницы, это можно сделать с помощью cloneInto.

контент-script.js

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

Клянусь, я попробовал cloneInto() почти тысячу раз, но по глупости я всегда использовал окно в качестве targetScope ... Большое вам спасибо! – Robbendebiene