如何从chrome扩展访问IndexedDB(当前打开的域/选项卡)

时间:2016-07-26 11:48:00

标签: google-chrome google-chrome-extension indexeddb

我目前在google.com域上有indexedDB。我希望能够从谷歌浏览器扩展程序中读取它。我怎么能做到这一点?我需要添加任何特定权限吗? 我目前有:

"permissions": [ "tabs", "bookmarks", "unlimitedStorage", "*://*/*", "identity", "https://*.google.com/*", "https://ssl.gstatic.com/", "https://www.googleapis.com/", "https://accounts.google.com/" ],

用什么命令我能做到这一点?谢谢!

编辑:我已经知道我可以从内容脚本访问它(只要带有域的选项卡是打开的 - 这是我的情况),但我不知道该怎么做...

2 个答案:

答案 0 :(得分:2)

要访问当前选项卡的indexeddb,请在manifest.json中的“ permissions”标签中添加“ activeTab”,然后创建一个内容脚本,该内容脚本将有助于访问indexeddb,因为它在网页上下文中运行,然后添加内容脚本创建到manifest.json文件中的“ content_scripts”标签。 对于manifest.json中的Eg,添加以下内容:

"permissions": ["activeTab"],
  "content_scripts": [
  {
  "matches": ["add the domains of the webpages where content script needs to run"],
  "js": ["contentScript.js"]
  }
]

有关比赛的更多信息,请点击此处:https://developer.chrome.com/extensions/match_patterns

在内部内容脚本中添加打开存储,然后在对象存储上执行事务并在对象存储上执行查询。 对于内容脚本中的Eg,添加以下内容:

if (!("indexedDB" in window)) {
  alert("This browser doesn't support IndexedDB");
 } else {
  let indexdb = window.indexedDB.open("firebaseLocalStorageDb", 1);
  indexdb.onsuccess = function() {
  let db = indexdb.result;
  let transaction = db.transaction("firebaseLocalStorage", "readwrite");
  let storage = transaction.objectStore("firebaseLocalStorage");
  console.log(storage.getAll());
 };
}

上面的代码说明: 它访问窗口对象,并打开版本为“ 1”的商店“ firebaseLocalStorageDb”,然后在成功访问该对象之后,它寻找结果并在位于商店内部的对象商店“ firebaseLocalStorage”上执行事务。最后,查询对象存储“存储”的实例以获取所有键-值对。 有关更多信息,请检查:https://javascript.info/indexeddb

答案 1 :(得分:0)

对于仍然感兴趣的人,我解决这个问题 -

这是放在扩展名的内容脚本中 -

 chrome.extension.onConnect.addListener(function(port) {
 if(port.name == "extension_request" ) {
  port.onMessage.addListener(function(msg) {
    if (msg.db) {
      window.indexedDB.webkitGetDatabaseNames().onsuccess = function(sender,args)
      {
        var r = sender.target.result;
        if(r.contains(msg.db)){
            var openRequest = indexedDB.open(msg.db);
            // your code
            port.postMessage({foo: bar}); // your result which you want to send        
        }
       }
    }
 }
}

这是用于背景或弹出脚本 -

 chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
        var port = chrome.tabs.connect(tabs[0].id,{name: "extension_request"});
            port.postMessage({db: "database_name_example"}); // send database name
            port.onMessage.addListener(function(msg) {
              if (msg.foo ) {
               // do your stuff in extension
              }
           }
}