<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[211061] trunk/Source/WebInspectorUI</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/211061">211061</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2017-01-23 14:24:01 -0800 (Mon, 23 Jan 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Web Inspector: tree elements with depth &gt; 1 should have context menu &quot;expand all&quot;/&quot;collapse all&quot; commands
https://bugs.webkit.org/show_bug.cgi?id=135590

Patch by Devin Rousso &lt;dcrousso+webkit@gmail.com&gt; on 2017-01-23
Reviewed by Timothy Hatcher.

Rework the context menu event handlers for all TreeOutline and TreeElement instances such
that the TreeOutline handles the event listener and creates the context menu object and the
TreeElement populates the list with items.  This is necessary due to the way in which
children are laid out, as there is padding on either side of the element that would not
trigger a context menu event.

* Localizations/en.lproj/localizedStrings.js:
* UserInterface/Views/BreakpointTreeElement.js:
(WebInspector.BreakpointTreeElement.prototype.ondetach):
(WebInspector.BreakpointTreeElement.prototype.populateContextMenu):
(WebInspector.BreakpointTreeElement.prototype.oncontextmenu): Deleted.
* UserInterface/Views/ContextMenuUtilities.js:
(WebInspector.appendContextMenuItemsForSourceCode):
* UserInterface/Views/DOMTreeElement.js:
(WebInspector.DOMTreeElement.prototype._populateNodeContextMenu):
* UserInterface/Views/DOMTreeOutline.js:
(WebInspector.DOMTreeOutline):
(WebInspector.DOMTreeOutline.prototype.populateContextMenu):
(WebInspector.DOMTreeOutline.prototype._onmousedown):
(WebInspector.DOMTreeOutline.prototype._onmousemove):
(WebInspector.DOMTreeOutline.prototype._ondragstart):
(WebInspector.DOMTreeOutline.prototype._ondragover):
(WebInspector.DOMTreeOutline.prototype._ondrop):
(WebInspector.DOMTreeOutline.prototype._treeElementFromEvent): Deleted.
(WebInspector.DOMTreeOutline.prototype._contextMenuEventFired): Deleted.
* UserInterface/Views/DebuggerSidebarPanel.js:
(WebInspector.DebuggerSidebarPanel):
(WebInspector.DebuggerSidebarPanel.prototype._breakpointTreeOutlineContextMenuTreeElement):
* UserInterface/Views/FrameTreeElement.js:
(WebInspector.FrameTreeElement.prototype.onattach):
* UserInterface/Views/GeneralTreeElement.js:
(WebInspector.GeneralTreeElement.prototype.onattach):
(WebInspector.GeneralTreeElement.prototype.ondetach): Deleted.
* UserInterface/Views/ObjectTreeBaseTreeElement.js:
(WebInspector.ObjectTreeBaseTreeElement.prototype.populateContextMenu):
(WebInspector.ObjectTreeBaseTreeElement.prototype._logSymbolProperty):
(WebInspector.ObjectTreeBaseTreeElement.prototype._logValue):
(WebInspector.ObjectTreeBaseTreeElement.prototype.oncontextmenu): Deleted.
(WebInspector.ObjectTreeBaseTreeElement.prototype._contextMenuHandler): Deleted.
* UserInterface/Views/ResourceTreeElement.js:
(WebInspector.ResourceTreeElement.prototype.populateContextMenu):
(WebInspector.ResourceTreeElement.prototype.onattach): Deleted.
(WebInspector.ResourceTreeElement.prototype._handleContextMenuEvent): Deleted.
* UserInterface/Views/ThreadTreeElement.js:
(WebInspector.ThreadTreeElement.prototype.populateContextMenu):
(WebInspector.ThreadTreeElement.prototype.oncontextmenu): Deleted.
* UserInterface/Views/TreeElement.js:
(WebInspector.TreeElement.prototype.populateContextMenu):
(WebInspector.TreeElement):
* UserInterface/Views/TreeOutline.js:
(WebInspector.TreeOutline):
(WebInspector.TreeOutline.prototype.treeElementFromEvent):
(WebInspector.TreeOutline.prototype.populateContextMenu):
(WebInspector.TreeOutline._generateStyleRulesIfNeeded):
* UserInterface/Views/VisualStyleSelectorTreeItem.js:
(WebInspector.VisualStyleSelectorTreeItem.prototype.onattach):
(WebInspector.VisualStyleSelectorTreeItem.prototype.populateContextMenu):
(WebInspector.VisualStyleSelectorTreeItem.prototype._highlightNodesWithSelector):
(WebInspector.VisualStyleSelectorTreeItem.prototype._hideDOMNodeHighlight):
(WebInspector.VisualStyleSelectorTreeItem.prototype._handleContextMenuEvent): Deleted.
* UserInterface/Views/WorkerTreeElement.js:
(WebInspector.WorkerTreeElement.prototype.populateContextMenu):
(WebInspector.WorkerTreeElement.prototype.onattach):
(WebInspector.WorkerTreeElement.prototype._handleContextMenuEvent): Deleted.

* UserInterface/Views/DataGrid.js:
(WebInspector.DataGrid.prototype._contextMenuInDataTable):
Add &quot;Expand All&quot;/&quot;Collapse All&quot; context menu items.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebInspectorUIChangeLog">trunk/Source/WebInspectorUI/ChangeLog</a></li>
<li><a href="#trunkSourceWebInspectorUILocalizationsenlprojlocalizedStringsjs">trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsBreakpointTreeElementjs">trunk/Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsContextMenuUtilitiesjs">trunk/Source/WebInspectorUI/UserInterface/Views/ContextMenuUtilities.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsDOMTreeOutlinejs">trunk/Source/WebInspectorUI/UserInterface/Views/DOMTreeOutline.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsDataGridjs">trunk/Source/WebInspectorUI/UserInterface/Views/DataGrid.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsDebuggerSidebarPaneljs">trunk/Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsFrameTreeElementjs">trunk/Source/WebInspectorUI/UserInterface/Views/FrameTreeElement.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsGeneralTreeElementjs">trunk/Source/WebInspectorUI/UserInterface/Views/GeneralTreeElement.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsObjectTreeBaseTreeElementjs">trunk/Source/WebInspectorUI/UserInterface/Views/ObjectTreeBaseTreeElement.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsResourceTreeElementjs">trunk/Source/WebInspectorUI/UserInterface/Views/ResourceTreeElement.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsThreadTreeElementjs">trunk/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsTreeElementjs">trunk/Source/WebInspectorUI/UserInterface/Views/TreeElement.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsTreeOutlinejs">trunk/Source/WebInspectorUI/UserInterface/Views/TreeOutline.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsVisualStyleSelectorTreeItemjs">trunk/Source/WebInspectorUI/UserInterface/Views/VisualStyleSelectorTreeItem.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsWorkerTreeElementjs">trunk/Source/WebInspectorUI/UserInterface/Views/WorkerTreeElement.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebInspectorUIChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/ChangeLog (211060 => 211061)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/ChangeLog        2017-01-23 21:41:23 UTC (rev 211060)
+++ trunk/Source/WebInspectorUI/ChangeLog        2017-01-23 22:24:01 UTC (rev 211061)
</span><span class="lines">@@ -1,5 +1,81 @@
</span><span class="cx"> 2017-01-23  Devin Rousso  &lt;dcrousso+webkit@gmail.com&gt;
</span><span class="cx"> 
</span><ins>+        Web Inspector: tree elements with depth &gt; 1 should have context menu &quot;expand all&quot;/&quot;collapse all&quot; commands
+        https://bugs.webkit.org/show_bug.cgi?id=135590
+
+        Reviewed by Timothy Hatcher.
+
+        Rework the context menu event handlers for all TreeOutline and TreeElement instances such
+        that the TreeOutline handles the event listener and creates the context menu object and the
+        TreeElement populates the list with items.  This is necessary due to the way in which
+        children are laid out, as there is padding on either side of the element that would not
+        trigger a context menu event.
+
+        * Localizations/en.lproj/localizedStrings.js:
+        * UserInterface/Views/BreakpointTreeElement.js:
+        (WebInspector.BreakpointTreeElement.prototype.ondetach):
+        (WebInspector.BreakpointTreeElement.prototype.populateContextMenu):
+        (WebInspector.BreakpointTreeElement.prototype.oncontextmenu): Deleted.
+        * UserInterface/Views/ContextMenuUtilities.js:
+        (WebInspector.appendContextMenuItemsForSourceCode):
+        * UserInterface/Views/DOMTreeElement.js:
+        (WebInspector.DOMTreeElement.prototype._populateNodeContextMenu):
+        * UserInterface/Views/DOMTreeOutline.js:
+        (WebInspector.DOMTreeOutline):
+        (WebInspector.DOMTreeOutline.prototype.populateContextMenu):
+        (WebInspector.DOMTreeOutline.prototype._onmousedown):
+        (WebInspector.DOMTreeOutline.prototype._onmousemove):
+        (WebInspector.DOMTreeOutline.prototype._ondragstart):
+        (WebInspector.DOMTreeOutline.prototype._ondragover):
+        (WebInspector.DOMTreeOutline.prototype._ondrop):
+        (WebInspector.DOMTreeOutline.prototype._treeElementFromEvent): Deleted.
+        (WebInspector.DOMTreeOutline.prototype._contextMenuEventFired): Deleted.
+        * UserInterface/Views/DebuggerSidebarPanel.js:
+        (WebInspector.DebuggerSidebarPanel):
+        (WebInspector.DebuggerSidebarPanel.prototype._breakpointTreeOutlineContextMenuTreeElement):
+        * UserInterface/Views/FrameTreeElement.js:
+        (WebInspector.FrameTreeElement.prototype.onattach):
+        * UserInterface/Views/GeneralTreeElement.js:
+        (WebInspector.GeneralTreeElement.prototype.onattach):
+        (WebInspector.GeneralTreeElement.prototype.ondetach): Deleted.
+        * UserInterface/Views/ObjectTreeBaseTreeElement.js:
+        (WebInspector.ObjectTreeBaseTreeElement.prototype.populateContextMenu):
+        (WebInspector.ObjectTreeBaseTreeElement.prototype._logSymbolProperty):
+        (WebInspector.ObjectTreeBaseTreeElement.prototype._logValue):
+        (WebInspector.ObjectTreeBaseTreeElement.prototype.oncontextmenu): Deleted.
+        (WebInspector.ObjectTreeBaseTreeElement.prototype._contextMenuHandler): Deleted.
+        * UserInterface/Views/ResourceTreeElement.js:
+        (WebInspector.ResourceTreeElement.prototype.populateContextMenu):
+        (WebInspector.ResourceTreeElement.prototype.onattach): Deleted.
+        (WebInspector.ResourceTreeElement.prototype._handleContextMenuEvent): Deleted.
+        * UserInterface/Views/ThreadTreeElement.js:
+        (WebInspector.ThreadTreeElement.prototype.populateContextMenu):
+        (WebInspector.ThreadTreeElement.prototype.oncontextmenu): Deleted.
+        * UserInterface/Views/TreeElement.js:
+        (WebInspector.TreeElement.prototype.populateContextMenu):
+        (WebInspector.TreeElement):
+        * UserInterface/Views/TreeOutline.js:
+        (WebInspector.TreeOutline):
+        (WebInspector.TreeOutline.prototype.treeElementFromEvent):
+        (WebInspector.TreeOutline.prototype.populateContextMenu):
+        (WebInspector.TreeOutline._generateStyleRulesIfNeeded):
+        * UserInterface/Views/VisualStyleSelectorTreeItem.js:
+        (WebInspector.VisualStyleSelectorTreeItem.prototype.onattach):
+        (WebInspector.VisualStyleSelectorTreeItem.prototype.populateContextMenu):
+        (WebInspector.VisualStyleSelectorTreeItem.prototype._highlightNodesWithSelector):
+        (WebInspector.VisualStyleSelectorTreeItem.prototype._hideDOMNodeHighlight):
+        (WebInspector.VisualStyleSelectorTreeItem.prototype._handleContextMenuEvent): Deleted.
+        * UserInterface/Views/WorkerTreeElement.js:
+        (WebInspector.WorkerTreeElement.prototype.populateContextMenu):
+        (WebInspector.WorkerTreeElement.prototype.onattach):
+        (WebInspector.WorkerTreeElement.prototype._handleContextMenuEvent): Deleted.
+
+        * UserInterface/Views/DataGrid.js:
+        (WebInspector.DataGrid.prototype._contextMenuInDataTable):
+        Add &quot;Expand All&quot;/&quot;Collapse All&quot; context menu items.
+
+2017-01-23  Devin Rousso  &lt;dcrousso+webkit@gmail.com&gt;
+
</ins><span class="cx">         Web Inspector: color picker should feature an editable CSS value
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=124356
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebInspectorUILocalizationsenlprojlocalizedStringsjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js (211060 => 211061)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js        2017-01-23 21:41:23 UTC (rev 211060)
+++ trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js        2017-01-23 22:24:01 UTC (rev 211061)
</span><span class="lines">@@ -178,6 +178,7 @@
</span><span class="cx"> localizedStrings[&quot;Closure Variables&quot;] = &quot;Closure Variables&quot;;
</span><span class="cx"> localizedStrings[&quot;Closure Variables (%s)&quot;] = &quot;Closure Variables (%s)&quot;;
</span><span class="cx"> localizedStrings[&quot;Code&quot;] = &quot;Code&quot;;
</span><ins>+localizedStrings[&quot;Collapse All&quot;] = &quot;Collapse All&quot;;
</ins><span class="cx"> localizedStrings[&quot;Collapse columns&quot;] = &quot;Collapse columns&quot;;
</span><span class="cx"> localizedStrings[&quot;Color&quot;] = &quot;Color&quot;;
</span><span class="cx"> localizedStrings[&quot;Comment&quot;] = &quot;Comment&quot;;
</span><span class="lines">@@ -334,6 +335,7 @@
</span><span class="cx"> localizedStrings[&quot;Event Listeners&quot;] = &quot;Event Listeners&quot;;
</span><span class="cx"> localizedStrings[&quot;Events&quot;] = &quot;Events&quot;;
</span><span class="cx"> localizedStrings[&quot;Exception with thrown value: %s&quot;] = &quot;Exception with thrown value: %s&quot;;
</span><ins>+localizedStrings[&quot;Expand All&quot;] = &quot;Expand All&quot;;
</ins><span class="cx"> localizedStrings[&quot;Expand columns&quot;] = &quot;Expand columns&quot;;
</span><span class="cx"> localizedStrings[&quot;Expanded&quot;] = &quot;Expanded&quot;;
</span><span class="cx"> localizedStrings[&quot;Expires&quot;] = &quot;Expires&quot;;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsBreakpointTreeElementjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.js (211060 => 211061)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.js        2017-01-23 21:41:23 UTC (rev 211060)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/BreakpointTreeElement.js        2017-01-23 22:24:01 UTC (rev 211061)
</span><span class="lines">@@ -101,12 +101,6 @@
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    oncontextmenu(event)
-    {
-        let contextMenu = WebInspector.ContextMenu.createFromEvent(event);
-        WebInspector.breakpointPopoverController.appendContextMenuItems(contextMenu, this._breakpoint, this._statusImageElement);
-    }
-
</del><span class="cx">     onattach()
</span><span class="cx">     {
</span><span class="cx">         super.onattach();
</span><span class="lines">@@ -120,8 +114,6 @@
</span><span class="cx"> 
</span><span class="cx">     ondetach()
</span><span class="cx">     {
</span><del>-        super.ondetach();
-
</del><span class="cx">         this._listenerSet.uninstall();
</span><span class="cx"> 
</span><span class="cx">         if (this._probeSet)
</span><span class="lines">@@ -128,6 +120,13 @@
</span><span class="cx">             this._removeProbeSet(this._probeSet);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    populateContextMenu(contextMenu, event)
+    {
+        WebInspector.breakpointPopoverController.appendContextMenuItems(contextMenu, this._breakpoint, this._statusImageElement);
+
+        super.populateContextMenu(contextMenu, event);
+    }
+
</ins><span class="cx">     removeStatusImage()
</span><span class="cx">     {
</span><span class="cx">         this._statusImageElement.remove();
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsContextMenuUtilitiesjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ContextMenuUtilities.js (211060 => 211061)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/ContextMenuUtilities.js        2017-01-23 21:41:23 UTC (rev 211060)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ContextMenuUtilities.js        2017-01-23 22:24:01 UTC (rev 211061)
</span><span class="lines">@@ -33,6 +33,8 @@
</span><span class="cx">     if (!(sourceCode instanceof WebInspector.SourceCode))
</span><span class="cx">         return;
</span><span class="cx"> 
</span><ins>+    contextMenu.appendSeparator();
+
</ins><span class="cx">     if (sourceCode.url) {
</span><span class="cx">         contextMenu.appendItem(WebInspector.UIString(&quot;Open in New Tab&quot;), () =&gt; {
</span><span class="cx">             const frame = null;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsDOMTreeOutlinejs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/DOMTreeOutline.js (211060 => 211061)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/DOMTreeOutline.js        2017-01-23 21:41:23 UTC (rev 211060)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/DOMTreeOutline.js        2017-01-23 22:24:01 UTC (rev 211061)
</span><span class="lines">@@ -55,8 +55,6 @@
</span><span class="cx">         this._editing = false;
</span><span class="cx">         this._visible = false;
</span><span class="cx"> 
</span><del>-        this.element.addEventListener(&quot;contextmenu&quot;, this._contextMenuEventFired.bind(this));
-
</del><span class="cx">         this._hideElementKeyboardShortcut = new WebInspector.KeyboardShortcut(null, &quot;H&quot;, this._hideElement.bind(this), this.element);
</span><span class="cx">         this._hideElementKeyboardShortcut.implicitlyPreventsDefault = false;
</span><span class="cx"> 
</span><span class="lines">@@ -245,25 +243,21 @@
</span><span class="cx">         let commentNode = event.target.enclosingNodeOrSelfWithClass(&quot;html-comment&quot;);
</span><span class="cx">         let pseudoElement = event.target.enclosingNodeOrSelfWithClass(&quot;html-pseudo-element&quot;);
</span><span class="cx"> 
</span><del>-        let populated = false;
</del><span class="cx">         if (tag &amp;&amp; treeElement._populateTagContextMenu) {
</span><del>-            if (populated)
-                contextMenu.appendSeparator();
</del><ins>+            contextMenu.appendSeparator();
+
</ins><span class="cx">             treeElement._populateTagContextMenu(contextMenu, event);
</span><del>-            populated = true;
</del><span class="cx">         } else if (textNode &amp;&amp; treeElement._populateTextContextMenu) {
</span><del>-            if (populated)
-                contextMenu.appendSeparator();
</del><ins>+            contextMenu.appendSeparator();
+
</ins><span class="cx">             treeElement._populateTextContextMenu(contextMenu, textNode);
</span><del>-            populated = true;
</del><span class="cx">         } else if ((commentNode || pseudoElement) &amp;&amp; treeElement._populateNodeContextMenu) {
</span><del>-            if (populated)
-                contextMenu.appendSeparator();
</del><ins>+            contextMenu.appendSeparator();
+
</ins><span class="cx">             treeElement._populateNodeContextMenu(contextMenu);
</span><del>-            populated = true;
</del><span class="cx">         }
</span><span class="cx"> 
</span><del>-        return populated;
</del><ins>+        super.populateContextMenu(contextMenu, event, treeElement);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     adjustCollapsedRange()
</span><span class="lines">@@ -291,35 +285,9 @@
</span><span class="cx">         treeElement.revealAndSelect(omitFocus);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    _treeElementFromEvent(event)
-    {
-        var scrollContainer = this.element.parentElement;
-
-        // We choose this X coordinate based on the knowledge that our list
-        // items extend at least to the right edge of the outer &lt;ol&gt; container.
-        // In the no-word-wrap mode the outer &lt;ol&gt; may be wider than the tree container
-        // (and partially hidden), in which case we are left to use only its right boundary.
-        var x = scrollContainer.totalOffsetLeft + scrollContainer.offsetWidth - 36;
-
-        var y = event.pageY;
-
-        // Our list items have 1-pixel cracks between them vertically. We avoid
-        // the cracks by checking slightly above and slightly below the mouse
-        // and seeing if we hit the same element each time.
-        var elementUnderMouse = this.treeElementFromPoint(x, y);
-        var elementAboveMouse = this.treeElementFromPoint(x, y - 2);
-        var element;
-        if (elementUnderMouse === elementAboveMouse)
-            element = elementUnderMouse;
-        else
-            element = this.treeElementFromPoint(x, y + 2);
-
-        return element;
-    }
-
</del><span class="cx">     _onmousedown(event)
</span><span class="cx">     {
</span><del>-        var element = this._treeElementFromEvent(event);
</del><ins>+        let element = this.treeElementFromEvent(event);
</ins><span class="cx">         if (!element || element.isEventWithinDisclosureTriangle(event)) {
</span><span class="cx">             event.preventDefault();
</span><span class="cx">             return;
</span><span class="lines">@@ -330,7 +298,7 @@
</span><span class="cx"> 
</span><span class="cx">     _onmousemove(event)
</span><span class="cx">     {
</span><del>-        var element = this._treeElementFromEvent(event);
</del><ins>+        let element = this.treeElementFromEvent(event);
</ins><span class="cx">         if (element &amp;&amp; this._previousHoveredElement === element)
</span><span class="cx">             return;
</span><span class="cx"> 
</span><span class="lines">@@ -367,7 +335,7 @@
</span><span class="cx"> 
</span><span class="cx">     _ondragstart(event)
</span><span class="cx">     {
</span><del>-        var treeElement = this._treeElementFromEvent(event);
</del><ins>+        let treeElement = this.treeElementFromEvent(event);
</ins><span class="cx">         if (!treeElement)
</span><span class="cx">             return false;
</span><span class="cx"> 
</span><span class="lines">@@ -397,7 +365,7 @@
</span><span class="cx">         if (!this._nodeBeingDragged)
</span><span class="cx">             return false;
</span><span class="cx"> 
</span><del>-        let treeElement = this._treeElementFromEvent(event);
</del><ins>+        let treeElement = this.treeElementFromEvent(event);
</ins><span class="cx">         if (!this._isValidDragSourceOrTarget(treeElement))
</span><span class="cx">             return false;
</span><span class="cx"> 
</span><span class="lines">@@ -454,7 +422,7 @@
</span><span class="cx">                 this.selectDOMNode(newNode, true);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        let treeElement = this._treeElementFromEvent(event);
</del><ins>+        let treeElement = this.treeElementFromEvent(event);
</ins><span class="cx">         if (this._nodeBeingDragged &amp;&amp; treeElement) {
</span><span class="cx">             let parentNode = null;
</span><span class="cx">             let anchorNode = null;
</span><span class="lines">@@ -496,16 +464,6 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    _contextMenuEventFired(event)
-    {
-        let treeElement = this._treeElementFromEvent(event);
-        if (!treeElement)
-            return;
-
-        let contextMenu = WebInspector.ContextMenu.createFromEvent(event);
-        this.populateContextMenu(contextMenu, event, treeElement);
-    }
-
</del><span class="cx">     _updateModifiedNodes()
</span><span class="cx">     {
</span><span class="cx">         if (this._elementsTreeUpdater)
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsDataGridjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/DataGrid.js (211060 => 211061)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/DataGrid.js        2017-01-23 21:41:23 UTC (rev 211060)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/DataGrid.js        2017-01-23 22:24:01 UTC (rev 211061)
</span><span class="lines">@@ -1646,23 +1646,32 @@
</span><span class="cx">         if (this.dataGrid._refreshCallback &amp;&amp; (!gridNode || gridNode !== this.placeholderNode))
</span><span class="cx">             contextMenu.appendItem(WebInspector.UIString(&quot;Refresh&quot;), this._refreshCallback.bind(this));
</span><span class="cx"> 
</span><del>-        if (gridNode &amp;&amp; gridNode.selectable &amp;&amp; gridNode.copyable &amp;&amp; !gridNode.isEventWithinDisclosureTriangle(event)) {
-            contextMenu.appendItem(WebInspector.UIString(&quot;Copy Row&quot;), this._copyRow.bind(this, event.target));
-            contextMenu.appendItem(WebInspector.UIString(&quot;Copy Table&quot;), this._copyTable.bind(this));
</del><ins>+        if (gridNode) {
+            if (gridNode.selectable &amp;&amp; gridNode.copyable &amp;&amp; !gridNode.isEventWithinDisclosureTriangle(event)) {
+                contextMenu.appendItem(WebInspector.UIString(&quot;Copy Row&quot;), this._copyRow.bind(this, event.target));
+                contextMenu.appendItem(WebInspector.UIString(&quot;Copy Table&quot;), this._copyTable.bind(this));
</ins><span class="cx"> 
</span><del>-            if (this.dataGrid._editCallback) {
-                if (gridNode === this.placeholderNode)
-                    contextMenu.appendItem(WebInspector.UIString(&quot;Add New&quot;), this._startEditing.bind(this, event.target));
-                else {
-                    let element = event.target.enclosingNodeOrSelfWithNodeName(&quot;td&quot;);
-                    let columnIdentifier = element.__columnIdentifier;
-                    let columnTitle = this.dataGrid.columns.get(columnIdentifier)[&quot;title&quot;];
-                    contextMenu.appendItem(WebInspector.UIString(&quot;Edit ā€œ%sā€&quot;).format(columnTitle), this._startEditing.bind(this, event.target));
</del><ins>+                if (this.dataGrid._editCallback) {
+                    if (gridNode === this.placeholderNode)
+                        contextMenu.appendItem(WebInspector.UIString(&quot;Add New&quot;), this._startEditing.bind(this, event.target));
+                    else {
+                        let element = event.target.enclosingNodeOrSelfWithNodeName(&quot;td&quot;);
+                        let columnIdentifier = element.__columnIdentifier;
+                        let columnTitle = this.dataGrid.columns.get(columnIdentifier)[&quot;title&quot;];
+                        contextMenu.appendItem(WebInspector.UIString(&quot;Edit ā€œ%sā€&quot;).format(columnTitle), this._startEditing.bind(this, event.target));
+                    }
</ins><span class="cx">                 }
</span><ins>+
+                if (this.dataGrid._deleteCallback &amp;&amp; gridNode !== this.placeholderNode)
+                    contextMenu.appendItem(WebInspector.UIString(&quot;Delete&quot;), this._deleteCallback.bind(this, gridNode));
</ins><span class="cx">             }
</span><span class="cx"> 
</span><del>-            if (this.dataGrid._deleteCallback &amp;&amp; gridNode !== this.placeholderNode)
-                contextMenu.appendItem(WebInspector.UIString(&quot;Delete&quot;), this._deleteCallback.bind(this, gridNode));
</del><ins>+            if (gridNode.children.some((child) =&gt; child.hasChildren) || (gridNode.hasChildren &amp;&amp; !gridNode.children.length)) {
+                contextMenu.appendSeparator();
+
+                contextMenu.appendItem(WebInspector.UIString(&quot;Expand All&quot;), gridNode.expandRecursively.bind(gridNode));
+                contextMenu.appendItem(WebInspector.UIString(&quot;Collapse All&quot;), gridNode.collapseRecursively.bind(gridNode));
+            }
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsDebuggerSidebarPaneljs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js (211060 => 211061)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js        2017-01-23 21:41:23 UTC (rev 211060)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/DebuggerSidebarPanel.js        2017-01-23 22:24:01 UTC (rev 211061)
</span><span class="lines">@@ -153,8 +153,12 @@
</span><span class="cx"> 
</span><span class="cx">         this._breakpointsContentTreeOutline.addEventListener(WebInspector.TreeOutline.Event.SelectionDidChange, this._treeSelectionDidChange, this);
</span><span class="cx">         this._breakpointsContentTreeOutline.ondelete = this._breakpointTreeOutlineDeleteTreeElement.bind(this);
</span><del>-        this._breakpointsContentTreeOutline.oncontextmenu = this._breakpointTreeOutlineContextMenuTreeElement.bind(this);
</del><ins>+        this._breakpointsContentTreeOutline.populateContextMenu = function(contextMenu, event, treeElement) {
+            this._breakpointTreeOutlineContextMenuTreeElement(contextMenu, event, treeElement);
</ins><span class="cx"> 
</span><ins>+            WebInspector.TreeOutline.prototype.populateContextMenu(contextMenu, event, treeElement);
+        }.bind(this);
+
</ins><span class="cx">         this._breakpointsContentTreeOutline.appendChild(this._allExceptionsBreakpointTreeElement);
</span><span class="cx">         this._breakpointsContentTreeOutline.appendChild(this._allUncaughtExceptionsBreakpointTreeElement);
</span><span class="cx"> 
</span><span class="lines">@@ -747,9 +751,10 @@
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    _breakpointTreeOutlineContextMenuTreeElement(event, treeElement)
</del><ins>+    _breakpointTreeOutlineContextMenuTreeElement(contextMenu, event, treeElement)
</ins><span class="cx">     {
</span><del>-        console.assert(treeElement instanceof WebInspector.ResourceTreeElement || treeElement instanceof WebInspector.ScriptTreeElement);
</del><ins>+        // This check is necessary since the context menu is created by the TreeOutline, meaning
+        // that any child could be the target of the context menu event.
</ins><span class="cx">         if (!(treeElement instanceof WebInspector.ResourceTreeElement) &amp;&amp; !(treeElement instanceof WebInspector.ScriptTreeElement))
</span><span class="cx">             return;
</span><span class="cx"> 
</span><span class="lines">@@ -764,7 +769,6 @@
</span><span class="cx">             this._toggleAllBreakpoints(breakpoints, shouldDisable);
</span><span class="cx">         };
</span><span class="cx"> 
</span><del>-        let contextMenu = WebInspector.ContextMenu.createFromEvent(event);
</del><span class="cx">         if (shouldDisable)
</span><span class="cx">             contextMenu.appendItem(WebInspector.UIString(&quot;Disable Breakpoints&quot;), toggleAllResourceBreakpoints);
</span><span class="cx">         else
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsFrameTreeElementjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/FrameTreeElement.js (211060 => 211061)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/FrameTreeElement.js        2017-01-23 21:41:23 UTC (rev 211060)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/FrameTreeElement.js        2017-01-23 22:24:01 UTC (rev 211061)
</span><span class="lines">@@ -108,8 +108,6 @@
</span><span class="cx">     {
</span><span class="cx">         // Immediate superclasses are skipped, since Frames handle their own SourceMapResources.
</span><span class="cx">         WebInspector.GeneralTreeElement.prototype.onattach.call(this);
</span><del>-
-        this.element.addEventListener(&quot;contextmenu&quot;, this._handleContextMenuEvent.bind(this));
</del><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Overrides from FolderizedTreeElement (Protected).
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsGeneralTreeElementjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/GeneralTreeElement.js (211060 => 211061)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/GeneralTreeElement.js        2017-01-23 21:41:23 UTC (rev 211060)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/GeneralTreeElement.js        2017-01-23 22:24:01 UTC (rev 211061)
</span><span class="lines">@@ -208,26 +208,8 @@
</span><span class="cx">         if (this._statusElement)
</span><span class="cx">             this._listItemNode.appendChild(this._statusElement);
</span><span class="cx">         this._listItemNode.appendChild(this._titlesElement);
</span><del>-
-        if (this.oncontextmenu &amp;&amp; typeof this.oncontextmenu === &quot;function&quot;) {
-            this._boundContextMenuEventHandler = this.oncontextmenu.bind(this);
-            this._listItemNode.addEventListener(&quot;contextmenu&quot;, this._boundContextMenuEventHandler);
-        }
-
-        if (!this._boundContextMenuEventHandler &amp;&amp; this.treeOutline.oncontextmenu &amp;&amp; typeof this.treeOutline.oncontextmenu === &quot;function&quot;) {
-            this._boundContextMenuEventHandler = (event) =&gt; { this.treeOutline.oncontextmenu(event, this); };
-            this._listItemNode.addEventListener(&quot;contextmenu&quot;, this._boundContextMenuEventHandler);
-        }
</del><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ondetach()
-    {
-        if (this._boundContextMenuEventHandler) {
-            this._listItemNode.removeEventListener(&quot;contextmenu&quot;, this._boundContextMenuEventHandler);
-            this._boundContextMenuEventHandler = null;
-        }
-    }
-
</del><span class="cx">     onreveal()
</span><span class="cx">     {
</span><span class="cx">         if (this._listItemNode)
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsObjectTreeBaseTreeElementjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ObjectTreeBaseTreeElement.js (211060 => 211061)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/ObjectTreeBaseTreeElement.js        2017-01-23 21:41:23 UTC (rev 211060)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ObjectTreeBaseTreeElement.js        2017-01-23 22:24:01 UTC (rev 211061)
</span><span class="lines">@@ -55,11 +55,6 @@
</span><span class="cx"> 
</span><span class="cx">     // Protected
</span><span class="cx"> 
</span><del>-    oncontextmenu(event)
-    {
-        this._contextMenuHandler(event);
-    }
-
</del><span class="cx">     resolvedValue()
</span><span class="cx">     {
</span><span class="cx">         console.assert(this._property);
</span><span class="lines">@@ -151,43 +146,13 @@
</span><span class="cx">         return setterElement;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Private
-
-    _logSymbolProperty()
</del><ins>+    populateContextMenu(contextMenu, event)
</ins><span class="cx">     {
</span><del>-        var symbol = this._property.symbol;
-        if (!symbol)
-            return;
-
-        var text = WebInspector.UIString(&quot;Selected Symbol&quot;);
-        WebInspector.consoleLogViewController.appendImmediateExecutionWithResult(text, symbol, true);
-    }
-
-    _logValue(value)
-    {
-        var resolvedValue = value || this.resolvedValue();
-        if (!resolvedValue)
-            return;
-
-        var propertyPath = this.resolvedValuePropertyPath();
-        var isImpossible = propertyPath.isFullPathImpossible();
-        var text = isImpossible ? WebInspector.UIString(&quot;Selected Value&quot;) : propertyPath.displayPath(this.propertyPathType());
-
-        if (!isImpossible)
-            WebInspector.quickConsole.prompt.pushHistoryItem(text);
-
-        WebInspector.consoleLogViewController.appendImmediateExecutionWithResult(text, resolvedValue, isImpossible);
-    }
-
-    _contextMenuHandler(event)
-    {
</del><span class="cx">         if (event.__addedObjectPreviewContextMenuItems)
</span><span class="cx">             return;
</span><span class="cx">         if (event.__addedObjectTreeContextMenuItems)
</span><span class="cx">             return;
</span><span class="cx"> 
</span><del>-        let contextMenu = WebInspector.ContextMenu.createFromEvent(event);
-
</del><span class="cx">         event.__addedObjectTreeContextMenuItems = true;
</span><span class="cx"> 
</span><span class="cx">         if (typeof this.treeOutline.objectTreeElementAddContextMenuItems === &quot;function&quot;) {
</span><span class="lines">@@ -215,8 +180,38 @@
</span><span class="cx">         contextMenu.appendSeparator();
</span><span class="cx"> 
</span><span class="cx">         this._appendMenusItemsForObject(contextMenu, resolvedValue);
</span><ins>+
+        super.populateContextMenu(contextMenu, event);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    // Private
+
+    _logSymbolProperty()
+    {
+        var symbol = this._property.symbol;
+        if (!symbol)
+            return;
+
+        var text = WebInspector.UIString(&quot;Selected Symbol&quot;);
+        WebInspector.consoleLogViewController.appendImmediateExecutionWithResult(text, symbol, true);
+    }
+
+    _logValue(value)
+    {
+        var resolvedValue = value || this.resolvedValue();
+        if (!resolvedValue)
+            return;
+
+        var propertyPath = this.resolvedValuePropertyPath();
+        var isImpossible = propertyPath.isFullPathImpossible();
+        var text = isImpossible ? WebInspector.UIString(&quot;Selected Value&quot;) : propertyPath.displayPath(this.propertyPathType());
+
+        if (!isImpossible)
+            WebInspector.quickConsole.prompt.pushHistoryItem(text);
+
+        WebInspector.consoleLogViewController.appendImmediateExecutionWithResult(text, resolvedValue, isImpossible);
+    }
+
</ins><span class="cx">     _appendMenusItemsForObject(contextMenu, resolvedValue)
</span><span class="cx">     {
</span><span class="cx">         if (resolvedValue.type === &quot;function&quot;) {
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsResourceTreeElementjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ResourceTreeElement.js (211060 => 211061)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/ResourceTreeElement.js        2017-01-23 21:41:23 UTC (rev 211060)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ResourceTreeElement.js        2017-01-23 22:24:01 UTC (rev 211061)
</span><span class="lines">@@ -89,13 +89,6 @@
</span><span class="cx">         return {text: [urlComponents.lastPathComponent, urlComponents.path, this._resource.url]};
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    onattach()
-    {
-        super.onattach();
-
-        this.element.addEventListener(&quot;contextmenu&quot;, this._handleContextMenuEvent.bind(this));
-    }
-
</del><span class="cx">     ondblclick()
</span><span class="cx">     {
</span><span class="cx">         InspectorFrontendHost.openInNewTab(this._resource.url);
</span><span class="lines">@@ -163,11 +156,11 @@
</span><span class="cx">             this.callFirstAncestorFunction(&quot;descendantResourceTreeElementMainTitleDidChange&quot;, [this, oldMainTitle]);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    _handleContextMenuEvent(event)
</del><ins>+    populateContextMenu(contextMenu, event)
</ins><span class="cx">     {
</span><del>-        let contextMenu = WebInspector.ContextMenu.createFromEvent(event);
</del><ins>+        WebInspector.appendContextMenuItemsForSourceCode(contextMenu, this._resource);
</ins><span class="cx"> 
</span><del>-        WebInspector.appendContextMenuItemsForSourceCode(contextMenu, this._resource);
</del><ins>+        super.populateContextMenu(contextMenu, event);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Private
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsThreadTreeElementjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.js (211060 => 211061)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.js        2017-01-23 21:41:23 UTC (rev 211060)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ThreadTreeElement.js        2017-01-23 22:24:01 UTC (rev 211061)
</span><span class="lines">@@ -108,14 +108,15 @@
</span><span class="cx">         this.expand();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    oncontextmenu(event)
</del><ins>+    populateContextMenu(contextMenu, event)
</ins><span class="cx">     {
</span><span class="cx">         let targetData = WebInspector.debuggerManager.dataForTarget(this._target);
</span><span class="cx"> 
</span><del>-        let contextMenu = WebInspector.ContextMenu.createFromEvent(event);
</del><span class="cx">         contextMenu.appendItem(WebInspector.UIString(&quot;Resume Thread&quot;), () =&gt; {
</span><span class="cx">             WebInspector.debuggerManager.continueUntilNextRunLoop(this._target);
</span><span class="cx">         }, !targetData.paused);
</span><ins>+
+        super.populateContextMenu(contextMenu, event);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Private
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsTreeElementjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/TreeElement.js (211060 => 211061)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/TreeElement.js        2017-01-23 21:41:23 UTC (rev 211060)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/TreeElement.js        2017-01-23 22:24:01 UTC (rev 211061)
</span><span class="lines">@@ -609,4 +609,14 @@
</span><span class="cx">         var left = this._listItemNode.totalOffsetLeft + computedLeftPadding;
</span><span class="cx">         return event.pageX &gt;= left &amp;&amp; event.pageX &lt;= left + this.arrowToggleWidth &amp;&amp; this.hasChildren;
</span><span class="cx">     }
</span><ins>+
+    populateContextMenu(contextMenu, event)
+    {
+        if (this.children.some((child) =&gt; child.hasChildren) || (this.hasChildren &amp;&amp; !this.children.length)) {
+            contextMenu.appendSeparator();
+
+            contextMenu.appendItem(WebInspector.UIString(&quot;Expand All&quot;), this.expandRecursively.bind(this));
+            contextMenu.appendItem(WebInspector.UIString(&quot;Collapse All&quot;), this.collapseRecursively.bind(this));
+        }
+    }
</ins><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsTreeOutlinejs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/TreeOutline.js (211060 => 211061)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/TreeOutline.js        2017-01-23 21:41:23 UTC (rev 211060)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/TreeOutline.js        2017-01-23 22:24:01 UTC (rev 211061)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx"> 
</span><span class="cx">         this.element = element || document.createElement(&quot;ol&quot;);
</span><span class="cx">         this.element.classList.add(WebInspector.TreeOutline.ElementStyleClassName);
</span><ins>+        this.element.addEventListener(&quot;contextmenu&quot;, this._handleContextmenu.bind(this));
</ins><span class="cx"> 
</span><span class="cx">         this.children = [];
</span><span class="cx">         this.selectedTreeElement = null;
</span><span class="lines">@@ -599,6 +600,38 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    // Protected
+
+    treeElementFromEvent(event)
+    {
+        let scrollContainer = this.element.parentElement;
+
+        // We choose this X coordinate based on the knowledge that our list
+        // items extend at least to the right edge of the outer &lt;ol&gt; container.
+        // In the no-word-wrap mode the outer &lt;ol&gt; may be wider than the tree container
+        // (and partially hidden), in which case we are left to use only its right boundary.
+        let x = scrollContainer.totalOffsetLeft + scrollContainer.offsetWidth - 36;
+        let y = event.pageY;
+
+        // Our list items have 1-pixel cracks between them vertically. We avoid
+        // the cracks by checking slightly above and slightly below the mouse
+        // and seeing if we hit the same element each time.
+        let elementUnderMouse = this.treeElementFromPoint(x, y);
+        let elementAboveMouse = this.treeElementFromPoint(x, y - 2);
+        let element = null;
+        if (elementUnderMouse === elementAboveMouse)
+            element = elementUnderMouse;
+        else
+            element = this.treeElementFromPoint(x, y + 2);
+
+        return element;
+    }
+
+    populateContextMenu(contextMenu, event, treeElement)
+    {
+        treeElement.populateContextMenu(contextMenu, event);
+    }
+
</ins><span class="cx">     // Private
</span><span class="cx"> 
</span><span class="cx">     static _generateStyleRulesIfNeeded()
</span><span class="lines">@@ -625,6 +658,16 @@
</span><span class="cx"> 
</span><span class="cx">         document.head.appendChild(WebInspector.TreeOutline._styleElement);
</span><span class="cx">     }
</span><ins>+
+    _handleContextmenu(event)
+    {
+        let treeElement = this.treeElementFromEvent(event);
+        if (!treeElement)
+            return;
+
+        let contextMenu = WebInspector.ContextMenu.createFromEvent(event);
+        this.populateContextMenu(contextMenu, event, treeElement);
+    }
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> WebInspector.TreeOutline._styleElement = null;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsVisualStyleSelectorTreeItemjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/VisualStyleSelectorTreeItem.js (211060 => 211061)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/VisualStyleSelectorTreeItem.js        2017-01-23 21:41:23 UTC (rev 211060)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/VisualStyleSelectorTreeItem.js        2017-01-23 22:24:01 UTC (rev 211061)
</span><span class="lines">@@ -93,7 +93,6 @@
</span><span class="cx"> 
</span><span class="cx">         this._listItemNode.addEventListener(&quot;mouseover&quot;, this._highlightNodesWithSelector.bind(this));
</span><span class="cx">         this._listItemNode.addEventListener(&quot;mouseout&quot;, this._hideDOMNodeHighlight.bind(this));
</span><del>-        this._listItemNode.addEventListener(&quot;contextmenu&quot;, this._handleContextMenuEvent.bind(this));
</del><span class="cx"> 
</span><span class="cx">         this._checkboxElement = document.createElement(&quot;input&quot;);
</span><span class="cx">         this._checkboxElement.type = &quot;checkbox&quot;;
</span><span class="lines">@@ -122,27 +121,8 @@
</span><span class="cx">         this._listItemNode.classList.remove(&quot;editable&quot;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Private
-
-    _highlightNodesWithSelector()
</del><ins>+    populateContextMenu(contextMenu, event)
</ins><span class="cx">     {
</span><del>-        if (!this.representedObject.ownerRule) {
-            WebInspector.domTreeManager.highlightDOMNode(this.representedObject.node.id);
-            return;
-        }
-
-        WebInspector.domTreeManager.highlightSelector(this.selectorText, this.representedObject.node.ownerDocument.frameIdentifier);
-    }
-
-    _hideDOMNodeHighlight()
-    {
-        WebInspector.domTreeManager.hideDOMNodeHighlight();
-    }
-
-    _handleContextMenuEvent(event)
-    {
-        let contextMenu = WebInspector.ContextMenu.createFromEvent(event);
-
</del><span class="cx">         contextMenu.appendItem(WebInspector.UIString(&quot;Copy Rule&quot;), () =&gt; {
</span><span class="cx">             InspectorFrontendHost.copyText(this.representedObject.generateCSSRuleString());
</span><span class="cx">         });
</span><span class="lines">@@ -213,8 +193,27 @@
</span><span class="cx">                 this.representedObject.nodeStyles.addRule(pseudoSelectors.join(&quot;, &quot;), styleText);
</span><span class="cx">             });
</span><span class="cx">         }
</span><ins>+
+        super.populateContextMenu(contextMenu, event);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    // Private
+
+    _highlightNodesWithSelector()
+    {
+        if (!this.representedObject.ownerRule) {
+            WebInspector.domTreeManager.highlightDOMNode(this.representedObject.node.id);
+            return;
+        }
+
+        WebInspector.domTreeManager.highlightSelector(this.selectorText, this.representedObject.node.ownerDocument.frameIdentifier);
+    }
+
+    _hideDOMNodeHighlight()
+    {
+        WebInspector.domTreeManager.hideDOMNodeHighlight();
+    }
+
</ins><span class="cx">     _handleCheckboxChanged(event)
</span><span class="cx">     {
</span><span class="cx">         this._updateCheckboxTitle();
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsWorkerTreeElementjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/WorkerTreeElement.js (211060 => 211061)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/WorkerTreeElement.js        2017-01-23 21:41:23 UTC (rev 211060)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/WorkerTreeElement.js        2017-01-23 22:24:01 UTC (rev 211061)
</span><span class="lines">@@ -100,6 +100,14 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    populateContextMenu(contextMenu, event)
+    {
+        // FIXME: &lt;https://webkit.org/b/164427&gt; Web Inspector: WorkerTarget's mainResource should be a Resource not a Script
+        WebInspector.appendContextMenuItemsForSourceCode(contextMenu, this.script.resource ? this.script.resource : this.script);
+
+        super.populateContextMenu(contextMenu, event);
+    }
+
</ins><span class="cx">     // Overrides from SourceCodeTreeElement.
</span><span class="cx"> 
</span><span class="cx">     updateSourceMapResources()
</span><span class="lines">@@ -122,8 +130,6 @@
</span><span class="cx">         // Handle our own SourceMapResources. Skip immediate superclasses.
</span><span class="cx"> 
</span><span class="cx">         WebInspector.GeneralTreeElement.prototype.onattach.call(this);
</span><del>-
-        this.element.addEventListener(&quot;contextmenu&quot;, this._handleContextMenuEvent.bind(this));
</del><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Overrides from FolderizedTreeElement
</span><span class="lines">@@ -144,14 +150,6 @@
</span><span class="cx"> 
</span><span class="cx">     // Private
</span><span class="cx"> 
</span><del>-    _handleContextMenuEvent(event)
-    {
-        let contextMenu = WebInspector.ContextMenu.createFromEvent(event);
-
-        // FIXME: &lt;https://webkit.org/b/164427&gt; Web Inspector: WorkerTarget's mainResource should be a Resource not a Script
-        WebInspector.appendContextMenuItemsForSourceCode(contextMenu, this.script.resource ? this.script.resource : this.script);
-    }
-
</del><span class="cx">     _scriptAdded(event)
</span><span class="cx">     {
</span><span class="cx">         let script = event.data.script;
</span></span></pre>
</div>
</div>

</body>
</html>