urce` parameter for adb-addon.install" ); } const addon = await this._getAddon(); if (addon && !addon.userDisabled) { this.status = ADB_ADDON_STATES.INSTALLED; return; } this.status = ADB_ADDON_STATES.PREPARING; if (addon?.userDisabled) { await addon.enable(); } else { const install = await AddonManager.getInstallForURL(this._getXpiLink(), { telemetryInfo: { source }, }); install.addListener(this); install.install(); } } async uninstall() { const addon = await this._getAddon(); addon.uninstall(); } installFailureHandler(install, message) { this.status = ADB_ADDON_STATES.UNINSTALLED; this.emit("failure", message); } // Expected AddonManager install listener. onDownloadStarted() { this.status = ADB_ADDON_STATES.DOWNLOADING; } // Expected AddonManager install listener. onDownloadProgress(install) { if (install.maxProgress == -1) { this.emit("progress", -1); } else { this.emit("progress", install.progress / install.maxProgress); } } // Expected AddonManager install listener. onDownloadCancelled(install) { this.installFailureHandler(install, "Download cancelled"); } // Expected AddonManager install listener. onDownloadFailed(install) { this.installFailureHandler(install, "Download failed"); } // Expected AddonManager install listener. onInstallStarted() { this.status = ADB_ADDON_STATES.INSTALLING; } // Expected AddonManager install listener. onInstallCancelled(install) { this.installFailureHandler(install, "Install cancelled"); } // Expected AddonManager install listener. onInstallFailed(install) { this.installFailureHandler(install, "Install failed"); } // Expected AddonManager install listener. onInstallEnded({ addon }) { addon.enable(); } } exports.adbAddon = new ADBAddon(); PK