Index: third_party/WebKit/Source/devtools/front_end/components/Linkifier.js |
diff --git a/third_party/WebKit/Source/devtools/front_end/components/Linkifier.js b/third_party/WebKit/Source/devtools/front_end/components/Linkifier.js |
index 6184cc95d5d4eb1254e5cddb10c6985f96a1c68c..ff079047175022dfd0c4ee9040454ea792be76dc 100644 |
--- a/third_party/WebKit/Source/devtools/front_end/components/Linkifier.js |
+++ b/third_party/WebKit/Source/devtools/front_end/components/Linkifier.js |
@@ -303,13 +303,8 @@ Components.Linkifier = class { |
return; |
Components.Linkifier._bindUILocation(anchor, uiLocation); |
- var text = uiLocation.linkText(); |
- var info = Components.Linkifier._linkInfo(anchor); |
- info.originalLinkText = text; |
- text = text.replace(/([a-f0-9]{7})[a-f0-9]{13}[a-f0-9]*/g, '$1\u2026'); |
- if (this._maxLength) |
- text = text.trimMiddle(this._maxLength); |
- anchor.textContent = text; |
+ var text = uiLocation.linkText(true /* skipTrim */); |
+ Components.Linkifier._setTrimmedText(anchor, text, this._maxLength); |
var titleText = uiLocation.uiSourceCode.url(); |
if (typeof uiLocation.lineNumber === 'number') |
@@ -396,9 +391,7 @@ Components.Linkifier = class { |
link.title = title; |
if (href) |
link.href = href; |
- link.textContent = text; |
- if (maxLength) |
- link.textContent = link.textContent.trimMiddle(maxLength); |
+ Components.Linkifier._setTrimmedText(link, text, maxLength); |
link[Components.Linkifier._infoSymbol] = { |
icon: null, |
enableDecorator: false, |
@@ -408,8 +401,7 @@ Components.Linkifier = class { |
lineNumber: null, |
columnNumber: null, |
revealable: null, |
- fallback: null, |
- originalLinkText: text |
+ fallback: null |
}; |
if (!preventClick) |
link.addEventListener('click', Components.Linkifier._handleClick, false); |
@@ -419,12 +411,70 @@ Components.Linkifier = class { |
} |
/** |
- * @param {?Element} link |
- * @return {?string} |
+ * @param {!Element} link |
+ * @param {string} text |
+ * @param {number=} maxLength |
+ */ |
+ static _setTrimmedText(link, text, maxLength) { |
+ link.removeChildren(); |
+ if (maxLength && text.length > maxLength) { |
+ var middleSplit = splitMiddle(text, maxLength); |
+ appendTextWithoutHashes(middleSplit[0]); |
+ appendHiddenText(middleSplit[1]); |
+ appendTextWithoutHashes(middleSplit[2]); |
+ } else { |
+ appendTextWithoutHashes(text); |
+ } |
+ |
+ /** |
+ * @param {string} string |
+ */ |
+ function appendHiddenText(string) { |
+ var ellipsisNode = link.createChild('span', 'devtools-link-ellipsis').createTextChild('\u2026'); |
+ ellipsisNode[Components.Linkifier._untruncatedNodeTextSymbol] = string; |
+ } |
+ |
+ /** |
+ * @param {string} string |
+ */ |
+ function appendTextWithoutHashes(string) { |
+ var hashSplit = TextUtils.TextUtils.splitStringByRegexes(string, [/[a-f0-9]{20,}/g]); |
+ for (var match of hashSplit) { |
+ if (match.regexIndex === -1) { |
+ link.createTextChild(match.value); |
+ } else { |
+ link.createTextChild(match.value.substring(0, 7)); |
+ appendHiddenText(match.value.substring(7)); |
+ } |
+ } |
+ } |
+ |
+ /** |
+ * @param {string} string |
+ * @param {number} maxLength |
+ * @return {!Array<string>} |
+ */ |
+ function splitMiddle(string, maxLength) { |
+ var leftIndex = Math.floor(maxLength / 2); |
+ var rightIndex = string.length - Math.ceil(maxLength / 2) + 1; |
+ |
+ // Do not truncate between characters that use multiple code points (emojis). |
+ if (string.codePointAt(rightIndex - 1) >= 0x10000) { |
+ rightIndex++; |
+ leftIndex++; |
+ } |
+ if (leftIndex > 0 && string.codePointAt(leftIndex - 1) >= 0x10000) |
+ leftIndex--; |
+ return [string.substring(0, leftIndex), string.substring(leftIndex, rightIndex), string.substring(rightIndex)]; |
+ } |
+ } |
+ |
+ /** |
+ * @param {!Node} node |
+ * @return {string} |
*/ |
- static originalLinkText(link) { |
- var info = this._linkInfo(link); |
- return info ? info.originalLinkText : null; |
+ static untruncatedNodeText(node) { |
+ return node[Components.Linkifier._untruncatedNodeTextSymbol] || node.textContent; |
} |
/** |
@@ -549,6 +599,7 @@ Components.Linkifier._decorator = null; |
Components.Linkifier._sourceCodeAnchors = Symbol('Linkifier.anchors'); |
Components.Linkifier._infoSymbol = Symbol('Linkifier.info'); |
+Components.Linkifier._untruncatedNodeTextSymbol = Symbol('Linkifier.untruncatedNodeText'); |
/** |
* @typedef {{ |
@@ -560,8 +611,7 @@ Components.Linkifier._infoSymbol = Symbol('Linkifier.info'); |
* lineNumber: ?number, |
* columnNumber: ?number, |
* revealable: ?Object, |
- * fallback: ?Element, |
- * originalLinkText: string |
+ * fallback: ?Element |
* }} |
*/ |
Components._LinkInfo; |