0

Мой хром-расширение делает следующее:Chrome - расширение: Ошибка при отправке сообщения из background.js в content.js

1) Когда пользователь нажимает значок приложения новое всплывающее окно страницы, которые инициированы с 3 поля для заполнения.

2) Когда кнопка отправки нажата, вызывается getBackgroundPage(), а входные значения хранятся внутри background.js.

3) Я хочу как-то использовать эти значения внутри моего сценария содержания после того, как они будут сохранены в фоновом режиме. Я знаю, что каждая вкладка - это новый процесс, и отправка сообщения между ними немного сложна и выполняется асинхронно, но должен быть простой способ сделать это. Пожалуйста, если у вас есть жизнеспособное решение, сделайте его максимально понятным!

Вот код:

Manifest.js

{ 
    "name": "My Extension", 
    "version": "1.0", 
    "manifest_version": 2, 
    "browser_action": { 
    "default_icon": "icon.png" 

    }, 

    "background": { 
     "scripts": ["background.js"], 
     "persistent": false 
    }, 
    "permissions": [ 
    "tabs", "<all_urls>","storage" , "activeTab" 
    ], 

"content_scripts": [ 
    { 
     "matches": [ "https://www.linkedin.com/*"], 
     "js": ["userInfo.js"] 
    }] 

} 

Background.js

chrome.browserAction.onClicked.addListener(function(tab) { 
     { 
     chrome.tabs.create({ 
      url: chrome.extension.getURL('dialog.html'), 
      active: false 
     }, function(tab) { 
      localStorage["tabid"]=tab.id; 

      chrome.windows.create({ 
       tabId: tab.id, 
       type: 'popup', 
       focused: true, 
       height: 350, width:400 

      }); 
     }); 
    } 

    return true; 
}); 





function setCredentials(username,password,token) { 

    console.log(username); 
    console.log(password); 
    console.log(token); 


{ 
    chrome.tabs.executeScript(parseInt(localStorage.tabid), { 
     file: "userInfo.js" 
    }, function() { 
     if (chrome.runtime.lastError) { 
      console.error(chrome.runtime.lastError.message); 
     } 
    }); 

    } 


}; 

Dialog.js

document.forms[0].onsubmit = function(e) { 
    e.preventDefault(); // Prevent submission 
    var username = document.getElementById('username').value; 
    var password = document.getElementById('password').value; 
    var token= document.getElementById('token').value; 
    chrome.runtime.getBackgroundPage(function(bgWindow) { 
     bgWindow.setCredentials(username,password,token); 
     window.close();  // Close dialog 
    }); 
}; 

userInfo.js

alert("got it"); 

Dialog.html

<!DOCTYPE html> 
<html> 
    <head> 

    <style> 
     #leadinformation { text-align: left; font: 16px; position :absolute; padding:20px 20px 20px 20px; } 
     #formwrapper {padding:10px 20px 20px 20px; width:200px;} 
     #formsubmit {padding:0px 20px 20px 25px;} 
     leadinformation input{ position:relative;} 

     #ok { position: relative; top: 30%; font-family: Arial;font-weight: bold; font-size: 13px; color: #ffffff; padding: 5px 5px 5px 5px;background-image: webkit-linear-gradient(top, #287bbc 0%,#23639a 100%);background-color: #287bbc; border-width: 1px; border-style: solid; border-radius: 3px 3px 3px 3px; boder-color: #1b5480; width: 160px; height: 35px;} 
     #titleParagraph {font-weight:bold; font-size:20px;} 
    </style> 
    </head> 
    <body> 



     <div id="leadinformation"> 
      <p id="titleParagraph">Provide your Salesforce login information!</p> 
      <form> 
      <div id="formwrapper"> 
       Username: <input id="username" type="username"> 
       Password: <input id="password" type="password"> 
       Security Token: <input id="token" type="token"> 
      </div> 

      <div id="formsubmit"> 
       <input id="ok" type="submit" value="OK"> 
      </div> 

      </form> 
      <script src="dialog.js"></script> 
     <div> 


    </div> 
    </body> 
    </html> 

После нажатия на кнопку OK имя пользователя, пароль и маркер записываются в фоновом режиме консоли, затем эта ошибка.

не удается получить доступ к URL-адрес содержания "хром-расширений: //di***cb/dialog.html".

Extension манифест должен запросить разрешение на доступ к этому хосту (анонимные функции) @ background.js:. 39target (анонимный функции) @ расширения :: SafeBuiltins:. 19safeCallbackApply @ расширений :: SendRequest: 21handleResponse @ расширения :: SendRequest: 72

Так функциональные возможности, которые я хочу достичь довольно просто, пользователь щелкает значок -> обед всплывающее окно -> тип информации -> принять -> использовать информацию, далее в сценарии контента ,

+0

Возможного дубликат [передать нескольких переменных к содержимому хрому сценария] (http://stackoverflow.com/questions/ 13794293/пасс-множественное-переменные к контент-скрипт-хром) – wOxxOm

ответ

0

Я нашел способ обойти ее с помощью LocalStorage:

в фоне.JS добавить OnMessage слушателя поговорить с моим содержанием сценария

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { 
    if (request.method == "getStatus") 
     sendResponse({status: localStorage['username']}); 
    else 
     sendResponse({}); // snub them. 
}); 

и я использую LocalStorage внутри SetCredentials() метод

function setCredentials(username,password,token) { 

    localStorage['username']=username; 
} 

в userInfo.js Я прошу фон каждый время загрузки страницы для значения localStorage, которое было обновлено, когда пользователь нажал кнопку «ОК».

chrome.runtime.sendMessage({method: "getStatus"}, function(response) { 
    console.log(response.status); 
}); 

Теперь я могу использовать эти значения из LocalStorage в любом месте я хочу в моем содержимом сценарии: D

Смежные вопросы