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

Unified Diff: third_party/WebKit/Source/devtools/front_end/components/Linkifier.js

Issue 2510193003: [DevTools] Move link click and context menu handling to Linkifier. (Closed)
Patch Set: Created 4 years, 1 month 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/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 e551a3859a30a5bc5a886de7451353b5505cc00d..06c7988a4aea3433a6864f54e19c11c65e3896bb 100644
--- a/third_party/WebKit/Source/devtools/front_end/components/Linkifier.js
+++ b/third_party/WebKit/Source/devtools/front_end/components/Linkifier.js
@@ -458,16 +458,60 @@ Components.Linkifier = class {
if (typeof lineNumber === 'number' && !text)
linkText += ':' + (lineNumber + 1);
- var anchor = createElementWithClass('a', className);
+ var link = createElementWithClass('a', className);
if (!url.trim().toLowerCase().startsWith('javascript:')) {
- anchor.href = url;
- anchor.classList.add('webkit-html-resource-link');
+ link.href = url;
+ link.classList.add('webkit-html-resource-link');
+ link[Components.Linkifier._linkSymbol] = true;
+ link.addEventListener('click', Components.Linkifier._handleClick, false);
}
- anchor.title = linkText !== url ? url : '';
- anchor.textContent = linkText.trimMiddle(150);
- anchor.lineNumber = lineNumber;
- anchor.columnNumber = columnNumber;
- return anchor;
+ link.title = linkText !== url ? url : '';
+ link.textContent = linkText.trimMiddle(150);
+ link.lineNumber = lineNumber;
+ link.columnNumber = columnNumber;
+ return link;
+ }
+
+ /**
+ * @param {!Event} event
+ */
+ static _handleClick(event) {
+ var link = /** @type {!Element} */ (event.currentTarget);
+ event.consume(true);
+ if (link.preventFollow || UI.isBeingEdited(/** @type {!Node} */ (event.target)))
+ return;
+ var url = link.href;
+ if (Components.openAnchorLocationRegistry.dispatch({url: url, lineNumber: link.lineNumber}))
+ return;
+ var actions = Components.Linkifier._linkActions(link);
+ if (actions.length) {
+ Common.Revealer.reveal(actions[0].revealable);
+ return;
+ }
+ InspectorFrontendHost.openInNewTab(url);
+ }
+
+ /**
+ * @param {!Element} link
+ * @return {!Array<{revealable: !Object, title: string}>}
+ */
+ static _linkActions(link) {
+ var url = link.href;
+ var result = [];
+ var uiSourceCode = Workspace.workspace.uiSourceCodeForURL(url);
+ if (uiSourceCode) {
+ result.push({
+ revealable: uiSourceCode.uiLocation(link.lineNumber || 0, link.columnNumber || 0),
+ title: Common.UIString('Open')
+ });
+ }
+ var resource = Bindings.resourceForURL(url);
+ if (resource)
+ result.push({revealable: resource, title: Common.UIString.capitalize('Open ^link in Application ^panel')});
+ var request = SDK.NetworkLog.requestForURL(url);
+ if (request)
+ result.push({revealable: request, title: Common.UIString.capitalize('Open ^request in Network ^panel')});
+ return result;
}
};
@@ -482,6 +526,7 @@ Components.Linkifier._sourceCodeAnchors = Symbol('Linkifier.anchors');
Components.Linkifier._uiLocationSymbol = Symbol('uiLocation');
Components.Linkifier._fallbackAnchorSymbol = Symbol('fallbackAnchor');
Components.Linkifier._liveLocationSymbol = Symbol('liveLocation');
+Components.Linkifier._linkSymbol = Symbol('Linkifier.link');
/**
* The maximum number of characters to display in a URL.
@@ -587,3 +632,29 @@ Components.linkifyStringAsFragment = function(string) {
return Components.linkifyStringAsFragmentWithCustomLinkifier(string, linkifier);
};
+
+/**
+ * @implements {UI.ContextMenu.Provider}
+ * @unrestricted
+ */
+Components.Linkifier.LinkContextMenuProvider = class {
+ /**
+ * @override
+ * @param {!Event} event
+ * @param {!UI.ContextMenu} contextMenu
+ * @param {!Object} target
+ */
+ appendApplicableItems(event, contextMenu, target) {
+ var targetNode = /** @type {!Node} */ (target);
+ while (targetNode && !targetNode[Components.Linkifier._linkSymbol])
+ targetNode = targetNode.parentNodeOrShadowHost();
+ if (!targetNode || !targetNode.href)
+ return;
+ var link = /** @type {!Element} */ (targetNode);
+ var actions = Components.Linkifier._linkActions(link);
+ for (var action of actions)
+ contextMenu.appendItem(action.title, Common.Revealer.reveal.bind(Common.Revealer, action.revealable));
+ contextMenu.appendItem(UI.openLinkExternallyLabel(), () => InspectorFrontendHost.openInNewTab(link.href));
+ contextMenu.appendItem(UI.copyLinkAddressLabel(), () => InspectorFrontendHost.copyText(link.href));
+ }
+};

Powered by Google App Engine
This is Rietveld 408576698