Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
060e707
Use dependency injection in the Advertising component
carterworks Feb 25, 2026
34cbec0
Use dependency injection in the makeSendServiceWorkerTrackingData fun…
carterworks Feb 25, 2026
401e191
Add changeset
carterworks Feb 25, 2026
e81cf12
Update jsdoc comments for advertising component
carterworks Feb 25, 2026
aa46ad8
fix jsdoc comments
carterworks Feb 26, 2026
f2de2fa
unify dependency injection a bit
carterworks Feb 26, 2026
d59682b
Annotate testing code smells
carterworks Mar 2, 2026
b4b2960
Annotate more leaky patterns in tests
carterworks Mar 2, 2026
518a614
Fix formatting & linting of test and script files
carterworks Mar 3, 2026
e2a80b4
Create and use a location helper for safe url modifications during tests
carterworks Mar 3, 2026
1d4c798
Rewrite adConversionHandler tests
carterworks Mar 3, 2026
dfe4194
Remove dead mocks in advertising specs
carterworks Mar 3, 2026
7151ba0
Make all module mocks docs compliant
carterworks Mar 4, 2026
dfc7de7
Use safer withTemporaryUrl function in some unit tests
carterworks Mar 4, 2026
c92fa64
Harden the mediaEvents integration tests
carterworks Mar 4, 2026
e4e6329
Fix viewThroughHandler mocks
carterworks Mar 4, 2026
79ba414
Reset dom action nonces better in tests
carterworks Mar 4, 2026
de720ae
Remove location changing from advertising helper specs
carterworks Mar 4, 2026
7e2f82b
Make serviceWorkerNotificationClickListener a default export
carterworks Mar 4, 2026
71fecb9
Pass missing params into serviceWorkerPushListener
carterworks Mar 4, 2026
1147d35
Fix jsdoc comment
carterworks Mar 4, 2026
e0cd653
Clean up event listeners
carterworks Mar 5, 2026
d831b02
Resolve other FIXME comments
carterworks Mar 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .changeset/green-poets-bow.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
---
---
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
"scripts": {
"clean": "rimraf dist distTest libEs5 libEs6 types",
"lint": "eslint --cache --fix \"*.{js,cjs,mjs,jsx}\" \"{sandboxes/*/src,packages/*/src,test,scripts}/**/*.{js,cjs,mjs,jsx}\"",
"format": "prettier --write \"*.{html,js,cjs,mjs,jsx}\" \"{sandboxes/*/src,packages/*/src,test,scripts}/**/*.{html,js,cjs,mjs,jsx}\"",
"format": "prettier --write \"*.{html,js,cjs,mjs,jsx}\" \"{sandboxes/*/src,packages/*/{src,test,scripts}}/**/*.{html,js,cjs,mjs,jsx}\"",
"types": "tsc",
"test": "pnpm exec playwright install chromium && vitest run && pnpm run test:scripts",
"test:coverage": "rimraf coverage && pnpm exec playwright install chromium && vitest run --coverage",
Expand Down Expand Up @@ -55,13 +55,13 @@
"./*.{cjs,mjs,js,jsx}": [
"eslint --cache --fix"
],
"./{packages/*/src,test,scripts}/**/*.{cjs,mjs,js,jsx}": [
"./{packages/*/{src,test,scripts}}/**/*.{cjs,mjs,js,jsx}": [
"eslint --cache --fix"
],
"./*.{html,js,cjs,mjs,jsx}": [
"prettier --write"
],
"./{sandboxes/browser,packages/*/src,test,scripts}/**/*.{html,js,cjs,mjs,jsx}": [
"./{sandboxes/browser,packages/*/{src,test,scripts}}/**/*.{html,js,cjs,mjs,jsx}": [
"prettier --write"
]
},
Expand Down
42 changes: 2 additions & 40 deletions packages/core/src/components/Advertising/createComponent.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,53 +10,15 @@ OF ANY KIND, either express or implied. See the License for the specific languag
governing permissions and limitations under the License.
*/

import createSendAdConversion from "./handlers/sendAdConversion.js";
import handleOnBeforeSendEvent from "./handlers/onBeforeSendEventHandler.js";

export default ({
logger,
config,
eventManager,
cookieManager,
adConversionHandler,
getBrowser,
consent,
}) => {
const componentConfig = config.advertising;

const sendAdConversionHandler = createSendAdConversion({
eventManager,
cookieManager,
adConversionHandler,
logger,
componentConfig,
getBrowser,
consent,
});

export default ({ handleOnBeforeSendEvent, sendAdConversionHandler }) => {
return {
lifecycle: {
onComponentsRegistered() {
// Fire-and-forget: don't return the promise so we don't block
// the configure command from resolving while waiting for consent.
sendAdConversionHandler();
},
onBeforeEvent: ({ event, advertising = {} }) => {
const { state } = consent.current();
if (state !== "in") {
// Consent not yet granted — skip advertising ID resolution
// but don't block the sendEvent call.
return;
}
return handleOnBeforeSendEvent({
cookieManager,
logger,
event,
componentConfig,
advertising,
getBrowser,
});
},
onBeforeEvent: handleOnBeforeSendEvent,
},
};
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
/*
Copyright 2023 Adobe. All rights reserved.
This file is licensed to you under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. You may obtain a copy
of the License at http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under
the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
OF ANY KIND, either express or implied. See the License for the specific language
governing permissions and limitations under the License.
*/

import { SURFER_ID, ID5_ID, RAMP_ID } from "../constants/index.js";
import { AUTO, WAIT } from "../../../constants/consentStatus.js";
import { CHROME } from "../../../constants/browser.js";

const isAdvertisingDisabled = (advertising) => {
return ![AUTO, WAIT].includes(
advertising?.handleAdvertisingData?.toLowerCase(),
);
};

const waitForAdvertisingId = (advertising) => {
return advertising?.handleAdvertisingData?.toLowerCase() === WAIT;
};

/**
* Creates an onBeforeSendEvent handler that appends advertising IDs to events.
*
* @param {Object} dependencies
* @param {Object} dependencies.cookieManager
* @param {Object} dependencies.logger
* @param {Object} dependencies.componentConfig
* @param {Function} dependencies.getBrowser
* @param {Object} dependencies.consent
* @param {Function} dependencies.collectSurferId
* @param {Function} dependencies.getID5Id
* @param {Function} dependencies.getRampId
* @param {Function} dependencies.appendAdvertisingIdQueryToEvent
* @param {Function} dependencies.getUrlParams
* @param {Function} dependencies.isThrottled
*/
export default ({
cookieManager,
logger,
componentConfig,
getBrowser,
consent,
collectSurferId,
getID5Id,
getRampId,
appendAdvertisingIdQueryToEvent,
getUrlParams,
isThrottled,
}) => {
/**
* Appends advertising identity IDs to AEP event query if not already added.
*
* @param {Object} options
* @param {Object} options.event
* @param {Object} [options.advertising={}]
* @returns {Promise<void>}
*/
return async ({ event, advertising = {} }) => {
const { state } = consent.current();
if (state !== "in") {
return;
}
const { skwcid, efid } = getUrlParams();
const isClickThru = !!(skwcid && efid);
if (
isAdvertisingDisabled(advertising) ||
isClickThru ||
(isThrottled(SURFER_ID, cookieManager) &&
isThrottled(ID5_ID, cookieManager) &&
isThrottled(RAMP_ID, cookieManager))
)
return;

try {
const useShortTimeout = waitForAdvertisingId(advertising);

let rampIdPromise = null;

if (!getBrowser || getBrowser() !== CHROME) {
rampIdPromise = getRampId(
logger,
componentConfig.rampIdJSPath,
cookieManager,
useShortTimeout,
useShortTimeout,
);
}
const [surferIdResult, id5IdResult, rampIdResult] =
await Promise.allSettled([
collectSurferId(cookieManager, getBrowser, useShortTimeout),
getID5Id(
logger,
componentConfig.id5PartnerId,
useShortTimeout,
useShortTimeout,
),
rampIdPromise,
]);

const availableIds = {};
if (
surferIdResult.status === "fulfilled" &&
surferIdResult.value &&
!isThrottled(SURFER_ID, cookieManager)
) {
availableIds.surferId = surferIdResult.value;
}
if (
id5IdResult.status === "fulfilled" &&
id5IdResult.value &&
!isThrottled(ID5_ID, cookieManager)
) {
availableIds.id5Id = id5IdResult.value;
}
if (
rampIdResult.status === "fulfilled" &&
rampIdResult.value &&
!isThrottled(RAMP_ID, cookieManager)
) {
availableIds.rampId = rampIdResult.value;
}
// If no IDs are available and any ID is throttled, return , because we dont have new info to send
if (
Object.keys(availableIds).length === 0 &&
(isThrottled(SURFER_ID, cookieManager) ||
isThrottled(ID5_ID, cookieManager) ||
isThrottled(RAMP_ID, cookieManager))
) {
return;
}
appendAdvertisingIdQueryToEvent(
availableIds,
event,
cookieManager,
componentConfig,
);
} catch (error) {
logger.error("Error in onBeforeSendEvent hook:", error);
}
};
};

This file was deleted.

Loading