gecko-dev/dom/engineeringmode/EngineeringModeAPI.js
Nick Robson 40e1ba271a Bug 904479 - Added createPromiseWithId() that returns id of resolver r=kanru,nsm
--HG--
extra : rebase_source : 2aae82958670d0154a3cf08bd0e2a80d529e36f3
2015-08-19 14:53:22 -07:00

130 lines
4.2 KiB
JavaScript

/* 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 DEBUG = false;
function debug(s) {
if (DEBUG) dump("-*- EngineeringModeAPI: " + s + "\n");
}
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/DOMRequestHelper.jsm");
XPCOMUtils.defineLazyServiceGetter(this, "cpmm",
"@mozilla.org/childprocessmessagemanager;1",
"nsIMessageSender");
function EngineeringModeAPI() {
}
EngineeringModeAPI.prototype = {
__proto__: DOMRequestIpcHelper.prototype,
classDescription: "Engineering Mode API",
classID: Components.ID("{27e55b94-fc43-42b3-b0f0-28bebdd804f1}"),
contractID: "@mozilla.org/dom/engineering-mode-api;1",
// For DOMRequestHelper: must have nsISupportsWeakReference and nsIObserver.
QueryInterface: XPCOMUtils.generateQI([Ci.nsIDOMGlobalPropertyInitializer,
Ci.nsISupportsWeakReference,
Ci.nsIObserver]),
init: function(aWindow) {
this.initDOMRequestHelper(aWindow, ["EngineeringMode:OnMessage",
"EngineeringMode:SetValue:Result:OK",
"EngineeringMode:SetValue:Result:KO",
"EngineeringMode:GetValue:Result:OK",
"EngineeringMode:GetValue:Result:KO"]);
cpmm.sendAsyncMessage("EngineeringMode:Register", null);
},
uninit: function() {
cpmm.sendAsyncMessage("EngineeringMode:Unregister", null);
},
// This returns a Promise<DOMString>
getValue: function getValue(aName) {
debug("getValue " + aName);
let promiseInit = function(aResolverId) {
debug("promise init called for getValue " + aName + " has resolverId " + aResolverId);
cpmm.sendAsyncMessage("EngineeringMode:GetValue", {
requestId: aResolverId,
name: aName
});
}.bind(this);
return this.createPromiseWithId(promiseInit);
},
// This returns a Promise<void>
setValue: function setValue(aName, aValue) {
debug("setValue " + aName + ' as ' + aValue );
let promiseInit = function(aResolverId) {
debug("promise init called for getValue " + aName + " has resolverId " + aResolverId);
cpmm.sendAsyncMessage("EngineeringMode:SetValue", {
requestId: aResolverId,
name: aName,
value: aValue
});
}.bind(this);
return this.createPromiseWithId(promiseInit);
},
set onmessage(aHandler) {
this.__DOM_IMPL__.setEventHandler("onmessage", aHandler);
},
get onmessage() {
return this.__DOM_IMPL__.getEventHandler("onmessage");
},
receiveMessage: function(aMessage) {
debug("receiveMessage: name: " + aMessage.name);
let resolver = null;
let data = aMessage.data;
switch (aMessage.name) {
case "EngineeringMode:OnMessage":
let detail = Cu.cloneInto(data, this._window);
let event = new this._window.CustomEvent("message", {"detail": detail});
this.__DOM_IMPL__.dispatchEvent(event);
break;
case "EngineeringMode:GetValue:Result:OK":
case "EngineeringMode:GetValue:Result:KO":
resolver = this.takePromiseResolver(data.requestId);
if (!resolver) {
return;
}
if (aMessage.name === "EngineeringMode:GetValue:Result:OK") {
resolver.resolve(data.value);
} else {
resolver.reject(data.reason);
}
break;
case "EngineeringMode:SetValue:Result:OK":
case "EngineeringMode:SetValue:Result:KO":
resolver = this.takePromiseResolver(data.requestId);
if (!resolver) {
return;
}
if (aMessage.name === "EngineeringMode:SetValue:Result:OK") {
resolver.resolve();
} else {
resolver.reject(data.reason);
}
break;
}
}
}
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([EngineeringModeAPI]);