// Copyright (c) 2011 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. /** * @fileoverview Displays the Chrome Frame installation flow in a Closure * dialog component. */ goog.provide('google.cf.installer.DialogInteractionDelegate'); goog.require('goog.math.Size'); goog.require('goog.style'); goog.require('goog.ui.Dialog'); goog.require('goog.userAgent'); goog.require('google.cf.installer.InteractionDelegate'); /** * An implementation of google.cf.installer.InteractionDelegate that decorates * the installation flow using a goog.ui.Dialog . * @constructor * @implements {google.cf.installer.InteractionDelegate} */ google.cf.installer.DialogInteractionDelegate = function() { }; /** * Whether we have already injected the dialog styles into the page. * @type {boolean} * @private **/ google.cf.installer.DialogInteractionDelegate.injectedCss_ = false; /** * Injects the dialog styles into the page. * @private **/ google.cf.installer.DialogInteractionDelegate.injectCss_ = function() { if (google.cf.installer.DialogInteractionDelegate.injectedCss_) return; google.cf.installer.DialogInteractionDelegate.injectedCss_ = true; goog.style.installStyles( '.xdgcfinstall-dlg {' + 'background: #c1d9ff;' + 'border: 1px solid #3a5774;' + 'color: #000;' + 'padding: 4px;' + 'position: absolute;' + '}' + '.xdgcfinstall-dlg-bg {' + 'background: #666;' + 'left: 0;' + 'position: absolute;' + 'top: 0;' + '}' + '.xdgcfinstall-dlg-title {' + 'background: #e0edfe;' + 'color: #000;' + 'cursor: pointer;' + 'font-size: 120%;' + 'font-weight: bold;' + 'padding: 0px;' + 'height: 17px;' + 'position: relative;' + '_zoom: 1; /* Ensures proper width in IE6 RTL. */' + '}' + '.xdgcfinstall-dlg-title-close {' + /* Client apps may override the URL at which they serve the sprite. */ 'background: #e0edfe' + 'url(//ssl.gstatic.com/editor/editortoolbar.png)' + 'no-repeat -528px 0;' + 'cursor: default;' + 'font-size: 0%;' + 'height: 15px;' + 'position: absolute;' + 'top: 1px;' + 'right: 1px;' + 'width: 15px;' + 'padding: 0px 0px 0px 0px;' + 'align: right;' + '}' + '.xdgcfinstall-dlg-content {' + 'background-color: #fff;' + 'padding: 0px;' + '}' ); }; /** * The active dialog. * @type {goog.ui.Dialog} * @private */ google.cf.installer.DialogInteractionDelegate.prototype.dialog_ = null; /** * @inheritDoc */ google.cf.installer.DialogInteractionDelegate.prototype.getIFrameContainer = function() { google.cf.installer.DialogInteractionDelegate.injectCss_(); this.dialog_ = new goog.ui.Dialog('xdgcfinstall-dlg', true); this.dialog_.setButtonSet(null); // TODO(user): The IFrame must be 'visible' or else calculation of its // contents' dimensions is incorrect on IE, yet the following line also // disables interaction with and dims the page contents. It would be best to // only do that when show() is called. Best way is probably to push the mask // elements offscreen. this.dialog_.setVisible(true); goog.style.setPosition(this.dialog_.getDialogElement(), -5000, -5000); return /** @type {!HTMLElement} */(this.dialog_.getContentElement()); }; /** * @inheritDoc */ google.cf.installer.DialogInteractionDelegate.prototype.customizeIFrame = function(iframe) { }; /** * @inheritDoc */ google.cf.installer.DialogInteractionDelegate.prototype.show = function() { if (goog.userAgent.IE) { // By default, in IE, the dialog does not respect the width of its contents. // So we set its dimensions here. We need to specifically add some space for // the title bar. var iframeSize = goog.style.getBorderBoxSize( this.dialog_.getContentElement().getElementsByTagName('iframe')[0]); var titleSize = goog.style.getBorderBoxSize(this.dialog_.getTitleElement()); goog.style.setContentBoxSize(this.dialog_.getDialogElement(), new goog.math.Size( iframeSize.width, iframeSize.height + titleSize.height)); } // Ask the dialog to re-center itself based on the new dimensions. this.dialog_.reposition(); }; /** * @inheritDoc */ google.cf.installer.DialogInteractionDelegate.prototype.reset = function() { if (this.dialog_) { this.dialog_.setVisible(false); this.dialog_.dispose(); this.dialog_ = null; } };