15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All Rights Reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {WebInspector.SoftContextMenu=} parentMenu 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.SoftContextMenu = function(items, parentMenu) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._items = items; 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._parentMenu = parentMenu; 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.SoftContextMenu.prototype = { 37926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) /** 38926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {boolean=} alignToCurrentTarget 39926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */ 40926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) show: function(event, alignToCurrentTarget) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._x = event.x; 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._y = event.y; 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._time = new Date().getTime(); 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Absolutely position menu for iframes. 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var absoluteX = event.pageX; 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var absoluteY = event.pageY; 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var targetElement = event.target; 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (targetElement && window !== targetElement.ownerDocument.defaultView) { 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var frameElement = targetElement.ownerDocument.defaultView.frameElement; 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) absoluteY += frameElement.totalOffsetTop(); 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) absoluteX += frameElement.totalOffsetLeft(); 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) targetElement = frameElement; 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Create context menu. 58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) var targetRect; 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._contextMenuElement = document.createElement("div"); 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._contextMenuElement.className = "soft-context-menu"; 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._contextMenuElement.tabIndex = 0; 62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (alignToCurrentTarget) { 63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) targetRect = event.currentTarget.getBoundingClientRect(); 64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Align with bottom left of currentTarget by default. 65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) absoluteX = targetRect.left; 66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) absoluteY = targetRect.bottom; 67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._contextMenuElement.style.top = absoluteY + "px"; 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._contextMenuElement.style.left = absoluteX + "px"; 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._contextMenuElement.addEventListener("mouseup", consumeEvent, false); 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._contextMenuElement.addEventListener("keydown", this._menuKeyDown.bind(this), false); 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = 0; i < this._items.length; ++i) 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._contextMenuElement.appendChild(this._createMenuItem(this._items[i])); 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Install glass pane capturing events. 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!this._parentMenu) { 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._glassPaneElement = document.createElement("div"); 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._glassPaneElement.className = "soft-context-menu-glass-pane"; 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._glassPaneElement.tabIndex = 0; 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._glassPaneElement.addEventListener("mouseup", this._glassPaneMouseUp.bind(this), false); 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._glassPaneElement.appendChild(this._contextMenuElement); 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) document.body.appendChild(this._glassPaneElement); 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._focus(); 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._parentMenu._parentGlassPaneElement().appendChild(this._contextMenuElement); 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Re-position menu in case it does not fit. 90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (document.body.offsetWidth < this._contextMenuElement.offsetLeft + this._contextMenuElement.offsetWidth) { 91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (alignToCurrentTarget) 92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) this._contextMenuElement.style.left = Math.max(0, targetRect.right - this._contextMenuElement.offsetWidth) + "px"; 93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else 94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) this._contextMenuElement.style.left = (absoluteX - this._contextMenuElement.offsetWidth) + "px"; 95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (document.body.offsetHeight < this._contextMenuElement.offsetTop + this._contextMenuElement.offsetHeight) { 97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (alignToCurrentTarget) 98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) this._contextMenuElement.style.top = Math.max(0, targetRect.top - this._contextMenuElement.offsetHeight) + "px"; 99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else 100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) this._contextMenuElement.style.top = (document.body.offsetHeight - this._contextMenuElement.offsetHeight) + "px"; 101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) event.consume(true); 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _parentGlassPaneElement: function() 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._glassPaneElement) 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this._glassPaneElement; 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._parentMenu) 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this._parentMenu._parentGlassPaneElement(); 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return null; 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _createMenuItem: function(item) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (item.type === "separator") 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this._createSeparator(); 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (item.type === "subMenu") 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this._createSubMenu(item); 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var menuItemElement = document.createElement("div"); 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) menuItemElement.className = "soft-context-menu-item"; 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var checkMarkElement = document.createElement("span"); 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) checkMarkElement.textContent = "\u2713 "; // Checkmark Unicode symbol 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) checkMarkElement.className = "soft-context-menu-item-checkmark"; 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!item.checked) 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) checkMarkElement.style.opacity = "0"; 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) menuItemElement.appendChild(checkMarkElement); 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) menuItemElement.appendChild(document.createTextNode(item.label)); 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) menuItemElement.addEventListener("mousedown", this._menuItemMouseDown.bind(this), false); 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) menuItemElement.addEventListener("mouseup", this._menuItemMouseUp.bind(this), false); 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Manually manage hover highlight since :hover does not work in case of click-and-hold menu invocation. 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) menuItemElement.addEventListener("mouseover", this._menuItemMouseOver.bind(this), false); 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) menuItemElement.addEventListener("mouseout", this._menuItemMouseOut.bind(this), false); 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) menuItemElement._actionId = item.id; 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return menuItemElement; 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _createSubMenu: function(item) 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var menuItemElement = document.createElement("div"); 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) menuItemElement.className = "soft-context-menu-item"; 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) menuItemElement._subItems = item.subItems; 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Occupy the same space on the left in all items. 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var checkMarkElement = document.createElement("span"); 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) checkMarkElement.textContent = "\u2713 "; // Checkmark Unicode symbol 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) checkMarkElement.className = "soft-context-menu-item-checkmark"; 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) checkMarkElement.style.opacity = "0"; 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) menuItemElement.appendChild(checkMarkElement); 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var subMenuArrowElement = document.createElement("span"); 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) subMenuArrowElement.textContent = "\u25B6"; // BLACK RIGHT-POINTING TRIANGLE 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) subMenuArrowElement.className = "soft-context-menu-item-submenu-arrow"; 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) menuItemElement.appendChild(document.createTextNode(item.label)); 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) menuItemElement.appendChild(subMenuArrowElement); 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) menuItemElement.addEventListener("mousedown", this._menuItemMouseDown.bind(this), false); 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) menuItemElement.addEventListener("mouseup", this._menuItemMouseUp.bind(this), false); 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Manually manage hover highlight since :hover does not work in case of click-and-hold menu invocation. 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) menuItemElement.addEventListener("mouseover", this._menuItemMouseOver.bind(this), false); 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) menuItemElement.addEventListener("mouseout", this._menuItemMouseOut.bind(this), false); 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return menuItemElement; 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _createSeparator: function() 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var separatorElement = document.createElement("div"); 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) separatorElement.className = "soft-context-menu-separator"; 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) separatorElement._isSeparator = true; 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) separatorElement.addEventListener("mouseover", this._hideSubMenu.bind(this), false); 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) separatorElement.createChild("div", "separator-line"); 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return separatorElement; 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _menuItemMouseDown: function(event) 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Do not let separator's mouse down hit menu's handler - we need to receive mouse up! 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) event.consume(true); 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _menuItemMouseUp: function(event) 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._triggerAction(event.target, event); 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) event.consume(); 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _focus: function() 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._contextMenuElement.focus(); 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _triggerAction: function(menuItemElement, event) 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!menuItemElement._subItems) { 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._discardMenu(true, event); 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (typeof menuItemElement._actionId !== "undefined") { 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) WebInspector.contextMenuItemSelected(menuItemElement._actionId); 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete menuItemElement._actionId; 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._showSubMenu(menuItemElement, event); 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) event.consume(); 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _showSubMenu: function(menuItemElement, event) 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (menuItemElement._subMenuTimer) { 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clearTimeout(menuItemElement._subMenuTimer); 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete menuItemElement._subMenuTimer; 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._subMenu) 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._subMenu = new WebInspector.SoftContextMenu(menuItemElement._subItems, this); 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._subMenu.show(this._buildMouseEventForSubMenu(menuItemElement)); 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _buildMouseEventForSubMenu: function(subMenuItemElement) 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var subMenuOffset = { x: subMenuItemElement.offsetWidth - 3, y: subMenuItemElement.offsetTop - 1 }; 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var targetX = this._x + subMenuOffset.x; 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var targetY = this._y + subMenuOffset.y; 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var targetPageX = parseInt(this._contextMenuElement.style.left, 10) + subMenuOffset.x; 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var targetPageY = parseInt(this._contextMenuElement.style.top, 10) + subMenuOffset.y; 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return { x: targetX, y: targetY, pageX: targetPageX, pageY: targetPageY, consume: function() {} }; 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _hideSubMenu: function() 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!this._subMenu) 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._subMenu._discardSubMenus(); 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._focus(); 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _menuItemMouseOver: function(event) 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._highlightMenuItem(event.target); 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _menuItemMouseOut: function(event) 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!this._subMenu || !event.relatedTarget) { 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._highlightMenuItem(null); 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var relatedTarget = event.relatedTarget; 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._contextMenuElement.isSelfOrAncestor(relatedTarget) || relatedTarget.hasStyleClass("soft-context-menu-glass-pane")) 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._highlightMenuItem(null); 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _highlightMenuItem: function(menuItemElement) 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._highlightedMenuItemElement === menuItemElement) 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._hideSubMenu(); 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._highlightedMenuItemElement) { 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._highlightedMenuItemElement.removeStyleClass("soft-context-menu-item-mouse-over"); 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._highlightedMenuItemElement._subItems && this._highlightedMenuItemElement._subMenuTimer) { 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clearTimeout(this._highlightedMenuItemElement._subMenuTimer); 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete this._highlightedMenuItemElement._subMenuTimer; 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._highlightedMenuItemElement = menuItemElement; 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._highlightedMenuItemElement) { 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._highlightedMenuItemElement.addStyleClass("soft-context-menu-item-mouse-over"); 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._contextMenuElement.focus(); 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._highlightedMenuItemElement._subItems && !this._highlightedMenuItemElement._subMenuTimer) 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._highlightedMenuItemElement._subMenuTimer = setTimeout(this._showSubMenu.bind(this, this._highlightedMenuItemElement, this._buildMouseEventForSubMenu(this._highlightedMenuItemElement)), 150); 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _highlightPrevious: function() 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var menuItemElement = this._highlightedMenuItemElement ? this._highlightedMenuItemElement.previousSibling : this._contextMenuElement.lastChild; 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (menuItemElement && menuItemElement._isSeparator) 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) menuItemElement = menuItemElement.previousSibling; 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (menuItemElement) 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._highlightMenuItem(menuItemElement); 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _highlightNext: function() 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var menuItemElement = this._highlightedMenuItemElement ? this._highlightedMenuItemElement.nextSibling : this._contextMenuElement.firstChild; 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (menuItemElement && menuItemElement._isSeparator) 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) menuItemElement = menuItemElement.nextSibling; 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (menuItemElement) 3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._highlightMenuItem(menuItemElement); 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _menuKeyDown: function(event) 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (event.keyIdentifier) { 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case "Up": 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._highlightPrevious(); break; 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case "Down": 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._highlightNext(); break; 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case "Left": 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._parentMenu) { 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._highlightMenuItem(null); 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._parentMenu._focus(); 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case "Right": 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!this._highlightedMenuItemElement) 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._highlightedMenuItemElement._subItems) { 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._showSubMenu(this._highlightedMenuItemElement, this._buildMouseEventForSubMenu(this._highlightedMenuItemElement)); 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._subMenu._focus(); 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._subMenu._highlightNext(); 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case "U+001B": // Escape 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._discardMenu(true, event); break; 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case "Enter": 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!isEnterKey(event)) 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Fall through 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case "U+0020": // Space 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._highlightedMenuItemElement) 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._triggerAction(this._highlightedMenuItemElement, event); 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) event.consume(true); 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _glassPaneMouseUp: function(event) 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Return if this is simple 'click', since dispatched on glass pane, can't use 'click' event. 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (event.x === this._x && event.y === this._y && new Date().getTime() - this._time < 300) 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._discardMenu(true, event); 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) event.consume(); 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) /** 3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {boolean} closeParentMenus 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @param {Event=} event 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _discardMenu: function(closeParentMenus, event) 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._subMenu && !closeParentMenus) 3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._glassPaneElement) { 3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var glassPane = this._glassPaneElement; 3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete this._glassPaneElement; 3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This can re-enter discardMenu due to blur. 3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) document.body.removeChild(glassPane); 3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._parentMenu) { 3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete this._parentMenu._subMenu; 3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (closeParentMenus) 3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._parentMenu._discardMenu(closeParentMenus, event); 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (event) 3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) event.consume(true); 3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else if (this._parentMenu && this._contextMenuElement.parentElement) { 3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._discardSubMenus(); 3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (closeParentMenus) 3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._parentMenu._discardMenu(closeParentMenus, event); 3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (event) 3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) event.consume(true); 3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }, 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) _discardSubMenus: function() 3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._subMenu) 3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) this._subMenu._discardSubMenus(); 386591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch this._contextMenuElement.remove(); 3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (this._parentMenu) 3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) delete this._parentMenu._subMenu; 3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 392926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)if (!InspectorFrontendHost.showContextMenu) { 393926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InspectorFrontendHost.showContextMenu = function(event, items) 3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) new WebInspector.SoftContextMenu(items).show(event); 3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 400