prebid.js 7.25.0 → 7.27.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 (353) hide show
  1. package/dist/33acrossBidAdapter.js +1 -1
  2. package/dist/33acrossIdSystem.js +1 -1
  3. package/dist/adWMGAnalyticsAdapter.js +1 -1
  4. package/dist/adagioAnalyticsAdapter.js +1 -1
  5. package/dist/adagioBidAdapter.js +1 -1
  6. package/dist/adbookpspBidAdapter.js +1 -1
  7. package/dist/adgenerationBidAdapter.js +1 -1
  8. package/dist/adkernelAdnAnalyticsAdapter.js +1 -1
  9. package/dist/adlooxAdServerVideo.js +1 -1
  10. package/dist/adlooxAnalyticsAdapter.js +1 -1
  11. package/dist/adlooxRtdProvider.js +1 -1
  12. package/dist/admaticBidAdapter.js +1 -1
  13. package/dist/admixerBidAdapter.js +1 -1
  14. package/dist/adomikAnalyticsAdapter.js +1 -1
  15. package/dist/adrelevantisBidAdapter.js +1 -1
  16. package/dist/adtrgtmeBidAdapter.js +1 -1
  17. package/dist/adxcgAnalyticsAdapter.js +1 -1
  18. package/dist/adxcgBidAdapter.js +1 -1
  19. package/dist/adxpremiumAnalyticsAdapter.js +1 -1
  20. package/dist/aidemBidAdapter.js +1 -0
  21. package/dist/ajaBidAdapter.js +1 -1
  22. package/dist/amxBidAdapter.js +1 -1
  23. package/dist/amxIdSystem.js +1 -1
  24. package/dist/analyticsAdapter.js +1 -1
  25. package/dist/appierAnalyticsAdapter.js +1 -1
  26. package/dist/appnexusBidAdapter.js +1 -1
  27. package/dist/asoBidAdapter.js +1 -1
  28. package/dist/atsAnalyticsAdapter.js +1 -1
  29. package/dist/axonixBidAdapter.js +1 -1
  30. package/dist/beopBidAdapter.js +1 -1
  31. package/dist/bidViewability.js +1 -1
  32. package/dist/bidglassBidAdapter.js +1 -1
  33. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  34. package/dist/big-richmediaBidAdapter.js +1 -1
  35. package/dist/bridgewellBidAdapter.js +1 -1
  36. package/dist/brightMountainMediaBidAdapter.js +1 -1
  37. package/dist/browsiRtdProvider.js +1 -1
  38. package/dist/bucksenseBidAdapter.js +1 -1
  39. package/dist/byDataAnalyticsAdapter.js +1 -1
  40. package/dist/captifyRtdProvider.js +1 -0
  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/kinessoIdSystem.js +1 -1
  91. package/dist/konduitAnalyticsAdapter.js +1 -1
  92. package/dist/kueezBidAdapter.js +1 -1
  93. package/dist/kueezRtbBidAdapter.js +1 -1
  94. package/dist/lassoBidAdapter.js +1 -1
  95. package/dist/lifestreetBidAdapter.js +1 -1
  96. package/dist/limelightDigitalBidAdapter.js +1 -1
  97. package/dist/liveIntentAnalyticsAdapter.js +1 -1
  98. package/dist/liveIntentIdSystem.js +1 -1
  99. package/dist/livewrappedAnalyticsAdapter.js +1 -1
  100. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  101. package/dist/logicadBidAdapter.js +1 -1
  102. package/dist/loglyliftBidAdapter.js +1 -1
  103. package/dist/lotamePanoramaIdSystem.js +1 -1
  104. package/dist/magniteAnalyticsAdapter.js +1 -1
  105. package/dist/malltvAnalyticsAdapter.js +1 -1
  106. package/dist/marsmediaAnalyticsAdapter.js +1 -1
  107. package/dist/marsmediaBidAdapter.js +1 -1
  108. package/dist/mediafuseBidAdapter.js +1 -1
  109. package/dist/medianetAnalyticsAdapter.js +1 -1
  110. package/dist/mediasquareBidAdapter.js +1 -1
  111. package/dist/mgidBidAdapter.js +1 -1
  112. package/dist/minutemediaBidAdapter.js +1 -1
  113. package/dist/nextMillenniumBidAdapter.js +1 -1
  114. package/dist/nexx360BidAdapter.js +1 -1
  115. package/dist/not-for-prod/prebid.js +240 -202
  116. package/dist/oguryBidAdapter.js +1 -1
  117. package/dist/onetagBidAdapter.js +1 -1
  118. package/dist/ooloAnalyticsAdapter.js +1 -1
  119. package/dist/openxAnalyticsAdapter.js +1 -1
  120. package/dist/optimonAnalyticsAdapter.js +1 -1
  121. package/dist/outbrainBidAdapter.js +1 -1
  122. package/dist/parrableIdSystem.js +1 -1
  123. package/dist/pbsExtensions.js +1 -1
  124. package/dist/pianoDmpAnalyticsAdapter.js +1 -1
  125. package/dist/pixfutureBidAdapter.js +1 -1
  126. package/dist/prebid-core.js +1 -1
  127. package/dist/prebidServerBidAdapter.js +1 -1
  128. package/dist/prebidmanagerAnalyticsAdapter.js +1 -1
  129. package/dist/pubCommonId.js +1 -1
  130. package/dist/pubProvidedIdSystem.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/pubperfAnalyticsAdapter.js +1 -1
  135. package/dist/pubstackAnalyticsAdapter.js +1 -1
  136. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  137. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  138. package/dist/pulsepointAnalyticsAdapter.js +1 -1
  139. package/dist/pxyzBidAdapter.js +1 -1
  140. package/dist/quantcastBidAdapter.js +1 -1
  141. package/dist/quantcastIdSystem.js +1 -1
  142. package/dist/rasBidAdapter.js +1 -1
  143. package/dist/readpeakBidAdapter.js +1 -1
  144. package/dist/realvuAnalyticsAdapter.js +1 -1
  145. package/dist/redtramBidAdapter.js +1 -0
  146. package/dist/relaidoBidAdapter.js +1 -1
  147. package/dist/relevantAnalyticsAdapter.js +1 -1
  148. package/dist/rhythmoneBidAdapter.js +1 -1
  149. package/dist/riseBidAdapter.js +1 -1
  150. package/dist/rivrAnalyticsAdapter.js +1 -1
  151. package/dist/roxotAnalyticsAdapter.js +1 -1
  152. package/dist/rtbhouseBidAdapter.js +1 -1
  153. package/dist/rtdModule.js +1 -1
  154. package/dist/rubiconAnalyticsAdapter.js +1 -1
  155. package/dist/rubiconBidAdapter.js +1 -1
  156. package/dist/s2sTesting.js +1 -1
  157. package/dist/scaleableAnalyticsAdapter.js +1 -1
  158. package/dist/schain.js +1 -1
  159. package/dist/seedingAllianceBidAdapter.js +1 -1
  160. package/dist/seedtagBidAdapter.js +1 -1
  161. package/dist/sharedIdSystem.js +1 -1
  162. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  163. package/dist/sharethroughBidAdapter.js +1 -1
  164. package/dist/shinezBidAdapter.js +1 -1
  165. package/dist/sigmoidAnalyticsAdapter.js +1 -1
  166. package/dist/smaatoBidAdapter.js +1 -1
  167. package/dist/smartadserverBidAdapter.js +1 -1
  168. package/dist/smartxBidAdapter.js +1 -1
  169. package/dist/smartytechBidAdapter.js +1 -0
  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/tappxBidAdapter.js +1 -1
  182. package/dist/targetVideoBidAdapter.js +1 -1
  183. package/dist/teadsBidAdapter.js +1 -1
  184. package/dist/teadsIdSystem.js +1 -1
  185. package/dist/terceptAnalyticsAdapter.js +1 -1
  186. package/dist/trionBidAdapter.js +1 -1
  187. package/dist/tripleliftBidAdapter.js +1 -1
  188. package/dist/ttdBidAdapter.js +1 -1
  189. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  190. package/dist/underdogmediaBidAdapter.js +1 -1
  191. package/dist/undertoneBidAdapter.js +1 -1
  192. package/dist/userId.js +1 -1
  193. package/dist/vidazooBidAdapter.js +1 -1
  194. package/dist/videobyteBidAdapter.js +1 -1
  195. package/dist/viqeoBidAdapter.js +1 -0
  196. package/dist/visxBidAdapter.js +1 -1
  197. package/dist/vuukleBidAdapter.js +1 -1
  198. package/dist/weboramaRtdProvider.js +1 -1
  199. package/dist/widespaceBidAdapter.js +1 -1
  200. package/dist/winrBidAdapter.js +1 -1
  201. package/dist/yahoosspBidAdapter.js +1 -1
  202. package/dist/yandexBidAdapter.js +1 -1
  203. package/dist/yieldlabBidAdapter.js +1 -1
  204. package/dist/yieldliftBidAdapter.js +1 -1
  205. package/dist/yieldmoBidAdapter.js +1 -1
  206. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  207. package/dist/yuktamediaAnalyticsAdapter.js +1 -1
  208. package/dist/zeta_global_sspAnalyticsAdapter.js +1 -1
  209. package/dist/zeta_global_sspBidAdapter.js +1 -1
  210. package/dist/zeusPrimeRtdProvider.js +31 -0
  211. package/integrationExamples/gpt/captifyRtdProvider_example.html +167 -0
  212. package/integrationExamples/gpt/growthcode.html +134 -0
  213. package/libraries/analyticsAdapter/AnalyticsAdapter.js +95 -102
  214. package/modules/.submodules.json +3 -1
  215. package/modules/admaticBidAdapter.js +116 -58
  216. package/modules/admaticBidAdapter.md +2 -2
  217. package/modules/admixerBidAdapter.js +1 -1
  218. package/modules/aidemBidAdapter.js +492 -0
  219. package/modules/aidemBidAdapter.md +187 -0
  220. package/modules/beopBidAdapter.js +17 -2
  221. package/modules/browsiRtdProvider.js +6 -4
  222. package/modules/bucksenseBidAdapter.js +1 -1
  223. package/modules/captifyRtdProvider.js +146 -0
  224. package/modules/captifyRtdProvider.md +68 -0
  225. package/modules/criteoBidAdapter.js +3 -3
  226. package/modules/discoveryBidAdapter.js +38 -17
  227. package/modules/discoveryBidAdapter.md +7 -6
  228. package/modules/eplanningBidAdapter.js +2 -6
  229. package/modules/fluctBidAdapter.js +5 -0
  230. package/modules/gdprEnforcement.js +26 -24
  231. package/modules/genericAnalyticsAdapter.js +157 -0
  232. package/modules/geoedgeRtdProvider.js +22 -0
  233. package/modules/glomexBidAdapter.js +2 -0
  234. package/modules/gravitoIdSystem.js +3 -4
  235. package/modules/gridBidAdapter.js +441 -23
  236. package/modules/gridNMBidAdapter.js +1 -1
  237. package/modules/growthCodeAnalyticsAdapter.js +176 -0
  238. package/modules/growthCodeAnalyticsAdapter.md +41 -0
  239. package/modules/impactifyBidAdapter.js +19 -1
  240. package/modules/jwplayerRtdProvider.js +1 -2
  241. package/modules/limelightDigitalBidAdapter.js +1 -1
  242. package/modules/minutemediaBidAdapter.md +3 -3
  243. package/modules/nextMillenniumBidAdapter.js +19 -23
  244. package/modules/nexx360BidAdapter.js +264 -138
  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/smartadserverBidAdapter.js +6 -2
  259. package/modules/smartxBidAdapter.js +11 -8
  260. package/modules/smartytechBidAdapter.js +78 -0
  261. package/modules/smartytechBidAdapter.md +44 -0
  262. package/modules/smnBidAdapter.md +52 -0
  263. package/modules/taboolaBidAdapter.js +3 -3
  264. package/modules/taboolaBidAdapter.md +0 -2
  265. package/modules/tappxBidAdapter.js +21 -6
  266. package/modules/tripleliftBidAdapter.js +1 -1
  267. package/modules/ttdBidAdapter.js +8 -3
  268. package/modules/userId/index.js +1 -1
  269. package/modules/vidazooBidAdapter.js +26 -3
  270. package/modules/viqeoBidAdapter.js +180 -0
  271. package/modules/viqeoBidAdapter.md +56 -0
  272. package/modules/yandexBidAdapter.js +85 -19
  273. package/modules/yandexBidAdapter.md +7 -7
  274. package/modules/yieldlabBidAdapter.js +29 -12
  275. package/modules/yieldliftBidAdapter.js +3 -3
  276. package/modules/yieldoneBidAdapter.js +60 -8
  277. package/modules/yieldoneBidAdapter.md +109 -9
  278. package/modules/zeta_global_sspBidAdapter.js +4 -0
  279. package/modules/zeusPrimeRtdProvider.js +357 -0
  280. package/modules/zeusPrimeRtdProvider.md +60 -0
  281. package/package.json +1 -1
  282. package/src/adloader.js +0 -1
  283. package/src/auction.js +19 -3
  284. package/src/consentHandler.js +8 -0
  285. package/src/events.js +4 -0
  286. package/src/native.js +31 -20
  287. package/src/refererDetection.js +6 -1
  288. package/src/storageManager.js +6 -3
  289. package/test/helpers/analytics.js +34 -0
  290. package/test/mocks/analyticsStub.js +3 -1
  291. package/test/spec/AnalyticsAdapter_spec.js +119 -116
  292. package/test/spec/auctionmanager_spec.js +86 -0
  293. package/test/spec/modules/adWMGAnalyticsAdapter_spec.js +10 -8
  294. package/test/spec/modules/adagioAnalyticsAdapter_spec.js +18 -25
  295. package/test/spec/modules/admaticBidAdapter_spec.js +262 -3
  296. package/test/spec/modules/aidemBidAdapter_spec.js +664 -0
  297. package/test/spec/modules/beopBidAdapter_spec.js +52 -0
  298. package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +0 -2
  299. package/test/spec/modules/browsiRtdProvider_spec.js +2 -1
  300. package/test/spec/modules/captifyRtdProvider_spec.js +253 -0
  301. package/test/spec/modules/concertAnalyticsAdapter_spec.js +2 -4
  302. package/test/spec/modules/discoveryBidAdapter_spec.js +9 -8
  303. package/test/spec/modules/enrichmentFpdModule_spec.js +3 -2
  304. package/test/spec/modules/eplanningAnalyticsAdapter_spec.js +0 -3
  305. package/test/spec/modules/eplanningBidAdapter_spec.js +4 -4
  306. package/test/spec/modules/fluctBidAdapter_spec.js +37 -1
  307. package/test/spec/modules/fpdModule_spec.js +1 -1
  308. package/test/spec/modules/gdprEnforcement_spec.js +115 -68
  309. package/test/spec/modules/genericAnalyticsAdapter_spec.js +284 -0
  310. package/test/spec/modules/geoedgeRtdProvider_spec.js +15 -0
  311. package/test/spec/modules/glomexBidAdapter_spec.js +4 -0
  312. package/test/spec/modules/gravitoIdSystem_spec.js +1 -1
  313. package/test/spec/modules/gridBidAdapter_spec.js +289 -1
  314. package/test/spec/modules/growthCodeAnalyticsAdapter_spec.js +70 -0
  315. package/test/spec/modules/impactifyBidAdapter_spec.js +13 -0
  316. package/test/spec/modules/invisiblyAnalyticsAdapter_spec.js +17 -27
  317. package/test/spec/modules/jwplayerRtdProvider_spec.js +3 -3
  318. package/test/spec/modules/konduitAnalyticsAdapter_spec.js +0 -2
  319. package/test/spec/modules/liveIntentAnalyticsAdapter_spec.js +3 -6
  320. package/test/spec/modules/medianetAnalyticsAdapter_spec.js +7 -1
  321. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +4 -3
  322. package/test/spec/modules/nexx360BidAdapter_spec.js +441 -221
  323. package/test/spec/modules/optimonAnalyticsAdapter_spec.js +3 -11
  324. package/test/spec/modules/pianoDmpAnalyticsAdapter_spec.js +4 -11
  325. package/test/spec/modules/prebidmanagerAnalyticsAdapter_spec.js +3 -12
  326. package/test/spec/modules/pubperfAnalyticsAdapter_spec.js +6 -19
  327. package/test/spec/modules/pubstackAnalyticsAdapter_spec.js +3 -17
  328. package/test/spec/modules/pubwiseAnalyticsAdapter_spec.js +13 -19
  329. package/test/spec/modules/rasBidAdapter_spec.js +5 -1
  330. package/test/spec/modules/redtramBidAdapter_spec.js +256 -0
  331. package/test/spec/modules/riseBidAdapter_spec.js +24 -0
  332. package/test/spec/modules/rtbhouseBidAdapter_spec.js +79 -0
  333. package/test/spec/modules/seedtagBidAdapter_spec.js +65 -92
  334. package/test/spec/modules/sigmoidAnalyticsAdapter_spec.js +4 -8
  335. package/test/spec/modules/smartadserverBidAdapter_spec.js +80 -0
  336. package/test/spec/modules/smartxBidAdapter_spec.js +32 -0
  337. package/test/spec/modules/smartytechBidAdapter_spec.js +162 -0
  338. package/test/spec/modules/sovrnAnalyticsAdapter_spec.js +6 -18
  339. package/test/spec/modules/taboolaBidAdapter_spec.js +0 -77
  340. package/test/spec/modules/tripleliftBidAdapter_spec.js +3 -10
  341. package/test/spec/modules/ttdBidAdapter_spec.js +27 -0
  342. package/test/spec/modules/vidazooBidAdapter_spec.js +39 -24
  343. package/test/spec/modules/viqeoBidAdapter_spec.js +124 -0
  344. package/test/spec/modules/yandexBidAdapter_spec.js +22 -13
  345. package/test/spec/modules/yieldlabBidAdapter_spec.js +174 -20
  346. package/test/spec/modules/yieldliftBidAdapter_spec.js +1 -1
  347. package/test/spec/modules/yieldoneAnalyticsAdapter_spec.js +5 -2
  348. package/test/spec/modules/yieldoneBidAdapter_spec.js +30 -6
  349. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +16 -1
  350. package/test/spec/modules/zeusPrimeRtdProvider_spec.js +410 -0
  351. package/test/spec/native_spec.js +68 -56
  352. package/test/spec/refererDetection_spec.js +45 -7
  353. package/test/spec/unit/core/storageManager_spec.js +2 -1
@@ -0,0 +1,410 @@
1
+ import { zeusPrimeSubmodule } from 'modules/zeusPrimeRtdProvider';
2
+ import { server } from 'test/mocks/xhr.js';
3
+ import * as utils from 'src/utils';
4
+
5
+ async function waitForStatus(statusVar) {
6
+ const MAX_COUNT = 20;
7
+ let count = 0;
8
+ while (
9
+ count <= MAX_COUNT &&
10
+ window.zeusPrime.status &&
11
+ window.zeusPrime.status[statusVar] !== true
12
+ ) {
13
+ count += 1;
14
+ await new Promise((resolve) => setTimeout(resolve, 10));
15
+ }
16
+
17
+ if (count === MAX_COUNT) {
18
+ throw new Error('Timeout waiting for zeusPrimeRtdProvider to complete');
19
+ }
20
+ }
21
+
22
+ /**
23
+ * Execute all the commands in the googletag.cmd queue.
24
+ */
25
+ function executeGoogletagTargeting() {
26
+ window.googletag.cmd.forEach((cmd) => cmd());
27
+ }
28
+
29
+ describe('Zeus Prime RTD submodule', () => {
30
+ let logErrorSpy;
31
+ let logMessageSpy;
32
+ let setTargetingStub;
33
+ let originalGtag;
34
+
35
+ beforeEach(() => {
36
+ logErrorSpy = sinon.spy(utils, 'logError');
37
+ logMessageSpy = sinon.spy(utils, 'logMessage');
38
+ setTargetingStub = sinon.stub();
39
+ window.zeusPrime = { cmd: [] };
40
+ originalGtag = window.googletag;
41
+ window.googletag = {
42
+ cmd: [],
43
+ pubads: () => ({
44
+ setTargeting: setTargetingStub,
45
+ }),
46
+ };
47
+
48
+ // Mock subtle since this doesnt exists in some test environments due to security in newer browsers.
49
+ if (typeof window.crypto.subtle === 'undefined') {
50
+ Object.defineProperty(crypto, 'subtle', { value: { digest: () => 'mockHash' } })
51
+ }
52
+ });
53
+
54
+ afterEach(() => {
55
+ logErrorSpy.restore();
56
+ logMessageSpy.restore();
57
+ window.googletag = originalGtag;
58
+ });
59
+
60
+ it('should init and set key-value for zeus_<gamId>', async () => {
61
+ zeusPrimeSubmodule.init({
62
+ params: {
63
+ gamId: '1234',
64
+ hostname: 'www.example.com',
65
+ pathname: '/',
66
+ },
67
+ });
68
+
69
+ // wait for the script to finish
70
+ await waitForStatus('scriptComplete');
71
+
72
+ // execute any googletag commands added to the queue during execution
73
+ executeGoogletagTargeting();
74
+
75
+ expect(window.googletag.cmd).to.have.length(1);
76
+ sinon.assert.callCount(setTargetingStub, 1);
77
+ sinon.assert.calledWith(setTargetingStub, 'zeus_1234', 'www.example.com');
78
+ });
79
+
80
+ it('should init and set key-value for zeus_<gamId> from command queue', async () => {
81
+ window.zeusPrime.cmd.push((prime) => (prime.gamId = '9876'));
82
+ zeusPrimeSubmodule.init({
83
+ params: {
84
+ hostname: 'www.example.com',
85
+ pathname: '/',
86
+ },
87
+ });
88
+
89
+ // wait for the script to finish
90
+ await waitForStatus('scriptComplete');
91
+
92
+ // execute any googletag commands added to the queue during execution
93
+ executeGoogletagTargeting();
94
+
95
+ expect(window.googletag.cmd).to.have.length(1);
96
+ sinon.assert.callCount(setTargetingStub, 1);
97
+ sinon.assert.calledWith(setTargetingStub, 'zeus_9876', 'www.example.com');
98
+ });
99
+
100
+ it('should init with values from location and set key-value for zeus_<gamId>', async () => {
101
+ zeusPrimeSubmodule.init({ params: { gamId: '1234' } });
102
+
103
+ // wait for the script to finish
104
+ await waitForStatus('scriptComplete');
105
+
106
+ // execute any googletag commands added to the queue during execution
107
+ executeGoogletagTargeting();
108
+
109
+ expect(window.googletag.cmd).to.have.length(1);
110
+ sinon.assert.callCount(setTargetingStub, 1);
111
+ sinon.assert.calledWith(setTargetingStub, 'zeus_1234', 'localhost');
112
+ expect(window.zeusPrime.pathname).to.equal('/context.html');
113
+ });
114
+
115
+ it('should emit error when gamId is not set', async () => {
116
+ zeusPrimeSubmodule.init({});
117
+
118
+ // wait for the script to finish
119
+ await waitForStatus('scriptComplete');
120
+
121
+ // execute any googletag commands added to the queue during execution
122
+ executeGoogletagTargeting();
123
+
124
+ expect(window.googletag.cmd).to.have.length(0);
125
+ sinon.assert.callCount(setTargetingStub, 0);
126
+ sinon.assert.calledWith(
127
+ logErrorSpy,
128
+ 'zeusPrimeRtdProvider: ',
129
+ 'Failed to run.',
130
+ 'window.zeusPrime.gamId must be a string. Received: undefined'
131
+ );
132
+ });
133
+
134
+ it('should not make a call to the server when url is a homepage', async () => {
135
+ zeusPrimeSubmodule.init({
136
+ params: {
137
+ gamId: '1234',
138
+ hostname: 'www.example.com',
139
+ pathname: '/',
140
+ },
141
+ });
142
+
143
+ // wait for the script to finish
144
+ await waitForStatus('scriptComplete');
145
+
146
+ expect(server.requests).to.have.length(0);
147
+ });
148
+
149
+ it('should make a call to the server and set key-vlaue when url is an article page and returns topics', async () => {
150
+ zeusPrimeSubmodule.init({
151
+ params: {
152
+ gamId: '1234',
153
+ hostname: 'www.example.com',
154
+ pathname: '/article/some-article',
155
+ },
156
+ });
157
+
158
+ // Wait for request to be sent
159
+ await waitForStatus('insightsReqReceived');
160
+
161
+ // Response
162
+ server.requests[0].respond(
163
+ 200,
164
+ { 'Content-Type': 'application/json' },
165
+ '{"topics": ["bs0"]}'
166
+ );
167
+
168
+ // Wait for the script to process the response
169
+ await waitForStatus('scriptComplete');
170
+
171
+ // execute any googletag commands added to the queue during execution
172
+ executeGoogletagTargeting();
173
+
174
+ expect(server.requestCount).to.be.equal(1);
175
+ expect(window.googletag.cmd).to.have.length(2);
176
+ sinon.assert.calledTwice(setTargetingStub);
177
+ sinon.assert.calledWith(
178
+ setTargetingStub.firstCall,
179
+ 'zeus_1234',
180
+ 'www.example.com'
181
+ );
182
+ sinon.assert.calledWith(setTargetingStub.secondCall, 'zeus_insights', [
183
+ 'bs0',
184
+ ]);
185
+ sinon.assert.notCalled(logErrorSpy);
186
+ });
187
+
188
+ it('should not set insights keyvalue when server returns 204', async () => {
189
+ zeusPrimeSubmodule.init({
190
+ params: {
191
+ gamId: '1234',
192
+ hostname: 'www.example.com',
193
+ pathname: '/article/some-article',
194
+ },
195
+ });
196
+
197
+ // Wait for request to be sent
198
+ await waitForStatus('insightsReqReceived');
199
+
200
+ // Response
201
+ server.requests[0].respond(204, { 'Content-Type': 'application/json' });
202
+
203
+ // Wait for the script to process the response
204
+ await waitForStatus('scriptComplete');
205
+
206
+ // execute any googletag commands added to the queue during execution
207
+ executeGoogletagTargeting();
208
+
209
+ expect(server.requestCount).to.be.equal(1);
210
+ expect(window.googletag.cmd).to.have.length(1);
211
+ sinon.assert.calledOnce(setTargetingStub);
212
+ sinon.assert.calledWith(
213
+ setTargetingStub.firstCall,
214
+ 'zeus_1234',
215
+ 'www.example.com'
216
+ );
217
+ sinon.assert.notCalled(logErrorSpy);
218
+ });
219
+
220
+ it('should not set insights keyvalue when server returns empty topics array', async () => {
221
+ zeusPrimeSubmodule.init({
222
+ params: {
223
+ gamId: '1234',
224
+ hostname: 'www.example.com',
225
+ pathname: '/article/some-article',
226
+ },
227
+ });
228
+
229
+ // Wait for request to be sent
230
+ await waitForStatus('insightsReqReceived');
231
+
232
+ // Respond
233
+ server.requests[0].respond(
234
+ 200,
235
+ { 'Content-Type': 'application/json' },
236
+ '{ "topics": [] }'
237
+ );
238
+
239
+ // Wait for the script to process the response
240
+ await waitForStatus('scriptComplete');
241
+
242
+ // execute any googletag commands added to the queue during execution
243
+ executeGoogletagTargeting();
244
+
245
+ expect(server.requestCount).to.be.equal(1);
246
+ expect(window.googletag.cmd).to.have.length(1);
247
+ sinon.assert.calledOnce(setTargetingStub);
248
+ sinon.assert.calledWith(
249
+ setTargetingStub.firstCall,
250
+ 'zeus_1234',
251
+ 'www.example.com'
252
+ );
253
+ sinon.assert.notCalled(logErrorSpy);
254
+ });
255
+
256
+ it('should not set insights keyvalue and emit error when server returns error status (400)', async () => {
257
+ zeusPrimeSubmodule.init({
258
+ params: {
259
+ gamId: '1234',
260
+ hostname: 'www.example.com',
261
+ pathname: '/article/some-article',
262
+ },
263
+ });
264
+
265
+ // Wait for request to be sent
266
+ await waitForStatus('insightsReqReceived');
267
+
268
+ // Response
269
+ server.requests[0].respond(
270
+ 404,
271
+ { 'Content-Type': 'application/json' },
272
+ '{"message": "Not found"}'
273
+ );
274
+
275
+ // Wait for the script to process the response
276
+ await waitForStatus('scriptComplete');
277
+
278
+ // execute any googletag commands added to the queue during execution
279
+ executeGoogletagTargeting();
280
+
281
+ expect(server.requestCount).to.be.equal(1);
282
+ expect(window.googletag.cmd).to.have.length(1);
283
+ sinon.assert.calledOnce(setTargetingStub);
284
+ sinon.assert.calledWith(
285
+ setTargetingStub.firstCall,
286
+ 'zeus_1234',
287
+ 'www.example.com'
288
+ );
289
+ sinon.assert.calledWith(
290
+ logErrorSpy,
291
+ 'zeusPrimeRtdProvider: ',
292
+ 'Topics request returned error: 404'
293
+ );
294
+ });
295
+
296
+ it('should not set insights keyvalue and emit error when response is not received (network request)', async () => {
297
+ zeusPrimeSubmodule.init({
298
+ params: {
299
+ gamId: '1234',
300
+ hostname: 'www.example.com',
301
+ pathname: '/article/some-article',
302
+ },
303
+ });
304
+
305
+ // Wait for request to be sent
306
+ await waitForStatus('insightsReqReceived');
307
+
308
+ // Response
309
+ server.requests[0].error();
310
+
311
+ // Wait for the script to process the response
312
+ await waitForStatus('scriptComplete');
313
+
314
+ // execute any googletag commands added to the queue during execution
315
+ executeGoogletagTargeting();
316
+
317
+ expect(server.requestCount).to.be.equal(1);
318
+ expect(window.googletag.cmd).to.have.length(1);
319
+ sinon.assert.calledOnce(setTargetingStub);
320
+ sinon.assert.calledWith(
321
+ setTargetingStub.firstCall,
322
+ 'zeus_1234',
323
+ 'www.example.com'
324
+ );
325
+ sinon.assert.calledWith(
326
+ logErrorSpy,
327
+ 'zeusPrimeRtdProvider: ',
328
+ 'failed to request topics'
329
+ );
330
+ });
331
+
332
+ it('fails gracefully when crypto fails', async () => {
333
+ const digestStub = sinon.stub(window.crypto.subtle, 'digest');
334
+ digestStub.throwsException('Failed to generate digest.');
335
+
336
+ zeusPrimeSubmodule.init({
337
+ params: {
338
+ gamId: '1234',
339
+ hostname: 'www.example.com',
340
+ pathname: '/article/some-article',
341
+ },
342
+ });
343
+
344
+ // Wait for request to be sent
345
+ await waitForStatus('scriptComplete');
346
+
347
+ sinon.assert.calledWith(
348
+ logErrorSpy,
349
+ 'zeusPrimeRtdProvider: ',
350
+ 'Failed to load hash'
351
+ );
352
+
353
+ digestStub.restore();
354
+ });
355
+
356
+ it('script should add zeus_prime key and not send request when disabled is set', async () => {
357
+ zeusPrimeSubmodule.init({
358
+ params: {
359
+ gamId: '1234',
360
+ disabled: true,
361
+ hostname: 'www.example.com',
362
+ pathname: '/article/some-article',
363
+ },
364
+ });
365
+
366
+ // Wait for request to be sent
367
+ await waitForStatus('scriptComplete');
368
+
369
+ // execute any googletag commands added to the queue during execution
370
+ executeGoogletagTargeting();
371
+
372
+ expect(server.requestCount).to.be.equal(0);
373
+ expect(window.googletag.cmd).to.have.length(1);
374
+ sinon.assert.calledWith(setTargetingStub, 'zeus_prime', 'false');
375
+ });
376
+
377
+ it('debug true enables debug logging', async () => {
378
+ zeusPrimeSubmodule.init({
379
+ params: {
380
+ gamId: '1234',
381
+ debug: true,
382
+ hostname: 'www.example.com',
383
+ pathname: '/article/some-article',
384
+ },
385
+ });
386
+
387
+ // Wait for request to be sent
388
+ await waitForStatus('scriptComplete');
389
+
390
+ sinon.assert.called(logMessageSpy);
391
+ sinon.assert.notCalled(logErrorSpy);
392
+ });
393
+
394
+ it('debug false disables debug logging', async () => {
395
+ window.zeusPrime.disabled = false;
396
+ zeusPrimeSubmodule.init({
397
+ params: {
398
+ gamId: '1234',
399
+ hostname: 'www.example.com',
400
+ pathname: '/article/some-article',
401
+ },
402
+ });
403
+
404
+ // Wait for request to be sent
405
+ await waitForStatus('scriptComplete');
406
+
407
+ sinon.assert.notCalled(logMessageSpy);
408
+ sinon.assert.notCalled(logErrorSpy);
409
+ });
410
+ });
@@ -5,6 +5,7 @@ import {
5
5
  nativeBidIsValid,
6
6
  getAssetMessage,
7
7
  getAllAssetsMessage,
8
+ toLegacyResponse,
8
9
  decorateAdUnitsWithNativeParams,
9
10
  isOpenRTBBidRequestValid,
10
11
  isNativeOpenRTBBidValid,
@@ -37,6 +38,7 @@ const bid = {
37
38
  clickTrackers: ['https://tracker.example'],
38
39
  impressionTrackers: ['https://impression.example'],
39
40
  javascriptTrackers: '<script src="http://www.foobar.js"></script>',
41
+ privacyLink: 'https://privacy-link.example',
40
42
  ext: {
41
43
  foo: 'foo-value',
42
44
  baz: 'baz-value',
@@ -98,9 +100,18 @@ const ortbBid = {
98
100
  privacy: 'https://privacy-link.example',
99
101
  ver: '1.2'
100
102
  }
101
- },
103
+ }
102
104
  };
103
105
 
106
+ const completeNativeBid = {
107
+ adId: '123',
108
+ transactionId: 'au',
109
+ native: {
110
+ ...bid.native,
111
+ ...ortbBid.native
112
+ }
113
+ }
114
+
104
115
  const ortbRequest = {
105
116
  assets: [
106
117
  {
@@ -224,6 +235,14 @@ describe('native.js', function () {
224
235
  expect(targeting.hb_native_baz).to.equal('hb_native_baz:123');
225
236
  });
226
237
 
238
+ it('sends placeholdes targetings with ortb native response', function () {
239
+ const targeting = getNativeTargeting(completeNativeBid);
240
+
241
+ expect(targeting[CONSTANTS.NATIVE_KEYS.title]).to.equal('Native Creative');
242
+ expect(targeting[CONSTANTS.NATIVE_KEYS.body]).to.equal('Cool description great stuff');
243
+ expect(targeting[CONSTANTS.NATIVE_KEYS.clickUrl]).to.equal('https://www.link.example');
244
+ });
245
+
227
246
  it('should only include native targeting keys with values', function () {
228
247
  const adUnit = {
229
248
  transactionId: 'au',
@@ -302,6 +321,10 @@ describe('native.js', function () {
302
321
  required: false,
303
322
  sendTargetingKeys: false,
304
323
  },
324
+ privacyLink: {
325
+ required: false,
326
+ sendTargetingKeys: false,
327
+ },
305
328
  ext: {
306
329
  foo: {
307
330
  required: false,
@@ -348,6 +371,7 @@ describe('native.js', function () {
348
371
  CONSTANTS.NATIVE_KEYS.icon,
349
372
  CONSTANTS.NATIVE_KEYS.sponsoredBy,
350
373
  CONSTANTS.NATIVE_KEYS.clickUrl,
374
+ CONSTANTS.NATIVE_KEYS.privacyLink,
351
375
  CONSTANTS.NATIVE_KEYS.rendererUrl,
352
376
  ]);
353
377
 
@@ -380,6 +404,7 @@ describe('native.js', function () {
380
404
  CONSTANTS.NATIVE_KEYS.icon,
381
405
  CONSTANTS.NATIVE_KEYS.sponsoredBy,
382
406
  CONSTANTS.NATIVE_KEYS.clickUrl,
407
+ CONSTANTS.NATIVE_KEYS.privacyLink,
383
408
  ]);
384
409
 
385
410
  expect(bid.native.adTemplate).to.deep.equal(
@@ -437,9 +462,9 @@ describe('native.js', function () {
437
462
  adId: '123',
438
463
  };
439
464
 
440
- const message = getAllAssetsMessage(messageRequest, bid, {getNativeReq: () => null});
465
+ const message = getAllAssetsMessage(messageRequest, bid);
441
466
 
442
- expect(message.assets.length).to.equal(9);
467
+ expect(message.assets.length).to.equal(10);
443
468
  expect(message.assets).to.deep.include({
444
469
  key: 'body',
445
470
  value: bid.native.body,
@@ -485,7 +510,7 @@ describe('native.js', function () {
485
510
  adId: '123',
486
511
  };
487
512
 
488
- const message = getAllAssetsMessage(messageRequest, bidWithUndefinedFields, {getNativeReq: () => null});
513
+ const message = getAllAssetsMessage(messageRequest, bidWithUndefinedFields);
489
514
 
490
515
  expect(message.assets.length).to.equal(4);
491
516
  expect(message.assets).to.deep.include({
@@ -506,16 +531,16 @@ describe('native.js', function () {
506
531
  });
507
532
  });
508
533
 
509
- it('creates native all asset message with OpenRTB format', function () {
534
+ it('creates native all asset message with complete format', function () {
510
535
  const messageRequest = {
511
536
  message: 'Prebid Native',
512
537
  action: 'allAssetRequest',
513
538
  adId: '123',
514
539
  };
515
540
 
516
- const message = getAllAssetsMessage(messageRequest, ortbBid, {getNativeReq: () => ortbRequest});
541
+ const message = getAllAssetsMessage(messageRequest, completeNativeBid);
517
542
 
518
- expect(message.assets.length).to.equal(8);
543
+ expect(message.assets.length).to.equal(10);
519
544
  expect(message.assets).to.deep.include({
520
545
  key: 'body',
521
546
  value: bid.native.body,
@@ -548,6 +573,14 @@ describe('native.js', function () {
548
573
  key: 'privacyLink',
549
574
  value: ortbBid.native.ortb.privacy,
550
575
  });
576
+ expect(message.assets).to.deep.include({
577
+ key: 'foo',
578
+ value: bid.native.ext.foo,
579
+ });
580
+ expect(message.assets).to.deep.include({
581
+ key: 'baz',
582
+ value: bid.native.ext.baz,
583
+ });
551
584
  });
552
585
 
553
586
  const SAMPLE_ORTB_REQUEST = toOrtbNativeRequest({
@@ -555,60 +588,39 @@ describe('native.js', function () {
555
588
  body: 'vbody'
556
589
  });
557
590
  const SAMPLE_ORTB_RESPONSE = {
558
- native: {
559
- ortb: {
560
- link: {
561
- url: 'url'
562
- },
563
- assets: [
564
- {
565
- id: 0,
566
- title: {
567
- text: 'vtitle'
568
- }
569
- },
570
- {
571
- id: 1,
572
- data: {
573
- value: 'vbody'
574
- }
575
- }
576
- ]
591
+ link: {
592
+ url: 'url'
593
+ },
594
+ assets: [
595
+ {
596
+ id: 0,
597
+ title: {
598
+ text: 'vtitle'
599
+ }
600
+ },
601
+ {
602
+ id: 1,
603
+ data: {
604
+ value: 'vbody'
605
+ }
577
606
  }
578
- }
607
+ ],
608
+ eventtrackers: [
609
+ { event: 1, method: 1, url: 'https://sampleurl.com' },
610
+ { event: 1, method: 2, url: 'https://sampleurljs.com' }
611
+ ]
579
612
  }
580
- describe('getAllAssetsMessage', () => {
613
+ describe('toLegacyResponse', () => {
581
614
  it('returns assets in legacy format for ortb responses', () => {
582
- const actual = getAllAssetsMessage({}, SAMPLE_ORTB_RESPONSE, {getNativeReq: () => SAMPLE_ORTB_REQUEST});
583
- expect(actual.assets).to.eql([
584
- {
585
- key: 'clickUrl',
586
- value: 'url'
587
- },
588
- {
589
- key: 'title',
590
- value: 'vtitle'
591
- },
592
- {
593
- key: 'body',
594
- value: 'vbody'
595
- },
596
- ])
615
+ const actual = toLegacyResponse(SAMPLE_ORTB_RESPONSE, SAMPLE_ORTB_REQUEST);
616
+ expect(actual.body).to.equal('vbody');
617
+ expect(actual.title).to.equal('vtitle');
618
+ expect(actual.clickUrl).to.equal('url');
619
+ expect(actual.javascriptTrackers).to.equal('<script async src="https://sampleurljs.com"></script>');
620
+ expect(actual.impressionTrackers.length).to.equal(1);
621
+ expect(actual.impressionTrackers[0]).to.equal('https://sampleurl.com');
597
622
  });
598
623
  });
599
- describe('getAssetsMessage', () => {
600
- Object.entries({
601
- 'hb_native_title': {key: 'title', value: 'vtitle'},
602
- 'hb_native_body': {key: 'body', value: 'vbody'}
603
- }).forEach(([tkey, assetVal]) => {
604
- it(`returns ${tkey} asset in legacy format for ortb responses`, () => {
605
- const actual = getAssetMessage({
606
- assets: [tkey]
607
- }, SAMPLE_ORTB_RESPONSE, {getNativeReq: () => SAMPLE_ORTB_REQUEST})
608
- expect(actual.assets).to.eql([assetVal])
609
- })
610
- })
611
- })
612
624
  });
613
625
 
614
626
  describe('validate native openRTB', function () {