我目前在google.com域上有indexedDB。我希望能够从谷歌浏览器扩展程序中读取它。我怎么能做到这一点?我需要添加任何特定权限吗? 我目前有:
"permissions": [ "tabs", "bookmarks", "unlimitedStorage", "*://*/*", "identity", "https://*.google.com/*", "https://ssl.gstatic.com/", "https://www.googleapis.com/", "https://accounts.google.com/" ],
用什么命令我能做到这一点?谢谢!
编辑:我已经知道我可以从内容脚本访问它(只要带有域的选项卡是打开的 - 这是我的情况),但我不知道该怎么做...
答案 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
}
}
}