Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
140 lines
4.5 KiB
JavaScript
140 lines
4.5 KiB
JavaScript
/* global AppWindow */
|
|
|
|
'use strict';
|
|
|
|
(function(exports) {
|
|
/**
|
|
* GlobalOverlayWindow is a special type of window that is shown on top of
|
|
* *any* existing element.
|
|
*
|
|
* The owner must have the 'global-clickthrough-overlay' permission in order
|
|
* to create this kind of window.
|
|
*
|
|
* GlobalOverlayWindow instances are not handling the home button click,
|
|
* instead we present a chrome UI that allows the user to close the overlay
|
|
* window.
|
|
*
|
|
* This kind of window is rendered with transparent background and allows
|
|
* passing clicks to the overlayed content.
|
|
*
|
|
* @example
|
|
* var overlay = new GlobalOverlayWindow({
|
|
* url: 'app://clock.gaiamobile.org:8080/alarm.html',
|
|
* manifestURL: 'http://clock.gaiamobile.org:8080/manifest.webapp',
|
|
* iframe: iframe
|
|
* });
|
|
*
|
|
* @class GlobalOverlayWindow
|
|
* @param {Object} config Object holding the overlay configuration options.
|
|
* @extends AppWindow
|
|
*/
|
|
|
|
var GlobalOverlayWindow = function GlobalOverlayWindow(config) {
|
|
this.reConfig(config);
|
|
this.render();
|
|
if (this._DEBUG) {
|
|
GlobalOverlayWindow[this.instanceID] = this;
|
|
}
|
|
this.publish('created');
|
|
};
|
|
|
|
GlobalOverlayWindow.prototype = Object.create(AppWindow.prototype);
|
|
|
|
GlobalOverlayWindow.prototype.constructor = GlobalOverlayWindow;
|
|
|
|
GlobalOverlayWindow.prototype.eventPrefix = 'globaloverlay';
|
|
|
|
GlobalOverlayWindow.prototype.CLASS_NAME = 'GlobalOverlayWindow';
|
|
|
|
GlobalOverlayWindow.prototype.CLASS_LIST = 'appWindow globalOverlayWindow';
|
|
|
|
GlobalOverlayWindow.prototype.HIERARCHY_MANAGER =
|
|
'GlobalOverlayWindowManager';
|
|
|
|
/**
|
|
* Turn on this flag to dump debugging messages for all global overlay
|
|
* windows.
|
|
* @type {Boolean}
|
|
*/
|
|
GlobalOverlayWindow.prototype._DEBUG = false;
|
|
|
|
GlobalOverlayWindow.prototype.openAnimation = 'immediate';
|
|
GlobalOverlayWindow.prototype.closeAnimation = 'immediate';
|
|
|
|
GlobalOverlayWindow.prototype.view = function ow_view() {
|
|
this.debug('intance id: ' + this.instanceID);
|
|
return '<div class="' + this.CLASS_LIST +
|
|
'" id="' + this.instanceID + '">' +
|
|
'<button id="' + this.instanceID + '-close" ' +
|
|
'class="close-global-overlay">Close</button>' +
|
|
'<div class="browser-container"></div>' +
|
|
'</div>';
|
|
};
|
|
|
|
GlobalOverlayWindow.SUB_COMPONENTS = {
|
|
'transitionController': 'AppTransitionController',
|
|
'modalDialog': 'AppModalDialog'
|
|
};
|
|
|
|
GlobalOverlayWindow.REGISTERED_EVENTS =
|
|
['mozbrowserclose', 'mozbrowsererror', 'mozbrowservisibilitychange',
|
|
'mozbrowserloadend', 'mozbrowserloadstart',
|
|
'_localized', '_willdestroy'];
|
|
|
|
GlobalOverlayWindow.prototype.render = function ow_render() {
|
|
this.publish('willrender');
|
|
this.containerElement.insertAdjacentHTML('beforeend', this.view());
|
|
this.browser = {
|
|
element: this.config.iframe
|
|
};
|
|
this.element = document.getElementById(this.instanceID);
|
|
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');
|
|
};
|
|
|
|
GlobalOverlayWindow.prototype.registerEvents = function ow_registerEvents() {
|
|
var self = this;
|
|
document.getElementById(this.instanceID + '-close')
|
|
.addEventListener('click', function() {
|
|
self.kill();
|
|
});
|
|
GlobalOverlayWindow.prototype._registerEvents.apply(this);
|
|
};
|
|
|
|
GlobalOverlayWindow.prototype.ready = function ow_ready(callback) {
|
|
if (!this.element) {
|
|
return;
|
|
}
|
|
|
|
var self = this;
|
|
if (!this.loaded) {
|
|
this.element.addEventListener('_loaded', function onLoaded() {
|
|
self.element.removeEventListener('_loaded', onLoaded);
|
|
// We allow passing the mouse clicks done in the overlay window
|
|
// to the overlayed content by setting mozpasspointerevents to true
|
|
// on the overlay window iframe. Check bug 796452 for more details.
|
|
self.browser.element.setAttribute('mozpasspointerevents' , 'true');
|
|
setTimeout(callback);
|
|
});
|
|
} else {
|
|
this.tryWaitForFullRepaint(function() {
|
|
setTimeout(callback);
|
|
});
|
|
}
|
|
};
|
|
|
|
/**
|
|
* GlobalOverlayWindow's default container is '#overlays'.
|
|
*/
|
|
GlobalOverlayWindow.prototype.containerElement =
|
|
document.getElementById('global-overlays');
|
|
|
|
exports.GlobalOverlayWindow = GlobalOverlayWindow;
|
|
|
|
})(window);
|