Index: chrome/browser/resources/login/bubble.js |
diff --git a/chrome/browser/resources/login/bubble.js b/chrome/browser/resources/login/bubble.js |
deleted file mode 100644 |
index 92bf987d51df2430851db0e739994ac8614cacf5..0000000000000000000000000000000000000000 |
--- a/chrome/browser/resources/login/bubble.js |
+++ /dev/null |
@@ -1,359 +0,0 @@ |
-// 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. |
- |
-/** |
- * @fileoverview Bubble implementation. |
- */ |
- |
-// TODO(xiyuan): Move this into shared. |
-cr.define('cr.ui', function() { |
- /** |
- * Creates a bubble div. |
- * @constructor |
- * @extends {HTMLDivElement} |
- */ |
- var Bubble = cr.ui.define('div'); |
- |
- /** |
- * Bubble key codes. |
- * @enum {number} |
- */ |
- var KeyCodes = { |
- TAB: 9, |
- ENTER: 13, |
- ESC: 27, |
- SPACE: 32 |
- }; |
- |
- /** |
- * Bubble attachment side. |
- * @enum {string} |
- */ |
- Bubble.Attachment = { |
- RIGHT: 'bubble-right', |
- LEFT: 'bubble-left', |
- TOP: 'bubble-top', |
- BOTTOM: 'bubble-bottom' |
- }; |
- |
- Bubble.prototype = { |
- __proto__: HTMLDivElement.prototype, |
- |
- // Anchor element for this bubble. |
- anchor_: undefined, |
- |
- // If defined, sets focus to this element once bubble is closed. Focus is |
- // set to this element only if there's no any other focused element. |
- elementToFocusOnHide_: undefined, |
- |
- // With help of these elements we create closed artificial tab-cycle through |
- // bubble elements. |
- firstBubbleElement_: undefined, |
- lastBubbleElement_: undefined, |
- |
- // Whether to hide bubble when key is pressed. |
- hideOnKeyPress_: true, |
- |
- /** @override */ |
- decorate: function() { |
- this.docKeyDownHandler_ = this.handleDocKeyDown_.bind(this); |
- this.selfClickHandler_ = this.handleSelfClick_.bind(this); |
- this.ownerDocument.addEventListener('click', |
- this.handleDocClick_.bind(this)); |
- this.ownerDocument.addEventListener('keydown', |
- this.docKeyDownHandler_); |
- window.addEventListener('blur', this.handleWindowBlur_.bind(this)); |
- this.addEventListener('webkitTransitionEnd', |
- this.handleTransitionEnd_.bind(this)); |
- // Guard timer for 200ms + epsilon. |
- ensureTransitionEndEvent(this, 250); |
- }, |
- |
- /** |
- * Element that should be focused on hide. |
- * @type {HTMLElement} |
- */ |
- set elementToFocusOnHide(value) { |
- this.elementToFocusOnHide_ = value; |
- }, |
- |
- /** |
- * Element that should be focused on shift-tab of first bubble element |
- * to create artificial closed tab-cycle through bubble. |
- * Usually close-button. |
- * @type {HTMLElement} |
- */ |
- set lastBubbleElement(value) { |
- this.lastBubbleElement_ = value; |
- }, |
- |
- /** |
- * Element that should be focused on tab of last bubble element |
- * to create artificial closed tab-cycle through bubble. |
- * Same element as first focused on bubble opening. |
- * @type {HTMLElement} |
- */ |
- set firstBubbleElement(value) { |
- this.firstBubbleElement_ = value; |
- }, |
- |
- /** |
- * Whether to hide bubble when key is pressed. |
- * @type {boolean} |
- */ |
- set hideOnKeyPress(value) { |
- this.hideOnKeyPress_ = value; |
- }, |
- |
- /** |
- * Whether to hide bubble when clicked inside bubble element. |
- * Default is true. |
- * @type {boolean} |
- */ |
- set hideOnSelfClick(value) { |
- if (value) |
- this.removeEventListener('click', this.selfClickHandler_); |
- else |
- this.addEventListener('click', this.selfClickHandler_); |
- }, |
- |
- /** |
- * Handler for click event which prevents bubble auto hide. |
- * @private |
- */ |
- handleSelfClick_: function(e) { |
- // Allow clicking on [x] button. |
- if (e.target && e.target.classList.contains('close-button')) |
- return; |
- e.stopPropagation(); |
- }, |
- |
- /** |
- * Sets the attachment of the bubble. |
- * @param {!Attachment} attachment Bubble attachment. |
- */ |
- setAttachment_: function(attachment) { |
- for (var k in Bubble.Attachment) { |
- var v = Bubble.Attachment[k]; |
- this.classList.toggle(v, v == attachment); |
- } |
- }, |
- |
- /** |
- * Shows the bubble for given anchor element. |
- * @param {!Object} pos Bubble position (left, top, right, bottom in px). |
- * @param {!Attachment} attachment Bubble attachment (on which side of the |
- * specified position it should be displayed). |
- * @param {HTMLElement} opt_content Content to show in bubble. |
- * If not specified, bubble element content is shown. |
- * @private |
- */ |
- showContentAt_: function(pos, attachment, opt_content) { |
- this.style.top = this.style.left = this.style.right = this.style.bottom = |
- 'auto'; |
- for (var k in pos) { |
- if (typeof pos[k] == 'number') |
- this.style[k] = pos[k] + 'px'; |
- } |
- if (opt_content !== undefined) { |
- this.innerHTML = ''; |
- this.appendChild(opt_content); |
- } |
- this.setAttachment_(attachment); |
- this.hidden = false; |
- this.classList.remove('faded'); |
- }, |
- |
- /** |
- * Shows the bubble for given anchor element. Bubble content is not cleared. |
- * @param {!HTMLElement} el Anchor element of the bubble. |
- * @param {!Attachment} attachment Bubble attachment (on which side of the |
- * element it should be displayed). |
- * @param {number=} opt_offset Offset of the bubble. |
- * @param {number=} opt_padding Optional padding of the bubble. |
- */ |
- showForElement: function(el, attachment, opt_offset, opt_padding) { |
- this.showContentForElement( |
- el, attachment, undefined, opt_offset, opt_padding); |
- }, |
- |
- /** |
- * Shows the bubble for given anchor element. |
- * @param {!HTMLElement} el Anchor element of the bubble. |
- * @param {!Attachment} attachment Bubble attachment (on which side of the |
- * element it should be displayed). |
- * @param {HTMLElement} opt_content Content to show in bubble. |
- * If not specified, bubble element content is shown. |
- * @param {number=} opt_offset Offset of the bubble attachment point from |
- * left (for vertical attachment) or top (for horizontal attachment) |
- * side of the element. If not specified, the bubble is positioned to |
- * be aligned with the left/top side of the element but not farther than |
- * half of its width/height. |
- * @param {number=} opt_padding Optional padding of the bubble. |
- */ |
- showContentForElement: function(el, attachment, opt_content, |
- opt_offset, opt_padding) { |
- /** @const */ var ARROW_OFFSET = 25; |
- /** @const */ var DEFAULT_PADDING = 18; |
- |
- if (opt_padding == undefined) |
- opt_padding = DEFAULT_PADDING; |
- |
- var origin = cr.ui.login.DisplayManager.getPosition(el); |
- var offset = opt_offset == undefined ? |
- [Math.min(ARROW_OFFSET, el.offsetWidth / 2), |
- Math.min(ARROW_OFFSET, el.offsetHeight / 2)] : |
- [opt_offset, opt_offset]; |
- |
- var pos = {}; |
- if (isRTL()) { |
- switch (attachment) { |
- case Bubble.Attachment.TOP: |
- pos.right = origin.right + offset[0] - ARROW_OFFSET; |
- pos.bottom = origin.bottom + el.offsetHeight + opt_padding; |
- break; |
- case Bubble.Attachment.RIGHT: |
- pos.top = origin.top + offset[1] - ARROW_OFFSET; |
- pos.right = origin.right + el.offsetWidth + opt_padding; |
- break; |
- case Bubble.Attachment.BOTTOM: |
- pos.right = origin.right + offset[0] - ARROW_OFFSET; |
- pos.top = origin.top + el.offsetHeight + opt_padding; |
- break; |
- case Bubble.Attachment.LEFT: |
- pos.top = origin.top + offset[1] - ARROW_OFFSET; |
- pos.left = origin.left + el.offsetWidth + opt_padding; |
- break; |
- } |
- } else { |
- switch (attachment) { |
- case Bubble.Attachment.TOP: |
- pos.left = origin.left + offset[0] - ARROW_OFFSET; |
- pos.bottom = origin.bottom + el.offsetHeight + opt_padding; |
- break; |
- case Bubble.Attachment.RIGHT: |
- pos.top = origin.top + offset[1] - ARROW_OFFSET; |
- pos.left = origin.left + el.offsetWidth + opt_padding; |
- break; |
- case Bubble.Attachment.BOTTOM: |
- pos.left = origin.left + offset[0] - ARROW_OFFSET; |
- pos.top = origin.top + el.offsetHeight + opt_padding; |
- break; |
- case Bubble.Attachment.LEFT: |
- pos.top = origin.top + offset[1] - ARROW_OFFSET; |
- pos.right = origin.right + el.offsetWidth + opt_padding; |
- break; |
- } |
- } |
- |
- this.anchor_ = el; |
- this.showContentAt_(pos, attachment, opt_content); |
- }, |
- |
- /** |
- * Shows the bubble for given anchor element. |
- * @param {!HTMLElement} el Anchor element of the bubble. |
- * @param {string} text Text content to show in bubble. |
- * @param {!Attachment} attachment Bubble attachment (on which side of the |
- * element it should be displayed). |
- * @param {number=} opt_offset Offset of the bubble attachment point from |
- * left (for vertical attachment) or top (for horizontal attachment) |
- * side of the element. If not specified, the bubble is positioned to |
- * be aligned with the left/top side of the element but not farther than |
- * half of its weight/height. |
- * @param {number=} opt_padding Optional padding of the bubble. |
- */ |
- showTextForElement: function(el, text, attachment, |
- opt_offset, opt_padding) { |
- var span = this.ownerDocument.createElement('span'); |
- span.textContent = text; |
- this.showContentForElement(el, attachment, span, opt_offset, opt_padding); |
- }, |
- |
- /** |
- * Hides the bubble. |
- */ |
- hide: function() { |
- if (!this.classList.contains('faded')) |
- this.classList.add('faded'); |
- }, |
- |
- /** |
- * Hides the bubble anchored to the given element (if any). |
- * @param {!Object} el Anchor element. |
- */ |
- hideForElement: function(el) { |
- if (!this.hidden && this.anchor_ == el) |
- this.hide(); |
- }, |
- |
- /** |
- * Handler for faded transition end. |
- * @private |
- */ |
- handleTransitionEnd_: function(e) { |
- if (this.classList.contains('faded')) { |
- this.hidden = true; |
- if (this.elementToFocusOnHide_) |
- this.elementToFocusOnHide_.focus(); |
- } |
- }, |
- |
- /** |
- * Handler of document click event. |
- * @private |
- */ |
- handleDocClick_: function(e) { |
- // Ignore clicks on anchor element. |
- if (e.target == this.anchor_) |
- return; |
- |
- if (!this.hidden) |
- this.hide(); |
- }, |
- |
- /** |
- * Handle of document keydown event. |
- * @private |
- */ |
- handleDocKeyDown_: function(e) { |
- if (this.hidden) |
- return; |
- |
- if (this.hideOnKeyPress_) { |
- this.hide(); |
- return; |
- } |
- // Artificial tab-cycle. |
- if (e.keyCode == KeyCodes.TAB && e.shiftKey == true && |
- e.target == this.firstBubbleElement_) { |
- this.lastBubbleElement_.focus(); |
- e.preventDefault(); |
- } |
- if (e.keyCode == KeyCodes.TAB && e.shiftKey == false && |
- e.target == this.lastBubbleElement_) { |
- this.firstBubbleElement_.focus(); |
- e.preventDefault(); |
- } |
- // Close bubble on ESC or on hitting spacebar or Enter at close-button. |
- if (e.keyCode == KeyCodes.ESC || |
- ((e.keyCode == KeyCodes.ENTER || e.keyCode == KeyCodes.SPACE) && |
- e.target && e.target.classList.contains('close-button'))) |
- this.hide(); |
- }, |
- |
- /** |
- * Handler of window blur event. |
- * @private |
- */ |
- handleWindowBlur_: function(e) { |
- if (!this.hidden) |
- this.hide(); |
- } |
- }; |
- |
- return { |
- Bubble: Bubble |
- }; |
-}); |