Данные локального хранилища не возвращаются в сценарий контента из backgound.js

В background.js я храню некоторые данные в локальном хранилище:

localStorage["domain"] = site;  //Save the site to local storage for retrieval later when requested by the content script
localStorage["page"] = tab.title;   //Save the page title to local storage for retrieval later
localStorage["url"] = tab.url;  //Save the URL of the current page to local storage for retrieval

Позже мой контент-скрипт запрашивает данные с помощью

chrome.extension.sendRequest({name:"domain"},
    function(response)
    {
    subjectStr = response.domain;   
    });

chrome.extension.sendRequest({name:"url"},
    function(response)
    {
    bodyStr = "URL of last page visited: " + response.url;  
    });

и background.js отвечает

//Wait for request for the site value and URL from content script 
chrome.extension.onRequest.addListener(
  function(request, sender, sendResponse) 
  {
  if (request.name == "url")
  {
  sendResponse({url: localStorage["url"]});
  }
  else
  {
  sendResponse({domain: localStorage["domain"] + ": " + localStorage["page"]});
  }
}
);

Однако данные никогда не принимаются сценарием содержимого. Кто-нибудь понимает, почему?

Вот манифест:

{
"name": "Test",
"version": "1.0",
"manifest_version": 2,
"description": "Test extension",
"browser_action": {
"default_icon": "no_msgs.png",
"default_title": "Press here to test."
},
"background": {
"scripts": ["background.js"]
},
"content_scripts": [{
"run_at": "document_end",
"js": ["postMsg.js"],
"matches": ["https://groups.google.com/forum/*"]
}],
"permissions": ["tabs",
"http://groups.google.com/forum/?fromgroups=#!forum/opencomments-site-discussions/*",
"https://groups.google.com/forum/?fromgroups=#!forum/opencomments-site-discussions/*"
]
}

и no_msgs.png:

http://www.opencomments.com/no_msgs.png

и фон.js:

var post_url = "https://groups.google.com/forum/?fromgroups=#!newtopic/opencomments-site-discussions";

chrome.browserAction.onClicked.addListener(function(main) {
});

function createEvent(tab){
}

function updateEvent(tabId, changeInfo, tab){
}

function miscEvent(tabId, eventInfo){
}

function getURL() {
  chrome.tabs.getSelected(undefined, function(tab) {
var tmp = tab.url;
var site;

if (tab.url.indexOf("http://") == 0 || tab.url.indexOf("https://") == 0) {
    site = getDomain(tab.url);
    chrome.tabs.create({url: post_url});

localStorage["domain"] = site;  //Save the site to local storage for retrieval later when requested by the content script
localStorage["page"] = tab.title;   //Save the page title to local storage for retrieval later
localStorage["url"] = tab.url;  //Save the URL of the current page to local storage for retrieval
}
  });
 }

//Wait for request for the site value and URL from content script 
chrome.extension.onRequest.addListener(
  function(request, sender, sendResponse) 
  {
  if (request.name == "url")
    {
    sendResponse({url: localStorage["url"]});
    }
  else
    {
    sendResponse({domain: localStorage["domain"] + ": " + localStorage["page"]});
    }
  }
  );

//Fetches the domain from the URL
function getDomain(url){
var tmp = url.substring(url.indexOf("//") + 2);
var tmp2 = tmp.indexOf("/");
var str = tmp.substring(0, tmp2);
var index = str.indexOf(".");
while ((tmp = str.substring(index + 1)).indexOf(".") != -1){
str = str.substring(index + 1);
index = str.indexOf(".");
}
index = str.indexOf(".");
return str;
}

// Called when the user clicks on the browser action.
chrome.browserAction.onClicked.addListener(function(tab) {
getURL();
});

и, наконец, postMsg.js:

var subjectStr  = '';
var bodyStr  = '';

chrome.extension.sendRequest({name:"domain"},
function(response) {
subjectStr = response.domain;   
});

chrome.extension.sendRequest({name:"url"},
function(response) {
bodyStr = "URL of last page visited: " + response.url;  
});

person FractalBob    schedule 29.11.2012    source источник
comment
Кажется, работает нормально. Можете ли вы опубликовать минимальный протестированный пример, чтобы показать вашу проблему? (manifest.json, contentscript.js и background.js) с методом установки значений и способом чтения значений.   -  person Rob W    schedule 30.11.2012


Ответы (1)


Отлично работает с вашим кодом, я использовал сообщения вместо запросов.

Следите за сообщениями Роба В (ссылка1, link2) для получения дополнительной информации о методах sendMessage() и sendRequest().

ОБРАЗЕЦ КОДА И ВЫВОД

Вывод из background.js

введите здесь описание изображения

Вывод из Content Script scripts.js

введите здесь описание изображения

manifest.json

{
"name":"Local Storage",
"description":"Local Storage Demo",
"manifest_version":2,
"background":{
    "scripts":["background.js"]
},
"content_scripts": [
    {
      "matches": ["https://www.google.co.in/*"],
      "js": ["scripts.js"]
    }
  ],
"permissions":[
    "tabs","<all_urls>"
],

"version":"1"
}

background.js

function storeData(){
    localStorage["domain"] = "google";  //Save the site to local storage for retrieval later when requested by the content script
    localStorage["page"] = "Google";   //Save the page title to local storage for retrieval later
    localStorage["url"] = "https://www.google.co.in/";  //Save the URL of the current page to local storage for retrieval
}
chrome.extension.onMessage.addListener(
  function(request, sender, sendResponse) 
  {
  console.log("request recieved is "+request);
  if (request.name == "url")
  {
    console.log("sending response for request URL"+ localStorage["url"]);
  sendResponse({url: localStorage["url"]});
  }
  else
  {
  console.log("sending response for request URL"+   localStorage["page"]);
  sendResponse({domain: localStorage["domain"] + ": " + localStorage["page"]});
  }
}
);
window.onload = function(){
    storeData();
}

scripts.js

function requestBackground(){
    chrome.extension.sendMessage({name:"domain"}, 
    function(response)
    {
    console.log("response recived for response.domain  "+response.domain);   
    });

chrome.extension.sendMessage({name:"url"},
    function(response)
    {
    console.log("response recived for last page visited: " + response.url);  
    });
}

window.onload = function(){
    requestBackground();
}

Дайте мне знать, если это все еще не удается.

person Sudarshan    schedule 30.11.2012
comment
Мне нужно перефразировать задачу. На самом деле, это больше связано с тем, как используются данные, и с характером запускаемой страницы. Эта страница является страницей групп Google, и когда Google изменил ее примерно год назад, эти изменения сломали мое расширение, и я изо всех сил пытаюсь это исправить. Быть в курсе. - person FractalBob; 30.11.2012
comment
Спасибо, Сударшан. Ваш код работает нормально. Я думаю, это очень поможет. - person FractalBob; 01.12.2012