Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
This commit is contained in:
parent
93e3a48004
commit
b38dea0597
25901 changed files with 9982925 additions and 369 deletions
181
gaia/apps/system/js/secure_window_factory.js
Executable file
181
gaia/apps/system/js/secure_window_factory.js
Executable file
|
|
@ -0,0 +1,181 @@
|
|||
/* -*- Mode: js; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- /
|
||||
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
|
||||
'use strict';
|
||||
|
||||
(function(exports) {
|
||||
|
||||
/**
|
||||
* To delegate the ownership of apps out of other components,
|
||||
* so we can keep our components clean, and only hold minimal
|
||||
* parts they should know. The user should only need to know
|
||||
* how to create a SecureWindow app via the `create` method in
|
||||
* this factory.
|
||||
*
|
||||
* @constructor SecureWindowFactory
|
||||
*/
|
||||
var SecureWindowFactory = function() {
|
||||
this.initEvents();
|
||||
};
|
||||
|
||||
SecureWindowFactory.prototype = {
|
||||
/**
|
||||
* @memberof SecureWindowFactory#
|
||||
* @prop {object} apps - would hold spawned apps and release them
|
||||
* while they got terminated.
|
||||
*/
|
||||
states: {
|
||||
apps: {}
|
||||
},
|
||||
|
||||
/**
|
||||
* @memberof SecureWindowFactory#
|
||||
*/
|
||||
configs: {
|
||||
listens: ['secure-launchapp',
|
||||
'secure-appterminated',
|
||||
'secure-modeon',
|
||||
'secure-modeoff']
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Hook listeners of events this factory interested in.
|
||||
*
|
||||
* @private
|
||||
* @this {SecureWindowFactory}
|
||||
* @memberof SecureWindowFactory
|
||||
*/
|
||||
SecureWindowFactory.prototype.initEvents =
|
||||
function swf_initEvents() {
|
||||
this.configs.listens.forEach((function _initEvent(type) {
|
||||
self.addEventListener(type, this);
|
||||
}).bind(this));
|
||||
};
|
||||
|
||||
/**
|
||||
* Remove listeners of events this factory interested in.
|
||||
*
|
||||
* @private
|
||||
* @this {SecureWindowFactory}
|
||||
* @memberof SecureWindowFactory
|
||||
*/
|
||||
SecureWindowFactory.prototype.suspendEvents =
|
||||
function swf_suspendEvents() {
|
||||
this.configs.listens.forEach((function _unbind(ename) {
|
||||
self.removeEventListener(ename, this);
|
||||
}).bind(this));
|
||||
};
|
||||
|
||||
/**
|
||||
* Remove event listeners except the resuming (`secure-modeon`)
|
||||
* event.
|
||||
*
|
||||
* @private
|
||||
* @this {SecureWindowFactory}
|
||||
* @memberof SecureWindowFactory
|
||||
*/
|
||||
SecureWindowFactory.prototype.suspend =
|
||||
function swf_suspend() {
|
||||
this.suspendEvents();
|
||||
self.addEventListener('secure-modeon', this);
|
||||
for (var origin in this.states.apps) {
|
||||
this.unregisterApp(this.states.apps[origin]);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Hook event listeners back and don't care the resuming
|
||||
* (`secure-modeon`) event anymore.
|
||||
*
|
||||
* @private
|
||||
* @this {SecureWindowFactory}
|
||||
* @memberof SecureWindowFactory
|
||||
*/
|
||||
SecureWindowFactory.prototype.resume =
|
||||
function swf_resume() {
|
||||
this.initEvents();
|
||||
|
||||
// To prevent duplicated init.
|
||||
self.removeEventListener('secure-modeon', this);
|
||||
};
|
||||
|
||||
/**
|
||||
* @listens secure-launchapp - launch app by URL and manifest URL.
|
||||
* @listens secure-modeon - the system would be in the secure mode by locking
|
||||
* or other reasons.
|
||||
* @listens secure-modeoff - the system now is not in the secure mode anymore.
|
||||
* @listens secure-appterminated - when a secure app got really closed, it
|
||||
* would fire this event.
|
||||
* @memberof SecureWindowFactory
|
||||
*/
|
||||
SecureWindowFactory.prototype.handleEvent =
|
||||
function(evt) {
|
||||
switch (evt.type)
|
||||
{
|
||||
case 'secure-launchapp':
|
||||
var {appURL, appManifestURL} = evt.detail;
|
||||
this.create(appURL, appManifestURL);
|
||||
break;
|
||||
case 'secure-appterminated':
|
||||
var app = evt.detail;
|
||||
this.unregisterApp(app);
|
||||
break;
|
||||
case 'secure-modeoff':
|
||||
this.suspend();
|
||||
break;
|
||||
case 'secure-modeon':
|
||||
this.resume();
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Create a SecureWindow app.
|
||||
*
|
||||
* @param {URL} url - the app's URL
|
||||
* @param {URL} manifestURL - the URL of the app's manifest
|
||||
* @this {SecureWindowFactory}
|
||||
* @memberof SecureWindowFactory
|
||||
*/
|
||||
SecureWindowFactory.prototype.create =
|
||||
function(url, manifestURL) {
|
||||
var config = new self.BrowserConfigHelper({
|
||||
url: url,
|
||||
manifestURL: manifestURL
|
||||
});
|
||||
for (var instanceID in this.states.apps) {
|
||||
var secureWindow = this.states.apps[instanceID];
|
||||
if (config.manifestURL === secureWindow.manifestURL) {
|
||||
secureWindow.cancelSoftKill();
|
||||
secureWindow.open();
|
||||
return; // Already created.
|
||||
}
|
||||
}
|
||||
var app = new self.SecureWindow(config);
|
||||
app.open();
|
||||
this.registerApp(app);
|
||||
};
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @this {SecureWindowFactory}
|
||||
* @memberof SecureWindowFactory
|
||||
*/
|
||||
SecureWindowFactory.prototype.registerApp =
|
||||
function(app) {
|
||||
this.states.apps[app.instanceID] = app;
|
||||
};
|
||||
|
||||
/**
|
||||
* @private
|
||||
* @this {SecureWindowFactory}
|
||||
* @memberof SecureWindowFactory
|
||||
*/
|
||||
SecureWindowFactory.prototype.unregisterApp =
|
||||
function(app) {
|
||||
delete this.states.apps[app.instanceID];
|
||||
};
|
||||
|
||||
/** @exports SecureWindowFactory */
|
||||
exports.SecureWindowFactory = SecureWindowFactory;
|
||||
})(self);
|
||||
Loading…
Reference in a new issue