2016-07-19 4 views
0

Я встречаюсь с проблемой при создании расширения Chrome.chrome.runtime.sendMessage Uncaught Error: неверные аргументы для подключения

Я создаю , который предназначен для встраивания скриптом контента на любую веб-страницу в момент, когда пользователь нажимает на мою кнопку расширения.

В этом есть поле выбора, которое при изменении должно отправить сообщение обратно на расширение.

Расширение должно затем получать данные из электронной таблицы Google, а затем отправлять обратно информацию на .

Мой manifest.json следующий (редактор Примечание: фильтруются в соответствующих областях):

{ 
    // manifest.json 

    "background" : { 
    "scripts" : ["background.js"] 
    }, 
    "browser_action": { 
    "default_icon": "icon-small.png" 
    }, 
    "content_scripts": [ { 
    "js": ["jquery-1.11.1.min.js","selectionjfm.js","jquery-ui.min.js","nlp_compromise.js"], 
    "css":["jquery-ui.css"], 
    "matches": [ "http://*/*", "https://*/*"], 
    "all_frames":true, 
    "run_at": "document_end", 
    "info.status":"complete", "status": "complete" 
    }], 
    // ...  
    "permissions": [ 
    "identity", "https://accounts.google.com/*", "https://www.googleapis.com/*","https://spreadsheets.google.com/*","tabs","storage","<all_urls>" 
    ], 
    "web_accessible_resources": [ 
    "jquery-ui.min.js","popup.html","popup.js","inject.js","jquery-1.11.1.min.js","loader.gif" 
    ], 
    "oauth2": { 
    "client_id": "xxxxxxxxx.apps.googleusercontent.com", 
    "scopes": ["https://www.googleapis.com/auth/plus.login","https://spreadsheets.google.com/feeds"] 
    } 
} 

Это расширение включает в себя selectionjfm.js скрипт в качестве контента, который Вставляет таким образом:

// selectionjfm.js - content script as included in manifest.json 

var iframe = document.createElement('iframe'); 
iframe.setAttribute("id", "my_id"); 
iframe.src = chrome.runtime.getURL('popup.html'); 
document.body.appendChild(iframe); 

Но и впрыскивает JavaScript файл inject.js следующим образом:

// selectionjfm.js - content script as included in manifest.json 

var s = document.createElement('script'); 
s.src = chrome.runtime.getURL('inject.js'); 
(document.head || document.documentElement).appendChild(s); 
console.log("[Content script 1] added inject.js to the content page"); 
var s = document.createElement('script'); 
s.src = chrome.runtime.getURL('jquery-1.11.1.min.js'); 
(document.head || document.documentElement).appendChild(s); 

Содержит поле выбора. Когда пользователь выбирает другое значение в этом поле, мне нужно запустить запрос в Google Spreadsheet с помощью API Google Spreadsheet. Вот почему я хочу отправить сообщение обратно на расширение, поскольку я понимаю, что только оттуда я могу использовать эти API.

inject.js ждет сообщения, посылаемые при onchange событий на поле выбора «s срабатывает.

// inject.js waitning for message from the iframe 
window.addEventListener("message", 
    function (e) {... 

Сообщение отправлено по :

//poupup.js (iframe source) 
var sel = document.getElementById("databaseselect"); 
      sel.addEventListener("change", function (e) {    
       sendMessTobg("changedatabase",sel.selectedOptions[0].text);  


      }); 

Затем попробуйте отправить сообщение на background.js:

// inject.js 

if (e.data.message == "changedatabase") { // recieving message from the iframe : this works fine 
    if (e.data.data != null) { 
    console.log("[Content script] trying to send databasechange to extension"); 
    chrome.runtime.sendMessage({ 
     databasechange:true, 
     content:e.data.data 
    }, function (reply) { 
     if (chrome.runtime.lastError) { 
     console.log("[Content script] failure to send databasechange to extension"); 
     } else { 
     console.log("[Content script] databasechange with backgroud is a success!"); 
     } 
    }); 
    } 
} 

это является то, что chrome.runtime.sendMessage дает ошибка:

Uncaught Error: Invalid arguments to connect.

Я видел в другом сообщении что-то о отправке идентификатора расширения, но в документации говорилось, что это не является обязательным, так как если не указано, идентификатор будет моим собственным расширением.

+0

Итак, чтобы уточнить, последний бит кода находится в 'inject.js'? Было бы лучше, если бы вы включили в каждый блок кода комментарий, например '// inject.js', потому что вы часто говорите об одном фрагменте кода, который делает что-то другому. – Xan

+0

И расширение на _ "ждет сообщения, отправленного'