summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/parent/ext-idle.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/extensions/parent/ext-idle.js')
-rw-r--r--toolkit/components/extensions/parent/ext-idle.js97
1 files changed, 97 insertions, 0 deletions
diff --git a/toolkit/components/extensions/parent/ext-idle.js b/toolkit/components/extensions/parent/ext-idle.js
new file mode 100644
index 0000000000..ee0c0da374
--- /dev/null
+++ b/toolkit/components/extensions/parent/ext-idle.js
@@ -0,0 +1,97 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+XPCOMUtils.defineLazyServiceGetter(
+ this,
+ "idleService",
+ "@mozilla.org/widget/useridleservice;1",
+ "nsIUserIdleService"
+);
+
+// WeakMap[Extension -> Object]
+let observersMap = new WeakMap();
+
+const getIdleObserverInfo = (extension, context) => {
+ let observerInfo = observersMap.get(extension);
+ if (!observerInfo) {
+ observerInfo = {
+ observer: null,
+ detectionInterval: 60,
+ };
+ observersMap.set(extension, observerInfo);
+ context.callOnClose({
+ close: () => {
+ let { observer, detectionInterval } = observersMap.get(extension);
+ if (observer) {
+ idleService.removeIdleObserver(observer, detectionInterval);
+ }
+ observersMap.delete(extension);
+ },
+ });
+ }
+ return observerInfo;
+};
+
+const getIdleObserver = (extension, context) => {
+ let observerInfo = getIdleObserverInfo(extension, context);
+ let { observer, detectionInterval } = observerInfo;
+ if (!observer) {
+ observer = new (class extends ExtensionCommon.EventEmitter {
+ observe(subject, topic, data) {
+ if (topic == "idle" || topic == "active") {
+ this.emit("stateChanged", topic);
+ }
+ }
+ })();
+ idleService.addIdleObserver(observer, detectionInterval);
+ observerInfo.observer = observer;
+ observerInfo.detectionInterval = detectionInterval;
+ }
+ return observer;
+};
+
+const setDetectionInterval = (extension, context, newInterval) => {
+ let observerInfo = getIdleObserverInfo(extension, context);
+ let { observer, detectionInterval } = observerInfo;
+ if (observer) {
+ idleService.removeIdleObserver(observer, detectionInterval);
+ idleService.addIdleObserver(observer, newInterval);
+ }
+ observerInfo.detectionInterval = newInterval;
+};
+
+this.idle = class extends ExtensionAPI {
+ getAPI(context) {
+ let { extension } = context;
+ return {
+ idle: {
+ queryState: function(detectionIntervalInSeconds) {
+ if (idleService.idleTime < detectionIntervalInSeconds * 1000) {
+ return Promise.resolve("active");
+ }
+ return Promise.resolve("idle");
+ },
+ setDetectionInterval: function(detectionIntervalInSeconds) {
+ setDetectionInterval(extension, context, detectionIntervalInSeconds);
+ },
+ onStateChanged: new EventManager({
+ context,
+ name: "idle.onStateChanged",
+ register: fire => {
+ let listener = (event, data) => {
+ fire.sync(data);
+ };
+
+ getIdleObserver(extension, context).on("stateChanged", listener);
+ return () => {
+ getIdleObserver(extension, context).off("stateChanged", listener);
+ };
+ },
+ }).api(),
+ },
+ };
+ }
+};