diff options
Diffstat (limited to 'testing/specialpowers/content/MockColorPicker.sys.mjs')
-rw-r--r-- | testing/specialpowers/content/MockColorPicker.sys.mjs | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/testing/specialpowers/content/MockColorPicker.sys.mjs b/testing/specialpowers/content/MockColorPicker.sys.mjs new file mode 100644 index 0000000000..1b4c4d3b3e --- /dev/null +++ b/testing/specialpowers/content/MockColorPicker.sys.mjs @@ -0,0 +1,123 @@ +/* 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/. */ + +const lazy = {}; + +ChromeUtils.defineESModuleGetters(lazy, { + WrapPrivileged: "resource://testing-common/WrapPrivileged.sys.mjs", +}); + +const Cm = Components.manager; + +const CONTRACT_ID = "@mozilla.org/colorpicker;1"; + +Cu.crashIfNotInAutomation(); + +var registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar); +var oldClassID = ""; +var newClassID = Services.uuid.generateUUID(); +var newFactory = function (window) { + return { + createInstance(aIID) { + return new MockColorPickerInstance(window).QueryInterface(aIID); + }, + QueryInterface: ChromeUtils.generateQI(["nsIFactory"]), + }; +}; + +export var MockColorPicker = { + init(window) { + this.reset(); + this.factory = newFactory(window); + if (!registrar.isCIDRegistered(newClassID)) { + try { + oldClassID = registrar.contractIDToCID(CONTRACT_ID); + } catch (ex) { + oldClassID = ""; + dump( + "TEST-INFO | can't get colorpicker registered component, " + + "assuming there is none" + ); + } + registrar.registerFactory(newClassID, "", CONTRACT_ID, this.factory); + } + }, + + reset() { + this.returnColor = ""; + this.showCallback = null; + this.shown = false; + this.showing = false; + }, + + cleanup() { + var previousFactory = this.factory; + this.reset(); + this.factory = null; + + registrar.unregisterFactory(newClassID, previousFactory); + if (oldClassID != "") { + registrar.registerFactory(oldClassID, "", CONTRACT_ID, null); + } + }, +}; + +function MockColorPickerInstance(window) { + this.window = window; + this.showCallback = null; + this.showCallbackWrapped = null; +} +MockColorPickerInstance.prototype = { + QueryInterface: ChromeUtils.generateQI(["nsIColorPicker"]), + init(aParent, aTitle, aInitialColor, aDefaultColors) { + this.parent = aParent; + this.initialColor = aInitialColor; + this.defaultColors = aDefaultColors; + }, + initialColor: "", + parent: null, + open(aColorPickerShownCallback) { + MockColorPicker.showing = true; + MockColorPicker.shown = true; + + this.window.setTimeout(() => { + let result = ""; + try { + if (typeof MockColorPicker.showCallback == "function") { + if (MockColorPicker.showCallback != this.showCallback) { + this.showCallback = MockColorPicker.showCallback; + if (Cu.isXrayWrapper(this.window)) { + this.showCallbackWrapped = lazy.WrapPrivileged.wrapCallback( + MockColorPicker.showCallback, + this.window + ); + } else { + this.showCallbackWrapped = this.showCallback; + } + } + var updateCb = function (color) { + result = color; + aColorPickerShownCallback.update(color); + }; + let returnColor = this.showCallbackWrapped(this, updateCb); + if (typeof returnColor === "string") { + result = returnColor; + } + } else if (typeof MockColorPicker.returnColor === "string") { + result = MockColorPicker.returnColor; + } + } catch (ex) { + dump( + "TEST-UNEXPECTED-FAIL | Exception in MockColorPicker.sys.mjs open() " + + "method: " + + ex + + "\n" + ); + } + if (aColorPickerShownCallback) { + aColorPickerShownCallback.done(result); + } + }, 0); + }, +}; |