diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/devtools/front_end/SoftContextMenu.js')
-rw-r--r-- | chromium/third_party/WebKit/Source/devtools/front_end/SoftContextMenu.js | 385 |
1 files changed, 0 insertions, 385 deletions
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/SoftContextMenu.js b/chromium/third_party/WebKit/Source/devtools/front_end/SoftContextMenu.js deleted file mode 100644 index 4a3ce84a047..00000000000 --- a/chromium/third_party/WebKit/Source/devtools/front_end/SoftContextMenu.js +++ /dev/null @@ -1,385 +0,0 @@ -/* - * Copyright (C) 2011 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: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. 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. - * - * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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. - */ - -/** - * @constructor - * @param {!WebInspector.SoftContextMenu=} parentMenu - */ -WebInspector.SoftContextMenu = function(items, parentMenu) -{ - this._items = items; - this._parentMenu = parentMenu; -} - -WebInspector.SoftContextMenu.prototype = { - /** - * @param {!Event} event - */ - show: function(event) - { - this._x = event.x; - this._y = event.y; - this._time = new Date().getTime(); - - // Absolutely position menu for iframes. - var absoluteX = event.pageX; - var absoluteY = event.pageY; - var targetElement = event.target; - while (targetElement && window !== targetElement.ownerDocument.defaultView) { - var frameElement = targetElement.ownerDocument.defaultView.frameElement; - absoluteY += frameElement.totalOffsetTop(); - absoluteX += frameElement.totalOffsetLeft(); - targetElement = frameElement; - } - - // Create context menu. - var targetRect; - this._contextMenuElement = document.createElement("div"); - this._contextMenuElement.className = "soft-context-menu"; - this._contextMenuElement.tabIndex = 0; - this._contextMenuElement.style.top = absoluteY + "px"; - this._contextMenuElement.style.left = absoluteX + "px"; - - this._contextMenuElement.addEventListener("mouseup", consumeEvent, false); - this._contextMenuElement.addEventListener("keydown", this._menuKeyDown.bind(this), false); - - for (var i = 0; i < this._items.length; ++i) - this._contextMenuElement.appendChild(this._createMenuItem(this._items[i])); - - // Install glass pane capturing events. - if (!this._parentMenu) { - this._glassPaneElement = document.createElement("div"); - this._glassPaneElement.className = "soft-context-menu-glass-pane"; - this._glassPaneElement.tabIndex = 0; - this._glassPaneElement.addEventListener("mouseup", this._glassPaneMouseUp.bind(this), false); - this._glassPaneElement.appendChild(this._contextMenuElement); - document.body.appendChild(this._glassPaneElement); - this._focus(); - } else - this._parentMenu._parentGlassPaneElement().appendChild(this._contextMenuElement); - - // Re-position menu in case it does not fit. - if (document.body.offsetWidth < this._contextMenuElement.offsetLeft + this._contextMenuElement.offsetWidth) - this._contextMenuElement.style.left = (absoluteX - this._contextMenuElement.offsetWidth) + "px"; - if (document.body.offsetHeight < this._contextMenuElement.offsetTop + this._contextMenuElement.offsetHeight) - this._contextMenuElement.style.top = (document.body.offsetHeight - this._contextMenuElement.offsetHeight) + "px"; - - event.consume(true); - }, - - _parentGlassPaneElement: function() - { - if (this._glassPaneElement) - return this._glassPaneElement; - if (this._parentMenu) - return this._parentMenu._parentGlassPaneElement(); - return null; - }, - - _createMenuItem: function(item) - { - if (item.type === "separator") - return this._createSeparator(); - - if (item.type === "subMenu") - return this._createSubMenu(item); - - var menuItemElement = document.createElement("div"); - menuItemElement.className = "soft-context-menu-item"; - - var checkMarkElement = document.createElement("span"); - checkMarkElement.textContent = "\u2713 "; // Checkmark Unicode symbol - checkMarkElement.className = "soft-context-menu-item-checkmark"; - if (!item.checked) - checkMarkElement.style.opacity = "0"; - - menuItemElement.appendChild(checkMarkElement); - menuItemElement.appendChild(document.createTextNode(item.label)); - - menuItemElement.addEventListener("mousedown", this._menuItemMouseDown.bind(this), false); - menuItemElement.addEventListener("mouseup", this._menuItemMouseUp.bind(this), false); - - // Manually manage hover highlight since :hover does not work in case of click-and-hold menu invocation. - menuItemElement.addEventListener("mouseover", this._menuItemMouseOver.bind(this), false); - menuItemElement.addEventListener("mouseout", this._menuItemMouseOut.bind(this), false); - - menuItemElement._actionId = item.id; - return menuItemElement; - }, - - _createSubMenu: function(item) - { - var menuItemElement = document.createElement("div"); - menuItemElement.className = "soft-context-menu-item"; - menuItemElement._subItems = item.subItems; - - // Occupy the same space on the left in all items. - var checkMarkElement = document.createElement("span"); - checkMarkElement.textContent = "\u2713 "; // Checkmark Unicode symbol - checkMarkElement.className = "soft-context-menu-item-checkmark"; - checkMarkElement.style.opacity = "0"; - menuItemElement.appendChild(checkMarkElement); - - var subMenuArrowElement = document.createElement("span"); - subMenuArrowElement.textContent = "\u25B6"; // BLACK RIGHT-POINTING TRIANGLE - subMenuArrowElement.className = "soft-context-menu-item-submenu-arrow"; - - menuItemElement.appendChild(document.createTextNode(item.label)); - menuItemElement.appendChild(subMenuArrowElement); - - menuItemElement.addEventListener("mousedown", this._menuItemMouseDown.bind(this), false); - menuItemElement.addEventListener("mouseup", this._menuItemMouseUp.bind(this), false); - - // Manually manage hover highlight since :hover does not work in case of click-and-hold menu invocation. - menuItemElement.addEventListener("mouseover", this._menuItemMouseOver.bind(this), false); - menuItemElement.addEventListener("mouseout", this._menuItemMouseOut.bind(this), false); - - return menuItemElement; - }, - - _createSeparator: function() - { - var separatorElement = document.createElement("div"); - separatorElement.className = "soft-context-menu-separator"; - separatorElement._isSeparator = true; - separatorElement.addEventListener("mouseover", this._hideSubMenu.bind(this), false); - separatorElement.createChild("div", "separator-line"); - return separatorElement; - }, - - _menuItemMouseDown: function(event) - { - // Do not let separator's mouse down hit menu's handler - we need to receive mouse up! - event.consume(true); - }, - - _menuItemMouseUp: function(event) - { - this._triggerAction(event.target, event); - event.consume(); - }, - - _focus: function() - { - this._contextMenuElement.focus(); - }, - - _triggerAction: function(menuItemElement, event) - { - if (!menuItemElement._subItems) { - this._discardMenu(true, event); - if (typeof menuItemElement._actionId !== "undefined") { - WebInspector.contextMenuItemSelected(menuItemElement._actionId); - delete menuItemElement._actionId; - } - return; - } - - this._showSubMenu(menuItemElement, event); - event.consume(); - }, - - _showSubMenu: function(menuItemElement, event) - { - if (menuItemElement._subMenuTimer) { - clearTimeout(menuItemElement._subMenuTimer); - delete menuItemElement._subMenuTimer; - } - if (this._subMenu) - return; - - this._subMenu = new WebInspector.SoftContextMenu(menuItemElement._subItems, this); - this._subMenu.show(this._buildMouseEventForSubMenu(menuItemElement)); - }, - - _buildMouseEventForSubMenu: function(subMenuItemElement) - { - var subMenuOffset = { x: subMenuItemElement.offsetWidth - 3, y: subMenuItemElement.offsetTop - 1 }; - var targetX = this._x + subMenuOffset.x; - var targetY = this._y + subMenuOffset.y; - var targetPageX = parseInt(this._contextMenuElement.style.left, 10) + subMenuOffset.x; - var targetPageY = parseInt(this._contextMenuElement.style.top, 10) + subMenuOffset.y; - return { x: targetX, y: targetY, pageX: targetPageX, pageY: targetPageY, consume: function() {} }; - }, - - _hideSubMenu: function() - { - if (!this._subMenu) - return; - this._subMenu._discardSubMenus(); - this._focus(); - }, - - _menuItemMouseOver: function(event) - { - this._highlightMenuItem(event.target); - }, - - _menuItemMouseOut: function(event) - { - if (!this._subMenu || !event.relatedTarget) { - this._highlightMenuItem(null); - return; - } - - var relatedTarget = event.relatedTarget; - if (this._contextMenuElement.isSelfOrAncestor(relatedTarget) || relatedTarget.classList.contains("soft-context-menu-glass-pane")) - this._highlightMenuItem(null); - }, - - _highlightMenuItem: function(menuItemElement) - { - if (this._highlightedMenuItemElement === menuItemElement) - return; - - this._hideSubMenu(); - if (this._highlightedMenuItemElement) { - this._highlightedMenuItemElement.classList.remove("soft-context-menu-item-mouse-over"); - if (this._highlightedMenuItemElement._subItems && this._highlightedMenuItemElement._subMenuTimer) { - clearTimeout(this._highlightedMenuItemElement._subMenuTimer); - delete this._highlightedMenuItemElement._subMenuTimer; - } - } - this._highlightedMenuItemElement = menuItemElement; - if (this._highlightedMenuItemElement) { - this._highlightedMenuItemElement.classList.add("soft-context-menu-item-mouse-over"); - this._contextMenuElement.focus(); - if (this._highlightedMenuItemElement._subItems && !this._highlightedMenuItemElement._subMenuTimer) - this._highlightedMenuItemElement._subMenuTimer = setTimeout(this._showSubMenu.bind(this, this._highlightedMenuItemElement, this._buildMouseEventForSubMenu(this._highlightedMenuItemElement)), 150); - } - }, - - _highlightPrevious: function() - { - var menuItemElement = this._highlightedMenuItemElement ? this._highlightedMenuItemElement.previousSibling : this._contextMenuElement.lastChild; - while (menuItemElement && menuItemElement._isSeparator) - menuItemElement = menuItemElement.previousSibling; - if (menuItemElement) - this._highlightMenuItem(menuItemElement); - }, - - _highlightNext: function() - { - var menuItemElement = this._highlightedMenuItemElement ? this._highlightedMenuItemElement.nextSibling : this._contextMenuElement.firstChild; - while (menuItemElement && menuItemElement._isSeparator) - menuItemElement = menuItemElement.nextSibling; - if (menuItemElement) - this._highlightMenuItem(menuItemElement); - }, - - _menuKeyDown: function(event) - { - switch (event.keyIdentifier) { - case "Up": - this._highlightPrevious(); break; - case "Down": - this._highlightNext(); break; - case "Left": - if (this._parentMenu) { - this._highlightMenuItem(null); - this._parentMenu._focus(); - } - break; - case "Right": - if (!this._highlightedMenuItemElement) - break; - if (this._highlightedMenuItemElement._subItems) { - this._showSubMenu(this._highlightedMenuItemElement, this._buildMouseEventForSubMenu(this._highlightedMenuItemElement)); - this._subMenu._focus(); - this._subMenu._highlightNext(); - } - break; - case "U+001B": // Escape - this._discardMenu(true, event); break; - case "Enter": - if (!isEnterKey(event)) - break; - // Fall through - case "U+0020": // Space - if (this._highlightedMenuItemElement) - this._triggerAction(this._highlightedMenuItemElement, event); - break; - } - event.consume(true); - }, - - _glassPaneMouseUp: function(event) - { - // Return if this is simple 'click', since dispatched on glass pane, can't use 'click' event. - if (event.x === this._x && event.y === this._y && new Date().getTime() - this._time < 300) - return; - this._discardMenu(true, event); - event.consume(); - }, - - /** - * @param {boolean} closeParentMenus - * @param {!Event=} event - */ - _discardMenu: function(closeParentMenus, event) - { - if (this._subMenu && !closeParentMenus) - return; - if (this._glassPaneElement) { - var glassPane = this._glassPaneElement; - delete this._glassPaneElement; - // This can re-enter discardMenu due to blur. - document.body.removeChild(glassPane); - if (this._parentMenu) { - delete this._parentMenu._subMenu; - if (closeParentMenus) - this._parentMenu._discardMenu(closeParentMenus, event); - } - - if (event) - event.consume(true); - } else if (this._parentMenu && this._contextMenuElement.parentElement) { - this._discardSubMenus(); - if (closeParentMenus) - this._parentMenu._discardMenu(closeParentMenus, event); - - if (event) - event.consume(true); - } - }, - - _discardSubMenus: function() - { - if (this._subMenu) - this._subMenu._discardSubMenus(); - this._contextMenuElement.remove(); - if (this._parentMenu) - delete this._parentMenu._subMenu; - } -} - -if (!InspectorFrontendHost.showContextMenu) { - -InspectorFrontendHost.showContextMenu = function(event, items) -{ - new WebInspector.SoftContextMenu(items).show(event); -} - -} |