/* 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 '
' + '' + '
' + '
'; }; 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);