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

Side by Side Diff: Source/devtools/front_end/elements/ElementsTreeOutline.js

Issue 701153002: DevTools: [Elements] Highlight DOM updates (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Don't access |document| directly Created 6 years, 1 month 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | Source/devtools/front_end/elements/elementsTreeOutline.css » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. 2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
3 * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com> 3 * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com>
4 * Copyright (C) 2009 Joseph Pecoraro 4 * Copyright (C) 2009 Joseph Pecoraro
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions 7 * modification, are permitted provided that the following conditions
8 * are met: 8 * are met:
9 * 9 *
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 closingTagElement.updateTitle(); 483 closingTagElement.updateTitle();
484 }, 484 },
485 485
486 _selectedNodeChanged: function() 486 _selectedNodeChanged: function()
487 { 487 {
488 this._eventSupport.dispatchEventToListeners(WebInspector.ElementsTreeOut line.Events.SelectedNodeChanged, this._selectedDOMNode); 488 this._eventSupport.dispatchEventToListeners(WebInspector.ElementsTreeOut line.Events.SelectedNodeChanged, this._selectedDOMNode);
489 }, 489 },
490 490
491 /** 491 /**
492 * @param {!Array.<!WebInspector.DOMNode>} nodes 492 * @param {!Array.<!WebInspector.DOMNode>} nodes
493 * @param {!Map.<!WebInspector.DOMNode, !Set.<string>>} modifiedAttributes
493 */ 494 */
494 _fireElementsTreeUpdated: function(nodes) 495 _fireElementsTreeUpdated: function(nodes, modifiedAttributes)
495 { 496 {
496 this._eventSupport.dispatchEventToListeners(WebInspector.ElementsTreeOut line.Events.ElementsTreeUpdated, nodes); 497 this._eventSupport.dispatchEventToListeners(WebInspector.ElementsTreeOut line.Events.ElementsTreeUpdated, nodes);
498 for (var entry of modifiedAttributes.entries()) {
499 // FIXME: Remove this cast once Map.prototype.entries is properly su pported by the Closure compiler.
500 var treeElement = this.findTreeElement(/** @type {!WebInspector.DOMN ode} */ (entry[0]));
vsevik 2014/11/05 20:40:24 You could iterate over keys instead to workaround
apavlov 2014/11/06 10:47:03 Done.
501 if (!treeElement)
502 continue;
503 var element = treeElement.listItemElement;
504 // FIXME: Remove this cast once Map.prototype.entries is properly su pported by the Closure compiler.
505 var names = /** @type {!Set.<string>} */ (entry[1]);
506 for (var name of names) {
507 var attrValue = treeElement.representedObject.getAttribute(name) ;
508 var xpath;
509 if (attrValue === undefined) {
510 xpath = ".//*[@class='webkit-html-tag-name']";
511 } else {
512 var elementClassName = !!attrValue ? "webkit-html-attribute- value" : "webkit-html-attribute-name";
513 xpath = ".//*[@class='webkit-html-tag']//*[@class='webkit-ht ml-attribute'][.//*[@class='webkit-html-attribute-name'][text()='" + name + "']] /*[@class='" + elementClassName + "']";
vsevik 2014/11/05 20:40:24 Maybe store attribute elements on the treeElement
apavlov 2014/11/06 10:47:03 Discussed this approach offline
514 }
515 element = element.ownerDocument.evaluate(xpath, element, null, X PathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue;
516 if (element)
517 WebInspector.runCSSAnimationOnce(element, "dom-update-highli ght");
518 }
519 }
497 }, 520 },
498 521
499 /** 522 /**
500 * @param {!WebInspector.DOMNode} node 523 * @param {!WebInspector.DOMNode} node
501 * @return {?TreeElement} 524 * @return {?TreeElement}
502 */ 525 */
503 findTreeElement: function(node) 526 findTreeElement: function(node)
504 { 527 {
505 function parentNode(node) 528 function parentNode(node)
506 { 529 {
(...skipping 2233 matching lines...) Expand 10 before | Expand all | Expand 10 after
2740 domModel.addEventListener(WebInspector.DOMModel.Events.CharacterDataModified , this._characterDataModified, this); 2763 domModel.addEventListener(WebInspector.DOMModel.Events.CharacterDataModified , this._characterDataModified, this);
2741 domModel.addEventListener(WebInspector.DOMModel.Events.DocumentUpdated, this ._documentUpdated, this); 2764 domModel.addEventListener(WebInspector.DOMModel.Events.DocumentUpdated, this ._documentUpdated, this);
2742 domModel.addEventListener(WebInspector.DOMModel.Events.ChildNodeCountUpdated , this._childNodeCountUpdated, this); 2765 domModel.addEventListener(WebInspector.DOMModel.Events.ChildNodeCountUpdated , this._childNodeCountUpdated, this);
2743 2766
2744 this._domModel = domModel; 2767 this._domModel = domModel;
2745 this._treeOutline = treeOutline; 2768 this._treeOutline = treeOutline;
2746 /** @type {!Set.<!WebInspector.DOMNode>} */ 2769 /** @type {!Set.<!WebInspector.DOMNode>} */
2747 this._recentlyModifiedNodes = new Set(); 2770 this._recentlyModifiedNodes = new Set();
2748 /** @type {!Set.<!WebInspector.DOMNode>} */ 2771 /** @type {!Set.<!WebInspector.DOMNode>} */
2749 this._recentlyModifiedParentNodes = new Set(); 2772 this._recentlyModifiedParentNodes = new Set();
2773 /** @type {!Map.<!WebInspector.DOMNode, !Set.<string>>} */
2774 this._recentlyModifiedAttributes = new Map();
2750 } 2775 }
2751 2776
2777 /**
2778 * @typedef {{node: !WebInspector.DOMNode, name: string}}
2779 */
2780 WebInspector.ElementsTreeUpdater.AttributeUpdateEntry;
vsevik 2014/11/05 20:40:24 unused?
apavlov 2014/11/06 10:47:03 Done.
2781
2752 WebInspector.ElementsTreeUpdater.prototype = { 2782 WebInspector.ElementsTreeUpdater.prototype = {
2753 dispose: function() 2783 dispose: function()
2754 { 2784 {
2755 this._domModel.removeEventListener(WebInspector.DOMModel.Events.NodeInse rted, this._nodeInserted, this); 2785 this._domModel.removeEventListener(WebInspector.DOMModel.Events.NodeInse rted, this._nodeInserted, this);
2756 this._domModel.removeEventListener(WebInspector.DOMModel.Events.NodeRemo ved, this._nodeRemoved, this); 2786 this._domModel.removeEventListener(WebInspector.DOMModel.Events.NodeRemo ved, this._nodeRemoved, this);
2757 this._domModel.removeEventListener(WebInspector.DOMModel.Events.AttrModi fied, this._attributesUpdated, this); 2787 this._domModel.removeEventListener(WebInspector.DOMModel.Events.AttrModi fied, this._attributesUpdated, this);
2758 this._domModel.removeEventListener(WebInspector.DOMModel.Events.AttrRemo ved, this._attributesUpdated, this); 2788 this._domModel.removeEventListener(WebInspector.DOMModel.Events.AttrRemo ved, this._attributesUpdated, this);
2759 this._domModel.removeEventListener(WebInspector.DOMModel.Events.Characte rDataModified, this._characterDataModified, this); 2789 this._domModel.removeEventListener(WebInspector.DOMModel.Events.Characte rDataModified, this._characterDataModified, this);
2760 this._domModel.removeEventListener(WebInspector.DOMModel.Events.Document Updated, this._documentUpdated, this); 2790 this._domModel.removeEventListener(WebInspector.DOMModel.Events.Document Updated, this._documentUpdated, this);
2761 this._domModel.removeEventListener(WebInspector.DOMModel.Events.ChildNod eCountUpdated, this._childNodeCountUpdated, this); 2791 this._domModel.removeEventListener(WebInspector.DOMModel.Events.ChildNod eCountUpdated, this._childNodeCountUpdated, this);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2808 this._treeOutline.rootDOMNode = inspectedRootDocument; 2838 this._treeOutline.rootDOMNode = inspectedRootDocument;
2809 }, 2839 },
2810 2840
2811 /** 2841 /**
2812 * @param {!WebInspector.Event} event 2842 * @param {!WebInspector.Event} event
2813 */ 2843 */
2814 _attributesUpdated: function(event) 2844 _attributesUpdated: function(event)
2815 { 2845 {
2816 var node = /** @type {!WebInspector.DOMNode} */ (event.data.node); 2846 var node = /** @type {!WebInspector.DOMNode} */ (event.data.node);
2817 this._nodeModified(node); 2847 this._nodeModified(node);
2848 var names = this._recentlyModifiedAttributes.get(node);
2849 if (!names) {
2850 names = new Set();
2851 this._recentlyModifiedAttributes.set(node, names);
2852 }
2853 names.add(/** @type {string} */ (event.data.name));
2818 }, 2854 },
2819 2855
2820 /** 2856 /**
2821 * @param {!WebInspector.Event} event 2857 * @param {!WebInspector.Event} event
2822 */ 2858 */
2823 _characterDataModified: function(event) 2859 _characterDataModified: function(event)
2824 { 2860 {
2825 var node = /** @type {!WebInspector.DOMNode} */ (event.data); 2861 var node = /** @type {!WebInspector.DOMNode} */ (event.data);
2826 this._parentNodeModified(node.parentNode); 2862 this._parentNodeModified(node.parentNode);
2827 this._nodeModified(node); 2863 this._nodeModified(node);
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
2898 } 2934 }
2899 2935
2900 if (hidePanelWhileUpdating) { 2936 if (hidePanelWhileUpdating) {
2901 this._treeOutline._element.classList.remove("hidden"); 2937 this._treeOutline._element.classList.remove("hidden");
2902 if (originalScrollTop) 2938 if (originalScrollTop)
2903 treeOutlineContainerElement.scrollTop = originalScrollTop; 2939 treeOutlineContainerElement.scrollTop = originalScrollTop;
2904 this._treeOutline.updateSelection(); 2940 this._treeOutline.updateSelection();
2905 } 2941 }
2906 this._recentlyModifiedNodes.clear(); 2942 this._recentlyModifiedNodes.clear();
2907 this._recentlyModifiedParentNodes.clear(); 2943 this._recentlyModifiedParentNodes.clear();
2908 this._treeOutline._fireElementsTreeUpdated(updatedNodes); 2944 this._treeOutline._fireElementsTreeUpdated(updatedNodes, this._recentlyM odifiedAttributes);
2945 this._recentlyModifiedAttributes.clear();
2909 }, 2946 },
2910 2947
2911 _reset: function() 2948 _reset: function()
2912 { 2949 {
2913 this._treeOutline.rootDOMNode = null; 2950 this._treeOutline.rootDOMNode = null;
2914 this._treeOutline.selectDOMNode(null, false); 2951 this._treeOutline.selectDOMNode(null, false);
2915 this._domModel.hideDOMNodeHighlight(); 2952 this._domModel.hideDOMNodeHighlight();
2916 this._recentlyModifiedNodes.clear(); 2953 this._recentlyModifiedNodes.clear();
2917 this._recentlyModifiedParentNodes.clear(); 2954 this._recentlyModifiedParentNodes.clear();
2918 delete this._treeOutline._clipboardNodeData; 2955 delete this._treeOutline._clipboardNodeData;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
2964 treeOutline.rootDOMNode = node; 3001 treeOutline.rootDOMNode = node;
2965 if (!treeOutline.children[0].hasChildren) 3002 if (!treeOutline.children[0].hasChildren)
2966 treeOutline._element.classList.add("single-node"); 3003 treeOutline._element.classList.add("single-node");
2967 treeOutline.setVisible(true); 3004 treeOutline.setVisible(true);
2968 treeOutline.element.treeElementForTest = treeOutline.children[0] ; 3005 treeOutline.element.treeElementForTest = treeOutline.children[0] ;
2969 resolve(treeOutline.element); 3006 resolve(treeOutline.element);
2970 } 3007 }
2971 } 3008 }
2972 } 3009 }
2973 } 3010 }
OLDNEW
« no previous file with comments | « no previous file | Source/devtools/front_end/elements/elementsTreeOutline.css » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698