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