Source code

Revision control

Copy as Markdown

Other Tools

/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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/. */
#include "nsISupports.idl"
interface nsIRequest;
interface nsIRequestObserver;
interface nsISimpleEnumerator;
interface nsIFile;
webidl Element;
webidl Document;
/**
* An interface that describes an object representing a patch file that can
* be downloaded and applied to a version of this application so that it
* can be updated.
*/
[scriptable, uuid(dc8fb8a9-3a53-4031-9469-2a5197ea30e7)]
interface nsIUpdatePatch : nsISupports
{
/**
* The type of this patch:
* "partial" A binary difference between two application versions
* "complete" A complete patch containing all of the replacement files
* to update to the new version
*/
readonly attribute AString type;
/**
* The URL this patch was being downloaded from
*/
readonly attribute AString URL;
/**
* The final URL this patch was being downloaded from
*/
attribute AString finalURL;
/**
* The size of this file, in bytes.
*/
readonly attribute unsigned long size;
/**
* The state of this patch
*/
attribute AString state;
/**
* A numeric error code that conveys additional information about the state of
* a failed update. If the update is not in the "failed" state the value is
* zero. The possible values are located in common/updatererrors.h and values between
* 80 and 99 are in nsUpdateService.js.
*/
attribute long errorCode;
/**
* true if this patch is currently selected as the patch to be downloaded and
* installed for this update transaction, false if another patch from this
* update has been selected.
*/
attribute boolean selected;
/**
* Serializes this patch object into a DOM Element
* @param updates
* The document to serialize into
* @returns The DOM Element created by the serialization process
*/
Element serialize(in Document updates);
};
/**
* An interface that describes an object representing an available update to
* the current application - this update may have several available patches
* from which one must be selected to download and install, for example we
* might select a binary difference patch first and attempt to apply that,
* then if the application process fails fall back to downloading a complete
* file-replace patch. This object also contains information about the update
* that the front end and other application services can use to learn more
* about what is going on.
*/
[scriptable, uuid(e094c045-f4ff-41fd-92da-cd2effd2c7c9)]
interface nsIUpdate : nsISupports
{
/**
* The type of update:
* "major" A major new version of the Application
* "minor" A minor update to the Application (e.g. security update)
*/
readonly attribute AString type;
/**
* The name of the update, or "<Application Name> <Update Version>"
*/
readonly attribute AString name;
/**
* The string to display in the user interface for the version. If you want
* a real version number use appVersion.
*/
readonly attribute AString displayVersion;
/**
* The Application version of this update.
*/
readonly attribute AString appVersion;
/**
* The platform version of this update.
*/
readonly attribute AString platformVersion;
/**
* The Application version prior to the application being updated.
*/
readonly attribute AString previousAppVersion;
/**
* The Build ID of this update. Used to determine a particular build, down
* to the hour, minute and second of its creation. This allows the system
* to differentiate between several nightly builds with the same |version|
* for example.
*/
readonly attribute AString buildID;
/**
* The URL to a page which offers details about the content of this
* update. Ideally, this page is not the release notes but some other page
* that summarizes the differences between this update and the previous,
* which also links to the release notes.
*/
readonly attribute AString detailsURL;
/**
* The URL to the Update Service that supplied this update.
*/
readonly attribute AString serviceURL;
/**
* The channel used to retrieve this update from the Update Service.
*/
readonly attribute AString channel;
/**
* Whether the update is no longer supported on this system.
*/
readonly attribute boolean unsupported;
/**
* Allows overriding the default amount of time in seconds before prompting the
* user to apply an update. If not specified, the value of
* app.update.promptWaitTime will be used.
*/
attribute long long promptWaitTime;
/**
* Whether or not the update being downloaded is a complete replacement of
* the user's existing installation or a patch representing the difference
* between the new version and the previous version.
*/
attribute boolean isCompleteUpdate;
/**
* When the update was installed.
*/
attribute long long installDate;
/**
* A message associated with this update, if any.
*/
attribute AString statusText;
/**
* The currently selected patch for this update.
*/
readonly attribute nsIUpdatePatch selectedPatch;
/**
* The state of the selected patch:
* "downloading" The update is being downloaded.
* "pending" The update is ready to be applied.
* "pending-service" The update is ready to be applied with the service.
* "pending-elevate" The update is ready to be applied but requires elevation.
* "applying" The update is being applied.
* "applied" The update is ready to be switched to.
* "applied-os" The update is OS update and to be installed.
* "applied-service" The update is ready to be switched to with the service.
* "succeeded" The update was successfully applied.
* "download-failed" The update failed to be downloaded.
* "failed" The update failed to be applied.
*/
attribute AString state;
/**
* A numeric error code that conveys additional information about the state of
* a failed update. If the update is not in the "failed" state the value is
* zero. The possible values are located in common/updatererrors.h and values between
* 80 and 99 are in nsUpdateService.js.
*/
attribute long errorCode;
/**
* Whether an elevation failure has been encountered for this update.
*/
attribute boolean elevationFailure;
/**
* The number of patches supplied by this update.
*/
readonly attribute unsigned long patchCount;
/**
* Retrieves a patch.
* @param index
* The index of the patch to retrieve.
* @returns The nsIUpdatePatch at the specified index.
*/
nsIUpdatePatch getPatchAt(in unsigned long index);
/**
* Serializes this update object into a DOM Element
* @param updates
* The document to serialize into
* @returns The DOM Element created by the serialization process
*/
Element serialize(in Document updates);
};
/**
* An interface describing the result of an update check.
*/
[scriptable, uuid(bff08110-e79f-4a9f-a56c-348170f9208a)]
interface nsIUpdateCheckResult : nsISupports
{
/**
* True if update checks are allowed. otherwise false.
*/
readonly attribute boolean checksAllowed;
/**
* True if the update check succeeded, otherwise false. Guaranteed to be false
* if checksAllowed is false.
*/
readonly attribute boolean succeeded;
/**
* The XMLHttpRequest handling the update check. Depending on exactly how the
* check failed, it's possible for this to be null.
*/
readonly attribute jsval request;
/**
* If `!checksAllowed`, this will always be an empty array.
*
* If `succeeded`, this will be an array of nsIUpdate objects listing
* available updates. The length will be 0 if there are no available updates.
*
* If `checksAllowed && !succeeded`, this will be an array containing exactly
* one nsIUpdate object. Most of the attributes will have no useful value
* since we did not successfully retrieve an update, but `errorCode` and
* `statusText` will be set to values that describe the error encountered when
* checking for updates.
*/
readonly attribute Array<nsIUpdate> updates;
};
/**
* An interface describing an update check that may still be in-progress or may
* be completed.
*/
[scriptable, uuid(2620aa24-27aa-463a-b6d2-0734695c1f7a)]
interface nsIUpdateCheck : nsISupports
{
/**
* An id that represents a particular update check. Can be passed to
* nsIUpdateChecker::stopCheck.
*
* Ids are guaranteed to be truthy (non-zero) and non-repeating. This is
* just for caller convenience so that (a) it's not an error to cancel a check
* that already completed and (b) they can easily check `if (idVar)` to see if
* they stored an id.
*/
readonly attribute long id;
/**
* A promise that resolves to the results of the update check, which will be
* of type nsIUpdateCheckResult.
*/
readonly attribute Promise result;
};
/**
* An interface into the internals of the update checker. These should only be
* accessed from within update code and tests.
*/
[scriptable, uuid(e27f0336-ad86-4c31-bfee-1d96100521f5)]
interface nsIUpdateCheckerInternal : nsISupports
{
/**
* This is identical to the corresponding function in `nsIUpdateChecker`, but
* this version does not ensure the update system has been initialized before
* being called.
*/
nsIUpdateCheck checkForUpdates(in long checkType);
};
/**
* An interface describing an object that knows how to check for updates. It can
* perform multiple update checks simultaneously or consolidate multiple check
* requests into a single web request, depending on whether the parameters
* specified for update checking match.
*/
[scriptable, uuid(877ace25-8bc5-452a-8586-9c1cf2871994)]
interface nsIUpdateChecker : nsISupports
{
/**
* Enumerated constants. See the `checkType` parameter of `checkForUpdates`
* for details.
*/
const long BACKGROUND_CHECK = 1;
const long FOREGROUND_CHECK = 2;
/**
* Checks for available updates.
* @param checkType
* Must be either BACKGROUND_CHECK or FOREGROUND_CHECK. If
* FOREGROUND_CHECK is specified, the normal
* nsIApplicationUpdateService.canCheckForUpdates check will be
* overridden and the "force" parameter will be included in the
* update URL.
*
* Regarding the "force" parameter:
* Sometimes the update server throttles updates, arbitrarily
* refraining from returning the newest version to some clients. The
* force parameter overrides this behavior and tells it to
* unconditionally return the newest available version.
*
* It's worth noting that the update server technically supports
* forcing the decision in the other direction too, preventing
* the newest version from being returned, but this interface doesn't
* actually support setting the force parameter this way. If the
* force parameter is used, it always forces getting the newest
* version.
* @returns An nsIUpdateCheck object that describes the update check and
* provides a Promise that resolves to the update check results.
*/
nsIUpdateCheck checkForUpdates(in long checkType);
/**
* Gets the update URL.
* @param checkType
* Must be either BACKGROUND_CHECK or FOREGROUND_CHECK. See the
* checkType parameter of nsIUpdateChecker.checkForUpdates for more
* details.
* @returns A Promise that resolves to the URL to be used to check for
* updates, as a string. This URL should resolve to an XML describing
* the updates that are available to the current Firefox
* installation.
*/
Promise getUpdateURL(in long checkType);
/**
* Ends a pending update check. Has no effect if the id is invalid or the
* check corresponding to the id has already completed.
*
* Note that because `nsIUpdateChecker` potentially combines multiple update
* checks, it is not guaranteed that this will actually cause the update
* request to be aborted. It also doesn't guarantee that
* `nsIUpdateCheck.result` will resolve when this is called. This merely marks
* the check id as cancelled and only if there are no other check ids waiting
* on the request does it abort it.
*
* @param id
* The id of a check to stop (accessible via nsIUpdateCheck).
*/
void stopCheck(in long id);
/**
* Ends all pending update checks.
*/
void stopAllChecks();
/**
* See nsIUpdateCheckerInternal for details.
*/
readonly attribute nsIUpdateCheckerInternal internal;
};
/**
* An interface into the internals of the update service. These should only be
* accessed from within update code and tests.
*/
[scriptable, uuid(7f39bc95-eaf8-4adc-990b-0fc0734f85fa)]
interface nsIApplicationUpdateServiceInternal : nsISupports
{
/**
* To initialize the update system, use the init method on
* `nsIApplicationUpdateService` or `nsIApplicationUpdateServiceStub`. This
* method is invoked as part of the update initialization process, but is not
* an entry point to it.
*
* @param force
* If `true`, run the initialization again, even if we already have.
* Should only be used in testing.
* @returns Promise<undefined>
*/
Promise init(in boolean force);
/**
* These are identical to the corresponding functions in
* `nsIApplicationUpdateService`, but these versions do not ensure the update
* system has been initialized before being called.
*/
Promise downloadUpdate(in nsIUpdate update);
Promise stopDownload();
};
/**
* An interface describing a global application service that handles performing
* background update checks and provides utilities for selecting and
* downloading update patches.
*/
[scriptable, uuid(1107d207-a263-403a-b268-05772ec10757)]
interface nsIApplicationUpdateService : nsISupports
{
/**
* Initializes the update system. It is typically not necessary to call this
* since the public methods that require initialization to be meaningful
* ensure that initialization has been performed. But this can be useful to
* spur the updater to resume or complete any in-progress updates from
* previous browser sessions.
*
* @returns Promise<undefined>
*/
Promise init();
/**
* Checks for available updates in the background using the listener provided
* by the application update service for background checks.
* @returns A promise resolving to `true` if the update check was started, or
* one resolving to `false` if not. Note that the check starting does
* not necessarily mean that the check will succeed or that an
* update will be downloaded.
*/
Promise checkForBackgroundUpdates();
/**
* Selects the best update to install from a list of available updates.
* @param updates
* An array of updates that are available
* @returns Promise<nsIUpdate>
* Resolves with the best update to install.
*/
Promise selectUpdate(in Array<nsIUpdate> updates);
/**
* Adds a listener that receives progress and state information about the
* update that is currently being downloaded, e.g. to update a user
* interface. Registered listeners will be called for all downloads and all
* updates during a browser session; they are not automatically removed
* following the first (successful or failed) download.
* @param listener
* An object implementing nsIRequestObserver and optionally
* nsIProgressEventSink that is to be notified of state and
* progress information as the update is downloaded.
*/
void addDownloadListener(in nsIRequestObserver listener);
/**
* Removes a listener that is receiving progress and state information
* about the update that is currently being downloaded.
* @param listener
* The listener object to remove.
*/
void removeDownloadListener(in nsIRequestObserver listener);
/**
* The below are the possible return values for `downloadUpdate()`.
*/
// An update download was started.
const long DOWNLOAD_SUCCESS = 1;
// The update download is already in-progress but it is using a download
// method that we can't use in the background and Firefox is currently running
// as a background task.
const long DOWNLOAD_FAILURE_CANNOT_RESUME_IN_BACKGROUND = 2;
// The update download cannot be started for a reason that doesn't have a more
// specific failure code.
const long DOWNLOAD_FAILURE_GENERIC = 3;
/**
* Starts downloading the update passed. Once the update is downloaded, it
* will automatically be prepared for installation.
*
* @param update
* The update to download.
* @returns A promise that resolves with the integer value of one of the
* `DOWNLOAD_*` constants above indicating whether or not the
* download was started.
*/
Promise downloadUpdate(in nsIUpdate update);
/**
* This is the function called internally by the Application Update Service
* when an update check is complete. Though this can be used to potentially
* start an update download, `downloadUpdate` should used for that.
* This is mostly exposed in the interface in order to make it accessible for
* testing.
*/
Promise onCheckComplete(in nsIUpdateCheckResult result);
/**
* Stop the active update download process. This is the equivalent of
* calling nsIRequest::Cancel on the download's nsIRequest. When downloading
* with nsIIncrementalDownload, this will leave the partial download in place.
* When downloading with BITS, any partial download progress will be removed.
*
* @returns A Promise that resolves once the download has been stopped.
*/
Promise stopDownload();
/**
* There are a few things that can disable the Firefox updater at runtime
* such as Enterprise Policies. If this attribute is set to true, update
* should not be performed and most update interfaces will return errors.
*/
readonly attribute boolean disabled;
/**
* Whether or not the Update Service can usually check for updates. This is a
* function of whether or not application update is disabled by the
* application and the platform the application is running on.
*/
readonly attribute boolean canUsuallyCheckForUpdates;
/**
* Whether or not the Update Service can check for updates right now. This is
* a function of whether or not application update is disabled by the
* application, the platform the application is running on, and transient
* factors such as whether other instances are running.
*/
readonly attribute boolean canCheckForUpdates;
/**
* Whether or not the installation requires elevation. Currently only
* implemented on OSX, returns false on other platforms.
*/
readonly attribute boolean elevationRequired;
/**
* Whether or not the Update Service can usually download and install updates.
* On Windows, this is a function of whether or not the maintenance service
* is installed and enabled. On other systems, and as a fallback on Windows,
* this depends on whether the current user has write access to the install
* directory.
*/
readonly attribute boolean canUsuallyApplyUpdates;
/**
* Whether or not the Update Service can download and install updates right now.
* On Windows, this is a function of whether or not the maintenance service
* is installed and enabled. On other systems, and as a fallback on Windows,
* this depends on whether the current user has write access to the install
* directory. On all systems, this includes transient factors such as whether
* other instances are running.
*/
readonly attribute boolean canApplyUpdates;
/**
* Whether or not a different instance is handling updates of this
* installation. This currently only ever returns true on Windows
* when 2 instances of an application are open. Only one of the instances
* will actually handle updates for the installation.
*/
readonly attribute boolean isOtherInstanceHandlingUpdates;
/**
* Whether the Update Service is usually able to stage updates.
*/
readonly attribute boolean canUsuallyStageUpdates;
/**
* Whether the Update Service is able to stage updates right now. On all
* systems, this includes transient factors such as whether other instances
* are running.
*/
readonly attribute boolean canStageUpdates;
/**
* On Windows, whether the Update Service can usually use BITS.
*/
readonly attribute boolean canUsuallyUseBits;
/**
* On Windows, whether the Update Service can use BITS right now. This
* includes transient factors such as whether other instances are running.
*/
readonly attribute boolean canUseBits;
/**
* Indicates whether or not the enterprise policy that allows only manual
* updating is active. One of the features of this policy is not being
* notified of updates; you are intended to need to manually tell Firefox
* that you want to update each time that you want to do so.
*
* This policy has some implications for the way that update checks work. We
* don't want to do background update checks. Without being able to notify
* the user, there's not really anything to do if we find one. However, we
* will allow "automatic" update checks when loading the update interfaces
* in about:preferences, the About Dialog, etc. When those interfaces are
* open, we do have a way of telling the user about an update without
* bothering them with a doorhanger.
*/
readonly attribute boolean manualUpdateOnly;
/**
* Determines if the base directory is writable. If not, we assume that
* further permissions are required and that we are dealing with an elevated
* installation.
*/
readonly attribute boolean isAppBaseDirWritable;
/**
* This can be set to true to prevent updates being processed beyond starting
* an update download. This should only be used when we are being run as a
* background task.
* This exists to prevent a particularly fast update download from beginning
* to stage while the background task is shutting down.
*/
attribute boolean onlyDownloadUpdatesThisSession;
/**
* Enumerated constants describing the update states that the updater can be
* in.
* Note that update checking is not part of the states that this interface
* can recognize and report. This is for two reasons: 1) there are multiple
* kinds of update checks (ex: foreground and background) and it would make
* the current update state more complicated if we wanted to track both, and
* 2) there isn't really any reason to concern ourselves with current update
* checks because nsIUpdateChecker will seamlessly combine multiple identical
* update checks into a single request without the caller having to worry
* about its internal state.
*/
// An update download hasn't started yet, or we failed at some point in the
// update process and aborted.
const long STATE_IDLE = 1;
// An update is currently being downloaded.
// This state begins once nsIApplicationUpdateService.downloadUpdate resolves
// to `true`.
// Note that we may be downloading an update but not be in this state because
// we can download a second update while we have an update ready. But there
// isn't much reason for currentState to track the second update. We know that
// it will always be in the downloading state until it finishes downloading
// and becomes the ready update. See STATE_UPDATE_SWAP for more details.
const long STATE_DOWNLOADING = 2;
// An update is currently being staged. Note that we do not always stage
// updates.
const long STATE_STAGING = 4;
// An update is pending. If the browser restarts now, it will be installed.
// Note that although "pending" is one of the potential update statuses, this
// does not correspond to exactly that status.
const long STATE_PENDING = 5;
// We had an update pending. Then we downloaded another update. Now we are
// in the process of removing the old update and swapping the new update into
// its place.
// Note that when the state initially changes to `STATE_SWAP`, the new update
// will be in `nsIUpdateManager.downloadingUpdate` but it will be moved into
// `nsIUpdateManager.readyUpdate` before moving to the next state.
const long STATE_SWAP = 6;
/**
* Gets a string describing the state (mostly intended to be make console
* logs easier to read).
*/
AString getStateName(in long state);
/**
* The current state of the application updater. Returns one of the enumerated
* constants, above.
*
* The expected flow looks like this:
* STATE_IDLE -> STATE_DOWNLOADING -> STATE_STAGING -> STATE_PENDING
* If a failure is encountered at some time, we go back to STATE_IDLE.
* If staging is not enabled, STATE_STAGING will be skipped.
*
* We may download additional updates after we reach STATE_PENDING. If we do,
* the state will remain at STATE_PENDING while we download the new update. If
* we restart during that time, the pending update will be installed and the
* partially downloaded update will be discarded. If a download completes
* successfully, there will be a brief period where STATE_PENDING is no longer
* correct, because the Update Service is in the process of removing the old
* update and replacing it with the new update. So if we restart during that
* period, the update will not be correctly installed. Thus, we switch away
* from STATE_PENDING to STATE_SWAP during that time. Assuming that the swap
* is successful, the state will then switch back STATE_STAGING (assuming that
* staging is enabled), then to STATE_PENDING. So the full expected state flow
* looks more like this:
* STATE_IDLE -> STATE_DOWNLOADING -> STATE_STAGING -> STATE_PENDING ->
* STATE_SWAP -> STATE_STAGING -> STATE_PENDING ->
* STATE_SWAP -> STATE_STAGING -> STATE_PENDING -> ...
* (Omitting STATE_STAGING if staging is not enabled).
*/
readonly attribute long currentState;
/**
* A Promise that resolves immediately after `currentState` changes.
*/
readonly attribute Promise stateTransition;
/**
* See nsIApplicationUpdateServiceInternal for details.
*/
readonly attribute nsIApplicationUpdateServiceInternal internal;
};
/**
* An interface describing a component which handles the job of processing
* an update after it's been downloaded.
*/
[scriptable, uuid(74439497-d796-4915-8cef-3dfe43027e4d)]
interface nsIUpdateProcessor : nsISupports
{
/**
* Stages an update while the application is running.
*/
void processUpdate();
/**
* The installer writes an installation-specific registry key if the
* Maintenance Service can be used for this installation. This function checks
* for that key's existence (it does not read or verify the key's contents).
*
* This function should only be called on Windows.
*
* @returns true if the registry key exists, false if it does not.
* @throws NS_ERROR_NOT_AVAILABLE
* If registry access fails.
* @throws NS_ERROR_NOT_IMPLEMENTED
* If this is called on a non-Windows platform.
*/
boolean getServiceRegKeyExists();
/**
* Attempts to restart the application manually on program exit with the same
* arguments it was started with, while accepting additional arguments.
*
* This function should only be called on Windows.
*
* @param argvExtra
* An array of strings to be passed to the application upon
* restart as additional arguments.
* @returns pidRet
* Returns the pid of a newly spawned child process. This value
* is only valid if the function returns successfully.
* @throws NS_ERROR_ABORT
* If the child process failed to spawn correctly.
* @throws NS_ERROR_NOT_IMPLEMENTED
* If this is called on a non-Windows platform.
* @throws NS_ERROR_NOT_AVAILABLE
* If the command line cannot be read.
*/
long attemptAutomaticApplicationRestartWithLaunchArgs(in Array<AString> argvExtra);
/**
* This function is meant to be used in conjunction with
* RegisterApplicationRestartWithLaunchArgs() if you want the child process
* that invokes this function to wait for the parent process
* to finish execution. When the application has the argument
* -restart-pid <pid> this function waits for the application with
* <pid> to exit.
*
* This function should only be called on Windows.
*
* @param pid
* Which process ID to wait for.
* @param timeoutMS
* How long to wait for the process to exit in milliseconds.
* @throws NS_OK
* On successful wait.
* @throws NS_ERROR_NOT_IMPLEMENTED
* If this is called on a non-Windows platform.
* @throws NS_ERROR_INVALID_ARG
* If -restart-pid has no pid parameter.
* @throws NS_ERROR_ILLEGAL_VALUE
* If pid cannot be converted into unsigned int.
* @throws NS_ERROR_FAILURE
* If timeout elapses without process exit.
*/
void waitForProcessExit(in unsigned long pid, in unsigned long timeoutMS);
};
/**
* Upon creation, which should happen early during startup, the sync manager
* creates/opens and locks a file. All other running instances of the same
* installation of the app also open the same lock, so we can use it to
* determine whether any other instance is running. If so, we'll temporarily
* hold off on performing update tasks until there are no other instances or
* until a timeout expires, whichever comes first. That way we can avoid
* updating behind the back of copies that are still running, so we don't force
* all running instances to restart (see bug 1366808, where an error was added
* informing the user of the need to restart any running instances that have
* been updated).
*/
[scriptable, uuid(cf4c4487-66d9-4e18-a2e9-39002245332f)]
interface nsIUpdateSyncManager : nsISupports
{
/**
* Returns whether another instance of this application is running.
* @returns true if another instance has the lock open, false if not
*/
boolean isOtherInstanceRunning();
/**
* Should only be used for testing.
*
* Closes and reopens the lock file, possibly under a different name if a
* parameter is given (or the path hash has changed, which should only happen
* if a test is forcing it).
*/
void resetLock([optional] in nsIFile anAppFile);
};
/**
* An object interface suitable for acquiring the update mutex for the current
* installation path.
*
* The update mutex gives protection against 2 instances running from the same
* installation path updating at the same time:
* 1) By running multiple profiles from the same installation path.
* 2) By running in 2 different user sessions from the same installation path.
*
* nsIUpdateMutex objects do not hold the update mutex when they are created:
* acquiring the update mutex requires an explicit call to tryLock().
*
* The update mutex is automatically released if the application instance
* holding it dies. This is guaranteed by the primitives that are used under
* the hood by nsIUpdateMutex objects.
*
* nsIUpdateMutex objects are independent of one another. If acquisition is
* successful through one object, any attempt to acquire the update mutex
* through another object will fail, until the update mutex is released
* through the first object or the instance where the object lives dies. This
* applies even if both objects live in the same instance.
*/
[scriptable, uuid(dbfa19d2-f3d3-4354-a992-e99f75c22c4a)]
interface nsIUpdateMutex : nsISupports
{
/**
* Checks the current acquisition status for the current object.
*
* @returns true if the update mutex for the current installation is being
* held by the current instance through the current object.
*/
boolean isLocked();
/**
* Attempts to acquire the update mutex for the current installation path.
*
* @returns true if the update mutex was successfully acquired or was already
* held by the current instance through the current object.
*/
boolean tryLock();
/**
* Manually releases the update mutex for the current installation path. Does
* nothing if the update mutex is not being held by the current instance
* through the current object.
*/
void unlock();
};
/**
* An interface into the internals of the update manager. These should only be
* accessed from within update code and tests.
*/
[scriptable, uuid(a5739dda-b94f-47e1-a6f3-224d46d6cb8c)]
interface nsIUpdateManagerInternal : nsISupports
{
/**
* Reloads the update manager's data.
* @param skipFiles
* If `true`, don't reload data from the XMLs, just clear out existing
* data.
*
* @returns Promise<undefined>
*/
Promise reload(in boolean skipFiles);
/**
* These are identical to the functions with the same name in
* `nsIUpdateManager`, but these versions do not ensure the update system has
* been initialized before being called.
*/
Array<nsIUpdate> getHistory();
void addUpdateToHistory(in nsIUpdate update);
// Corresponds to `nsIUpdateManager.getReadyUpdate()`, but also provides
// write access.
attribute nsIUpdate readyUpdate;
// Corresponds to `nsIUpdateManager.getDownloadingUpdate()`, but also provides
// write access.
attribute nsIUpdate downloadingUpdate;
Promise refreshUpdateStatus();
};
/**
* An interface describing a global application service that maintains a list
* of updates previously performed as well as the current active update.
*/
[scriptable, uuid(0f1098e9-a447-4af9-b030-6f8f35c85f89)]
interface nsIUpdateManager : nsISupports
{
/**
* @returns Promise<Array<nsIUpdate>>
* Resolves with an array describing the update history. The first
* element in the array represents the most recent item in the
* history.
*/
Promise getHistory();
/**
* Returns a Promise that resolves with the nsIUpdate that has been
* downloaded, or null if there isn't one.
*/
Promise getReadyUpdate();
/**
* Returns a Promise that resolves with the nsIUpdate that is currently
* downloading, or null if there isn't one.
* An update is no longer considered to be downloading once onStopRequest is
* called. This means that both onStopRequest handlers for download listeners
* and observers of the "update-downloaded" topic should expect the update
* that was just downloaded to be stored in readyUpdate, not
* downloadingUpdate.
*/
Promise getDownloadingUpdate();
/**
* Returns a Promise that resolves with the update that Firefox installed at the
* launch of the current session. If no update was installed, null will be returned
* @returns Promise<nsIUpdate>
*/
Promise updateInstalledAtStartup();
/**
* Returns a Promise that resolves with the most recent update that has been installed,
* the value will be null if it does not exist
* @returns Promise<nsIUpdate>
*/
Promise lastUpdateInstalled();
/**
* Adds the specified update to the update history. The update history is
* limited to 10 items, so this may also remove the last item from the
* history.
* @param update
* The update to add to the history.
* @returns Promise<undefined>
*/
Promise addUpdateToHistory(in nsIUpdate update);
/**
* Saves all updates to disk.
*/
void saveUpdates();
/**
* Refresh the update status based on the information in update.status.
*
* @returns A Promise that resolves after the update status is refreshed.
*/
Promise refreshUpdateStatus();
/**
* The user agreed to proceed with an elevated update and we are now
* permitted to show an elevation prompt.
*
* @returns Promise<undefined>
*/
Promise elevationOptedIn();
/**
* These functions clean up and remove an active update without applying
* it. The first function does this for the update that is currently being
* downloaded. The second function does this for the update that has already
* been downloaded. The third function does this for both updates.
* @returns Promise<undefined>
*/
Promise cleanupDownloadingUpdate();
Promise cleanupReadyUpdate();
Promise cleanupActiveUpdates();
/**
* Runs cleanup that ought to happen on a Firefox paveover install to
* prevent a stale update from being processed when Firefox is first
* launched.
* This is best-effort. It will not throw on cleanup failure.
*
* The returned promise does not resolve with any particular value. It simply
* conveys that the cleanup has completed.
*/
Promise doInstallCleanup();
/**
* Runs cleanup that ought to happen when Firefox is uninstalled to clean up
* old update data that is no longer needed.
* This is best-effort. It will not throw on cleanup failure.
*
* The returned promise does not resolve with any particular value. It simply
* conveys that the cleanup has completed.
*/
Promise doUninstallCleanup();
/**
* See nsIUpdateManagerInternal for details.
*/
readonly attribute nsIUpdateManagerInternal internal;
};
/**
* A lightweight interface that we can load early in startup that gives us very
* limited access to the update system without the startup costs of loading
* nsIApplicationUpdateService.
*/
[scriptable, uuid(3ca17ada-8501-496f-bbe7-6a9f1c28eb2d)]
interface nsIApplicationUpdateServiceStub : nsISupports
{
/**
* This does the standard initialization of the update service stub. The
* primary effect of this is to initialize the update system (the same effect
* as `initUpdate`), but only if there are updates from a previous browser
* session. This allows us to avoid loading the update system so early if it
* would just be sitting idle until the update timer fires or the user visits
* the update UI.
*
* @returns Promise<undefined>
*/
Promise init();
/**
* This is identical to `nsIApplicationUpdateService.init()`.
*
* @returns Promise<undefined>
*/
Promise initUpdate();
/**
* This is identical to `nsIApplicationUpdateService.disabled`.
*/
readonly attribute boolean updateDisabled;
/**
* This will be `true` if update is disabled specifically because we are
* running a test that didn't opt-in to updating.
*/
readonly attribute boolean updateDisabledForTesting;
};