我为图书馆信息亭环境编写了一个骨架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);
}
}
});
});
}
})
我的问题
chrome.idle
API感到困惑,特别是何时使用chrome.idle.queryState
方法与何时使用chrome.idle.onStateChanged
事件。特别是能够在那个时刻查询状态而不必提供方法所需的detectionIntervalInSeconds
会很高兴。chrome.notifications.clear
方法实际上做了什么?告知Chrome应删除任何通知记录?或者强制从用户的显示屏中删除通知?我不清楚何时适合使用它。答案 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
粒度,那么您的方法似乎没问题。