15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/**
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @constructor
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * @extends {WebInspector.NativeBreakpointsSidebarPane}
34a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch * @implements {WebInspector.TargetManager.Observer}
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.DOMBreakpointsSidebarPane = function()
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    WebInspector.NativeBreakpointsSidebarPane.call(this, WebInspector.UIString("DOM Breakpoints"));
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._breakpointElements = {};
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._breakpointTypes = {
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SubtreeModified: "subtree-modified",
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        AttributeModified: "attribute-modified",
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NodeRemoved: "node-removed"
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._breakpointTypeLabels = {};
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._breakpointTypeLabels[this._breakpointTypes.SubtreeModified] = WebInspector.UIString("Subtree Modified");
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._breakpointTypeLabels[this._breakpointTypes.AttributeModified] = WebInspector.UIString("Attribute Modified");
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._breakpointTypeLabels[this._breakpointTypes.NodeRemoved] = WebInspector.UIString("Node Removed");
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._contextMenuLabels = {};
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._contextMenuLabels[this._breakpointTypes.SubtreeModified] = WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Subtree modifications" : "Subtree Modifications");
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._contextMenuLabels[this._breakpointTypes.AttributeModified] = WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Attributes modifications" : "Attributes Modifications");
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    this._contextMenuLabels[this._breakpointTypes.NodeRemoved] = WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Node removal" : "Node Removal");
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    WebInspector.targetManager.observeTargets(this);
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebInspector.DOMBreakpointsSidebarPane.prototype = {
61a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    /**
62a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     * @param {!WebInspector.Target} target
63a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     */
64a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    targetAdded: function(target)
65a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    {
66a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        target.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.InspectedURLChanged, this._inspectedURLChanged, this);
67a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        target.domModel.addEventListener(WebInspector.DOMModel.Events.NodeRemoved, this._nodeRemoved, this);
68a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    },
69a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
70a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    /**
71a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     * @param {!WebInspector.Target} target
72a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     */
73a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    targetRemoved: function(target)
74a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    {
75a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        target.resourceTreeModel.removeEventListener(WebInspector.ResourceTreeModel.EventTypes.InspectedURLChanged, this._inspectedURLChanged, this);
76a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        target.domModel.removeEventListener(WebInspector.DOMModel.Events.NodeRemoved, this._nodeRemoved, this);
77a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    },
78a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _inspectedURLChanged: function(event)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._breakpointElements = {};
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._reset();
83a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        var url = /** @type {string} */ (event.data);
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._inspectedURL = url.removeURLFragment();
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
87a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    /**
88a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.DOMNode} node
89a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.ContextMenu} contextMenu
90a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     */
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    populateNodeContextMenu: function(node, contextMenu)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        if (node.pseudoType())
9406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)            return;
9506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var nodeBreakpoints = {};
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var id in this._breakpointElements) {
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var element = this._breakpointElements[id];
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (element._node === node)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                nodeBreakpoints[element._type] = true;
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        /**
10409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @param {string} type
10509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.DOMBreakpointsSidebarPane}
10609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         */
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function toggleBreakpoint(type)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!nodeBreakpoints[type])
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this._setBreakpoint(node, type, true);
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            else
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this._removeBreakpoint(node, type);
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._saveBreakpoints();
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var breakPointSubMenu = contextMenu.appendSubMenuItem(WebInspector.UIString("Break on..."));
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var key in this._breakpointTypes) {
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var type = this._breakpointTypes[key];
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var label = this._contextMenuLabels[type];
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            breakPointSubMenu.appendCheckboxItem(label, toggleBreakpoint.bind(this, type), nodeBreakpoints[type]);
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
124aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    /**
125aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch     * @param {!WebInspector.DebuggerPausedDetails} details
126f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     * @param {function(!Element)} callback
127aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch     */
128aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    createBreakpointHitStatusMessage: function(details, callback)
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
130a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var auxData = /** @type {!Object} */ (details.auxData);
131a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var domModel = details.target().domModel;
132a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (auxData.type === this._breakpointTypes.SubtreeModified) {
133a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            var targetNodeObject = details.target().runtimeModel.createRemoteObject(auxData["targetNode"]);
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            targetNodeObject.pushNodeToFrontend(didPushNodeToFrontend.bind(this));
135a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        } else {
136a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            this._doCreateBreakpointHitStatusMessage(auxData, domModel.nodeForId(auxData.nodeId), null, callback);
137a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        }
138a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
139a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        /**
140a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch         * @param {?WebInspector.DOMNode} targetNode
14109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.DOMBreakpointsSidebarPane}
142a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)         */
143a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        function didPushNodeToFrontend(targetNode)
144a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        {
145a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            if (targetNode)
146a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)                targetNodeObject.release();
147a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            this._doCreateBreakpointHitStatusMessage(auxData, domModel.nodeForId(auxData.nodeId), targetNode, callback);
148a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        }
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
151a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    /**
152a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     * @param {!Object} auxData
15310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch     * @param {?WebInspector.DOMNode} node
154a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     * @param {?WebInspector.DOMNode} targetNode
155f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     * @param {function(!Element)} callback
156a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     */
157a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    _doCreateBreakpointHitStatusMessage: function(auxData, node, targetNode, callback)
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var message;
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var typeLabel = this._breakpointTypeLabels[auxData.type];
161a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var linkifiedNode = WebInspector.DOMPresentationUtils.linkifyNodeReference(node);
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var substitutions = [typeLabel, linkifiedNode];
163a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var targetNodeLink = "";
164a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        if (targetNode)
165a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            targetNodeLink = WebInspector.DOMPresentationUtils.linkifyNodeReference(targetNode);
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (auxData.type === this._breakpointTypes.SubtreeModified) {
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (auxData.insertion) {
169a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                if (targetNode !== node) {
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    message = "Paused on a \"%s\" breakpoint set on %s, because a new child was added to its descendant %s.";
171a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                    substitutions.push(targetNodeLink);
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                } else
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    message = "Paused on a \"%s\" breakpoint set on %s, because a new child was added to that node.";
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } else {
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                message = "Paused on a \"%s\" breakpoint set on %s, because its descendant %s was removed.";
176a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                substitutions.push(targetNodeLink);
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            message = "Paused on a \"%s\" breakpoint set on %s.";
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var element = document.createElement("span");
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var formatters = {
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s: function(substitution)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            {
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return substitution;
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        };
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function append(a, b)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (typeof b === "string")
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                b = document.createTextNode(b);
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            element.appendChild(b);
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.formatLocalized(message, substitutions, formatters, "", append);
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        callback(element);
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _nodeRemoved: function(event)
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var node = event.data.node;
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._removeBreakpointsForNode(event.data.node);
2035267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        var children = node.children();
2045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        if (!children)
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
2065267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        for (var i = 0; i < children.length; ++i)
2075267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            this._removeBreakpointsForNode(children[i]);
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._saveBreakpoints();
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _removeBreakpointsForNode: function(node)
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var id in this._breakpointElements) {
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var element = this._breakpointElements[id];
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (element._node === node)
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this._removeBreakpoint(element._node, element._type);
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _setBreakpoint: function(node, type, enabled)
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var breakpointId = this._createBreakpointId(node.id, type);
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (breakpointId in this._breakpointElements)
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var element = document.createElement("li");
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element._node = node;
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element._type = type;
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.addEventListener("contextmenu", this._contextMenu.bind(this, node, type), true);
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var checkboxElement = document.createElement("input");
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        checkboxElement.className = "checkbox-elem";
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        checkboxElement.type = "checkbox";
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        checkboxElement.checked = enabled;
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        checkboxElement.addEventListener("click", this._checkboxClicked.bind(this, node, type), false);
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element._checkboxElement = checkboxElement;
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.appendChild(checkboxElement);
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var labelElement = document.createElement("span");
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element.appendChild(labelElement);
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
242a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        var linkifiedNode = WebInspector.DOMPresentationUtils.linkifyNodeReference(node);
243a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        linkifiedNode.classList.add("monospace");
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        labelElement.appendChild(linkifiedNode);
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var description = document.createElement("div");
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        description.className = "source-text";
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        description.textContent = this._breakpointTypeLabels[type];
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        labelElement.appendChild(description);
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var currentElement = this.listElement.firstChild;
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while (currentElement) {
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (currentElement._type && currentElement._type < element._type)
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                break;
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            currentElement = currentElement.nextSibling;
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._addListElement(element, currentElement);
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._breakpointElements[breakpointId] = element;
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (enabled)
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            DOMDebuggerAgent.setDOMBreakpoint(node.id, type);
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _removeAllBreakpoints: function()
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var id in this._breakpointElements) {
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var element = this._breakpointElements[id];
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._removeBreakpoint(element._node, element._type);
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._saveBreakpoints();
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _removeBreakpoint: function(node, type)
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var breakpointId = this._createBreakpointId(node.id, type);
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var element = this._breakpointElements[breakpointId];
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!element)
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._removeListElement(element);
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        delete this._breakpointElements[breakpointId];
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (element._checkboxElement.checked)
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            DOMDebuggerAgent.removeDOMBreakpoint(node.id, type);
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _contextMenu: function(node, type, event)
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var contextMenu = new WebInspector.ContextMenu(event);
28809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
28909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        /**
29009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.DOMBreakpointsSidebarPane}
29109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         */
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function removeBreakpoint()
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._removeBreakpoint(node, type);
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            this._saveBreakpoints();
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
297926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Remove breakpoint" : "Remove Breakpoint"), removeBreakpoint.bind(this));
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Remove all DOM breakpoints" : "Remove All DOM Breakpoints"), this._removeAllBreakpoints.bind(this));
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        contextMenu.show();
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _checkboxClicked: function(node, type, event)
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (event.target.checked)
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            DOMDebuggerAgent.setDOMBreakpoint(node.id, type);
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            DOMDebuggerAgent.removeDOMBreakpoint(node.id, type);
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._saveBreakpoints();
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    highlightBreakpoint: function(auxData)
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var breakpointId = this._createBreakpointId(auxData.nodeId, auxData.type);
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var element = this._breakpointElements[breakpointId];
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!element)
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return;
317926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this.expand();
318a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        element.classList.add("breakpoint-hit");
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        this._highlightedElement = element;
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearBreakpointHighlight: function()
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (this._highlightedElement) {
325a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            this._highlightedElement.classList.remove("breakpoint-hit");
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            delete this._highlightedElement;
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _createBreakpointId: function(nodeId, type)
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return nodeId + ":" + type;
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    _saveBreakpoints: function()
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var breakpoints = [];
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var storedBreakpoints = WebInspector.settings.domBreakpoints.get();
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < storedBreakpoints.length; ++i) {
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var breakpoint = storedBreakpoints[i];
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (breakpoint.url !== this._inspectedURL)
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                breakpoints.push(breakpoint);
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var id in this._breakpointElements) {
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var element = this._breakpointElements[id];
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            breakpoints.push({ url: this._inspectedURL, path: element._node.path(), type: element._type, enabled: element._checkboxElement.checked });
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WebInspector.settings.domBreakpoints.set(breakpoints);
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
351a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    /**
352a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     * @param {!WebInspector.Target} target
353a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch     */
354a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    restoreBreakpoints: function(target)
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var pathToBreakpoints = {};
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3583c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        /**
3593c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch         * @param {string} path
3603c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch         * @param {?DOMAgent.NodeId} nodeId
36109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)         * @this {WebInspector.DOMBreakpointsSidebarPane}
3623c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch         */
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        function didPushNodeByPathToFrontend(path, nodeId)
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
365a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            var node = nodeId ? target.domModel.nodeForId(nodeId) : null;
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!node)
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return;
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var breakpoints = pathToBreakpoints[path];
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (var i = 0; i < breakpoints.length; ++i)
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                this._setBreakpoint(node, breakpoints[i].type, breakpoints[i].enabled);
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        var breakpoints = WebInspector.settings.domBreakpoints.get();
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (var i = 0; i < breakpoints.length; ++i) {
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var breakpoint = breakpoints[i];
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (breakpoint.url !== this._inspectedURL)
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                continue;
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            var path = breakpoint.path;
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (!pathToBreakpoints[path]) {
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                pathToBreakpoints[path] = [];
382a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                target.domModel.pushNodeByPathToFrontend(path, didPushNodeByPathToFrontend.bind(this, path));
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            pathToBreakpoints[path].push(breakpoint);
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    },
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
388926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
389a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)     * @param {!WebInspector.Panel} panel
39009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)     * @return {!WebInspector.DOMBreakpointsSidebarPane.Proxy}
391926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
392926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    createProxy: function(panel)
393926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
394926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var proxy = new WebInspector.DOMBreakpointsSidebarPane.Proxy(this, panel);
395926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (!this._proxies)
396926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._proxies = [];
397926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._proxies.push(proxy);
398926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return proxy;
399926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
400926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
401926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    onContentReady: function()
402926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
403926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (var i = 0; i != this._proxies.length; i++)
404926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._proxies[i].onContentReady();
405926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
406926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    __proto__: WebInspector.NativeBreakpointsSidebarPane.prototype
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
409926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
410926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/**
411926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @constructor
412926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @extends {WebInspector.SidebarPane}
413a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.DOMBreakpointsSidebarPane} pane
414a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) * @param {!WebInspector.Panel} panel
415926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
416926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.DOMBreakpointsSidebarPane.Proxy = function(pane, panel)
417926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
418926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebInspector.View._assert(!pane.titleElement.firstChild, "Cannot create proxy for a sidebar pane with a toolbar");
419926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
420926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebInspector.SidebarPane.call(this, pane.title());
42153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    this.registerRequiredCSS("breakpointsList.css");
422926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
423926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._wrappedPane = pane;
424926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._panel = panel;
425926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
426591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    this.bodyElement.remove();
427926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this.bodyElement = this._wrappedPane.bodyElement;
428926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
429926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
430926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.DOMBreakpointsSidebarPane.Proxy.prototype = {
431926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    expand: function()
432926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
433926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._wrappedPane.expand();
434926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
435926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
436926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    onContentReady: function()
437926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
438f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        if (this._panel.isShowing())
439f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            this._reattachBody();
440926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
441926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        WebInspector.SidebarPane.prototype.onContentReady.call(this);
442926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
443926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
444926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    wasShown: function()
445926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
446926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        WebInspector.SidebarPane.prototype.wasShown.call(this);
447926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._reattachBody();
448926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
449926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
450926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _reattachBody: function()
451926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
452926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (this.bodyElement.parentNode !== this.element)
453926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this.element.appendChild(this.bodyElement);
454926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
455926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
456926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    __proto__: WebInspector.SidebarPane.prototype
457926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
458926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
459926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/**
46009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) * @type {!WebInspector.DOMBreakpointsSidebarPane}
461926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
46209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebInspector.domBreakpointsSidebarPane;
463