Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1041)

Unified Diff: third_party/WebKit/Source/devtools/front_end/components/DOMBreakpointsSidebarPane.js

Issue 2837203002: [DevTools] Move dom breakpoints to DOMDebuggerModel (Closed)
Patch Set: addressed review comments Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/devtools/front_end/components/DOMBreakpointsSidebarPane.js
diff --git a/third_party/WebKit/Source/devtools/front_end/components/DOMBreakpointsSidebarPane.js b/third_party/WebKit/Source/devtools/front_end/components/DOMBreakpointsSidebarPane.js
index 083ffbd255fef71fda729ee57b4a470f036bbf29..2b55e54369230202f0d3bb68280fa54e961f2c47 100644
--- a/third_party/WebKit/Source/devtools/front_end/components/DOMBreakpointsSidebarPane.js
+++ b/third_party/WebKit/Source/devtools/front_end/components/DOMBreakpointsSidebarPane.js
@@ -27,20 +27,32 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+
/**
* @implements {UI.ContextFlavorListener}
- * @unrestricted
*/
Components.DOMBreakpointsSidebarPane = class extends Components.BreakpointsSidebarPaneBase {
constructor() {
super();
- this._domBreakpointsSetting = Common.settings.createLocalSetting('domBreakpoints', []);
+ this.registerRequiredCSS('components/breakpointsList.css');
this.listElement.classList.add('dom-breakpoints-list');
- /** @type {!Map<string, !Element>} */
- this._breakpointElements = new Map();
+ /** @type {!Map<!SDK.DOMDebuggerModel.DOMBreakpoint, !Components.DOMBreakpointsSidebarPane.Item>} */
+ this._items = new Map();
+ SDK.targetManager.addModelListener(
+ SDK.DOMDebuggerModel, SDK.DOMDebuggerModel.Events.DOMBreakpointAdded, this._breakpointAdded, this);
+ SDK.targetManager.addModelListener(
+ SDK.DOMDebuggerModel, SDK.DOMDebuggerModel.Events.DOMBreakpointToggled, this._breakpointToggled, this);
+ SDK.targetManager.addModelListener(
+ SDK.DOMDebuggerModel, SDK.DOMDebuggerModel.Events.DOMBreakpointsRemoved, this._breakpointsRemoved, this);
+
+ for (var domDebuggerModel of SDK.targetManager.models(SDK.DOMDebuggerModel)) {
+ domDebuggerModel.retrieveDOMBreakpoints();
+ for (var breakpoint of domDebuggerModel.domBreakpoints())
+ this._addBreakpoint(breakpoint);
+ }
- SDK.targetManager.addModelListener(SDK.DOMModel, SDK.DOMModel.Events.NodeRemoved, this._nodeRemoved, this);
+ this._highlightedElement = null;
this._update();
}
@@ -50,225 +62,126 @@ Components.DOMBreakpointsSidebarPane = class extends Components.BreakpointsSideb
*/
static createBreakpointHitMessage(details) {
var messageWrapper = createElement('span');
+ var domDebuggerModel = details.debuggerModel.target().model(SDK.DOMDebuggerModel);
+ if (!details.auxData || !domDebuggerModel)
+ return messageWrapper;
+ var data = domDebuggerModel.resolveDOMBreakpointData(/** @type {!Object} */ (details.auxData));
+ if (!data)
+ return messageWrapper;
+
var mainElement = messageWrapper.createChild('div', 'status-main');
mainElement.appendChild(UI.Icon.create('smallicon-info', 'status-icon'));
- var auxData = /** @type {!Object} */ (details.auxData);
mainElement.appendChild(createTextNode(
- String.sprintf('Paused on %s', Components.DOMBreakpointsSidebarPane.BreakpointTypeNouns[auxData['type']])));
+ String.sprintf('Paused on %s', Components.DOMBreakpointsSidebarPane.BreakpointTypeNouns.get(data.type))));
- var domModel = details.debuggerModel.target().model(SDK.DOMModel);
- if (domModel) {
- var subElement = messageWrapper.createChild('div', 'status-sub monospace');
- var node = domModel.nodeForId(auxData['nodeId']);
- var linkifiedNode = Components.DOMPresentationUtils.linkifyNodeReference(node);
- subElement.appendChild(linkifiedNode);
+ var subElement = messageWrapper.createChild('div', 'status-sub monospace');
+ var linkifiedNode = Components.DOMPresentationUtils.linkifyNodeReference(data.node);
+ subElement.appendChild(linkifiedNode);
- var targetNode = auxData['targetNodeId'] ? domModel.nodeForId(auxData['targetNodeId']) : null;
- var targetNodeLink = targetNode ? Components.DOMPresentationUtils.linkifyNodeReference(targetNode) : '';
+ if (data.targetNode) {
+ var targetNodeLink = Components.DOMPresentationUtils.linkifyNodeReference(data.targetNode);
var message;
- if (auxData.type === Components.DOMBreakpointsSidebarPane.BreakpointTypes.SubtreeModified) {
- if (auxData['insertion'])
- message = targetNode === node ? 'Child %s added' : 'Descendant %s added';
- else
- message = 'Descendant %s removed';
- subElement.appendChild(createElement('br'));
- subElement.appendChild(UI.formatLocalized(message, [targetNodeLink]));
- }
- }
- return messageWrapper;
- }
-
- /**
- * @param {!SDK.DOMNode} node
- * @param {!UI.ContextMenu} contextMenu
- * @param {boolean} createSubMenu
- */
- populateNodeContextMenu(node, contextMenu, createSubMenu) {
- if (node.pseudoType())
- return;
-
- var nodeBreakpoints = this._nodeBreakpoints(node);
-
- /**
- * @param {!Protocol.DOMDebugger.DOMBreakpointType} type
- * @this {Components.DOMBreakpointsSidebarPane}
- */
- function toggleBreakpoint(type) {
- if (!nodeBreakpoints.has(type))
- this._setBreakpoint(node, type, true);
+ if (data.insertion)
+ message = data.targetNode === data.node ? 'Child %s added' : 'Descendant %s added';
else
- this._removeBreakpoint(node, type);
- this._saveBreakpoints();
+ message = 'Descendant %s removed';
+ subElement.appendChild(createElement('br'));
+ subElement.appendChild(UI.formatLocalized(message, [targetNodeLink]));
}
-
- var breakpointsMenu = createSubMenu ? contextMenu.appendSubMenuItem(Common.UIString('Break on...')) : contextMenu;
- for (var key in Components.DOMBreakpointsSidebarPane.BreakpointTypes) {
- var type = Components.DOMBreakpointsSidebarPane.BreakpointTypes[key];
- var label = Components.DOMBreakpointsSidebarPane.BreakpointTypeNouns[type];
- breakpointsMenu.appendCheckboxItem(label, toggleBreakpoint.bind(this, type), nodeBreakpoints.has(type));
- }
- }
-
- /**
- * @param {!SDK.DOMNode} node
- * @return {!Set<!Protocol.DOMDebugger.DOMBreakpointType>}
- */
- _nodeBreakpoints(node) {
- /** @type {!Set<!Protocol.DOMDebugger.DOMBreakpointType>} */
- var nodeBreakpoints = new Set();
- for (var element of this._breakpointElements.values()) {
- if (element._node === node && element._checkboxElement.checked)
- nodeBreakpoints.add(element._type);
- }
- return nodeBreakpoints;
+ return messageWrapper;
}
/**
- * @param {!SDK.DOMNode} node
- * @return {boolean}
+ * @param {!Common.Event} event
*/
- hasBreakpoints(node) {
- for (var element of this._breakpointElements.values()) {
- if (element._node === node && element._checkboxElement.checked)
- return true;
- }
- return false;
- }
-
- _nodeRemoved(event) {
- var node = event.data.node;
- this._removeBreakpointsForNode(event.data.node);
- var children = node.children();
- if (!children)
- return;
- for (var i = 0; i < children.length; ++i)
- this._removeBreakpointsForNode(children[i]);
- this._saveBreakpoints();
+ _breakpointAdded(event) {
+ this._addBreakpoint(/** @type {!SDK.DOMDebuggerModel.DOMBreakpoint} */ (event.data));
}
/**
- * @param {!SDK.DOMNode} node
+ * @param {!Common.Event} event
*/
- _removeBreakpointsForNode(node) {
- for (var element of this._breakpointElements.values()) {
- if (element._node === node)
- this._removeBreakpoint(element._node, element._type);
- }
+ _breakpointToggled(event) {
+ var breakpoint = /** @type {!SDK.DOMDebuggerModel.DOMBreakpoint} */ (event.data);
+ var item = this._items.get(breakpoint);
+ if (item)
+ item.checkbox.checked = breakpoint.enabled;
}
/**
- * @param {!SDK.DOMNode} node
- * @param {!Protocol.DOMDebugger.DOMBreakpointType} type
- * @param {boolean} enabled
+ * @param {!Common.Event} event
*/
- _setBreakpoint(node, type, enabled) {
- var breakpointId = this._createBreakpointId(node.id, type);
- var breakpointElement = this._breakpointElements.get(breakpointId);
- if (!breakpointElement) {
- breakpointElement = this._createBreakpointElement(node, type, enabled);
- this._breakpointElements.set(breakpointId, breakpointElement);
- } else {
- breakpointElement._checkboxElement.checked = enabled;
+ _breakpointsRemoved(event) {
+ var breakpoints = /** @type {!Array<!SDK.DOMDebuggerModel.DOMBreakpoint>} */ (event.data);
+ for (var breakpoint of breakpoints) {
+ var item = this._items.get(breakpoint);
+ if (item) {
+ this._items.delete(breakpoint);
+ this.removeListElement(item.element);
+ }
}
- if (enabled)
- node.domModel().target().domdebuggerAgent().setDOMBreakpoint(node.id, type);
- node.setMarker(Components.DOMBreakpointsSidebarPane.Marker, true);
}
/**
- * @param {!SDK.DOMNode} node
- * @param {!Protocol.DOMDebugger.DOMBreakpointType} type
- * @param {boolean} enabled
+ * @param {!SDK.DOMDebuggerModel.DOMBreakpoint} breakpoint
*/
- _createBreakpointElement(node, type, enabled) {
+ _addBreakpoint(breakpoint) {
var element = createElement('li');
- element._node = node;
- element._type = type;
- element.addEventListener('contextmenu', this._contextMenu.bind(this, node, type), true);
+ element.addEventListener('contextmenu', this._contextMenu.bind(this, breakpoint), true);
- var checkboxLabel = UI.CheckboxLabel.create('', enabled);
+ var checkboxLabel = UI.CheckboxLabel.create('', breakpoint.enabled);
var checkboxElement = checkboxLabel.checkboxElement;
- checkboxElement.addEventListener('click', this._checkboxClicked.bind(this, node, type), false);
- element._checkboxElement = checkboxElement;
+ checkboxElement.addEventListener('click', this._checkboxClicked.bind(this, breakpoint), false);
element.appendChild(checkboxLabel);
var labelElement = createElementWithClass('div', 'dom-breakpoint');
element.appendChild(labelElement);
- var linkifiedNode = Components.DOMPresentationUtils.linkifyNodeReference(node);
+ var linkifiedNode = Components.DOMPresentationUtils.linkifyNodeReference(breakpoint.node);
linkifiedNode.classList.add('monospace');
linkifiedNode.style.display = 'block';
labelElement.appendChild(linkifiedNode);
var description = createElement('div');
- description.textContent = Components.DOMBreakpointsSidebarPane.BreakpointTypeLabels[type];
+ description.textContent = Components.DOMBreakpointsSidebarPane.BreakpointTypeLabels.get(breakpoint.type);
labelElement.appendChild(description);
+ var item = {breakpoint: breakpoint, element: element, checkbox: checkboxElement};
+ element._item = item;
+ this._items.set(breakpoint, item);
+
var currentElement = this.listElement.firstChild;
while (currentElement) {
- if (currentElement._type && currentElement._type < element._type)
+ if (currentElement._item && currentElement._item.breakpoint.type < breakpoint.type)
break;
currentElement = currentElement.nextSibling;
}
this.addListElement(element, currentElement);
- return element;
- }
-
- _removeAllBreakpoints() {
- for (var element of this._breakpointElements.values())
- this._removeBreakpoint(element._node, element._type);
- this._saveBreakpoints();
- }
-
- /**
- * @param {!SDK.DOMNode} node
- * @param {!Protocol.DOMDebugger.DOMBreakpointType} type
- */
- _removeBreakpoint(node, type) {
- var breakpointId = this._createBreakpointId(node.id, type);
- var element = this._breakpointElements.get(breakpointId);
- if (!element)
- return;
-
- this.removeListElement(element);
- this._breakpointElements.delete(breakpointId);
- if (element._checkboxElement.checked)
- node.domModel().target().domdebuggerAgent().removeDOMBreakpoint(node.id, type);
- node.setMarker(Components.DOMBreakpointsSidebarPane.Marker, this.hasBreakpoints(node) ? true : null);
}
/**
- * @param {!SDK.DOMNode} node
- * @param {!Protocol.DOMDebugger.DOMBreakpointType} type
+ * @param {!SDK.DOMDebuggerModel.DOMBreakpoint} breakpoint
* @param {!Event} event
*/
- _contextMenu(node, type, event) {
+ _contextMenu(breakpoint, event) {
var contextMenu = new UI.ContextMenu(event);
-
- /**
- * @this {Components.DOMBreakpointsSidebarPane}
- */
- function removeBreakpoint() {
- this._removeBreakpoint(node, type);
- this._saveBreakpoints();
- }
- contextMenu.appendItem(Common.UIString.capitalize('Remove ^breakpoint'), removeBreakpoint.bind(this));
- contextMenu.appendItem(
- Common.UIString.capitalize('Remove ^all DOM breakpoints'), this._removeAllBreakpoints.bind(this));
+ contextMenu.appendItem(Common.UIString.capitalize('Remove ^breakpoint'), () => {
+ breakpoint.domDebuggerModel.removeDOMBreakpoint(breakpoint.node, breakpoint.type);
+ });
+ contextMenu.appendItem(Common.UIString.capitalize('Remove ^all DOM breakpoints'), () => {
+ breakpoint.domDebuggerModel.removeAllDOMBreakpoints();
+ });
contextMenu.show();
}
/**
- * @param {!SDK.DOMNode} node
- * @param {!Protocol.DOMDebugger.DOMBreakpointType} type
- * @param {!Event} event
+ * @param {!SDK.DOMDebuggerModel.DOMBreakpoint} breakpoint
*/
- _checkboxClicked(node, type, event) {
- if (event.target.checked)
- node.domModel().target().domdebuggerAgent().setDOMBreakpoint(node.id, type);
- else
- node.domModel().target().domdebuggerAgent().removeDOMBreakpoint(node.id, type);
- this._saveBreakpoints();
+ _checkboxClicked(breakpoint) {
+ var item = this._items.get(breakpoint);
+ if (!item)
+ return;
+ breakpoint.domDebuggerModel.toggleDOMBreakpoint(breakpoint, item.checkbox.checked);
}
/**
@@ -281,133 +194,82 @@ Components.DOMBreakpointsSidebarPane = class extends Components.BreakpointsSideb
_update() {
var details = UI.context.flavor(SDK.DebuggerPausedDetails);
- if (!details || details.reason !== SDK.DebuggerModel.BreakReason.DOM) {
+ if (!details || !details.auxData || details.reason !== SDK.DebuggerModel.BreakReason.DOM) {
if (this._highlightedElement) {
this._highlightedElement.classList.remove('breakpoint-hit');
delete this._highlightedElement;
}
return;
}
- var auxData = details.auxData;
- var breakpointId = this._createBreakpointId(auxData.nodeId, auxData.type);
- var element = this._breakpointElements.get(breakpointId);
+ var domDebuggerModel = details.debuggerModel.target().model(SDK.DOMDebuggerModel);
+ if (!domDebuggerModel)
+ return;
+ var data = domDebuggerModel.resolveDOMBreakpointData(/** @type {!Object} */ (details.auxData));
+ if (!data)
+ return;
+
+ var element = null;
+ for (var item of this._items.values()) {
+ if (item.breakpoint.node === data.node && item.breakpoint.type === data.type)
+ element = item.element;
+ }
if (!element)
return;
UI.viewManager.showView('sources.domBreakpoints');
element.classList.add('breakpoint-hit');
this._highlightedElement = element;
}
+};
- /**
- * @param {number} nodeId
- * @param {!Protocol.DOMDebugger.DOMBreakpointType} type
- */
- _createBreakpointId(nodeId, type) {
- return nodeId + ':' + type;
- }
+/** @typedef {!{element: !Element, checkbox: !Element, breakpoint: !SDK.DOMDebuggerModel.DOMBreakpoint}} */
+Components.DOMBreakpointsSidebarPane.Item;
- _saveBreakpoints() {
- var breakpoints = [];
- var storedBreakpoints = this._domBreakpointsSetting.get();
- for (var i = 0; i < storedBreakpoints.length; ++i) {
- var breakpoint = storedBreakpoints[i];
- if (breakpoint.url !== this._inspectedURL)
- breakpoints.push(breakpoint);
- }
- for (var element of this._breakpointElements.values()) {
- breakpoints.push({
- url: this._inspectedURL,
- path: element._node.path(),
- type: element._type,
- enabled: element._checkboxElement.checked
- });
- }
- this._domBreakpointsSetting.set(breakpoints);
- }
+Components.DOMBreakpointsSidebarPane.BreakpointTypeLabels = new Map([
+ [SDK.DOMDebuggerModel.DOMBreakpoint.Type.SubtreeModified, Common.UIString('Subtree Modified')],
+ [SDK.DOMDebuggerModel.DOMBreakpoint.Type.AttributeModified, Common.UIString('Attribute Modified')],
+ [SDK.DOMDebuggerModel.DOMBreakpoint.Type.NodeRemoved, Common.UIString('Node Removed')],
+]);
+
+Components.DOMBreakpointsSidebarPane.BreakpointTypeNouns = new Map([
+ [SDK.DOMDebuggerModel.DOMBreakpoint.Type.SubtreeModified, Common.UIString('subtree modifications')],
+ [SDK.DOMDebuggerModel.DOMBreakpoint.Type.AttributeModified, Common.UIString('attribute modifications')],
+ [SDK.DOMDebuggerModel.DOMBreakpoint.Type.NodeRemoved, Common.UIString('node removal')],
+]);
+/**
+ * @implements {UI.ContextMenu.Provider}
+ */
+Components.DOMBreakpointsSidebarPane.ContextMenuProvider = class {
/**
- * @param {!SDK.DOMDocument} domDocument
+ * @override
+ * @param {!Event} event
+ * @param {!UI.ContextMenu} contextMenu
+ * @param {!Object} object
*/
- restoreBreakpoints(domDocument) {
- this._breakpointElements.clear();
- this.reset();
- this._inspectedURL = domDocument.documentURL;
- var domModel = domDocument.domModel();
- /** @type {!Map<string, !Array<!Object>>} */
- var pathToBreakpoints = new Map();
+ appendApplicableItems(event, contextMenu, object) {
+ var node = /** @type {!SDK.DOMNode} */ (object);
+ if (node.pseudoType())
+ return;
+ var domDebuggerModel = node.domModel().target().model(SDK.DOMDebuggerModel);
+ if (!domDebuggerModel)
+ return;
/**
- * @param {string} path
- * @param {?Protocol.DOM.NodeId} nodeId
- * @this {Components.DOMBreakpointsSidebarPane}
+ * @param {!SDK.DOMDebuggerModel.DOMBreakpoint.Type} type
*/
- function didPushNodeByPathToFrontend(path, nodeId) {
- var node = nodeId ? domModel.nodeForId(nodeId) : null;
- if (!node)
- return;
-
- var breakpoints = pathToBreakpoints.get(path);
- for (var i = 0; i < breakpoints.length; ++i)
- this._setBreakpoint(node, breakpoints[i].type, breakpoints[i].enabled);
+ function toggleBreakpoint(type) {
+ if (domDebuggerModel.hasDOMBreakpoint(node, type))
+ domDebuggerModel.removeDOMBreakpoint(node, type);
+ else
+ domDebuggerModel.setDOMBreakpoint(node, type);
}
- var breakpoints = this._domBreakpointsSetting.get();
- for (var i = 0; i < breakpoints.length; ++i) {
- var breakpoint = breakpoints[i];
- if (breakpoint.url !== this._inspectedURL)
- continue;
- var path = breakpoint.path;
- if (!pathToBreakpoints.has(path)) {
- pathToBreakpoints.set(path, []);
- domModel.pushNodeByPathToFrontend(path, didPushNodeByPathToFrontend.bind(this, path));
- }
- pathToBreakpoints.get(path).push(breakpoint);
+ var breakpointsMenu = contextMenu.appendSubMenuItem(Common.UIString('Break on...'));
+ for (var key in SDK.DOMDebuggerModel.DOMBreakpoint.Type) {
+ var type = SDK.DOMDebuggerModel.DOMBreakpoint.Type[key];
+ var label = Components.DOMBreakpointsSidebarPane.BreakpointTypeNouns.get(type);
+ breakpointsMenu.appendCheckboxItem(
+ label, toggleBreakpoint.bind(null, type), domDebuggerModel.hasDOMBreakpoint(node, type));
}
}
};
-
-Components.DOMBreakpointsSidebarPane.BreakpointTypes = {
- SubtreeModified: 'subtree-modified',
- AttributeModified: 'attribute-modified',
- NodeRemoved: 'node-removed'
-};
-
-Components.DOMBreakpointsSidebarPane.BreakpointTypeLabels = {
- 'subtree-modified': Common.UIString('Subtree Modified'),
- 'attribute-modified': Common.UIString('Attribute Modified'),
- 'node-removed': Common.UIString('Node Removed')
-};
-
-Components.DOMBreakpointsSidebarPane.BreakpointTypeNouns = {
- 'subtree-modified': Common.UIString('subtree modifications'),
- 'attribute-modified': Common.UIString('attribute modifications'),
- 'node-removed': Common.UIString('node removal')
-};
-
-Components.DOMBreakpointsSidebarPane.Marker = 'breakpoint-marker';
-
-
-/**
- * @unrestricted
- */
-Components.DOMBreakpointsSidebarPane.Proxy = class extends UI.VBox {
- constructor() {
- super();
- this.registerRequiredCSS('components/breakpointsList.css');
- }
-
- /**
- * @override
- */
- wasShown() {
- super.wasShown();
- var pane = Components.domBreakpointsSidebarPane;
- if (pane.element.parentNode !== this.element)
- pane.show(this.element);
- }
-};
-
-/**
- * @type {!Components.DOMBreakpointsSidebarPane}
- */
-Components.domBreakpointsSidebarPane;

Powered by Google App Engine
This is Rietveld 408576698