我正在开发一个谷歌Chrome扩展程序,它基本上有两个不同的内容脚本用于两个不同的域(假设 google.com 和 yahoo.com ):
的manifest.json
...
"content_scripts" : [{
"matches" : ["https://*google.com/*"],
"js": ["my_google.js"],
"run_at":"document_end"
}, {
"matches" : ["https://*yahoo.com/*"],
"js": ["my_yahoo.js"],
"run_at":"document_end"
}],
"permissions": ["storage"],
...
我需要一个永久(不仅仅是一个会话)存储,其中这两个脚本都可以更新和检索一些常见的共享数据。我知道,可以使用chrome.storage API这样做:
chrome.storage.local.set( { 'string1' : 'value1'}, function(){
console.log("string1 with value = value1 has been added to the chrome.storage");
// continue with script code...
});
chrome.storage.local.get( 'string1', function (data){
console.log("string1 with value = " + data['string1'] + " has been retrieved from the chrome.storage" );
// continue with script code...
});
chrome.storage.local.remove( 'string1', function () {
console.log("string1 has been removed from chrome.storage") ;
// continue with script code...
});
现在,有趣的是......
这个API的替代品是否可以像跨域chrome.storage一样工作,但是对同步调用呢?我实际想要实现的是重现Scriptish / Greasemonkey GM_setValue和GM_getValue API的行为,而无需更改以前在Mozilla Firefox中使用的两个脚本的整个代码,现在转移到Google Chrome。
任选:
能够从浏览器操作图标弹出页面 - popup.html(popup.js)中删除string1(或者可能清除所有存储空间)会很高兴。
任何想法?
答案 0 :(得分:1)
内容脚本没有同步的跨域存储机制。
但是,如果确实希望获得此类功能,那么您可以通过维护chrome.storage
支持的存储的本地副本来自行实现此类存储。
chrome.storage.local.get(null, callback)
获取所有存储的数据并将其存储在本地变量中。chrome.storage.onChanged
事件监视更改并在需要时更新本地副本。GM_setValue
(等)时,请立即更新本地副本,以便在GM_getValue
之后立即调用GM_setValue
给出预期结果。理想情况下,您应该推迟执行其他脚本,直到初始化存储。如果无法做到这一点,请创建一个单独的脚本,然后让它"run_at": "document_start"
。使用这种方法,当代码的其余部分以“document_end”运行时,可能(尽管不能保证)存储已准备就绪。
有另一种方式来同步获取/设置存储值。我强烈强烈反对您使用此方法。同步XMLHttpRequest
和webRequest API(chrome.webRequest.onBeforeRequest
)可用于将数据从后台页面传递到内容脚本,反之亦然。
发送数据是微不足道的(例如,在URL中设置一个值),
获取数据有点困难。您可以使用URL.createObjectURL
获取数据的blob:
网址,并返回{redirectUrl: ...}
以回复内容脚本中刚刚创建的网址。