Merge branch 'stable-2.15' into stable-2.16

* stable-2.15:
  Fix base url in addHTML to correctly match
  Add base url to addHTML

Change-Id: I5aa62e6832349a7ff232d46dccb652255de5bc8e
diff --git a/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.html b/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.html
index 7cc3493..e644806 100644
--- a/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-linked-text/gr-linked-text_test.html
@@ -67,6 +67,10 @@
           match: 'hash:(.+)',
           html: '<a href="#/awesomesauce">$1</a>',
         },
+        baseurl: {
+          match: 'test (.+)',
+          html: '<a href="/r/awesomesauce">$1</a>',
+        },
         disabledconfig: {
           match: 'foo:(.+)',
           link: 'https://google.com/search?q=$1',
@@ -201,6 +205,24 @@
       assert.equal(linkEl.textContent, 'foo');
     });
 
+    test('html with base url', () => {
+      window.CANONICAL_PATH = '/r';
+
+      element.content = 'test foo';
+      const linkEl = element.$.output.childNodes[0];
+      assert.isTrue(linkEl.href.endsWith('/r/awesomesauce'));
+      assert.equal(linkEl.textContent, 'foo');
+    });
+
+    test('hash html with base url', () => {
+      window.CANONICAL_PATH = '/r';
+
+      element.content = 'hash:foo';
+      const linkEl = element.$.output.childNodes[0];
+      assert.isTrue(linkEl.href.endsWith('/r/awesomesauce'));
+      assert.equal(linkEl.textContent, 'foo');
+    });
+
     test('disabled config', () => {
       element.content = 'foo:baz';
       assert.equal(element.$.output.innerHTML, 'foo:baz');
diff --git a/polygerrit-ui/app/elements/shared/gr-linked-text/link-text-parser.js b/polygerrit-ui/app/elements/shared/gr-linked-text/link-text-parser.js
index 0330ee9..42011b2 100644
--- a/polygerrit-ui/app/elements/shared/gr-linked-text/link-text-parser.js
+++ b/polygerrit-ui/app/elements/shared/gr-linked-text/link-text-parser.js
@@ -50,6 +50,7 @@
     this.linkConfig = linkConfig;
     this.callback = callback;
     this.removeZeroWidthSpace = opt_removeZeroWidthSpace;
+    this.baseUrl = Gerrit.BaseUrlBehavior.getBaseUrl();
     Object.preventExtensions(this);
   }
 
@@ -172,9 +173,9 @@
   GrLinkTextParser.prototype.addLink =
       function(text, href, position, length, outputArray) {
         if (!text || this.hasOverlap(position, length, outputArray)) { return; }
-        const baseUrl = Gerrit.BaseUrlBehavior.getBaseUrl();
-        if (!!baseUrl && href.startsWith('/') && !href.startsWith(baseUrl)) {
-          href = baseUrl + href;
+        if (!!this.baseUrl && href.startsWith('/') &&
+             !href.startsWith(this.baseUrl)) {
+          href = this.baseUrl + href;
         }
         this.addItem(text, href, null, position, length, outputArray);
       };
@@ -193,6 +194,10 @@
   GrLinkTextParser.prototype.addHTML =
       function(html, position, length, outputArray) {
         if (this.hasOverlap(position, length, outputArray)) { return; }
+        if (!!this.baseUrl && html.match(/<a href=\"\//g) &&
+             !new RegExp(`^<a href="${this.baseUrl}`, 'g').test(html)) {
+          html = html.replace(/<a href=\"\//g, `<a href=\"${this.baseUrl}\/`);
+        }
         this.addItem(null, null, html, position, length, outputArray);
       };