【问题标题】:Chrome Extension's persistent cookies not expiring correctly?Chrome 扩展程序的持久性 cookie 没有正确过期?
【发布时间】:2015-04-02 16:14:56
【问题描述】:

总结:

基本上,我使用后台页面来监听事件,例如: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 或者我误解了它背后的机制,谁能告诉我?

非常感谢任何帮助!

最好的问候,

【问题讨论】:

  • 我建议改变你的逻辑。与其被动监听 cookie 事件,不如在弹窗打开时主动查询 cookie 的状态。这不仅可以解决您的错误,而且还可以减少资源密集型。
  • @RobW 感谢您发表评论,我很感激,因为这个问题没有引起太多关注。无论如何,我不确定我是否正确理解了您的建议,但如果我查询请求弹出窗口后 cookie 的状态,然后才更改应显示的 HTML,我将创建一个糟糕的用户体验,因为他必须单击两次浏览器操作才能实际更新弹出窗口。 (第一个将设置弹出窗口的 html,第二个实际获取有效的 cookie 状态,然后让页面正确显示)。
  • 为什么不呢? chrome.cookies.get({url: 'http://example.com/', name: 'dummycookie'}, function(cookies) { /* now do whatever you want */ });
  • 我在回复完之前不小心按了回车,你能再看一遍吗?我不确定我是否说得够清楚..
  • 是什么让你认为用户必须点击两次?您可以使用单个 HTML 页面,并在弹出页面中使用 chrome.cookies.get 来获取 cookie 并根据结果更新文档。

标签: javascript cookies google-chrome-extension


【解决方案1】:

对于打开browser action popup等罕见的动作,你最好主动querycookies API来获取相关cookie的最新状态,而不是通过chrome.cookies.onChanged监听cookie变化,因为:

  1. 如果您观察到的错误是真实的,那么这将解决它。
  2. 由于不经常打开弹出窗口,因此仅仅为了获得 cookie 更改通知而使背景/事件页面保持活动状态是非常浪费资源的,尤其是考虑到此答案中提供的替代方法。

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

// 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 我一直忙于工作,但我今天会尝试将此行为归档,并通过响应/问题跟踪号回复你们。
猜你喜欢
  • 1970-01-01
  • 2015-08-30
  • 2014-02-05
  • 2017-09-23
  • 2018-12-05
  • 2015-05-26
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多