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

Unified Diff: third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js

Issue 2568983003: Add ability to linkify substituted string
Patch Set: Comments addressed Created 3 years, 11 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/ui/UIUtils.js
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js b/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js
index ef8aed6389eba681045fa65787b2f186f404147a..85b08521843faf07f782f29b779302affe5c1da3 100644
--- a/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js
+++ b/third_party/WebKit/Source/devtools/front_end/ui/UIUtils.js
@@ -836,7 +836,7 @@ UI.ElementFocusRestorer = class {
* @param {number} offset
* @param {number} length
* @param {!Array.<!Object>=} domChanges
- * @return {?Element}
+ * @return {?Array.<!Element>}
*/
UI.highlightSearchResult = function(element, offset, length, domChanges) {
var result = UI.highlightSearchResults(element, [new Common.SourceRange(offset, length)], domChanges);
@@ -847,7 +847,7 @@ UI.highlightSearchResult = function(element, offset, length, domChanges) {
* @param {!Element} element
* @param {!Array.<!Common.SourceRange>} resultRanges
* @param {!Array.<!Object>=} changes
- * @return {!Array.<!Element>}
+ * @return {!Array.<!Array.<!Element>>}
*/
UI.highlightSearchResults = function(element, resultRanges, changes) {
return UI.highlightRangesWithStyleClass(element, resultRanges, UI.highlightedSearchResultClassName, changes);
@@ -875,9 +875,10 @@ UI.runCSSAnimationOnce = function(element, className) {
* @param {!Array.<!Common.SourceRange>} resultRanges
* @param {string} styleClass
* @param {!Array.<!Object>=} changes
- * @return {!Array.<!Element>}
+ * @param {function(string,?Element,number):!Element=} highlightCreator
+ * @return {!Array.<!Array.<!Element>>}
pfeldman 2017/01/27 19:10:07 Hm. That makes things quite complex. I would expec
karabur 2017/01/27 21:21:04 Yes, something looks wrong for me here as well, bu
*/
-UI.highlightRangesWithStyleClass = function(element, resultRanges, styleClass, changes) {
+UI.highlightRangesWithStyleClass = function(element, resultRanges, styleClass, changes, highlightCreator) {
changes = changes || [];
var highlightNodes = [];
var textNodes = element.childTextNodes();
@@ -905,6 +906,8 @@ UI.highlightRangesWithStyleClass = function(element, resultRanges, styleClass, c
for (var i = 0; i < resultRanges.length; ++i) {
var startOffset = resultRanges[i].offset;
var endOffset = startOffset + resultRanges[i].length;
+ var rangeHighlightNodes = [];
+ highlightNodes.push(rangeHighlightNodes);
while (startIndex < textNodes.length &&
nodeRanges[startIndex].offset + nodeRanges[startIndex].length <= startOffset)
@@ -915,46 +918,37 @@ UI.highlightRangesWithStyleClass = function(element, resultRanges, styleClass, c
if (endIndex === textNodes.length)
break;
- var highlightNode = ownerDocument.createElement('span');
- highlightNode.className = styleClass;
- highlightNode.textContent = lineText.substring(startOffset, endOffset);
-
- var lastTextNode = textNodes[endIndex];
- var lastText = lastTextNode.textContent;
- lastTextNode.textContent = lastText.substring(endOffset - nodeRanges[endIndex].offset);
- changes.push({node: lastTextNode, type: 'changed', oldText: lastText, newText: lastTextNode.textContent});
-
- if (startIndex === endIndex) {
- lastTextNode.parentElement.insertBefore(highlightNode, lastTextNode);
- changes.push({node: highlightNode, type: 'added', nextSibling: lastTextNode, parent: lastTextNode.parentElement});
- highlightNodes.push(highlightNode);
-
- var prefixNode = ownerDocument.createTextNode(lastText.substring(0, startOffset - nodeRanges[startIndex].offset));
- lastTextNode.parentElement.insertBefore(prefixNode, highlightNode);
- changes.push({node: prefixNode, type: 'added', nextSibling: highlightNode, parent: lastTextNode.parentElement});
- } else {
- var firstTextNode = textNodes[startIndex];
- var firstText = firstTextNode.textContent;
- var anchorElement = firstTextNode.nextSibling;
-
- firstTextNode.parentElement.insertBefore(highlightNode, anchorElement);
- changes.push(
- {node: highlightNode, type: 'added', nextSibling: anchorElement, parent: firstTextNode.parentElement});
- highlightNodes.push(highlightNode);
-
- firstTextNode.textContent = firstText.substring(0, startOffset - nodeRanges[startIndex].offset);
- changes.push({node: firstTextNode, type: 'changed', oldText: firstText, newText: firstTextNode.textContent});
-
- for (var j = startIndex + 1; j < endIndex; j++) {
- var textNode = textNodes[j];
- var text = textNode.textContent;
- textNode.textContent = '';
- changes.push({node: textNode, type: 'changed', oldText: text, newText: textNode.textContent});
+ for (var j = startIndex; j <= endIndex; j++) {
+ var textNode = textNodes[j];
+ var nodeRange = nodeRanges[j];
+ var nodeRangeEndOffset = nodeRange.offset + nodeRange.length;
+ var prefixText = nodeRange.offset < startOffset ? lineText.substring(nodeRange.offset, startOffset) : '';
+ var suffixText = nodeRangeEndOffset > endOffset ? lineText.substring(endOffset, nodeRangeEndOffset) : '';
+ var highlightText =
+ lineText.substring(Math.max(startOffset, nodeRange.offset), Math.min(endOffset, nodeRangeEndOffset));
+ var highlightNode;
+ if (highlightCreator) {
+ highlightNode = highlightCreator(highlightText, textNode.parentElement, i);
+ } else {
+ highlightNode = ownerDocument.createElement('span');
+ highlightNode.className = styleClass;
+ highlightNode.textContent = highlightText;
+ }
+ changes.push({node: textNode, type: 'changed', oldText: textNode.textContent, newText: suffixText});
+ textNode.textContent = suffixText;
+ textNode.parentElement.insertBefore(highlightNode, textNode);
+ rangeHighlightNodes.push(highlightNode);
+ changes.push({node: highlightNode, type: 'added', nextSibling: textNode, parent: textNode.parentElement});
+ if (prefixText) {
+ var prefixNode = createTextNode(prefixText);
+ textNode.parentElement.insertBefore(prefixNode, highlightNode);
+ changes.push({node: prefixNode, type: 'added', nextSibling: highlightNode, parent: textNode.parentElement});
}
}
+
startIndex = endIndex;
nodeRanges[startIndex].offset = endOffset;
- nodeRanges[startIndex].length = lastTextNode.textContent.length;
+ nodeRanges[startIndex].length = textNodes[endIndex].textContent.length;
}
return highlightNodes;
};

Powered by Google App Engine
This is Rietveld 408576698