prebid.js 9.26.0 → 9.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (305) hide show
  1. package/creative/renderers/native/renderer.js +29 -8
  2. package/dist/33acrossAnalyticsAdapter.js +1 -1
  3. package/dist/33acrossBidAdapter.js +1 -1
  4. package/dist/33acrossIdSystem.js +1 -1
  5. package/dist/BTBidAdapter.js +1 -1
  6. package/dist/acuityadsBidAdapter.js +1 -1
  7. package/dist/adagioAnalyticsAdapter.js +1 -1
  8. package/dist/adagioBidAdapter.js +1 -1
  9. package/dist/adagioRtdProvider.js +1 -1
  10. package/dist/adagioUtils.js +1 -1
  11. package/dist/addefendBidAdapter.js +1 -1
  12. package/dist/adgenerationBidAdapter.js +1 -1
  13. package/dist/adlooxAdServerVideo.js +1 -1
  14. package/dist/adlooxAnalyticsAdapter.js +1 -1
  15. package/dist/adlooxRtdProvider.js +1 -1
  16. package/dist/adqueryBidAdapter.js +1 -1
  17. package/dist/adrelevantisBidAdapter.js +1 -1
  18. package/dist/adstirBidAdapter.js +1 -1
  19. package/dist/adtrgtmeBidAdapter.js +1 -1
  20. package/dist/adxcgAnalyticsAdapter.js +1 -1
  21. package/dist/adxcgBidAdapter.js +1 -1
  22. package/dist/adyoulikeBidAdapter.js +1 -1
  23. package/dist/agmaAnalyticsAdapter.js +1 -1
  24. package/dist/ajaBidAdapter.js +1 -1
  25. package/dist/akamaiDapRtdProvider.js +1 -1
  26. package/dist/amxBidAdapter.js +1 -1
  27. package/dist/amxIdSystem.js +1 -1
  28. package/dist/aniviewBidAdapter.js +1 -1
  29. package/dist/appierAnalyticsAdapter.js +1 -1
  30. package/dist/appnexusBidAdapter.js +1 -1
  31. package/dist/asoBidAdapter.js +1 -1
  32. package/dist/axonixBidAdapter.js +1 -1
  33. package/dist/bidglassBidAdapter.js +1 -1
  34. package/dist/big-richmediaBidAdapter.js +1 -1
  35. package/dist/bitmediaBidAdapter.js +1 -1
  36. package/dist/blueBidAdapter.js +1 -0
  37. package/dist/bridBidAdapter.js +1 -1
  38. package/dist/bridgeuppBidAdapter.js +1 -1
  39. package/dist/bridgewellBidAdapter.js +1 -1
  40. package/dist/brightMountainMediaBidAdapter.js +1 -1
  41. package/dist/carodaBidAdapter.js +1 -1
  42. package/dist/chtnwBidAdapter.js +1 -1
  43. package/dist/chunk-core.js +1 -1
  44. package/dist/conceptxBidAdapter.js +1 -1
  45. package/dist/concertBidAdapter.js +1 -1
  46. package/dist/connectadBidAdapter.js +1 -1
  47. package/dist/consumableBidAdapter.js +1 -1
  48. package/dist/contxtfulBidAdapter.js +1 -1
  49. package/dist/contxtfulRtdProvider.js +1 -1
  50. package/dist/conversantAnalyticsAdapter.js +1 -1
  51. package/dist/conversantBidAdapter.js +1 -1
  52. package/dist/craftBidAdapter.js +1 -1
  53. package/dist/creative-renderer-native.js +1 -1
  54. package/dist/criteoBidAdapter.js +1 -1
  55. package/dist/cwireBidAdapter.js +1 -1
  56. package/dist/dailymotionBidAdapter.js +1 -1
  57. package/dist/dependencies.json +7 -1
  58. package/dist/dspxBidAdapter.js +1 -1
  59. package/dist/dxkultureBidAdapter.js +1 -1
  60. package/dist/eplanningBidAdapter.js +1 -1
  61. package/dist/equativBidAdapter.js +1 -1
  62. package/dist/escalaxBidAdapter.js +1 -1
  63. package/dist/eskimiBidAdapter.js +1 -1
  64. package/dist/euidIdSystem.js +1 -1
  65. package/dist/exadsBidAdapter.js +1 -1
  66. package/dist/feedadBidAdapter.js +1 -1
  67. package/dist/finativeBidAdapter.js +1 -1
  68. package/dist/freewheel-sspBidAdapter.js +1 -1
  69. package/dist/gmosspBidAdapter.js +1 -1
  70. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  71. package/dist/greenbidsBidAdapter.js +1 -1
  72. package/dist/greenbidsRtdProvider.js +1 -1
  73. package/dist/gridBidAdapter.js +1 -1
  74. package/dist/gumgumBidAdapter.js +1 -1
  75. package/dist/h12mediaBidAdapter.js +1 -1
  76. package/dist/hypelabBidAdapter.js +1 -1
  77. package/dist/id5AnalyticsAdapter.js +1 -1
  78. package/dist/id5IdSystem.js +1 -1
  79. package/dist/imdsBidAdapter.js +1 -1
  80. package/dist/improvedigitalBidAdapter.js +1 -1
  81. package/dist/inmobiBidAdapter.js +1 -1
  82. package/dist/insticatorBidAdapter.js +1 -1
  83. package/dist/intentIqAnalyticsAdapter.js +1 -1
  84. package/dist/intentIqConstants.js +1 -1
  85. package/dist/ixBidAdapter.js +1 -1
  86. package/dist/jixieBidAdapter.js +1 -1
  87. package/dist/justpremiumBidAdapter.js +1 -1
  88. package/dist/jwplayerVideoProvider.js +1 -1
  89. package/dist/kargoBidAdapter.js +1 -1
  90. package/dist/kimberliteBidAdapter.js +1 -1
  91. package/dist/konduitAnalyticsAdapter.js +1 -1
  92. package/dist/kueezBidAdapter.js +1 -1
  93. package/dist/lassoBidAdapter.js +1 -1
  94. package/dist/lifestreetBidAdapter.js +1 -1
  95. package/dist/liveIntentId.js +1 -1
  96. package/dist/liveIntentIdSystem.js +1 -1
  97. package/dist/liveIntentRtdProvider.js +1 -0
  98. package/dist/logicadBidAdapter.js +1 -1
  99. package/dist/loglyliftBidAdapter.js +1 -1
  100. package/dist/luceadBidAdapter.js +1 -1
  101. package/dist/mabidderBidAdapter.js +1 -1
  102. package/dist/madsenseBidAdapter.js +1 -1
  103. package/dist/magniteAnalyticsAdapter.js +1 -1
  104. package/dist/malltvAnalyticsAdapter.js +1 -1
  105. package/dist/marsmediaBidAdapter.js +1 -1
  106. package/dist/mediafuseBidAdapter.js +1 -1
  107. package/dist/medianetAnalyticsAdapter.js +1 -1
  108. package/dist/medianetBidAdapter.js +1 -1
  109. package/dist/mediasquareBidAdapter.js +1 -1
  110. package/dist/mgidBidAdapter.js +1 -1
  111. package/dist/minutemediaBidAdapter.js +1 -1
  112. package/dist/missenaBidAdapter.js +1 -1
  113. package/dist/mspa.js +1 -1
  114. package/dist/nativeRendering.js +1 -1
  115. package/dist/nextMillenniumBidAdapter.js +1 -1
  116. package/dist/nexx360BidAdapter.js +1 -1
  117. package/dist/nobidAnalyticsAdapter.js +1 -1
  118. package/dist/nobidBidAdapter.js +1 -1
  119. package/dist/not-for-prod/prebid.js +193 -191
  120. package/dist/oguryBidAdapter.js +1 -1
  121. package/dist/omsBidAdapter.js +1 -1
  122. package/dist/onetagBidAdapter.js +1 -1
  123. package/dist/ooloAnalyticsAdapter.js +1 -1
  124. package/dist/openwebBidAdapter.js +1 -1
  125. package/dist/openxBidAdapter.js +1 -1
  126. package/dist/optidigitalBidAdapter.js +1 -1
  127. package/dist/orbidderBidAdapter.js +1 -1
  128. package/dist/orbitsoftBidAdapter.js +1 -1
  129. package/dist/outbrainBidAdapter.js +1 -1
  130. package/dist/pixfutureBidAdapter.js +1 -1
  131. package/dist/publinkIdSystem.js +1 -1
  132. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  133. package/dist/pubmaticBidAdapter.js +1 -1
  134. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  135. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  136. package/dist/pxyzBidAdapter.js +1 -1
  137. package/dist/quantcastBidAdapter.js +1 -1
  138. package/dist/readpeakBidAdapter.js +1 -1
  139. package/dist/relaidoBidAdapter.js +1 -1
  140. package/dist/retailspotBidAdapter.js +1 -1
  141. package/dist/rhythmoneBidAdapter.js +1 -1
  142. package/dist/riseBidAdapter.js +1 -1
  143. package/dist/riseUtils.js +1 -1
  144. package/dist/rubiconBidAdapter.js +1 -1
  145. package/dist/seedingAllianceBidAdapter.js +1 -1
  146. package/dist/seedtagBidAdapter.js +1 -1
  147. package/dist/sharedIdSystem.js +1 -1
  148. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  149. package/dist/sharethroughBidAdapter.js +1 -1
  150. package/dist/shinezBidAdapter.js +1 -1
  151. package/dist/showheroes-bsBidAdapter.js +1 -1
  152. package/dist/sizeUtils.js +1 -1
  153. package/dist/smaatoBidAdapter.js +1 -1
  154. package/dist/smartadserverBidAdapter.js +1 -1
  155. package/dist/smartxBidAdapter.js +1 -1
  156. package/dist/smilewantedBidAdapter.js +1 -1
  157. package/dist/snigelBidAdapter.js +1 -1
  158. package/dist/sonobiBidAdapter.js +1 -1
  159. package/dist/sovrnBidAdapter.js +1 -1
  160. package/dist/sparteoBidAdapter.js +1 -1
  161. package/dist/sspBCBidAdapter.js +1 -1
  162. package/dist/stnBidAdapter.js +1 -1
  163. package/dist/stvBidAdapter.js +1 -1
  164. package/dist/sublimeBidAdapter.js +1 -1
  165. package/dist/symitriDapRtdProvider.js +1 -1
  166. package/dist/taboolaBidAdapter.js +1 -1
  167. package/dist/tappxBidAdapter.js +1 -1
  168. package/dist/targetVideoBidAdapter.js +1 -1
  169. package/dist/teadsBidAdapter.js +1 -1
  170. package/dist/terceptAnalyticsAdapter.js +1 -1
  171. package/dist/themoneytizerBidAdapter.js +1 -1
  172. package/dist/trionBidAdapter.js +1 -1
  173. package/dist/tripleliftBidAdapter.js +1 -1
  174. package/dist/ttdBidAdapter.js +1 -1
  175. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  176. package/dist/uid2IdSystem.js +1 -1
  177. package/dist/underdogmediaBidAdapter.js +1 -1
  178. package/dist/undertoneBidAdapter.js +1 -1
  179. package/dist/unrulyBidAdapter.js +1 -1
  180. package/dist/userId.js +1 -1
  181. package/dist/vdoaiBidAdapter.js +1 -1
  182. package/dist/vidazooUtils.js +1 -1
  183. package/dist/videobyteBidAdapter.js +1 -1
  184. package/dist/visxBidAdapter.js +1 -1
  185. package/dist/vuukleBidAdapter.js +1 -1
  186. package/dist/widespaceBidAdapter.js +1 -1
  187. package/dist/winrBidAdapter.js +1 -1
  188. package/dist/wurflRtdProvider.js +1 -1
  189. package/dist/yahooAdsBidAdapter.js +1 -1
  190. package/dist/yieldlabBidAdapter.js +1 -1
  191. package/dist/yieldmoBidAdapter.js +1 -1
  192. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  193. package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
  194. package/integrationExamples/gpt/liveIntentRtdProviderExample.html +164 -0
  195. package/integrationExamples/videoModule/jwplayer/bidMarkedAsUsed.html +3 -1
  196. package/integrationExamples/videoModule/jwplayer/bidRequestScheduling.html +2 -0
  197. package/integrationExamples/videoModule/jwplayer/bidsBackHandlerOverride.html +2 -0
  198. package/integrationExamples/videoModule/jwplayer/eventListeners.html +2 -0
  199. package/integrationExamples/videoModule/jwplayer/eventsUI.html +2 -0
  200. package/integrationExamples/videoModule/jwplayer/gamAdServerMediation.html +2 -0
  201. package/integrationExamples/videoModule/jwplayer/mediaMetadata.html +3 -1
  202. package/integrationExamples/videoModule/jwplayer/playlist.html +3 -1
  203. package/libraries/creative-renderer-native/renderer.js +1 -1
  204. package/libraries/intentIqConstants/intentIqConstants.js +1 -1
  205. package/libraries/liveIntentId/shared.js +18 -5
  206. package/libraries/mspa/activityControls.js +26 -7
  207. package/libraries/riseUtils/constants.js +20 -0
  208. package/libraries/riseUtils/index.js +143 -38
  209. package/libraries/sizeUtils/sizeUtils.js +25 -0
  210. package/libraries/vidazooUtils/bidderUtils.js +2 -0
  211. package/modules/33acrossIdSystem.js +64 -23
  212. package/modules/33acrossIdSystem.md +2 -1
  213. package/modules/acuityadsBidAdapter.js +1 -1
  214. package/modules/adagioRtdProvider.js +15 -9
  215. package/modules/adlooxAnalyticsAdapter.js +12 -6
  216. package/modules/blueBidAdapter.js +122 -0
  217. package/modules/blueBidAdapter.md +28 -0
  218. package/modules/conceptxBidAdapter.js +2 -0
  219. package/modules/consumableBidAdapter.js +3 -1
  220. package/modules/contxtfulBidAdapter.js +25 -13
  221. package/modules/contxtfulRtdProvider.js +9 -12
  222. package/modules/eplanningBidAdapter.js +5 -1
  223. package/modules/equativBidAdapter.js +13 -18
  224. package/modules/escalaxBidAdapter.js +2 -2
  225. package/modules/eskimiBidAdapter.js +4 -1
  226. package/modules/improvedigitalBidAdapter.js +0 -67
  227. package/modules/intentIqAnalyticsAdapter.js +1 -1
  228. package/modules/ixBidAdapter.js +7 -1
  229. package/modules/jwplayerVideoProvider.js +99 -6
  230. package/modules/liveIntentRtdProvider.js +52 -0
  231. package/modules/liveIntentRtdProvider.md +45 -0
  232. package/modules/minutemediaBidAdapter.js +6 -80
  233. package/modules/minutemediaBidAdapter.md +1 -1
  234. package/modules/missenaBidAdapter.js +2 -0
  235. package/modules/nativeRendering.js +2 -1
  236. package/modules/omsBidAdapter.js +25 -11
  237. package/modules/omsBidAdapter.md +15 -0
  238. package/modules/openwebBidAdapter.js +6 -81
  239. package/modules/openwebBidAdapter.md +1 -1
  240. package/modules/openxBidAdapter.js +19 -6
  241. package/modules/openxBidAdapter.md +46 -1
  242. package/modules/orbitsoftBidAdapter.js +1 -1
  243. package/modules/permutiveRtdProvider.md +6 -5
  244. package/modules/pubmaticAnalyticsAdapter.js +61 -19
  245. package/modules/riseBidAdapter.js +11 -92
  246. package/modules/riseBidAdapter.md +1 -1
  247. package/modules/sharedIdSystem.js +9 -3
  248. package/modules/shinezBidAdapter.js +4 -80
  249. package/modules/shinezBidAdapter.md +2 -2
  250. package/modules/stnBidAdapter.js +7 -86
  251. package/modules/stnBidAdapter.md +1 -1
  252. package/modules/symitriDapRtdProvider.js +4 -4
  253. package/modules/symitriDapRtdProvider.md +2 -2
  254. package/modules/userId/eids.js +32 -5
  255. package/modules/wurflRtdProvider.js +7 -1
  256. package/modules/wurflRtdProvider.md +1 -1
  257. package/modules/yieldlabBidAdapter.js +2 -2
  258. package/modules/zeta_global_sspAnalyticsAdapter.js +5 -2
  259. package/package.json +2 -2
  260. package/src/adapters/bidderFactory.js +7 -6
  261. package/src/adloader.js +0 -1
  262. package/src/native.js +6 -3
  263. package/test/spec/creative/nativeRenderer_spec.js +45 -10
  264. package/test/spec/libraries/mspa/activityControls_spec.js +63 -9
  265. package/test/spec/modules/33acrossIdSystem_spec.js +288 -2
  266. package/test/spec/modules/acuityadsBidAdapter_spec.js +49 -0
  267. package/test/spec/modules/adagioRtdProvider_spec.js +119 -3
  268. package/test/spec/modules/adlooxAdServerVideo_spec.js +0 -1
  269. package/test/spec/modules/adlooxAnalyticsAdapter_spec.js +31 -0
  270. package/test/spec/modules/blueBidAdapter_spec.js +91 -0
  271. package/test/spec/modules/consumableBidAdapter_spec.js +42 -0
  272. package/test/spec/modules/contxtfulRtdProvider_spec.js +37 -2
  273. package/test/spec/modules/eplanningBidAdapter_spec.js +74 -1
  274. package/test/spec/modules/equativBidAdapter_spec.js +5 -6
  275. package/test/spec/modules/excoBidAdapter_spec.js +33 -18
  276. package/test/spec/modules/illuminBidAdapter_spec.js +33 -18
  277. package/test/spec/modules/improvedigitalBidAdapter_spec.js +3 -3
  278. package/test/spec/modules/ixBidAdapter_spec.js +68 -2
  279. package/test/spec/modules/kueezRtbBidAdapter_spec.js +33 -18
  280. package/test/spec/modules/liveIntentExternalIdSystem_spec.js +16 -6
  281. package/test/spec/modules/liveIntentIdMinimalSystem_spec.js +16 -6
  282. package/test/spec/modules/liveIntentIdSystem_spec.js +49 -6
  283. package/test/spec/modules/liveIntentRtdProvider_spec.js +116 -0
  284. package/test/spec/modules/minutemediaBidAdapter_spec.js +126 -6
  285. package/test/spec/modules/missenaBidAdapter_spec.js +12 -3
  286. package/test/spec/modules/omsBidAdapter_spec.js +78 -0
  287. package/test/spec/modules/openwebBidAdapter_spec.js +126 -6
  288. package/test/spec/modules/openxBidAdapter_spec.js +236 -8
  289. package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +29 -36
  290. package/test/spec/modules/riseBidAdapter_spec.js +126 -6
  291. package/test/spec/modules/sharedIdSystem_spec.js +25 -1
  292. package/test/spec/modules/shinezBidAdapter_spec.js +133 -9
  293. package/test/spec/modules/shinezRtbBidAdapter_spec.js +33 -18
  294. package/test/spec/modules/stnBidAdapter_spec.js +126 -5
  295. package/test/spec/modules/symitriDapRtdProvider_spec.js +36 -0
  296. package/test/spec/modules/tagorasBidAdapter_spec.js +33 -18
  297. package/test/spec/modules/twistDigitalBidAdapter_spec.js +34 -18
  298. package/test/spec/modules/userId_spec.js +103 -2
  299. package/test/spec/modules/vidazooBidAdapter_spec.js +34 -18
  300. package/test/spec/modules/videoModule/submodules/jwplayerVideoProvider_spec.js +81 -0
  301. package/test/spec/modules/wurflRtdProvider_spec.js +8 -3
  302. package/test/spec/modules/yieldlabBidAdapter_spec.js +5 -5
  303. package/test/spec/modules/zeta_global_sspAnalyticsAdapter_spec.js +3 -2
  304. package/test/spec/native_spec.js +4 -2
  305. package/test/spec/unit/core/bidderFactory_spec.js +120 -43
@@ -34,10 +34,16 @@ describe('Native creative renderer', () => {
34
34
  });
35
35
  });
36
36
  describe('otherwise, calls replacer', () => {
37
- let replacer;
37
+ let replacer, frame;
38
38
  beforeEach(() => {
39
39
  replacer = sinon.stub().returns('markup');
40
+ frame = document.createElement('iframe');
41
+ document.body.appendChild(frame);
42
+ win.document = frame.contentDocument;
40
43
  });
44
+ afterEach(() => {
45
+ document.body.removeChild(frame);
46
+ })
41
47
  it('with adTemplate, if present', () => {
42
48
  return getAdMarkup('123', {adTemplate: 'tpl'}, replacer, win).then((result) => {
43
49
  expect(result).to.eql('markup');
@@ -45,7 +51,7 @@ describe('Native creative renderer', () => {
45
51
  });
46
52
  });
47
53
  it('with document body otherwise', () => {
48
- win.document = {body: {innerHTML: 'body'}};
54
+ win.document.body.innerHTML = 'body'
49
55
  return getAdMarkup('123', {}, replacer, win).then((result) => {
50
56
  expect(result).to.eql('markup');
51
57
  sinon.assert.calledWith(replacer, 'body');
@@ -186,26 +192,29 @@ describe('Native creative renderer', () => {
186
192
  });
187
193
 
188
194
  describe('render', () => {
189
- let getMarkup, sendMessage, adId, nativeData, exc;
195
+ let getMarkup, sendMessage, adId, nativeData, exc, frame;
190
196
  beforeEach(() => {
191
197
  adId = '123';
192
198
  nativeData = {}
193
199
  getMarkup = sinon.stub();
194
200
  sendMessage = sinon.stub()
195
201
  exc = sinon.stub();
196
- win.document = {
197
- querySelectorAll() { return [] },
198
- body: {}
199
- }
202
+ frame = document.createElement('iframe');
203
+ document.body.appendChild(frame);
204
+ win.document = frame.contentDocument;
200
205
  });
201
206
 
207
+ afterEach(() => {
208
+ document.body.removeChild(frame);
209
+ })
210
+
202
211
  function runRender() {
203
212
  return render({adId, native: nativeData}, {sendMessage, exc}, win, getMarkup)
204
213
  }
205
214
 
206
215
  it('replaces placeholders in head, if present', () => {
207
216
  getMarkup.returns(Promise.resolve(''))
208
- win.document.head = {innerHTML: '##hb_native_asset_id_1##'};
217
+ win.document.head.innerHTML = '##hb_native_asset_id_1##';
209
218
  nativeData.ortb = {
210
219
  assets: [
211
220
  {id: 1, data: {value: 'repl'}}
@@ -216,6 +225,14 @@ describe('Native creative renderer', () => {
216
225
  })
217
226
  });
218
227
 
228
+ it('does not replace iframes with srcdoc that contain "renderer"', () => {
229
+ win.document.head.innerHTML = win.document.body.innerHTML = '<iframe srcdoc="renderer"></iframe>';
230
+ getMarkup.returns(Promise.resolve(''))
231
+ return runRender().then(() => {
232
+ expect(Array.from(win.document.querySelectorAll('iframe[srcdoc="renderer"]')).length).to.eql(2);
233
+ })
234
+ })
235
+
219
236
  it('drops markup on body, and fires imp trackers', () => {
220
237
  getMarkup.returns(Promise.resolve('markup'));
221
238
  return runRender().then(() => {
@@ -246,9 +263,27 @@ describe('Native creative renderer', () => {
246
263
 
247
264
  describe('requests resize', () => {
248
265
  beforeEach(() => {
266
+ const mkNode = () => {
267
+ const node = {
268
+ innerHTML: '',
269
+ childNodes: [],
270
+ insertAdjacentHTML: () => {},
271
+ style: {},
272
+ querySelectorAll: () => [],
273
+ cloneNode: () => node
274
+ };
275
+ return node;
276
+ }
277
+ win.document = {
278
+ head: mkNode(),
279
+ body: Object.assign(mkNode(), {
280
+ offsetHeight: 123,
281
+ offsetWidth: 321
282
+ }),
283
+ querySelectorAll: () => [],
284
+ style: {}
285
+ };
249
286
  getMarkup.returns(Promise.resolve('markup'));
250
- win.document.body.offsetHeight = 123;
251
- win.document.body.offsetWidth = 321;
252
287
  });
253
288
 
254
289
  it('immediately, if document is loaded', () => {
@@ -45,6 +45,13 @@ describe('Consent interpretation', () => {
45
45
  expect(isBasicConsentDenied(mkConsent({
46
46
  KnownChildSensitiveDataConsents: [0, null]
47
47
  }))).to.be.false;
48
+ });
49
+
50
+ it('should deny when Version = 2 & childconsent[3] is 1', () => {
51
+ expect(isBasicConsentDenied(mkConsent({
52
+ Version: 2,
53
+ KnownChildSensitiveDataConsents: [null, null, 1]
54
+ }))).to.be.true;
48
55
  })
49
56
  });
50
57
 
@@ -84,13 +91,60 @@ describe('Consent interpretation', () => {
84
91
  expect(result).to.equal(false);
85
92
  });
86
93
  Object.entries({
87
- 'health information': 2,
88
- 'biometric data': 6,
89
- }).forEach(([t, flagNo]) => {
90
- it(`'should be true (consent denied to add ufpd) if no consent to process ${t}'`, () => {
91
- const consent = mkConsent();
92
- consent.SensitiveDataProcessing[flagNo] = 1;
93
- expect(isTransmitUfpdConsentDenied(consent)).to.be.true;
94
+ 'health information': {
95
+ flagNo: 2,
96
+ consents: {
97
+ 1: true,
98
+ 2: false
99
+ },
100
+ versions: [1, 2]
101
+ },
102
+ 'biometric data': {
103
+ flagNo: 6,
104
+ consents: {
105
+ 1: true,
106
+ 2: true
107
+ },
108
+ versions: [1, 2]
109
+ },
110
+ 'consumer health data': {
111
+ flagNo: 12,
112
+ consents: {
113
+ 1: true,
114
+ 2: false
115
+ },
116
+ versions: [2]
117
+ },
118
+ 'status as transgender': {
119
+ flagNo: 15,
120
+ consents: {
121
+ 1: true,
122
+ 2: true,
123
+ },
124
+ versions: [2]
125
+ }
126
+
127
+ }).forEach(([t, {flagNo, consents, versions}]) => {
128
+ describe(t, () => {
129
+ Object.entries(consents).forEach(([flagValue, shouldBeDenied]) => {
130
+ const flagDescription = ({
131
+ 1: 'denied',
132
+ 2: 'given'
133
+ })[flagValue]
134
+ describe(`consent is ${flagValue} (${flagDescription})`, () => {
135
+ let consent;
136
+ beforeEach(() => {
137
+ consent = mkConsent();
138
+ consent.SensitiveDataProcessing[flagNo] = parseInt(flagValue, 10);
139
+ });
140
+ versions.forEach(version => {
141
+ it(`should ${shouldBeDenied ? 'deny' : 'allow'} (version ${version})`, () => {
142
+ consent.Version = version;
143
+ expect(isTransmitUfpdConsentDenied(consent)).to.eql(shouldBeDenied);
144
+ })
145
+ })
146
+ })
147
+ })
94
148
  })
95
149
  });
96
150
 
@@ -181,8 +235,8 @@ describe('mspaRule', () => {
181
235
  expect(mkRule()().allow).to.equal(false);
182
236
  });
183
237
 
184
- it('should deny when consent is using version != 1', () => {
185
- consent = {Version: 2};
238
+ it('should deny when consent is using version other than 1/2', () => {
239
+ consent = {Version: 3};
186
240
  expect(mkRule()().allow).to.equal(false);
187
241
  })
188
242
 
@@ -21,7 +21,7 @@ describe('33acrossIdSystem', () => {
21
21
  });
22
22
 
23
23
  describe('getId', () => {
24
- it('should call endpoint and handle valid response', () => {
24
+ it('should call endpoint', () => {
25
25
  const completeCallback = sinon.spy();
26
26
 
27
27
  const { callback } = thirtyThreeAcrossIdSubmodule.getId({
@@ -50,7 +50,71 @@ describe('33acrossIdSystem', () => {
50
50
  const regExp = new RegExp('https://lexicon.33across.com/v1/envelope\\?pid=12345&gdpr=\\d&src=pbjs&ver=$prebid.version$');
51
51
 
52
52
  expect(request.url).to.match(regExp);
53
- expect(completeCallback.calledOnceWithExactly('foo')).to.be.true;
53
+ });
54
+
55
+ context('when there\'s a successful response containing an ID', () => {
56
+ it('should execute the callback and pass the ID', () => {
57
+ const completeCallback = sinon.spy();
58
+
59
+ const { callback } = thirtyThreeAcrossIdSubmodule.getId({
60
+ params: {
61
+ pid: '12345'
62
+ }
63
+ });
64
+
65
+ callback(completeCallback);
66
+
67
+ const [request] = server.requests;
68
+
69
+ request.respond(200, {
70
+ 'Content-Type': 'application/json'
71
+ }, JSON.stringify({
72
+ succeeded: true,
73
+ data: {
74
+ envelope: 'foo'
75
+ },
76
+ expires: 1645667805067
77
+ }));
78
+
79
+ expect(completeCallback.calledOnceWithExactly('foo')).to.be.true;
80
+ });
81
+
82
+ it('should NOT wipe any stored hashed email', () => {
83
+ const completeCallback = () => {};
84
+
85
+ const { callback } = thirtyThreeAcrossIdSubmodule.getId({
86
+ params: {
87
+ pid: '12345'
88
+ },
89
+ enabledStorageTypes: [ 'html5' ],
90
+ storage: {}
91
+ });
92
+
93
+ callback(completeCallback);
94
+
95
+ const [request] = server.requests;
96
+
97
+ const removeDataFromLocalStorage = sinon.stub(storage, 'removeDataFromLocalStorage');
98
+ const setCookie = sinon.stub(storage, 'setCookie');
99
+ sinon.stub(domainUtils, 'domainOverride').returns('foo.com');
100
+
101
+ request.respond(200, {
102
+ 'Content-Type': 'application/json'
103
+ }, JSON.stringify({
104
+ succeeded: true,
105
+ data: {
106
+ envelope: 'foo'
107
+ },
108
+ expires: 1645667805067
109
+ }));
110
+
111
+ expect(removeDataFromLocalStorage.calledWithExactly('33acrossIdHm')).to.be.false;
112
+ expect(setCookie.calledWithExactly('33acrossIdHm', '', sinon.match.string, 'Lax', 'foo.com')).to.be.false;
113
+
114
+ removeDataFromLocalStorage.restore();
115
+ setCookie.restore();
116
+ domainUtils.domainOverride.restore();
117
+ });
54
118
  });
55
119
 
56
120
  const additionalOptions = {
@@ -931,9 +995,194 @@ describe('33acrossIdSystem', () => {
931
995
 
932
996
  storage.getDataFromLocalStorage.restore();
933
997
  });
998
+
999
+ context('and the enabled storage types include "html5"', () => {
1000
+ it('should store the hashed email in local storage', () => {
1001
+ const completeCallback = () => {};
1002
+
1003
+ const { callback } = thirtyThreeAcrossIdSubmodule.getId({
1004
+ params: {
1005
+ pid: '12345',
1006
+ hem: '33acrossIdHmValue+'
1007
+ },
1008
+ enabledStorageTypes: [ 'html5' ],
1009
+ storage: {}
1010
+ });
1011
+
1012
+ callback(completeCallback);
1013
+
1014
+ const [request] = server.requests;
1015
+
1016
+ const setDataInLocalStorage = sinon.stub(storage, 'setDataInLocalStorage');
1017
+
1018
+ request.respond(200, {
1019
+ 'Content-Type': 'application/json'
1020
+ }, JSON.stringify({
1021
+ succeeded: true,
1022
+ data: {
1023
+ envelope: 'foo',
1024
+ fp: 'bar'
1025
+ },
1026
+ expires: 1645667805067
1027
+ }));
1028
+
1029
+ expect(setDataInLocalStorage.calledWithExactly('33acrossIdHm', '33acrossIdHmValue+')).to.be.true;
1030
+
1031
+ setDataInLocalStorage.restore();
1032
+ });
1033
+ });
1034
+
1035
+ context('and the enabled storage types include "cookie"', () => {
1036
+ it('should store the hashed email in a cookie', () => {
1037
+ const completeCallback = () => {};
1038
+
1039
+ const { callback } = thirtyThreeAcrossIdSubmodule.getId({
1040
+ params: {
1041
+ pid: '12345',
1042
+ hem: '33acrossIdHmValue+'
1043
+ },
1044
+ enabledStorageTypes: [ 'cookie' ],
1045
+ storage: { expires: 30 }
1046
+ });
1047
+
1048
+ callback(completeCallback);
1049
+
1050
+ const [request] = server.requests;
1051
+
1052
+ const setCookie = sinon.stub(storage, 'setCookie');
1053
+ sinon.stub(domainUtils, 'domainOverride').returns('foo.com');
1054
+
1055
+ request.respond(200, {
1056
+ 'Content-Type': 'application/json'
1057
+ }, JSON.stringify({
1058
+ succeeded: true,
1059
+ data: {
1060
+ envelope: 'foo',
1061
+ fp: 'bar'
1062
+ },
1063
+ expires: 1645667805067
1064
+ }));
1065
+
1066
+ expect(setCookie.calledWithExactly('33acrossIdHm', '33acrossIdHmValue+', sinon.match.string, 'Lax', 'foo.com')).to.be.true;
1067
+
1068
+ setCookie.restore();
1069
+ domainUtils.domainOverride.restore();
1070
+ });
1071
+ });
934
1072
  });
935
1073
 
936
1074
  context('when a hashed email is NOT provided via configuration options', () => {
1075
+ context('but it\'s provided via global 33across object', () => {
1076
+ beforeEach(() => {
1077
+ window._33across = {
1078
+ hem: {
1079
+ sha256: 'fake-sha256-hashed-email+'
1080
+ }
1081
+ }
1082
+ });
1083
+
1084
+ afterEach(() => {
1085
+ delete window._33across;
1086
+ });
1087
+
1088
+ it('should call endpoint with the hashed email included', () => {
1089
+ const completeCallback = () => {};
1090
+ const { callback } = thirtyThreeAcrossIdSubmodule.getId({
1091
+ params: {
1092
+ pid: '12345'
1093
+ // No hashed email via config option.
1094
+ },
1095
+ enabledStorageTypes: [ 'html5' ],
1096
+ storage: {}
1097
+ });
1098
+
1099
+ // Prioritizes the hashed email given via global object over the one stored in LS.
1100
+ sinon.stub(storage, 'getDataFromLocalStorage')
1101
+ .withArgs('33acrossIdHm')
1102
+ .returns('33acrossIdHmValueLS');
1103
+
1104
+ callback(completeCallback);
1105
+
1106
+ const [request] = server.requests;
1107
+
1108
+ expect(request.url).to.contain('sha256=fake-sha256-hashed-email%2B');
1109
+
1110
+ storage.getDataFromLocalStorage.restore();
1111
+ });
1112
+
1113
+ context('and the enabled storage types include "html5"', () => {
1114
+ it('should store the hashed email in local storage', () => {
1115
+ const completeCallback = () => {};
1116
+
1117
+ const { callback } = thirtyThreeAcrossIdSubmodule.getId({
1118
+ params: {
1119
+ pid: '12345'
1120
+ },
1121
+ enabledStorageTypes: [ 'html5' ],
1122
+ storage: {}
1123
+ });
1124
+
1125
+ callback(completeCallback);
1126
+
1127
+ const [request] = server.requests;
1128
+
1129
+ const setDataInLocalStorage = sinon.stub(storage, 'setDataInLocalStorage');
1130
+
1131
+ request.respond(200, {
1132
+ 'Content-Type': 'application/json'
1133
+ }, JSON.stringify({
1134
+ succeeded: true,
1135
+ data: {
1136
+ envelope: 'foo',
1137
+ fp: 'bar'
1138
+ },
1139
+ expires: 1645667805067
1140
+ }));
1141
+
1142
+ expect(setDataInLocalStorage.calledWithExactly('33acrossIdHm', 'fake-sha256-hashed-email+')).to.be.true;
1143
+
1144
+ setDataInLocalStorage.restore();
1145
+ });
1146
+ });
1147
+
1148
+ context('and the enabled storage types include "cookie"', () => {
1149
+ it('should store the hashed email in a cookie', () => {
1150
+ const completeCallback = () => {};
1151
+
1152
+ const { callback } = thirtyThreeAcrossIdSubmodule.getId({
1153
+ params: {
1154
+ pid: '12345'
1155
+ },
1156
+ enabledStorageTypes: [ 'cookie' ],
1157
+ storage: { expires: 30 }
1158
+ });
1159
+
1160
+ callback(completeCallback);
1161
+
1162
+ const [request] = server.requests;
1163
+
1164
+ const setCookie = sinon.stub(storage, 'setCookie');
1165
+ sinon.stub(domainUtils, 'domainOverride').returns('foo.com');
1166
+
1167
+ request.respond(200, {
1168
+ 'Content-Type': 'application/json'
1169
+ }, JSON.stringify({
1170
+ succeeded: true,
1171
+ data: {
1172
+ envelope: 'foo',
1173
+ fp: 'bar'
1174
+ },
1175
+ expires: 1645667805067
1176
+ }));
1177
+
1178
+ expect(setCookie.calledWithExactly('33acrossIdHm', 'fake-sha256-hashed-email+', sinon.match.string, 'Lax', 'foo.com')).to.be.true;
1179
+
1180
+ setCookie.restore();
1181
+ domainUtils.domainOverride.restore();
1182
+ });
1183
+ });
1184
+ });
1185
+
937
1186
  context('but it\'s provided via local storage', () => {
938
1187
  it('should call endpoint with the hashed email included', () => {
939
1188
  const completeCallback = () => {};
@@ -1205,6 +1454,43 @@ describe('33acrossIdSystem', () => {
1205
1454
 
1206
1455
  expect(completeCallback.calledOnceWithExactly(undefined)).to.be.true;
1207
1456
  });
1457
+
1458
+ it('should wipe any stored hashed email', () => {
1459
+ const completeCallback = () => {};
1460
+
1461
+ const { callback } = thirtyThreeAcrossIdSubmodule.getId({
1462
+ params: {
1463
+ pid: '12345'
1464
+ },
1465
+ enabledStorageTypes: [ 'html5' ],
1466
+ storage: {}
1467
+ });
1468
+
1469
+ callback(completeCallback);
1470
+
1471
+ const [request] = server.requests;
1472
+
1473
+ const removeDataFromLocalStorage = sinon.stub(storage, 'removeDataFromLocalStorage');
1474
+ const setCookie = sinon.stub(storage, 'setCookie');
1475
+ sinon.stub(domainUtils, 'domainOverride').returns('foo.com');
1476
+
1477
+ request.respond(200, {
1478
+ 'Content-Type': 'application/json'
1479
+ }, JSON.stringify({
1480
+ succeeded: true,
1481
+ data: {
1482
+ // no envelope field
1483
+ },
1484
+ expires: 1645667805067
1485
+ }));
1486
+
1487
+ expect(removeDataFromLocalStorage.calledWithExactly('33acrossIdHm')).to.be.true;
1488
+ expect(setCookie.calledWithExactly('33acrossIdHm', '', sinon.match.string, 'Lax', 'foo.com')).to.be.true;
1489
+
1490
+ removeDataFromLocalStorage.restore();
1491
+ setCookie.restore();
1492
+ domainUtils.domainOverride.restore();
1493
+ });
1208
1494
  });
1209
1495
 
1210
1496
  context('when the server returns an error status code', () => {
@@ -191,6 +191,55 @@ describe('AcuityAdsBidAdapter', function () {
191
191
  }
192
192
  });
193
193
 
194
+ it('Returns valid endpoints', function () {
195
+ const bids = [
196
+ {
197
+ bidId: getUniqueIdentifierStr(),
198
+ bidder: bidder,
199
+ mediaTypes: {
200
+ [BANNER]: {
201
+ sizes: [[300, 250]]
202
+ }
203
+ },
204
+ params: {
205
+ endpointId: 'testBanner',
206
+ },
207
+ userIdAsEids
208
+ }
209
+ ];
210
+
211
+ let serverRequest = spec.buildRequests(bids, bidderRequest);
212
+
213
+ const { placements } = serverRequest.data;
214
+ for (let i = 0, len = placements.length; i < len; i++) {
215
+ const placement = placements[i];
216
+ expect(placement.endpointId).to.be.oneOf(['testBanner', 'testVideo', 'testNative']);
217
+ expect(placement.adFormat).to.be.oneOf([BANNER, VIDEO, NATIVE]);
218
+ expect(placement.bidId).to.be.a('string');
219
+ expect(placement.schain).to.be.an('object');
220
+ expect(placement.bidfloor).to.exist.and.to.equal(0);
221
+ expect(placement.type).to.exist.and.to.equal('network');
222
+ expect(placement.eids).to.exist.and.to.be.deep.equal(userIdAsEids);
223
+
224
+ if (placement.adFormat === BANNER) {
225
+ expect(placement.sizes).to.be.an('array');
226
+ }
227
+ switch (placement.adFormat) {
228
+ case BANNER:
229
+ expect(placement.sizes).to.be.an('array');
230
+ break;
231
+ case VIDEO:
232
+ expect(placement.playerSize).to.be.an('array');
233
+ expect(placement.minduration).to.be.an('number');
234
+ expect(placement.maxduration).to.be.an('number');
235
+ break;
236
+ case NATIVE:
237
+ expect(placement.native).to.be.an('object');
238
+ break;
239
+ }
240
+ }
241
+ });
242
+
194
243
  it('Returns data with gdprConsent and without uspConsent', function () {
195
244
  delete bidderRequest.uspConsent;
196
245
  serverRequest = spec.buildRequests(bids, bidderRequest);