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

Unified Diff: third_party/WebKit/Source/devtools/front_end/sdk/DOMDebuggerModel.js

Issue 2837203002: [DevTools] Move dom breakpoints to DOMDebuggerModel (Closed)
Patch Set: 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/sdk/DOMDebuggerModel.js
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/DOMDebuggerModel.js b/third_party/WebKit/Source/devtools/front_end/sdk/DOMDebuggerModel.js
index a87bea1562d2bd775c539fd7617ba28029426874..3c9c69b243eab1c2ed42f17f07573d1dd7992277 100644
--- a/third_party/WebKit/Source/devtools/front_end/sdk/DOMDebuggerModel.js
+++ b/third_party/WebKit/Source/devtools/front_end/sdk/DOMDebuggerModel.js
@@ -11,6 +11,14 @@ SDK.DOMDebuggerModel = class extends SDK.SDKModel {
this._agent = target.domdebuggerAgent();
this._runtimeModel = /** @type {!SDK.RuntimeModel} */ (target.model(SDK.RuntimeModel));
this._domModel = /** @type {!SDK.DOMModel} */ (target.model(SDK.DOMModel));
+ this._domModel.addEventListener(SDK.DOMModel.Events.DocumentUpdated, this._documentUpdated, this);
+ this._domModel.addEventListener(SDK.DOMModel.Events.NodeRemoved, this._nodeRemoved, this);
+
+ /** @type {!Array<!SDK.DOMDebuggerModel.DOMBreakpoint>} */
+ this._domBreakpoints = [];
+ this._domBreakpointsSetting = Common.settings.createLocalSetting('domBreakpoints', []);
+ if (this._domModel.existingDocument())
+ this._documentUpdated();
}
/**
@@ -44,10 +52,244 @@ SDK.DOMDebuggerModel = class extends SDK.SDKModel {
}
return eventListeners;
}
+
+ /**
+ * @return {!Array<!SDK.DOMDebuggerModel.DOMBreakpoint>}
+ */
+ domBreakpoints() {
+ return this._domBreakpoints.slice();
+ }
+
+ /**
+ * @param {!SDK.DOMNode} node
+ * @param {!SDK.DOMDebuggerModel.DOMBreakpoint.Type} type
+ * @return {boolean}
+ */
+ hasDOMBreakpoint(node, type) {
+ return this._domBreakpoints.some(breakpoint => (breakpoint._node === node && breakpoint._type === type));
+ }
+
+ /**
+ * @param {!SDK.DOMNode} node
+ * @param {!SDK.DOMDebuggerModel.DOMBreakpoint.Type} type
+ * @return {!SDK.DOMDebuggerModel.DOMBreakpoint}
+ */
+ setDOMBreakpoint(node, type) {
+ for (var breakpoint of this._domBreakpoints) {
+ if (breakpoint._node === node && breakpoint._type === type) {
+ breakpoint.setEnabled(true);
+ return breakpoint;
+ }
+ }
+ var breakpoint = new SDK.DOMDebuggerModel.DOMBreakpoint(this, node, type, true);
+ this._domBreakpoints.push(breakpoint);
+ this._saveDOMBreakpoints();
+ this.dispatchEventToListeners(SDK.DOMDebuggerModel.Events.DOMBreakpointAdded, breakpoint);
+ return breakpoint;
+ }
+
+ /**
+ * @param {!SDK.DOMNode} node
+ * @param {!SDK.DOMDebuggerModel.DOMBreakpoint.Type} type
+ */
+ removeDOMBreakpoint(node, type) {
+ this._removeDOMBreakpoints(breakpoint => breakpoint._node === node && breakpoint._type === type);
+ }
+
+ removeAllDOMBreakpoints() {
+ this._removeDOMBreakpoints(breakpoint => true);
+ }
+
+ /**
+ * @param {!Object} auxData
+ * @return {?{type: !SDK.DOMDebuggerModel.DOMBreakpoint.Type, node: !SDK.DOMNode, targetNode: ?SDK.DOMNode, insertion: boolean}}
+ */
+ resolveDOMBreakpointData(auxData) {
+ var type = auxData['type'];
+ var node = this._domModel.nodeForId(auxData['nodeId']);
+ if (!type || !node)
+ return null;
+ var targetNode = null;
+ var insertion = false;
+ if (type === SDK.DOMDebuggerModel.DOMBreakpoint.Type.SubtreeModified) {
+ insertion = auxData['insertion'] || false;
+ targetNode = this._domModel.nodeForId(auxData['targetNodeId']);
+ }
+ return {type: type, node: node, targetNode: targetNode, insertion: insertion};
+ }
+
+ /**
+ * @return {string}
+ */
+ _currentURL() {
+ var domDocument = this._domModel.existingDocument();
+ return domDocument ? domDocument.documentURL : '';
+ }
+
+ _documentUpdated() {
+ var removed = this._domBreakpoints;
+ this._domBreakpoints = [];
+ this.dispatchEventToListeners(SDK.DOMDebuggerModel.Events.DOMBreakpointsRemoved, removed);
+
+ var currentURL = this._currentURL();
+ for (var breakpoint of this._domBreakpointsSetting.get()) {
+ if (breakpoint.url !== currentURL)
+ continue;
+ this._domModel.pushNodeByPathToFrontend(breakpoint.path, nodeId => {
+ var node = nodeId ? this._domModel.nodeForId(nodeId) : null;
+ if (!node)
+ return;
+ var domBreakpoint = new SDK.DOMDebuggerModel.DOMBreakpoint(this, node, breakpoint.type, breakpoint.enabled);
+ this._domBreakpoints.push(domBreakpoint);
+ this.dispatchEventToListeners(SDK.DOMDebuggerModel.Events.DOMBreakpointAdded, domBreakpoint);
+ });
+ }
+ }
+
+ /**
+ * @param {function(!SDK.DOMDebuggerModel.DOMBreakpoint):boolean} filter
+ */
+ _removeDOMBreakpoints(filter) {
+ var removed = [];
+ var left = [];
+ for (var breakpoint of this._domBreakpoints) {
+ if (filter(breakpoint)) {
+ removed.push(breakpoint);
+ if (breakpoint._enabled) {
+ breakpoint._enabled = false;
+ breakpoint._disable();
+ }
+ } else {
+ left.push(breakpoint);
+ }
+ }
+
+ if (!removed.length)
+ return;
+ this._domBreakpoints = left;
+ this._saveDOMBreakpoints();
+ this.dispatchEventToListeners(SDK.DOMDebuggerModel.Events.DOMBreakpointsRemoved, removed);
+ }
+
+ /**
+ * @param {!Common.Event} event
+ */
+ _nodeRemoved(event) {
+ var node = /** @type {!SDK.DOMNode} */ (event.data.node);
+ var children = node.children() || [];
+ this._removeDOMBreakpoints(breakpoint => breakpoint._node === node || children.indexOf(breakpoint._node) !== -1);
+ }
+
+ _saveDOMBreakpoints() {
+ var currentURL = this._currentURL();
+ var breakpoints = this._domBreakpointsSetting.get().filter(breakpoint => breakpoint.url !== currentURL);
+ for (var breakpoint of this._domBreakpoints) {
+ breakpoints.push(
+ {url: currentURL, path: breakpoint._node.path(), type: breakpoint._type, enabled: breakpoint._enabled});
+ }
+ this._domBreakpointsSetting.set(breakpoints);
+ }
};
SDK.SDKModel.register(SDK.DOMDebuggerModel, SDK.Target.Capability.DOM, false);
+/** @enum {symbol} */
+SDK.DOMDebuggerModel.Events = {
+ DOMBreakpointAdded: Symbol('DOMBreakpointAdded'),
+ DOMBreakpointToggled: Symbol('DOMBreakpointToggled'),
+ DOMBreakpointsRemoved: Symbol('DOMBreakpointsRemoved'),
+};
+
+SDK.DOMDebuggerModel.DOMBreakpoint = class {
+ /**
+ * @param {!SDK.DOMDebuggerModel} domDebuggerModel
+ * @param {!SDK.DOMNode} node
+ * @param {!SDK.DOMDebuggerModel.DOMBreakpoint.Type} type
+ * @param {boolean} enabled
+ */
+ constructor(domDebuggerModel, node, type, enabled) {
pfeldman 2017/04/24 23:46:20 Hi Java! This could totally be a struct.
dgozman 2017/04/25 19:24:25 Done.
+ this._domDebuggerModel = domDebuggerModel;
+ this._node = node;
+ this._type = type;
+ this._enabled = enabled;
+ if (enabled)
+ this._enable();
+ }
+
+ /**
+ * @return {!SDK.DOMDebuggerModel}
+ */
+ domDebuggerModel() {
+ return this._domDebuggerModel;
+ }
+
+ /**
+ * @return {!SDK.DOMNode}
+ */
+ node() {
+ return this._node;
+ }
+
+ /**
+ * @return {!SDK.DOMDebuggerModel.DOMBreakpoint.Type}
+ */
+ type() {
+ return this._type;
+ }
+
+ /**
+ * @return {boolean}
+ */
+ enabled() {
+ return this._enabled;
+ }
+
+ /**
+ * @param {boolean} enabled
+ */
+ setEnabled(enabled) {
+ if (enabled === this._enabled)
+ return;
+
+ this._enabled = enabled;
+ if (enabled)
+ this._enable();
+ else
+ this._disable();
+ this._domDebuggerModel.dispatchEventToListeners(SDK.DOMDebuggerModel.Events.DOMBreakpointToggled, this);
+ }
+
+ _enable() {
+ this._domDebuggerModel._agent.setDOMBreakpoint(this._node.id, this._type);
+ this._node.setMarker(SDK.DOMDebuggerModel.DOMBreakpoint.Marker, true);
+ }
+
+ _disable() {
+ this._domDebuggerModel._agent.removeDOMBreakpoint(this._node.id, this._type);
+ this._node.setMarker(SDK.DOMDebuggerModel.DOMBreakpoint.Marker, this._nodeHasBreakpoints() ? true : null);
+ }
+
+ /**
+ * @return {boolean}
+ */
+ _nodeHasBreakpoints() {
+ for (var breakpoint of this._domDebuggerModel._domBreakpoints) {
pfeldman 2017/04/24 23:46:20 Move into model, retain private.
dgozman 2017/04/25 19:24:25 Done.
+ if (breakpoint._node === this._node && breakpoint._enabled)
+ return true;
+ }
+ return false;
+ }
+};
+
+/** @typedef {Protocol.DOMDebugger.DOMBreakpointType} */
+SDK.DOMDebuggerModel.DOMBreakpoint.Type = Protocol.DOMDebugger.DOMBreakpointType;
+// SubtreeModified: Protocol.DOMDebugger.DOMBreakpointType.SubtreeModified,
+// AttributeModified: Protocol.DOMDebugger.DOMBreakpointType.AttributeModified,
+// NodeRemoved: Protocol.DOMDebugger.DOMBreakpointType.NodeRemoved,
+// };
+
+SDK.DOMDebuggerModel.DOMBreakpoint.Marker = 'breakpoint-marker';
+
SDK.EventListener = class {
/**
* @param {!SDK.DOMDebuggerModel} domDebuggerModel

Powered by Google App Engine
This is Rietveld 408576698