Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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; |
| OLD | NEW |