kiosk环境的Chrome空闲分机,通知和浏览数据重置

时间:2015-04-08 16:23:05

标签: google-chrome google-chrome-extension notifications kiosk kiosk-mode

我为图书馆信息亭环境编写了一个骨架Chrome扩展程序。扩展程序的目的是清除所有浏览数据,并在X秒不活动后重新启动Chrome。我的灵感来自Chrome网上商店的空闲重置扩展程序,但这并不能提供我喜欢的所有功能。理想情况下,我想模仿基于Presto的Opera的不活动重置,以kiosk模式显示,其中显示带倒计时的对话窗口,即:

Inactivity reset

The browser will be reset and all browsing data removed in 60...1 seconds

但我认为这可能有点过于复杂,我不确定chrome.notification API是否支持动态内容,例如倒数计时器。

到目前为止,我已经提出了一些代码,在1分钟不活动后显示chrome通知。通知会通知用户浏览器将在30秒内重置,除非恢复活动。然后通知自行结束。再过30秒不活动后,清除浏览数据,删除任何现有选项卡并打开新选项卡。我在第一个空闲事件后使用chrome.alarms API并降低chrome.idle.setDetectionInterval。如果用户恢复活动,则会清除警报和通知,并且chrome.idle.setDetectionInterval将恢复为默认值60秒。

这是我的event.js代码:

chrome.idle.onStateChanged.addListener(function (newState) {
    if (newState == "idle") {
            var opt = {
              type: "basic",
              title: "Web Browser about to be reset",
              message: "Web browser has been inactive for 1 minute. Move the mouse or type something within 30 seconds to prevent the reset.",
              iconUrl: "refresh-icon.png"
            };
            chrome.notifications.create("browserResetNotification", opt, function() {
                chrome.idle.setDetectionInterval(15);
                chrome.alarms.create("inactivityAlarm", {'when': Date.now() + 30000})
            });
    }
    else {  
        chrome.alarms.clear("inactivityAlarm", function() {});      
        chrome.notifications.clear("browserResetNotification", function() {});
        chrome.idle.setDetectionInterval(60);
    }
});

chrome.alarms.onAlarm.addListener(function (alarm) { 
     if (alarm.name == 'inactivityAlarm') {     
        chrome.browsingData.remove({
        }, {
            "appcache": true,
            "cache": true,
            "cookies": true,
            "downloads": true,
            "fileSystems": true,
            "formData": true,
            "history": true,
            "indexedDB": true,
            "localStorage": true,
            "pluginData": true,
            "passwords": true,
            "webSQL": true
        });
        chrome.tabs.create({
            url: "http://myurl.com",
            active: true
        }, function (newtab) {
            chrome.tabs.query({}, function (results) {
                for (var i = 0; i < results.length; i++) {
                    var tab = results[i];
                    if (tab.id != newtab.id) {
                        chrome.tabs.remove(tab.id);
                    }
                }
            });
        });
    }
})

我的问题

  • 我一直在测试我的代码并且发现它并不完全可靠(即通知/重置并不总是发生),TBH我并不感到惊讶。有更好的方法吗?
  • 是否可以在固定的持续时间内显示Chrome通知,而不是让它自行打开和关闭?我想让它显示整整30秒,直到闹钟响起,浏览器重置。
  • 我对chrome.idle API感到困惑,特别是何时使用chrome.idle.queryState方法与何时使用chrome.idle.onStateChanged事件。特别是能够在那个时刻查询状态而不必提供方法所需的detectionIntervalInSeconds会很高兴。
  • chrome.notifications.clear方法实际上做了什么?告知Chrome应删除任何通知记录?或者强制从用户的显示屏中删除通知?我不清楚何时适合使用它。

1 个答案:

答案 0 :(得分:2)

将问题集中在一起并不好,但我会尽力回复。

首先,关于通知的一些背景信息。

通知可以显示在屏幕上(通常在创建时显示),或者隐藏在Chrome的通知中心(系统托盘中的铃声图标)中。无论哪种情况,它仍然是“开放的”。 Chrome会在一段时间后自动移动通知(具体取决于priority属性)。

现在,问题。

  

我一直在测试我的代码并且发现它并不完全可靠(即通知/重置并不总是发生),TBH我并不感到惊讶。

如果您尝试在不先关闭通知的情况下重复使用通知ID,则不会重新显示通知。然后在通知中心就地更新,不再重新显示。因此,如果您要重新使用该ID并希望它再次显示,请clear之前create

警报可能不会响起,因为chrome.alarms API的最小粒度为1分钟。如果您需要更低的粒度,则需要使用DOM setTimeout(如果您使用的话,则与event pages不兼容)。

  

是否可以在固定的持续时间内显示Chrome通知,而不是让它自行打开和关闭?我想让它显示整整30秒,直到警报触发并且浏览器重置为止。

不容易,不。就像我说的那样,它在屏幕上显示的时间取决于优先级,但即使是高优先级的通知也不会永远存在,并且没有记录确切的时间。但是,这会导致存在priority update trick

在您的情况下,Web Notifications API可能会有更好的运气。它们看起来更简单,但可以在您的特定用例中完成工作。好处是他们永远不会自行消失。

  

我对chrome.idle API感到困惑,特别是何时使用chrome.idle.queryState方法与何时使用chrome.idle.onStateChanged事件。特别是能够在那个时刻查询状态而不必提供方法所需的detectionIntervalInSeconds会很好。

区别在于“截至目前为止,用户是否在最后N秒内闲置了?”并询问Chrome“一旦用户空闲N秒就告诉我”。它们都有它们的用途,但在你的情况下你可能想要对事件作出反应。

顺便说一句,在您的代码中调用chrome.idle.setDetectionInterval(15)毫无意义。当您的当前状态为idle时,一旦输入发生,事件将会触发 - 无论多长时间处于空闲状态都无关紧要。

它实际上可以打破你的逻辑(也许这就是你的代码不可靠的原因),如果这让Chrome重新考虑idle状态。

  

chrome.notifications.clear方法实际上做了什么?告知Chrome应删除任何通知记录?或者强制从用户的显示屏上删除通知?我不清楚什么时候适合使用它。

chrome.notifications.clear与点击通知本身上的X相同 - 关闭它,而不是隐藏。这使得ID不再引用通知 - 因此,如果您重复使用ID,则会创建一个新通知。它还会触发onClosed事件。如果此时通知显示在屏幕上,则会立即将其删除。

如果您在调用clear时查看邮件中心,the weirdest thing happens - 从代码的角度来看,通知将不再存在,但在信息中心关闭之前仍然可见。

最后..

  

有更好的方法吗?

老实说,我不知道。如果忘记了最小alarms粒度,那么您的方法似乎没问题。