diff options
Diffstat (limited to '')
-rw-r--r-- | toolkit/components/normandy/actions/AddonRollbackAction.jsm | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/toolkit/components/normandy/actions/AddonRollbackAction.jsm b/toolkit/components/normandy/actions/AddonRollbackAction.jsm new file mode 100644 index 0000000000..033b8f55ed --- /dev/null +++ b/toolkit/components/normandy/actions/AddonRollbackAction.jsm @@ -0,0 +1,100 @@ +/* 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"; + +const { XPCOMUtils } = ChromeUtils.importESModule( + "resource://gre/modules/XPCOMUtils.sys.mjs" +); +const { BaseAction } = ChromeUtils.import( + "resource://normandy/actions/BaseAction.jsm" +); + +const lazy = {}; + +ChromeUtils.defineESModuleGetters(lazy, { + TelemetryEnvironment: "resource://gre/modules/TelemetryEnvironment.sys.mjs", +}); + +XPCOMUtils.defineLazyModuleGetters(lazy, { + ActionSchemas: "resource://normandy/actions/schemas/index.js", + AddonManager: "resource://gre/modules/AddonManager.jsm", + AddonRollouts: "resource://normandy/lib/AddonRollouts.jsm", + TelemetryEvents: "resource://normandy/lib/TelemetryEvents.jsm", +}); + +var EXPORTED_SYMBOLS = ["AddonRollbackAction"]; + +class AddonRollbackAction extends BaseAction { + get schema() { + return lazy.ActionSchemas["addon-rollback"]; + } + + async _run(recipe) { + const { rolloutSlug } = recipe.arguments; + const rollout = await lazy.AddonRollouts.get(rolloutSlug); + + if (!rollout) { + this.log.debug(`Rollback ${rolloutSlug} not applicable, skipping`); + return; + } + + switch (rollout.state) { + case lazy.AddonRollouts.STATE_ACTIVE: { + await lazy.AddonRollouts.update({ + ...rollout, + state: lazy.AddonRollouts.STATE_ROLLED_BACK, + }); + + const addon = await lazy.AddonManager.getAddonByID(rollout.addonId); + if (addon) { + try { + await addon.uninstall(); + } catch (err) { + lazy.TelemetryEvents.sendEvent( + "unenrollFailed", + "addon_rollback", + rolloutSlug, + { + reason: "uninstall-failed", + enrollmentId: + rollout.enrollmentId || + lazy.TelemetryEvents.NO_ENROLLMENT_ID_MARKER, + } + ); + throw err; + } + } else { + this.log.warn( + `Could not uninstall addon ${rollout.addonId} for rollback ${rolloutSlug}: it is not installed.` + ); + } + + lazy.TelemetryEvents.sendEvent( + "unenroll", + "addon_rollback", + rolloutSlug, + { + reason: "rollback", + enrollmentId: + rollout.enrollmentId || + lazy.TelemetryEvents.NO_ENROLLMENT_ID_MARKER, + } + ); + lazy.TelemetryEnvironment.setExperimentInactive(rolloutSlug); + break; + } + + case lazy.AddonRollouts.STATE_ROLLED_BACK: { + return; // Do nothing + } + + default: { + throw new Error( + `Unexpected state when rolling back ${rolloutSlug}: ${rollout.state}` + ); + } + } + } +} |