firefox插件中的面板内容脚本和页面内容脚本之间的localStorage
问题描述:
我使用插件生成器创建了一个Firefox插件,我想从页面内容保存一个值,然后从面板内容脚本中读取它。我想使用localStorage,但我尝试过,并且无法在页面和面板脚本之间共享相同的localStorage。我也尝试过使用self.port.emit,并且这个方法工作的很好,我可以用port.emit和port.on发送值,但这不是我想要的,因为我需要每秒刷新一次这个值,如果我使用该方法,然后浏览器被重载端口请求,这就是为什么我想要使用localStorage或可以存储在变量中并可以通过面板脚本轻松访问的东西。firefox插件中的面板内容脚本和页面内容脚本之间的localStorage
这里我附上面板脚本,它会读取页面脚本保存的值。
var panel = require("panel").Panel({
width: 100,
height: 100,
contentScriptFile: data.url("panel_script.js")
});
这里我附上了页面脚本,它将保存页面内容的值,面板脚本会读取它。
var pageMod = require("page-mod");
pageMod.PageMod({
include: "*",
contentScriptFile: self.data.url("page_script.js"),
contentScriptWhen: 'ready'
});
答
我相信port
系统是与Panel页面交互的推荐路线。不过,您可以通过Firefox插件来解决您发布的访问localStorage
页面的问题。
var chrome = require('chrome');
var data = require('sdk/self').data;
var ios = chrome.Cc["@mozilla.org/network/io-service;1"]
.getService(chrome.Ci.nsIIOService);
var ssm = chrome.Cc["@mozilla.org/scriptsecuritymanager;1"]
.getService(chrome.Ci.nsIScriptSecurityManager);
var dsm = chrome.Cc["@mozilla.org/dom/storagemanager;1"]
.getService(chrome.Ci.nsIDOMStorageManager);
var uri = ios.newURI(data.url('index.html'), "", null);
var principal = ssm.getCodebasePrincipal(uri);
var storage = dsm.getLocalStorageForPrincipal(principal, data.url('index.html'));
这样,您就可以使用storage
对象访问页面的localStorage
,你通常会在网页中。例如storage.setItem('key', 'value')
和storage.getItem('key')
。
您的答案接近我需要的,但不是exaclty。我想从panel_script.js访问存储对象,这是我在上面的代码中发布的。如果你告诉我如何从panel_script.js访问,那么我会认为你的答案被接受为100%。感谢您的帮助到目前为止我发现您的答案对我未来的作品很有帮助。如果你有一个想法如何从面板脚本(不是main.js)访问存储对象,那么我很高兴 – Jigberto 2013-03-25 17:25:55
它将无法访问您的page_script正在处理的同一localStorage,因为它被挂钩到不同的域。我知道避免这种情况的唯一方法就是通过像我所示的直接附加访问。您的加载项可以观看pageMod localStorage事件,然后写入您的面板localStorage。这是我看到工作的唯一途径。祝你好运! – 2013-03-25 17:43:55
好吧,你说“附加组件可以观看页面模式localStorage事件,然后写入你的面板localStorage”..所以这是我需要的,但如何做到这一点,而不发送端口请求。因为我正在刷新计时器中的这个值,我希望使用mileseconds间隔刷新它。如果在那段时间内,我会发送很多端口请求,然后浏览器超载,因为它发送/接收端口请求。你有一个想法如何让这个值可用于面板脚本访问它从一个位置或任何使浏览器不会超负荷的任何 – Jigberto 2013-03-25 17:53:57