Source code
Revision control
Copy as Markdown
Other Tools
/* 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
/**
* Note: If you add or modify the list of helpers, make sure to update the
* corresponding documentation in the `docs` folder as well.
*/
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
AddonManager: "resource://gre/modules/AddonManager.sys.mjs",
CustomizableUI:
"moz-src:///browser/components/customizableui/CustomizableUI.sys.mjs",
IPPExceptionsManager:
"resource:///modules/ipprotection/IPPExceptionsManager.sys.mjs",
IPProtection: "resource:///modules/ipprotection/IPProtection.sys.mjs",
IPProtectionWidget: "resource:///modules/ipprotection/IPProtection.sys.mjs",
IPProtectionService:
"resource:///modules/ipprotection/IPProtectionService.sys.mjs",
IPProtectionStates:
"resource:///modules/ipprotection/IPProtectionService.sys.mjs",
});
import { IPPAutoStartHelpers } from "resource:///modules/ipprotection/IPPAutoStart.sys.mjs";
import { IPPNimbusHelper } from "resource:///modules/ipprotection/IPPNimbusHelper.sys.mjs";
import { IPPSignInWatcher } from "resource:///modules/ipprotection/IPPSignInWatcher.sys.mjs";
import { IPPStartupCache } from "resource:///modules/ipprotection/IPPStartupCache.sys.mjs";
const VPN_ADDON_ID = "vpn@mozilla.com";
/**
* This simple class controls the UI activation/deactivation.
*/
class UIHelper {
constructor() {
this.handleEvent = this.#handleEvent.bind(this);
}
init() {
lazy.IPProtectionService.addEventListener(
"IPProtectionService:StateChanged",
this.handleEvent
);
}
initOnStartupCompleted() {}
uninit() {
lazy.IPProtectionService.removeEventListener(
"IPProtectionService:StateChanged",
this.handleEvent
);
lazy.IPProtection.uninit();
lazy.IPPExceptionsManager.uninit();
}
#handleEvent(_event) {
const state = lazy.IPProtectionService.state;
if (
!lazy.IPProtection.isInitialized &&
state !== lazy.IPProtectionStates.UNINITIALIZED &&
state !== lazy.IPProtectionStates.UNAVAILABLE
) {
lazy.IPProtection.init();
lazy.IPPExceptionsManager.init();
}
}
}
/**
* This simple class resets the account data when needed
*/
class AccountResetHelper {
constructor() {
this.handleEvent = this.#handleEvent.bind(this);
}
init() {
lazy.IPProtectionService.addEventListener(
"IPProtectionService:StateChanged",
this.handleEvent
);
}
initOnStartupCompleted() {}
uninit() {
lazy.IPProtectionService.removeEventListener(
"IPProtectionService:StateChanged",
this.handleEvent
);
}
#handleEvent(_event) {
// Reset stored account information and stop the proxy,
// if the account is no longer available.
if (
(lazy.IPProtectionService.hasEntitlement &&
lazy.IPProtectionService.state ===
lazy.IPProtectionStates.UNAVAILABLE) ||
lazy.IPProtectionService.state === lazy.IPProtectionStates.UNAUTHENTICATED
) {
lazy.IPProtectionService.resetAccount();
}
}
}
/**
* This class removes the UI widget if the VPN add-on is installed.
*/
class VPNAddonHelper {
init() {}
/**
* Adds an observer to monitor the VPN add-on installation
*/
initOnStartupCompleted() {
this.addonVPNListener = {
onInstallEnded(_install, addon) {
if (addon.id === VPN_ADDON_ID && lazy.IPProtectionService.hasUpgraded) {
// Place the widget in the customization palette.
lazy.CustomizableUI.removeWidgetFromArea(
lazy.IPProtectionWidget.WIDGET_ID
);
}
},
};
lazy.AddonManager.addInstallListener(this.addonVPNListener);
}
/**
* Removes the VPN add-on installation observer
*/
uninit() {
if (this.addonVPNListener) {
lazy.AddonManager.removeInstallListener(this.addonVPNListener);
}
}
}
// The order is important! NimbusHelper must be the last one because nimbus
// triggers the callback immdiately, which could compute a new state for all
// the helpers.
const IPPHelpers = [
IPPStartupCache,
IPPSignInWatcher,
new UIHelper(),
new AccountResetHelper(),
new VPNAddonHelper(),
...IPPAutoStartHelpers,
IPPNimbusHelper,
];
export { IPPHelpers };