summaryrefslogtreecommitdiffstats
path: root/WebCore/inspector/front-end/Popover.js
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/inspector/front-end/Popover.js')
-rw-r--r--WebCore/inspector/front-end/Popover.js251
1 files changed, 0 insertions, 251 deletions
diff --git a/WebCore/inspector/front-end/Popover.js b/WebCore/inspector/front-end/Popover.js
deleted file mode 100644
index 32535e9..0000000
--- a/WebCore/inspector/front-end/Popover.js
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-WebInspector.Popover = function(contentElement)
-{
- this.element = document.createElement("div");
- this.element.className = "popover";
-
- this._popupArrowElement = document.createElement("div");
- this._popupArrowElement.className = "arrow";
- this.element.appendChild(this._popupArrowElement);
-
- this.contentElement = contentElement;
- this._contentDiv = document.createElement("div");
- this._contentDiv.className = "content";
-}
-
-WebInspector.Popover.prototype = {
- show: function(anchor, preferredWidth, preferredHeight)
- {
- // This should not happen, but we hide previous popup to be on the safe side.
- if (WebInspector.Popover._popoverElement)
- document.body.removeChild(WebInspector.Popover._popoverElement);
- WebInspector.Popover._popoverElement = this.element;
-
- // Temporarily attach in order to measure preferred dimensions.
- this.contentElement.positionAt(0, 0);
- document.body.appendChild(this.contentElement);
- var preferredWidth = preferredWidth || this.contentElement.offsetWidth;
- var preferredHeight = preferredHeight || this.contentElement.offsetHeight;
-
- this._contentDiv.appendChild(this.contentElement);
- this.element.appendChild(this._contentDiv);
- document.body.appendChild(this.element);
- this._positionElement(anchor, preferredWidth, preferredHeight);
- },
-
- hide: function()
- {
- if (WebInspector.Popover._popoverElement) {
- delete WebInspector.Popover._popoverElement;
- document.body.removeChild(this.element);
- }
- },
-
- _positionElement: function(anchorElement, preferredWidth, preferredHeight)
- {
- const borderWidth = 25;
- const scrollerWidth = 11;
- const arrowHeight = 15;
- const arrowOffset = 10;
- const borderRadius = 10;
-
- // Skinny tooltips are not pretty, their arrow location is not nice.
- preferredWidth = Math.max(preferredWidth, 50);
- const totalWidth = window.innerWidth;
- const totalHeight = window.innerHeight;
-
- var anchorBox = {x: anchorElement.totalOffsetLeft, y: anchorElement.totalOffsetTop, width: anchorElement.offsetWidth, height: anchorElement.offsetHeight};
- while (anchorElement !== document.body) {
- if (anchorElement.scrollLeft)
- anchorBox.x -= anchorElement.scrollLeft;
- if (anchorElement.scrollTop)
- anchorBox.y -= anchorElement.scrollTop;
- anchorElement = anchorElement.parentElement;
- }
-
- var newElementPosition = { x: 0, y: 0, width: preferredWidth + scrollerWidth, height: preferredHeight };
-
- var verticalAlignment;
- var roomAbove = anchorBox.y;
- var roomBelow = totalHeight - anchorBox.y - anchorBox.height;
-
- if (roomAbove > roomBelow) {
- // Positioning above the anchor.
- if (anchorBox.y > newElementPosition.height + arrowHeight + borderRadius)
- newElementPosition.y = anchorBox.y - newElementPosition.height - arrowHeight;
- else {
- newElementPosition.y = borderRadius * 2;
- newElementPosition.height = anchorBox.y - borderRadius * 2 - arrowHeight;
- }
- verticalAlignment = "bottom";
- } else {
- // Positioning below the anchor.
- newElementPosition.y = anchorBox.y + anchorBox.height + arrowHeight;
- if (newElementPosition.y + newElementPosition.height + arrowHeight - borderWidth >= totalHeight)
- newElementPosition.height = totalHeight - anchorBox.y - anchorBox.height - borderRadius * 2 - arrowHeight;
- // Align arrow.
- verticalAlignment = "top";
- }
-
- var horizontalAlignment;
- if (anchorBox.x + newElementPosition.width < totalWidth) {
- newElementPosition.x = Math.max(borderRadius, anchorBox.x - borderRadius - arrowOffset);
- horizontalAlignment = "left";
- } else if (newElementPosition.width + borderRadius * 2 < totalWidth) {
- newElementPosition.x = totalWidth - newElementPosition.width - borderRadius;
- horizontalAlignment = "right";
- // Position arrow accurately.
- var arrowRightPosition = Math.max(0, totalWidth - anchorBox.x - anchorBox.width - borderRadius - arrowOffset);
- arrowRightPosition += anchorBox.width / 2;
- this._popupArrowElement.style.right = arrowRightPosition + "px";
- } else {
- newElementPosition.x = borderRadius;
- newElementPosition.width = totalWidth - borderRadius * 2;
- newElementPosition.height += scrollerWidth;
- horizontalAlignment = "left";
- if (verticalAlignment === "bottom")
- newElementPosition.y -= scrollerWidth;
- // Position arrow accurately.
- this._popupArrowElement.style.left = Math.max(0, anchorBox.x - borderRadius * 2 - arrowOffset) + "px";
- this._popupArrowElement.style.left += anchorBox.width / 2;
- }
-
- this.element.className = "popover " + verticalAlignment + "-" + horizontalAlignment + "-arrow";
- this.element.positionAt(newElementPosition.x - borderWidth, newElementPosition.y - borderWidth);
- this.element.style.width = newElementPosition.width + borderWidth * 2 + "px";
- this.element.style.height = newElementPosition.height + borderWidth * 2 + "px";
- }
-}
-
-WebInspector.PopoverHelper = function(panelElement, getAnchor, showPopup, showOnClick, onHide)
-{
- this._panelElement = panelElement;
- this._getAnchor = getAnchor;
- this._showPopup = showPopup;
- this._showOnClick = showOnClick;
- this._onHide = onHide;
- panelElement.addEventListener("mousedown", this._mouseDown.bind(this), false);
- panelElement.addEventListener("mousemove", this._mouseMove.bind(this), false);
- this.setTimeout(1000);
-}
-
-WebInspector.PopoverHelper.prototype = {
- setTimeout: function(timeout)
- {
- this._timeout = timeout;
- },
-
- _mouseDown: function(event)
- {
- this._killHidePopupTimer();
- this._handleMouseAction(event, true);
- },
-
- _mouseMove: function(event)
- {
- // Pretend that nothing has happened.
- if (this._hoverElement === event.target || (this._hoverElement && this._hoverElement.isAncestor(event.target)))
- return;
-
- // User has 500ms (this._timeout / 2) to reach the popup.
- if (this._popup && !this._hidePopupTimer) {
- var self = this;
- function doHide()
- {
- self._hidePopup();
- delete self._hidePopupTimer;
- }
- this._hidePopupTimer = setTimeout(doHide, this._timeout / 2);
- }
-
- this._handleMouseAction(event);
- },
-
- _handleMouseAction: function(event, isMouseDown)
- {
- this._resetHoverTimer();
-
- this._hoverElement = this._getAnchor(event.target);
- if (!this._hoverElement)
- return;
-
- const toolTipDelay = isMouseDown ? 0 : (this._popup ? this._timeout * 0.6 : this._timeout);
- this._hoverTimer = setTimeout(this._mouseHover.bind(this, this._hoverElement), toolTipDelay);
- },
-
- _resetHoverTimer: function()
- {
- if (this._hoverTimer) {
- clearTimeout(this._hoverTimer);
- delete this._hoverTimer;
- }
- },
-
- hidePopup: function()
- {
- this._resetHoverTimer();
- this._hidePopup();
- },
-
- _hidePopup: function()
- {
- if (!this._popup)
- return;
-
- if (this._onHide)
- this._onHide();
-
- this._popup.hide();
- delete this._popup;
- },
-
- _mouseHover: function(element)
- {
- delete this._hoverTimer;
-
- this._popup = this._showPopup(element);
- if (this._popup)
- this._popup.contentElement.addEventListener("mousemove", this._killHidePopupTimer.bind(this), true);
- },
-
- _killHidePopupTimer: function()
- {
- if (this._hidePopupTimer) {
- clearTimeout(this._hidePopupTimer);
- delete this._hidePopupTimer;
-
- // We know that we reached the popup, but we might have moved over other elements.
- // Discard pending command.
- this._resetHoverTimer();
- }
- }
-}