Chrome扩展程序的持久化Cookie无法正确过期?

5

摘要:

基本上,我使用后台页面来监听事件,例如:onStartup、onInstalled和cookies.onChanged,以决定在单击browserAction时向用户显示哪个页面。我的问题涉及后者以及它是如何触发的。


代码示例:

chrome.cookies.onChanged.addListener(function(info){
    if(info.cookie.name === "dummycookie"){
        /*  Possibilities of info.cause (as described in the docs):
        *       evicted
        *       expired
        *       explicit (it's used when setting or removing a cookie)
        *       expired_overwrite
        *       overwrite
        */
        if(info.cause == "overwrite" || (info.cause == "explicit" && !info.removed)){
            // Cookie was set (explicit or overwrite)
            chrome.browserAction.setPopup({ popup: "dummy1.html" });
        }
        else{
            // Cookie was removed (evicted, expired or expired_overwrite)
            chrome.browserAction.setPopup({ popup: "dummy2.html" });
        }
    }
});

事实上,尽管上述代码处理显式调用(cookies.set & cookies.get)没问题,但当cookie的生存期过期时似乎并不会触发。
通过我进行的调试会话,在cookie的预期过期日期之后只有在进行显式调用时才会触发代码。
例如,如果我在所谓的过期时间之后发起类似cookies.getAll()的调用,则浏览器会意识到cookie已过期,然后才会触发事件。
我有遗漏什么吗?如果我误用了cookie API或者我对其机制理解错了,能否有人给我启示呢?
非常感谢您的帮助!
最好的问候,

我不小心在回答之前按下了回车键,你能再读一遍吗?虽然我不确定自己表达得清楚不清楚。 - ErickR
你认为用户为什么要点击两次呢?你可以使用单个HTML页面,在弹出页面中使用chrome.cookies.get获取cookie并根据结果更新文档。 - Rob W
好的,我现在明白你的观点了。那确实可能行得通,而且既然它保持了我原先计划的架构,我想我们可以称之为一个答案 :) 你能写一个回答这个问题吗,这样我就可以接受它了? - ErickR
但是,理论上我所做的应该可以工作,对吗?还是我误解了它背后的机制?我的意思是,“cookies.onChanged”上的监听器应该已经捕获到了cookie状态变为过期的变化,不是吗? - ErickR
此外,关于资源消耗较少的问题,我不太确定,因为我使用的是非持久化的后台页面,所以它只有在监听到触发事件时才会变为活动状态。 - ErickR
显示剩余8条评论
1个回答

1

对于像打开浏览器操作弹出窗口这样罕见的操作,最好主动查询相关 cookie 的最新状态,而不是通过chrome.cookies.onChanged监听 cookie 的更改,因为:

  1. 如果您观察到的错误是真实存在的,则这将解决它。
  2. 由于弹出窗口并不经常打开,仅为了收到 cookie 更改的通知而保持后台/事件页面活动非常浪费资源,特别是考虑到本答案中介绍的替代方法。

示例(popup.js,需要activeTab和 cookies 权限):

// Example: Get the value of the _gaq cookie for the top-level frame of the
// current tab.
chrome.tabs.query({
    active: true,
    currentWindow: true
}, function(tabs) {
    // Need activeTab permission to read url, e.g. http://example.com/home
    var url = tabs[0].url;
    chrome.cookies.get({
        url: url,
        name: '_gaq'
    }, function(cookie) {
        // TODO: Do something with cookie, e.g. by updating the view (via DOM).
    });
});

现在我们只需要等待问题报告编号,OP承诺会提交一个。 - Xan
@Xan,我最近工作比较忙,但我会尽力在今天处理这个问题,并向你们反馈响应/问题跟踪号码。 - ErickR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接