Google Chrome扩展程序的Scriptish / Greasemonkey GM_setValue和GM_getValue等效项

时间:2014-01-20 21:54:50

标签: javascript google-chrome-extension storage content-script

我正在开发一个谷歌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(或者可能清除所有存储空间)会很高兴。

任何想法?

1 个答案:

答案 0 :(得分:1)

内容脚本没有同步的跨域存储机制。

但是,如果确实希望获得此类功能,那么您可以通过维护chrome.storage支持的存储的本地副本来自行实现此类存储。

  1. 初始化:使用chrome.storage.local.get(null, callback)获取所有存储的数据并将其存储在本地变量中。
  2. 维护:
    • 使用chrome.storage.onChanged事件监视更改并在需要时更新本地副本。
    • 每当使用GM_setValue(等)时,请立即更新本地副本,以便在GM_getValue之后立即调用GM_setValue给出预期结果。
  3. 理想情况下,您应该推迟执行其他脚本,直到初始化存储。如果无法做到这一点,请创建一个单独的脚本,然后让它"run_at": "document_start"。使用这种方法,当代码的其余部分以“document_end”运行时,可能(尽管不能保证)存储已准备就绪。


    另一种方式来同步获取/设置存储值。我强烈强烈反对您使用此方法。同步XMLHttpRequest和webRequest API(chrome.webRequest.onBeforeRequest)可用于将数据从后台页面传递到内容脚本,反之亦然。
    发送数据是微不足道的(例如,在URL中设置一个值),
    获取数据有点困难。您可以使用URL.createObjectURL获取数据的blob:网址,并返回{redirectUrl: ...}以回复内容脚本中刚刚创建的网址。