Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 1000 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1011 return WebInspector.UIString("%d descendant with forced state", desc endantCount); | 1011 return WebInspector.UIString("%d descendant with forced state", desc endantCount); |
| 1012 return WebInspector.UIString("%d descendants with forced state", descend antCount); | 1012 return WebInspector.UIString("%d descendants with forced state", descend antCount); |
| 1013 } | 1013 } |
| 1014 } | 1014 } |
| 1015 | 1015 |
| 1016 /** | 1016 /** |
| 1017 * @constructor | 1017 * @constructor |
| 1018 * @extends {TreeElement} | 1018 * @extends {TreeElement} |
| 1019 * @param {!WebInspector.DOMNode} node | 1019 * @param {!WebInspector.DOMNode} node |
| 1020 * @param {boolean=} elementCloseTag | 1020 * @param {boolean=} elementCloseTag |
| 1021 * @param {boolean=} isUpdated | |
| 1021 */ | 1022 */ |
| 1022 WebInspector.ElementsTreeElement = function(node, elementCloseTag) | 1023 WebInspector.ElementsTreeElement = function(node, elementCloseTag, isUpdated) |
| 1023 { | 1024 { |
| 1024 // The title will be updated in onattach. | 1025 // The title will be updated in onattach. |
| 1025 TreeElement.call(this, "", node); | 1026 TreeElement.call(this, "", node); |
| 1026 this._node = node; | 1027 this._node = node; |
| 1027 | 1028 |
| 1028 this._elementCloseTag = elementCloseTag; | 1029 this._elementCloseTag = elementCloseTag; |
| 1029 this._updateHasChildren(); | 1030 this._updateHasChildren(); |
| 1030 | 1031 |
| 1031 if (this._node.nodeType() == Node.ELEMENT_NODE && !elementCloseTag) | 1032 if (this._node.nodeType() == Node.ELEMENT_NODE && !elementCloseTag) |
| 1032 this._canAddAttributes = true; | 1033 this._canAddAttributes = true; |
| 1034 this._isUpdated = isUpdated; | |
| 1033 this._searchQuery = null; | 1035 this._searchQuery = null; |
| 1034 this._expandedChildrenLimit = WebInspector.ElementsTreeElement.InitialChildr enLimit; | 1036 this._expandedChildrenLimit = WebInspector.ElementsTreeElement.InitialChildr enLimit; |
| 1035 } | 1037 } |
| 1036 | 1038 |
| 1037 WebInspector.ElementsTreeElement.InitialChildrenLimit = 500; | 1039 WebInspector.ElementsTreeElement.InitialChildrenLimit = 500; |
| 1038 | 1040 |
| 1039 // A union of HTML4 and HTML5-Draft elements that explicitly | 1041 // A union of HTML4 and HTML5-Draft elements that explicitly |
| 1040 // or implicitly (for HTML5) forbid the closing tag. | 1042 // or implicitly (for HTML5) forbid the closing tag. |
| 1041 WebInspector.ElementsTreeElement.ForbiddenClosingTagElements = [ | 1043 WebInspector.ElementsTreeElement.ForbiddenClosingTagElements = [ |
| 1042 "area", "base", "basefont", "br", "canvas", "col", "command", "embed", "fram e", | 1044 "area", "base", "basefont", "br", "canvas", "col", "command", "embed", "fram e", |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1144 return this._expandedChildrenLimit; | 1146 return this._expandedChildrenLimit; |
| 1145 }, | 1147 }, |
| 1146 | 1148 |
| 1147 set expandedChildrenLimit(x) | 1149 set expandedChildrenLimit(x) |
| 1148 { | 1150 { |
| 1149 if (this._expandedChildrenLimit === x) | 1151 if (this._expandedChildrenLimit === x) |
| 1150 return; | 1152 return; |
| 1151 | 1153 |
| 1152 this._expandedChildrenLimit = x; | 1154 this._expandedChildrenLimit = x; |
| 1153 if (this.treeOutline && !this._updateChildrenInProgress) | 1155 if (this.treeOutline && !this._updateChildrenInProgress) |
| 1154 this._updateChildren(true, this.children); | 1156 this._updateChildren(true, undefined, this.children); |
| 1155 }, | 1157 }, |
| 1156 | 1158 |
| 1157 get expandedChildCount() | 1159 get expandedChildCount() |
| 1158 { | 1160 { |
| 1159 var count = this.children.length; | 1161 var count = this.children.length; |
| 1160 if (count && this.children[count - 1]._elementCloseTag) | 1162 if (count && this.children[count - 1]._elementCloseTag) |
| 1161 count--; | 1163 count--; |
| 1162 if (count && this.children[count - 1].expandAllButton) | 1164 if (count && this.children[count - 1].expandAllButton) |
| 1163 count--; | 1165 count--; |
| 1164 return count; | 1166 return count; |
| 1165 }, | 1167 }, |
| 1166 | 1168 |
| 1167 /** | 1169 /** |
| 1168 * @param {!WebInspector.DOMNode} child | 1170 * @param {!WebInspector.DOMNode} child |
| 1169 * @return {?WebInspector.ElementsTreeElement} | 1171 * @return {?WebInspector.ElementsTreeElement} |
| 1170 */ | 1172 */ |
| 1171 _showChild: function(child) | 1173 _showChild: function(child) |
| 1172 { | 1174 { |
| 1173 if (this._elementCloseTag) | 1175 if (this._elementCloseTag) |
| 1174 return null; | 1176 return null; |
| 1175 | 1177 |
| 1176 var index = this._visibleChildren().indexOf(child); | 1178 var index = this._visibleChildren().indexOf(child); |
| 1177 if (index === -1) | 1179 if (index === -1) |
| 1178 return null; | 1180 return null; |
| 1179 | 1181 |
| 1180 if (index >= this.expandedChildrenLimit) { | 1182 if (index >= this.expandedChildrenLimit) { |
| 1181 this._expandedChildrenLimit = index + 1; | 1183 this._expandedChildrenLimit = index + 1; |
| 1182 this._updateChildren(true, this.children); | 1184 this._updateChildren(true, undefined, this.children); |
| 1183 } | 1185 } |
| 1184 | 1186 |
| 1185 // Whether index-th child is visible in the children tree | 1187 // Whether index-th child is visible in the children tree |
| 1186 return this.expandedChildCount > index ? this.children[index] : null; | 1188 return this.expandedChildCount > index ? this.children[index] : null; |
| 1187 }, | 1189 }, |
| 1188 | 1190 |
| 1189 updateSelection: function() | 1191 updateSelection: function() |
| 1190 { | 1192 { |
| 1191 var listItemElement = this.listItemElement; | 1193 var listItemElement = this.listItemElement; |
| 1192 if (!listItemElement) | 1194 if (!listItemElement) |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1237 { | 1239 { |
| 1238 this.populated = true; | 1240 this.populated = true; |
| 1239 if (this.children.length || !this.hasChildren) | 1241 if (this.children.length || !this.hasChildren) |
| 1240 return; | 1242 return; |
| 1241 | 1243 |
| 1242 this.updateChildren(); | 1244 this.updateChildren(); |
| 1243 }, | 1245 }, |
| 1244 | 1246 |
| 1245 /** | 1247 /** |
| 1246 * @param {boolean=} fullRefresh | 1248 * @param {boolean=} fullRefresh |
| 1249 * @param {!WebInspector.ElementsTreeUpdater.Record=} updates | |
| 1247 */ | 1250 */ |
| 1248 updateChildren: function(fullRefresh) | 1251 updateChildren: function(fullRefresh, updates) |
| 1249 { | 1252 { |
| 1250 if (!this.hasChildren) | 1253 if (!this.hasChildren) |
| 1251 return; | 1254 return; |
| 1252 console.assert(!this._elementCloseTag); | 1255 console.assert(!this._elementCloseTag); |
| 1253 this._node.getChildNodes(this._updateChildren.bind(this, fullRefresh || false)); | 1256 this._node.getChildNodes(this._updateChildren.bind(this, fullRefresh || false, updates)); |
| 1254 }, | 1257 }, |
| 1255 | 1258 |
| 1256 /** | 1259 /** |
| 1257 * @param {!WebInspector.DOMNode} child | 1260 * @param {!WebInspector.DOMNode} child |
| 1258 * @param {number} index | 1261 * @param {number} index |
| 1259 * @param {boolean=} closingTag | 1262 * @param {boolean=} closingTag |
| 1263 * @param {boolean=} isUpdated | |
| 1260 * @return {!WebInspector.ElementsTreeElement} | 1264 * @return {!WebInspector.ElementsTreeElement} |
| 1261 */ | 1265 */ |
| 1262 insertChildElement: function(child, index, closingTag) | 1266 insertChildElement: function(child, index, closingTag, isUpdated) |
| 1263 { | 1267 { |
| 1264 var newElement = new WebInspector.ElementsTreeElement(child, closingTag) ; | 1268 var newElement = new WebInspector.ElementsTreeElement(child, closingTag, isUpdated); |
| 1265 newElement.selectable = this.treeOutline._selectEnabled; | 1269 newElement.selectable = this.treeOutline._selectEnabled; |
| 1266 this.insertChild(newElement, index); | 1270 this.insertChild(newElement, index); |
| 1267 return newElement; | 1271 return newElement; |
| 1268 }, | 1272 }, |
| 1269 | 1273 |
| 1270 moveChild: function(child, targetIndex) | 1274 moveChild: function(child, targetIndex) |
| 1271 { | 1275 { |
| 1272 var wasSelected = child.selected; | 1276 var wasSelected = child.selected; |
| 1273 this.removeChild(child); | 1277 this.removeChild(child); |
| 1274 this.insertChild(child, targetIndex); | 1278 this.insertChild(child, targetIndex); |
| 1275 if (wasSelected) | 1279 if (wasSelected) |
| 1276 child.select(); | 1280 child.select(); |
| 1277 }, | 1281 }, |
| 1278 | 1282 |
| 1279 /** | 1283 /** |
| 1280 * @param {boolean} fullRefresh | 1284 * @param {boolean} fullRefresh |
| 1285 * @param {!WebInspector.ElementsTreeUpdater.Record|undefined} childUpdates | |
| 1281 * @param {?Array.<!WebInspector.DOMNode>} children | 1286 * @param {?Array.<!WebInspector.DOMNode>} children |
| 1282 */ | 1287 */ |
| 1283 _updateChildren: function(fullRefresh, children) | 1288 _updateChildren: function(fullRefresh, childUpdates, children) |
| 1284 { | 1289 { |
| 1285 if (!children || this._updateChildrenInProgress || !this.treeOutline._vi sible) | 1290 if (!children || this._updateChildrenInProgress || !this.treeOutline._vi sible) |
| 1286 return; | 1291 return; |
| 1287 | 1292 |
| 1288 this._updateChildrenInProgress = true; | 1293 this._updateChildrenInProgress = true; |
| 1289 var selectedNode = this.treeOutline.selectedDOMNode(); | 1294 var selectedNode = this.treeOutline.selectedDOMNode(); |
| 1290 var originalScrollTop = 0; | 1295 var originalScrollTop = 0; |
| 1291 if (fullRefresh) { | 1296 if (fullRefresh) { |
| 1292 var treeOutlineContainerElement = this.treeOutline.element.parentNod e; | 1297 var treeOutlineContainerElement = this.treeOutline.element.parentNod e; |
| 1293 originalScrollTop = treeOutlineContainerElement.scrollTop; | 1298 originalScrollTop = treeOutlineContainerElement.scrollTop; |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 1320 break; | 1325 break; |
| 1321 } | 1326 } |
| 1322 } | 1327 } |
| 1323 | 1328 |
| 1324 if (existingTreeElement && existingTreeElement.parent === th is) { | 1329 if (existingTreeElement && existingTreeElement.parent === th is) { |
| 1325 // If an existing element was found and it has the same parent, just move it. | 1330 // If an existing element was found and it has the same parent, just move it. |
| 1326 this.moveChild(existingTreeElement, treeChildIndex); | 1331 this.moveChild(existingTreeElement, treeChildIndex); |
| 1327 } else { | 1332 } else { |
| 1328 // No existing element found, insert a new element. | 1333 // No existing element found, insert a new element. |
| 1329 if (treeChildIndex < this.expandedChildrenLimit) { | 1334 if (treeChildIndex < this.expandedChildrenLimit) { |
| 1330 var newElement = this.insertChildElement(child, tree ChildIndex); | 1335 var newElement = this.insertChildElement(child, tree ChildIndex, false, !!childUpdates && childUpdates.isNodeInserted(child)); |
|
pfeldman
2014/11/07 12:54:15
Can you do something like:
if (childUpdates.isNod
apavlov
2014/11/10 09:52:56
Done something along these lines with mыrging...
| |
| 1331 if (child === selectedNode) | 1336 if (child === selectedNode) |
| 1332 elementToSelect = newElement; | 1337 elementToSelect = newElement; |
| 1333 if (this.expandedChildCount > this.expandedChildrenL imit) | 1338 if (this.expandedChildCount > this.expandedChildrenL imit) |
| 1334 this.expandedChildrenLimit++; | 1339 this.expandedChildrenLimit++; |
| 1335 } | 1340 } |
| 1336 } | 1341 } |
| 1337 } | 1342 } |
| 1338 | 1343 |
| 1339 ++treeChildIndex; | 1344 ++treeChildIndex; |
| 1340 } | 1345 } |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 1353 continue; | 1358 continue; |
| 1354 | 1359 |
| 1355 var selectedTreeElement = this.treeOutline.selectedTreeElement; | 1360 var selectedTreeElement = this.treeOutline.selectedTreeElement; |
| 1356 if (selectedTreeElement && (selectedTreeElement === currentChild || selectedTreeElement.hasAncestor(currentChild))) | 1361 if (selectedTreeElement && (selectedTreeElement === currentChild || selectedTreeElement.hasAncestor(currentChild))) |
| 1357 this.select(); | 1362 this.select(); |
| 1358 | 1363 |
| 1359 this.removeChildAtIndex(i); | 1364 this.removeChildAtIndex(i); |
| 1360 } | 1365 } |
| 1361 | 1366 |
| 1362 var elementToSelect = updateChildrenOfNode.call(this); | 1367 var elementToSelect = updateChildrenOfNode.call(this); |
| 1363 this.updateTitle(); | 1368 this.updateTitle(false, childUpdates); |
| 1364 this._adjustCollapsedRange(); | 1369 this._adjustCollapsedRange(); |
| 1365 | 1370 |
| 1366 var lastChild = this.children[this.children.length - 1]; | 1371 var lastChild = this.children[this.children.length - 1]; |
| 1367 if (this._node.nodeType() === Node.ELEMENT_NODE && this.hasChildren) | 1372 if (this._node.nodeType() === Node.ELEMENT_NODE && this.hasChildren) |
| 1368 this.insertChildElement(this._node, this.children.length, true); | 1373 this.insertChildElement(this._node, this.children.length, true); |
| 1369 | 1374 |
| 1370 // We want to restore the original selection and tree scroll position af ter a full refresh, if possible. | 1375 // We want to restore the original selection and tree scroll position af ter a full refresh, if possible. |
| 1371 if (fullRefresh && elementToSelect) { | 1376 if (fullRefresh && elementToSelect) { |
| 1372 elementToSelect.select(); | 1377 elementToSelect.select(); |
| 1373 if (treeOutlineContainerElement && originalScrollTop <= treeOutlineC ontainerElement.scrollHeight) | 1378 if (treeOutlineContainerElement && originalScrollTop <= treeOutlineC ontainerElement.scrollHeight) |
| (...skipping 781 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2155 | 2160 |
| 2156 // Remaining cases are single line non-expanded elements with a closing | 2161 // Remaining cases are single line non-expanded elements with a closing |
| 2157 // tag, or HTML elements without a closing tag (such as <br>). Return | 2162 // tag, or HTML elements without a closing tag (such as <br>). Return |
| 2158 // null in the case where there isn't a closing tag. | 2163 // null in the case where there isn't a closing tag. |
| 2159 var tags = this.listItemElement.getElementsByClassName("webkit-html-tag" ); | 2164 var tags = this.listItemElement.getElementsByClassName("webkit-html-tag" ); |
| 2160 return (tags.length === 1 ? null : tags[tags.length-1]); | 2165 return (tags.length === 1 ? null : tags[tags.length-1]); |
| 2161 }, | 2166 }, |
| 2162 | 2167 |
| 2163 /** | 2168 /** |
| 2164 * @param {boolean=} onlySearchQueryChanged | 2169 * @param {boolean=} onlySearchQueryChanged |
| 2170 * @param {!WebInspector.ElementsTreeUpdater.Record=} updates | |
| 2165 */ | 2171 */ |
| 2166 updateTitle: function(onlySearchQueryChanged) | 2172 updateTitle: function(onlySearchQueryChanged, updates) |
| 2167 { | 2173 { |
| 2168 // If we are editing, return early to prevent canceling the edit. | 2174 // If we are editing, return early to prevent canceling the edit. |
| 2169 // After editing is committed updateTitle will be called. | 2175 // After editing is committed updateTitle will be called. |
| 2170 if (this._editing) | 2176 if (this._editing) |
| 2171 return; | 2177 return; |
| 2172 | 2178 |
| 2179 this._updates = updates; | |
| 2173 if (onlySearchQueryChanged) { | 2180 if (onlySearchQueryChanged) { |
| 2174 if (this._highlightResult) | 2181 if (this._highlightResult) |
| 2175 this._updateSearchHighlight(false); | 2182 this._updateSearchHighlight(false); |
| 2176 } else { | 2183 } else { |
| 2177 var nodeInfo = this._nodeTitleInfo(WebInspector.linkifyURLAsNode); | 2184 var nodeInfo = this._nodeTitleInfo(WebInspector.linkifyURLAsNode); |
| 2178 if (nodeInfo.shadowRoot) | 2185 if (nodeInfo.shadowRoot) |
| 2179 this.listItemElement.classList.add("shadow-root"); | 2186 this.listItemElement.classList.add("shadow-root"); |
| 2180 var highlightElement = createElement("span"); | 2187 var highlightElement = createElement("span"); |
| 2181 highlightElement.className = "highlight"; | 2188 highlightElement.className = "highlight"; |
| 2182 highlightElement.appendChild(nodeInfo.titleDOM); | 2189 highlightElement.appendChild(nodeInfo.titleDOM); |
| 2183 this.title = highlightElement; | 2190 this.title = highlightElement; |
| 2184 this._updateDecorations(); | 2191 this._updateDecorations(); |
| 2185 delete this._highlightResult; | 2192 delete this._highlightResult; |
| 2186 } | 2193 } |
| 2187 | 2194 |
| 2195 delete this._isUpdated; | |
| 2188 delete this.selectionElement; | 2196 delete this.selectionElement; |
| 2189 if (this.selected) | 2197 if (this.selected) |
| 2190 this.updateSelection(); | 2198 this.updateSelection(); |
| 2191 this._preventFollowingLinksOnDoubleClick(); | 2199 this._preventFollowingLinksOnDoubleClick(); |
| 2192 this._highlightSearchResults(); | 2200 this._highlightSearchResults(); |
| 2193 }, | 2201 }, |
| 2194 | 2202 |
| 2195 /** | 2203 /** |
| 2196 * @return {?Element} | 2204 * @return {?Element} |
| 2197 */ | 2205 */ |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2286 var hasText = (forceValue || value.length > 0); | 2294 var hasText = (forceValue || value.length > 0); |
| 2287 var attrSpanElement = parentElement.createChild("span", "webkit-html-att ribute"); | 2295 var attrSpanElement = parentElement.createChild("span", "webkit-html-att ribute"); |
| 2288 var attrNameElement = attrSpanElement.createChild("span", "webkit-html-a ttribute-name"); | 2296 var attrNameElement = attrSpanElement.createChild("span", "webkit-html-a ttribute-name"); |
| 2289 attrNameElement.textContent = name; | 2297 attrNameElement.textContent = name; |
| 2290 | 2298 |
| 2291 if (hasText) | 2299 if (hasText) |
| 2292 attrSpanElement.createTextChild("=\u200B\""); | 2300 attrSpanElement.createTextChild("=\u200B\""); |
| 2293 | 2301 |
| 2294 var attrValueElement = attrSpanElement.createChild("span", "webkit-html- attribute-value"); | 2302 var attrValueElement = attrSpanElement.createChild("span", "webkit-html- attribute-value"); |
| 2295 | 2303 |
| 2304 if (this._updates && this._updates.isAttributeModified(name)) | |
| 2305 WebInspector.runCSSAnimationOnce(hasText ? attrValueElement : attrNa meElement, "dom-update-highlight"); | |
| 2306 | |
| 2296 /** | 2307 /** |
| 2297 * @this {WebInspector.ElementsTreeElement} | 2308 * @this {WebInspector.ElementsTreeElement} |
| 2298 * @param {string} value | 2309 * @param {string} value |
| 2299 * @return {!Element} | 2310 * @return {!Element} |
| 2300 */ | 2311 */ |
| 2301 function linkifyValue(value) | 2312 function linkifyValue(value) |
| 2302 { | 2313 { |
| 2303 var rewrittenHref = node.resolveURL(value); | 2314 var rewrittenHref = node.resolveURL(value); |
| 2304 if (rewrittenHref === null) { | 2315 if (rewrittenHref === null) { |
| 2305 var span = createElement("span"); | 2316 var span = createElement("span"); |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2357 _buildTagDOM: function(parentElement, tagName, isClosingTag, isDistinctTreeE lement, linkify) | 2368 _buildTagDOM: function(parentElement, tagName, isClosingTag, isDistinctTreeE lement, linkify) |
| 2358 { | 2369 { |
| 2359 var node = this._node; | 2370 var node = this._node; |
| 2360 var classes = [ "webkit-html-tag" ]; | 2371 var classes = [ "webkit-html-tag" ]; |
| 2361 if (isClosingTag && isDistinctTreeElement) | 2372 if (isClosingTag && isDistinctTreeElement) |
| 2362 classes.push("close"); | 2373 classes.push("close"); |
| 2363 var tagElement = parentElement.createChild("span", classes.join(" ")); | 2374 var tagElement = parentElement.createChild("span", classes.join(" ")); |
| 2364 tagElement.createTextChild("<"); | 2375 tagElement.createTextChild("<"); |
| 2365 var tagNameElement = tagElement.createChild("span", isClosingTag ? "" : "webkit-html-tag-name"); | 2376 var tagNameElement = tagElement.createChild("span", isClosingTag ? "" : "webkit-html-tag-name"); |
| 2366 tagNameElement.textContent = (isClosingTag ? "/" : "") + tagName; | 2377 tagNameElement.textContent = (isClosingTag ? "/" : "") + tagName; |
| 2367 if (!isClosingTag && node.hasAttributes()) { | 2378 if (!isClosingTag) { |
| 2368 var attributes = node.attributes(); | 2379 if (node.hasAttributes()) { |
| 2369 for (var i = 0; i < attributes.length; ++i) { | 2380 var attributes = node.attributes(); |
| 2370 var attr = attributes[i]; | 2381 for (var i = 0; i < attributes.length; ++i) { |
| 2371 tagElement.createTextChild(" "); | 2382 var attr = attributes[i]; |
| 2372 this._buildAttributeDOM(tagElement, attr.name, attr.value, false , node, linkify); | 2383 tagElement.createTextChild(" "); |
| 2384 this._buildAttributeDOM(tagElement, attr.name, attr.value, f alse, node, linkify); | |
| 2385 } | |
| 2373 } | 2386 } |
| 2387 if (this._isUpdated || (this._updates && (this._updates.hasRemovedAt tributes() || this._updates.hasChangedChildren()))) | |
| 2388 WebInspector.runCSSAnimationOnce(tagNameElement, "dom-update-hig hlight"); | |
| 2374 } | 2389 } |
| 2390 | |
| 2375 tagElement.createTextChild(">"); | 2391 tagElement.createTextChild(">"); |
| 2376 parentElement.createTextChild("\u200B"); | 2392 parentElement.createTextChild("\u200B"); |
| 2377 }, | 2393 }, |
| 2378 | 2394 |
| 2379 /** | 2395 /** |
| 2380 * @param {string} text | 2396 * @param {string} text |
| 2381 * @return {!{text: string, entityRanges: !Array.<!WebInspector.SourceRange> }} | 2397 * @return {!{text: string, entityRanges: !Array.<!WebInspector.SourceRange> }} |
| 2382 */ | 2398 */ |
| 2383 _convertWhitespaceToEntities: function(text) | 2399 _convertWhitespaceToEntities: function(text) |
| 2384 { | 2400 { |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2447 // create a subtree for them | 2463 // create a subtree for them |
| 2448 if (showInlineText) { | 2464 if (showInlineText) { |
| 2449 console.assert(!this.hasChildren); | 2465 console.assert(!this.hasChildren); |
| 2450 var textNodeElement = info.titleDOM.createChild("span", "web kit-html-text-node"); | 2466 var textNodeElement = info.titleDOM.createChild("span", "web kit-html-text-node"); |
| 2451 var result = this._convertWhitespaceToEntities(node.firstChi ld.nodeValue()); | 2467 var result = this._convertWhitespaceToEntities(node.firstChi ld.nodeValue()); |
| 2452 textNodeElement.textContent = result.text; | 2468 textNodeElement.textContent = result.text; |
| 2453 WebInspector.highlightRangesWithStyleClass(textNodeElement, result.entityRanges, "webkit-html-entity-value"); | 2469 WebInspector.highlightRangesWithStyleClass(textNodeElement, result.entityRanges, "webkit-html-entity-value"); |
| 2454 info.titleDOM.createTextChild("\u200B"); | 2470 info.titleDOM.createTextChild("\u200B"); |
| 2455 this._buildTagDOM(info.titleDOM, tagName, true, false); | 2471 this._buildTagDOM(info.titleDOM, tagName, true, false); |
| 2456 info.hasChildren = false; | 2472 info.hasChildren = false; |
| 2473 if (this._updates && (this._updates.isCharDataModified() || this._updates.hasInsertedNodes())) | |
| 2474 WebInspector.runCSSAnimationOnce(textNodeElement, "dom-u pdate-highlight"); | |
| 2457 } | 2475 } |
| 2458 break; | 2476 break; |
| 2459 | 2477 |
| 2460 case Node.TEXT_NODE: | 2478 case Node.TEXT_NODE: |
| 2461 if (node.parentNode && node.parentNode.nodeName().toLowerCase() === "script") { | 2479 if (node.parentNode && node.parentNode.nodeName().toLowerCase() === "script") { |
| 2462 var newNode = info.titleDOM.createChild("span", "webkit-html -text-node webkit-html-js-node"); | 2480 var newNode = info.titleDOM.createChild("span", "webkit-html -text-node webkit-html-js-node"); |
| 2463 newNode.textContent = node.nodeValue(); | 2481 newNode.textContent = node.nodeValue(); |
| 2464 | 2482 |
| 2465 var javascriptSyntaxHighlighter = new WebInspector.DOMSyntax Highlighter("text/javascript", true); | 2483 var javascriptSyntaxHighlighter = new WebInspector.DOMSyntax Highlighter("text/javascript", true); |
| 2466 javascriptSyntaxHighlighter.syntaxHighlightNode(newNode); | 2484 javascriptSyntaxHighlighter.syntaxHighlightNode(newNode); |
| 2467 } else if (node.parentNode && node.parentNode.nodeName().toLower Case() === "style") { | 2485 } else if (node.parentNode && node.parentNode.nodeName().toLower Case() === "style") { |
| 2468 var newNode = info.titleDOM.createChild("span", "webkit-html -text-node webkit-html-css-node"); | 2486 var newNode = info.titleDOM.createChild("span", "webkit-html -text-node webkit-html-css-node"); |
| 2469 newNode.textContent = node.nodeValue(); | 2487 newNode.textContent = node.nodeValue(); |
| 2470 | 2488 |
| 2471 var cssSyntaxHighlighter = new WebInspector.DOMSyntaxHighlig hter("text/css", true); | 2489 var cssSyntaxHighlighter = new WebInspector.DOMSyntaxHighlig hter("text/css", true); |
| 2472 cssSyntaxHighlighter.syntaxHighlightNode(newNode); | 2490 cssSyntaxHighlighter.syntaxHighlightNode(newNode); |
| 2473 } else { | 2491 } else { |
| 2474 info.titleDOM.createTextChild("\""); | 2492 info.titleDOM.createTextChild("\""); |
| 2475 var textNodeElement = info.titleDOM.createChild("span", "web kit-html-text-node"); | 2493 var textNodeElement = info.titleDOM.createChild("span", "web kit-html-text-node"); |
| 2476 var result = this._convertWhitespaceToEntities(node.nodeValu e()); | 2494 var result = this._convertWhitespaceToEntities(node.nodeValu e()); |
| 2477 textNodeElement.textContent = result.text; | 2495 textNodeElement.textContent = result.text; |
| 2478 WebInspector.highlightRangesWithStyleClass(textNodeElement, result.entityRanges, "webkit-html-entity-value"); | 2496 WebInspector.highlightRangesWithStyleClass(textNodeElement, result.entityRanges, "webkit-html-entity-value"); |
| 2479 info.titleDOM.createTextChild("\""); | 2497 info.titleDOM.createTextChild("\""); |
| 2498 if (this._isUpdated || (this._updates && this._updates.isCha rDataModified())) | |
| 2499 WebInspector.runCSSAnimationOnce(textNodeElement, "dom-u pdate-highlight"); | |
| 2480 } | 2500 } |
| 2481 break; | 2501 break; |
| 2482 | 2502 |
| 2483 case Node.COMMENT_NODE: | 2503 case Node.COMMENT_NODE: |
| 2484 var commentElement = info.titleDOM.createChild("span", "webkit-h tml-comment"); | 2504 var commentElement = info.titleDOM.createChild("span", "webkit-h tml-comment"); |
| 2485 commentElement.createTextChild("<!--" + node.nodeValue() + "-->" ); | 2505 commentElement.createTextChild("<!--" + node.nodeValue() + "-->" ); |
| 2486 break; | 2506 break; |
| 2487 | 2507 |
| 2488 case Node.DOCUMENT_TYPE_NODE: | 2508 case Node.DOCUMENT_TYPE_NODE: |
| 2489 var docTypeElement = info.titleDOM.createChild("span", "webkit-h tml-doctype"); | 2509 var docTypeElement = info.titleDOM.createChild("span", "webkit-h tml-doctype"); |
| 2490 docTypeElement.createTextChild("<!DOCTYPE " + node.nodeName()); | 2510 docTypeElement.createTextChild("<!DOCTYPE " + node.nodeName()); |
| 2491 if (node.publicId) { | 2511 if (node.publicId) { |
| 2492 docTypeElement.createTextChild(" PUBLIC \"" + node.publicId + "\""); | 2512 docTypeElement.createTextChild(" PUBLIC \"" + node.publicId + "\""); |
| 2493 if (node.systemId) | 2513 if (node.systemId) |
| 2494 docTypeElement.createTextChild(" \"" + node.systemId + " \""); | 2514 docTypeElement.createTextChild(" \"" + node.systemId + " \""); |
| 2495 } else if (node.systemId) | 2515 } else if (node.systemId) |
| 2496 docTypeElement.createTextChild(" SYSTEM \"" + node.systemId + "\""); | 2516 docTypeElement.createTextChild(" SYSTEM \"" + node.systemId + "\""); |
| 2497 | 2517 |
| 2498 if (node.internalSubset) | 2518 if (node.internalSubset) |
| 2499 docTypeElement.createTextChild(" [" + node.internalSubset + "]"); | 2519 docTypeElement.createTextChild(" [" + node.internalSubset + "]"); |
| 2500 | 2520 |
| 2501 docTypeElement.createTextChild(">"); | 2521 docTypeElement.createTextChild(">"); |
| 2502 break; | 2522 break; |
| 2503 | 2523 |
| 2504 case Node.CDATA_SECTION_NODE: | 2524 case Node.CDATA_SECTION_NODE: |
| 2505 var cdataElement = info.titleDOM.createChild("span", "webkit-htm l-text-node"); | 2525 var cdataElement = info.titleDOM.createChild("span", "webkit-htm l-text-node"); |
| 2506 cdataElement.createTextChild("<![CDATA[" + node.nodeValue() + "] ]>"); | 2526 cdataElement.createTextChild("<![CDATA[" + node.nodeValue() + "] ]>"); |
| 2507 break; | 2527 break; |
| 2528 | |
| 2508 case Node.DOCUMENT_FRAGMENT_NODE: | 2529 case Node.DOCUMENT_FRAGMENT_NODE: |
| 2509 var fragmentElement = info.titleDOM.createChild("span", "webkit- html-fragment"); | 2530 var fragmentElement = info.titleDOM.createChild("span", "webkit- html-fragment"); |
| 2510 if (node.isInShadowTree()) { | 2531 if (node.isInShadowTree()) { |
| 2511 var shadowRootType = node.shadowRootType(); | 2532 var shadowRootType = node.shadowRootType(); |
| 2512 if (shadowRootType) { | 2533 if (shadowRootType) { |
| 2513 info.shadowRoot = true; | 2534 info.shadowRoot = true; |
| 2514 fragmentElement.classList.add("shadow-root"); | 2535 fragmentElement.classList.add("shadow-root"); |
| 2515 } | 2536 } |
| 2516 } | 2537 } |
| 2517 fragmentElement.textContent = node.nodeNameInCorrectCase().colla pseWhitespace(); | 2538 fragmentElement.textContent = node.nodeNameInCorrectCase().colla pseWhitespace(); |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2728 | 2749 |
| 2729 /** | 2750 /** |
| 2730 * @constructor | 2751 * @constructor |
| 2731 * @param {!WebInspector.DOMModel} domModel | 2752 * @param {!WebInspector.DOMModel} domModel |
| 2732 * @param {!WebInspector.ElementsTreeOutline} treeOutline | 2753 * @param {!WebInspector.ElementsTreeOutline} treeOutline |
| 2733 */ | 2754 */ |
| 2734 WebInspector.ElementsTreeUpdater = function(domModel, treeOutline) | 2755 WebInspector.ElementsTreeUpdater = function(domModel, treeOutline) |
| 2735 { | 2756 { |
| 2736 domModel.addEventListener(WebInspector.DOMModel.Events.NodeInserted, this._n odeInserted, this); | 2757 domModel.addEventListener(WebInspector.DOMModel.Events.NodeInserted, this._n odeInserted, this); |
| 2737 domModel.addEventListener(WebInspector.DOMModel.Events.NodeRemoved, this._no deRemoved, this); | 2758 domModel.addEventListener(WebInspector.DOMModel.Events.NodeRemoved, this._no deRemoved, this); |
| 2738 domModel.addEventListener(WebInspector.DOMModel.Events.AttrModified, this._a ttributesUpdated, this); | 2759 domModel.addEventListener(WebInspector.DOMModel.Events.AttrModified, this._a ttributeModified, this); |
| 2739 domModel.addEventListener(WebInspector.DOMModel.Events.AttrRemoved, this._at tributesUpdated, this); | 2760 domModel.addEventListener(WebInspector.DOMModel.Events.AttrRemoved, this._at tributeRemoved, this); |
| 2740 domModel.addEventListener(WebInspector.DOMModel.Events.CharacterDataModified , this._characterDataModified, this); | 2761 domModel.addEventListener(WebInspector.DOMModel.Events.CharacterDataModified , this._characterDataModified, this); |
| 2741 domModel.addEventListener(WebInspector.DOMModel.Events.DocumentUpdated, this ._documentUpdated, this); | 2762 domModel.addEventListener(WebInspector.DOMModel.Events.DocumentUpdated, this ._documentUpdated, this); |
| 2742 domModel.addEventListener(WebInspector.DOMModel.Events.ChildNodeCountUpdated , this._childNodeCountUpdated, this); | 2763 domModel.addEventListener(WebInspector.DOMModel.Events.ChildNodeCountUpdated , this._childNodeCountUpdated, this); |
| 2743 | 2764 |
| 2744 this._domModel = domModel; | 2765 this._domModel = domModel; |
| 2745 this._treeOutline = treeOutline; | 2766 this._treeOutline = treeOutline; |
| 2746 /** @type {!Set.<!WebInspector.DOMNode>} */ | 2767 /** @type {!Map.<!WebInspector.DOMNode, !WebInspector.ElementsTreeUpdater.Re cord>} */ |
| 2747 this._recentlyModifiedNodes = new Set(); | 2768 this._recentlyModifiedNodes = new Map(); |
| 2748 /** @type {!Set.<!WebInspector.DOMNode>} */ | 2769 /** @type {!Map.<!WebInspector.DOMNode, !WebInspector.ElementsTreeUpdater.Re cord>} */ |
| 2749 this._recentlyModifiedParentNodes = new Set(); | 2770 this._recentlyModifiedParentNodes = new Map(); |
| 2750 } | 2771 } |
| 2751 | 2772 |
| 2752 WebInspector.ElementsTreeUpdater.prototype = { | 2773 WebInspector.ElementsTreeUpdater.prototype = { |
| 2753 dispose: function() | 2774 dispose: function() |
| 2754 { | 2775 { |
| 2755 this._domModel.removeEventListener(WebInspector.DOMModel.Events.NodeInse rted, this._nodeInserted, this); | 2776 this._domModel.removeEventListener(WebInspector.DOMModel.Events.NodeInse rted, this._nodeInserted, this); |
| 2756 this._domModel.removeEventListener(WebInspector.DOMModel.Events.NodeRemo ved, this._nodeRemoved, this); | 2777 this._domModel.removeEventListener(WebInspector.DOMModel.Events.NodeRemo ved, this._nodeRemoved, this); |
| 2757 this._domModel.removeEventListener(WebInspector.DOMModel.Events.AttrModi fied, this._attributesUpdated, this); | 2778 this._domModel.removeEventListener(WebInspector.DOMModel.Events.AttrModi fied, this._attributeModified, this); |
| 2758 this._domModel.removeEventListener(WebInspector.DOMModel.Events.AttrRemo ved, this._attributesUpdated, this); | 2779 this._domModel.removeEventListener(WebInspector.DOMModel.Events.AttrRemo ved, this._attributeRemoved, this); |
| 2759 this._domModel.removeEventListener(WebInspector.DOMModel.Events.Characte rDataModified, this._characterDataModified, this); | 2780 this._domModel.removeEventListener(WebInspector.DOMModel.Events.Characte rDataModified, this._characterDataModified, this); |
| 2760 this._domModel.removeEventListener(WebInspector.DOMModel.Events.Document Updated, this._documentUpdated, this); | 2781 this._domModel.removeEventListener(WebInspector.DOMModel.Events.Document Updated, this._documentUpdated, this); |
| 2761 this._domModel.removeEventListener(WebInspector.DOMModel.Events.ChildNod eCountUpdated, this._childNodeCountUpdated, this); | 2782 this._domModel.removeEventListener(WebInspector.DOMModel.Events.ChildNod eCountUpdated, this._childNodeCountUpdated, this); |
| 2762 }, | 2783 }, |
| 2763 | 2784 |
| 2764 /** | 2785 /** |
| 2765 * @param {?WebInspector.DOMNode} parentNode | 2786 * @param {?WebInspector.DOMNode} parentNode |
| 2787 * @param {!WebInspector.ElementsTreeUpdater.Record.ChangeType} changeType | |
| 2788 * @param {string|!WebInspector.DOMNode=} relatedTarget | |
| 2766 */ | 2789 */ |
| 2767 _parentNodeModified: function(parentNode) | 2790 _parentNodeModified: function(parentNode, changeType, relatedTarget) |
| 2768 { | 2791 { |
| 2769 if (!parentNode) | 2792 if (!parentNode) |
| 2770 return; | 2793 return; |
| 2771 this._recentlyModifiedParentNodes.add(parentNode); | 2794 var record = this._recentlyModifiedParentNodes.get(parentNode); |
| 2795 if (!record) { | |
| 2796 record = new WebInspector.ElementsTreeUpdater.Record(); | |
| 2797 this._recentlyModifiedParentNodes.set(parentNode, record); | |
| 2798 } | |
| 2799 record.merge(parentNode, changeType, relatedTarget); | |
| 2772 | 2800 |
| 2773 var treeElement = this._treeOutline.findTreeElement(parentNode); | 2801 var treeElement = this._treeOutline.findTreeElement(parentNode); |
| 2774 if (treeElement) { | 2802 if (treeElement) { |
| 2775 var oldHasChildren = treeElement.hasChildren; | 2803 var oldHasChildren = treeElement.hasChildren; |
| 2776 var oldShowInlineText = treeElement._showInlineText(); | 2804 var oldShowInlineText = treeElement._showInlineText(); |
| 2777 treeElement._updateHasChildren(); | 2805 treeElement._updateHasChildren(); |
| 2778 if (treeElement.hasChildren !== oldHasChildren || oldShowInlineText || treeElement._showInlineText()) | 2806 if (treeElement.hasChildren !== oldHasChildren || oldShowInlineText || treeElement._showInlineText()) |
| 2779 this._nodeModified(parentNode); | 2807 this._nodeModified(parentNode, changeType, relatedTarget); |
| 2780 } | 2808 } |
| 2781 | 2809 |
| 2782 if (this._treeOutline._visible) | 2810 if (this._treeOutline._visible) |
| 2783 this._updateModifiedNodesSoon(); | 2811 this._updateModifiedNodesSoon(); |
| 2784 }, | 2812 }, |
| 2785 | 2813 |
| 2786 /** | 2814 /** |
| 2787 * @param {!WebInspector.DOMNode} node | 2815 * @param {!WebInspector.DOMNode} node |
| 2816 * @param {!WebInspector.ElementsTreeUpdater.Record.ChangeType} changeType | |
| 2817 * @param {string|!WebInspector.DOMNode=} relatedTarget | |
| 2788 */ | 2818 */ |
| 2789 _nodeModified: function(node) | 2819 _nodeModified: function(node, changeType, relatedTarget) |
| 2790 { | 2820 { |
| 2791 this._recentlyModifiedNodes.add(node); | 2821 var record = this._recentlyModifiedNodes.get(node); |
| 2822 if (!record) { | |
| 2823 record = new WebInspector.ElementsTreeUpdater.Record(); | |
| 2824 this._recentlyModifiedNodes.set(node, record); | |
| 2825 } | |
| 2826 record.merge(node, changeType, relatedTarget); | |
| 2792 if (this._treeOutline._visible) | 2827 if (this._treeOutline._visible) |
| 2793 this._updateModifiedNodesSoon(); | 2828 this._updateModifiedNodesSoon(); |
| 2794 }, | 2829 }, |
| 2795 | 2830 |
| 2796 /** | 2831 /** |
| 2797 * @param {!WebInspector.Event} event | 2832 * @param {!WebInspector.Event} event |
| 2798 */ | 2833 */ |
| 2799 _documentUpdated: function(event) | 2834 _documentUpdated: function(event) |
| 2800 { | 2835 { |
| 2801 var inspectedRootDocument = event.data; | 2836 var inspectedRootDocument = event.data; |
| 2802 | 2837 |
| 2803 this._reset(); | 2838 this._reset(); |
| 2804 | 2839 |
| 2805 if (!inspectedRootDocument) | 2840 if (!inspectedRootDocument) |
| 2806 return; | 2841 return; |
| 2807 | 2842 |
| 2808 this._treeOutline.rootDOMNode = inspectedRootDocument; | 2843 this._treeOutline.rootDOMNode = inspectedRootDocument; |
| 2809 }, | 2844 }, |
| 2810 | 2845 |
| 2811 /** | 2846 /** |
| 2812 * @param {!WebInspector.Event} event | 2847 * @param {!WebInspector.Event} event |
| 2813 */ | 2848 */ |
| 2814 _attributesUpdated: function(event) | 2849 _attributeModified: function(event) |
| 2815 { | 2850 { |
| 2816 var node = /** @type {!WebInspector.DOMNode} */ (event.data.node); | 2851 var node = /** @type {!WebInspector.DOMNode} */ (event.data.node); |
| 2817 this._nodeModified(node); | 2852 this._nodeModified(node, WebInspector.ElementsTreeUpdater.Record.ChangeT ype.AttrModified, event.data.name); |
|
pfeldman
2014/11/07 12:54:15
Lets inline record creation here.
apavlov
2014/11/10 09:52:56
This will result in one record per single DOM upda
| |
| 2818 }, | 2853 }, |
| 2819 | 2854 |
| 2820 /** | 2855 /** |
| 2856 * @param {!WebInspector.Event} event | |
| 2857 */ | |
| 2858 _attributeRemoved: function(event) | |
| 2859 { | |
| 2860 var node = /** @type {!WebInspector.DOMNode} */ (event.data.node); | |
| 2861 this._nodeModified(node, WebInspector.ElementsTreeUpdater.Record.ChangeT ype.AttrRemoved, event.data.name); | |
| 2862 }, | |
| 2863 | |
| 2864 /** | |
| 2821 * @param {!WebInspector.Event} event | 2865 * @param {!WebInspector.Event} event |
| 2822 */ | 2866 */ |
| 2823 _characterDataModified: function(event) | 2867 _characterDataModified: function(event) |
| 2824 { | 2868 { |
| 2825 var node = /** @type {!WebInspector.DOMNode} */ (event.data); | 2869 var node = /** @type {!WebInspector.DOMNode} */ (event.data); |
| 2826 this._parentNodeModified(node.parentNode); | 2870 this._parentNodeModified(node.parentNode, WebInspector.ElementsTreeUpdat er.Record.ChangeType.CharDataModified, node); |
| 2827 this._nodeModified(node); | 2871 this._nodeModified(node, WebInspector.ElementsTreeUpdater.Record.ChangeT ype.CharDataModified); |
| 2828 }, | 2872 }, |
| 2829 | 2873 |
| 2830 /** | 2874 /** |
| 2831 * @param {!WebInspector.Event} event | 2875 * @param {!WebInspector.Event} event |
| 2832 */ | 2876 */ |
| 2833 _nodeInserted: function(event) | 2877 _nodeInserted: function(event) |
| 2834 { | 2878 { |
| 2835 var node = /** @type {!WebInspector.DOMNode} */ (event.data); | 2879 var node = /** @type {!WebInspector.DOMNode} */ (event.data); |
| 2836 this._parentNodeModified(node.parentNode); | 2880 this._parentNodeModified(node.parentNode, WebInspector.ElementsTreeUpdat er.Record.ChangeType.NodeInserted, node); |
| 2837 }, | 2881 }, |
| 2838 | 2882 |
| 2839 /** | 2883 /** |
| 2840 * @param {!WebInspector.Event} event | 2884 * @param {!WebInspector.Event} event |
| 2841 */ | 2885 */ |
| 2842 _nodeRemoved: function(event) | 2886 _nodeRemoved: function(event) |
| 2843 { | 2887 { |
| 2844 var node = /** @type {!WebInspector.DOMNode} */ (event.data.node); | 2888 var node = /** @type {!WebInspector.DOMNode} */ (event.data.node); |
| 2845 var parentNode = /** @type {!WebInspector.DOMNode} */ (event.data.parent ); | 2889 var parentNode = /** @type {!WebInspector.DOMNode} */ (event.data.parent ); |
| 2846 this._treeOutline._resetClipboardIfNeeded(node); | 2890 this._treeOutline._resetClipboardIfNeeded(node); |
| 2847 this._parentNodeModified(parentNode); | 2891 this._parentNodeModified(parentNode, WebInspector.ElementsTreeUpdater.Re cord.ChangeType.ChildNodeRemoved); |
| 2848 }, | 2892 }, |
| 2849 | 2893 |
| 2850 /** | 2894 /** |
| 2851 * @param {!WebInspector.Event} event | 2895 * @param {!WebInspector.Event} event |
| 2852 */ | 2896 */ |
| 2853 _childNodeCountUpdated: function(event) | 2897 _childNodeCountUpdated: function(event) |
| 2854 { | 2898 { |
| 2855 var node = /** @type {!WebInspector.DOMNode} */ (event.data); | 2899 var node = /** @type {!WebInspector.DOMNode} */ (event.data); |
| 2856 this._parentNodeModified(node); | 2900 this._parentNodeModified(node, WebInspector.ElementsTreeUpdater.Record.C hangeType.ChildNodeCountUpdated); |
|
pfeldman
2014/11/07 12:54:15
Lets not use this signal.
apavlov
2014/11/10 09:52:56
Done.
| |
| 2857 }, | 2901 }, |
| 2858 | 2902 |
| 2859 _updateModifiedNodesSoon: function() | 2903 _updateModifiedNodesSoon: function() |
| 2860 { | 2904 { |
| 2861 if (this._updateModifiedNodesTimeout) | 2905 if (this._updateModifiedNodesTimeout) |
| 2862 return; | 2906 return; |
| 2863 this._updateModifiedNodesTimeout = setTimeout(this._updateModifiedNodes. bind(this), 50); | 2907 this._updateModifiedNodesTimeout = setTimeout(this._updateModifiedNodes. bind(this), 50); |
| 2864 }, | 2908 }, |
| 2865 | 2909 |
| 2866 _updateModifiedNodes: function() | 2910 _updateModifiedNodes: function() |
| 2867 { | 2911 { |
| 2868 if (this._updateModifiedNodesTimeout) { | 2912 if (this._updateModifiedNodesTimeout) { |
| 2869 clearTimeout(this._updateModifiedNodesTimeout); | 2913 clearTimeout(this._updateModifiedNodesTimeout); |
| 2870 delete this._updateModifiedNodesTimeout; | 2914 delete this._updateModifiedNodesTimeout; |
| 2871 } | 2915 } |
| 2872 | 2916 |
| 2873 var updatedNodes = this._recentlyModifiedNodes.valuesArray().concat(this ._recentlyModifiedParentNodes.valuesArray()); | 2917 var updatedNodes = this._recentlyModifiedNodes.keysArray().concat(this._ recentlyModifiedParentNodes.keysArray()); |
| 2874 var hidePanelWhileUpdating = updatedNodes.length > 10; | 2918 var hidePanelWhileUpdating = updatedNodes.length > 10; |
| 2875 if (hidePanelWhileUpdating) { | 2919 if (hidePanelWhileUpdating) { |
| 2876 var treeOutlineContainerElement = this._treeOutline.element.parentNo de; | 2920 var treeOutlineContainerElement = this._treeOutline.element.parentNo de; |
| 2877 var originalScrollTop = treeOutlineContainerElement ? treeOutlineCon tainerElement.scrollTop : 0; | 2921 var originalScrollTop = treeOutlineContainerElement ? treeOutlineCon tainerElement.scrollTop : 0; |
| 2878 this._treeOutline._element.classList.add("hidden"); | 2922 this._treeOutline._element.classList.add("hidden"); |
| 2879 } | 2923 } |
| 2880 | 2924 |
| 2881 if (this._treeOutline._rootDOMNode && this._recentlyModifiedParentNodes. has(this._treeOutline._rootDOMNode)) { | 2925 if (this._treeOutline._rootDOMNode && this._recentlyModifiedParentNodes. has(this._treeOutline._rootDOMNode)) { |
| 2882 // Document's children have changed, perform total update. | 2926 // Document's children have changed, perform total update. |
| 2883 this._treeOutline.update(); | 2927 this._treeOutline.update(); |
| 2884 } else { | 2928 } else { |
| 2885 var nodes = this._recentlyModifiedNodes.valuesArray(); | 2929 var highlightDOMUpdates = WebInspector.settings.highlightDOMUpdates. get(); |
| 2930 var nodes = this._recentlyModifiedNodes.keysArray(); | |
| 2886 for (var i = 0, size = nodes.length; i < size; ++i) { | 2931 for (var i = 0, size = nodes.length; i < size; ++i) { |
| 2887 var nodeItem = this._treeOutline.findTreeElement(nodes[i]); | 2932 var nodeItem = this._treeOutline.findTreeElement(nodes[i]); |
| 2888 if (nodeItem) | 2933 if (nodeItem) |
| 2889 nodeItem.updateTitle(); | 2934 nodeItem.updateTitle(false, highlightDOMUpdates ? this._rece ntlyModifiedNodes.get(nodes[i]) : undefined); |
|
pfeldman
2014/11/07 12:54:15
updateTitle can reach out for it on its own
apavlov
2014/11/10 09:52:56
Done.
| |
| 2890 } | 2935 } |
| 2891 | 2936 |
| 2892 var parentNodes = this._recentlyModifiedParentNodes.valuesArray(); | 2937 var parentNodes = this._recentlyModifiedParentNodes.keysArray(); |
| 2893 for (var i = 0, size = parentNodes.length; i < size; ++i) { | 2938 for (var i = 0, size = parentNodes.length; i < size; ++i) { |
| 2894 var parentNodeItem = this._treeOutline.findTreeElement(parentNod es[i]); | 2939 var parentNodeItem = this._treeOutline.findTreeElement(parentNod es[i]); |
| 2895 if (parentNodeItem && parentNodeItem.populated) | 2940 if (parentNodeItem && parentNodeItem.populated) |
| 2896 parentNodeItem.updateChildren(); | 2941 parentNodeItem.updateChildren(false, highlightDOMUpdates ? t his._recentlyModifiedParentNodes.get(parentNodes[i]) : undefined); |
|
pfeldman
2014/11/07 12:54:16
ditto
apavlov
2014/11/10 09:52:56
Done.
| |
| 2897 } | 2942 } |
| 2898 } | 2943 } |
| 2899 | 2944 |
| 2900 if (hidePanelWhileUpdating) { | 2945 if (hidePanelWhileUpdating) { |
| 2901 this._treeOutline._element.classList.remove("hidden"); | 2946 this._treeOutline._element.classList.remove("hidden"); |
| 2902 if (originalScrollTop) | 2947 if (originalScrollTop) |
| 2903 treeOutlineContainerElement.scrollTop = originalScrollTop; | 2948 treeOutlineContainerElement.scrollTop = originalScrollTop; |
| 2904 this._treeOutline.updateSelection(); | 2949 this._treeOutline.updateSelection(); |
| 2905 } | 2950 } |
| 2906 this._recentlyModifiedNodes.clear(); | 2951 this._recentlyModifiedNodes.clear(); |
| 2907 this._recentlyModifiedParentNodes.clear(); | 2952 this._recentlyModifiedParentNodes.clear(); |
| 2908 this._treeOutline._fireElementsTreeUpdated(updatedNodes); | 2953 this._treeOutline._fireElementsTreeUpdated(updatedNodes); |
| 2909 }, | 2954 }, |
| 2910 | 2955 |
| 2911 _reset: function() | 2956 _reset: function() |
| 2912 { | 2957 { |
| 2913 this._treeOutline.rootDOMNode = null; | 2958 this._treeOutline.rootDOMNode = null; |
| 2914 this._treeOutline.selectDOMNode(null, false); | 2959 this._treeOutline.selectDOMNode(null, false); |
| 2915 this._domModel.hideDOMNodeHighlight(); | 2960 this._domModel.hideDOMNodeHighlight(); |
| 2916 this._recentlyModifiedNodes.clear(); | 2961 this._recentlyModifiedNodes.clear(); |
| 2917 this._recentlyModifiedParentNodes.clear(); | 2962 this._recentlyModifiedParentNodes.clear(); |
| 2918 delete this._treeOutline._clipboardNodeData; | 2963 delete this._treeOutline._clipboardNodeData; |
| 2919 } | 2964 } |
| 2920 } | 2965 } |
| 2921 | 2966 |
| 2922 /** | 2967 /** |
| 2923 * @constructor | 2968 * @constructor |
| 2969 */ | |
| 2970 WebInspector.ElementsTreeUpdater.Record = function() | |
| 2971 { | |
| 2972 this._removedAttributeCount = 0; | |
| 2973 } | |
| 2974 | |
| 2975 WebInspector.ElementsTreeUpdater.Record.prototype = { | |
|
pfeldman
2014/11/07 12:54:15
Since you merge those, I'd call it UpdateInfo
apavlov
2014/11/10 09:52:56
Done.
| |
| 2976 /** | |
| 2977 * @param {!WebInspector.DOMNode} node | |
| 2978 * @param {!WebInspector.ElementsTreeUpdater.Record.ChangeType} changeType | |
| 2979 * @param {!WebInspector.DOMNode|string|undefined} relatedTarget | |
| 2980 */ | |
| 2981 merge: function(node, changeType, relatedTarget) | |
| 2982 { | |
| 2983 var attrName; | |
| 2984 switch (changeType) { | |
| 2985 case WebInspector.ElementsTreeUpdater.Record.ChangeType.AttrModified: | |
| 2986 attrName = /** @type {string} */ (relatedTarget); | |
| 2987 if (this.removedAttributes && this.removedAttributes.has(attrName)) { | |
| 2988 this.removedAttributes.delete(attrName); | |
| 2989 --this._removedAttributeCount; | |
| 2990 } | |
| 2991 if (!this.modifiedAttributes) | |
|
pfeldman
2014/11/07 12:54:15
make them all private.
apavlov
2014/11/10 09:52:56
Done.
| |
| 2992 this.modifiedAttributes = /** @type {!Set.<string>} */ (new Set( )); | |
| 2993 this.modifiedAttributes.add(attrName); | |
| 2994 break; | |
| 2995 case WebInspector.ElementsTreeUpdater.Record.ChangeType.AttrRemoved: | |
| 2996 attrName = /** @type {string} */ (relatedTarget); | |
| 2997 if (this.modifiedAttributes && this.modifiedAttributes.has(attrName) ) | |
| 2998 this.modifiedAttributes.delete(attrName); | |
| 2999 if (!this.removedAttributes) | |
| 3000 this.removedAttributes = /** @type {!Set.<string>} */ (new Set() ); | |
| 3001 this.removedAttributes.add(attrName); | |
| 3002 ++this._removedAttributeCount; | |
| 3003 break; | |
| 3004 case WebInspector.ElementsTreeUpdater.Record.ChangeType.NodeInserted: | |
| 3005 if (!this.insertedNodes) | |
| 3006 this.insertedNodes = /** @type {!Set.<!WebInspector.DOMNode>} */ (new Set()); | |
| 3007 this.insertedNodes.add(/** @type {!WebInspector.DOMNode} */ (related Target)); | |
| 3008 break; | |
| 3009 case WebInspector.ElementsTreeUpdater.Record.ChangeType.CharDataModified : | |
| 3010 this._charDataModified = true; | |
| 3011 break; | |
| 3012 case WebInspector.ElementsTreeUpdater.Record.ChangeType.ChildNodeRemoved : | |
| 3013 case WebInspector.ElementsTreeUpdater.Record.ChangeType.ChildNodeCountUp dated: | |
| 3014 this._hasChangedChildren = true; | |
| 3015 break; | |
| 3016 default: | |
| 3017 console.error("Invalid change type: " + changeType); | |
| 3018 } | |
| 3019 }, | |
| 3020 | |
| 3021 /** | |
| 3022 * @param {string} attributeName | |
| 3023 * @return {boolean} | |
| 3024 */ | |
| 3025 isAttributeModified: function(attributeName) | |
| 3026 { | |
| 3027 return this.modifiedAttributes && this.modifiedAttributes.has(attributeN ame); | |
| 3028 }, | |
| 3029 | |
| 3030 /** | |
| 3031 * @return {boolean} | |
| 3032 */ | |
| 3033 hasRemovedAttributes: function() | |
| 3034 { | |
| 3035 return !!this._removedAttributeCount; | |
| 3036 }, | |
| 3037 | |
| 3038 /** | |
| 3039 * @return {boolean} | |
| 3040 */ | |
| 3041 hasInsertedNodes: function() | |
| 3042 { | |
| 3043 return !!this.insertedNodes && !!this.insertedNodes.size; | |
| 3044 }, | |
| 3045 | |
| 3046 /** | |
| 3047 * @return {boolean} | |
| 3048 */ | |
| 3049 isCharDataModified: function() | |
| 3050 { | |
| 3051 return !!this._charDataModified; | |
| 3052 }, | |
| 3053 | |
| 3054 /** | |
| 3055 * @return {boolean} | |
| 3056 */ | |
| 3057 isNodeInserted: function(node) | |
| 3058 { | |
| 3059 return !!this.insertedNodes && this.insertedNodes.has(node); | |
| 3060 }, | |
| 3061 | |
| 3062 /** | |
| 3063 * @return {boolean} | |
| 3064 */ | |
| 3065 hasChangedChildren: function() | |
| 3066 { | |
| 3067 return !!this._hasChangedChildren; | |
| 3068 } | |
| 3069 } | |
| 3070 | |
| 3071 /** | |
| 3072 * @enum {number} | |
| 3073 */ | |
| 3074 WebInspector.ElementsTreeUpdater.Record.ChangeType = { | |
| 3075 AttrModified: 1, | |
| 3076 AttrRemoved: 2, | |
| 3077 CharDataModified: 3, | |
| 3078 NodeInserted: 4, | |
| 3079 ChildNodeRemoved: 5, | |
| 3080 ChildNodeCountUpdated: 6 | |
| 3081 } | |
| 3082 | |
| 3083 /** | |
| 3084 * @constructor | |
| 2924 * @implements {WebInspector.Renderer} | 3085 * @implements {WebInspector.Renderer} |
| 2925 */ | 3086 */ |
| 2926 WebInspector.ElementsTreeOutline.Renderer = function() | 3087 WebInspector.ElementsTreeOutline.Renderer = function() |
| 2927 { | 3088 { |
| 2928 } | 3089 } |
| 2929 | 3090 |
| 2930 WebInspector.ElementsTreeOutline.Renderer.prototype = { | 3091 WebInspector.ElementsTreeOutline.Renderer.prototype = { |
| 2931 /** | 3092 /** |
| 2932 * @param {!Object} object | 3093 * @param {!Object} object |
| 2933 * @return {!Promise.<!Element>} | 3094 * @return {!Promise.<!Element>} |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 2964 treeOutline.rootDOMNode = node; | 3125 treeOutline.rootDOMNode = node; |
| 2965 if (!treeOutline.children[0].hasChildren) | 3126 if (!treeOutline.children[0].hasChildren) |
| 2966 treeOutline._element.classList.add("single-node"); | 3127 treeOutline._element.classList.add("single-node"); |
| 2967 treeOutline.setVisible(true); | 3128 treeOutline.setVisible(true); |
| 2968 treeOutline.element.treeElementForTest = treeOutline.children[0] ; | 3129 treeOutline.element.treeElementForTest = treeOutline.children[0] ; |
| 2969 resolve(treeOutline.element); | 3130 resolve(treeOutline.element); |
| 2970 } | 3131 } |
| 2971 } | 3132 } |
| 2972 } | 3133 } |
| 2973 } | 3134 } |
| OLD | NEW |