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
@@ -94,6 +94,36 @@ const VIDEO_BID = {
94
94
  }
95
95
  }
96
96
 
97
+ const ORTB2_DEVICE = {
98
+ sua: {
99
+ 'source': 2,
100
+ 'platform': {
101
+ 'brand': 'Android',
102
+ 'version': ['8', '0', '0']
103
+ },
104
+ 'browsers': [
105
+ {'brand': 'Not_A Brand', 'version': ['99', '0', '0', '0']},
106
+ {'brand': 'Google Chrome', 'version': ['109', '0', '5414', '119']},
107
+ {'brand': 'Chromium', 'version': ['109', '0', '5414', '119']}
108
+ ],
109
+ 'mobile': 1,
110
+ 'model': 'SM-G955U',
111
+ 'bitness': '64',
112
+ 'architecture': ''
113
+ },
114
+ w: 980,
115
+ h: 1720,
116
+ dnt: 0,
117
+ ua: 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/125.0.6422.80 Mobile/15E148 Safari/604.1',
118
+ language: 'en',
119
+ devicetype: 1,
120
+ make: 'Apple',
121
+ model: 'iPhone 12 Pro Max',
122
+ os: 'iOS',
123
+ osv: '17.4',
124
+ ext: {fiftyonedegrees_deviceId: '17595-133085-133468-18092'},
125
+ };
126
+
97
127
  const BIDDER_REQUEST = {
98
128
  'gdprConsent': {
99
129
  'consentString': 'consent_string',
@@ -129,24 +159,7 @@ const BIDDER_REQUEST = {
129
159
  'gpp_sid': [7],
130
160
  'coppa': 0
131
161
  },
132
- 'device': {
133
- 'sua': {
134
- 'source': 2,
135
- 'platform': {
136
- 'brand': 'Android',
137
- 'version': ['8', '0', '0']
138
- },
139
- 'browsers': [
140
- {'brand': 'Not_A Brand', 'version': ['99', '0', '0', '0']},
141
- {'brand': 'Google Chrome', 'version': ['109', '0', '5414', '119']},
142
- {'brand': 'Chromium', 'version': ['109', '0', '5414', '119']}
143
- ],
144
- 'mobile': 1,
145
- 'model': 'SM-G955U',
146
- 'bitness': '64',
147
- 'architecture': ''
148
- }
149
- },
162
+ device: ORTB2_DEVICE,
150
163
  user: {
151
164
  data: [
152
165
  {
@@ -341,6 +354,7 @@ describe('TwistDigitalBidAdapter', function () {
341
354
  },
342
355
  contentLang: 'en',
343
356
  coppa: 0,
357
+ device: ORTB2_DEVICE,
344
358
  contentData: [{
345
359
  'name': 'example.com',
346
360
  'ext': {
@@ -422,6 +436,7 @@ describe('TwistDigitalBidAdapter', function () {
422
436
  'bitness': '64',
423
437
  'architecture': ''
424
438
  },
439
+ device: ORTB2_DEVICE,
425
440
  url: 'https%3A%2F%2Fwww.greatsite.com',
426
441
  referrer: 'https://www.somereferrer.com',
427
442
  cb: 1000,
@@ -510,6 +525,7 @@ describe('TwistDigitalBidAdapter', function () {
510
525
  'bitness': '64',
511
526
  'architecture': ''
512
527
  },
528
+ device: ORTB2_DEVICE,
513
529
  url: 'https%3A%2F%2Fwww.greatsite.com',
514
530
  referrer: 'https://www.somereferrer.com',
515
531
  cb: 1000,
@@ -456,14 +456,54 @@ describe('User ID', function () {
456
456
  {'mockId2v1': {source: 'mock2source', atype: 2, getEidExt: () => ({v: 1})}}),
457
457
  createMockIdSubmodule('mockId2v2', null, null,
458
458
  {'mockId2v2': {source: 'mock2source', atype: 2, getEidExt: () => ({v: 2})}}),
459
+ createMockIdSubmodule('mockId2v3', null, null, {
460
+ 'mockId2v3'(ids) {
461
+ return {
462
+ source: 'mock2source',
463
+ inserter: 'ins',
464
+ ext: {v: 2},
465
+ uids: ids.map(id => ({id, atype: 2}))
466
+ }
467
+ }
468
+ }),
469
+ createMockIdSubmodule('mockId2v4', null, null, {
470
+ 'mockId2v4'(ids) {
471
+ return ids.map(id => ({
472
+ uids: [{id, atype: 0}],
473
+ source: 'mock2source',
474
+ inserter: 'ins',
475
+ ext: {v: 2}
476
+ }))
477
+ }
478
+ })
479
+ ]);
480
+ });
481
+
482
+ it('should filter out non-string uid returned by generator functions', () => {
483
+ const eids = createEidsArray({
484
+ mockId2v3: [null, 'id1', 123],
485
+ });
486
+ expect(eids[0].uids).to.eql([
487
+ {
488
+ atype: 2,
489
+ id: 'id1'
490
+ }
459
491
  ]);
460
492
  });
461
493
 
462
- it('should group UIDs by source and ext', () => {
494
+ it('should filter out entire EID if none of the uids are strings', () => {
495
+ const eids = createEidsArray({
496
+ mockId2v3: [null],
497
+ });
498
+ expect(eids).to.eql([]);
499
+ })
500
+
501
+ it('should group UIDs by everything except uid', () => {
463
502
  const eids = createEidsArray({
464
503
  mockId1: ['mock-1-1', 'mock-1-2'],
465
504
  mockId2v1: ['mock-2-1', 'mock-2-2'],
466
- mockId2v2: ['mock-2-1', 'mock-2-2']
505
+ mockId2v2: ['mock-2-1', 'mock-2-2'],
506
+ mockId2v3: ['mock-2-1', 'mock-2-2']
467
507
  });
468
508
  expect(eids).to.eql([
469
509
  {
@@ -510,10 +550,50 @@ describe('User ID', function () {
510
550
  atype: 2,
511
551
  }
512
552
  ]
553
+ },
554
+ {
555
+ source: 'mock2source',
556
+ inserter: 'ins',
557
+ ext: {v: 2},
558
+ uids: [
559
+ {
560
+ id: 'mock-2-1',
561
+ atype: 2,
562
+ },
563
+ {
564
+ id: 'mock-2-2',
565
+ atype: 2,
566
+ }
567
+ ]
513
568
  }
514
569
  ])
515
570
  });
516
571
 
572
+ it('should group matching EIDs regardless of entry order', () => {
573
+ const eids = createEidsArray({
574
+ mockId2v3: ['id1', 'id2'],
575
+ mockId2v4: ['id3']
576
+ });
577
+ expect(eids).to.eql([{
578
+ source: 'mock2source',
579
+ inserter: 'ins',
580
+ uids: [
581
+ {
582
+ id: 'id1',
583
+ atype: 2,
584
+ },
585
+ {
586
+ id: 'id2',
587
+ atype: 2
588
+ },
589
+ {
590
+ id: 'id3',
591
+ atype: 0
592
+ }
593
+ ],
594
+ ext: {v: 2}
595
+ }])
596
+ })
517
597
  it('when merging with pubCommonId, should not alter its eids', () => {
518
598
  const uid = {
519
599
  pubProvidedId: [
@@ -705,6 +785,27 @@ describe('User ID', function () {
705
785
  });
706
786
  });
707
787
 
788
+ it('pbjs.getUserIdsAsEids should pass config to eid function', async function () {
789
+ const eidFn = sinon.stub();
790
+ init(config);
791
+ setSubmoduleRegistry([createMockIdSubmodule('mockId', null, null, {
792
+ mockId: eidFn
793
+ })]);
794
+ const moduleConfig = {
795
+ name: 'mockId',
796
+ value: {mockId: 'mockIdValue'},
797
+ some: 'config'
798
+ };
799
+ config.setConfig({
800
+ userSync: {
801
+ auctionDelay: 10,
802
+ userIds: [moduleConfig]
803
+ }
804
+ });
805
+ await getGlobal().getUserIdsAsync();
806
+ sinon.assert.calledWith(eidFn, ['mockIdValue'], moduleConfig);
807
+ })
808
+
708
809
  it('pbjs.getUserIdsAsEids should prioritize user ids according to config available to core', () => {
709
810
  init(config);
710
811
  setSubmoduleRegistry([
@@ -98,6 +98,36 @@ const VIDEO_BID = {
98
98
  }
99
99
  }
100
100
 
101
+ const ORTB2_DEVICE = {
102
+ sua: {
103
+ 'source': 2,
104
+ 'platform': {
105
+ 'brand': 'Android',
106
+ 'version': ['8', '0', '0']
107
+ },
108
+ 'browsers': [
109
+ {'brand': 'Not_A Brand', 'version': ['99', '0', '0', '0']},
110
+ {'brand': 'Google Chrome', 'version': ['109', '0', '5414', '119']},
111
+ {'brand': 'Chromium', 'version': ['109', '0', '5414', '119']}
112
+ ],
113
+ 'mobile': 1,
114
+ 'model': 'SM-G955U',
115
+ 'bitness': '64',
116
+ 'architecture': ''
117
+ },
118
+ w: 980,
119
+ h: 1720,
120
+ dnt: 0,
121
+ ua: 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/125.0.6422.80 Mobile/15E148 Safari/604.1',
122
+ language: 'en',
123
+ devicetype: 1,
124
+ make: 'Apple',
125
+ model: 'iPhone 12 Pro Max',
126
+ os: 'iOS',
127
+ osv: '17.4',
128
+ ext: {fiftyonedegrees_deviceId: '17595-133085-133468-18092'},
129
+ };
130
+
101
131
  const BIDDER_REQUEST = {
102
132
  'gdprConsent': {
103
133
  'consentString': 'consent_string',
@@ -133,24 +163,7 @@ const BIDDER_REQUEST = {
133
163
  'gpp_sid': [7],
134
164
  'coppa': 0
135
165
  },
136
- 'device': {
137
- 'sua': {
138
- 'source': 2,
139
- 'platform': {
140
- 'brand': 'Android',
141
- 'version': ['8', '0', '0']
142
- },
143
- 'browsers': [
144
- {'brand': 'Not_A Brand', 'version': ['99', '0', '0', '0']},
145
- {'brand': 'Google Chrome', 'version': ['109', '0', '5414', '119']},
146
- {'brand': 'Chromium', 'version': ['109', '0', '5414', '119']}
147
- ],
148
- 'mobile': 1,
149
- 'model': 'SM-G955U',
150
- 'bitness': '64',
151
- 'architecture': ''
152
- }
153
- },
166
+ device: ORTB2_DEVICE,
154
167
  user: {
155
168
  data: [
156
169
  {
@@ -346,6 +359,7 @@ describe('VidazooBidAdapter', function () {
346
359
  },
347
360
  contentLang: 'en',
348
361
  coppa: 0,
362
+ device: ORTB2_DEVICE,
349
363
  contentData: [{
350
364
  'name': 'example.com',
351
365
  'ext': {
@@ -430,6 +444,7 @@ describe('VidazooBidAdapter', function () {
430
444
  'bitness': '64',
431
445
  'architecture': ''
432
446
  },
447
+ device: ORTB2_DEVICE,
433
448
  url: 'https%3A%2F%2Fwww.greatsite.com',
434
449
  referrer: 'https://www.somereferrer.com',
435
450
  cb: 1000,
@@ -523,6 +538,7 @@ describe('VidazooBidAdapter', function () {
523
538
  'bitness': '64',
524
539
  'architecture': ''
525
540
  },
541
+ device: ORTB2_DEVICE,
526
542
  url: 'https%3A%2F%2Fwww.greatsite.com',
527
543
  referrer: 'https://www.somereferrer.com',
528
544
  cb: 1000,
@@ -26,6 +26,7 @@ function getPlayerMock() {
26
26
  getVolume: function () {},
27
27
  getConfig: function () {},
28
28
  getHeight: function () {},
29
+ getContainer: function () {},
29
30
  getWidth: function () {},
30
31
  getFullscreen: function () {},
31
32
  getPlaylistItem: function () {},
@@ -51,6 +52,9 @@ function makePlayerFactoryMock(playerMock_) {
51
52
  function getUtilsMock() {
52
53
  return {
53
54
  getJwConfig: function () {},
55
+ getPlayerHeight: function () {},
56
+ getPlayerWidth: function () {},
57
+ getPlayerSizeFromAspectRatio: function () {},
54
58
  getSupportedMediaTypes: function () {},
55
59
  getStartDelay: function () {},
56
60
  getPlacement: function () {},
@@ -212,6 +216,8 @@ describe('JWPlayerProvider', function () {
212
216
  player.getWidth = () => test_width;
213
217
  player.getFullscreen = () => true; //
214
218
 
219
+ utils.getPlayerHeight = () => 100;
220
+ utils.getPlayerWidth = () => 200;
215
221
  utils.getSupportedMediaTypes = () => [test_media_type];
216
222
  utils.getStartDelay = () => test_start_delay;
217
223
  utils.getPlacement = () => test_placement;
@@ -690,6 +696,81 @@ describe('utils', function () {
690
696
  expect(jwConfig.advertising).to.have.property('client', 'vast');
691
697
  });
692
698
  });
699
+
700
+ describe('getPlayerHeight', function () {
701
+ const getPlayerHeight = utils.getPlayerHeight;
702
+
703
+ it('should return height from API when defined', function () {
704
+ const expectedHeight = 500;
705
+ const playerMock = { getHeight: () => expectedHeight };
706
+ expect(getPlayerHeight(playerMock, {})).to.equal(expectedHeight);
707
+ });
708
+
709
+ it('should return height from config when API returns undefined', function () {
710
+ const expectedHeight = 500;
711
+ const playerMock = { getHeight: () => undefined };
712
+ expect(getPlayerHeight(playerMock, { height: 500 })).to.equal(expectedHeight);
713
+ });
714
+ });
715
+
716
+ describe('getPlayerWidth', function () {
717
+ const getPlayerWidth = utils.getPlayerWidth;
718
+
719
+ it('should return width from API when defined', function () {
720
+ const expectedWidth = 1000;
721
+ const playerMock = { getWidth: () => expectedWidth };
722
+ expect(getPlayerWidth(playerMock, {})).to.equal(expectedWidth);
723
+ });
724
+
725
+ it('should return width from config when API returns undefined', function () {
726
+ const expectedWidth = 1000;
727
+ const playerMock = { getWidth: () => undefined };
728
+ expect(getPlayerWidth(playerMock, { width: expectedWidth })).to.equal(expectedWidth);
729
+ });
730
+
731
+ it('should return undefined when width is string', function () {
732
+ const playerMock = { getWidth: () => undefined };
733
+ expect(getPlayerWidth(playerMock, { width: '50%' })).to.be.undefined;
734
+ });
735
+ });
736
+
737
+ describe('getPlayerSizeFromAspectRatio', function () {
738
+ const getPlayerSizeFromAspectRatio = utils.getPlayerSizeFromAspectRatio;
739
+ const testContainer = {
740
+ clientWidth: 640,
741
+ clientHeight: 480
742
+ };
743
+
744
+ it('should return an empty object when width and aspectratio are not strings', function () {
745
+ expect(getPlayerSizeFromAspectRatio({ getContainer: () => testContainer }, {})).to.deep.equal({});
746
+ expect(getPlayerSizeFromAspectRatio({ getContainer: () => testContainer }, {width: 100})).to.deep.equal({});
747
+ expect(getPlayerSizeFromAspectRatio({ getContainer: () => testContainer }, {aspectratio: '1:2', width: 100})).to.deep.equal({});
748
+ });
749
+
750
+ it('should return an empty object when aspectratio is malformed', function () {
751
+ expect(getPlayerSizeFromAspectRatio({ getContainer: () => testContainer }, {aspectratio: '0.5', width: '100%'})).to.deep.equal({});
752
+ expect(getPlayerSizeFromAspectRatio({ getContainer: () => testContainer }, {aspectratio: '1-2', width: '100%'})).to.deep.equal({});
753
+ expect(getPlayerSizeFromAspectRatio({ getContainer: () => testContainer }, {aspectratio: '1:', width: '100%'})).to.deep.equal({});
754
+ expect(getPlayerSizeFromAspectRatio({ getContainer: () => testContainer }, {aspectratio: ':2', width: '100%'})).to.deep.equal({});
755
+ expect(getPlayerSizeFromAspectRatio({ getContainer: () => testContainer }, {aspectratio: ':', width: '100%'})).to.deep.equal({});
756
+ expect(getPlayerSizeFromAspectRatio({ getContainer: () => testContainer }, {aspectratio: '1:2:3', width: '100%'})).to.deep.equal({});
757
+ });
758
+
759
+ it('should return an empty object when player container cannot be obtained', function () {
760
+ expect(getPlayerSizeFromAspectRatio({}, {aspectratio: '1:2', width: '100%'})).to.deep.equal({});
761
+ expect(getPlayerSizeFromAspectRatio({ getContainer: () => undefined }, {aspectratio: '1:2', width: '100%'})).to.deep.equal({});
762
+ });
763
+
764
+ it('should calculate the size given the width percentage and aspect ratio', function () {
765
+ expect(getPlayerSizeFromAspectRatio({ getContainer: () => testContainer }, {aspectratio: '2:1', width: '100%'})).to.deep.equal({ height: 320, width: 640 });
766
+ expect(getPlayerSizeFromAspectRatio({ getContainer: () => testContainer }, {aspectratio: '4:1', width: '70%'})).to.deep.equal({ height: 112, width: 448 });
767
+ });
768
+
769
+ it('should return the container height when smaller than the calculated height', function () {
770
+ expect(getPlayerSizeFromAspectRatio({ getContainer: () => testContainer }, {aspectratio: '1:1', width: '100%'})).to.deep.equal({ height: 480, width: 640 });
771
+ });
772
+ });
773
+
693
774
  describe('getSkipParams', function () {
694
775
  const getSkipParams = utils.getSkipParams;
695
776
 
@@ -52,7 +52,8 @@ describe('wurflRtdProvider', function () {
52
52
  pixel_density: 443,
53
53
  pointing_method: 'touchscreen',
54
54
  resolution_height: 1920,
55
- resolution_width: 1080
55
+ resolution_width: 1080,
56
+ wurfl_id: 'lg_nexus5_ver1',
56
57
  };
57
58
 
58
59
  // expected analytics values
@@ -100,6 +101,7 @@ describe('wurflRtdProvider', function () {
100
101
  const expectedURL = new URL(altHost);
101
102
  expectedURL.searchParams.set('debug', true);
102
103
  expectedURL.searchParams.set('mode', 'prebid');
104
+ expectedURL.searchParams.set('wurfl_id', true);
103
105
 
104
106
  const callback = () => {
105
107
  const v = {
@@ -147,7 +149,8 @@ describe('wurflRtdProvider', function () {
147
149
  pixel_density: 443,
148
150
  pointing_method: 'touchscreen',
149
151
  resolution_height: 1920,
150
- resolution_width: 1080
152
+ resolution_width: 1080,
153
+ wurfl_id: 'lg_nexus5_ver1',
151
154
  },
152
155
  },
153
156
  },
@@ -187,7 +190,8 @@ describe('wurflRtdProvider', function () {
187
190
  model_name: 'Nexus 5',
188
191
  pixel_density: 443,
189
192
  resolution_height: 1920,
190
- resolution_width: 1080
193
+ resolution_width: 1080,
194
+ wurfl_id: 'lg_nexus5_ver1',
191
195
  },
192
196
  },
193
197
  },
@@ -203,6 +207,7 @@ describe('wurflRtdProvider', function () {
203
207
  is_mobile: !0,
204
208
  model_name: 'Nexus 5',
205
209
  brand_name: 'Google',
210
+ wurfl_id: 'lg_nexus5_ver1',
206
211
  },
207
212
  },
208
213
  },
@@ -263,7 +263,7 @@ const REQPARAMS = {
263
263
 
264
264
  const REQPARAMS_GDPR = Object.assign({}, REQPARAMS, {
265
265
  gdpr: true,
266
- consent: 'BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA',
266
+ gdpr_consent: 'BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA',
267
267
  });
268
268
 
269
269
  const REQPARAMS_IAB_CONTENT = Object.assign({}, REQPARAMS, {
@@ -457,8 +457,8 @@ describe('yieldlabBidAdapter', () => {
457
457
  },
458
458
  });
459
459
 
460
- expect(gdprRequest.url).to.include('consent=BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA');
461
- expect(gdprRequest.url).to.include('gdpr=true');
460
+ expect(gdprRequest.url).to.include('&gdpr_consent=BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA');
461
+ expect(gdprRequest.url).to.include('&gdpr=true');
462
462
  });
463
463
 
464
464
  describe('sizes handling', () => {
@@ -691,7 +691,7 @@ describe('yieldlabBidAdapter', () => {
691
691
  const result = spec.interpretResponse({body: [RESPONSE]}, {validBidRequests: [bidRequest], queryParams: REQPARAMS_GDPR});
692
692
 
693
693
  expect(result[0].ad).to.include('&gdpr=true');
694
- expect(result[0].ad).to.include('&consent=BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA');
694
+ expect(result[0].ad).to.include('&gdpr_consent=BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA');
695
695
  });
696
696
 
697
697
  it('should append iab_content to adtag', () => {
@@ -814,7 +814,7 @@ describe('yieldlabBidAdapter', () => {
814
814
  const result = spec.interpretResponse({body: [VIDEO_RESPONSE]}, {validBidRequests: [VIDEO_REQUEST()], queryParams: REQPARAMS_GDPR});
815
815
 
816
816
  expect(result[0].vastUrl).to.include('&gdpr=true');
817
- expect(result[0].vastUrl).to.include('&consent=BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA');
817
+ expect(result[0].vastUrl).to.include('&gdpr_consent=BN5lERiOMYEdiAKAWXEND1AAAAE6DABACMA');
818
818
  });
819
819
 
820
820
  it('should add renderer if outstream context', () => {
@@ -529,6 +529,7 @@ describe('Zeta Global SSP Analytics Adapter', function () {
529
529
  sandbox = sinon.sandbox.create();
530
530
  requests = server.requests;
531
531
  sandbox.stub(events, 'getEvents').returns([]);
532
+ config.setConfig({ pageUrl: 'https://www.config.domain.com/index.html' })
532
533
  });
533
534
 
534
535
  afterEach(function () {
@@ -624,8 +625,8 @@ describe('Zeta Global SSP Analytics Adapter', function () {
624
625
  shortname: 'name'
625
626
  }
626
627
  });
627
- expect(auctionSucceeded.domain).to.eql('test-zeta-ssp.net');
628
- expect(auctionSucceeded.page).to.eql('test-zeta-ssp.net/zeta-ssp/ssp/_dev/examples/page_banner.html');
628
+ expect(auctionSucceeded.domain).to.eql('config.domain.com');
629
+ expect(auctionSucceeded.page).to.eql('https://www.config.domain.com/index.html');
629
630
  expect(auctionSucceeded.bid).to.be.deep.equal({
630
631
  adUnitCode: '/19968336/header-bid-tag-0',
631
632
  adId: '5759bb3ef7be1e8',
@@ -402,7 +402,8 @@ describe('native.js', function () {
402
402
  'returns native data': {
403
403
  renderDataHook(next, bidResponse) {
404
404
  next.bail({
405
- native: getNativeRenderingData(bidResponse, adUnit)
405
+ native: getNativeRenderingData(bidResponse, adUnit),
406
+ rendererVersion: 'native-render-version'
406
407
  });
407
408
  },
408
409
  renderSourceHook(next) {
@@ -433,8 +434,9 @@ describe('native.js', function () {
433
434
  function checkRenderer(message) {
434
435
  if (withRenderer) {
435
436
  expect(message.renderer).to.eql('mock-native-renderer')
437
+ expect(message.rendererVersion).to.eql('native-render-version');
436
438
  Object.entries(message).forEach(([key, val]) => {
437
- if (!['native', 'adId', 'message', 'assets', 'renderer'].includes(key)) {
439
+ if (!['native', 'adId', 'message', 'assets', 'renderer', 'rendererVersion'].includes(key)) {
438
440
  expect(message.native[key]).to.eql(val);
439
441
  }
440
442
  })