From 350eb013456d0edab56ce1b8741913e92c2a0bcf Mon Sep 17 00:00:00 2001 From: Patrick McCann Date: Fri, 20 Feb 2026 14:43:54 -0500 Subject: [PATCH 1/3] Core: migrate GPT targeting access to config APIs --- libraries/browsiUtils/browsiUtils.js | 5 ++++- libraries/gptUtils/gptUtils.js | 8 +++++++- libraries/intentIqUtils/gamPredictionReport.js | 13 ++++++++++--- modules/sirdataRtdProvider.js | 2 +- test/spec/integration/faker/googletag.js | 16 +++++++--------- test/spec/modules/browsiRtdProvider_spec.js | 3 +-- 6 files changed, 30 insertions(+), 17 deletions(-) diff --git a/libraries/browsiUtils/browsiUtils.js b/libraries/browsiUtils/browsiUtils.js index 9b520ff53a9..037c167d2f0 100644 --- a/libraries/browsiUtils/browsiUtils.js +++ b/libraries/browsiUtils/browsiUtils.js @@ -234,7 +234,10 @@ export function getMacroId(macro, slot) { if (macro) { try { const macroResult = evaluate(macro, slot.getSlotElementId(), slot.getAdUnitPath(), (match, p1) => { - return (p1 && slot.getTargeting(p1).join('_')) || 'NA'; + if (!p1) return 'NA'; + const targeting = slot.getConfig?.('targeting')?.targeting; + const value = targeting?.[p1] ?? slot.getTargeting?.(p1); + return (Array.isArray(value) ? value : [value]).filter(v => v != null).join('_') || 'NA'; }); return macroResult; } catch (e) { diff --git a/libraries/gptUtils/gptUtils.js b/libraries/gptUtils/gptUtils.js index 17ca64483ab..ff46127231e 100644 --- a/libraries/gptUtils/gptUtils.js +++ b/libraries/gptUtils/gptUtils.js @@ -24,7 +24,13 @@ export function setKeyValue(key, value) { window.googletag = window.googletag || {cmd: []}; window.googletag.cmd = window.googletag.cmd || []; window.googletag.cmd.push(() => { - window.googletag.pubads().setTargeting(key, value); + // codex agent: bot-authored migration away from deprecated GPT targeting APIs. + const values = Array.isArray(value) ? value : [value]; + if (typeof window.googletag.setConfig === 'function') { + window.googletag.setConfig({targeting: {[key]: values}}); + return; + } + window.googletag.pubads().setTargeting?.(key, value); }); } diff --git a/libraries/intentIqUtils/gamPredictionReport.js b/libraries/intentIqUtils/gamPredictionReport.js index 2191ade6d35..0af51d48795 100644 --- a/libraries/intentIqUtils/gamPredictionReport.js +++ b/libraries/intentIqUtils/gamPredictionReport.js @@ -7,9 +7,16 @@ export function gamPredictionReport (gamObjectReference, sendData) { const getSlotTargeting = (slot) => { const kvs = {}; try { - (slot.getTargetingKeys() || []).forEach((k) => { - kvs[k] = slot.getTargeting(k); - }); + const targeting = slot.getConfig?.('targeting')?.targeting; + if (targeting != null) { + Object.entries(targeting).forEach(([key, value]) => { + kvs[key] = Array.isArray(value) ? value : [value]; + }); + } else { + (slot.getTargetingKeys?.() || []).forEach((k) => { + kvs[k] = slot.getTargeting(k); + }); + } } catch (e) { logError('Failed to get targeting keys: ' + e); } diff --git a/modules/sirdataRtdProvider.js b/modules/sirdataRtdProvider.js index 81c75692fde..584abfbb129 100644 --- a/modules/sirdataRtdProvider.js +++ b/modules/sirdataRtdProvider.js @@ -673,7 +673,7 @@ export function addSegmentData(reqBids, data, adUnits, onDone) { window.googletag.cmd.push(() => { window.googletag.pubads().getSlots().forEach(slot => { - if (typeof slot.setTargeting !== 'undefined' && sirdataMergedList.length > 0) { + if (typeof slot.setConfig === 'function' && sirdataMergedList.length > 0) { slot.setConfig({targeting: {'sd_rtd': sirdataMergedList}}); } }); diff --git a/test/spec/integration/faker/googletag.js b/test/spec/integration/faker/googletag.js index 4060040b902..a881d957337 100644 --- a/test/spec/integration/faker/googletag.js +++ b/test/spec/integration/faker/googletag.js @@ -6,7 +6,7 @@ var Slot = function Slot({ code, divId }) { divId = divId || `div-id-${randomFive()}`; var slot = { - targeting: [], + targeting: {}, getSlotElementId: function getSlotElementId() { return divId; }, @@ -16,28 +16,26 @@ var Slot = function Slot({ code, divId }) { }, setTargeting: function setTargeting(key, value) { - var obj = []; - obj[key] = value; - this.targeting.push(obj); + this.targeting[key] = Array.isArray(value) ? value : [value]; }, - getTargeting: function getTargeting() { - return this.targeting; + getTargeting: function getTargeting(key) { + return this.targeting[key] || []; }, getTargetingKeys: function getTargetingKeys() { - return []; + return Object.keys(this.targeting); }, getConfig: function getConfig(key) { if (key === 'targeting') { - return this.targeting; + return {targeting: this.targeting}; } }, setConfig: function setConfig(config) { if (config?.targeting) { - this.targeting = config.targeting; + Object.assign(this.targeting, config.targeting); } }, diff --git a/test/spec/modules/browsiRtdProvider_spec.js b/test/spec/modules/browsiRtdProvider_spec.js index 202732202d2..13206b002be 100644 --- a/test/spec/modules/browsiRtdProvider_spec.js +++ b/test/spec/modules/browsiRtdProvider_spec.js @@ -69,9 +69,8 @@ describe('browsi Real time data sub module', function () { const slot = mockGpt.makeSlot({ code: '/123/abc', divId: 'browsiAd_1' }); slot.setTargeting('test', ['test', 'value']); - // slot getTargeting doesn't act like GPT so we can't expect real value const macroResult = browsiUtils.getMacroId({ p: '/' }, slot); - expect(macroResult).to.equal('/123/abc/NA'); + expect(macroResult).to.equal('/123/abc/test_value'); const macroResultB = browsiUtils.getMacroId({}, slot); expect(macroResultB).to.equal('browsiAd_1'); From f2f225606396e808c5d12b1fd382ac0c6b4291af Mon Sep 17 00:00:00 2001 From: Patrick McCann Date: Fri, 20 Feb 2026 15:00:16 -0500 Subject: [PATCH 2/3] Core: remove legacy GPT targeting fallbacks --- libraries/browsiUtils/browsiUtils.js | 3 +-- libraries/gptUtils/gptUtils.js | 7 +------ libraries/intentIqUtils/gamPredictionReport.js | 14 ++++---------- modules/sirdataRtdProvider.js | 2 +- test/spec/modules/browsiRtdProvider_spec.js | 2 +- 5 files changed, 8 insertions(+), 20 deletions(-) diff --git a/libraries/browsiUtils/browsiUtils.js b/libraries/browsiUtils/browsiUtils.js index 037c167d2f0..2180b7e0a4b 100644 --- a/libraries/browsiUtils/browsiUtils.js +++ b/libraries/browsiUtils/browsiUtils.js @@ -235,8 +235,7 @@ export function getMacroId(macro, slot) { try { const macroResult = evaluate(macro, slot.getSlotElementId(), slot.getAdUnitPath(), (match, p1) => { if (!p1) return 'NA'; - const targeting = slot.getConfig?.('targeting')?.targeting; - const value = targeting?.[p1] ?? slot.getTargeting?.(p1); + const value = slot.getConfig('targeting').targeting?.[p1]; return (Array.isArray(value) ? value : [value]).filter(v => v != null).join('_') || 'NA'; }); return macroResult; diff --git a/libraries/gptUtils/gptUtils.js b/libraries/gptUtils/gptUtils.js index ff46127231e..8be29f660be 100644 --- a/libraries/gptUtils/gptUtils.js +++ b/libraries/gptUtils/gptUtils.js @@ -24,13 +24,8 @@ export function setKeyValue(key, value) { window.googletag = window.googletag || {cmd: []}; window.googletag.cmd = window.googletag.cmd || []; window.googletag.cmd.push(() => { - // codex agent: bot-authored migration away from deprecated GPT targeting APIs. const values = Array.isArray(value) ? value : [value]; - if (typeof window.googletag.setConfig === 'function') { - window.googletag.setConfig({targeting: {[key]: values}}); - return; - } - window.googletag.pubads().setTargeting?.(key, value); + window.googletag.setConfig({targeting: {[key]: values}}); }); } diff --git a/libraries/intentIqUtils/gamPredictionReport.js b/libraries/intentIqUtils/gamPredictionReport.js index 0af51d48795..d239fa16b9e 100644 --- a/libraries/intentIqUtils/gamPredictionReport.js +++ b/libraries/intentIqUtils/gamPredictionReport.js @@ -7,16 +7,10 @@ export function gamPredictionReport (gamObjectReference, sendData) { const getSlotTargeting = (slot) => { const kvs = {}; try { - const targeting = slot.getConfig?.('targeting')?.targeting; - if (targeting != null) { - Object.entries(targeting).forEach(([key, value]) => { - kvs[key] = Array.isArray(value) ? value : [value]; - }); - } else { - (slot.getTargetingKeys?.() || []).forEach((k) => { - kvs[k] = slot.getTargeting(k); - }); - } + const targeting = slot.getConfig('targeting').targeting; + Object.entries(targeting || {}).forEach(([key, value]) => { + kvs[key] = Array.isArray(value) ? value : [value]; + }); } catch (e) { logError('Failed to get targeting keys: ' + e); } diff --git a/modules/sirdataRtdProvider.js b/modules/sirdataRtdProvider.js index 584abfbb129..22033751858 100644 --- a/modules/sirdataRtdProvider.js +++ b/modules/sirdataRtdProvider.js @@ -673,7 +673,7 @@ export function addSegmentData(reqBids, data, adUnits, onDone) { window.googletag.cmd.push(() => { window.googletag.pubads().getSlots().forEach(slot => { - if (typeof slot.setConfig === 'function' && sirdataMergedList.length > 0) { + if (sirdataMergedList.length > 0) { slot.setConfig({targeting: {'sd_rtd': sirdataMergedList}}); } }); diff --git a/test/spec/modules/browsiRtdProvider_spec.js b/test/spec/modules/browsiRtdProvider_spec.js index 13206b002be..978fd205731 100644 --- a/test/spec/modules/browsiRtdProvider_spec.js +++ b/test/spec/modules/browsiRtdProvider_spec.js @@ -68,7 +68,7 @@ describe('browsi Real time data sub module', function () { it('should return correct macro values', function () { const slot = mockGpt.makeSlot({ code: '/123/abc', divId: 'browsiAd_1' }); - slot.setTargeting('test', ['test', 'value']); + slot.setConfig({targeting: {'test': ['test', 'value']}}); const macroResult = browsiUtils.getMacroId({ p: '/' }, slot); expect(macroResult).to.equal('/123/abc/test_value'); From d4dc16a0f4e8ca4276f00c8ab62cf39a192ea38c Mon Sep 17 00:00:00 2001 From: Patrick McCann Date: Mon, 23 Feb 2026 09:56:34 -0500 Subject: [PATCH 3/3] Core: normalize GPT targeting config reads --- libraries/browsiUtils/browsiUtils.js | 3 ++- libraries/intentIqUtils/gamPredictionReport.js | 3 ++- test/spec/integration/faker/googletag.js | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/libraries/browsiUtils/browsiUtils.js b/libraries/browsiUtils/browsiUtils.js index 2180b7e0a4b..5e0442e12c6 100644 --- a/libraries/browsiUtils/browsiUtils.js +++ b/libraries/browsiUtils/browsiUtils.js @@ -235,7 +235,8 @@ export function getMacroId(macro, slot) { try { const macroResult = evaluate(macro, slot.getSlotElementId(), slot.getAdUnitPath(), (match, p1) => { if (!p1) return 'NA'; - const value = slot.getConfig('targeting').targeting?.[p1]; + const targetingConfig = slot.getConfig('targeting'); + const value = (targetingConfig?.targeting || targetingConfig || {})[p1]; return (Array.isArray(value) ? value : [value]).filter(v => v != null).join('_') || 'NA'; }); return macroResult; diff --git a/libraries/intentIqUtils/gamPredictionReport.js b/libraries/intentIqUtils/gamPredictionReport.js index d239fa16b9e..b696da251e3 100644 --- a/libraries/intentIqUtils/gamPredictionReport.js +++ b/libraries/intentIqUtils/gamPredictionReport.js @@ -7,7 +7,8 @@ export function gamPredictionReport (gamObjectReference, sendData) { const getSlotTargeting = (slot) => { const kvs = {}; try { - const targeting = slot.getConfig('targeting').targeting; + const targetingConfig = slot.getConfig('targeting'); + const targeting = targetingConfig?.targeting || targetingConfig; Object.entries(targeting || {}).forEach(([key, value]) => { kvs[key] = Array.isArray(value) ? value : [value]; }); diff --git a/test/spec/integration/faker/googletag.js b/test/spec/integration/faker/googletag.js index a881d957337..ff487c40302 100644 --- a/test/spec/integration/faker/googletag.js +++ b/test/spec/integration/faker/googletag.js @@ -29,7 +29,7 @@ var Slot = function Slot({ code, divId }) { getConfig: function getConfig(key) { if (key === 'targeting') { - return {targeting: this.targeting}; + return this.targeting; } },