diff --git a/packages/main/src/Link.hbs b/packages/main/src/Link.hbs index 92778df84daa..8a5bfd6d5fb9 100644 --- a/packages/main/src/Link.hbs +++ b/packages/main/src/Link.hbs @@ -3,6 +3,7 @@ role="link" href="{{ctr.href}}" target="{{ctr.target}}" + rel="{{ctr._rel}}" tabindex="{{tabIndex}}" ?disabled="{{ctr.disabled}}" aria-disabled="{{ariaDisabled}}"> diff --git a/packages/main/src/Link.js b/packages/main/src/Link.js index 75494dfdf6d0..c94897a909ff 100644 --- a/packages/main/src/Link.js +++ b/packages/main/src/Link.js @@ -92,6 +92,10 @@ const metadata = { wrap: { type: Boolean, }, + + _rel: { + type: String, + }, }, events: /** @lends sap.ui.webcomponents.main.Link.prototype */ { @@ -149,6 +153,11 @@ const metadata = { * @public */ class Link extends WebComponent { + constructor() { + super(); + this._dummyAnchor = document.createElement("a"); + } + static get metadata() { return metadata; } @@ -157,6 +166,15 @@ class Link extends WebComponent { return LinkRederer; } + + onBeforeRendering() { + const needsNoReferrer = this.target === "_blank" + && this.href + && this._isCrossOrigin(); + + this._rel = needsNoReferrer ? "noreferrer" : undefined; + } + onclick(event) { if (this.disabled) { return; @@ -198,6 +216,16 @@ class Link extends WebComponent { } } + _isCrossOrigin() { + const loc = window.location; + + this._dummyAnchor.href = this.href; + + return !(this._dummyAnchor.hostname === loc.hostname + && this._dummyAnchor.port === loc.port + && this._dummyAnchor.protocol === loc.protocol); + } + static get calculateTemplateContext() { return LinkTemplateContext.calculate; } diff --git a/packages/main/test/sap/ui/webcomponents/main/pages/Link.html b/packages/main/test/sap/ui/webcomponents/main/pages/Link.html index e9b784459573..ba8a97d68d33 100644 --- a/packages/main/test/sap/ui/webcomponents/main/pages/Link.html +++ b/packages/main/test/sap/ui/webcomponents/main/pages/Link.html @@ -35,13 +35,13 @@
-

link

- linknative span +

cross-origin

+ linknative span

Disabled link

- Disabled link + Disabled link