blob: 11f05637cca7e4e601d98cd1d2212a3e92b34db9 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
cr.define('extensions', function() {
'use strict';
/**
* The ExtensionOptionsOverlay will show an extension's options page using
* an <extensionoptions> element.
* @constructor
*/
function ExtensionOptionsOverlay() {}
cr.addSingletonGetter(ExtensionOptionsOverlay);
ExtensionOptionsOverlay.prototype = {
/**
* The function that shows the given element in the overlay.
* @type {?function(HTMLDivElement)} Function that receives the element to
* show in the overlay.
* @private
*/
showOverlay_: null,
/**
* Initialize the page.
* @param {function(HTMLDivElement)} showOverlay The function to show or
* hide the ExtensionOptionsOverlay; this should take a single parameter
* which is either the overlay Div if the overlay should be displayed,
* or null if the overlay should be hidden.
*/
initializePage: function(showOverlay) {
var overlay = $('overlay');
cr.ui.overlay.setupOverlay(overlay);
cr.ui.overlay.globalInitialization();
overlay.addEventListener('cancelOverlay', this.handleDismiss_.bind(this));
this.showOverlay_ = showOverlay;
},
/**
* Handles a click on the close button.
* @param {Event} event The click event.
* @private
*/
handleDismiss_: function(event) {
this.setVisible_(false);
var extensionoptions =
$('extension-options-overlay-guest')
.querySelector('extensionoptions');
if (extensionoptions)
$('extension-options-overlay-guest').removeChild(extensionoptions);
$('extension-options-overlay-icon').removeAttribute('src');
// Remove the options query string.
uber.replaceState({}, '');
},
/**
* Associate an extension with the overlay and display it.
* @param {string} extensionId The id of the extension whose options page
* should be displayed in the overlay.
* @param {string} extensionName The name of the extension, which is used
* as the header of the overlay.
* @param {string} extensionIcon The URL of the extension's icon.
* @suppress {checkTypes}
* TODO(vitalyp): remove the suppression after adding
* chrome/renderer/resources/extensions/extension_options.js
* to dependencies.
*/
setExtensionAndShowOverlay: function(extensionId,
extensionName,
extensionIcon) {
$('extension-options-overlay-title').textContent = extensionName;
$('extension-options-overlay-icon').src = extensionIcon;
this.setVisible_(true);
var extensionoptions = new window.ExtensionOptions();
extensionoptions.extension = extensionId;
extensionoptions.autosize = 'on';
// The <extensionoptions> content's size needs to be restricted to the
// bounds of the overlay window. The overlay gives a min width and
// max height, but the maxheight does not include our header height
// (title and close button), so we need to subtract that to get the
// max height for the extension options.
var headerHeight = $('extension-options-overlay-header').offsetHeight;
var overlayMaxHeight =
parseInt($('extension-options-overlay').style.maxHeight, 10);
extensionoptions.maxheight = overlayMaxHeight - headerHeight;
extensionoptions.minwidth =
parseInt(window.getComputedStyle($('extension-options-overlay'))
.minWidth, 10);
extensionoptions.setDeferAutoSize(true);
extensionoptions.onclose = function() {
cr.dispatchSimpleEvent($('overlay'), 'cancelOverlay');
}.bind(this);
/**
* Resize the overlay if the <extensionoptions> changes size.
* @param {{newHeight: number,
* newWidth: number,
* oldHeight: number,
* oldWidth: number}} evt
*/
extensionoptions.onsizechanged = function(evt) {
var overlayStyle =
window.getComputedStyle($('extension-options-overlay'));
var oldWidth = parseInt(overlayStyle.width, 10);
var oldHeight = parseInt(overlayStyle.height, 10);
// animationTime is the amount of time in ms that will be used to resize
// the overlay. It is calculated by multiplying the pythagorean distance
// between old and the new size (in px) with a constant speed of
// 0.25 ms/px.
var animationTime = 0.25 * Math.sqrt(
Math.pow(evt.newWidth - oldWidth, 2) +
Math.pow(evt.newHeight - oldHeight, 2));
var player = $('extension-options-overlay').animate([
{width: oldWidth + 'px', height: oldHeight + 'px'},
{width: evt.newWidth + 'px', height: evt.newHeight + 'px'}
], {
duration: animationTime,
delay: 0
});
player.onfinish = function(e) {
// Allow the <extensionoptions> to autosize now that the overlay
// has resized, and move it back on-screen.
extensionoptions.resumeDeferredAutoSize();
$('extension-options-overlay-guest').style.position = 'static';
$('extension-options-overlay-guest').style.left = 'auto';
};
}.bind(this);
// Don't allow the <extensionoptions> to autosize until the overlay
// animation is complete.
extensionoptions.setDeferAutoSize(true);
// Move the <extensionoptions> off screen until the overlay is ready
$('extension-options-overlay-guest').style.position = 'fixed';
$('extension-options-overlay-guest').style.left =
window.outerWidth + 'px';
$('extension-options-overlay-guest').appendChild(extensionoptions);
},
/**
* Toggles the visibility of the ExtensionOptionsOverlay.
* @param {boolean} isVisible Whether the overlay should be visible.
* @private
*/
setVisible_: function(isVisible) {
this.showOverlay_(isVisible ?
/** @type {HTMLDivElement} */($('extension-options-overlay')) :
null);
}
};
// Export
return {
ExtensionOptionsOverlay: ExtensionOptionsOverlay
};
});