VulpesOS/gaia/shared/test/unit/mocks/mock_dom_request.js
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

149 lines
3.9 KiB
JavaScript
Executable file

'use strict';
/* global MockEventTarget */
(function(exports) {
/**
* This is an reimplementation of DOMRequest in JavaScript,
* usable as a mock for tests.
*
* See https://developer.mozilla.org/en-US/docs/Web/API/DOMRequest
* and http://dxr.mozilla.org/mozilla-central/source/dom/base/DOMRequest.h
* for the simulated real APIs.
*
* There are two additional methods (fireSuccess() and fireError()) for
* explicitly invoking success/error in test script.
*
* @class MockDOMRequest
* @requires MockEventTarget
*
*/
var MockDOMRequest = function MockDOMRequest() {
this._promise = null;
};
MockDOMRequest.prototype = new MockEventTarget();
/**
* The operation's result.
* @memberof MockDOMRequest.prototype
* @type {Mixed}
*/
MockDOMRequest.prototype.result = undefined;
/**
* Error information, if any.
* @type {Mixed}
*/
MockDOMRequest.prototype.error = undefined;
/**
* A callback handler called when the operation represented by the
* DOMRequest is completed.
* @memberof MockDOMRequest.prototype
* @type {Function}
*/
MockDOMRequest.prototype.onsuccess = null;
/**
* A callback handler that gets called when an error occurs while processing
* the operation.
* @memberof MockDOMRequest.prototype
* @type {Function}
*/
MockDOMRequest.prototype.onerror = null;
/**
* A string indicating whether or not the operation is finished running.
* Its value is either "done" or "pending".
* @memberof MockDOMRequest.prototype
* @type {String}
*/
MockDOMRequest.prototype.readyState = 'pending';
/**
* Fire success event with result given.
* @memberof MockDOMRequest.prototype
* @param {Mixed} result The result.
*/
MockDOMRequest.prototype.fireSuccess = function(result) {
if (this.readyState === 'done') {
throw 'The DOMRequest instance has already fired.';
}
this.readyState = 'done';
this.result = result;
// Fake event that only implements two properties.
// I am not interested in writing MockDOMEvent :-/
var evt = {
type: 'success'
};
this.dispatchEvent(evt);
// Remove callbacks since we will never file them again.
this._captureCallbacks = [];
this._bubbleCallbacks = [];
this._getInternalPromise().resolve(result);
};
/**
* Fire error event with error given.
* @memberof MockDOMRequest.prototype
* @param {Mixed} error The error.
*/
MockDOMRequest.prototype.fireError = function(error) {
if (this.readyState === 'done') {
throw 'The DOMRequest instance has already fired.';
}
this.readyState = 'done';
this.error = error;
// Fake event that only implements two properties.
// I am not interested in writing MockDOMEvent :-/
var evt = {
type: 'error'
};
this.dispatchEvent(evt);
// Remove callbacks since we will never file them again.
this._captureCallbacks = [];
this._bubbleCallbacks = [];
this._getInternalPromise().reject(error);
};
/**
* The then-able interface of DOMRequest. See bug 839838 for real impl.
* @returns {Mixed} A Promise instance returned by the then() method.
*/
MockDOMRequest.prototype.then = function(fulfillCallback, rejectCallback) {
return this._getInternalPromise().then(fulfillCallback, rejectCallback);
};
/**
* Get the internal promise instance. Internal only.
* Create the instance when being required for the first time.
* @returns {Mixed} A Promise instance.
*/
MockDOMRequest.prototype._getInternalPromise = function() {
if (this._promise) {
return this._promise;
}
var oResolve, oReject;
var p = this._promise = new Promise(function(resolve, reject) {
oResolve = resolve;
oReject = reject;
});
p.resolve = oResolve;
p.reject = oReject;
return p;
};
exports.MockDOMRequest = MockDOMRequest;
}(window));