summaryrefslogtreecommitdiffstats
path: root/mobile/android/modules/geckoview/GeckoViewPushController.sys.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'mobile/android/modules/geckoview/GeckoViewPushController.sys.mjs')
-rw-r--r--mobile/android/modules/geckoview/GeckoViewPushController.sys.mjs70
1 files changed, 70 insertions, 0 deletions
diff --git a/mobile/android/modules/geckoview/GeckoViewPushController.sys.mjs b/mobile/android/modules/geckoview/GeckoViewPushController.sys.mjs
new file mode 100644
index 0000000000..da2d7d04e9
--- /dev/null
+++ b/mobile/android/modules/geckoview/GeckoViewPushController.sys.mjs
@@ -0,0 +1,70 @@
+/* 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/. */
+
+import { GeckoViewUtils } from "resource://gre/modules/GeckoViewUtils.sys.mjs";
+import { XPCOMUtils } from "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];
+}
+
+export 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;
+ }
+ }
+ },
+};