summaryrefslogtreecommitdiffstats
path: root/mobile/android/modules/geckoview/GeckoViewPushController.jsm
diff options
context:
space:
mode:
Diffstat (limited to 'mobile/android/modules/geckoview/GeckoViewPushController.jsm')
-rw-r--r--mobile/android/modules/geckoview/GeckoViewPushController.jsm77
1 files changed, 77 insertions, 0 deletions
diff --git a/mobile/android/modules/geckoview/GeckoViewPushController.jsm b/mobile/android/modules/geckoview/GeckoViewPushController.jsm
new file mode 100644
index 0000000000..57522b80b4
--- /dev/null
+++ b/mobile/android/modules/geckoview/GeckoViewPushController.jsm
@@ -0,0 +1,77 @@
+/* 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";
+
+var EXPORTED_SYMBOLS = ["GeckoViewPushController"];
+
+const { GeckoViewUtils } = ChromeUtils.importESModule(
+ "resource://gre/modules/GeckoViewUtils.sys.mjs"
+);
+const { XPCOMUtils } = ChromeUtils.importESModule(
+ "resource://gre/modules/XPCOMUtils.sys.mjs"
+);
+
+const lazy = {};
+
+XPCOMUtils.defineLazyServiceGetter(
+ lazy,
+ "PushNotifier",
+ "@mozilla.org/push/Notifier;1",
+ "nsIPushNotifier"
+);
+
+const { debug, warn } = GeckoViewUtils.initLogging("GeckoViewPushController");
+
+function createScopeAndPrincipal(scopeAndAttrs) {
+ const principal = Services.scriptSecurityManager.createContentPrincipalFromOrigin(
+ scopeAndAttrs
+ );
+ const scope = principal.URI.spec;
+
+ return [scope, principal];
+}
+
+const GeckoViewPushController = {
+ onEvent(aEvent, aData, aCallback) {
+ debug`onEvent ${aEvent} ${aData}`;
+
+ switch (aEvent) {
+ case "GeckoView:PushEvent": {
+ const { scope, data } = aData;
+
+ const [url, principal] = createScopeAndPrincipal(scope);
+
+ if (
+ Services.perms.testPermissionFromPrincipal(
+ principal,
+ "desktop-notification"
+ ) != Services.perms.ALLOW_ACTION
+ ) {
+ return;
+ }
+
+ if (!data) {
+ lazy.PushNotifier.notifyPush(url, principal, "");
+ return;
+ }
+
+ const payload = new Uint8Array(
+ ChromeUtils.base64URLDecode(data, { padding: "ignore" })
+ );
+
+ lazy.PushNotifier.notifyPushWithData(url, principal, "", payload);
+ break;
+ }
+ case "GeckoView:PushSubscriptionChanged": {
+ const { scope } = aData;
+
+ const [url, principal] = createScopeAndPrincipal(scope);
+
+ lazy.PushNotifier.notifySubscriptionChange(url, principal);
+ break;
+ }
+ }
+ },
+};