12daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch/* 22daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Copyright (C) 2011 Google Inc. All rights reserved. 32daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 42daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Redistribution and use in source and binary forms, with or without 52daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * modification, are permitted provided that the following conditions are 62daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * met: 72daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 82daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * * Redistributions of source code must retain the above copyright 92daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * notice, this list of conditions and the following disclaimer. 102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * * Redistributions in binary form must reproduce the above 112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * copyright notice, this list of conditions and the following disclaimer 122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * in the documentation and/or other materials provided with the 132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * distribution. 142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * * Neither the name of Google Inc. nor the names of its 152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * contributors may be used to endorse or promote products derived from 162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * this software without specific prior written permission. 172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * 182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch */ 302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochWebInspector.DOMBreakpointsSidebarPane = function() 322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{ 332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WebInspector.NativeBreakpointsSidebarPane.call(this, WebInspector.UIString("DOM Breakpoints")); 342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._breakpointElements = {}; 362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._breakpointTypes = { 382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch SubtreeModified: 0, 392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch AttributeModified: 1, 402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch NodeRemoved: 2 412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch }; 422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._breakpointTypeLabels = [ 432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WebInspector.UIString("Subtree Modified"), 442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WebInspector.UIString("Attribute Modified"), 452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WebInspector.UIString("Node Removed") 462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ]; 472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._contextMenuLabels = [ 482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WebInspector.UIString("Break on Subtree Modifications"), 492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WebInspector.UIString("Break on Attributes Modifications"), 502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WebInspector.UIString("Break on Node Removal") 512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ]; 522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochWebInspector.DOMBreakpointsSidebarPane.prototype = { 552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch setInspectedURL: function(url) 562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._reset(); 582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._inspectedURL = url.removeURLFragment(); 592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch }, 602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch populateNodeContextMenu: function(node, contextMenu) 622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var nodeBreakpoints = {}; 642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for (var id in this._breakpointElements) { 652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var element = this._breakpointElements[id]; 662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (element._node === node) 672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch nodeBreakpoints[element._type] = true; 682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch function toggleBreakpoint(type) 712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!nodeBreakpoints[type]) 732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._setBreakpoint(node, type, true); 742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch else 752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._removeBreakpoint(node, type); 762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._saveBreakpoints(); 772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for (var type = 0; type < 3; ++type) { 802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var label = this._contextMenuLabels[type]; 812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch contextMenu.appendCheckboxItem(label, toggleBreakpoint.bind(this, type), nodeBreakpoints[type]); 822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch }, 842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch createBreakpointHitStatusMessage: function(eventData, callback) 862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (eventData.type === this._breakpointTypes.SubtreeModified) { 882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var targetNodeObject = WebInspector.RemoteObject.fromPayload(eventData.targetNode); 892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch function didPushNodeToFrontend(targetNodeId) 902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (targetNodeId) 922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch targetNodeObject.release(); 932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._doCreateBreakpointHitStatusMessage(eventData, targetNodeId, callback); 942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch targetNodeObject.pushNodeToFrontend(didPushNodeToFrontend.bind(this)); 962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } else 972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._doCreateBreakpointHitStatusMessage(eventData, null, callback); 982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch }, 992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _doCreateBreakpointHitStatusMessage: function (eventData, targetNodeId, callback) 1012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 1022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var message; 1032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var typeLabel = this._breakpointTypeLabels[eventData.type]; 1042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var linkifiedNode = WebInspector.panels.elements.linkifyNodeById(eventData.nodeId); 1052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var substitutions = [typeLabel, linkifiedNode]; 1062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var targetNode = ""; 1072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (targetNodeId) 1082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch targetNode = WebInspector.panels.elements.linkifyNodeById(targetNodeId); 1092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (eventData.type === this._breakpointTypes.SubtreeModified) { 1112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (eventData.insertion) { 1122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (targetNodeId !== eventData.nodeId) { 1132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch message = "Paused on a \"%s\" breakpoint set on %s, because a new child was added to its descendant %s."; 1142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch substitutions.push(targetNode); 1152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } else 1162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch message = "Paused on a \"%s\" breakpoint set on %s, because a new child was added to that node."; 1172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } else { 1182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch message = "Paused on a \"%s\" breakpoint set on %s, because its descendant %s was removed."; 1192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch substitutions.push(targetNode); 1202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } else 1222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch message = "Paused on a \"%s\" breakpoint set on %s."; 1232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var element = document.createElement("span"); 1252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var formatters = { 1262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch s: function(substitution) 1272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 1282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return substitution; 1292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch }; 1312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch function append(a, b) 1322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 1332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (typeof b === "string") 1342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch b = document.createTextNode(b); 1352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch element.appendChild(b); 1362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WebInspector.formatLocalized(message, substitutions, formatters, "", append); 1382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch callback(element); 1402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch }, 1412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch nodeRemoved: function(node) 1432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 1442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._removeBreakpointsForNode(node); 1452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!node.children) 1462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 1472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for (var i = 0; i < node.children.length; ++i) 1482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._removeBreakpointsForNode(node.children[i]); 1492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._saveBreakpoints(); 1502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch }, 1512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _removeBreakpointsForNode: function(node) 1532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 1542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for (var id in this._breakpointElements) { 1552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var element = this._breakpointElements[id]; 1562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (element._node === node) 1572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._removeBreakpoint(element._node, element._type); 1582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch }, 1602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _setBreakpoint: function(node, type, enabled) 1622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 1632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var breakpointId = this._createBreakpointId(node.id, type); 1642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (breakpointId in this._breakpointElements) 1652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 1662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var element = document.createElement("li"); 1682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch element._node = node; 1692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch element._type = type; 1702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch element.addEventListener("contextmenu", this._contextMenu.bind(this, node, type), true); 1712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var checkboxElement = document.createElement("input"); 1732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch checkboxElement.className = "checkbox-elem"; 1742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch checkboxElement.type = "checkbox"; 1752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch checkboxElement.checked = enabled; 1762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch checkboxElement.addEventListener("click", this._checkboxClicked.bind(this, node, type), false); 1772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch element._checkboxElement = checkboxElement; 1782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch element.appendChild(checkboxElement); 1792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var labelElement = document.createElement("span"); 1812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch element.appendChild(labelElement); 1822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var linkifiedNode = WebInspector.panels.elements.linkifyNodeById(node.id); 1842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch linkifiedNode.addStyleClass("monospace"); 1852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch labelElement.appendChild(linkifiedNode); 1862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var description = document.createElement("div"); 1882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch description.className = "source-text"; 1892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch description.textContent = this._breakpointTypeLabels[type]; 1902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch labelElement.appendChild(description); 1912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var currentElement = this.listElement.firstChild; 1932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch while (currentElement) { 1942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (currentElement._type && currentElement._type < element._type) 1952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch break; 1962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch currentElement = currentElement.nextSibling; 1972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 1982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._addListElement(element, currentElement); 1992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._breakpointElements[breakpointId] = element; 2002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (enabled) 2012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch BrowserDebuggerAgent.setDOMBreakpoint(node.id, type); 2022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch }, 2032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _removeBreakpoint: function(node, type) 2052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var breakpointId = this._createBreakpointId(node.id, type); 2072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var element = this._breakpointElements[breakpointId]; 2082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!element) 2092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 2102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._removeListElement(element); 2122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch delete this._breakpointElements[breakpointId]; 2132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (element._checkboxElement.checked) 2142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch BrowserDebuggerAgent.removeDOMBreakpoint(node.id, type); 2152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch }, 2162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _contextMenu: function(node, type, event) 2182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var contextMenu = new WebInspector.ContextMenu(); 2202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch function removeBreakpoint() 2212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._removeBreakpoint(node, type); 2232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._saveBreakpoints(); 2242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch contextMenu.appendItem(WebInspector.UIString("Remove Breakpoint"), removeBreakpoint.bind(this)); 2262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch contextMenu.show(event); 2272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch }, 2282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _checkboxClicked: function(node, type, event) 2302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (event.target.checked) 2322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch BrowserDebuggerAgent.setDOMBreakpoint(node.id, type); 2332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch else 2342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch BrowserDebuggerAgent.removeDOMBreakpoint(node.id, type); 2352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._saveBreakpoints(); 2362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch }, 2372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch highlightBreakpoint: function(eventData) 2392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var breakpointId = this._createBreakpointId(eventData.nodeId, eventData.type); 2412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var element = this._breakpointElements[breakpointId]; 2422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!element) 2432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 2442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this.expanded = true; 2452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch element.addStyleClass("breakpoint-hit"); 2462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._highlightedElement = element; 2472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch }, 2482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch clearBreakpointHighlight: function() 2502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (this._highlightedElement) { 2522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._highlightedElement.removeStyleClass("breakpoint-hit"); 2532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch delete this._highlightedElement; 2542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch }, 2562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _createBreakpointId: function(nodeId, type) 2582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return nodeId + ":" + type; 2602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch }, 2612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch _saveBreakpoints: function() 2632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var breakpoints = []; 2652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var storedBreakpoints = WebInspector.settings.domBreakpoints; 2662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for (var i = 0; i < storedBreakpoints.length; ++i) { 2672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var breakpoint = storedBreakpoints[i]; 2682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (breakpoint.url !== this._inspectedURL) 2692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch breakpoints.push(breakpoint); 2702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for (var id in this._breakpointElements) { 2722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var element = this._breakpointElements[id]; 2732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch breakpoints.push({ url: this._inspectedURL, path: element._node.path(), type: element._type, enabled: element._checkboxElement.checked }); 2742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WebInspector.settings.domBreakpoints = breakpoints; 2762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch }, 2772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch restoreBreakpoints: function() 2792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var pathToBreakpoints = {}; 2812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch function didPushNodeByPathToFrontend(path, nodeId) 2832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 2842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var node = WebInspector.domAgent.nodeForId(nodeId); 2852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!node) 2862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return; 2872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var breakpoints = pathToBreakpoints[path]; 2892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for (var i = 0; i < breakpoints.length; ++i) 2902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch this._setBreakpoint(node, breakpoints[i].type, breakpoints[i].enabled); 2912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 2922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var breakpoints = WebInspector.settings.domBreakpoints; 2942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch for (var i = 0; i < breakpoints.length; ++i) { 2952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var breakpoint = breakpoints[i]; 2962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (breakpoint.url !== this._inspectedURL) 2972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch continue; 2982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch var path = breakpoint.path; 2992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if (!pathToBreakpoints[path]) { 3002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch pathToBreakpoints[path] = []; 3012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch WebInspector.domAgent.pushNodeByPathToFrontend(path, didPushNodeByPathToFrontend.bind(this, path)); 3022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch pathToBreakpoints[path].push(breakpoint); 3042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 3062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch} 3072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 3082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochWebInspector.DOMBreakpointsSidebarPane.prototype.__proto__ = WebInspector.NativeBreakpointsSidebarPane.prototype; 309