| 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));
|
| + }
|
| +};
|
|
|