prebid.js 6.4.0 → 6.8.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 (147) hide show
  1. package/integrationExamples/gpt/amp/creative.html +11 -33
  2. package/integrationExamples/gpt/x-domain/creative.html +53 -26
  3. package/modules/.submodules.json +2 -1
  4. package/modules/adagioBidAdapter.js +0 -8
  5. package/modules/adagioBidAdapter.md +1 -1
  6. package/modules/adbookpspBidAdapter.js +27 -10
  7. package/modules/adhashBidAdapter.js +3 -3
  8. package/modules/adkernelBidAdapter.js +2 -1
  9. package/modules/admanBidAdapter.js +10 -4
  10. package/modules/adomikAnalyticsAdapter.js +23 -11
  11. package/modules/adqueryIdSystem.js +103 -0
  12. package/modules/adqueryIdSystem.md +35 -0
  13. package/modules/adyoulikeBidAdapter.js +13 -9
  14. package/modules/appnexusBidAdapter.js +11 -0
  15. package/modules/bliinkBidAdapter.js +3 -2
  16. package/modules/brandmetricsRtdProvider.js +168 -0
  17. package/modules/brandmetricsRtdProvider.md +40 -0
  18. package/modules/colossussspBidAdapter.js +12 -8
  19. package/modules/colossussspBidAdapter.md +15 -1
  20. package/modules/compassBidAdapter.js +10 -3
  21. package/modules/consentManagement.js +7 -1
  22. package/modules/consumableBidAdapter.md +1 -1
  23. package/modules/criteoBidAdapter.js +10 -1
  24. package/modules/criteoIdSystem.js +29 -7
  25. package/modules/currency.js +26 -1
  26. package/modules/displayioBidAdapter.js +157 -0
  27. package/modules/displayioBidAdapter.md +148 -0
  28. package/modules/docereeBidAdapter.js +10 -1
  29. package/modules/docereeBidAdapter.md +2 -0
  30. package/modules/e_volutionBidAdapter.js +158 -0
  31. package/modules/glimpseBidAdapter.js +66 -44
  32. package/modules/gnetBidAdapter.js +3 -3
  33. package/modules/gnetBidAdapter.md +4 -4
  34. package/modules/gptPreAuction.js +55 -7
  35. package/modules/gumgumBidAdapter.js +56 -42
  36. package/modules/idImportLibrary.js +45 -8
  37. package/modules/idImportLibrary.md +4 -0
  38. package/modules/improvedigitalBidAdapter.js +24 -2
  39. package/modules/interactiveOffersBidAdapter.js +9 -6
  40. package/modules/ixBidAdapter.js +29 -12
  41. package/modules/jwplayerRtdProvider.js +71 -6
  42. package/modules/jwplayerRtdProvider.md +27 -11
  43. package/modules/kargoBidAdapter.js +2 -2
  44. package/modules/limelightDigitalBidAdapter.js +2 -1
  45. package/modules/livewrappedAnalyticsAdapter.js +3 -1
  46. package/modules/loglyliftBidAdapter.js +79 -0
  47. package/modules/loglyliftBidAdapter.md +55 -0
  48. package/modules/nextMillenniumBidAdapter.js +3 -1
  49. package/modules/oguryBidAdapter.js +9 -2
  50. package/modules/onetagBidAdapter.js +4 -2
  51. package/modules/optimeraRtdProvider.js +8 -1
  52. package/modules/ozoneBidAdapter.js +21 -64
  53. package/modules/pilotxBidAdapter.js +147 -0
  54. package/modules/pilotxBidAdapter.md +50 -0
  55. package/modules/proxistoreBidAdapter.js +0 -2
  56. package/modules/pubmaticAnalyticsAdapter.js +16 -0
  57. package/modules/richaudienceBidAdapter.js +3 -2
  58. package/modules/riseBidAdapter.js +1 -1
  59. package/modules/rtbhouseBidAdapter.js +14 -4
  60. package/modules/rtdModule/index.js +14 -15
  61. package/modules/rubiconAnalyticsAdapter.js +3 -2
  62. package/modules/seedingAllianceBidAdapter.js +3 -3
  63. package/modules/sharethroughBidAdapter.js +12 -17
  64. package/modules/showheroes-bsBidAdapter.js +13 -2
  65. package/modules/sovrnBidAdapter.js +93 -18
  66. package/modules/sovrnBidAdapter.md +80 -2
  67. package/modules/synacormediaBidAdapter.js +31 -10
  68. package/modules/tappxBidAdapter.js +8 -5
  69. package/modules/teadsBidAdapter.js +1 -2
  70. package/modules/undertoneBidAdapter.js +17 -1
  71. package/modules/userId/eids.js +7 -1
  72. package/modules/userId/userId.md +8 -0
  73. package/modules/viewability.js +177 -0
  74. package/modules/viewability.md +87 -0
  75. package/modules/welectBidAdapter.js +106 -0
  76. package/modules/yahoosspBidAdapter.js +2 -0
  77. package/modules/yieldmoBidAdapter.js +23 -5
  78. package/modules/zeta_global_sspAnalyticsAdapter.js +97 -0
  79. package/modules/zeta_global_sspAnalyticsAdapter.md +24 -0
  80. package/package.json +1 -1
  81. package/src/adRendering.js +38 -0
  82. package/src/auction.js +44 -9
  83. package/src/config.js +27 -3
  84. package/src/hook.js +5 -1
  85. package/src/prebid.js +21 -21
  86. package/src/secureCreatives.js +114 -44
  87. package/src/utils.js +25 -4
  88. package/test/helpers/syncPromise.js +71 -0
  89. package/test/spec/auctionmanager_spec.js +148 -16
  90. package/test/spec/config_spec.js +279 -0
  91. package/test/spec/modules/adagioBidAdapter_spec.js +0 -10
  92. package/test/spec/modules/adbookpspBidAdapter_spec.js +17 -3
  93. package/test/spec/modules/adhashBidAdapter_spec.js +2 -2
  94. package/test/spec/modules/admanBidAdapter_spec.js +2 -2
  95. package/test/spec/modules/adomikAnalyticsAdapter_spec.js +3 -1
  96. package/test/spec/modules/adqueryIdSystem_spec.js +74 -0
  97. package/test/spec/modules/adyoulikeBidAdapter_spec.js +49 -0
  98. package/test/spec/modules/appnexusBidAdapter_spec.js +27 -0
  99. package/test/spec/modules/bliinkBidAdapter_spec.js +2 -0
  100. package/test/spec/modules/brandmetricsRtdProvider_spec.js +191 -0
  101. package/test/spec/modules/colossussspBidAdapter_spec.js +5 -2
  102. package/test/spec/modules/compassBidAdapter_spec.js +1 -0
  103. package/test/spec/modules/consentManagement_spec.js +20 -0
  104. package/test/spec/modules/criteoBidAdapter_spec.js +21 -0
  105. package/test/spec/modules/criteoIdSystem_spec.js +6 -3
  106. package/test/spec/modules/currency_spec.js +21 -6
  107. package/test/spec/modules/displayioBidAdapter_spec.js +239 -0
  108. package/test/spec/modules/docereeBidAdapter_spec.js +9 -1
  109. package/test/spec/modules/e_volutionBidAdapter_spec.js +242 -0
  110. package/test/spec/modules/eids_spec.js +15 -0
  111. package/test/spec/modules/glimpseBidAdapter_spec.js +0 -18
  112. package/test/spec/modules/gnetBidAdapter_spec.js +6 -6
  113. package/test/spec/modules/gptPreAuction_spec.js +177 -2
  114. package/test/spec/modules/gumgumBidAdapter_spec.js +46 -0
  115. package/test/spec/modules/idImportLibrary_spec.js +197 -10
  116. package/test/spec/modules/improvedigitalBidAdapter_spec.js +42 -0
  117. package/test/spec/modules/ixBidAdapter_spec.js +104 -62
  118. package/test/spec/modules/jwplayerRtdProvider_spec.js +195 -2
  119. package/test/spec/modules/kargoBidAdapter_spec.js +1 -1
  120. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +75 -17
  121. package/test/spec/modules/livewrappedAnalyticsAdapter_spec.js +22 -0
  122. package/test/spec/modules/loglyliftBidAdapter_spec.js +172 -0
  123. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +1 -1
  124. package/test/spec/modules/oguryBidAdapter_spec.js +10 -2
  125. package/test/spec/modules/optimeraRtdProvider_spec.js +14 -1
  126. package/test/spec/modules/ozoneBidAdapter_spec.js +43 -31
  127. package/test/spec/modules/pilotxBidAdapter_spec.js +244 -0
  128. package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +13 -1
  129. package/test/spec/modules/realTimeDataModule_spec.js +67 -5
  130. package/test/spec/modules/richaudienceBidAdapter_spec.js +40 -0
  131. package/test/spec/modules/riseBidAdapter_spec.js +1 -1
  132. package/test/spec/modules/rtbhouseBidAdapter_spec.js +20 -0
  133. package/test/spec/modules/rubiconAnalyticsAdapter_spec.js +30 -0
  134. package/test/spec/modules/sharethroughBidAdapter_spec.js +91 -6
  135. package/test/spec/modules/showheroes-bsBidAdapter_spec.js +2 -0
  136. package/test/spec/modules/sovrnBidAdapter_spec.js +413 -333
  137. package/test/spec/modules/synacormediaBidAdapter_spec.js +70 -0
  138. package/test/spec/modules/tappxBidAdapter_spec.js +0 -19
  139. package/test/spec/modules/teadsBidAdapter_spec.js +14 -59
  140. package/test/spec/modules/undertoneBidAdapter_spec.js +55 -2
  141. package/test/spec/modules/userId_spec.js +68 -19
  142. package/test/spec/modules/viewability_spec.js +280 -0
  143. package/test/spec/modules/welectBidAdapter_spec.js +211 -0
  144. package/test/spec/modules/yahoosspBidAdapter_spec.js +10 -0
  145. package/test/spec/modules/zeta_global_sspAnalyticsAdapter_spec.js +427 -0
  146. package/test/spec/unit/pbjs_api_spec.js +20 -2
  147. package/test/spec/unit/secureCreatives_spec.js +85 -0
@@ -791,6 +791,46 @@ describe('Richaudience adapter tests', function () {
791
791
  })).to.equal(true);
792
792
  });
793
793
 
794
+ it('should pass schain', function() {
795
+ let schain = {
796
+ 'ver': '1.0',
797
+ 'complete': 1,
798
+ 'nodes': [{
799
+ 'asi': 'richaudience.com',
800
+ 'sid': '00001',
801
+ 'hp': 1
802
+ }, {
803
+ 'asi': 'richaudience-2.com',
804
+ 'sid': '00002',
805
+ 'hp': 1
806
+ }]
807
+ }
808
+
809
+ DEFAULT_PARAMS_NEW_SIZES[0].schain = {
810
+ 'ver': '1.0',
811
+ 'complete': 1,
812
+ 'nodes': [{
813
+ 'asi': 'richaudience.com',
814
+ 'sid': '00001',
815
+ 'hp': 1
816
+ }, {
817
+ 'asi': 'richaudience-2.com',
818
+ 'sid': '00002',
819
+ 'hp': 1
820
+ }]
821
+ }
822
+
823
+ const request = spec.buildRequests(DEFAULT_PARAMS_NEW_SIZES, {
824
+ gdprConsent: {
825
+ consentString: 'BOZcQl_ObPFjWAeABAESCD-AAAAjx7_______9______9uz_Ov_v_f__33e8__9v_l_7_-___u_-33d4-_1vf99yfm1-7ftr3tp_87ues2_Xur__59__3z3_NohBgA',
826
+ gdprApplies: true
827
+ },
828
+ refererInfo: {}
829
+ })
830
+ const requestContent = JSON.parse(request[0].data);
831
+ expect(requestContent).to.have.property('schain').to.deep.equal(schain);
832
+ })
833
+
794
834
  describe('userSync', function () {
795
835
  it('Verifies user syncs iframe include', function () {
796
836
  config.setConfig({
@@ -257,7 +257,7 @@ describe('riseAdapter', function () {
257
257
  const requests = spec.buildRequests(bidRequests, bidderRequest);
258
258
  for (const request of requests) {
259
259
  expect(request.data).to.be.an('object');
260
- expect(request.data).to.have.property('schain', '1.0,1!indirectseller.com,00001,,,,');
260
+ expect(request.data).to.have.property('schain', '1.0,1!indirectseller.com,00001,1,,,');
261
261
  }
262
262
  });
263
263
 
@@ -68,6 +68,7 @@ describe('RTBHouseAdapter', () => {
68
68
  'params': {
69
69
  'publisherId': 'PREBID_TEST',
70
70
  'region': 'prebid-eu',
71
+ 'channel': 'Partner_Site - news',
71
72
  'test': 1
72
73
  },
73
74
  'adUnitCode': 'adunit-code',
@@ -101,6 +102,25 @@ describe('RTBHouseAdapter', () => {
101
102
  expect(JSON.parse(builtTestRequest).test).to.equal(1);
102
103
  });
103
104
 
105
+ it('should build channel param into request.site', () => {
106
+ let builtTestRequest = spec.buildRequests(bidRequests, bidderRequest).data;
107
+ expect(JSON.parse(builtTestRequest).site.channel).to.equal('Partner_Site - news');
108
+ })
109
+
110
+ it('should not build channel param into request.site if no value is passed', () => {
111
+ let bidRequest = Object.assign([], bidRequests);
112
+ bidRequest[0].params.channel = undefined;
113
+ let builtTestRequest = spec.buildRequests(bidRequest, bidderRequest).data;
114
+ expect(JSON.parse(builtTestRequest).site.channel).to.be.undefined
115
+ })
116
+
117
+ it('should cap the request.site.channel length to 50', () => {
118
+ let bidRequest = Object.assign([], bidRequests);
119
+ bidRequest[0].params.channel = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent scelerisque ipsum eu purus lobortis iaculis.';
120
+ let builtTestRequest = spec.buildRequests(bidRequest, bidderRequest).data;
121
+ expect(JSON.parse(builtTestRequest).site.channel.length).to.equal(50)
122
+ })
123
+
104
124
  it('should build valid OpenRTB banner object', () => {
105
125
  const request = JSON.parse(spec.buildRequests(bidRequests, bidderRequest).data);
106
126
  const imp = request.imp[0];
@@ -987,6 +987,36 @@ describe('rubicon analytics adapter', function () {
987
987
  expect(message.auctions[0].adUnits[1].bids[0].bidResponse.adomains).to.be.undefined;
988
988
  });
989
989
 
990
+ it('should NOT pass along adomians with other edge cases', function () {
991
+ events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
992
+ events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
993
+
994
+ // should filter out non string values and pass valid ones
995
+ let bidResponse1 = utils.deepClone(MOCK.BID_RESPONSE[0]);
996
+ bidResponse1.meta = {
997
+ advertiserDomains: [123, 'prebid.org', false, true, [], 'magnite.com', {}]
998
+ }
999
+
1000
+ // array of arrays (as seen when passed by kargo bid adapter)
1001
+ let bidResponse2 = utils.deepClone(MOCK.BID_RESPONSE[1]);
1002
+ bidResponse2.meta = {
1003
+ advertiserDomains: [['prebid.org']]
1004
+ }
1005
+
1006
+ events.emit(BID_RESPONSE, bidResponse1);
1007
+ events.emit(BID_RESPONSE, bidResponse2);
1008
+ events.emit(BIDDER_DONE, MOCK.BIDDER_DONE);
1009
+ events.emit(AUCTION_END, MOCK.AUCTION_END);
1010
+ events.emit(SET_TARGETING, MOCK.SET_TARGETING);
1011
+ events.emit(BID_WON, MOCK.BID_WON[0]);
1012
+ events.emit(BID_WON, MOCK.BID_WON[1]);
1013
+
1014
+ let message = JSON.parse(server.requests[0].requestBody);
1015
+ validate(message);
1016
+ expect(message.auctions[0].adUnits[0].bids[0].bidResponse.adomains).to.deep.equal(['prebid.org', 'magnite.com']);
1017
+ expect(message.auctions[0].adUnits[1].bids[0].bidResponse.adomains).to.be.undefined;
1018
+ });
1019
+
990
1020
  it('should not pass empty adServerTargeting values', function () {
991
1021
  events.emit(AUCTION_INIT, MOCK.AUCTION_INIT);
992
1022
  events.emit(BID_REQUESTED, MOCK.BID_REQUESTED);
@@ -1,4 +1,5 @@
1
1
  import { expect } from 'chai';
2
+ import * as sinon from 'sinon';
2
3
  import { sharethroughAdapterSpec, sharethroughInternal } from 'modules/sharethroughBidAdapter.js';
3
4
  import { newBidder } from 'src/adapters/bidderFactory.js';
4
5
  import { config } from 'src/config';
@@ -157,7 +158,6 @@ describe('sharethrough adapter spec', function () {
157
158
  startdelay: 42,
158
159
  skipmin: 10,
159
160
  skipafter: 20,
160
- placement: 1,
161
161
  delivery: 1,
162
162
  companiontype: 'companion type',
163
163
  companionad: 'companion ad',
@@ -205,6 +205,7 @@ describe('sharethrough adapter spec', function () {
205
205
  expect(openRtbReq.cur).to.deep.equal(['USD']);
206
206
  expect(openRtbReq.tmax).to.equal(242);
207
207
 
208
+ expect(Object.keys(openRtbReq.site)).to.have.length(3);
208
209
  expect(openRtbReq.site.domain).not.to.be.undefined;
209
210
  expect(openRtbReq.site.page).not.to.be.undefined;
210
211
  expect(openRtbReq.site.ref).to.equal('https://referer.com');
@@ -256,6 +257,17 @@ describe('sharethrough adapter spec', function () {
256
257
  });
257
258
  });
258
259
 
260
+ describe('no referer provided', () => {
261
+ beforeEach(() => {
262
+ bidderRequest = {};
263
+ });
264
+
265
+ it('should set referer to undefined', () => {
266
+ const openRtbReq = spec.buildRequests(bidRequests, bidderRequest)[0].data;
267
+ expect(openRtbReq.site.ref).to.be.undefined;
268
+ });
269
+ });
270
+
259
271
  describe('regulation', () => {
260
272
  describe('gdpr', () => {
261
273
  it('should populate request accordingly when gdpr applies', () => {
@@ -419,17 +431,90 @@ describe('sharethrough adapter spec', function () {
419
431
  expect(videoImp.startdelay).to.equal(0);
420
432
  expect(videoImp.skipmin).to.equal(0);
421
433
  expect(videoImp.skipafter).to.equal(0);
422
- expect(videoImp.placement).to.be.undefined;
434
+ expect(videoImp.placement).to.equal(1);
423
435
  expect(videoImp.delivery).to.be.undefined;
424
436
  expect(videoImp.companiontype).to.be.undefined;
425
437
  expect(videoImp.companionad).to.be.undefined;
426
438
  });
427
439
 
428
- it('should not return a video impression if context is outstream', () => {
429
- bidRequests[1].mediaTypes.video.context = 'outstream';
430
- const builtRequest = spec.buildRequests(bidRequests, bidderRequest)[1];
440
+ describe('outstream', () => {
441
+ it('should use placement value if provided', () => {
442
+ bidRequests[1].mediaTypes.video.context = 'outstream';
443
+ bidRequests[1].mediaTypes.video.placement = 3;
444
+
445
+ const builtRequest = spec.buildRequests(bidRequests, bidderRequest)[1];
446
+ const videoImp = builtRequest.data.imp[0].video;
447
+
448
+ expect(videoImp.placement).to.equal(3);
449
+ });
450
+
451
+ it('should default placement to 4 if not provided', () => {
452
+ bidRequests[1].mediaTypes.video.context = 'outstream';
453
+
454
+ const builtRequest = spec.buildRequests(bidRequests, bidderRequest)[1];
455
+ const videoImp = builtRequest.data.imp[0].video;
456
+
457
+ expect(videoImp.placement).to.equal(4);
458
+ });
459
+ });
460
+ });
461
+
462
+ describe('first party data', () => {
463
+ const firstPartyData = {
464
+ site: {
465
+ name: 'example',
466
+ keywords: 'power tools, drills',
467
+ search: 'drill',
468
+ content: {
469
+ userrating: '4',
470
+ },
471
+ ext: {
472
+ data: {
473
+ pageType: 'article',
474
+ category: 'repair',
475
+ },
476
+ },
477
+ },
478
+ user: {
479
+ yob: 1985,
480
+ gender: 'm',
481
+ ext: {
482
+ data: {
483
+ registered: true,
484
+ interests: ['cars'],
485
+ },
486
+ },
487
+ },
488
+ };
489
+
490
+ let configStub;
491
+
492
+ beforeEach(() => {
493
+ configStub = sinon.stub(config, 'getConfig');
494
+ configStub.withArgs('ortb2').returns(firstPartyData);
495
+ });
496
+
497
+ afterEach(() => {
498
+ configStub.restore();
499
+ });
500
+
501
+ it('should include first party data in open rtb request, site section', () => {
502
+ const openRtbReq = spec.buildRequests(bidRequests, bidderRequest)[0].data;
503
+
504
+ expect(openRtbReq.site.name).to.equal(firstPartyData.site.name);
505
+ expect(openRtbReq.site.keywords).to.equal(firstPartyData.site.keywords);
506
+ expect(openRtbReq.site.search).to.equal(firstPartyData.site.search);
507
+ expect(openRtbReq.site.content).to.deep.equal(firstPartyData.site.content);
508
+ expect(openRtbReq.site.ext).to.deep.equal(firstPartyData.site.ext);
509
+ });
510
+
511
+ it('should include first party data in open rtb request, user section', () => {
512
+ const openRtbReq = spec.buildRequests(bidRequests, bidderRequest)[0].data;
431
513
 
432
- expect(builtRequest).to.be.undefined;
514
+ expect(openRtbReq.user.yob).to.equal(firstPartyData.user.yob);
515
+ expect(openRtbReq.user.gender).to.equal(firstPartyData.user.gender);
516
+ expect(openRtbReq.user.ext.data).to.deep.equal(firstPartyData.user.ext.data);
517
+ expect(openRtbReq.user.ext.eids).not.to.be.undefined;
433
518
  });
434
519
  });
435
520
  });
@@ -13,6 +13,7 @@ const adomain = ['showheroes.com'];
13
13
 
14
14
  const gdpr = {
15
15
  'gdprConsent': {
16
+ 'apiVersion': 2,
16
17
  'consentString': 'BOEFEAyOEFEAyAHABDENAI4AAAB9vABAASA',
17
18
  'gdprApplies': true
18
19
  }
@@ -332,6 +333,7 @@ describe('shBidAdapter', function () {
332
333
  {
333
334
  'cpm': 5,
334
335
  'creativeId': 'c_38b373e1e31c18',
336
+ 'adUnitCode': 'adunit-code-1',
335
337
  'currency': 'EUR',
336
338
  'width': 640,
337
339
  'height': 480,