prebid.js 9.1.0 → 9.2.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 (290) hide show
  1. package/browsers.json +3 -3
  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 -0
  11. package/dist/adgenerationBidAdapter.js +1 -1
  12. package/dist/admanBidAdapter.js +1 -1
  13. package/dist/adpod.js +1 -1
  14. package/dist/adprimeBidAdapter.js +1 -1
  15. package/dist/adqueryBidAdapter.js +1 -1
  16. package/dist/adrelevantisBidAdapter.js +1 -1
  17. package/dist/adstirBidAdapter.js +1 -1
  18. package/dist/adtrgtmeBidAdapter.js +1 -1
  19. package/dist/adxcgBidAdapter.js +1 -1
  20. package/dist/adyoulikeBidAdapter.js +1 -1
  21. package/dist/agmaAnalyticsAdapter.js +1 -1
  22. package/dist/ajaBidAdapter.js +1 -1
  23. package/dist/amxBidAdapter.js +1 -1
  24. package/dist/amxIdSystem.js +1 -1
  25. package/dist/appierAnalyticsAdapter.js +1 -1
  26. package/dist/appnexusBidAdapter.js +1 -1
  27. package/dist/appnexusUtils.js +1 -1
  28. package/dist/asoBidAdapter.js +1 -1
  29. package/dist/autoplayDetection.js +1 -1
  30. package/dist/axisBidAdapter.js +1 -1
  31. package/dist/axonixBidAdapter.js +1 -1
  32. package/dist/beyondmediaBidAdapter.js +1 -1
  33. package/dist/bidglassBidAdapter.js +1 -1
  34. package/dist/big-richmediaBidAdapter.js +1 -1
  35. package/dist/bliinkBidAdapter.js +1 -1
  36. package/dist/boldwinBidAdapter.js +1 -1
  37. package/dist/bridBidAdapter.js +1 -1
  38. package/dist/bridgewellBidAdapter.js +1 -1
  39. package/dist/brightMountainMediaBidAdapter.js +1 -1
  40. package/dist/carodaBidAdapter.js +1 -1
  41. package/dist/chtnwBidAdapter.js +1 -1
  42. package/dist/chunk-core.js +1 -1
  43. package/dist/compassBidAdapter.js +1 -1
  44. package/dist/concertBidAdapter.js +1 -1
  45. package/dist/connectadBidAdapter.js +1 -1
  46. package/dist/consumableBidAdapter.js +1 -1
  47. package/dist/contentexchangeBidAdapter.js +1 -1
  48. package/dist/conversantAnalyticsAdapter.js +1 -1
  49. package/dist/conversantBidAdapter.js +1 -1
  50. package/dist/craftBidAdapter.js +1 -1
  51. package/dist/criteoBidAdapter.js +1 -1
  52. package/dist/cwireBidAdapter.js +1 -1
  53. package/dist/dailymotionBidAdapter.js +1 -1
  54. package/dist/dependencies.json +78 -2
  55. package/dist/dspxBidAdapter.js +1 -1
  56. package/dist/dxkultureBidAdapter.js +1 -1
  57. package/dist/e_volutionBidAdapter.js +1 -1
  58. package/dist/emtvBidAdapter.js +1 -1
  59. package/dist/eplanningBidAdapter.js +1 -1
  60. package/dist/euidIdSystem.js +1 -1
  61. package/dist/exadsBidAdapter.js +1 -1
  62. package/dist/feedadBidAdapter.js +1 -1
  63. package/dist/finativeBidAdapter.js +1 -1
  64. package/dist/freewheel-sspBidAdapter.js +1 -1
  65. package/dist/globalsunBidAdapter.js +1 -1
  66. package/dist/gmosspBidAdapter.js +1 -1
  67. package/dist/goldbachBidAdapter.js +1 -1
  68. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  69. package/dist/greenbidsRtdProvider.js +1 -1
  70. package/dist/gridBidAdapter.js +1 -1
  71. package/dist/gumgumBidAdapter.js +1 -1
  72. package/dist/h12mediaBidAdapter.js +1 -1
  73. package/dist/hypelabBidAdapter.js +1 -1
  74. package/dist/id5IdSystem.js +1 -1
  75. package/dist/illuminBidAdapter.js +1 -1
  76. package/dist/imdsBidAdapter.js +1 -1
  77. package/dist/improvedigitalBidAdapter.js +1 -1
  78. package/dist/insticatorBidAdapter.js +1 -1
  79. package/dist/iqzoneBidAdapter.js +1 -1
  80. package/dist/ixBidAdapter.js +1 -1
  81. package/dist/jixieBidAdapter.js +1 -1
  82. package/dist/justpremiumBidAdapter.js +1 -1
  83. package/dist/kargoBidAdapter.js +1 -1
  84. package/dist/kimberliteBidAdapter.js +1 -1
  85. package/dist/kiviadsBidAdapter.js +1 -1
  86. package/dist/konduitAnalyticsAdapter.js +1 -1
  87. package/dist/krushmediaBidAdapter.js +1 -1
  88. package/dist/kueezBidAdapter.js +1 -1
  89. package/dist/kueezRtbBidAdapter.js +1 -1
  90. package/dist/lassoBidAdapter.js +1 -1
  91. package/dist/lifestreetBidAdapter.js +1 -1
  92. package/dist/liveIntentIdSystem.js +1 -1
  93. package/dist/logicadBidAdapter.js +1 -1
  94. package/dist/loglyliftBidAdapter.js +1 -1
  95. package/dist/loyalBidAdapter.js +1 -1
  96. package/dist/luceadBidAdapter.js +1 -1
  97. package/dist/lunamediahbBidAdapter.js +1 -1
  98. package/dist/magniteAnalyticsAdapter.js +1 -1
  99. package/dist/malltvAnalyticsAdapter.js +1 -1
  100. package/dist/marsmediaBidAdapter.js +1 -1
  101. package/dist/mathildeadsBidAdapter.js +1 -1
  102. package/dist/mediafuseBidAdapter.js +1 -1
  103. package/dist/mediasquareBidAdapter.js +1 -1
  104. package/dist/mgidBidAdapter.js +1 -1
  105. package/dist/mgidXBidAdapter.js +1 -1
  106. package/dist/minutemediaBidAdapter.js +1 -1
  107. package/dist/missenaBidAdapter.js +1 -1
  108. package/dist/mobfoxpbBidAdapter.js +1 -1
  109. package/dist/mobianRtdProvider.js +1 -1
  110. package/dist/nexx360BidAdapter.js +1 -1
  111. package/dist/nobidAnalyticsAdapter.js +1 -1
  112. package/dist/nobidBidAdapter.js +1 -1
  113. package/dist/not-for-prod/prebid.js +187 -185
  114. package/dist/oguryBidAdapter.js +1 -1
  115. package/dist/onetagBidAdapter.js +1 -1
  116. package/dist/ooloAnalyticsAdapter.js +1 -1
  117. package/dist/openwebBidAdapter.js +1 -1
  118. package/dist/openxBidAdapter.js +1 -1
  119. package/dist/optidigitalBidAdapter.js +1 -1
  120. package/dist/ortbConverter.js +1 -1
  121. package/dist/outbrainBidAdapter.js +1 -1
  122. package/dist/ozoneBidAdapter.js +1 -1
  123. package/dist/paapi.js +1 -1
  124. package/dist/pgamsspBidAdapter.js +1 -1
  125. package/dist/pixfutureBidAdapter.js +1 -1
  126. package/dist/playdigoBidAdapter.js +1 -1
  127. package/dist/prebidServerBidAdapter.js +1 -1
  128. package/dist/pubCircleBidAdapter.js +1 -1
  129. package/dist/publinkIdSystem.js +1 -1
  130. package/dist/publirBidAdapter.js +1 -1
  131. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  132. package/dist/pubmaticBidAdapter.js +1 -1
  133. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  134. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  135. package/dist/pxyzBidAdapter.js +1 -1
  136. package/dist/qtBidAdapter.js +1 -1
  137. package/dist/quantcastBidAdapter.js +1 -1
  138. package/dist/raynRtdProvider.js +1 -1
  139. package/dist/readpeakBidAdapter.js +1 -1
  140. package/dist/relaidoBidAdapter.js +1 -1
  141. package/dist/retailspotBidAdapter.js +1 -1
  142. package/dist/rhythmoneBidAdapter.js +1 -1
  143. package/dist/riseBidAdapter.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/setupadBidAdapter.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/shinezRtbBidAdapter.js +1 -1
  152. package/dist/smaatoBidAdapter.js +1 -1
  153. package/dist/smartadserverBidAdapter.js +1 -1
  154. package/dist/smartxBidAdapter.js +1 -1
  155. package/dist/smartytechBidAdapter.js +1 -1
  156. package/dist/smilewantedBidAdapter.js +1 -1
  157. package/dist/sonobiBidAdapter.js +1 -1
  158. package/dist/sovrnBidAdapter.js +1 -1
  159. package/dist/sspBCBidAdapter.js +1 -1
  160. package/dist/stnBidAdapter.js +1 -1
  161. package/dist/stvBidAdapter.js +1 -1
  162. package/dist/sublimeBidAdapter.js +1 -1
  163. package/dist/taboolaBidAdapter.js +1 -1
  164. package/dist/tagorasBidAdapter.js +1 -1
  165. package/dist/targetVideoBidAdapter.js +1 -1
  166. package/dist/teadsBidAdapter.js +1 -1
  167. package/dist/teqblazeUtils.js +1 -0
  168. package/dist/themoneytizerBidAdapter.js +1 -1
  169. package/dist/topicsFpdModule.js +1 -1
  170. package/dist/trionBidAdapter.js +1 -1
  171. package/dist/tripleliftBidAdapter.js +1 -1
  172. package/dist/ttdBidAdapter.js +1 -1
  173. package/dist/twistDigitalBidAdapter.js +1 -1
  174. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  175. package/dist/uid2IdSystem.js +1 -1
  176. package/dist/underdogmediaBidAdapter.js +1 -1
  177. package/dist/undertoneBidAdapter.js +1 -1
  178. package/dist/unrulyBidAdapter.js +1 -1
  179. package/dist/vidazooBidAdapter.js +1 -1
  180. package/dist/videobyteBidAdapter.js +1 -1
  181. package/dist/visiblemeasuresBidAdapter.js +1 -1
  182. package/dist/visxBidAdapter.js +1 -1
  183. package/dist/vuukleBidAdapter.js +1 -1
  184. package/dist/widespaceBidAdapter.js +1 -1
  185. package/dist/winrBidAdapter.js +1 -1
  186. package/dist/yahooAdsBidAdapter.js +1 -1
  187. package/dist/yieldmoBidAdapter.js +1 -1
  188. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  189. package/integrationExamples/gpt/raynRtdProvider_example.html +1 -0
  190. package/libraries/adagioUtils/adagioUtils.js +35 -0
  191. package/libraries/appnexusUtils/anUtils.js +1 -0
  192. package/libraries/autoplayDetection/autoplay.js +8 -1
  193. package/libraries/ortbConverter/converter.js +1 -1
  194. package/libraries/teqblazeUtils/bidderUtils.js +253 -0
  195. package/modules/.submodules.json +1 -0
  196. package/modules/acuityadsBidAdapter.js +5 -203
  197. package/modules/adagioBidAdapter.js +1 -17
  198. package/modules/adagioRtdProvider.js +41 -51
  199. package/modules/adagioRtdProvider.md +1 -0
  200. package/modules/admanBidAdapter.js +31 -188
  201. package/modules/adprimeBidAdapter.js +28 -165
  202. package/modules/axisBidAdapter.js +33 -165
  203. package/modules/beyondmediaBidAdapter.js +5 -189
  204. package/modules/bliinkBidAdapter.js +3 -31
  205. package/modules/boldwinBidAdapter.js +21 -159
  206. package/modules/ceeIdSystem.js +1 -1
  207. package/modules/compassBidAdapter.js +5 -198
  208. package/modules/contentexchangeBidAdapter.js +5 -200
  209. package/modules/conversantBidAdapter.js +1 -0
  210. package/modules/e_volutionBidAdapter.js +4 -186
  211. package/modules/emtvBidAdapter.js +5 -198
  212. package/modules/globalsunBidAdapter.js +5 -199
  213. package/modules/id5IdSystem.js +31 -2
  214. package/modules/id5IdSystem.md +67 -2
  215. package/modules/iqzoneBidAdapter.js +5 -224
  216. package/modules/kiviadsBidAdapter.js +5 -199
  217. package/modules/krushmediaBidAdapter.js +25 -143
  218. package/modules/loyalBidAdapter.js +4 -178
  219. package/modules/lunamediahbBidAdapter.js +5 -118
  220. package/modules/mathildeadsBidAdapter.js +5 -198
  221. package/modules/mgidXBidAdapter.js +14 -207
  222. package/modules/mobfoxpbBidAdapter.js +4 -135
  223. package/modules/mobianRtdProvider.js +2 -2
  224. package/modules/nobidAnalyticsAdapter.js +2 -3
  225. package/modules/ozoneBidAdapter.js +117 -58
  226. package/modules/paapi.js +2 -1
  227. package/modules/pgamsspBidAdapter.js +5 -240
  228. package/modules/playdigoBidAdapter.js +4 -186
  229. package/modules/prebidServerBidAdapter/index.js +9 -2
  230. package/modules/pubCircleBidAdapter.js +5 -218
  231. package/modules/pubmaticAnalyticsAdapter.js +21 -8
  232. package/modules/pubxaiAnalyticsAdapter.js +1 -5
  233. package/modules/qtBidAdapter.js +5 -224
  234. package/modules/raynRtdProvider.js +36 -3
  235. package/modules/seedtagBidAdapter.js +1 -0
  236. package/modules/setupadBidAdapter.js +58 -140
  237. package/modules/smartytechBidAdapter.js +7 -2
  238. package/modules/topicsFpdModule.js +1 -1
  239. package/modules/uid2IdSystem.js +0 -1
  240. package/modules/uid2IdSystem_shared.js +0 -1
  241. package/modules/visiblemeasuresBidAdapter.js +5 -199
  242. package/package.json +1 -1
  243. package/src/auction.js +5 -63
  244. package/src/utils/focusTimeout.js +41 -0
  245. package/src/utils/ttlCollection.js +2 -1
  246. package/src/utils.js +42 -0
  247. package/src/videoCache.js +72 -0
  248. package/test/mocks/videoCacheStub.js +1 -1
  249. package/test/spec/auctionmanager_spec.js +16 -1
  250. package/test/spec/libraries/teqblazeUtils/bidderUtils_spec.js +519 -0
  251. package/test/spec/modules/acuityadsBidAdapter_spec.js +79 -43
  252. package/test/spec/modules/adagioRtdProvider_spec.js +62 -1
  253. package/test/spec/modules/admanBidAdapter_spec.js +370 -247
  254. package/test/spec/modules/adprimeBidAdapter_spec.js +225 -78
  255. package/test/spec/modules/axisBidAdapter_spec.js +78 -14
  256. package/test/spec/modules/beyondmediaBidAdapter_spec.js +80 -18
  257. package/test/spec/modules/bliinkBidAdapter_spec.js +8 -2
  258. package/test/spec/modules/boldwinBidAdapter_spec.js +221 -75
  259. package/test/spec/modules/compassBidAdapter_spec.js +130 -16
  260. package/test/spec/modules/contentexchangeBidAdapter_spec.js +134 -21
  261. package/test/spec/modules/conversantBidAdapter_spec.js +7 -0
  262. package/test/spec/modules/e_volutionBidAdapter_spec.js +65 -3
  263. package/test/spec/modules/emtvBidAdapter_spec.js +131 -16
  264. package/test/spec/modules/globalsunBidAdapter_spec.js +130 -16
  265. package/test/spec/modules/id5IdSystem_spec.js +79 -3
  266. package/test/spec/modules/iqzoneBidAdapter_spec.js +66 -12
  267. package/test/spec/modules/kiviadsBidAdapter_spec.js +131 -20
  268. package/test/spec/modules/krushmediaBidAdapter_spec.js +272 -90
  269. package/test/spec/modules/loyalBidAdapter_spec.js +114 -14
  270. package/test/spec/modules/lunamediahbBidAdapter_spec.js +221 -87
  271. package/test/spec/modules/mathildeadsBidAdapter_spec.js +87 -18
  272. package/test/spec/modules/mgidXBidAdapter_spec.js +11 -3
  273. package/test/spec/modules/mobfoxpbBidAdapter_spec.js +229 -91
  274. package/test/spec/modules/ozoneBidAdapter_spec.js +192 -22
  275. package/test/spec/modules/paapi_spec.js +5 -5
  276. package/test/spec/modules/pgamsspBidAdapter_spec.js +83 -16
  277. package/test/spec/modules/playdigoBidAdapter_spec.js +38 -9
  278. package/test/spec/modules/prebidServerBidAdapter_spec.js +14 -0
  279. package/test/spec/modules/pubCircleBidAdapter_spec.js +82 -17
  280. package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +52 -5
  281. package/test/spec/modules/qtBidAdapter_spec.js +15 -3
  282. package/test/spec/modules/raynRtdProvider_spec.js +25 -0
  283. package/test/spec/modules/seedtagBidAdapter_spec.js +2 -0
  284. package/test/spec/modules/setupadBidAdapter_spec.js +124 -97
  285. package/test/spec/modules/smartytechBidAdapter_spec.js +5 -1
  286. package/test/spec/modules/topicsFpdModule_spec.js +43 -59
  287. package/test/spec/modules/visiblemeasuresBidAdapter_spec.js +130 -16
  288. package/test/spec/ortbConverter/converter_spec.js +7 -3
  289. package/test/spec/unit/utils/focusTimeout_spec.js +60 -0
  290. package/test/spec/videoCache_spec.js +56 -53
@@ -308,33 +308,6 @@ describe('topics', () => {
308
308
  }],
309
309
  name: 'ads.pubmatic.com'
310
310
  }];
311
- const consentString = 'CPi8wgAPi8wgAADABBENCrCsAP_AAH_AAAAAISNB7D==';
312
- const consentConfig = {
313
- consentString: consentString,
314
- gdprApplies: true,
315
- vendorData: {
316
- metadata: consentString,
317
- gdprApplies: true,
318
- purpose: {
319
- consents: {
320
- 1: true,
321
- 2: true,
322
- 3: true,
323
- 4: true
324
- }
325
- }
326
- }
327
- };
328
- const mockData = [
329
- {
330
- name: 'domain',
331
- segment: [{id: 123}]
332
- },
333
- {
334
- name: 'domain',
335
- segment: [{id: 321}],
336
- }
337
- ];
338
311
 
339
312
  const evt = {
340
313
  data: '{"segment":{"domain":"ads.pubmatic.com","topics":[{"configVersion":"chrome.1","modelVersion":"2206021246","taxonomyVersion":"1","topic":165,"version":"chrome.1:1:2206021246"}],"bidder":"pubmatic"},"date":1669743901858}',
@@ -345,49 +318,60 @@ describe('topics', () => {
345
318
  storage.removeDataFromLocalStorage(topicStorageName);
346
319
  });
347
320
 
348
- describe('when cached data is available and not expired', () => {
321
+ describe('caching', () => {
349
322
  let sandbox;
350
323
  beforeEach(() => {
351
324
  sandbox = sinon.sandbox.create();
352
- const storedSegments = JSON.stringify(
353
- [['pubmatic', {
354
- '2206021246': {
355
- 'ext': {'segtax': 600, 'segclass': '2206021246'},
356
- 'segment': [{'id': '243'}, {'id': '265'}],
357
- 'name': 'ads.pubmatic.com'
358
- },
359
- 'lastUpdated': new Date().getTime()
360
- }]]
361
- );
362
- storage.setDataInLocalStorage(topicStorageName, storedSegments);
363
- config.setConfig({
364
- userSync: {
365
- topics: {
366
- maxTopicCaller: 4,
367
- bidders: [{
368
- bidder: 'pubmatic',
369
- iframeURL: 'https://ads.pubmatic.com/AdServer/js/topics/topics_frame.html'
370
- }]
371
- }
372
- }
373
- })
374
- });
325
+ })
326
+
375
327
  afterEach(() => {
376
328
  sandbox.restore();
377
329
  config.resetConfig();
378
330
  });
379
331
 
380
- it('should return segments for bidder if transmitUfpd is allowed', () => {
381
- assert.deepEqual(getCachedTopics(), expected);
382
- });
332
+ it('should return no segments when not configured', () => {
333
+ config.setConfig({userSync: {}});
334
+ expect(getCachedTopics()).to.eql([]);
335
+ })
336
+
337
+ describe('when cached data is available and not expired', () => {
338
+ beforeEach(() => {
339
+ const storedSegments = JSON.stringify(
340
+ [['pubmatic', {
341
+ '2206021246': {
342
+ 'ext': {'segtax': 600, 'segclass': '2206021246'},
343
+ 'segment': [{'id': '243'}, {'id': '265'}],
344
+ 'name': 'ads.pubmatic.com'
345
+ },
346
+ 'lastUpdated': new Date().getTime()
347
+ }]]
348
+ );
349
+ storage.setDataInLocalStorage(topicStorageName, storedSegments);
350
+ config.setConfig({
351
+ userSync: {
352
+ topics: {
353
+ maxTopicCaller: 4,
354
+ bidders: [{
355
+ bidder: 'pubmatic',
356
+ iframeURL: 'https://ads.pubmatic.com/AdServer/js/topics/topics_frame.html'
357
+ }]
358
+ }
359
+ }
360
+ })
361
+ });
383
362
 
384
- it('should NOT return segments for bidder if enrichUfpd is NOT allowed', () => {
385
- sandbox.stub(activities, 'isActivityAllowed').callsFake((activity, params) => {
386
- return !(activity === ACTIVITY_ENRICH_UFPD && params.component === 'bidder.pubmatic');
363
+ it('should return segments for bidder if transmitUfpd is allowed', () => {
364
+ assert.deepEqual(getCachedTopics(), expected);
365
+ });
366
+
367
+ it('should NOT return segments for bidder if enrichUfpd is NOT allowed', () => {
368
+ sandbox.stub(activities, 'isActivityAllowed').callsFake((activity, params) => {
369
+ return !(activity === ACTIVITY_ENRICH_UFPD && params.component === 'bidder.pubmatic');
370
+ });
371
+ expect(getCachedTopics()).to.eql([]);
387
372
  });
388
- expect(getCachedTopics()).to.eql([]);
389
373
  });
390
- })
374
+ });
391
375
 
392
376
  it('should return empty segments for bidder if there is cached segments stored which is expired', () => {
393
377
  let storedSegments = '[["pubmatic",{"2206021246":{"ext":{"segtax":600,"segclass":"2206021246"},"segment":[{"id":"243"},{"id":"265"}],"name":"ads.pubmatic.com"},"lastUpdated":10}]]';
@@ -3,11 +3,21 @@ import { spec } from '../../../modules/visiblemeasuresBidAdapter.js';
3
3
  import { BANNER, VIDEO, NATIVE } from '../../../src/mediaTypes.js';
4
4
  import { getUniqueIdentifierStr } from '../../../src/utils.js';
5
5
 
6
- const bidder = 'visiblemeasures'
6
+ const bidder = 'visiblemeasures';
7
7
  const adUrl = 'https://us-e.visiblemeasures.com/pbjs';
8
8
  const syncUrl = 'https://cs.visiblemeasures.com';
9
9
 
10
10
  describe('VisibleMeasuresBidAdapter', function () {
11
+ const userIdAsEids = [{
12
+ source: 'test.org',
13
+ uids: [{
14
+ id: '01**********',
15
+ atype: 1,
16
+ ext: {
17
+ third: '01***********'
18
+ }
19
+ }]
20
+ }];
11
21
  const bids = [
12
22
  {
13
23
  bidId: getUniqueIdentifierStr(),
@@ -18,8 +28,9 @@ describe('VisibleMeasuresBidAdapter', function () {
18
28
  }
19
29
  },
20
30
  params: {
21
- placementId: 'testBanner',
22
- }
31
+ placementId: 'testBanner'
32
+ },
33
+ userIdAsEids
23
34
  },
24
35
  {
25
36
  bidId: getUniqueIdentifierStr(),
@@ -32,8 +43,9 @@ describe('VisibleMeasuresBidAdapter', function () {
32
43
  }
33
44
  },
34
45
  params: {
35
- placementId: 'testVideo',
36
- }
46
+ placementId: 'testVideo'
47
+ },
48
+ userIdAsEids
37
49
  },
38
50
  {
39
51
  bidId: getUniqueIdentifierStr(),
@@ -55,8 +67,9 @@ describe('VisibleMeasuresBidAdapter', function () {
55
67
  }
56
68
  },
57
69
  params: {
58
- placementId: 'testNative',
59
- }
70
+ placementId: 'testNative'
71
+ },
72
+ userIdAsEids
60
73
  }
61
74
  ];
62
75
 
@@ -75,9 +88,20 @@ describe('VisibleMeasuresBidAdapter', function () {
75
88
 
76
89
  const bidderRequest = {
77
90
  uspConsent: '1---',
78
- gdprConsent: 'COvFyGBOvFyGBAbAAAENAPCAAOAAAAAAAAAAAEEUACCKAAA.IFoEUQQgAIQwgIwQABAEAAAAOIAACAIAAAAQAIAgEAACEAAAAAgAQBAAAAAAAGBAAgAAAAAAAFAAECAAAgAAQARAEQAAAAAJAAIAAgAAAYQEAAAQmAgBC3ZAYzUw',
91
+ gdprConsent: {
92
+ consentString: 'COvFyGBOvFyGBAbAAAENAPCAAOAAAAAAAAAAAEEUACCKAAA.IFoEUQQgAIQwgIwQABAEAAAAOIAACAIAAAAQAIAgEAACEAAAAAgAQBAAAAAAAGBAAgAAAAAAAFAAECAAAgAAQARAEQAAAAAJAAIAAgAAAYQEAAAQmAgBC3ZAYzUw',
93
+ vendorData: {}
94
+ },
79
95
  refererInfo: {
80
- referer: 'https://test.com'
96
+ referer: 'https://test.com',
97
+ page: 'https://test.com'
98
+ },
99
+ ortb2: {
100
+ device: {
101
+ w: 1512,
102
+ h: 982,
103
+ language: 'en-UK'
104
+ }
81
105
  },
82
106
  timeout: 500
83
107
  };
@@ -131,7 +155,7 @@ describe('VisibleMeasuresBidAdapter', function () {
131
155
  expect(data.host).to.be.a('string');
132
156
  expect(data.page).to.be.a('string');
133
157
  expect(data.coppa).to.be.a('number');
134
- expect(data.gdpr).to.be.a('string');
158
+ expect(data.gdpr).to.be.a('object');
135
159
  expect(data.ccpa).to.be.a('string');
136
160
  expect(data.tmax).to.be.a('number');
137
161
  expect(data.placements).to.have.lengthOf(3);
@@ -147,6 +171,56 @@ describe('VisibleMeasuresBidAdapter', function () {
147
171
  expect(placement.schain).to.be.an('object');
148
172
  expect(placement.bidfloor).to.exist.and.to.equal(0);
149
173
  expect(placement.type).to.exist.and.to.equal('publisher');
174
+ expect(placement.eids).to.exist.and.to.be.deep.equal(userIdAsEids);
175
+
176
+ if (placement.adFormat === BANNER) {
177
+ expect(placement.sizes).to.be.an('array');
178
+ }
179
+ switch (placement.adFormat) {
180
+ case BANNER:
181
+ expect(placement.sizes).to.be.an('array');
182
+ break;
183
+ case VIDEO:
184
+ expect(placement.playerSize).to.be.an('array');
185
+ expect(placement.minduration).to.be.an('number');
186
+ expect(placement.maxduration).to.be.an('number');
187
+ break;
188
+ case NATIVE:
189
+ expect(placement.native).to.be.an('object');
190
+ break;
191
+ }
192
+ }
193
+ });
194
+
195
+ it('Returns valid endpoints', function () {
196
+ const bids = [
197
+ {
198
+ bidId: getUniqueIdentifierStr(),
199
+ bidder: bidder,
200
+ mediaTypes: {
201
+ [BANNER]: {
202
+ sizes: [[300, 250]]
203
+ }
204
+ },
205
+ params: {
206
+ endpointId: 'testBanner',
207
+ },
208
+ userIdAsEids
209
+ }
210
+ ];
211
+
212
+ let serverRequest = spec.buildRequests(bids, bidderRequest);
213
+
214
+ const { placements } = serverRequest.data;
215
+ for (let i = 0, len = placements.length; i < len; i++) {
216
+ const placement = placements[i];
217
+ expect(placement.endpointId).to.be.oneOf(['testBanner', 'testVideo', 'testNative']);
218
+ expect(placement.adFormat).to.be.oneOf([BANNER, VIDEO, NATIVE]);
219
+ expect(placement.bidId).to.be.a('string');
220
+ expect(placement.schain).to.be.an('object');
221
+ expect(placement.bidfloor).to.exist.and.to.equal(0);
222
+ expect(placement.type).to.exist.and.to.equal('network');
223
+ expect(placement.eids).to.exist.and.to.be.deep.equal(userIdAsEids);
150
224
 
151
225
  if (placement.adFormat === BANNER) {
152
226
  expect(placement.sizes).to.be.an('array');
@@ -172,8 +246,10 @@ describe('VisibleMeasuresBidAdapter', function () {
172
246
  serverRequest = spec.buildRequests(bids, bidderRequest);
173
247
  let data = serverRequest.data;
174
248
  expect(data.gdpr).to.exist;
175
- expect(data.gdpr).to.be.a('string');
176
- expect(data.gdpr).to.equal(bidderRequest.gdprConsent);
249
+ expect(data.gdpr).to.be.a('object');
250
+ expect(data.gdpr).to.have.property('consentString');
251
+ expect(data.gdpr).to.not.have.property('vendorData');
252
+ expect(data.gdpr.consentString).to.equal(bidderRequest.gdprConsent.consentString);
177
253
  expect(data.ccpa).to.not.exist;
178
254
  delete bidderRequest.gdprConsent;
179
255
  });
@@ -188,12 +264,38 @@ describe('VisibleMeasuresBidAdapter', function () {
188
264
  expect(data.ccpa).to.equal(bidderRequest.uspConsent);
189
265
  expect(data.gdpr).to.not.exist;
190
266
  });
267
+ });
268
+
269
+ describe('gpp consent', function () {
270
+ it('bidderRequest.gppConsent', () => {
271
+ bidderRequest.gppConsent = {
272
+ gppString: 'abc123',
273
+ applicableSections: [8]
274
+ };
191
275
 
192
- it('Returns empty data if no valid requests are passed', function () {
193
- serverRequest = spec.buildRequests([], bidderRequest);
276
+ let serverRequest = spec.buildRequests(bids, bidderRequest);
194
277
  let data = serverRequest.data;
195
- expect(data.placements).to.be.an('array').that.is.empty;
196
- });
278
+ expect(data).to.be.an('object');
279
+ expect(data).to.have.property('gpp');
280
+ expect(data).to.have.property('gpp_sid');
281
+
282
+ delete bidderRequest.gppConsent;
283
+ })
284
+
285
+ it('bidderRequest.ortb2.regs.gpp', () => {
286
+ bidderRequest.ortb2 = bidderRequest.ortb2 || {};
287
+ bidderRequest.ortb2.regs = bidderRequest.ortb2.regs || {};
288
+ bidderRequest.ortb2.regs.gpp = 'abc123';
289
+ bidderRequest.ortb2.regs.gpp_sid = [8];
290
+
291
+ let serverRequest = spec.buildRequests(bids, bidderRequest);
292
+ let data = serverRequest.data;
293
+ expect(data).to.be.an('object');
294
+ expect(data).to.have.property('gpp');
295
+ expect(data).to.have.property('gpp_sid');
296
+
297
+ bidderRequest.ortb2;
298
+ })
197
299
  });
198
300
 
199
301
  describe('interpretResponse', function () {
@@ -397,5 +499,17 @@ describe('VisibleMeasuresBidAdapter', function () {
397
499
  expect(syncData[0].url).to.be.a('string')
398
500
  expect(syncData[0].url).to.equal(`${syncUrl}/image?pbjs=1&ccpa_consent=1---&coppa=0`)
399
501
  });
502
+ it('Should return array of objects with proper sync config , include GPP', function() {
503
+ const syncData = spec.getUserSyncs({}, {}, {}, {}, {
504
+ gppString: 'abc123',
505
+ applicableSections: [8]
506
+ });
507
+ expect(syncData).to.be.an('array').which.is.not.empty;
508
+ expect(syncData[0]).to.be.an('object')
509
+ expect(syncData[0].type).to.be.a('string')
510
+ expect(syncData[0].type).to.equal('image')
511
+ expect(syncData[0].url).to.be.a('string')
512
+ expect(syncData[0].url).to.equal(`${syncUrl}/image?pbjs=1&gpp=abc123&gpp_sid=8&coppa=0`);
513
+ });
400
514
  });
401
515
  });
@@ -80,6 +80,7 @@ describe('pbjs-ortb converter', () => {
80
80
  if (context.reqContext?.ctx) {
81
81
  bidResponse.reqCtx = context.reqContext?.ctx;
82
82
  }
83
+ bidResponse.seatbid = context.seatbid;
83
84
  }
84
85
  }
85
86
  },
@@ -116,13 +117,16 @@ describe('pbjs-ortb converter', () => {
116
117
  const response = cvt.fromORTB({request, response: MOCK_ORTB_RESPONSE});
117
118
  expect(response.bids).to.eql([{
118
119
  impid: 'imp0',
119
- bidId: 111
120
+ bidId: 111,
121
+ seatbid: MOCK_ORTB_RESPONSE.seatbid[0]
120
122
  }, {
121
123
  impid: 'imp1',
122
- bidId: 112
124
+ bidId: 112,
125
+ seatbid: MOCK_ORTB_RESPONSE.seatbid[0]
123
126
  }, {
124
127
  impid: 'imp1',
125
- bidId: 112
128
+ bidId: 112,
129
+ seatbid: MOCK_ORTB_RESPONSE.seatbid[1]
126
130
  }]);
127
131
  expect(response.marker).to.be.true;
128
132
  });
@@ -0,0 +1,60 @@
1
+ import setFocusTimeout from '../../../../src/utils/focusTimeout';
2
+
3
+ export const setDocumentHidden = (hidden) => {
4
+ Object.defineProperty(document, 'hidden', {
5
+ configurable: true,
6
+ get: () => hidden,
7
+ });
8
+ document.dispatchEvent(new Event('visibilitychange'));
9
+ };
10
+
11
+ describe('focusTimeout', () => {
12
+ let clock;
13
+
14
+ beforeEach(() => {
15
+ clock = sinon.useFakeTimers();
16
+ });
17
+
18
+ afterEach(() => {
19
+ clock.restore();
20
+ })
21
+
22
+ it('should invoke callback when page is visible', () => {
23
+ let callback = sinon.stub();
24
+ setFocusTimeout(callback, 2000);
25
+ clock.tick(2000);
26
+ expect(callback.called).to.be.true;
27
+ });
28
+
29
+ it('should not invoke callback if page was hidden', () => {
30
+ let callback = sinon.stub();
31
+ setFocusTimeout(callback, 2000);
32
+ setDocumentHidden(true);
33
+ clock.tick(3000);
34
+ expect(callback.called).to.be.false;
35
+ });
36
+
37
+ it('should defer callback execution when page is hidden', () => {
38
+ let callback = sinon.stub();
39
+ setFocusTimeout(callback, 4000);
40
+ clock.tick(2000);
41
+ setDocumentHidden(true);
42
+ clock.tick(2000);
43
+ setDocumentHidden(false);
44
+ expect(callback.called).to.be.false;
45
+ clock.tick(2000);
46
+ expect(callback.called).to.be.true;
47
+ });
48
+
49
+ it('should return updated timerId after page was showed again', () => {
50
+ let callback = sinon.stub();
51
+ const getCurrentTimerId = setFocusTimeout(callback, 4000);
52
+ const oldTimerId = getCurrentTimerId();
53
+ clock.tick(2000);
54
+ setDocumentHidden(true);
55
+ clock.tick(2000);
56
+ setDocumentHidden(false);
57
+ const newTimerId = getCurrentTimerId();
58
+ expect(oldTimerId).to.not.equal(newTimerId);
59
+ });
60
+ });
@@ -1,39 +1,13 @@
1
1
  import chai from 'chai';
2
- import {getCacheUrl, store} from 'src/videoCache.js';
2
+ import {batchingCache, getCacheUrl, store, _internal, storeBatch} from 'src/videoCache.js';
3
3
  import {config} from 'src/config.js';
4
4
  import {server} from 'test/mocks/xhr.js';
5
5
  import {auctionManager} from '../../src/auctionManager.js';
6
6
  import {AuctionIndex} from '../../src/auctionIndex.js';
7
- import {batchingCache} from '../../src/auction.js';
7
+ import * as utils from 'src/utils.js';
8
8
 
9
9
  const should = chai.should();
10
10
 
11
- function getMockBid(bidder, auctionId, bidderRequestId) {
12
- return {
13
- 'bidder': bidder,
14
- 'params': {
15
- 'placementId': '10433394',
16
- 'member': 123,
17
- 'keywords': {
18
- 'foo': ['bar', 'baz'],
19
- 'fizz': ['buzz']
20
- }
21
- },
22
- 'bid_id': '12345abc',
23
- 'adUnitCode': 'div-gpt-ad-1460505748561-0',
24
- 'mediaTypes': {
25
- 'banner': {
26
- 'sizes': [[300, 250]]
27
- }
28
- },
29
- 'transactionId': '4ef956ad-fd83-406d-bd35-e4bb786ab86c',
30
- 'sizes': [300, 250],
31
- 'bidId': '123',
32
- 'bidderRequestId': bidderRequestId,
33
- 'auctionId': auctionId
34
- };
35
- }
36
-
37
11
  describe('The video cache', function () {
38
12
  function assertError(callbackSpy) {
39
13
  callbackSpy.calledOnce.should.equal(true);
@@ -126,9 +100,7 @@ describe('The video cache', function () {
126
100
  <Ad>
127
101
  <Wrapper>
128
102
  <AdSystem>prebid.org wrapper</AdSystem>
129
- <VASTAdTagURI><![CDATA[my-mock-url.com]]></VASTAdTagURI>
130
-
131
- <Creatives></Creatives>
103
+ <VASTAdTagURI><![CDATA[my-mock-url.com]]></VASTAdTagURI>\n \n <Creatives></Creatives>
132
104
  </Wrapper>
133
105
  </Ad>
134
106
  </VAST>`;
@@ -335,34 +307,36 @@ describe('The video cache', function () {
335
307
  JSON.parse(request.requestBody).should.deep.equal(payload);
336
308
  });
337
309
 
338
- it('should wait the duration of the batchTimeout and pass the correct batchSize if batched requests are enabled in the config', () => {
339
- const mockAfterBidAdded = function() {};
340
- let callback = null;
341
- let mockTimeout = sinon.stub().callsFake((cb) => { callback = cb });
310
+ if (FEATURES.VIDEO) {
311
+ it('should wait the duration of the batchTimeout and pass the correct batchSize if batched requests are enabled in the config', () => {
312
+ const mockAfterBidAdded = function() {};
313
+ let callback = null;
314
+ let mockTimeout = sinon.stub().callsFake((cb) => { callback = cb });
342
315
 
343
- config.setConfig({
344
- cache: {
345
- url: 'https://prebid.adnxs.com/pbc/v1/cache',
346
- batchSize: 3,
347
- batchTimeout: 20
348
- }
349
- });
316
+ config.setConfig({
317
+ cache: {
318
+ url: 'https://prebid.adnxs.com/pbc/v1/cache',
319
+ batchSize: 3,
320
+ batchTimeout: 20
321
+ }
322
+ });
350
323
 
351
- let stubCache = sinon.stub();
352
- const batchAndStore = batchingCache(mockTimeout, stubCache);
353
- for (let i = 0; i < 3; i++) {
354
- batchAndStore({}, {}, mockAfterBidAdded);
355
- }
324
+ let stubCache = sinon.stub();
325
+ const batchAndStore = batchingCache(mockTimeout, stubCache);
326
+ for (let i = 0; i < 3; i++) {
327
+ batchAndStore({}, {}, mockAfterBidAdded);
328
+ }
356
329
 
357
- sinon.assert.calledOnce(mockTimeout);
358
- sinon.assert.calledWith(mockTimeout, sinon.match.any, 20);
330
+ sinon.assert.calledOnce(mockTimeout);
331
+ sinon.assert.calledWith(mockTimeout, sinon.match.any, 20);
359
332
 
360
- const expectedBatch = [{ afterBidAdded: mockAfterBidAdded, auctionInstance: { }, bidResponse: { } }, { afterBidAdded: mockAfterBidAdded, auctionInstance: { }, bidResponse: { } }, { afterBidAdded: mockAfterBidAdded, auctionInstance: { }, bidResponse: { } }];
333
+ const expectedBatch = [{ afterBidAdded: mockAfterBidAdded, auctionInstance: { }, bidResponse: { } }, { afterBidAdded: mockAfterBidAdded, auctionInstance: { }, bidResponse: { } }, { afterBidAdded: mockAfterBidAdded, auctionInstance: { }, bidResponse: { } }];
361
334
 
362
- callback();
335
+ callback();
363
336
 
364
- sinon.assert.calledWith(stubCache, expectedBatch);
365
- });
337
+ sinon.assert.calledWith(stubCache, expectedBatch);
338
+ });
339
+ }
366
340
 
367
341
  function assertRequestMade(bid, expectedValue) {
368
342
  store([bid], function () { });
@@ -393,6 +367,35 @@ describe('The video cache', function () {
393
367
  return callback;
394
368
  }
395
369
  });
370
+
371
+ describe('storeBatch', () => {
372
+ let sandbox;
373
+ let err, cacheIds
374
+ beforeEach(() => {
375
+ err = null;
376
+ cacheIds = [];
377
+ sandbox = sinon.createSandbox();
378
+ sandbox.stub(utils, 'logError');
379
+ sandbox.stub(_internal, 'store').callsFake((_, cb) => cb(err, cacheIds));
380
+ });
381
+ afterEach(() => {
382
+ sandbox.restore();
383
+ })
384
+ it('should log an error when store replies with an error', () => {
385
+ err = new Error('err');
386
+ storeBatch([]);
387
+ sinon.assert.called(utils.logError);
388
+ });
389
+ it('should not process returned uuids if they do not match the batch size', () => {
390
+ const el = {auctionInstance: {}, bidResponse: {}, afterBidAdded: sinon.stub()}
391
+ const batch = [el, el];
392
+ cacheIds = [{uuid: 'mock-id'}]
393
+ storeBatch(batch);
394
+ expect(el.bidResponse.videoCacheKey).to.not.exist;
395
+ sinon.assert.notCalled(batch[0].afterBidAdded);
396
+ sinon.assert.called(utils.logError);
397
+ })
398
+ })
396
399
  });
397
400
 
398
401
  describe('The getCache function', function () {