Changeset 90460 in webkit
- Timestamp:
- Jul 6, 2011 8:25:40 AM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r90456 r90460 1 2011-07-06 Pavel Feldman <pfeldman@google.com> 2 3 Web Inspector: implement drag'n'drop in the elements panel for reordering nodes. 4 https://bugs.webkit.org/show_bug.cgi?id=63990 5 6 Reviewed by Yury Semikhatsky. 7 8 * inspector/Inspector.json: 9 * inspector/InspectorDOMAgent.cpp: 10 (WebCore::InspectorDOMAgent::moveTo): 11 * inspector/InspectorDOMAgent.h: 12 * inspector/front-end/DOMAgent.js: 13 (WebInspector.DOMNode.prototype._removeChild): 14 (WebInspector.DOMNode.prototype.ownerDocumentElement): 15 (WebInspector.DOMNode.prototype.moveTo): 16 (WebInspector.DOMAgent.prototype._childNodeRemoved): 17 * inspector/front-end/ElementsTreeOutline.js: 18 (WebInspector.ElementsTreeOutline): 19 (WebInspector.ElementsTreeOutline.prototype._ondragstart): 20 (WebInspector.ElementsTreeOutline.prototype._ondragover): 21 (WebInspector.ElementsTreeOutline.prototype._ondragleave): 22 (WebInspector.ElementsTreeOutline.prototype._isValidDragSourceOrTarget): 23 (WebInspector.ElementsTreeOutline.prototype._ondragend.callback): 24 (WebInspector.ElementsTreeOutline.prototype._ondragend): 25 (WebInspector.ElementsTreeOutline.prototype._clearDragOverTreeElementMarker): 26 (WebInspector.ElementsTreeOutline.prototype.populateContextMenu.focusElement): 27 (WebInspector.ElementsTreeOutline.prototype.populateContextMenu): 28 (WebInspector.ElementsTreeElement.prototype.onattach): 29 * inspector/front-end/inspector.css: 30 (.outline-disclosure li.elements-drag-over .selection): 31 * inspector/front-end/treeoutline.js: 32 (TreeOutline.prototype.treeElementFromEvent): 33 1 34 2011-07-06 Andras Becsi <abecsi@webkit.org> 2 35 -
trunk/Source/WebCore/inspector/Inspector.json
r90364 r90460 1016 1016 ], 1017 1017 "description": "Returns attributes for the specified nodes." 1018 }, 1019 { 1020 "name": "moveTo", 1021 "parameters": [ 1022 { "name": "nodeId", "type": "integer", "description": "Id of the node to drop." }, 1023 { "name": "targetNodeId", "type": "integer", "description": "Id of the node to drop into." }, 1024 { "name": "anchorNodeId", "type": "integer", "optional": true, "description": "Drop node before given one." } 1025 ], 1026 "returns": [ 1027 { "name": "nodeId", "type": "integer", "description": "New id of the moved node." } 1028 ], 1029 "description": "Moves node into the new container, places it before the given anchor." 1018 1030 } 1019 1031 ], -
trunk/Source/WebCore/inspector/InspectorDOMAgent.cpp
r90013 r90460 1033 1033 } 1034 1034 1035 void InspectorDOMAgent::moveTo(ErrorString* error, int nodeId, int targetNodeId, const int* const anchorNodeId, int* newNodeId) 1036 { 1037 Element* element = assertElement(error, nodeId); 1038 if (!element) 1039 return; 1040 1041 Element* targetElement = assertElement(error, targetNodeId); 1042 if (!targetElement) 1043 return; 1044 1045 Element* anchorElement = 0; 1046 if (anchorNodeId && *anchorNodeId) { 1047 anchorElement = assertElement(error, *anchorNodeId); 1048 if (!anchorElement) 1049 return; 1050 if (anchorElement->parentNode() != targetElement) { 1051 *error = "Anchor node must be child of the target node."; 1052 return; 1053 } 1054 } 1055 1056 ExceptionCode ec = 0; 1057 bool success = targetElement->insertBefore(element, anchorElement, ec); 1058 if (ec || !success) { 1059 *error = "Could not drop node."; 1060 return; 1061 } 1062 *newNodeId = pushNodePathToFrontend(element); 1063 } 1064 1035 1065 void InspectorDOMAgent::resolveNode(ErrorString* error, int nodeId, const String* const objectGroup, RefPtr<InspectorObject>* result) 1036 1066 { -
trunk/Source/WebCore/inspector/InspectorDOMAgent.h
r89439 r90460 137 137 void highlightFrame(ErrorString*, const String& frameId); 138 138 void hideFrameHighlight(ErrorString* error) { hideHighlight(error); } 139 void moveTo(ErrorString*, int nodeId, int targetNodeId, const int* const anchorNodeId, int* newNodeId); 140 139 141 Node* highlightedNode() const { return m_highlightedNode.get(); } 140 142 -
trunk/Source/WebCore/inspector/front-end/DOMAgent.js
r89439 r90460 260 260 }, 261 261 262 removeChild_: function(node)262 _removeChild: function(node) 263 263 { 264 264 this.children.splice(this.children.indexOf(node), 1); … … 316 316 node = node.parentNode; 317 317 return node; 318 }, 319 320 moveTo: function(targetNode, anchorNode, callback) 321 { 322 DOMAgent.moveTo(this.id, targetNode.id, anchorNode ? anchorNode.id : undefined, callback); 318 323 } 319 324 } … … 536 541 var parent = this._idToDOMNode[parentId]; 537 542 var node = this._idToDOMNode[nodeId]; 538 parent. removeChild_(node);543 parent._removeChild(node); 539 544 this.dispatchEventToListeners(WebInspector.DOMAgent.Events.NodeRemoved, {node:node, parent:parent}); 540 545 delete this._idToDOMNode[nodeId]; -
trunk/Source/WebCore/inspector/front-end/ElementsTreeOutline.js
r90013 r90460 34 34 this.element.addEventListener("mousemove", this._onmousemove.bind(this), false); 35 35 this.element.addEventListener("mouseout", this._onmouseout.bind(this), false); 36 this.element.addEventListener("dragstart", this._ondragstart.bind(this), false); 37 this.element.addEventListener("dragover", this._ondragover.bind(this), false); 38 this.element.addEventListener("dragleave", this._ondragleave.bind(this), false); 39 this.element.addEventListener("dragend", this._ondragend.bind(this), false); 36 40 37 41 TreeOutline.call(this, this.element); … … 259 263 }, 260 264 265 _ondragstart: function(event) 266 { 267 var treeElement = this._treeElementFromEvent(event); 268 if (!treeElement) 269 return false; 270 271 if (!this._isValidDragSourceOrTarget(treeElement)) 272 return false; 273 274 if (treeElement.representedObject.nodeName() === "BODY" || treeElement.representedObject.nodeName() === "HEAD") 275 return false; 276 277 event.dataTransfer.setData("text/plain", treeElement.listItemElement.textContent); 278 event.dataTransfer.effectAllowed = "copy"; 279 this._nodeBeingDragged = treeElement.representedObject; 280 281 WebInspector.highlightDOMNode(0); 282 283 return true; 284 }, 285 286 _ondragover: function(event) 287 { 288 this._clearDragOverTreeElementMarker(); 289 290 if (!this._nodeBeingDragged) 291 return; 292 293 var treeElement = this._treeElementFromEvent(event); 294 if (!this._isValidDragSourceOrTarget(treeElement)) 295 return; 296 297 var node = treeElement.representedObject; 298 while (node) { 299 if (node === this._nodeBeingDragged) 300 return; 301 node = node.parentNode; 302 } 303 304 treeElement.updateSelection(); 305 treeElement.listItemElement.addStyleClass("elements-drag-over"); 306 this._dragOverTreeElement = treeElement; 307 }, 308 309 _ondragleave: function(event) 310 { 311 this._clearDragOverTreeElementMarker(); 312 313 if (!this._nodeBeingDragged) 314 return; 315 316 var treeElement = this._treeElementFromEvent(event); 317 if (!this._isValidDragSourceOrTarget(treeElement)) 318 return false; 319 320 var node = treeElement.representedObject; 321 while (node) { 322 if (node === this._nodeBeingDragged) 323 return; 324 node = node.parentNode; 325 } 326 327 treeElement.updateSelection(); 328 treeElement.listItemElement.addStyleClass("elements-drag-over"); 329 this._dragOverTreeElement = treeElement; 330 }, 331 332 _isValidDragSourceOrTarget: function(treeElement) 333 { 334 if (!treeElement) 335 return false; 336 337 var node = treeElement.representedObject; 338 if (!(node instanceof WebInspector.DOMNode)) 339 return false; 340 341 if (node.nodeType() !== Node.ELEMENT_NODE) 342 return false; 343 344 if (!node.parentNode || node.parentNode.nodeType() !== Node.ELEMENT_NODE) 345 return false; 346 347 return true; 348 }, 349 350 _ondragend: function(event) 351 { 352 if (this._nodeBeingDragged && this._dragOverTreeElement) { 353 var parentNode; 354 var anchorNode; 355 356 if (this._dragOverTreeElement._elementCloseTag) { 357 // Drop onto closing tag -> insert as last child. 358 parentNode = this._dragOverTreeElement.representedObject; 359 } else { 360 var dragTargetNode = this._dragOverTreeElement.representedObject; 361 parentNode = dragTargetNode.parentNode; 362 anchorNode = dragTargetNode; 363 } 364 365 function callback(error, newNodeId) 366 { 367 if (error) 368 return; 369 370 WebInspector.panels.elements.updateModifiedNodes(); 371 var newNode = WebInspector.domAgent.nodeForId(newNodeId); 372 if (newNode) 373 this.focusedDOMNode = newNode; 374 } 375 this._nodeBeingDragged.moveTo(parentNode, anchorNode, callback.bind(this)); 376 } 377 378 this._clearDragOverTreeElementMarker(); 379 delete this._nodeBeingDragged; 380 }, 381 382 _clearDragOverTreeElementMarker: function() 383 { 384 if (this._dragOverTreeElement) { 385 this._dragOverTreeElement.updateSelection(); 386 this._dragOverTreeElement.listItemElement.removeStyleClass("elements-drag-over"); 387 delete this._dragOverTreeElement; 388 } 389 }, 390 261 391 populateContextMenu: function(contextMenu, event) 262 392 { 263 var listItem = event.target.enclosingNodeOrSelfWithNodeName("LI");264 if (! listItem || !listItem.treeElement)393 var treeElement = this._treeElementFromEvent(event); 394 if (!treeElement) 265 395 return false; 266 396 … … 269 399 function focusElement() 270 400 { 271 WebInspector.panels.elements.switchToAndFocus( listItem.treeElement.representedObject);401 WebInspector.panels.elements.switchToAndFocus(treeElement.representedObject); 272 402 } 273 403 contextMenu.appendItem(WebInspector.UIString("Reveal in Elements Panel"), focusElement.bind(this)); … … 279 409 if (href) 280 410 populated = WebInspector.panels.elements.populateHrefContextMenu(contextMenu, event, href); 281 if (tag && listItem.treeElement._populateTagContextMenu) {411 if (tag && treeElement._populateTagContextMenu) { 282 412 if (populated) 283 413 contextMenu.appendSeparator(); 284 listItem.treeElement._populateTagContextMenu(contextMenu, event);414 treeElement._populateTagContextMenu(contextMenu, event); 285 415 populated = true; 286 } else if (textNode && listItem.treeElement._populateTextContextMenu) {416 } else if (textNode && treeElement._populateTextContextMenu) { 287 417 if (populated) 288 418 contextMenu.appendSeparator(); 289 listItem.treeElement._populateTextContextMenu(contextMenu, textNode);419 treeElement._populateTextContextMenu(contextMenu, textNode); 290 420 populated = true; 291 421 } … … 509 639 510 640 this.updateTitle(); 511 512 641 this._preventFollowingLinksOnDoubleClick(); 642 this.listItemElement.draggable = true; 513 643 }, 514 644 -
trunk/Source/WebCore/inspector/front-end/inspector.css
r90397 r90460 1222 1222 } 1223 1223 1224 .outline-disclosure li.elements-drag-over .selection { 1225 display: block; 1226 margin-top: -2px; 1227 border-top: 2px solid rgb(56, 121, 217); 1228 } 1229 1224 1230 .outline-disclosure ol:focus li.selected .selection { 1225 1231 background-color: rgb(56, 121, 217);
Note: See TracChangeset
for help on using the changeset viewer.