forked from mirrors/gecko-dev
166 lines
4.9 KiB
JavaScript
166 lines
4.9 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/. */
|
|
|
|
/* global loop:true */
|
|
|
|
var loop = loop || {};
|
|
loop.store = loop.store || {};
|
|
|
|
loop.store.FxOSActiveRoomStore = (function() {
|
|
"use strict";
|
|
var sharedActions = loop.shared.actions;
|
|
var ROOM_STATES = loop.store.ROOM_STATES;
|
|
|
|
var FxOSActiveRoomStore = loop.store.createStore({
|
|
actions: [
|
|
"fetchServerData"
|
|
],
|
|
|
|
initialize: function(options) {
|
|
if (!options.mozLoop) {
|
|
throw new Error("Missing option mozLoop");
|
|
}
|
|
this._mozLoop = options.mozLoop;
|
|
},
|
|
|
|
/**
|
|
* Returns initial state data for this active room.
|
|
*/
|
|
getInitialStoreState: function() {
|
|
return {
|
|
roomState: ROOM_STATES.INIT,
|
|
audioMuted: false,
|
|
videoMuted: false,
|
|
failureReason: undefined,
|
|
localVideoDimensions: {},
|
|
remoteVideoDimensions: {}
|
|
};
|
|
},
|
|
|
|
/**
|
|
* Registers the actions with the dispatcher that this store is interested
|
|
* in after the initial setup has been performed.
|
|
*/
|
|
_registerPostSetupActions: function() {
|
|
this.dispatcher.register(this, [
|
|
"joinRoom"
|
|
]);
|
|
},
|
|
|
|
/**
|
|
* Execute fetchServerData event action from the dispatcher. Although
|
|
* this is to fetch the server data - for rooms on the standalone client,
|
|
* we don't actually need to get any data. Therefore we just save the
|
|
* data that is given to us for when the user chooses to join the room.
|
|
*
|
|
* @param {sharedActions.FetchServerData} actionData
|
|
*/
|
|
fetchServerData: function(actionData) {
|
|
if (actionData.windowType !== "room") {
|
|
// Nothing for us to do here, leave it to other stores.
|
|
return;
|
|
}
|
|
|
|
this._registerPostSetupActions();
|
|
|
|
this.setStoreState({
|
|
roomToken: actionData.token,
|
|
roomState: ROOM_STATES.READY
|
|
});
|
|
|
|
},
|
|
|
|
/**
|
|
* Handles the action to join to a room.
|
|
*/
|
|
joinRoom: function() {
|
|
// Reset the failure reason if necessary.
|
|
if (this.getStoreState().failureReason) {
|
|
this.setStoreState({failureReason: undefined});
|
|
}
|
|
|
|
this._setupOutgoingRoom(true);
|
|
},
|
|
|
|
/**
|
|
* Sets up an outgoing room. It will try launching the activity to let the
|
|
* FirefoxOS loop app handle the call. If the activity fails:
|
|
* - if installApp is true, then it'll try to install the FirefoxOS loop
|
|
* app.
|
|
* - if installApp is false, then it'll just log and error and fail.
|
|
*
|
|
* @param {boolean} installApp
|
|
*/
|
|
_setupOutgoingRoom: function(installApp) {
|
|
var request = new MozActivity({
|
|
name: "room-call",
|
|
data: {
|
|
type: "loop/rToken",
|
|
token: this.getStoreState("roomToken")
|
|
}
|
|
});
|
|
|
|
request.onsuccess = function() {};
|
|
|
|
request.onerror = (function(event) {
|
|
if (!installApp) {
|
|
// This really should not happen ever.
|
|
console.error(
|
|
"Unexpected activity launch error after the app has been installed");
|
|
return;
|
|
}
|
|
if (event.target.error.name !== "NO_PROVIDER") {
|
|
console.error ("Unexpected " + event.target.error.name);
|
|
return;
|
|
}
|
|
// We need to install the FxOS app.
|
|
this.setStoreState({
|
|
marketplaceSrc: loop.config.marketplaceUrl,
|
|
onMarketplaceMessage: this._onMarketplaceMessage.bind(this)
|
|
});
|
|
}).bind(this);
|
|
},
|
|
|
|
/**
|
|
* This method will handle events generated on the marketplace frame. It
|
|
* will launch the FirefoxOS loop app installation, and receive the result
|
|
* of the installation.
|
|
*
|
|
* @param {DOMEvent} event
|
|
*/
|
|
_onMarketplaceMessage: function(event) {
|
|
var message = event.data;
|
|
switch (message.name) {
|
|
case "loaded":
|
|
var marketplace = window.document.getElementById("marketplace");
|
|
// Once we have it loaded, we request the installation of the FxOS
|
|
// Loop client app. We will be receiving the result of this action
|
|
// via postMessage from the child iframe.
|
|
marketplace.contentWindow.postMessage({
|
|
"name": "install-package",
|
|
"data": {
|
|
"product": {
|
|
"name": loop.config.fxosApp.name,
|
|
"manifest_url": loop.config.fxosApp.manifestUrl,
|
|
"is_packaged": true
|
|
}
|
|
}
|
|
}, "*");
|
|
break;
|
|
case "install-package":
|
|
window.removeEventListener("message", this.onMarketplaceMessage);
|
|
if (message.error) {
|
|
console.error(message.error.error);
|
|
return;
|
|
}
|
|
// We installed the FxOS app, so we can continue with the call
|
|
// process.
|
|
this._setupOutgoingRoom(false);
|
|
break;
|
|
}
|
|
}
|
|
});
|
|
|
|
return FxOSActiveRoomStore;
|
|
})();
|