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

qij5mzcb  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(2)|浏览(573)

我目前在www.example.com域上有indexedDBgoogle.com。我希望能够从google chrome扩展中读取它。我该如何实现这一点?我需要添加任何特定权限吗?我目前有:

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

用什么命令我可以做到这一点?谢谢!
编辑:我已经阅读了我可以从内容脚本访问它(只要与域的标签是打开的-这是我的情况),但我不知道如何做到这一点...

v440hwme

v440hwme1#

要访问当前选项卡的indexeddb,请将“activeTab”添加到manifest.json中的“permissions”标记,然后创建一个内容脚本,内容脚本在网页上下文中运行时将有助于访问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
在内容脚本中添加打开存储,然后对对象存储执行事务处理并对对象存储执行查询。对于内容脚本中的示例,添加以下内容:

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”上执行事务。最后查询对象存储库“storage”的示例以获取所有键值对。有关更多信息,请查看:https://javascript.info/indexeddb

n3ipq98p

n3ipq98p2#

如果还有人感兴趣的话,我的解决方案-
这被放置在扩展的内容脚本中-

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
              }
           }
}

相关问题