mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Use link in UI which returned a relative url but not html_url which contains an absolute url (#21986)
partially fix #19345 This PR add some `Link` methods for different objects. The `Link` methods are not different from `HTMLURL`, they are lack of the absolute URL. And most of UI `HTMLURL` have been replaced to `Link` so that users can visit them from a different domain or IP. This PR also introduces a new javascript configuration `window.config.reqAppUrl` which is different from `appUrl` which is still an absolute url but the domain has been replaced to the current requested domain.
This commit is contained in:
		@@ -1,4 +1,5 @@
 | 
			
		||||
import {showTemporaryTooltip} from '../modules/tippy.js';
 | 
			
		||||
import {toAbsoluteUrl} from '../utils.js';
 | 
			
		||||
 | 
			
		||||
const {copy_success, copy_error} = window.config.i18n;
 | 
			
		||||
 | 
			
		||||
@@ -50,7 +51,11 @@ export function initGlobalCopyToClipboardListener() {
 | 
			
		||||
    // in case <button data-clipboard-text><svg></button>, so we just search
 | 
			
		||||
    // up to 3 levels for performance
 | 
			
		||||
    for (let i = 0; i < 3 && target; i++) {
 | 
			
		||||
      const text = target.getAttribute('data-clipboard-text') || document.querySelector(target.getAttribute('data-clipboard-target'))?.value;
 | 
			
		||||
      let txt = target.getAttribute('data-clipboard-text');
 | 
			
		||||
      if (txt && target.getAttribute('data-clipboard-text-type') === 'url') {
 | 
			
		||||
        txt = toAbsoluteUrl(txt);
 | 
			
		||||
      }
 | 
			
		||||
      const text = txt || document.querySelector(target.getAttribute('data-clipboard-target'))?.value;
 | 
			
		||||
 | 
			
		||||
      if (text) {
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
 
 | 
			
		||||
@@ -2,4 +2,5 @@ window.config = {
 | 
			
		||||
  csrfToken: 'test-csrf-token-123456',
 | 
			
		||||
  pageData: {},
 | 
			
		||||
  i18n: {},
 | 
			
		||||
  appSubUrl: '',
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -133,3 +133,10 @@ export function convertImage(blob, mime) {
 | 
			
		||||
    }
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function toAbsoluteUrl(relUrl) {
 | 
			
		||||
  if (relUrl.startsWith('http://') || relUrl.startsWith('https://')) {
 | 
			
		||||
    return relUrl;
 | 
			
		||||
  }
 | 
			
		||||
  return `${window.location.origin}${relUrl}`;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@ import {expect, test} from 'vitest';
 | 
			
		||||
import {
 | 
			
		||||
  basename, extname, isObject, uniq, stripTags, joinPaths, parseIssueHref,
 | 
			
		||||
  prettyNumber, parseUrl, translateMonth, translateDay, blobToDataURI,
 | 
			
		||||
  toAbsoluteUrl,
 | 
			
		||||
} from './utils.js';
 | 
			
		||||
 | 
			
		||||
test('basename', () => {
 | 
			
		||||
@@ -136,3 +137,8 @@ test('blobToDataURI', async () => {
 | 
			
		||||
  const blob = new Blob([JSON.stringify({test: true})], {type: 'application/json'});
 | 
			
		||||
  expect(await blobToDataURI(blob)).toEqual('data:application/json;base64,eyJ0ZXN0Ijp0cnVlfQ==');
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test('toAbsoluteUrl', () => {
 | 
			
		||||
  expect(toAbsoluteUrl('')).toEqual('http://localhost:3000');
 | 
			
		||||
  expect(toAbsoluteUrl('/user/repo')).toEqual('http://localhost:3000/user/repo');
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user