Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
168 lines
4.9 KiB
JavaScript
168 lines
4.9 KiB
JavaScript
/* global AttentionWindow, Service */
|
|
'use strict';
|
|
|
|
(function(exports) {
|
|
/**
|
|
* CallscreenWindow is a special case of attention window.
|
|
* It's the call screen UI but lives in system app.
|
|
*
|
|
* @example
|
|
* var attention = new CallscreenWindow();
|
|
*
|
|
* @class CallscreenWindow
|
|
* @requires System
|
|
* @extends AttentionWindow
|
|
*/
|
|
/**
|
|
* Fired when the attention window is created.
|
|
* @event AttentionWindow#attentioncreated
|
|
*/
|
|
/**
|
|
* Fired when the attention window is removed.
|
|
* @event AttentionWindow#attentionterminated
|
|
*/
|
|
/**
|
|
* Fired when the attention window is opening.
|
|
* @event AttentionWindow#attentionopening
|
|
*/
|
|
/**
|
|
* Fired when the attention window is opened.
|
|
* @event AttentionWindow#attentionopened
|
|
*/
|
|
/**
|
|
* Fired when the attention window is cloing.
|
|
* @event AttentionWindow#attentionclosing
|
|
*/
|
|
/**
|
|
* Fired when the attention window is closed.
|
|
* @event AttentionWindow#attentionclosed
|
|
*/
|
|
/**
|
|
* Fired before the attention window is rendered.
|
|
* @event AttentionWindow#attentionwillrender
|
|
*/
|
|
/**
|
|
* Fired when the attention window is rendered to the DOM tree.
|
|
* @event AttentionWindow#attentionrendered
|
|
*/
|
|
var CSORIGIN =
|
|
window.location.origin.replace('system', 'callscreen') + '/';
|
|
var CallscreenWindow = function CallscreenWindow() {
|
|
this.config = {
|
|
manifestURL: CSORIGIN + 'manifest.webapp',
|
|
url: CSORIGIN + 'index.html',
|
|
origin: CSORIGIN
|
|
};
|
|
this.isCallscreenWindow = true;
|
|
this.reConfig(this.config);
|
|
this.render();
|
|
if (this._DEBUG) {
|
|
CallscreenWindow[this.instanceID] = this;
|
|
}
|
|
this.publish('created');
|
|
};
|
|
|
|
CallscreenWindow.prototype = Object.create(AttentionWindow.prototype);
|
|
CallscreenWindow.prototype.constructor = CallscreenWindow;
|
|
/**
|
|
* Turn on this flag to dump debugging messages for all attention windows.
|
|
* @type {Boolean}
|
|
*/
|
|
CallscreenWindow.prototype._DEBUG = false;
|
|
CallscreenWindow.prototype.CLASS_LIST =
|
|
'appWindow attentionWindow callscreenWindow';
|
|
CallscreenWindow.prototype.CLASS_NAME = 'CallscreenWindow';
|
|
|
|
CallscreenWindow.prototype.openAnimation = 'slide-from-top';
|
|
CallscreenWindow.prototype.closeAnimation = 'slide-to-top';
|
|
|
|
CallscreenWindow.SUB_COMPONENTS = {
|
|
'transitionController': 'AppTransitionController',
|
|
'attentionToaster': 'AttentionToaster'
|
|
};
|
|
|
|
CallscreenWindow.REGISTERED_EVENTS =
|
|
AttentionWindow.REGISTERED_EVENTS;
|
|
|
|
CallscreenWindow.prototype.render = function cw_render() {
|
|
this.publish('willrender');
|
|
this.containerElement.insertAdjacentHTML('beforeend', this.view());
|
|
|
|
this.element =
|
|
document.getElementById(this.instanceID);
|
|
// XXX: Use BrowserFrame
|
|
var iframe = document.createElement('iframe');
|
|
iframe.setAttribute('name', 'call_screen');
|
|
iframe.setAttribute('mozbrowser', 'true');
|
|
iframe.setAttribute('remote', 'false');
|
|
iframe.setAttribute('mozapp', this.config.manifestURL);
|
|
iframe.src = this.config.url;
|
|
this.browser = {
|
|
element: iframe
|
|
};
|
|
this.browserContainer = this.element.querySelector('.browser-container');
|
|
this.browserContainer.insertBefore(this.browser.element, null);
|
|
this.frame = this.element;
|
|
this.iframe = this.browser.element;
|
|
|
|
this._registerEvents();
|
|
this.installSubComponents();
|
|
this.publish('rendered');
|
|
};
|
|
|
|
CallscreenWindow.prototype.ensure = function() {
|
|
if (!this.browser || !this.browser.element) {
|
|
return;
|
|
}
|
|
var timestamp = new Date().getTime();
|
|
var src = this.config.url + '#' +
|
|
(Service.query('locked') ? 'locked' : '');
|
|
src = src + '×tamp=' + timestamp;
|
|
this.browser.element.src = src;
|
|
this._terminated = false;
|
|
this.show();
|
|
};
|
|
|
|
CallscreenWindow.prototype._handle_mozbrowserclose = function() {
|
|
if (this._terminated) {
|
|
return;
|
|
}
|
|
this._terminated = true;
|
|
this.publish('terminated');
|
|
if (this.isActive() || this._requestedOpen) {
|
|
var self = this;
|
|
this.element.addEventListener('_closed', function onclosed() {
|
|
// XXX: We will have trouble if the second call comes during closing.
|
|
self.element.removeEventListener('_closed', onclosed);
|
|
self.hide();
|
|
self.reloadWindow();
|
|
});
|
|
this.requestClose();
|
|
} else {
|
|
this.hide();
|
|
this.reloadWindow();
|
|
}
|
|
// XXX: We are leaving the focus in the callscreen iframe
|
|
if (document.activeElement === this.browser.element) {
|
|
document.activeElement.blur();
|
|
}
|
|
};
|
|
|
|
CallscreenWindow.prototype.reloadWindow = function() {
|
|
var src = this.browser.element.src.split('#')[0];
|
|
this.browser.element.src = ''; // cocotte
|
|
setTimeout(function nextTick() {
|
|
this.browser.element.src = src;
|
|
}.bind(this));
|
|
this.setVisible(false);
|
|
};
|
|
|
|
CallscreenWindow.prototype.free = function() {
|
|
if (this.browser.element) {
|
|
this.browser.element.src = '';
|
|
}
|
|
};
|
|
|
|
exports.CallscreenWindow = CallscreenWindow;
|
|
|
|
}(window));
|