summaryrefslogtreecommitdiffstats
path: root/b2g/components/PresentationRequestUIGlue.js
diff options
context:
space:
mode:
Diffstat (limited to 'b2g/components/PresentationRequestUIGlue.js')
-rw-r--r--b2g/components/PresentationRequestUIGlue.js116
1 files changed, 116 insertions, 0 deletions
diff --git a/b2g/components/PresentationRequestUIGlue.js b/b2g/components/PresentationRequestUIGlue.js
new file mode 100644
index 000000000..5c50401de
--- /dev/null
+++ b/b2g/components/PresentationRequestUIGlue.js
@@ -0,0 +1,116 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* 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"
+
+function debug(aMsg) {
+ // dump("-*- PresentationRequestUIGlue: " + aMsg + "\n");
+}
+
+const { interfaces: Ci, utils: Cu, classes: Cc } = Components;
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+XPCOMUtils.defineLazyModuleGetter(this, "SystemAppProxy",
+ "resource://gre/modules/SystemAppProxy.jsm");
+
+function PresentationRequestUIGlue() { }
+
+PresentationRequestUIGlue.prototype = {
+
+ sendRequest: function(aUrl, aSessionId, aDevice) {
+ let localDevice;
+ try {
+ localDevice = aDevice.QueryInterface(Ci.nsIPresentationLocalDevice);
+ } catch (e) {}
+
+ if (localDevice) {
+ return this.sendTo1UA(aUrl, aSessionId, localDevice.windowId);
+ } else {
+ return this.sendTo2UA(aUrl, aSessionId);
+ }
+ },
+
+ // For 1-UA scenario
+ sendTo1UA: function(aUrl, aSessionId, aWindowId) {
+ return new Promise((aResolve, aReject) => {
+ let handler = (evt) => {
+ if (evt.type === "unload") {
+ SystemAppProxy.removeEventListenerWithId(aWindowId,
+ "unload",
+ handler);
+ SystemAppProxy.removeEventListenerWithId(aWindowId,
+ "mozPresentationContentEvent",
+ handler);
+ aReject();
+ }
+ if (evt.type === "mozPresentationContentEvent" &&
+ evt.detail.id == aSessionId) {
+ SystemAppProxy.removeEventListenerWithId(aWindowId,
+ "unload",
+ handler);
+ SystemAppProxy.removeEventListenerWithId(aWindowId,
+ "mozPresentationContentEvent",
+ handler);
+ this.appLaunchCallback(evt.detail, aResolve, aReject);
+ }
+ };
+ // If system(-remote) app is closed.
+ SystemAppProxy.addEventListenerWithId(aWindowId,
+ "unload",
+ handler);
+ // Listen to the result for the opened iframe from front-end.
+ SystemAppProxy.addEventListenerWithId(aWindowId,
+ "mozPresentationContentEvent",
+ handler);
+ SystemAppProxy.sendCustomEventWithId(aWindowId,
+ "mozPresentationChromeEvent",
+ { type: "presentation-launch-receiver",
+ url: aUrl,
+ id: aSessionId });
+ });
+ },
+
+ // For 2-UA scenario
+ sendTo2UA: function(aUrl, aSessionId) {
+ return new Promise((aResolve, aReject) => {
+ let handler = (evt) => {
+ if (evt.type === "mozPresentationContentEvent" &&
+ evt.detail.id == aSessionId) {
+ SystemAppProxy.removeEventListener("mozPresentationContentEvent",
+ handler);
+ this.appLaunchCallback(evt.detail, aResolve, aReject);
+ }
+ };
+
+ // Listen to the result for the opened iframe from front-end.
+ SystemAppProxy.addEventListener("mozPresentationContentEvent",
+ handler);
+ SystemAppProxy._sendCustomEvent("mozPresentationChromeEvent",
+ { type: "presentation-launch-receiver",
+ url: aUrl,
+ id: aSessionId });
+ });
+ },
+
+ appLaunchCallback: function(aDetail, aResolve, aReject) {
+ switch(aDetail.type) {
+ case "presentation-receiver-launched":
+ aResolve(aDetail.frame);
+ break;
+ case "presentation-receiver-permission-denied":
+ aReject();
+ break;
+ }
+ },
+
+ classID: Components.ID("{ccc8a839-0b64-422b-8a60-fb2af0e376d0}"),
+
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIPresentationRequestUIGlue])
+};
+
+this.NSGetFactory = XPCOMUtils.generateNSGetFactory([PresentationRequestUIGlue]);