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

Side by Side 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, 10 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. 3 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
4 * Copyright (C) 2007 Matt Lilek (pewtermoose@gmail.com). 4 * Copyright (C) 2007 Matt Lilek (pewtermoose@gmail.com).
5 * Copyright (C) 2009 Joseph Pecoraro 5 * Copyright (C) 2009 Joseph Pecoraro
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
9 * are met: 9 * are met:
10 * 10 *
(...skipping 818 matching lines...) Expand 10 before | Expand all | Expand 10 after
829 this._previous = null; 829 this._previous = null;
830 this._element = null; 830 this._element = null;
831 } 831 }
832 }; 832 };
833 833
834 /** 834 /**
835 * @param {!Element} element 835 * @param {!Element} element
836 * @param {number} offset 836 * @param {number} offset
837 * @param {number} length 837 * @param {number} length
838 * @param {!Array.<!Object>=} domChanges 838 * @param {!Array.<!Object>=} domChanges
839 * @return {?Element} 839 * @return {?Array.<!Element>}
840 */ 840 */
841 UI.highlightSearchResult = function(element, offset, length, domChanges) { 841 UI.highlightSearchResult = function(element, offset, length, domChanges) {
842 var result = UI.highlightSearchResults(element, [new Common.SourceRange(offset , length)], domChanges); 842 var result = UI.highlightSearchResults(element, [new Common.SourceRange(offset , length)], domChanges);
843 return result.length ? result[0] : null; 843 return result.length ? result[0] : null;
844 }; 844 };
845 845
846 /** 846 /**
847 * @param {!Element} element 847 * @param {!Element} element
848 * @param {!Array.<!Common.SourceRange>} resultRanges 848 * @param {!Array.<!Common.SourceRange>} resultRanges
849 * @param {!Array.<!Object>=} changes 849 * @param {!Array.<!Object>=} changes
850 * @return {!Array.<!Element>} 850 * @return {!Array.<!Array.<!Element>>}
851 */ 851 */
852 UI.highlightSearchResults = function(element, resultRanges, changes) { 852 UI.highlightSearchResults = function(element, resultRanges, changes) {
853 return UI.highlightRangesWithStyleClass(element, resultRanges, UI.highlightedS earchResultClassName, changes); 853 return UI.highlightRangesWithStyleClass(element, resultRanges, UI.highlightedS earchResultClassName, changes);
854 }; 854 };
855 855
856 /** 856 /**
857 * @param {!Element} element 857 * @param {!Element} element
858 * @param {string} className 858 * @param {string} className
859 */ 859 */
860 UI.runCSSAnimationOnce = function(element, className) { 860 UI.runCSSAnimationOnce = function(element, className) {
861 function animationEndCallback() { 861 function animationEndCallback() {
862 element.classList.remove(className); 862 element.classList.remove(className);
863 element.removeEventListener('webkitAnimationEnd', animationEndCallback, fals e); 863 element.removeEventListener('webkitAnimationEnd', animationEndCallback, fals e);
864 } 864 }
865 865
866 if (element.classList.contains(className)) 866 if (element.classList.contains(className))
867 element.classList.remove(className); 867 element.classList.remove(className);
868 868
869 element.addEventListener('webkitAnimationEnd', animationEndCallback, false); 869 element.addEventListener('webkitAnimationEnd', animationEndCallback, false);
870 element.classList.add(className); 870 element.classList.add(className);
871 }; 871 };
872 872
873 /** 873 /**
874 * @param {!Element} element 874 * @param {!Element} element
875 * @param {!Array.<!Common.SourceRange>} resultRanges 875 * @param {!Array.<!Common.SourceRange>} resultRanges
876 * @param {string} styleClass 876 * @param {string} styleClass
877 * @param {!Array.<!Object>=} changes 877 * @param {!Array.<!Object>=} changes
878 * @return {!Array.<!Element>} 878 * @param {function(string,?Element,number):!Element=} highlightCreator
879 * @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
879 */ 880 */
880 UI.highlightRangesWithStyleClass = function(element, resultRanges, styleClass, c hanges) { 881 UI.highlightRangesWithStyleClass = function(element, resultRanges, styleClass, c hanges, highlightCreator) {
881 changes = changes || []; 882 changes = changes || [];
882 var highlightNodes = []; 883 var highlightNodes = [];
883 var textNodes = element.childTextNodes(); 884 var textNodes = element.childTextNodes();
884 var lineText = textNodes 885 var lineText = textNodes
885 .map(function(node) { 886 .map(function(node) {
886 return node.textContent; 887 return node.textContent;
887 }) 888 })
888 .join(''); 889 .join('');
889 var ownerDocument = element.ownerDocument; 890 var ownerDocument = element.ownerDocument;
890 891
891 if (textNodes.length === 0) 892 if (textNodes.length === 0)
892 return highlightNodes; 893 return highlightNodes;
893 894
894 var nodeRanges = []; 895 var nodeRanges = [];
895 var rangeEndOffset = 0; 896 var rangeEndOffset = 0;
896 for (var i = 0; i < textNodes.length; ++i) { 897 for (var i = 0; i < textNodes.length; ++i) {
897 var range = {}; 898 var range = {};
898 range.offset = rangeEndOffset; 899 range.offset = rangeEndOffset;
899 range.length = textNodes[i].textContent.length; 900 range.length = textNodes[i].textContent.length;
900 rangeEndOffset = range.offset + range.length; 901 rangeEndOffset = range.offset + range.length;
901 nodeRanges.push(range); 902 nodeRanges.push(range);
902 } 903 }
903 904
904 var startIndex = 0; 905 var startIndex = 0;
905 for (var i = 0; i < resultRanges.length; ++i) { 906 for (var i = 0; i < resultRanges.length; ++i) {
906 var startOffset = resultRanges[i].offset; 907 var startOffset = resultRanges[i].offset;
907 var endOffset = startOffset + resultRanges[i].length; 908 var endOffset = startOffset + resultRanges[i].length;
909 var rangeHighlightNodes = [];
910 highlightNodes.push(rangeHighlightNodes);
908 911
909 while (startIndex < textNodes.length && 912 while (startIndex < textNodes.length &&
910 nodeRanges[startIndex].offset + nodeRanges[startIndex].length <= star tOffset) 913 nodeRanges[startIndex].offset + nodeRanges[startIndex].length <= star tOffset)
911 startIndex++; 914 startIndex++;
912 var endIndex = startIndex; 915 var endIndex = startIndex;
913 while (endIndex < textNodes.length && nodeRanges[endIndex].offset + nodeRang es[endIndex].length < endOffset) 916 while (endIndex < textNodes.length && nodeRanges[endIndex].offset + nodeRang es[endIndex].length < endOffset)
914 endIndex++; 917 endIndex++;
915 if (endIndex === textNodes.length) 918 if (endIndex === textNodes.length)
916 break; 919 break;
917 920
918 var highlightNode = ownerDocument.createElement('span'); 921 for (var j = startIndex; j <= endIndex; j++) {
919 highlightNode.className = styleClass; 922 var textNode = textNodes[j];
920 highlightNode.textContent = lineText.substring(startOffset, endOffset); 923 var nodeRange = nodeRanges[j];
921 924 var nodeRangeEndOffset = nodeRange.offset + nodeRange.length;
922 var lastTextNode = textNodes[endIndex]; 925 var prefixText = nodeRange.offset < startOffset ? lineText.substring(nodeR ange.offset, startOffset) : '';
923 var lastText = lastTextNode.textContent; 926 var suffixText = nodeRangeEndOffset > endOffset ? lineText.substring(endOf fset, nodeRangeEndOffset) : '';
924 lastTextNode.textContent = lastText.substring(endOffset - nodeRanges[endInde x].offset); 927 var highlightText =
925 changes.push({node: lastTextNode, type: 'changed', oldText: lastText, newTex t: lastTextNode.textContent}); 928 lineText.substring(Math.max(startOffset, nodeRange.offset), Math.min(e ndOffset, nodeRangeEndOffset));
926 929 var highlightNode;
927 if (startIndex === endIndex) { 930 if (highlightCreator) {
928 lastTextNode.parentElement.insertBefore(highlightNode, lastTextNode); 931 highlightNode = highlightCreator(highlightText, textNode.parentElement, i);
929 changes.push({node: highlightNode, type: 'added', nextSibling: lastTextNod e, parent: lastTextNode.parentElement}); 932 } else {
930 highlightNodes.push(highlightNode); 933 highlightNode = ownerDocument.createElement('span');
931 934 highlightNode.className = styleClass;
932 var prefixNode = ownerDocument.createTextNode(lastText.substring(0, startO ffset - nodeRanges[startIndex].offset)); 935 highlightNode.textContent = highlightText;
933 lastTextNode.parentElement.insertBefore(prefixNode, highlightNode); 936 }
934 changes.push({node: prefixNode, type: 'added', nextSibling: highlightNode, parent: lastTextNode.parentElement}); 937 changes.push({node: textNode, type: 'changed', oldText: textNode.textConte nt, newText: suffixText});
935 } else { 938 textNode.textContent = suffixText;
936 var firstTextNode = textNodes[startIndex]; 939 textNode.parentElement.insertBefore(highlightNode, textNode);
937 var firstText = firstTextNode.textContent; 940 rangeHighlightNodes.push(highlightNode);
938 var anchorElement = firstTextNode.nextSibling; 941 changes.push({node: highlightNode, type: 'added', nextSibling: textNode, p arent: textNode.parentElement});
939 942 if (prefixText) {
940 firstTextNode.parentElement.insertBefore(highlightNode, anchorElement); 943 var prefixNode = createTextNode(prefixText);
941 changes.push( 944 textNode.parentElement.insertBefore(prefixNode, highlightNode);
942 {node: highlightNode, type: 'added', nextSibling: anchorElement, paren t: firstTextNode.parentElement}); 945 changes.push({node: prefixNode, type: 'added', nextSibling: highlightNod e, parent: textNode.parentElement});
943 highlightNodes.push(highlightNode);
944
945 firstTextNode.textContent = firstText.substring(0, startOffset - nodeRange s[startIndex].offset);
946 changes.push({node: firstTextNode, type: 'changed', oldText: firstText, ne wText: firstTextNode.textContent});
947
948 for (var j = startIndex + 1; j < endIndex; j++) {
949 var textNode = textNodes[j];
950 var text = textNode.textContent;
951 textNode.textContent = '';
952 changes.push({node: textNode, type: 'changed', oldText: text, newText: t extNode.textContent});
953 } 946 }
954 } 947 }
948
955 startIndex = endIndex; 949 startIndex = endIndex;
956 nodeRanges[startIndex].offset = endOffset; 950 nodeRanges[startIndex].offset = endOffset;
957 nodeRanges[startIndex].length = lastTextNode.textContent.length; 951 nodeRanges[startIndex].length = textNodes[endIndex].textContent.length;
958 } 952 }
959 return highlightNodes; 953 return highlightNodes;
960 }; 954 };
961 955
962 UI.applyDomChanges = function(domChanges) { 956 UI.applyDomChanges = function(domChanges) {
963 for (var i = 0, size = domChanges.length; i < size; ++i) { 957 for (var i = 0, size = domChanges.length; i < size; ++i) {
964 var entry = domChanges[i]; 958 var entry = domChanges[i];
965 switch (entry.type) { 959 switch (entry.type) {
966 case 'added': 960 case 'added':
967 entry.parent.insertBefore(entry.node, entry.nextSibling); 961 entry.parent.insertBefore(entry.node, entry.nextSibling);
(...skipping 1063 matching lines...) Expand 10 before | Expand all | Expand 10 after
2031 callback(fileSelectorElement.files[0]); 2025 callback(fileSelectorElement.files[0]);
2032 } 2026 }
2033 return fileSelectorElement; 2027 return fileSelectorElement;
2034 }; 2028 };
2035 2029
2036 /** 2030 /**
2037 * @const 2031 * @const
2038 * @type {number} 2032 * @type {number}
2039 */ 2033 */
2040 UI.MaxLengthForDisplayedURLs = 150; 2034 UI.MaxLengthForDisplayedURLs = 150;
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698