diff options
Diffstat (limited to 'dom/presentation/PresentationDeviceInfoManager.js')
-rw-r--r-- | dom/presentation/PresentationDeviceInfoManager.js | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/dom/presentation/PresentationDeviceInfoManager.js b/dom/presentation/PresentationDeviceInfoManager.js new file mode 100644 index 000000000..29e7d370c --- /dev/null +++ b/dom/presentation/PresentationDeviceInfoManager.js @@ -0,0 +1,119 @@ +/* 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 {classes: Cc, interfaces: Ci, utils: Cu} = Components; + +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +Cu.import("resource://gre/modules/Services.jsm"); +Cu.import("resource://gre/modules/DOMRequestHelper.jsm"); + +function log(aMsg) { + //dump("-*- PresentationDeviceInfoManager.js : " + aMsg + "\n"); +} + +const PRESENTATIONDEVICEINFOMANAGER_CID = Components.ID("{1bd66bef-f643-4be3-b690-0c656353eafd}"); +const PRESENTATIONDEVICEINFOMANAGER_CONTRACTID = "@mozilla.org/presentation-device/deviceInfo;1"; + +XPCOMUtils.defineLazyServiceGetter(this, "cpmm", + "@mozilla.org/childprocessmessagemanager;1", + "nsIMessageSender"); + +function PresentationDeviceInfoManager() {} + +PresentationDeviceInfoManager.prototype = { + __proto__: DOMRequestIpcHelper.prototype, + + classID: PRESENTATIONDEVICEINFOMANAGER_CID, + contractID: PRESENTATIONDEVICEINFOMANAGER_CONTRACTID, + QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, + Ci.nsIObserver, + Ci.nsIDOMGlobalPropertyInitializer]), + + receiveMessage: function(aMsg) { + if (!aMsg || !aMsg.data) { + return; + } + + let data = aMsg.data; + + log("receive aMsg: " + aMsg.name); + switch (aMsg.name) { + case "PresentationDeviceInfoManager:OnDeviceChange": { + let detail = { + detail: { + type: data.type, + deviceInfo: data.deviceInfo, + } + }; + let event = new this._window.CustomEvent("devicechange", Cu.cloneInto(detail, this._window)); + this.__DOM_IMPL__.dispatchEvent(event); + break; + } + case "PresentationDeviceInfoManager:GetAll:Result:Ok": { + let resolver = this.takePromiseResolver(data.requestId); + + if (!resolver) { + return; + } + + resolver.resolve(Cu.cloneInto(data.devices, this._window)); + break; + } + case "PresentationDeviceInfoManager:GetAll:Result:Error": { + let resolver = this.takePromiseResolver(data.requestId); + + if (!resolver) { + return; + } + + resolver.reject(data.error); + break; + } + } + }, + + init: function(aWin) { + log("init"); + this.initDOMRequestHelper(aWin, [ + {name: "PresentationDeviceInfoManager:OnDeviceChange", weakRef: true}, + {name: "PresentationDeviceInfoManager:GetAll:Result:Ok", weakRef: true}, + {name: "PresentationDeviceInfoManager:GetAll:Result:Error", weakRef: true}, + ]); + }, + + uninit: function() { + log("uninit"); + let self = this; + + this.forEachPromiseResolver(function(aKey) { + self.takePromiseResolver(aKey).reject("PresentationDeviceInfoManager got destroyed"); + }); + }, + + get ondevicechange() { + return this.__DOM_IMPL__.getEventHandler("ondevicechange"); + }, + + set ondevicechange(aHandler) { + this.__DOM_IMPL__.setEventHandler("ondevicechange", aHandler); + }, + + getAll: function() { + log("getAll"); + let self = this; + return this.createPromiseWithId(function(aResolverId) { + cpmm.sendAsyncMessage("PresentationDeviceInfoManager:GetAll", { + requestId: aResolverId, + }); + }); + }, + + forceDiscovery: function() { + cpmm.sendAsyncMessage("PresentationDeviceInfoManager:ForceDiscovery"); + }, +}; + +this.NSGetFactory = XPCOMUtils.generateNSGetFactory([PresentationDeviceInfoManager]); |