Changeset 242076 in webkit
- Timestamp:
- Feb 25, 2019 11:36:29 PM (5 years ago)
- Location:
- trunk/Source/WebInspectorUI
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebInspectorUI/ChangeLog
r242073 r242076 1 2019-02-25 Devin Rousso <drousso@apple.com> 2 3 Web Inspector: hovering a node inside an object preview should highlight it 4 https://bugs.webkit.org/show_bug.cgi?id=194862 5 <rdar://problem/48246433> 6 7 Reviewed by Joseph Pecoraro. 8 9 * UserInterface/Views/FormattedValue.js: 10 (WI.FormattedValue.createElementForNodePreview): 11 When provided a way to access the `WI.RemoteObject` for the given preview, add various mouse 12 event listeners that highlight the corresponding DOM node. 13 14 * UserInterface/Views/ObjectPreviewView.js: 15 (WI.ObjectPreviewView): 16 (WI.ObjectPreviewView.prototype._initTitleElement): 17 (WI.ObjectPreviewView.prototype._appendPropertyPreviews): 18 (WI.ObjectPreviewView.prototype._appendValuePreview): 19 Implement various ways of getting the `WI.RemoteObject` for a given preview. 20 - When the preview is for the actual `WI.RemoteObject`, simply return it 21 - If the preview is a property of the main object, get the `WI.RemoteObject` for that property 22 23 * UserInterface/Views/ObjectTreeView.js: 24 (WI.ObjectTreeView): 25 * UserInterface/Views/ObjectTreePropertyTreeElement.js: 26 (WI.ObjectTreePropertyTreeElement.prototype._createTitlePropertyStyle): 27 Pass the `WI.RemoteObject` to the preview so that it can utilize it. 28 29 * UserInterface/Controllers/ConsoleManager.js: 30 (WI.ConsoleManager): 31 (WI.ConsoleManager.prototype.releaseRemoteObjectWithConsoleClear): Added. 32 (WI.ConsoleManager.prototype.messagesCleared): Added. 33 1 34 2019-02-25 Joseph Pecoraro <pecoraro@apple.com> 2 35 -
trunk/Source/WebInspectorUI/UserInterface/Controllers/ConsoleManager.js
r241744 r242076 35 35 this._clearMessagesRequested = false; 36 36 this._isNewPageOrReload = false; 37 this._remoteObjectsToRelease = null; 37 38 38 39 WI.Frame.addEventListener(WI.Frame.Event.MainResourceDidChange, this._mainResourceDidChange, this); … … 78 79 } 79 80 81 releaseRemoteObjectWithConsoleClear(remoteObject) 82 { 83 if (!this._remoteObjectsToRelease) 84 this._remoteObjectsToRelease = new Set; 85 this._remoteObjectsToRelease.add(remoteObject); 86 } 87 80 88 messageWasAdded(target, source, level, text, type, url, line, column, repeatCount, parameters, stackTrace, requestId) 81 89 { … … 102 110 { 103 111 // Called from WI.ConsoleObserver. 112 113 if (this._remoteObjectsToRelease) { 114 for (let remoteObject of this._remoteObjectsToRelease) 115 remoteObject.release(); 116 this._remoteObjectsToRelease = null; 117 } 104 118 105 119 WI.ConsoleCommandResultMessage.clearMaximumSavedResultIndex(); -
trunk/Source/WebInspectorUI/UserInterface/Views/FormattedValue.js
r236766 r242076 115 115 }; 116 116 117 WI.FormattedValue.createElementForNodePreview = function(preview )117 WI.FormattedValue.createElementForNodePreview = function(preview, {remoteObjectAccessor} = {}) 118 118 { 119 119 var value = preview.value || preview.description; 120 120 var span = document.createElement("span"); 121 121 span.className = "formatted-node-preview syntax-highlighted"; 122 123 if (remoteObjectAccessor) { 124 let domNode = null; 125 126 span.addEventListener("mouseenter", (event) => { 127 if (domNode) { 128 WI.domManager.highlightDOMNode(domNode.id, "all"); 129 return; 130 } 131 132 remoteObjectAccessor((remoteObject) => { 133 remoteObject.pushNodeToFrontend((nodeId) => { 134 domNode = WI.domManager.nodeForId(nodeId); 135 if (domNode) 136 WI.domManager.highlightDOMNode(domNode.id, "all"); 137 }); 138 }); 139 }); 140 141 span.addEventListener("mouseleave", (event) => { 142 WI.domManager.hideDOMNodeHighlight(); 143 }); 144 145 span.addEventListener("contextmenu", (event) => { 146 if (!domNode) 147 return; 148 149 let contextMenu = WI.ContextMenu.createFromEvent(event); 150 151 WI.appendContextMenuItemsForDOMNode(contextMenu, domNode); 152 }); 153 } 122 154 123 155 // Comment node preview. … … 247 279 return WI.FormattedValue.createElementForFunctionWithName(objectPreview.description); 248 280 249 return new WI.ObjectPreviewView(objectPreview, previewViewMode).element; 281 const object = null; 282 return new WI.ObjectPreviewView(object, objectPreview, previewViewMode).element; 250 283 }; 251 284 … … 259 292 260 293 if (object.preview) 261 return new WI.ObjectPreviewView(object .preview, previewViewMode);294 return new WI.ObjectPreviewView(object, object.preview, previewViewMode); 262 295 263 296 return WI.FormattedValue.createElementForRemoteObject(object); -
trunk/Source/WebInspectorUI/UserInterface/Views/ObjectPreviewView.js
r238743 r242076 26 26 WI.ObjectPreviewView = class ObjectPreviewView extends WI.Object 27 27 { 28 constructor(preview, mode) 29 { 28 constructor(object, preview, mode) 29 { 30 console.assert(!object || object instanceof WI.RemoteObject); 30 31 console.assert(preview instanceof WI.ObjectPreview); 31 32 32 33 super(); 33 34 35 this._object = object || null; 34 36 this._preview = preview; 35 37 this._mode = mode || WI.ObjectPreviewView.Mode.Full; … … 111 113 this._titleElement.appendChild(WI.FormattedValue.createElementForObjectPreview(this._preview)); 112 114 else if (this._preview.subtype === "node") 113 this._titleElement.appendChild(WI.FormattedValue.createElementForNodePreview(this._preview ));115 this._titleElement.appendChild(WI.FormattedValue.createElementForNodePreview(this._preview, {remoteObjectAccessor: (callback) => callback(this._object)})); 114 116 else 115 117 this._titleElement.textContent = this._preview.description || ""; … … 211 213 var numberAdded = 0; 212 214 var limit = this._numberOfPropertiesToShowInMode(); 213 for ( vari = 0; i < preview.propertyPreviews.length && numberAdded < limit; ++i) {214 varproperty = preview.propertyPreviews[i];215 for (let i = 0; i < preview.propertyPreviews.length && numberAdded < limit; ++i) { 216 let property = preview.propertyPreviews[i]; 215 217 216 218 // FIXME: Better handle getter/setter accessors. Should we show getters in previews? … … 226 228 227 229 if (!isArray || property.name != i) { 228 varnameElement = element.appendChild(document.createElement("span"));230 let nameElement = element.appendChild(document.createElement("span")); 229 231 nameElement.className = "name"; 230 232 nameElement.textContent = property.name; … … 234 236 if (property.valuePreview) 235 237 this._appendPreview(element, property.valuePreview); 236 else if (property.subtype === "node") 237 element.appendChild(WI.FormattedValue.createElementForNodePreview(property)); 238 else 238 else if (property.subtype === "node") { 239 let options = {}; 240 if (preview === this._preview && this._object) { 241 options.remoteObjectAccessor = (callback) => { 242 this._object.getProperty(property.name, (error, remoteObject, wasThrown) => { 243 if (!error && remoteObject && !wasThrown) { 244 WI.consoleManager.releaseRemoteObjectWithConsoleClear(remoteObject); 245 callback(remoteObject); 246 } 247 }); 248 }; 249 } 250 element.appendChild(WI.FormattedValue.createElementForNodePreview(property, options)); 251 } else 239 252 element.appendChild(WI.FormattedValue.createElementForPropertyPreview(property)); 240 253 } … … 259 272 { 260 273 if (preview.subtype === "node") { 261 element.appendChild(WI.FormattedValue.createElementForNodePreview(preview)); 274 let options = {}; 275 if (preview === this._preview && this._object) 276 options.remoteObjectAccessor = (callback) => callback(this._object); 277 element.appendChild(WI.FormattedValue.createElementForNodePreview(preview, options)); 262 278 return false; 263 279 } -
trunk/Source/WebInspectorUI/UserInterface/Views/ObjectTreePropertyTreeElement.js
r237571 r242076 158 158 if (resolvedValue) { 159 159 if (resolvedValue.preview) { 160 this._previewView = new WI.ObjectPreviewView(resolvedValue .preview);160 this._previewView = new WI.ObjectPreviewView(resolvedValue, resolvedValue.preview); 161 161 valueOrGetterElement = this._previewView.element; 162 162 } else { -
trunk/Source/WebInspectorUI/UserInterface/Views/ObjectTreeView.js
r237571 r242076 55 55 56 56 if (this._object.preview) { 57 this._previewView = new WI.ObjectPreviewView(this._object .preview);57 this._previewView = new WI.ObjectPreviewView(this._object, this._object.preview); 58 58 this._previewView.setOriginatingObjectInfo(this._object, providedPropertyPath ? propertyPath : null); 59 59 this._previewView.element.addEventListener("click", this._handlePreviewOrTitleElementClick.bind(this));
Note: See TracChangeset
for help on using the changeset viewer.