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
@@ -12,10 +12,11 @@ Yandex Bidder Adapter for Prebid.js.
12
12
 
13
13
  # Parameters
14
14
 
15
- | Name | Scope | Description | Example | Type |
16
- |---------------|----------|-------------------------|-----------|-----------|
17
- | `pageId` | required | Page ID | `123` | `Integer` |
18
- | `impId` | required | Block ID | `1` | `Integer` |
15
+ | Name | Required? | Description | Example | Type |
16
+ |---------------|--------------------------------------------|-------------|---------|-----------|
17
+ | `placementId` | Yes | Block ID | `123-1` | `String` |
18
+ | `pageId` | No<br>Deprecated. Please use `placementId` | Page ID | `123` | `Integer` |
19
+ | `impId` | No<br>Deprecated. Please use `placementId` | Imp ID | `1` | `Integer` |
19
20
 
20
21
  # Test Parameters
21
22
 
@@ -24,15 +25,14 @@ var adUnits = [{
24
25
  code: 'banner-1',
25
26
  mediaTypes: {
26
27
  banner: {
27
- sizes: [[240, 400]],
28
+ sizes: [[240, 400], [300, 600]],
28
29
  }
29
30
  },
30
31
  bids: [{
31
32
  {
32
33
  bidder: 'yandex',
33
34
  params: {
34
- pageId: 346580,
35
- impId: 143,
35
+ placementId: '346580-1'
36
36
  },
37
37
  }
38
38
  }]
@@ -41,6 +41,7 @@ export const spec = {
41
41
 
42
42
  const adslotIds = []
43
43
  const adslotSizes = [];
44
+ const adslotFloors = [];
44
45
  const timestamp = Date.now()
45
46
  const query = {
46
47
  ts: timestamp,
@@ -77,7 +78,7 @@ export const spec = {
77
78
  }
78
79
  const floor = getBidFloor(bid, sizes)
79
80
  if (floor) {
80
- query.floor = floor;
81
+ adslotFloors.push(bid.params.adslotId + ':' + floor);
81
82
  }
82
83
  })
83
84
 
@@ -99,6 +100,11 @@ export const spec = {
99
100
  if (adslotSizes.length > 0) {
100
101
  query.sizes = adslotSizes.join(',')
101
102
  }
103
+
104
+ if (adslotFloors.length > 0) {
105
+ query.floor = adslotFloors.join(',')
106
+ }
107
+
102
108
  const queryString = createQueryString(query)
103
109
 
104
110
  return {
@@ -463,7 +469,7 @@ function extractSizes(bid) {
463
469
  *
464
470
  * @param {Object} bid
465
471
  * @param {string[]} sizes
466
- * @returns The floor CPM of a matched rule based on the rule selection process (mediaType, size and currency),
472
+ * @returns The floor CPM in cents of a matched rule based on the rule selection process (mediaType, size and currency),
467
473
  * using the getFloor() inputs. Multi sizes and unsupported media types will default to '*'
468
474
  */
469
475
  function getBidFloor(bid, sizes) {
@@ -475,10 +481,10 @@ function getBidFloor(bid, sizes) {
475
481
  const floor = bid.getFloor({
476
482
  currency: CURRENCY_CODE,
477
483
  mediaType: mediaType !== undefined && spec.supportedMediaTypes.includes(mediaType) ? mediaType : '*',
478
- size: sizes.length !== 1 ? '*' : extractSizes(sizes)
484
+ size: sizes.length !== 1 ? '*' : sizes[0].split(DIMENSION_SIGN)
479
485
  });
480
486
  if (floor.currency === CURRENCY_CODE) {
481
- return floor.floor;
487
+ return (floor.floor * 100).toFixed(0);
482
488
  }
483
489
  return undefined;
484
490
  }
@@ -2,9 +2,9 @@ import {deepSetValue, logInfo, deepAccess} from '../src/utils.js';
2
2
  import {registerBidder} from '../src/adapters/bidderFactory.js';
3
3
  import {BANNER} from '../src/mediaTypes.js';
4
4
 
5
- const ENDPOINT_URL = 'https://x.yieldlift.com/auction';
5
+ const ENDPOINT_URL = 'https://x.yieldlift.com/pbjs';
6
6
 
7
- const DEFAULT_BID_TTL = 30;
7
+ const DEFAULT_BID_TTL = 300;
8
8
  const DEFAULT_CURRENCY = 'USD';
9
9
  const DEFAULT_NET_REVENUE = true;
10
10
 
@@ -98,7 +98,7 @@ export const spec = {
98
98
  width: bid.w,
99
99
  height: bid.h,
100
100
  ad: bid.adm,
101
- ttl: DEFAULT_BID_TTL,
101
+ ttl: typeof bid.exp === 'number' ? bid.exp : DEFAULT_BID_TTL,
102
102
  creativeId: bid.crid,
103
103
  netRevenue: DEFAULT_NET_REVENUE,
104
104
  currency: DEFAULT_CURRENCY,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prebid.js",
3
- "version": "7.26.0",
3
+ "version": "7.28.0",
4
4
  "description": "Header Bidding Management Library",
5
5
  "main": "src/prebid.js",
6
6
  "scripts": {
@@ -130,7 +130,7 @@
130
130
  "express": "^4.15.4",
131
131
  "fun-hooks": "^0.9.9",
132
132
  "just-clone": "^1.0.2",
133
- "live-connect-js": "2.4.0"
133
+ "live-connect-js": "3.0.1"
134
134
  },
135
135
  "optionalDependencies": {
136
136
  "fsevents": "^2.3.2"
package/src/auction.js CHANGED
@@ -76,7 +76,7 @@ import {
76
76
  timestamp
77
77
  } from './utils.js';
78
78
  import {getPriceBucketString} from './cpmBucketManager.js';
79
- import {getNativeTargeting} from './native.js';
79
+ import {getNativeTargeting, toLegacyResponse} from './native.js';
80
80
  import {getCacheUrl, store} from './videoCache.js';
81
81
  import {Renderer} from './Renderer.js';
82
82
  import {config} from './config.js';
@@ -462,9 +462,14 @@ export function auctionCallbacks(auctionDone, auctionInstance, {index = auctionM
462
462
  handleBidResponse(adUnitCode, bid, (done) => {
463
463
  let bidResponse = getPreparedBidForAuction(bid);
464
464
 
465
- if (bidResponse.mediaType === 'video') {
465
+ if (bidResponse.mediaType === VIDEO) {
466
466
  tryAddVideoBid(auctionInstance, bidResponse, done);
467
467
  } else {
468
+ if (FEATURES.NATIVE && bidResponse.native != null && typeof bidResponse.native === 'object') {
469
+ // NOTE: augment bidResponse.native even if bidResponse.mediaType !== NATIVE; it's possible
470
+ // to treat banner responses as native
471
+ addLegacyFieldsIfNeeded(bidResponse);
472
+ }
468
473
  addBidToAuction(auctionInstance, bidResponse);
469
474
  done();
470
475
  }
@@ -593,6 +598,17 @@ function tryAddVideoBid(auctionInstance, bidResponse, afterBidAdded, {index = au
593
598
  }
594
599
  }
595
600
 
601
+ // Native bid response might be in ortb2 format - adds legacy field for backward compatibility
602
+ const addLegacyFieldsIfNeeded = (bidResponse) => {
603
+ const nativeOrtbRequest = auctionManager.index.getAdUnit(bidResponse)?.nativeOrtbRequest;
604
+ const nativeOrtbResponse = bidResponse.native?.ortb
605
+
606
+ if (nativeOrtbRequest && nativeOrtbResponse) {
607
+ const legacyResponse = toLegacyResponse(nativeOrtbResponse, nativeOrtbRequest);
608
+ Object.assign(bidResponse.native, legacyResponse);
609
+ }
610
+ }
611
+
596
612
  const storeInCache = (batch) => {
597
613
  store(batch.map(entry => entry.bidResponse), function (error, cacheIds) {
598
614
  cacheIds.forEach((cacheId, i) => {
@@ -672,7 +688,7 @@ function addCommonResponseProperties(bidResponse, adUnitCode, {index = auctionMa
672
688
  Object.assign(bidResponse, {
673
689
  responseTimestamp: bidResponse.responseTimestamp || timestamp(),
674
690
  requestTimestamp: bidResponse.requestTimestamp || start,
675
- cpm: bidResponse.cpm || parseFloat(bidResponse.cpm) || 0,
691
+ cpm: parseFloat(bidResponse.cpm) || 0,
676
692
  bidder: bidResponse.bidder || bidResponse.bidderCode,
677
693
  adUnitCode
678
694
  });
@@ -812,6 +828,16 @@ export const getAdvertiserDomain = () => {
812
828
  }
813
829
  }
814
830
 
831
+ /**
832
+ * This function returns a function to get the primary category id from bid response meta
833
+ * @returns {function}
834
+ */
835
+ export const getPrimaryCatId = () => {
836
+ return (bid) => {
837
+ return (bid.meta && bid.meta.primaryCatId) ? bid.meta.primaryCatId : '';
838
+ }
839
+ }
840
+
815
841
  // factory for key value objs
816
842
  function createKeyVal(key, value) {
817
843
  return {
@@ -837,6 +863,7 @@ function defaultAdserverTargeting() {
837
863
  createKeyVal(TARGETING_KEYS.SOURCE, 'source'),
838
864
  createKeyVal(TARGETING_KEYS.FORMAT, 'mediaType'),
839
865
  createKeyVal(TARGETING_KEYS.ADOMAIN, getAdvertiserDomain()),
866
+ createKeyVal(TARGETING_KEYS.ACAT, getPrimaryCatId()),
840
867
  ]
841
868
  }
842
869
 
@@ -849,7 +876,6 @@ function defaultAdserverTargeting() {
849
876
  export function getStandardBidderSettings(mediaType, bidderCode) {
850
877
  const TARGETING_KEYS = CONSTANTS.TARGETING_KEYS;
851
878
  const standardSettings = Object.assign({}, bidderSettings.settingsFor(null));
852
-
853
879
  if (!standardSettings[CONSTANTS.JSON_MAPPING.ADSERVER_TARGETING]) {
854
880
  standardSettings[CONSTANTS.JSON_MAPPING.ADSERVER_TARGETING] = defaultAdserverTargeting();
855
881
  }
@@ -1,6 +1,14 @@
1
1
  import {isStr, timestamp} from './utils.js';
2
2
  import {defer, GreedyPromise} from './utils/promise.js';
3
3
 
4
+ /**
5
+ * Placeholder gvlid for when vendor consent is not required. When this value is used as gvlid, the gdpr
6
+ * enforcement module will take it to mean "vendor consent was given".
7
+ *
8
+ * see https://github.com/prebid/Prebid.js/issues/8161
9
+ */
10
+ export const VENDORLESS_GVLID = Object.freeze({});
11
+
4
12
  export class ConsentHandler {
5
13
  #enabled;
6
14
  #data;
@@ -76,7 +76,8 @@
76
76
  "UUID": "hb_uuid",
77
77
  "CACHE_ID": "hb_cache_id",
78
78
  "CACHE_HOST": "hb_cache_host",
79
- "ADOMAIN": "hb_adomain"
79
+ "ADOMAIN": "hb_adomain",
80
+ "ACAT": "hb_acat"
80
81
  },
81
82
  "DEFAULT_TARGETING_KEYS": {
82
83
  "BIDDER": "hb_bidder",
package/src/events.js CHANGED
@@ -157,3 +157,7 @@ const _public = (function () {
157
157
  utils._setEventEmitter(_public.emit.bind(_public));
158
158
 
159
159
  export const {on, off, get, getEvents, emit, addEvents} = _public;
160
+
161
+ export function clearEvents() {
162
+ eventsFired.length = 0;
163
+ }
package/src/native.js CHANGED
@@ -23,7 +23,7 @@ export const NATIVE_TARGETING_KEYS = Object.keys(CONSTANTS.NATIVE_KEYS).map(
23
23
  key => CONSTANTS.NATIVE_KEYS[key]
24
24
  );
25
25
 
26
- const IMAGE = {
26
+ export const IMAGE = {
27
27
  ortb: {
28
28
  ver: '1.2',
29
29
  assets: [
@@ -385,26 +385,14 @@ export function getNativeTargeting(bid, {index = auctionManager.index} = {}) {
385
385
  return keyValues;
386
386
  }
387
387
 
388
- const getNativeRequest = (bidResponse) => auctionManager.index.getAdUnit(bidResponse)?.nativeOrtbRequest;
389
-
390
- function assetsMessage(data, adObject, keys, {getNativeReq = getNativeRequest} = {}) {
388
+ function assetsMessage(data, adObject, keys) {
391
389
  const message = {
392
390
  message: 'assetResponse',
393
391
  adId: data.adId,
394
392
  };
395
393
 
396
- // Pass to Prebid Universal Creative all assets, the legacy ones + the ortb ones (under ortb property)
397
- const ortbRequest = getNativeReq(adObject);
398
394
  let nativeResp = adObject.native;
399
- const ortbResponse = adObject.native?.ortb;
400
- let legacyResponse = {};
401
- if (ortbRequest && ortbResponse) {
402
- legacyResponse = toLegacyResponse(ortbResponse, ortbRequest);
403
- nativeResp = {
404
- ...adObject.native,
405
- ...legacyResponse
406
- };
407
- }
395
+
408
396
  if (adObject.native.ortb) {
409
397
  message.ortb = adObject.native.ortb;
410
398
  }
@@ -435,13 +423,13 @@ function assetsMessage(data, adObject, keys, {getNativeReq = getNativeRequest} =
435
423
  * Constructs a message object containing asset values for each of the
436
424
  * requested data keys.
437
425
  */
438
- export function getAssetMessage(data, adObject, {getNativeReq = getNativeRequest} = {}) {
426
+ export function getAssetMessage(data, adObject) {
439
427
  const keys = data.assets.map((k) => getKeyByValue(CONSTANTS.NATIVE_KEYS, k));
440
- return assetsMessage(data, adObject, keys, {getNativeReq});
428
+ return assetsMessage(data, adObject, keys);
441
429
  }
442
430
 
443
- export function getAllAssetsMessage(data, adObject, {getNativeReq = getNativeRequest} = {}) {
444
- return assetsMessage(data, adObject, null, {getNativeReq});
431
+ export function getAllAssetsMessage(data, adObject) {
432
+ return assetsMessage(data, adObject, null);
445
433
  }
446
434
 
447
435
  /**
@@ -749,7 +737,7 @@ export function toOrtbNativeResponse(legacyResponse, ortbRequest) {
749
737
  * @param {*} ortbRequest the ortb request, useful to match ids.
750
738
  * @returns an object containing the response in legacy native format: { title: "this is a title", image: ... }
751
739
  */
752
- function toLegacyResponse(ortbResponse, ortbRequest) {
740
+ export function toLegacyResponse(ortbResponse, ortbRequest) {
753
741
  const legacyResponse = {};
754
742
  const requestAssets = ortbRequest?.assets || [];
755
743
  legacyResponse.clickUrl = ortbResponse.link.url;
@@ -764,6 +752,29 @@ function toLegacyResponse(ortbResponse, ortbRequest) {
764
752
  legacyResponse[PREBID_NATIVE_DATA_KEYS_TO_ORTB_INVERSE[NATIVE_ASSET_TYPES_INVERSE[requestAsset.data.type]]] = asset.data.value;
765
753
  }
766
754
  }
755
+
756
+ // Handle trackers
757
+ legacyResponse.impressionTrackers = [];
758
+ let jsTrackers = [];
759
+
760
+ if (ortbRequest?.imptrackers) {
761
+ legacyResponse.impressionTrackers.push(...ortbRequest.imptrackers);
762
+ }
763
+ for (const eventTracker of ortbResponse?.eventtrackers || []) {
764
+ if (eventTracker.event === TRACKER_EVENTS.impression && eventTracker.method === TRACKER_METHODS.img) {
765
+ legacyResponse.impressionTrackers.push(eventTracker.url);
766
+ }
767
+ if (eventTracker.event === TRACKER_EVENTS.impression && eventTracker.method === TRACKER_METHODS.js) {
768
+ jsTrackers.push(eventTracker.url);
769
+ }
770
+ }
771
+
772
+ jsTrackers = jsTrackers.map(url => `<script async src="${url}"></script>`);
773
+ if (ortbResponse?.jstracker) { jsTrackers.push(ortbResponse.jstracker); }
774
+ if (jsTrackers.length) {
775
+ legacyResponse.javascriptTrackers = jsTrackers.join('\n');
776
+ }
777
+
767
778
  return legacyResponse;
768
779
  }
769
780
 
@@ -120,6 +120,7 @@ export function detectReferer(win) {
120
120
  const stack = [];
121
121
  const ancestors = getAncestorOrigins(win);
122
122
  const maxNestedIframes = config.getConfig('maxNestedIframes');
123
+
123
124
  let currentWindow;
124
125
  let bestLocation;
125
126
  let bestCanonicalUrl;
@@ -226,7 +227,11 @@ export function detectReferer(win) {
226
227
 
227
228
  const location = reachedTop || hasTopLocation ? bestLocation : null;
228
229
  const canonicalUrl = config.getConfig('pageUrl') || bestCanonicalUrl || null;
229
- const page = ensureProtocol(canonicalUrl, win) || location;
230
+ let page = config.getConfig('pageUrl') || location || ensureProtocol(canonicalUrl, win);
231
+
232
+ if (location && location.indexOf('?') > -1 && page.indexOf('?') === -1) {
233
+ page = `${page}${location.substring(location.indexOf('?'))}`;
234
+ }
230
235
 
231
236
  return {
232
237
  reachedTop,
@@ -1,6 +1,7 @@
1
1
  import {hook} from './hook.js';
2
2
  import {hasDeviceAccess, checkCookieSupport, logError, logInfo, isPlainObject} from './utils.js';
3
3
  import {bidderSettings as defaultBidderSettings} from './bidderSettings.js';
4
+ import {VENDORLESS_GVLID} from './consentHandler.js';
4
5
 
5
6
  const moduleTypeWhiteList = ['core', 'prebid-module'];
6
7
 
@@ -33,7 +34,9 @@ export function newStorageManager({gvlid, moduleName, bidderCode, moduleType} =
33
34
  return storageAllowed == null ? false : storageAllowed;
34
35
  }
35
36
 
36
- const isVendorless = moduleTypeWhiteList.includes(moduleType);
37
+ if (moduleTypeWhiteList.includes(moduleType)) {
38
+ gvlid = gvlid || VENDORLESS_GVLID;
39
+ }
37
40
 
38
41
  function isValid(cb) {
39
42
  if (!isBidderAllowed()) {
@@ -45,7 +48,7 @@ export function newStorageManager({gvlid, moduleName, bidderCode, moduleType} =
45
48
  let hookDetails = {
46
49
  hasEnforcementHook: false
47
50
  }
48
- validateStorageEnforcement(isVendorless, gvlid, bidderCode || moduleName, hookDetails, function(result) {
51
+ validateStorageEnforcement(gvlid, bidderCode || moduleName, hookDetails, function(result) {
49
52
  if (result && result.hasEnforcementHook) {
50
53
  value = cb(result);
51
54
  } else {
@@ -296,7 +299,7 @@ export function newStorageManager({gvlid, moduleName, bidderCode, moduleType} =
296
299
  /**
297
300
  * This hook validates the storage enforcement if gdprEnforcement module is included
298
301
  */
299
- export const validateStorageEnforcement = hook('async', function(isVendorless, gvlid, moduleName, hookDetails, callback) {
302
+ export const validateStorageEnforcement = hook('async', function(gvlid, moduleName, hookDetails, callback) {
300
303
  callback(hookDetails);
301
304
  }, 'validateStorageEnforcement');
302
305
 
@@ -0,0 +1,34 @@
1
+ import * as pbEvents from 'src/events.js';
2
+ import constants from '../../src/constants.json';
3
+
4
+ export function fireEvents(events = [
5
+ constants.EVENTS.AUCTION_INIT,
6
+ constants.EVENTS.AUCTION_END,
7
+ constants.EVENTS.BID_REQUESTED,
8
+ constants.EVENTS.BID_RESPONSE,
9
+ constants.EVENTS.BID_WON
10
+ ]) {
11
+ return events.map((ev, i) => {
12
+ ev = Array.isArray(ev) ? ev : [ev, {i: i}];
13
+ pbEvents.emit.apply(null, ev)
14
+ return ev;
15
+ });
16
+ }
17
+
18
+ export function expectEvents(events) {
19
+ events = fireEvents(events);
20
+ return {
21
+ to: {
22
+ beTrackedBy(trackFn) {
23
+ events.forEach(([eventType, args]) => {
24
+ sinon.assert.calledWithMatch(trackFn, sinon.match({eventType, args}));
25
+ });
26
+ },
27
+ beBundledTo(bundleFn) {
28
+ events.forEach(([eventType, args]) => {
29
+ sinon.assert.calledWithMatch(bundleFn, sinon.match.any, eventType, sinon.match(args))
30
+ });
31
+ },
32
+ },
33
+ };
34
+ }
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Build a walkable linked list of window-like objects for testing.
3
+ *
4
+ * @param {Array} urls Array of URL strings starting from the top window.
5
+ * @param {string} [topReferrer]
6
+ * @param {string} [canonicalUrl]
7
+ * @param {boolean} [ancestorOrigins]
8
+ * @returns {Object}
9
+ */
10
+ export function buildWindowTree(urls, topReferrer = null, canonicalUrl = null, ancestorOrigins = false) {
11
+ /**
12
+ * Find the origin from a given fully-qualified URL.
13
+ *
14
+ * @param {string} url The fully qualified URL
15
+ * @returns {string|null}
16
+ */
17
+ function getOrigin(url) {
18
+ const originRegex = new RegExp('^(https?://[^/]+/?)');
19
+
20
+ const result = originRegex.exec(url);
21
+
22
+ if (result && result[0]) {
23
+ return result[0];
24
+ }
25
+
26
+ return null;
27
+ }
28
+
29
+ const inaccessibles = [];
30
+
31
+ let previousWindow, topWindow;
32
+ const topOrigin = getOrigin(urls[0]);
33
+
34
+ const windowList = urls.map((url, index) => {
35
+ const thisOrigin = getOrigin(url),
36
+ sameOriginAsPrevious = index === 0 ? true : (getOrigin(urls[index - 1]) === thisOrigin),
37
+ sameOriginAsTop = thisOrigin === topOrigin;
38
+
39
+ const win = {
40
+ location: {
41
+ href: url,
42
+ },
43
+ document: {
44
+ referrer: index === 0 ? topReferrer : urls[index - 1]
45
+ }
46
+ };
47
+
48
+ if (topWindow == null) {
49
+ topWindow = win;
50
+ win.document.querySelector = function (selector) {
51
+ if (selector === 'link[rel=\'canonical\']') {
52
+ return {
53
+ href: canonicalUrl
54
+ };
55
+ }
56
+ return null;
57
+ };
58
+ }
59
+
60
+ if (sameOriginAsPrevious) {
61
+ win.parent = previousWindow;
62
+ } else {
63
+ win.parent = inaccessibles[inaccessibles.length - 1];
64
+ }
65
+ if (ancestorOrigins) {
66
+ win.location.ancestorOrigins = urls.slice(0, index).reverse().map(getOrigin);
67
+ }
68
+ win.top = sameOriginAsTop ? topWindow : inaccessibles[0];
69
+
70
+ const inWin = {parent: inaccessibles[inaccessibles.length - 1], top: inaccessibles[0]};
71
+ if (index === 0) {
72
+ inWin.top = inWin;
73
+ }
74
+ ['document', 'location'].forEach((prop) => {
75
+ Object.defineProperty(inWin, prop, {
76
+ get: function () {
77
+ throw new Error('cross-origin access');
78
+ }
79
+ });
80
+ });
81
+ inaccessibles.push(inWin);
82
+ previousWindow = win;
83
+
84
+ return win;
85
+ });
86
+
87
+ return windowList[windowList.length - 1];
88
+ }
@@ -1,8 +1,10 @@
1
- import {_internal} from '../../libraries/analyticsAdapter/AnalyticsAdapter.js';
1
+ import {_internal, setDebounceDelay} from '../../libraries/analyticsAdapter/AnalyticsAdapter.js';
2
2
 
3
3
  before(() => {
4
4
  // stub out analytics networking to avoid random events polluting the global xhr mock
5
5
  disableAjaxForAnalytics();
6
+ // make analytics event handling synchronous
7
+ setDebounceDelay(0);
6
8
  })
7
9
 
8
10
  export function disableAjaxForAnalytics() {