prebid.js 7.26.0 → 7.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 (334) hide show
  1. package/.github/workflows/issue_tracker.yml +1 -1
  2. package/dist/33acrossBidAdapter.js +1 -1
  3. package/dist/33acrossIdSystem.js +1 -1
  4. package/dist/adWMGAnalyticsAdapter.js +1 -1
  5. package/dist/adagioAnalyticsAdapter.js +1 -1
  6. package/dist/adagioBidAdapter.js +1 -1
  7. package/dist/adbookpspBidAdapter.js +1 -1
  8. package/dist/adgenerationBidAdapter.js +1 -1
  9. package/dist/adhashBidAdapter.js +1 -1
  10. package/dist/adkernelAdnAnalyticsAdapter.js +1 -1
  11. package/dist/adlooxAdServerVideo.js +1 -1
  12. package/dist/adlooxAnalyticsAdapter.js +1 -1
  13. package/dist/adlooxRtdProvider.js +1 -1
  14. package/dist/admaticBidAdapter.js +1 -1
  15. package/dist/admixerBidAdapter.js +1 -1
  16. package/dist/adomikAnalyticsAdapter.js +1 -1
  17. package/dist/adrelevantisBidAdapter.js +1 -1
  18. package/dist/adtrgtmeBidAdapter.js +1 -1
  19. package/dist/adxcgAnalyticsAdapter.js +1 -1
  20. package/dist/adxcgBidAdapter.js +1 -1
  21. package/dist/adxpremiumAnalyticsAdapter.js +1 -1
  22. package/dist/aidemBidAdapter.js +1 -0
  23. package/dist/ajaBidAdapter.js +1 -1
  24. package/dist/amxBidAdapter.js +1 -1
  25. package/dist/amxIdSystem.js +1 -1
  26. package/dist/analyticsAdapter.js +1 -1
  27. package/dist/appierAnalyticsAdapter.js +1 -1
  28. package/dist/appnexusBidAdapter.js +1 -1
  29. package/dist/asoBidAdapter.js +1 -1
  30. package/dist/atsAnalyticsAdapter.js +1 -1
  31. package/dist/axonixBidAdapter.js +1 -1
  32. package/dist/bidViewability.js +1 -1
  33. package/dist/bidglassBidAdapter.js +1 -1
  34. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  35. package/dist/big-richmediaBidAdapter.js +1 -1
  36. package/dist/bridgewellBidAdapter.js +1 -1
  37. package/dist/brightMountainMediaBidAdapter.js +1 -1
  38. package/dist/browsiRtdProvider.js +1 -1
  39. package/dist/bucksenseBidAdapter.js +1 -1
  40. package/dist/byDataAnalyticsAdapter.js +1 -1
  41. package/dist/carodaBidAdapter.js +1 -1
  42. package/dist/chtnwBidAdapter.js +1 -1
  43. package/dist/concertAnalyticsAdapter.js +1 -1
  44. package/dist/concertBidAdapter.js +1 -1
  45. package/dist/connectadBidAdapter.js +1 -1
  46. package/dist/consentManagement.js +1 -1
  47. package/dist/consentManagementUsp.js +1 -1
  48. package/dist/consumableBidAdapter.js +1 -1
  49. package/dist/conversantAnalyticsAdapter.js +1 -1
  50. package/dist/conversantBidAdapter.js +1 -1
  51. package/dist/craftBidAdapter.js +1 -1
  52. package/dist/criteoBidAdapter.js +1 -1
  53. package/dist/datablocksAnalyticsAdapter.js +1 -1
  54. package/dist/dependencies.json +6 -0
  55. package/dist/dfpAdServerVideo.js +1 -1
  56. package/dist/discoveryBidAdapter.js +1 -1
  57. package/dist/dspxBidAdapter.js +1 -1
  58. package/dist/eplanningAnalyticsAdapter.js +1 -1
  59. package/dist/eplanningBidAdapter.js +1 -1
  60. package/dist/finativeBidAdapter.js +1 -1
  61. package/dist/fintezaAnalyticsAdapter.js +1 -1
  62. package/dist/fluctBidAdapter.js +1 -1
  63. package/dist/ftrackIdSystem.js +1 -1
  64. package/dist/gdprEnforcement.js +1 -1
  65. package/dist/genericAnalyticsAdapter.js +1 -0
  66. package/dist/geoedgeRtdProvider.js +1 -1
  67. package/dist/glimpseBidAdapter.js +1 -1
  68. package/dist/glomexBidAdapter.js +1 -1
  69. package/dist/gmosspBidAdapter.js +1 -1
  70. package/dist/goldbachBidAdapter.js +1 -1
  71. package/dist/googleAnalyticsAdapter.js +1 -1
  72. package/dist/gravitoIdSystem.js +1 -1
  73. package/dist/gridBidAdapter.js +1 -1
  74. package/dist/gridNMBidAdapter.js +1 -1
  75. package/dist/growthCodeAnalyticsAdapter.js +1 -0
  76. package/dist/gumgumBidAdapter.js +1 -1
  77. package/dist/h12mediaBidAdapter.js +1 -1
  78. package/dist/hadronAnalyticsAdapter.js +1 -1
  79. package/dist/id5AnalyticsAdapter.js +1 -1
  80. package/dist/id5IdSystem.js +1 -1
  81. package/dist/impactifyBidAdapter.js +1 -1
  82. package/dist/improvedigitalBidAdapter.js +1 -1
  83. package/dist/inmarBidAdapter.js +1 -1
  84. package/dist/insticatorBidAdapter.js +1 -1
  85. package/dist/invisiblyAnalyticsAdapter.js +1 -1
  86. package/dist/ixBidAdapter.js +1 -1
  87. package/dist/justpremiumBidAdapter.js +1 -1
  88. package/dist/jwplayerRtdProvider.js +1 -1
  89. package/dist/kargoAnalyticsAdapter.js +1 -1
  90. package/dist/kargoBidAdapter.js +1 -1
  91. package/dist/kinessoIdSystem.js +1 -1
  92. package/dist/konduitAnalyticsAdapter.js +1 -1
  93. package/dist/kueezBidAdapter.js +1 -1
  94. package/dist/kueezRtbBidAdapter.js +1 -1
  95. package/dist/lassoBidAdapter.js +1 -1
  96. package/dist/lifestreetBidAdapter.js +1 -1
  97. package/dist/limelightDigitalBidAdapter.js +1 -1
  98. package/dist/liveIntentAnalyticsAdapter.js +1 -1
  99. package/dist/liveIntentIdSystem.js +1 -1
  100. package/dist/livewrappedAnalyticsAdapter.js +1 -1
  101. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  102. package/dist/logicadBidAdapter.js +1 -1
  103. package/dist/loglyliftBidAdapter.js +1 -1
  104. package/dist/lotamePanoramaIdSystem.js +1 -1
  105. package/dist/magniteAnalyticsAdapter.js +1 -1
  106. package/dist/malltvAnalyticsAdapter.js +1 -1
  107. package/dist/marsmediaAnalyticsAdapter.js +1 -1
  108. package/dist/marsmediaBidAdapter.js +1 -1
  109. package/dist/mediafuseBidAdapter.js +1 -1
  110. package/dist/mediagoBidAdapter.js +1 -1
  111. package/dist/medianetAnalyticsAdapter.js +1 -1
  112. package/dist/mediasquareBidAdapter.js +1 -1
  113. package/dist/mgidBidAdapter.js +1 -1
  114. package/dist/minutemediaBidAdapter.js +1 -1
  115. package/dist/nexx360BidAdapter.js +1 -1
  116. package/dist/not-for-prod/prebid.js +206 -202
  117. package/dist/oguryBidAdapter.js +1 -1
  118. package/dist/onetagBidAdapter.js +1 -1
  119. package/dist/ooloAnalyticsAdapter.js +1 -1
  120. package/dist/openxAnalyticsAdapter.js +1 -1
  121. package/dist/optimonAnalyticsAdapter.js +1 -1
  122. package/dist/outbrainBidAdapter.js +1 -1
  123. package/dist/parrableIdSystem.js +1 -1
  124. package/dist/pbsExtensions.js +1 -1
  125. package/dist/pianoDmpAnalyticsAdapter.js +1 -1
  126. package/dist/pixfutureBidAdapter.js +1 -1
  127. package/dist/prebid-core.js +2 -2
  128. package/dist/prebidServerBidAdapter.js +1 -1
  129. package/dist/prebidmanagerAnalyticsAdapter.js +1 -1
  130. package/dist/pubCommonId.js +1 -1
  131. package/dist/pubProvidedIdSystem.js +1 -1
  132. package/dist/publinkIdSystem.js +1 -1
  133. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  134. package/dist/pubmaticBidAdapter.js +1 -1
  135. package/dist/pubperfAnalyticsAdapter.js +1 -1
  136. package/dist/pubstackAnalyticsAdapter.js +1 -1
  137. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  138. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  139. package/dist/pulsepointAnalyticsAdapter.js +1 -1
  140. package/dist/pxyzBidAdapter.js +1 -1
  141. package/dist/quantcastBidAdapter.js +1 -1
  142. package/dist/quantcastIdSystem.js +1 -1
  143. package/dist/rasBidAdapter.js +1 -1
  144. package/dist/readpeakBidAdapter.js +1 -1
  145. package/dist/realvuAnalyticsAdapter.js +1 -1
  146. package/dist/redtramBidAdapter.js +1 -0
  147. package/dist/relaidoBidAdapter.js +1 -1
  148. package/dist/relevantAnalyticsAdapter.js +1 -1
  149. package/dist/rhythmoneBidAdapter.js +1 -1
  150. package/dist/riseBidAdapter.js +1 -1
  151. package/dist/rivrAnalyticsAdapter.js +1 -1
  152. package/dist/roxotAnalyticsAdapter.js +1 -1
  153. package/dist/rtbhouseBidAdapter.js +1 -1
  154. package/dist/rtdModule.js +1 -1
  155. package/dist/rubiconAnalyticsAdapter.js +1 -1
  156. package/dist/rubiconBidAdapter.js +1 -1
  157. package/dist/s2sTesting.js +1 -1
  158. package/dist/scaleableAnalyticsAdapter.js +1 -1
  159. package/dist/schain.js +1 -1
  160. package/dist/seedingAllianceBidAdapter.js +1 -1
  161. package/dist/seedtagBidAdapter.js +1 -1
  162. package/dist/sharedIdSystem.js +1 -1
  163. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  164. package/dist/sharethroughBidAdapter.js +1 -1
  165. package/dist/shinezBidAdapter.js +1 -1
  166. package/dist/sigmoidAnalyticsAdapter.js +1 -1
  167. package/dist/smaatoBidAdapter.js +1 -1
  168. package/dist/smartadserverBidAdapter.js +1 -1
  169. package/dist/smartxBidAdapter.js +1 -1
  170. package/dist/smilewantedBidAdapter.js +1 -1
  171. package/dist/sonobiAnalyticsAdapter.js +1 -1
  172. package/dist/sonobiBidAdapter.js +1 -1
  173. package/dist/sovrnAnalyticsAdapter.js +1 -1
  174. package/dist/sovrnBidAdapter.js +1 -1
  175. package/dist/sspBCBidAdapter.js +1 -1
  176. package/dist/staqAnalyticsAdapter.js +1 -1
  177. package/dist/sublimeBidAdapter.js +1 -1
  178. package/dist/synacormediaBidAdapter.js +1 -1
  179. package/dist/taboolaBidAdapter.js +1 -1
  180. package/dist/tapadIdSystem.js +1 -1
  181. package/dist/targetVideoBidAdapter.js +1 -1
  182. package/dist/teadsBidAdapter.js +1 -1
  183. package/dist/teadsIdSystem.js +1 -1
  184. package/dist/terceptAnalyticsAdapter.js +1 -1
  185. package/dist/trionBidAdapter.js +1 -1
  186. package/dist/tripleliftBidAdapter.js +1 -1
  187. package/dist/ttdBidAdapter.js +1 -1
  188. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  189. package/dist/underdogmediaBidAdapter.js +1 -1
  190. package/dist/undertoneBidAdapter.js +1 -1
  191. package/dist/userId.js +1 -1
  192. package/dist/vidazooBidAdapter.js +1 -1
  193. package/dist/videobyteBidAdapter.js +1 -1
  194. package/dist/visxBidAdapter.js +1 -1
  195. package/dist/vuukleBidAdapter.js +1 -1
  196. package/dist/weboramaRtdProvider.js +1 -1
  197. package/dist/widespaceBidAdapter.js +1 -1
  198. package/dist/winrBidAdapter.js +1 -1
  199. package/dist/yahoosspBidAdapter.js +1 -1
  200. package/dist/yandexBidAdapter.js +1 -1
  201. package/dist/yieldlabBidAdapter.js +1 -1
  202. package/dist/yieldliftBidAdapter.js +1 -1
  203. package/dist/yieldmoBidAdapter.js +1 -1
  204. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  205. package/dist/yuktamediaAnalyticsAdapter.js +1 -1
  206. package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
  207. package/integrationExamples/gpt/growthcode.html +134 -0
  208. package/libraries/analyticsAdapter/AnalyticsAdapter.js +95 -102
  209. package/libraries/ortb2.5StrictTranslator/dsl.js +54 -0
  210. package/libraries/ortb2.5StrictTranslator/spec.js +81 -0
  211. package/libraries/ortb2.5StrictTranslator/translator.js +37 -0
  212. package/libraries/ortb2.5Translator/translator.js +82 -0
  213. package/modules/33acrossIdSystem.js +3 -0
  214. package/modules/adhashBidAdapter.js +115 -30
  215. package/modules/adhashBidAdapter.md +1 -3
  216. package/modules/admaticBidAdapter.js +10 -1
  217. package/modules/admixerBidAdapter.js +1 -1
  218. package/modules/aidemBidAdapter.js +492 -0
  219. package/modules/aidemBidAdapter.md +187 -0
  220. package/modules/browsiRtdProvider.js +6 -4
  221. package/modules/bucksenseBidAdapter.js +1 -1
  222. package/modules/criteoBidAdapter.js +3 -3
  223. package/modules/discoveryBidAdapter.js +3 -0
  224. package/modules/eplanningBidAdapter.js +2 -6
  225. package/modules/fluctBidAdapter.js +5 -0
  226. package/modules/gdprEnforcement.js +26 -24
  227. package/modules/genericAnalyticsAdapter.js +157 -0
  228. package/modules/geoedgeRtdProvider.js +22 -0
  229. package/modules/glomexBidAdapter.js +2 -0
  230. package/modules/gravitoIdSystem.js +3 -4
  231. package/modules/gridBidAdapter.js +1 -1
  232. package/modules/gridNMBidAdapter.js +1 -1
  233. package/modules/growthCodeAnalyticsAdapter.js +176 -0
  234. package/modules/growthCodeAnalyticsAdapter.md +41 -0
  235. package/modules/impactifyBidAdapter.js +19 -1
  236. package/modules/jwplayerRtdProvider.js +1 -2
  237. package/modules/kargoBidAdapter.js +1 -1
  238. package/modules/lassoBidAdapter.js +8 -4
  239. package/modules/limelightDigitalBidAdapter.js +1 -1
  240. package/modules/liveIntentIdSystem.js +1 -2
  241. package/modules/mediagoBidAdapter.js +2 -1
  242. package/modules/minutemediaBidAdapter.md +3 -3
  243. package/modules/nexx360BidAdapter.js +264 -138
  244. package/modules/openxBidAdapter.md +15 -14
  245. package/modules/pubCommonId.js +2 -1
  246. package/modules/pubProvidedIdSystem.js +2 -0
  247. package/modules/rasBidAdapter.js +8 -3
  248. package/modules/rasBidAdapter.md +16 -15
  249. package/modules/redtramBidAdapter.js +155 -0
  250. package/modules/redtramBidAdapter.md +33 -0
  251. package/modules/riseBidAdapter.js +15 -0
  252. package/modules/riseBidAdapter.md +3 -3
  253. package/modules/rtbhouseBidAdapter.js +90 -29
  254. package/modules/rubiconBidAdapter.js +2 -1
  255. package/modules/seedtagBidAdapter.js +67 -56
  256. package/modules/seedtagBidAdapter.md +60 -0
  257. package/modules/sharedIdSystem.js +3 -1
  258. package/modules/smartxBidAdapter.js +1 -1
  259. package/modules/smnBidAdapter.md +52 -0
  260. package/modules/taboolaBidAdapter.js +20 -7
  261. package/modules/tripleliftBidAdapter.js +1 -1
  262. package/modules/ttdBidAdapter.js +4 -0
  263. package/modules/vidazooBidAdapter.js +31 -8
  264. package/modules/yandexBidAdapter.js +85 -19
  265. package/modules/yandexBidAdapter.md +7 -7
  266. package/modules/yieldlabBidAdapter.js +10 -4
  267. package/modules/yieldliftBidAdapter.js +3 -3
  268. package/package.json +2 -2
  269. package/src/auction.js +30 -4
  270. package/src/consentHandler.js +8 -0
  271. package/src/constants.json +2 -1
  272. package/src/events.js +4 -0
  273. package/src/native.js +31 -20
  274. package/src/refererDetection.js +6 -1
  275. package/src/storageManager.js +6 -3
  276. package/test/helpers/analytics.js +34 -0
  277. package/test/helpers/refererDetectionHelper.js +88 -0
  278. package/test/mocks/analyticsStub.js +3 -1
  279. package/test/spec/AnalyticsAdapter_spec.js +119 -116
  280. package/test/spec/auctionmanager_spec.js +119 -1
  281. package/test/spec/modules/33acrossIdSystem_spec.js +4 -1
  282. package/test/spec/modules/adWMGAnalyticsAdapter_spec.js +10 -8
  283. package/test/spec/modules/adagioAnalyticsAdapter_spec.js +18 -25
  284. package/test/spec/modules/adhashBidAdapter_spec.js +65 -11
  285. package/test/spec/modules/aidemBidAdapter_spec.js +664 -0
  286. package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +0 -2
  287. package/test/spec/modules/browsiRtdProvider_spec.js +2 -1
  288. package/test/spec/modules/concertAnalyticsAdapter_spec.js +2 -4
  289. package/test/spec/modules/enrichmentFpdModule_spec.js +3 -2
  290. package/test/spec/modules/eplanningAnalyticsAdapter_spec.js +0 -3
  291. package/test/spec/modules/eplanningBidAdapter_spec.js +4 -4
  292. package/test/spec/modules/fluctBidAdapter_spec.js +37 -1
  293. package/test/spec/modules/fpdModule_spec.js +1 -1
  294. package/test/spec/modules/gdprEnforcement_spec.js +115 -68
  295. package/test/spec/modules/genericAnalyticsAdapter_spec.js +284 -0
  296. package/test/spec/modules/geoedgeRtdProvider_spec.js +15 -0
  297. package/test/spec/modules/glomexBidAdapter_spec.js +4 -0
  298. package/test/spec/modules/gravitoIdSystem_spec.js +1 -1
  299. package/test/spec/modules/growthCodeAnalyticsAdapter_spec.js +70 -0
  300. package/test/spec/modules/impactifyBidAdapter_spec.js +13 -0
  301. package/test/spec/modules/invisiblyAnalyticsAdapter_spec.js +17 -27
  302. package/test/spec/modules/jwplayerRtdProvider_spec.js +3 -3
  303. package/test/spec/modules/konduitAnalyticsAdapter_spec.js +0 -2
  304. package/test/spec/modules/liveIntentAnalyticsAdapter_spec.js +3 -6
  305. package/test/spec/modules/medianetAnalyticsAdapter_spec.js +7 -1
  306. package/test/spec/modules/nexx360BidAdapter_spec.js +441 -221
  307. package/test/spec/modules/optimonAnalyticsAdapter_spec.js +3 -11
  308. package/test/spec/modules/pianoDmpAnalyticsAdapter_spec.js +4 -11
  309. package/test/spec/modules/prebidmanagerAnalyticsAdapter_spec.js +3 -12
  310. package/test/spec/modules/pubperfAnalyticsAdapter_spec.js +6 -19
  311. package/test/spec/modules/pubstackAnalyticsAdapter_spec.js +3 -17
  312. package/test/spec/modules/pubwiseAnalyticsAdapter_spec.js +13 -19
  313. package/test/spec/modules/rasBidAdapter_spec.js +5 -1
  314. package/test/spec/modules/redtramBidAdapter_spec.js +256 -0
  315. package/test/spec/modules/riseBidAdapter_spec.js +24 -0
  316. package/test/spec/modules/rtbhouseBidAdapter_spec.js +79 -0
  317. package/test/spec/modules/seedtagBidAdapter_spec.js +65 -92
  318. package/test/spec/modules/sigmoidAnalyticsAdapter_spec.js +4 -8
  319. package/test/spec/modules/sovrnAnalyticsAdapter_spec.js +6 -18
  320. package/test/spec/modules/taboolaBidAdapter_spec.js +39 -0
  321. package/test/spec/modules/tripleliftBidAdapter_spec.js +3 -10
  322. package/test/spec/modules/ttdBidAdapter_spec.js +50 -9
  323. package/test/spec/modules/vidazooBidAdapter_spec.js +173 -27
  324. package/test/spec/modules/yandexBidAdapter_spec.js +22 -13
  325. package/test/spec/modules/yieldlabBidAdapter_spec.js +49 -20
  326. package/test/spec/modules/yieldliftBidAdapter_spec.js +1 -1
  327. package/test/spec/modules/yieldoneAnalyticsAdapter_spec.js +5 -2
  328. package/test/spec/native_spec.js +68 -56
  329. package/test/spec/ortb2.5StrictTranslator/dsl_spec.js +137 -0
  330. package/test/spec/ortb2.5StrictTranslator/spec_spec.js +358 -0
  331. package/test/spec/ortb2.5StrictTranslator/translator_spec.js +16 -0
  332. package/test/spec/ortb2.5Translator/translator_spec.js +64 -0
  333. package/test/spec/refererDetection_spec.js +46 -95
  334. package/test/spec/unit/core/storageManager_spec.js +2 -1
@@ -1,4 +1,5 @@
1
1
  import { expect } from 'chai';
2
+ import {config} from 'src/config.js';
2
3
  import { getRefererInfo } from 'src/refererDetection.js';
3
4
  import {processFpd, coreStorage, resetEnrichments} from 'modules/enrichmentFpdModule.js';
4
5
  import * as enrichmentModule from 'modules/enrichmentFpdModule.js';
@@ -77,10 +78,10 @@ describe('the first party data enrichment module', function() {
77
78
  expect(validated.site.keywords).to.be.undefined;
78
79
  });
79
80
 
80
- it('adds page domain values if canonical url exists', function() {
81
+ it('adds page domain values if pageUrl url exists', function() {
82
+ config.setConfig({'pageUrl': 'https://www.subdomain.domain.co.uk/path?query=12345'});
81
83
  width = 800;
82
84
  height = 500;
83
- canonical.href = 'https://www.subdomain.domain.co.uk/path?query=12345';
84
85
 
85
86
  let validated = syncProcessFpd({}, {}).global;
86
87
 
@@ -152,9 +152,6 @@ describe('eplanning analytics adapter', function () {
152
152
 
153
153
  // Step 10 check that the host to send the ajax request is configurable via options
154
154
  expect(eplAnalyticsAdapter.context.host).to.equal(initOptions.host);
155
-
156
- // Step 11 verify that we received 7 events (6 E-Planning events + 1 Clean.io event)
157
- sinon.assert.callCount(eplAnalyticsAdapter.track, 7);
158
155
  });
159
156
  });
160
157
  });
@@ -840,7 +840,7 @@ describe('E-Planning Adapter', function () {
840
840
  });
841
841
 
842
842
  it('should correctly map the parameters in the response vast', function () {
843
- const bidResponse = spec.interpretResponse(responseVast, { adUnitToBidId: { [CLEAN_ADUNIT_CODE_VAST]: BID_ID } })[0];
843
+ const bidResponse = spec.interpretResponse(responseVast, { adUnitToBidId: { [CLEAN_ADUNIT_CODE_VAST]: BID_ID }, data: { vv: 2 } })[0];
844
844
  const expectedResponse = {
845
845
  requestId: BID_ID,
846
846
  cpm: CPM,
@@ -851,13 +851,13 @@ describe('E-Planning Adapter', function () {
851
851
  netRevenue: true,
852
852
  currency: 'USD',
853
853
  vastXml: ADM_VAST,
854
- mediaTypes: VIDEO
854
+ mediaType: VIDEO
855
855
  };
856
856
  expect(bidResponse).to.deep.equal(expectedResponse);
857
857
  });
858
858
 
859
859
  it('should correctly map the parameters in the response vast vv 1', function () {
860
- const bidResponse = spec.interpretResponse(responseVastVV1, { adUnitToBidId: { [CLEAN_ADUNIT_CODE_VAST]: BID_ID } })[0];
860
+ const bidResponse = spec.interpretResponse(responseVastVV1, { adUnitToBidId: { [CLEAN_ADUNIT_CODE_VAST]: BID_ID }, data: { vv: 1 } })[0];
861
861
  const expectedResponse = {
862
862
  requestId: BID_ID,
863
863
  cpm: CPM,
@@ -868,7 +868,7 @@ describe('E-Planning Adapter', function () {
868
868
  netRevenue: true,
869
869
  currency: 'USD',
870
870
  vastXml: ADM_VAST_VV_1,
871
- mediaTypes: VIDEO
871
+ mediaType: VIDEO
872
872
  };
873
873
  expect(bidResponse).to.deep.equal(expectedResponse);
874
874
  });
@@ -94,7 +94,12 @@ describe('fluctAdapter', function () {
94
94
  expect(request.data.params.kv).to.eql(undefined);
95
95
  });
96
96
 
97
- it('includes filtered user.eids if any exists', function () {
97
+ it('includes no data.schain by default', function () {
98
+ const request = spec.buildRequests(bidRequests, bidderRequest)[0];
99
+ expect(request.data.schain).to.eql(undefined);
100
+ });
101
+
102
+ it('includes filtered user.eids if any exist', function () {
98
103
  const bidRequests2 = bidRequests.map(
99
104
  (bidReq) => Object.assign(bidReq, {
100
105
  userIdAsEids: [
@@ -175,6 +180,37 @@ describe('fluctAdapter', function () {
175
180
  imsids: ['imsid1', 'imsid2']
176
181
  });
177
182
  });
183
+
184
+ it('includes data.schain if any exists', function () {
185
+ // this should be done by schain.js
186
+ const bidRequests2 = bidRequests.map(
187
+ (bidReq) => Object.assign(bidReq, {
188
+ schain: {
189
+ ver: '1.0',
190
+ complete: 1,
191
+ nodes: [
192
+ {
193
+ asi: 'example.com',
194
+ sid: 'publisher-id',
195
+ hp: 1
196
+ }
197
+ ]
198
+ }
199
+ })
200
+ );
201
+ const request = spec.buildRequests(bidRequests2, bidderRequest)[0];
202
+ expect(request.data.schain).to.eql({
203
+ ver: '1.0',
204
+ complete: 1,
205
+ nodes: [
206
+ {
207
+ asi: 'example.com',
208
+ sid: 'publisher-id',
209
+ hp: 1
210
+ }
211
+ ]
212
+ });
213
+ });
178
214
  });
179
215
 
180
216
  describe('interpretResponse', function() {
@@ -130,7 +130,7 @@ describe('the first party data module', function () {
130
130
  }
131
131
  };
132
132
 
133
- canonical.href = 'https://www.domain.com/path?query=12345';
133
+ config.setConfig({'pageUrl': 'https://www.domain.com/path?query=12345'});
134
134
  width = 1120;
135
135
  height = 750;
136
136
 
@@ -20,6 +20,7 @@ import * as events from 'src/events.js';
20
20
  import 'modules/appnexusBidAdapter.js'; // some tests expect this to be in the adapter registry
21
21
  import 'src/prebid.js'
22
22
  import {hook} from '../../../src/hook.js';
23
+ import {VENDORLESS_GVLID} from '../../../src/consentHandler.js';
23
24
 
24
25
  describe('gdpr enforcement', function () {
25
26
  let nextFnSpy;
@@ -150,13 +151,13 @@ describe('gdpr enforcement', function () {
150
151
  }
151
152
  });
152
153
 
153
- deviceAccessHook(nextFnSpy, false);
154
+ deviceAccessHook(nextFnSpy);
154
155
  expect(nextFnSpy.calledOnce).to.equal(true);
155
156
  let result = {
156
157
  hasEnforcementHook: true,
157
158
  valid: false
158
159
  }
159
- sinon.assert.calledWith(nextFnSpy, false, undefined, undefined, result);
160
+ sinon.assert.calledWith(nextFnSpy, undefined, undefined, result);
160
161
  });
161
162
 
162
163
  it('should only check for consent for vendor exceptions when enforcePurpose and enforceVendor are false', function () {
@@ -178,8 +179,8 @@ describe('gdpr enforcement', function () {
178
179
  consentData.apiVersion = 2;
179
180
  gdprDataHandlerStub.returns(consentData);
180
181
 
181
- deviceAccessHook(nextFnSpy, false, 1, 'appnexus');
182
- deviceAccessHook(nextFnSpy, false, 5, 'rubicon');
182
+ deviceAccessHook(nextFnSpy, 1, 'appnexus');
183
+ deviceAccessHook(nextFnSpy, 5, 'rubicon');
183
184
  expect(logWarnSpy.callCount).to.equal(0);
184
185
  });
185
186
 
@@ -201,8 +202,8 @@ describe('gdpr enforcement', function () {
201
202
  consentData.apiVersion = 2;
202
203
  gdprDataHandlerStub.returns(consentData);
203
204
 
204
- deviceAccessHook(nextFnSpy, false, 1, 'appnexus');
205
- deviceAccessHook(nextFnSpy, false, 3, 'rubicon');
205
+ deviceAccessHook(nextFnSpy, 1, 'appnexus');
206
+ deviceAccessHook(nextFnSpy, 3, 'rubicon');
206
207
  expect(logWarnSpy.callCount).to.equal(1);
207
208
  });
208
209
 
@@ -224,13 +225,13 @@ describe('gdpr enforcement', function () {
224
225
  consentData.apiVersion = 2;
225
226
  gdprDataHandlerStub.returns(consentData);
226
227
 
227
- deviceAccessHook(nextFnSpy, false, 1, 'appnexus');
228
+ deviceAccessHook(nextFnSpy, 1, 'appnexus');
228
229
  expect(nextFnSpy.calledOnce).to.equal(true);
229
230
  let result = {
230
231
  hasEnforcementHook: true,
231
232
  valid: true
232
233
  }
233
- sinon.assert.calledWith(nextFnSpy, false, 1, 'appnexus', result);
234
+ sinon.assert.calledWith(nextFnSpy, 1, 'appnexus', result);
234
235
  });
235
236
 
236
237
  it('should use gvlMapping set by publisher', function() {
@@ -255,13 +256,13 @@ describe('gdpr enforcement', function () {
255
256
  consentData.apiVersion = 2;
256
257
  gdprDataHandlerStub.returns(consentData);
257
258
 
258
- deviceAccessHook(nextFnSpy, false, 1, 'appnexus');
259
+ deviceAccessHook(nextFnSpy, 1, 'appnexus');
259
260
  expect(nextFnSpy.calledOnce).to.equal(true);
260
261
  let result = {
261
262
  hasEnforcementHook: true,
262
263
  valid: true
263
264
  }
264
- sinon.assert.calledWith(nextFnSpy, false, 4, 'appnexus', result);
265
+ sinon.assert.calledWith(nextFnSpy, 4, 'appnexus', result);
265
266
  config.resetConfig();
266
267
  });
267
268
 
@@ -290,31 +291,17 @@ describe('gdpr enforcement', function () {
290
291
  consentData.apiVersion = 2;
291
292
  gdprDataHandlerStub.returns(consentData);
292
293
 
293
- deviceAccessHook(nextFnSpy, false, 1, 'appnexus');
294
+ deviceAccessHook(nextFnSpy, 1, 'appnexus');
294
295
  expect(nextFnSpy.calledOnce).to.equal(true);
295
296
  let result = {
296
297
  hasEnforcementHook: true,
297
298
  valid: true
298
299
  }
299
- sinon.assert.calledWith(nextFnSpy, false, 4, 'appnexus', result);
300
+ sinon.assert.calledWith(nextFnSpy, 4, 'appnexus', result);
300
301
  config.resetConfig();
301
302
  curBidderStub.restore();
302
303
  });
303
304
 
304
- it(`should mark module as vendorless for rule validation when isVendorless = true and ${STRICT_STORAGE_ENFORCEMENT} is set`, () => {
305
- setEnforcementConfig({
306
- [STRICT_STORAGE_ENFORCEMENT]: true
307
- });
308
- let consentData = {
309
- vendorData: staticConfig.consentData.getTCData,
310
- gdprApplies: true
311
- }
312
- gdprDataHandlerStub.returns(consentData);
313
- const validate = sinon.stub().callsFake(() => true);
314
- deviceAccessHook(nextFnSpy, true, 123, 'mockModule', undefined, {validate});
315
- expect(validate.args[0][4]('mockModule')).to.be.true;
316
- });
317
-
318
305
  it(`should not enforce consent for vendorless modules if ${STRICT_STORAGE_ENFORCEMENT} is not set`, () => {
319
306
  setEnforcementConfig({});
320
307
  let consentData = {
@@ -323,9 +310,9 @@ describe('gdpr enforcement', function () {
323
310
  }
324
311
  gdprDataHandlerStub.returns(consentData);
325
312
  const validate = sinon.stub().callsFake(() => false);
326
- deviceAccessHook(nextFnSpy, true, 123, 'mockModule', undefined, {validate});
313
+ deviceAccessHook(nextFnSpy, VENDORLESS_GVLID, 'mockModule', undefined, {validate});
327
314
  sinon.assert.callCount(validate, 0);
328
- sinon.assert.calledWith(nextFnSpy, true, 123, 'mockModule', {hasEnforcementHook: true, valid: true});
315
+ sinon.assert.calledWith(nextFnSpy, VENDORLESS_GVLID, 'mockModule', {hasEnforcementHook: true, valid: true});
329
316
  })
330
317
  });
331
318
 
@@ -804,11 +791,12 @@ describe('gdpr enforcement', function () {
804
791
  });
805
792
 
806
793
  describe('validateRules', function () {
807
- const createGdprRule = (purposeName = 'storage', enforcePurpose = true, enforceVendor = true, vendorExceptions = []) => ({
794
+ const createGdprRule = (purposeName = 'storage', enforcePurpose = true, enforceVendor = true, vendorExceptions = [], softVendorExceptions = []) => ({
808
795
  purpose: purposeName,
809
- enforcePurpose: enforcePurpose,
810
- enforceVendor: enforceVendor,
811
- vendorExceptions: vendorExceptions
796
+ enforcePurpose,
797
+ enforceVendor,
798
+ vendorExceptions,
799
+ softVendorExceptions,
812
800
  });
813
801
 
814
802
  const consentData = {
@@ -922,6 +910,19 @@ describe('gdpr enforcement', function () {
922
910
  expect(isAllowed).to.equal(true);
923
911
  });
924
912
 
913
+ describe('when the vendor has a softVendorException', () => {
914
+ const gdprRule = createGdprRule('storage', true, true, [], [vendorBlockedModule]);
915
+
916
+ it('should return false if general consent was not given', () => {
917
+ const isAllowed = validateRules(gdprRule, consentDataWithPurposeConsentFalse, vendorBlockedModule, vendorBlockedGvlId);
918
+ expect(isAllowed).to.be.false;
919
+ })
920
+ it('should return true if general consent was given', () => {
921
+ const isAllowed = validateRules(gdprRule, consentData, vendorBlockedModule, vendorBlockedGvlId);
922
+ expect(isAllowed).to.be.true;
923
+ })
924
+ })
925
+
925
926
  describe('when module does not need vendor consent', () => {
926
927
  Object.entries({
927
928
  'storage': 1,
@@ -937,11 +938,9 @@ describe('gdpr enforcement', function () {
937
938
  it(`should be ${t} when purpose is ${t}`, () => {
938
939
  const consent = utils.deepClone(consentData);
939
940
  consent.vendorData.purpose.consents[purposeNo] = consentGiven;
940
- // vendor consent (and gvlid) should be ignored
941
- consent.vendorData.vendor.consents[123] = !consentGiven;
942
941
  // take legitimate interest out of the picture for this test
943
942
  consent.vendorData.purpose.legitimateInterests = {};
944
- const actual = validateRules(rule, consent, 'mockModule', 123, () => true);
943
+ const actual = validateRules(rule, consent, 'mockModule', VENDORLESS_GVLID);
945
944
  expect(actual).to.equal(consentGiven);
946
945
  })
947
946
  })
@@ -1131,56 +1130,104 @@ describe('gdpr enforcement', function () {
1131
1130
  })
1132
1131
  });
1133
1132
 
1134
- describe('getGvlid', function() {
1133
+ describe('gvlid resolution', () => {
1135
1134
  let sandbox;
1136
- let getGvlidForBidAdapterStub;
1137
- let getGvlidForUserIdModuleStub;
1138
- let getGvlidForAnalyticsAdapterStub;
1139
1135
  beforeEach(function() {
1140
1136
  sandbox = sinon.createSandbox();
1141
- getGvlidForBidAdapterStub = sandbox.stub(internal, 'getGvlidForBidAdapter');
1142
- getGvlidForUserIdModuleStub = sandbox.stub(internal, 'getGvlidForUserIdModule');
1143
- getGvlidForAnalyticsAdapterStub = sandbox.stub(internal, 'getGvlidForAnalyticsAdapter');
1144
1137
  });
1138
+
1145
1139
  afterEach(function() {
1146
1140
  sandbox.restore();
1147
1141
  config.resetConfig();
1148
1142
  });
1149
1143
 
1150
- it('should return "null" if called without passing any argument', function() {
1151
- const gvlid = getGvlid();
1152
- expect(gvlid).to.equal(null);
1153
- });
1144
+ describe('getGvlid', function() {
1145
+ let getGvlidForBidAdapterStub;
1146
+ let getGvlidForUserIdModuleStub;
1147
+ let getGvlidForAnalyticsAdapterStub;
1148
+ beforeEach(function() {
1149
+ getGvlidForBidAdapterStub = sandbox.stub(internal, 'getGvlidForBidAdapter');
1150
+ getGvlidForUserIdModuleStub = sandbox.stub(internal, 'getGvlidForUserIdModule');
1151
+ getGvlidForAnalyticsAdapterStub = sandbox.stub(internal, 'getGvlidForAnalyticsAdapter');
1152
+ });
1154
1153
 
1155
- it('should return "null" if GVL ID is not defined for any of these modules: Bid adapter, UserId submodule and Analytics adapter', function() {
1156
- getGvlidForBidAdapterStub.withArgs('moduleA').returns(null);
1157
- getGvlidForUserIdModuleStub.withArgs('moduleA').returns(null);
1158
- getGvlidForAnalyticsAdapterStub.withArgs('moduleA').returns(null);
1154
+ it('should return "null" if called without passing any argument', function() {
1155
+ const gvlid = getGvlid();
1156
+ expect(gvlid).to.equal(null);
1157
+ });
1159
1158
 
1160
- const gvlid = getGvlid('moduleA');
1161
- expect(gvlid).to.equal(null);
1162
- });
1159
+ it('should return "null" if GVL ID is not defined for any of these modules: Bid adapter, UserId submodule and Analytics adapter', function() {
1160
+ getGvlidForBidAdapterStub.withArgs('moduleA').returns(null);
1161
+ getGvlidForUserIdModuleStub.withArgs('moduleA').returns(null);
1162
+ getGvlidForAnalyticsAdapterStub.withArgs('moduleA').returns(null);
1163
1163
 
1164
- it('should return the GVL ID from gvlMapping if it is defined in setConfig', function() {
1165
- config.setConfig({
1166
- gvlMapping: {
1167
- moduleA: 1
1168
- }
1164
+ const gvlid = getGvlid('moduleA');
1165
+ expect(gvlid).to.equal(null);
1166
+ });
1167
+
1168
+ it('should return the GVL ID from gvlMapping if it is defined in setConfig', function() {
1169
+ config.setConfig({
1170
+ gvlMapping: {
1171
+ moduleA: 1
1172
+ }
1173
+ });
1174
+
1175
+ // Actual GVL ID for moduleA is 2, as defined on its the bidAdapter.js file.
1176
+ getGvlidForBidAdapterStub.withArgs('moduleA').returns(2);
1177
+
1178
+ const gvlid = getGvlid('moduleA');
1179
+ expect(gvlid).to.equal(1);
1169
1180
  });
1170
1181
 
1171
- // Actual GVL ID for moduleA is 2, as defined on its the bidAdapter.js file.
1172
- getGvlidForBidAdapterStub.withArgs('moduleA').returns(2);
1182
+ it('should return the GVL ID by calling getGvlidForBidAdapter -> getGvlidForUserIdModule -> getGvlidForAnalyticsAdapter in sequence', function() {
1183
+ getGvlidForBidAdapterStub.withArgs('moduleA').returns(null);
1184
+ getGvlidForUserIdModuleStub.withArgs('moduleA').returns(null);
1185
+ getGvlidForAnalyticsAdapterStub.withArgs('moduleA').returns(7);
1186
+
1187
+ expect(getGvlid('moduleA')).to.equal(7);
1188
+ });
1173
1189
 
1174
- const gvlid = getGvlid('moduleA');
1175
- expect(gvlid).to.equal(1);
1190
+ it('should pass extra arguments to analytics\' getGvlid', () => {
1191
+ getGvlidForAnalyticsAdapterStub.withArgs('analytics').returns(321);
1192
+ const cfg = {some: 'args'};
1193
+ getGvlid('analytics', cfg);
1194
+ sinon.assert.calledWith(getGvlidForAnalyticsAdapterStub, 'analytics', cfg);
1195
+ });
1176
1196
  });
1177
1197
 
1178
- it('should return the GVL ID by calling getGvlidForBidAdapter -> getGvlidForUserIdModule -> getGvlidForAnalyticsAdapter in sequence', function() {
1179
- getGvlidForBidAdapterStub.withArgs('moduleA').returns(null);
1180
- getGvlidForUserIdModuleStub.withArgs('moduleA').returns(null);
1181
- getGvlidForAnalyticsAdapterStub.withArgs('moduleA').returns(7);
1198
+ describe('getGvlidForAnalyticsAdapter', () => {
1199
+ let getAnalyticsAdapter, adapter, adapterEntry;
1200
+
1201
+ beforeEach(() => {
1202
+ adapter = {};
1203
+ adapterEntry = {
1204
+ adapter
1205
+ };
1206
+ getAnalyticsAdapter = sandbox.stub(adapterManager, 'getAnalyticsAdapter');
1207
+ getAnalyticsAdapter.withArgs('analytics').returns(adapterEntry);
1208
+ });
1209
+
1210
+ it('should return gvlid from adapterManager if defined', () => {
1211
+ adapterEntry.gvlid = 123;
1212
+ adapter.gvlid = 321
1213
+ expect(internal.getGvlidForAnalyticsAdapter('analytics')).to.equal(123);
1214
+ });
1215
+
1216
+ it('should return gvlid from adapter if defined', () => {
1217
+ adapter.gvlid = 321;
1218
+ expect(internal.getGvlidForAnalyticsAdapter('analytics')).to.equal(321);
1219
+ });
1182
1220
 
1183
- expect(getGvlid('moduleA')).to.equal(7);
1221
+ it('should invoke adapter.gvlid if it\'s a function', () => {
1222
+ adapter.gvlid = (cfg) => cfg.k
1223
+ const cfg = {k: 231};
1224
+ expect(internal.getGvlidForAnalyticsAdapter('analytics', cfg)).to.eql(231);
1225
+ });
1226
+
1227
+ it('should not choke if adapter gvlid fn throws', () => {
1228
+ adapter.gvlid = () => { throw new Error(); };
1229
+ expect(internal.getGvlidForAnalyticsAdapter('analytics')).to.not.be.ok;
1230
+ });
1184
1231
  });
1185
- });
1232
+ })
1186
1233
  });