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