【问题标题】:Firefox WebExtension: Tab-Specific StorageFirefox WebExtension:特定于选项卡的存储
【发布时间】:2016-07-15 01:49:50
【问题描述】:

我正在编写一个 Firefox WebExtension,使用 chrome.storage.local 来保存状态,这是我第一次选择扩展时所做的。

如何将状态限制为特定选项卡?我希望每个选项卡都有自己的数据版本。

谢谢

【问题讨论】:

    标签: firefox firefox-addon local-storage firefox-addon-webextensions


    【解决方案1】:

    与大多数存储方法一样,您必须对存储的数据强加一种结构,以便您可以根据需要存储和检索数据。在这种情况下,您可以set()get() 与特定选项卡关联的数据。有很多方法可以做到这一点。组织数据的“最佳”方式取决于您存储的数据、概念上组织数据的方式以及每个选项卡的独特之处(从您的扩展程序的角度来看;即为什么数据是用tab分隔的,这可能是它实际上是用URL分隔的,而不是tab)。

    您正在尝试做的事情有太多未指定的部分,无法为您提供关于什么是组织数据的“最佳”方式的好建议。但是,这里有一个可能的方法示例:

    // callback to get and set() just checks for errors
    function reportIfStorageError() {
        if (chrome.runtime.lastError) {
            console.log(chrome.runtime.lastError);
        }
    }
    function getKeyForTab(tab) {
        //Use a key that is a combination of text that for this add-on is
        //  unique to data being stored for a tab, "tabData", plus the tab's ID.
        //  This allows set/get to be just for the data for the tab while
        //  laving all other keys that don't start with "tabData" available
        //  to store any other non-tab related data we desire. In other words,
        //  we don't need to worry about a conflict between some unknown tab ID
        //  and any other key we choose to use.
        return "tabData" + tab.id;
    }
    function getLocalStorageForTab(tab, theTabsCompleteDataObject) {
        let key = getKeyForTab(tab);
        chrome.storage.local.get({key: theTabsCompleteDataObject}, reportIfStorageError);
        return theTabsCompleteDataObject;
    }
    function setLocalStorageForTab(tab, theTabsCompleteDataObject) {
        let key = getKeyForTab(tab);
        chrome.storage.local.set({key: theTabsCompleteDataObject}, reportIfStorageError);
    }
    

    在上面的示例中,为该选项卡创建了一个唯一的键。为此,我们选择一个前缀tabData,对于这个附加组件,我们将其定义为始终启动用于选项卡数据的键。这样做是因为我们无法控制选项卡的 ID。如果我们只使用 ID 作为密钥,我们将不得不考虑 ID 与我们用来存储其他数据的密钥匹配的可能性。这样,我们只需为不以tabData 开头的其他数据选择键。特定选项卡的完整键是前缀 tabData 与选项卡的 ID tab.id 连接。

    提供给getLocalDataForTab()setLocalDataForTab()tab 是标签的tabs.Tab。变量theTabsCompleteDataObject 是单个object,其中包含与选项卡关联的所有数据。

    【讨论】:

    • 我可以在调用chrome.tabs.query之前获取标签ID吗?我想在初始化阶段保存数据。
    • @Manngo,虽然browser.tabs.query() 是获取tabs.Tab 对象的一种方法,但它并不是唯一的方法(例如,tabs.Tab 对象被传递给contextMenus.onClicked 事件的侦听器)。您尚未提供有关您的代码或其结构的任何信息。因此,我无法回答您可能在哪里获得对tabs.Tab 对象的引用。我也不清楚为什么在调用browser.tabs.query() 之前存储数据对您很重要。您当然可以在此之前制作数据副本并在之后存储它。
    • 你说得对,我不清楚我的意图是什么。我正在尝试显示一个弹出窗口,其中包含特定于每个选项卡的切换选择。在打开弹出窗口时计算并显示切换。只有在那之后,才会通过browser.tabs.query 采取行动。这是我的第一个 WebExtension,所以我在这里摸索。我最终这样做了:var tabId; chrome.tabs.query(query,function(t) {tabId=t[0].id/1000; tabId=tab${tabId.toString().substr(2,3)}; doInit(); });。感谢您的帮助。
    猜你喜欢
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2012-04-01
    相关资源
    最近更新 更多