diff --git a/tracker/tracker/src/main/modules/img.ts b/tracker/tracker/src/main/modules/img.ts index b100bb4e3..b462f7705 100644 --- a/tracker/tracker/src/main/modules/img.ts +++ b/tracker/tracker/src/main/modules/img.ts @@ -3,14 +3,18 @@ import { timestamp, isURL } from "../utils.js"; import { ResourceTiming, SetNodeAttributeURLBased, SetNodeAttribute } from "../../common/messages.js"; import { hasTag } from "../app/guards.js"; -function resolveImageUrl(url: string, location: Location) { - const cleanUrl = url.trim() - if (cleanUrl.startsWith('/')) { - return location.origin + cleanUrl - } else if (cleanUrl.startsWith('http') || cleanUrl.startsWith('data:')) { - return cleanUrl +function resolveURL(url: string, location: Location = document.location) { + url = url.trim() + if (url.startsWith('/')) { + return location.origin + url + } else if ( + url.startsWith('http://') || + url.startsWith('https://') || + url.startsWith('data:') // any other possible value here? + ){ + return url } else { - return location.origin + location.pathname + cleanUrl + return location.origin + location.pathname + url } } @@ -37,18 +41,18 @@ export default function (app: App): void { if (!complete) { return; } + const resolvedSrc = resolveURL(src || '') // Src type is null sometimes. - is it true? if (naturalWidth === 0 && naturalHeight === 0) { - if (src != null && isURL(src)) { // TODO: How about relative urls ? Src type is null sometimes. - app.send(new ResourceTiming(timestamp(), 0, 0, 0, 0, 0, src, 'img')); + if (isURL(resolvedSrc)) { + app.send(new ResourceTiming(timestamp(), 0, 0, 0, 0, 0, resolvedSrc, 'img')); } - } else if (src.length >= 1e5 || app.sanitizer.isMasked(id)) { + } else if (resolvedSrc.length >= 1e5 || app.sanitizer.isMasked(id)) { sendPlaceholder(id, this) } else { - const imgSrc = resolveImageUrl(src, document.location) - app.send(new SetNodeAttribute(id, 'src', imgSrc)); + app.send(new SetNodeAttribute(id, 'src', resolvedSrc)) if (srcset) { - const fixedSet = srcset.split(',').map(str => resolveImageUrl(str, document.location)).join(',') - app.send(new SetNodeAttribute(id, 'srcset', fixedSet)); + const resolvedSrcset = srcset.split(',').map(str => resolveURL(str)).join(',') + app.send(new SetNodeAttribute(id, 'srcset', resolvedSrcset)) } } }); diff --git a/tracker/tracker/src/main/utils.ts b/tracker/tracker/src/main/utils.ts index 6124119dd..20dcb3a25 100644 --- a/tracker/tracker/src/main/utils.ts +++ b/tracker/tracker/src/main/utils.ts @@ -13,7 +13,7 @@ export function normSpaces(str: string): string { // isAbsoluteUrl regexp: /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url) export function isURL(s: string): boolean { - return s.substr(0, 8) === 'https://' || s.substr(0, 7) === 'http://'; + return s.startsWith('https://')|| s.startsWith('http://'); } export const IN_BROWSER = !(typeof window === "undefined");