diff --git a/modules/ixBidAdapter.js b/modules/ixBidAdapter.js index c6a17233498..a2d690b18ee 100644 --- a/modules/ixBidAdapter.js +++ b/modules/ixBidAdapter.js @@ -1,8 +1,8 @@ -import { deepAccess, parseGPTSingleSizeArray, inIframe, deepClone, logError, logWarn, isFn, contains, isInteger, isArray, deepSetValue, parseQueryStringParameters, isEmpty, mergeDeep, convertTypes } from '../src/utils.js'; +import { deepAccess, parseGPTSingleSizeArray, inIframe, deepClone, logError, logWarn, isFn, contains, isInteger, isArray, deepSetValue, parseQueryStringParameters, isEmpty, mergeDeep, convertTypes, hasDeviceAccess } from '../src/utils.js'; import { BANNER, VIDEO } from '../src/mediaTypes.js'; import { config } from '../src/config.js'; import CONSTANTS from '../src/constants.json'; -import { getStorageManager } from '../src/storageManager.js'; +import { getStorageManager, validateStorageEnforcement } from '../src/storageManager.js'; import events from '../src/events.js'; import find from 'core-js-pure/features/array/find.js'; import { registerBidder } from '../src/adapters/bidderFactory.js'; @@ -991,7 +991,7 @@ function createMissingBannerImp(bid, imp, newSize) { * * @param {ErrorData} data */ -function errorEventHandler(data) { +function storeErrorEventData(data) { if (!storage.localStorageIsEnabled()) { return; } @@ -1033,6 +1033,24 @@ function errorEventHandler(data) { storage.setDataInLocalStorage(LOCAL_STORAGE_KEY, JSON.stringify(currentStorage)); } +/** + * Event handler for storing data into local storage. It will only store data if + * local storage premissions are avaliable + */ +function localStorageHandler(data) { + if (data.type === 'ERROR' && data.arguments && data.arguments[1] && data.arguments[1].bidder === BIDDER_CODE) { + const DEFAULT_ENFORCEMENT_SETTINGS = { + hasEnforcementHook: false, + valid: hasDeviceAccess() + }; + validateStorageEnforcement(GLOBAL_VENDOR_ID, BIDDER_CODE, DEFAULT_ENFORCEMENT_SETTINGS, (permissions) => { + if (permissions.valid) { + storeErrorEventData(data); + } + }); + } +} + /** * Get ixdiag stored in LocalStorage and format to be added to request payload * @@ -1129,8 +1147,8 @@ export const spec = { */ isBidRequestValid: function (bid) { if (!hasRegisteredHandler) { - events.on(CONSTANTS.EVENTS.AUCTION_DEBUG, errorEventHandler); - events.on(CONSTANTS.EVENTS.AD_RENDER_FAILED, errorEventHandler); + events.on(CONSTANTS.EVENTS.AUCTION_DEBUG, localStorageHandler); + events.on(CONSTANTS.EVENTS.AD_RENDER_FAILED, localStorageHandler); hasRegisteredHandler = true; } diff --git a/test/spec/modules/ixBidAdapter_spec.js b/test/spec/modules/ixBidAdapter_spec.js index 32ce40f25cb..af8e683de8b 100644 --- a/test/spec/modules/ixBidAdapter_spec.js +++ b/test/spec/modules/ixBidAdapter_spec.js @@ -2806,5 +2806,13 @@ describe('IndexexchangeAdapter', function () { expect(JSON.parse(localStorageValues[key])[EXPIRED_DATE]).to.be.undefined; expect(JSON.parse(localStorageValues[key])).to.deep.equal({ [TODAY]: { '1': 1, '3': 8, '4': 1 } }) }); + + it('should not save error data into localstorage if consent is not given', () => { + config.setConfig({ deviceAccess: false }); + const bid = utils.deepClone(DEFAULT_MULTIFORMAT_VIDEO_VALID_BID[0]); + bid.params.size = ['400', 100]; + expect(spec.isBidRequestValid(bid)).to.be.false; + expect(localStorageValues[key]).to.be.undefined; + }); }); });