From e86192278d9d7e1c5f262028d3a5edf54f026a9d Mon Sep 17 00:00:00 2001 From: Demetrio Girardi Date: Wed, 18 May 2022 10:50:25 -0700 Subject: [PATCH] rename referer to topmostLocation, make location all-or-nothing --- modules/33acrossBidAdapter.js | 2 +- modules/a4gBidAdapter.js | 2 +- modules/ablidaBidAdapter.js | 3 +- modules/enrichmentFpdModule.js | 15 +--- modules/koblerBidAdapter.js | 5 +- modules/parrableIdSystem.js | 2 +- modules/prebidServerBidAdapter/index.js | 2 +- modules/rakutenBidAdapter/index.js | 3 +- modules/staqAnalyticsAdapter.js | 7 +- src/refererDetection.js | 36 ++++++++-- test/spec/modules/33acrossBidAdapter_spec.js | 2 +- test/spec/modules/enrichmentFpdModule_spec.js | 14 ++-- test/spec/modules/fpdModule_spec.js | 57 --------------- test/spec/modules/koblerBidAdapter_spec.js | 4 +- test/spec/modules/parrableIdSystem_spec.js | 2 +- .../modules/prebidServerBidAdapter_spec.js | 2 +- test/spec/refererDetection_spec.js | 71 +++++++++++++++---- 17 files changed, 115 insertions(+), 114 deletions(-) diff --git a/modules/33acrossBidAdapter.js b/modules/33acrossBidAdapter.js index 498e6cf8634..0095b4fb768 100644 --- a/modules/33acrossBidAdapter.js +++ b/modules/33acrossBidAdapter.js @@ -195,7 +195,7 @@ function _buildRequestParams(bidRequests, bidderRequest) { const uspConsent = bidderRequest && bidderRequest.uspConsent; - const pageUrl = (bidderRequest && bidderRequest.refererInfo) ? (bidderRequest.refererInfo.referer) : (undefined); + const pageUrl = bidderRequest?.refererInfo?.page adapterState.uniqueSiteIds = bidRequests.map(req => req.params.siteId).filter(uniques); diff --git a/modules/a4gBidAdapter.js b/modules/a4gBidAdapter.js index 03f9d6fd726..f0c7a5f5af1 100644 --- a/modules/a4gBidAdapter.js +++ b/modules/a4gBidAdapter.js @@ -44,7 +44,7 @@ export const spec = { let data = { [IFRAME_PARAM_NAME]: 0, - [LOCATION_PARAM_NAME]: (bidderRequest.refererInfo && bidderRequest.refererInfo.referer) ? bidderRequest.refererInfo.referer : window.location.href, + [LOCATION_PARAM_NAME]: bidderRequest.refererInfo?.page, [SIZE_PARAM_NAME]: sizeParams.join(ARRAY_PARAM_SEPARATOR), [ID_PARAM_NAME]: idParams.join(ARRAY_PARAM_SEPARATOR), [ZONE_ID_PARAM_NAME]: zoneIds.join(ARRAY_PARAM_SEPARATOR) diff --git a/modules/ablidaBidAdapter.js b/modules/ablidaBidAdapter.js index cb4f4ef2724..9e322ba449b 100644 --- a/modules/ablidaBidAdapter.js +++ b/modules/ablidaBidAdapter.js @@ -45,7 +45,8 @@ export const spec = { sizes: sizes, bidId: bidRequest.bidId, categories: bidRequest.params.categories, - referer: bidderRequest.refererInfo.referer, + // TODO: should referer be 'ref'? + referer: bidderRequest.refererInfo.page, jaySupported: jaySupported, device: device, adapterVersion: 5, diff --git a/modules/enrichmentFpdModule.js b/modules/enrichmentFpdModule.js index 76bae635fd3..8a8f9c58f8c 100644 --- a/modules/enrichmentFpdModule.js +++ b/modules/enrichmentFpdModule.js @@ -70,30 +70,21 @@ export function findRootDomain(fullDomain = window.location.hostname) { * Checks for referer and if exists merges into ortb2 global data */ function setReferer() { - if (getRefererInfo().referer) mergeDeep(ortb2, { site: { ref: getRefererInfo().referer } }); + if (getRefererInfo().ref) mergeDeep(ortb2, { site: { ref: getRefererInfo().ref } }); } /** * Checks for canonical url and if exists merges into ortb2 global data */ function setPage() { - if (getRefererInfo().canonicalUrl) mergeDeep(ortb2, { site: { page: getRefererInfo().canonicalUrl } }); + if (getRefererInfo().page) mergeDeep(ortb2, { site: { page: getRefererInfo().page } }); } /** * Checks for canonical url and if exists retrieves domain and merges into ortb2 global data */ function setDomain() { - let parseDomain = function(url) { - if (!url || typeof url !== 'string' || url.length === 0) return; - - var match = url.match(/^(?:https?:\/\/)?(?:www\.)?(.*?(?=(\?|\#|\/|$)))/i); - - return match && match[1]; - }; - - let domain = parseDomain(getRefererInfo().canonicalUrl) - + const domain = getRefererInfo().domain; if (domain) { mergeDeep(ortb2, { site: { domain: domain } }); mergeDeep(ortb2, { site: { publisher: { domain: findRootDomain(domain) } } }); diff --git a/modules/koblerBidAdapter.js b/modules/koblerBidAdapter.js index 80aa038a9f7..810ef7c6177 100644 --- a/modules/koblerBidAdapter.js +++ b/modules/koblerBidAdapter.js @@ -74,9 +74,8 @@ export const onBidWon = function (bid) { export const onTimeout = function (timeoutDataArray) { if (isArray(timeoutDataArray)) { const refererInfo = getRefererInfo(); - const pageUrl = (refererInfo && refererInfo.referer) - ? refererInfo.referer - : window.location.href; + // TODO: does it make sense to fall back to window.location.href? + const pageUrl = refererInfo?.page || window.location.href; timeoutDataArray.forEach(timeoutData => { const query = parseQueryStringParameters({ ad_unit_code: timeoutData.adUnitCode, diff --git a/modules/parrableIdSystem.js b/modules/parrableIdSystem.js index 04f36d0cb63..4a777097914 100644 --- a/modules/parrableIdSystem.js +++ b/modules/parrableIdSystem.js @@ -244,7 +244,7 @@ function fetchId(configParams, gdprConsentData) { const data = { eid, trackers, - url: refererInfo.referer, + url: refererInfo.page, prebidVersion: '$prebid.version$', isIframe: inIframe(), tpcSupport diff --git a/modules/prebidServerBidAdapter/index.js b/modules/prebidServerBidAdapter/index.js index b97a720a6cf..14425f03f89 100644 --- a/modules/prebidServerBidAdapter/index.js +++ b/modules/prebidServerBidAdapter/index.js @@ -874,7 +874,7 @@ Object.assign(ORTB2.prototype, { request.cur = [adServerCur[0]]; } - _appendSiteAppDevice(request, bidRequests[0].refererInfo.referer, s2sConfig.accountId); + _appendSiteAppDevice(request, bidRequests[0].refererInfo.page, s2sConfig.accountId); // pass schain object if it is present const schain = deepAccess(bidRequests, '0.bids.0.schain'); diff --git a/modules/rakutenBidAdapter/index.js b/modules/rakutenBidAdapter/index.js index e567509b3c1..27c04029231 100644 --- a/modules/rakutenBidAdapter/index.js +++ b/modules/rakutenBidAdapter/index.js @@ -22,8 +22,9 @@ export const spec = { l: navigator.browserLanguage || navigator.language, d: document.domain, + // TODO: what are 'tp' and 'pp'? tp: bidderRequest.refererInfo.stack[0] || window.location.href, - pp: bidderRequest.refererInfo.referer, + pp: bidderRequest.refererInfo.topmostLocation, gdpr: ((_a = bidderRequest.gdprConsent) === null || _a === void 0 ? void 0 : _a.gdprApplies) ? 1 : 0, ...((_b = bidderRequest.gdprConsent) === null || _b === void 0 ? void 0 : _b.consentString) && { cd: bidderRequest.gdprConsent.consentString diff --git a/modules/staqAnalyticsAdapter.js b/modules/staqAnalyticsAdapter.js index 55d9da54656..b9bfe5212c6 100644 --- a/modules/staqAnalyticsAdapter.js +++ b/modules/staqAnalyticsAdapter.js @@ -24,9 +24,10 @@ const STAQ_EVENTS = { } function buildRequestTemplate(connId) { - const url = staqAdapterRefWin.referer; - const ref = staqAdapterRefWin.referer; - const topLocation = staqAdapterRefWin.referer; + // TODO: what should these pick from refererInfo? + const url = staqAdapterRefWin.topmostLocation; + const ref = staqAdapterRefWin.topmostLocation; + const topLocation = staqAdapterRefWin.topmostLocation; return { ver: ANALYTICS_VERSION, diff --git a/src/refererDetection.js b/src/refererDetection.js index 2169a5fedec..512bb148f92 100644 --- a/src/refererDetection.js +++ b/src/refererDetection.js @@ -12,7 +12,7 @@ import { config } from './config.js'; import {logWarn} from './utils.js'; /** - * Convert urls of the form "example.com" or "//example.com" to "http(s)://example.com" + * Prepend a URL with the page's protocol (http/https), if necessary. */ export function ensureProtocol(url, win = window) { if (!url) return url; @@ -32,6 +32,23 @@ export function ensureProtocol(url, win = window) { } } +/** + * Extract the domain portion from a URL. + * @param url + */ +export function parseDomain(url) { + try { + url = new URL(ensureProtocol(url)); + } catch (e) { + return; + } + url = url.host; + if (url.startsWith('www.')) { + url = url.substring(4); + } + return url; +} + /** * @param {Window} win Window * @returns {Function} @@ -106,6 +123,7 @@ export function detectReferer(win) { let level = 0; let valuesFromAmp = false; let inAmpFrame = false; + let hasTopLocation = false; do { const previousWindow = currentWindow; @@ -130,6 +148,7 @@ export function detectReferer(win) { try { foundLocation = context.sourceUrl; bestLocation = foundLocation; + hasTopLocation = true; valuesFromAmp = true; @@ -159,6 +178,9 @@ export function detectReferer(win) { if (!foundLocation && ancestors && ancestors[level - 1]) { foundLocation = ancestors[level - 1]; + if (currentWindow === win.top) { + hasTopLocation = true; + } } if (foundLocation && !valuesFromAmp) { @@ -193,22 +215,24 @@ export function detectReferer(win) { stack.reverse(); - let topLocation, ref; + let ref; try { - topLocation = win.top.location.href; ref = win.top.document.referrer; } catch (e) {} - const page = ensureProtocol(bestCanonicalUrl, win) || topLocation || bestLocation || null; + const location = reachedTop || hasTopLocation ? bestLocation : null; + const page = ensureProtocol(bestCanonicalUrl, win) || location; return { reachedTop, isAmp: valuesFromAmp, numIframes: level - 1, stack, - location: bestLocation || null, // our best guess at page location - the topmost reachable frame URL + topmostLocation: bestLocation || null, // location of the topmost accessible frame + location, // location of window.top, if available canonicalUrl: bestCanonicalUrl || null, // canonical URL as provided with setConfig({pageUrl}) or link[rel="canonical"], in that order of priority - page: page, // canonicalUrl, falling back to location + page, // canonicalUrl, falling back to location + domain: parseDomain(page) || null, // the domain portion of `page` ref: ref || null, // window.top.document.referrer, if available }; } diff --git a/test/spec/modules/33acrossBidAdapter_spec.js b/test/spec/modules/33acrossBidAdapter_spec.js index 141edc1e61c..94e4f50edd7 100644 --- a/test/spec/modules/33acrossBidAdapter_spec.js +++ b/test/spec/modules/33acrossBidAdapter_spec.js @@ -919,7 +919,7 @@ describe('33acrossBidAdapter:', function () { it('returns corresponding server requests with site.page set', function() { const bidderRequest = { refererInfo: { - referer: 'http://foo.com/bar' + page: 'http://foo.com/bar' } }; diff --git a/test/spec/modules/enrichmentFpdModule_spec.js b/test/spec/modules/enrichmentFpdModule_spec.js index 41340372d4e..7d7e463c015 100644 --- a/test/spec/modules/enrichmentFpdModule_spec.js +++ b/test/spec/modules/enrichmentFpdModule_spec.js @@ -54,9 +54,10 @@ describe('the first party data enrichment module', function() { let validated = processFpd({}, {}).global; - expect(validated.site.ref).to.equal(getRefererInfo().referer); - expect(validated.site.page).to.be.undefined; - expect(validated.site.domain).to.be.undefined; + const {ref, page, domain} = getRefererInfo(); + expect(validated.site.ref).to.equal(ref || undefined); + expect(validated.site.page).to.equal(page || undefined) + expect(validated.site.domain).to.equal(domain || undefined) expect(validated.device).to.deep.equal({ w: 800, h: 500 }); expect(validated.site.keywords).to.be.undefined; }); @@ -68,7 +69,7 @@ describe('the first party data enrichment module', function() { let validated = processFpd({}, {}).global; - expect(validated.site.ref).to.equal(getRefererInfo().referer); + expect(validated.site.ref).to.equal(getRefererInfo().ref || undefined); expect(validated.site.page).to.equal('https://www.subdomain.domain.co.uk/path?query=12345'); expect(validated.site.domain).to.equal('subdomain.domain.co.uk'); expect(validated.site.publisher.domain).to.equal('domain.co.uk'); @@ -83,10 +84,6 @@ describe('the first party data enrichment module', function() { let validated = processFpd({}, {}).global; - expect(validated.site.ref).to.equal(getRefererInfo().referer); - expect(validated.site.page).to.be.undefined; - expect(validated.site.domain).to.be.undefined; - expect(validated.device).to.deep.equal({ w: 800, h: 500 }); expect(validated.site.keywords).to.equal('value1,value2,value3'); }); @@ -98,7 +95,6 @@ describe('the first party data enrichment module', function() { expect(validated.site.ref).to.equal('https://someUrl.com'); expect(validated.site.page).to.equal('test.com'); - expect(validated.site.domain).to.be.undefined; expect(validated.device).to.deep.equal({ w: 1200, h: 700 }); expect(validated.site.keywords).to.be.undefined; }); diff --git a/test/spec/modules/fpdModule_spec.js b/test/spec/modules/fpdModule_spec.js index 4c80a8bb692..7b623e5eb0a 100644 --- a/test/spec/modules/fpdModule_spec.js +++ b/test/spec/modules/fpdModule_spec.js @@ -51,63 +51,6 @@ describe('the first party data module', function () { keywords.name = 'keywords'; }); - it('sets default referer and dimension values to ortb2 data', function () { - registerSubmodules(enrichments); - registerSubmodules(validations); - - let validated; - - width = 1120; - height = 750; - - ({global: validated} = processFpd()); - - expect(validated.site.ref).to.equal(getRefererInfo().referer); - expect(validated.site.page).to.be.undefined; - expect(validated.site.domain).to.be.undefined; - expect(validated.device).to.deep.equal({w: 1120, h: 750}); - expect(validated.site.keywords).to.be.undefined; - }); - - it('sets page and domain values to ortb2 data if canonical link exists', function () { - let validated; - - canonical.href = 'https://www.domain.com/path?query=12345'; - - ({global: validated} = processFpd()); - expect(validated.site.ref).to.equal(getRefererInfo().referer); - expect(validated.site.page).to.equal('https://www.domain.com/path?query=12345'); - expect(validated.site.domain).to.equal('domain.com'); - expect(validated.device).to.deep.to.equal({w: 1120, h: 750}); - expect(validated.site.keywords).to.be.undefined; - }); - - it('sets keyword values to ortb2 data if keywords meta exists', function () { - let validated; - - keywords.content = 'value1,value2,value3'; - - ({global: validated} = processFpd()); - expect(validated.site.ref).to.equal(getRefererInfo().referer); - expect(validated.site.page).to.be.undefined; - expect(validated.site.domain).to.be.undefined; - expect(validated.device).to.deep.to.equal({w: 1120, h: 750}); - expect(validated.site.keywords).to.equal('value1,value2,value3'); - }); - - it('only sets values that do not exist in ortb2 config', function () { - let validated; - - const global = {site: {ref: 'https://testpage.com', domain: 'newDomain.com'}}; - - ({global: validated} = processFpd({global})); - expect(validated.site.ref).to.equal('https://testpage.com'); - expect(validated.site.page).to.be.undefined; - expect(validated.site.domain).to.equal('newDomain.com'); - expect(validated.device).to.deep.to.equal({w: 1120, h: 750}); - expect(validated.site.keywords).to.be.undefined; - }); - it('filters ortb2 data that is set', function () { let validated; const global = { diff --git a/test/spec/modules/koblerBidAdapter_spec.js b/test/spec/modules/koblerBidAdapter_spec.js index 76c2c287989..aae2ab1c0e4 100644 --- a/test/spec/modules/koblerBidAdapter_spec.js +++ b/test/spec/modules/koblerBidAdapter_spec.js @@ -693,12 +693,12 @@ describe('KoblerAdapter', function () { expect(utils.triggerPixel.getCall(0).args[0]).to.be.equal( 'https://bid.essrtb.com/notify/prebid_timeout?ad_unit_code=adunit-code&' + 'auction_id=a1fba829-dd41-409f-acfb-b7b0ac5f30c6&bid_id=ef236c6c-e934-406b-a877-d7be8e8a839a&timeout=100&' + - 'placement_id=xrwg62731&page_url=' + encodeURIComponent(getRefererInfo().referer) + 'placement_id=xrwg62731&page_url=' + encodeURIComponent(getRefererInfo().page) ); expect(utils.triggerPixel.getCall(1).args[0]).to.be.equal( 'https://bid.essrtb.com/notify/prebid_timeout?ad_unit_code=adunit-code-2&' + 'auction_id=a1fba829-dd41-409f-acfb-b7b0ac5f30c6&bid_id=ca4121c8-9a4a-46ba-a624-e9b64af206f2&timeout=100&' + - 'placement_id=bc482234&page_url=' + encodeURIComponent(getRefererInfo().referer) + 'placement_id=bc482234&page_url=' + encodeURIComponent(getRefererInfo().page) ); }); }); diff --git a/test/spec/modules/parrableIdSystem_spec.js b/test/spec/modules/parrableIdSystem_spec.js index a6e6185bbb2..481c3289f1f 100644 --- a/test/spec/modules/parrableIdSystem_spec.js +++ b/test/spec/modules/parrableIdSystem_spec.js @@ -128,7 +128,7 @@ describe('Parrable ID System', function() { expect(data).to.deep.equal({ eid: P_COOKIE_EID, trackers: P_CONFIG_MOCK.params.partners.split(','), - url: getRefererInfo().referer, + url: getRefererInfo().page, prebidVersion: '$prebid.version$', isIframe: true }); diff --git a/test/spec/modules/prebidServerBidAdapter_spec.js b/test/spec/modules/prebidServerBidAdapter_spec.js index 4ea787519da..b47b0fc5a0b 100644 --- a/test/spec/modules/prebidServerBidAdapter_spec.js +++ b/test/spec/modules/prebidServerBidAdapter_spec.js @@ -510,7 +510,7 @@ describe('S2S Adapter', function () { 'src': 's2s', 'doneCbCallCount': 0, 'refererInfo': { - 'referer': 'http://mytestpage.com' + 'page': 'http://mytestpage.com' } } ]; diff --git a/test/spec/refererDetection_spec.js b/test/spec/refererDetection_spec.js index 83d2ab1699b..8ebfa793f90 100644 --- a/test/spec/refererDetection_spec.js +++ b/test/spec/refererDetection_spec.js @@ -1,4 +1,4 @@ -import {detectReferer, ensureProtocol} from 'src/refererDetection.js'; +import {detectReferer, ensureProtocol, parseDomain} from 'src/refererDetection.js'; import {config} from 'src/config.js'; import {expect} from 'chai'; @@ -103,6 +103,7 @@ describe('Referer detection', () => { result = detectReferer(testWindow)(); expect(result).to.deep.equal({ + topmostLocation: 'https://example.com/some/page', location: 'https://example.com/some/page', reachedTop: true, isAmp: false, @@ -111,6 +112,7 @@ describe('Referer detection', () => { canonicalUrl: null, page: 'https://example.com/some/page', ref: 'https://othersite.com/', + domain: 'example.com', }); }); @@ -119,6 +121,7 @@ describe('Referer detection', () => { result = detectReferer(testWindow)(); expect(result).to.deep.equal({ + topmostLocation: 'https://example.com/some/page', location: 'https://example.com/some/page', reachedTop: true, isAmp: false, @@ -127,6 +130,7 @@ describe('Referer detection', () => { canonicalUrl: 'https://example.com/canonical/page', page: 'https://example.com/canonical/page', ref: 'https://othersite.com/', + domain: 'example.com' }); }); }); @@ -137,6 +141,7 @@ describe('Referer detection', () => { result = detectReferer(testWindow)(); expect(result).to.deep.equal({ + topmostLocation: 'https://example.com/some/page', location: 'https://example.com/some/page', reachedTop: true, isAmp: false, @@ -148,7 +153,8 @@ describe('Referer detection', () => { ], canonicalUrl: null, page: 'https://example.com/some/page', - ref: 'https://othersite.com/' + ref: 'https://othersite.com/', + domain: 'example.com' }); }); @@ -157,6 +163,7 @@ describe('Referer detection', () => { result = detectReferer(testWindow)(); expect(result).to.deep.equal({ + topmostLocation: 'https://example.com/some/page', location: 'https://example.com/some/page', reachedTop: true, isAmp: false, @@ -168,17 +175,19 @@ describe('Referer detection', () => { ], canonicalUrl: 'https://example.com/canonical/page', page: 'https://example.com/canonical/page', - ref: 'https://othersite.com/' + ref: 'https://othersite.com/', + domain: 'example.com' }); }); it('Should override canonical URL (and page) with config pageUrl', () => { - config.setConfig({'pageUrl': 'https://testUrl.com'}); + config.setConfig({'pageUrl': 'https://testurl.com'}); const testWindow = buildWindowTree(['https://example.com/some/page', 'https://example.com/other/page', 'https://example.com/third/page'], 'https://othersite.com/', 'https://example.com/canonical/page'), result = detectReferer(testWindow)(); expect(result).to.deep.equal({ + topmostLocation: 'https://example.com/some/page', location: 'https://example.com/some/page', reachedTop: true, isAmp: false, @@ -188,9 +197,10 @@ describe('Referer detection', () => { 'https://example.com/other/page', 'https://example.com/third/page' ], - canonicalUrl: 'https://testUrl.com', - page: 'https://testUrl.com', + canonicalUrl: 'https://testurl.com', + page: 'https://testurl.com', ref: 'https://othersite.com/', + domain: 'testurl.com' }); }); }); @@ -203,6 +213,7 @@ describe('Referer detection', () => { expect(result).to.deep.equal({ location: 'https://example.com/some/page', + topmostLocation: 'https://example.com/some/page', reachedTop: true, isAmp: false, numIframes: 1, @@ -213,6 +224,7 @@ describe('Referer detection', () => { canonicalUrl: null, page: 'https://example.com/some/page', ref: null, + domain: 'example.com' }); }); @@ -221,6 +233,7 @@ describe('Referer detection', () => { result = detectReferer(testWindow)(); expect(result).to.deep.equal({ + topmostLocation: 'https://example.com/some/page', location: 'https://example.com/some/page', reachedTop: true, isAmp: false, @@ -233,15 +246,17 @@ describe('Referer detection', () => { canonicalUrl: null, page: 'https://example.com/some/page', ref: null, + domain: 'example.com', }); }); - it('Should return the second iframe location with three cross-origin windows and no ancessorOrigins', () => { + it('Should return the second iframe location with three cross-origin windows and no ancestorOrigins', () => { const testWindow = buildWindowTree(['https://example.com/some/page', 'https://safe.frame/ad', 'https://otherfr.ame/ad'], 'https://othersite.com/', 'https://canonical.example.com/'), result = detectReferer(testWindow)(); expect(result).to.deep.equal({ - location: 'https://safe.frame/ad', + topmostLocation: 'https://safe.frame/ad', + location: null, reachedTop: false, isAmp: false, numIframes: 2, @@ -251,8 +266,9 @@ describe('Referer detection', () => { 'https://otherfr.ame/ad' ], canonicalUrl: null, - page: 'https://safe.frame/ad', - ref: null + page: null, + ref: null, + domain: null }); }); @@ -261,6 +277,7 @@ describe('Referer detection', () => { result = detectReferer(testWindow)(); expect(result).to.deep.equal({ + topmostLocation: 'https://example.com/', location: 'https://example.com/', reachedTop: false, isAmp: false, @@ -273,6 +290,7 @@ describe('Referer detection', () => { canonicalUrl: null, page: 'https://example.com/', ref: null, + domain: 'example.com' }); }); }); @@ -290,6 +308,7 @@ describe('Referer detection', () => { expect(result).to.deep.equal({ location: 'https://example.com/some/page/amp/', + topmostLocation: 'https://example.com/some/page/amp/', reachedTop: true, isAmp: true, numIframes: 1, @@ -299,7 +318,8 @@ describe('Referer detection', () => { ], canonicalUrl: 'https://example.com/some/page/', page: 'https://example.com/some/page/', - ref: null + ref: null, + domain: 'example.com' }); }); @@ -314,6 +334,7 @@ describe('Referer detection', () => { const result = detectReferer(testWindow)(); expect(result).to.deep.equal({ + topmostLocation: 'https://example.com/some/page/amp/', location: 'https://example.com/some/page/amp/', reachedTop: true, isAmp: true, @@ -325,6 +346,7 @@ describe('Referer detection', () => { canonicalUrl: 'https://example.com/some/page/', page: 'https://example.com/some/page/', ref: null, + domain: 'example.com' }); }); @@ -340,6 +362,7 @@ describe('Referer detection', () => { const result = detectReferer(testWindow)(); expect(result).to.deep.equal({ + topmostLocation: 'https://example.com/some/page/amp/', location: 'https://example.com/some/page/amp/', reachedTop: false, isAmp: true, @@ -352,6 +375,7 @@ describe('Referer detection', () => { canonicalUrl: 'https://example.com/some/page/', page: 'https://example.com/some/page/', ref: null, + domain: 'example.com', }); }); @@ -367,6 +391,7 @@ describe('Referer detection', () => { expect(result).to.deep.equal({ location: 'https://example.com/some/page/amp/', + topmostLocation: 'https://example.com/some/page/amp/', reachedTop: false, isAmp: true, numIframes: 2, @@ -378,6 +403,7 @@ describe('Referer detection', () => { canonicalUrl: 'https://example.com/some/page/', page: 'https://example.com/some/page/', ref: null, + domain: 'example.com' }); }); @@ -393,6 +419,7 @@ describe('Referer detection', () => { expect(result).to.deep.equal({ location: 'https://example.com/some/page/amp/', + topmostLocation: 'https://example.com/some/page/amp/', reachedTop: false, isAmp: true, numIframes: 3, @@ -404,7 +431,8 @@ describe('Referer detection', () => { ], canonicalUrl: 'https://example.com/some/page/', page: 'https://example.com/some/page/', - ref: null + ref: null, + domain: 'example.com', }); }); }); @@ -466,5 +494,22 @@ describe('ensureProtocol', () => { }); }); }); - }) }); +}); + +describe('parseDomain', () => { + Object.entries({ + 'example.com': 'example.com', + 'www.example.com': 'example.com', + 'example.com:443': 'example.com:443', + 'www.sub.example.com': 'sub.example.com', + 'example.com/page': 'example.com', + 'www.example.com:443/page': 'example.com:443', + 'http://www.example.com:443/page?query=value': 'example.com:443', + '': undefined + }).forEach(([input, expected]) => { + it(`should extract domain from '${input}' -> '${expected}`, () => { + expect(parseDomain(input)).to.equal(expected); + }); + }) +});