| Index: chrome/browser/resources/shared/js/cr/ui/position_util.js
|
| ===================================================================
|
| --- chrome/browser/resources/shared/js/cr/ui/position_util.js (revision 177292)
|
| +++ chrome/browser/resources/shared/js/cr/ui/position_util.js (working copy)
|
| @@ -1,243 +0,0 @@
|
| -// Copyright (c) 2012 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 This file provides utility functions for position popups.
|
| - */
|
| -
|
| -cr.define('cr.ui', function() {
|
| -
|
| - /**
|
| - * Type def for rects as returned by getBoundingClientRect.
|
| - * @typedef { {left: number, top: number, width: number, height: number,
|
| - * right: number, bottom: number}}
|
| - */
|
| - var Rect;
|
| -
|
| - /**
|
| - * Enum for defining how to anchor a popup to an anchor element.
|
| - * @enum {number}
|
| - */
|
| - var AnchorType = {
|
| - /**
|
| - * The popup's right edge is aligned with the left edge of the anchor.
|
| - * The popup's top edge is aligned with the top edge of the anchor.
|
| - */
|
| - BEFORE: 1, // p: right, a: left, p: top, a: top
|
| -
|
| - /**
|
| - * The popop's left edge is aligned with the right edge of the anchor.
|
| - * The popup's top edge is aligned with the top edge of the anchor.
|
| - */
|
| - AFTER: 2, // p: left a: right, p: top, a: top
|
| -
|
| - /**
|
| - * The popop's bottom edge is aligned with the top edge of the anchor.
|
| - * The popup's left edge is aligned with the left edge of the anchor.
|
| - */
|
| - ABOVE: 3, // p: bottom, a: top, p: left, a: left
|
| -
|
| - /**
|
| - * The popop's top edge is aligned with the bottom edge of the anchor.
|
| - * The popup's left edge is aligned with the left edge of the anchor.
|
| - */
|
| - BELOW: 4 // p: top, a: bottom, p: left, a: left
|
| - };
|
| -
|
| - /**
|
| - * Helper function for positionPopupAroundElement and positionPopupAroundRect.
|
| - * @param {!Rect} anchorRect The rect for the anchor.
|
| - * @param {!HTMLElement} popupElement The element used for the popup.
|
| - * @param {AnchorType} type The type of anchoring to do.
|
| - * @param {boolean} invertLeftRight Whether to invert the right/left
|
| - * alignment.
|
| - */
|
| - function positionPopupAroundRect(anchorRect, popupElement, type,
|
| - invertLeftRight) {
|
| - var popupRect = popupElement.getBoundingClientRect();
|
| - var availRect;
|
| - var ownerDoc = popupElement.ownerDocument;
|
| - var cs = ownerDoc.defaultView.getComputedStyle(popupElement);
|
| - var docElement = ownerDoc.documentElement;
|
| -
|
| - if (cs.position == 'fixed') {
|
| - // For 'fixed' positioned popups, the available rectangle should be based
|
| - // on the viewport rather than the document.
|
| - availRect = {
|
| - height: docElement.clientHeight,
|
| - width: docElement.clientWidth,
|
| - top: 0,
|
| - bottom: docElement.clientHeight,
|
| - left: 0,
|
| - right: docElement.clientWidth
|
| - };
|
| - } else {
|
| - availRect = popupElement.offsetParent.getBoundingClientRect();
|
| - }
|
| -
|
| - if (cs.direction == 'rtl')
|
| - invertLeftRight = !invertLeftRight;
|
| -
|
| - // Flip BEFORE, AFTER based on alignment.
|
| - if (invertLeftRight) {
|
| - if (type == AnchorType.BEFORE)
|
| - type = AnchorType.AFTER;
|
| - else if (type == AnchorType.AFTER)
|
| - type = AnchorType.BEFORE;
|
| - }
|
| -
|
| - // Flip type based on available size
|
| - switch (type) {
|
| - case AnchorType.BELOW:
|
| - if (anchorRect.bottom + popupRect.height > availRect.height &&
|
| - popupRect.height <= anchorRect.top) {
|
| - type = AnchorType.ABOVE;
|
| - }
|
| - break;
|
| - case AnchorType.ABOVE:
|
| - if (popupRect.height > anchorRect.top &&
|
| - anchorRect.bottom + popupRect.height <= availRect.height) {
|
| - type = AnchorType.BELOW;
|
| - }
|
| - break;
|
| - case AnchorType.AFTER:
|
| - if (anchorRect.right + popupRect.width > availRect.width &&
|
| - popupRect.width <= anchorRect.left) {
|
| - type = AnchorType.BEFORE;
|
| - }
|
| - break;
|
| - case AnchorType.BEFORE:
|
| - if (popupRect.width > anchorRect.left &&
|
| - anchorRect.right + popupRect.width <= availRect.width) {
|
| - type = AnchorType.AFTER;
|
| - }
|
| - break;
|
| - }
|
| - // flipping done
|
| -
|
| - var style = popupElement.style;
|
| - // Reset all directions.
|
| - style.left = style.right = style.top = style.bottom = 'auto';
|
| -
|
| - // Primary direction
|
| - switch (type) {
|
| - case AnchorType.BELOW:
|
| - if (anchorRect.bottom + popupRect.height <= availRect.height)
|
| - style.top = anchorRect.bottom + 'px';
|
| - else
|
| - style.bottom = '0';
|
| - break;
|
| - case AnchorType.ABOVE:
|
| - if (availRect.height - anchorRect.top >= 0)
|
| - style.bottom = availRect.height - anchorRect.top + 'px';
|
| - else
|
| - style.top = '0';
|
| - break;
|
| - case AnchorType.AFTER:
|
| - if (anchorRect.right + popupRect.width <= availRect.width)
|
| - style.left = anchorRect.right + 'px';
|
| - else
|
| - style.right = '0';
|
| - break;
|
| - case AnchorType.BEFORE:
|
| - if (availRect.width - anchorRect.left >= 0)
|
| - style.right = availRect.width - anchorRect.left + 'px';
|
| - else
|
| - style.left = '0';
|
| - break;
|
| - }
|
| -
|
| - // Secondary direction
|
| - switch (type) {
|
| - case AnchorType.BELOW:
|
| - case AnchorType.ABOVE:
|
| - if (invertLeftRight) {
|
| - // align right edges
|
| - if (anchorRect.right - popupRect.width >= 0) {
|
| - style.right = availRect.width - anchorRect.right + 'px';
|
| -
|
| - // align left edges
|
| - } else if (anchorRect.left + popupRect.width <= availRect.width) {
|
| - style.left = anchorRect.left + 'px';
|
| -
|
| - // not enough room on either side
|
| - } else {
|
| - style.right = '0';
|
| - }
|
| - } else {
|
| - // align left edges
|
| - if (anchorRect.left + popupRect.width <= availRect.width) {
|
| - style.left = anchorRect.left + 'px';
|
| -
|
| - // align right edges
|
| - } else if (anchorRect.right - popupRect.width >= 0) {
|
| - style.right = availRect.width - anchorRect.right + 'px';
|
| -
|
| - // not enough room on either side
|
| - } else {
|
| - style.left = '0';
|
| - }
|
| - }
|
| - break;
|
| -
|
| - case AnchorType.AFTER:
|
| - case AnchorType.BEFORE:
|
| - // align top edges
|
| - if (anchorRect.top + popupRect.height <= availRect.height) {
|
| - style.top = anchorRect.top + 'px';
|
| -
|
| - // align bottom edges
|
| - } else if (anchorRect.bottom - popupRect.height >= 0) {
|
| - style.bottom = availRect.height - anchorRect.bottom + 'px';
|
| -
|
| - // not enough room on either side
|
| - } else {
|
| - style.top = '0';
|
| - }
|
| - break;
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Positions a popup element relative to an anchor element. The popup element
|
| - * should have position set to absolute and it should be a child of the body
|
| - * element.
|
| - * @param {!HTMLElement} anchorElement The element that the popup is anchored
|
| - * to.
|
| - * @param {!HTMLElement} popupElement The popup element we are positioning.
|
| - * @param {AnchorType} type The type of anchoring we want.
|
| - * @param {boolean} invertLeftRight Whether to invert the right/left
|
| - * alignment.
|
| - */
|
| - function positionPopupAroundElement(anchorElement, popupElement, type,
|
| - invertLeftRight) {
|
| - var anchorRect = anchorElement.getBoundingClientRect();
|
| - positionPopupAroundRect(anchorRect, popupElement, type, invertLeftRight);
|
| - }
|
| -
|
| - /**
|
| - * Positions a popup around a point.
|
| - * @param {number} x The client x position.
|
| - * @param {number} y The client y position.
|
| - * @param {!HTMLElement} popupElement The popup element we are positioning.
|
| - */
|
| - function positionPopupAtPoint(x, y, popupElement) {
|
| - var rect = {
|
| - left: x,
|
| - top: y,
|
| - width: 0,
|
| - height: 0,
|
| - right: x,
|
| - bottom: y
|
| - };
|
| - positionPopupAroundRect(rect, popupElement, AnchorType.BELOW);
|
| - }
|
| -
|
| - // Export
|
| - return {
|
| - AnchorType: AnchorType,
|
| - positionPopupAroundElement: positionPopupAroundElement,
|
| - positionPopupAtPoint: positionPopupAtPoint
|
| - };
|
| -});
|
|
|