prebid.js 9.4.0 → 9.5.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 (363) hide show
  1. package/.eslintrc.js +31 -5
  2. package/.github/workflows/jscpd.yml +2 -2
  3. package/.github/workflows/linter.yml +107 -0
  4. package/creative/crossDomain.js +6 -3
  5. package/dist/33acrossAnalyticsAdapter.js +1 -1
  6. package/dist/33acrossBidAdapter.js +1 -1
  7. package/dist/33acrossIdSystem.js +1 -1
  8. package/dist/BTBidAdapter.js +1 -1
  9. package/dist/adagioAnalyticsAdapter.js +1 -1
  10. package/dist/adagioBidAdapter.js +1 -1
  11. package/dist/adagioRtdProvider.js +1 -1
  12. package/dist/adagioUtils.js +1 -1
  13. package/dist/addefendBidAdapter.js +1 -1
  14. package/dist/adgenerationBidAdapter.js +1 -1
  15. package/dist/adkernelAdnBidAdapter.js +1 -1
  16. package/dist/adkernelBidAdapter.js +1 -1
  17. package/dist/adkernelUtils.js +1 -0
  18. package/dist/adlooxRtdProvider.js +1 -1
  19. package/dist/admixerBidAdapter.js +1 -1
  20. package/dist/adqueryBidAdapter.js +1 -1
  21. package/dist/adrelevantisBidAdapter.js +1 -1
  22. package/dist/adstirBidAdapter.js +1 -1
  23. package/dist/adtrgtmeBidAdapter.js +1 -1
  24. package/dist/advRedAnalyticsAdapter.js +1 -0
  25. package/dist/adxcgAnalyticsAdapter.js +1 -1
  26. package/dist/adxcgBidAdapter.js +1 -1
  27. package/dist/adyoulikeBidAdapter.js +1 -1
  28. package/dist/agmaAnalyticsAdapter.js +1 -1
  29. package/dist/ajaBidAdapter.js +1 -1
  30. package/dist/akamaiDapRtdProvider.js +1 -1
  31. package/dist/amxBidAdapter.js +1 -1
  32. package/dist/amxIdSystem.js +1 -1
  33. package/dist/anonymisedRtdProvider.js +1 -1
  34. package/dist/apacdexBidAdapter.js +1 -1
  35. package/dist/appierAnalyticsAdapter.js +1 -1
  36. package/dist/appnexusBidAdapter.js +1 -1
  37. package/dist/asoBidAdapter.js +1 -1
  38. package/dist/axonixBidAdapter.js +1 -1
  39. package/dist/azerionedgeRtdProvider.js +1 -1
  40. package/dist/bidglassBidAdapter.js +1 -1
  41. package/dist/big-richmediaBidAdapter.js +1 -1
  42. package/dist/bridBidAdapter.js +1 -1
  43. package/dist/bridgewellBidAdapter.js +1 -1
  44. package/dist/brightMountainMediaBidAdapter.js +1 -1
  45. package/dist/carodaBidAdapter.js +1 -1
  46. package/dist/chtnwBidAdapter.js +1 -1
  47. package/dist/chunk-core.js +1 -1
  48. package/dist/concertBidAdapter.js +1 -1
  49. package/dist/connatixBidAdapter.js +1 -1
  50. package/dist/connectadBidAdapter.js +1 -1
  51. package/dist/consumableBidAdapter.js +1 -1
  52. package/dist/contxtfulRtdProvider.js +1 -1
  53. package/dist/conversantAnalyticsAdapter.js +1 -1
  54. package/dist/conversantBidAdapter.js +1 -1
  55. package/dist/craftBidAdapter.js +1 -1
  56. package/dist/criteoBidAdapter.js +1 -1
  57. package/dist/currencyUtils.js +1 -1
  58. package/dist/cwireBidAdapter.js +1 -1
  59. package/dist/dailymotionBidAdapter.js +1 -1
  60. package/dist/debugging-standalone.js +1 -1
  61. package/dist/dependencies.json +43 -7
  62. package/dist/dfpAdServerVideo.js +1 -1
  63. package/dist/dfpAdpod.js +1 -1
  64. package/dist/dfpUtils.js +1 -1
  65. package/dist/discoveryBidAdapter.js +1 -1
  66. package/dist/dspxBidAdapter.js +1 -1
  67. package/dist/dxkultureBidAdapter.js +1 -1
  68. package/dist/eightPodAnalyticsAdapter.js +1 -1
  69. package/dist/eightPodBidAdapter.js +1 -1
  70. package/dist/eplanningBidAdapter.js +1 -1
  71. package/dist/euidIdSystem.js +1 -1
  72. package/dist/exadsBidAdapter.js +1 -1
  73. package/dist/feedadBidAdapter.js +1 -1
  74. package/dist/finativeBidAdapter.js +1 -1
  75. package/dist/fintezaAnalyticsAdapter.js +1 -1
  76. package/dist/fpdUtils.js +1 -0
  77. package/dist/freewheel-sspBidAdapter.js +1 -1
  78. package/dist/gmosspBidAdapter.js +1 -1
  79. package/dist/goldbachBidAdapter.js +1 -1
  80. package/dist/gptPreAuction.js +1 -1
  81. package/dist/gptUtils.js +1 -1
  82. package/dist/greenbidsAnalyticsAdapter.js +1 -1
  83. package/dist/greenbidsRtdProvider.js +1 -1
  84. package/dist/gridBidAdapter.js +1 -1
  85. package/dist/growthCodeAnalyticsAdapter.js +1 -1
  86. package/dist/growthCodeRtdProvider.js +1 -1
  87. package/dist/gumgumBidAdapter.js +1 -1
  88. package/dist/h12mediaBidAdapter.js +1 -1
  89. package/dist/hypelabBidAdapter.js +1 -1
  90. package/dist/id5AnalyticsAdapter.js +1 -1
  91. package/dist/id5IdSystem.js +1 -1
  92. package/dist/imdsBidAdapter.js +1 -1
  93. package/dist/improvedigitalBidAdapter.js +1 -1
  94. package/dist/insticatorBidAdapter.js +1 -1
  95. package/dist/intentIqAnalyticsAdapter.js +1 -0
  96. package/dist/ixBidAdapter.js +1 -1
  97. package/dist/jixieBidAdapter.js +1 -1
  98. package/dist/justpremiumBidAdapter.js +1 -1
  99. package/dist/jwplayerBidAdapter.js +1 -1
  100. package/dist/jwplayerRtdProvider.js +1 -1
  101. package/dist/kargoBidAdapter.js +1 -1
  102. package/dist/kimberliteBidAdapter.js +1 -1
  103. package/dist/konduitAnalyticsAdapter.js +1 -1
  104. package/dist/kueezBidAdapter.js +1 -1
  105. package/dist/lassoBidAdapter.js +1 -1
  106. package/dist/lifestreetBidAdapter.js +1 -1
  107. package/dist/liveIntentIdSystem.js +1 -1
  108. package/dist/logicadBidAdapter.js +1 -1
  109. package/dist/loglyliftBidAdapter.js +1 -1
  110. package/dist/luceadBidAdapter.js +1 -1
  111. package/dist/mabidderBidAdapter.js +1 -1
  112. package/dist/magniteAnalyticsAdapter.js +1 -1
  113. package/dist/malltvAnalyticsAdapter.js +1 -1
  114. package/dist/marsmediaBidAdapter.js +1 -1
  115. package/dist/mediafuseBidAdapter.js +1 -1
  116. package/dist/mediagoBidAdapter.js +1 -1
  117. package/dist/medianetAnalyticsAdapter.js +1 -1
  118. package/dist/medianetBidAdapter.js +1 -1
  119. package/dist/mediasquareBidAdapter.js +1 -1
  120. package/dist/mgidBidAdapter.js +1 -1
  121. package/dist/minutemediaBidAdapter.js +1 -1
  122. package/dist/missenaBidAdapter.js +1 -1
  123. package/dist/mobianRtdProvider.js +1 -1
  124. package/dist/nextMillenniumBidAdapter.js +1 -1
  125. package/dist/nexx360BidAdapter.js +1 -1
  126. package/dist/nobidAnalyticsAdapter.js +1 -1
  127. package/dist/nobidBidAdapter.js +1 -1
  128. package/dist/not-for-prod/prebid.js +201 -193
  129. package/dist/oguryBidAdapter.js +1 -1
  130. package/dist/onetagBidAdapter.js +1 -1
  131. package/dist/ooloAnalyticsAdapter.js +1 -1
  132. package/dist/openwebBidAdapter.js +1 -1
  133. package/dist/openxBidAdapter.js +1 -1
  134. package/dist/optidigitalBidAdapter.js +1 -1
  135. package/dist/optoutBidAdapter.js +1 -1
  136. package/dist/orbidderBidAdapter.js +1 -1
  137. package/dist/outbrainBidAdapter.js +1 -1
  138. package/dist/paapi.js +1 -1
  139. package/dist/permutiveRtdProvider.js +1 -1
  140. package/dist/pixfutureBidAdapter.js +1 -1
  141. package/dist/playdigoBidAdapter.js +1 -1
  142. package/dist/prebidServerBidAdapter.js +1 -1
  143. package/dist/programmaticaBidAdapter.js +1 -1
  144. package/dist/publinkIdSystem.js +1 -1
  145. package/dist/publirBidAdapter.js +1 -1
  146. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  147. package/dist/pubmaticBidAdapter.js +1 -1
  148. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  149. package/dist/pubxaiAnalyticsAdapter.js +1 -1
  150. package/dist/pxyzBidAdapter.js +1 -1
  151. package/dist/quantcastBidAdapter.js +1 -1
  152. package/dist/readpeakBidAdapter.js +1 -1
  153. package/dist/relaidoBidAdapter.js +1 -1
  154. package/dist/relevatehealthBidAdapter.js +1 -1
  155. package/dist/retailspotBidAdapter.js +1 -1
  156. package/dist/rhythmoneBidAdapter.js +1 -1
  157. package/dist/ringieraxelspringerBidAdapter.js +1 -1
  158. package/dist/riseBidAdapter.js +1 -1
  159. package/dist/rubiconBidAdapter.js +1 -1
  160. package/dist/schainSerializer.js +1 -0
  161. package/dist/seedingAllianceBidAdapter.js +1 -1
  162. package/dist/seedtagBidAdapter.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/sizeMapping.js +1 -1
  167. package/dist/sizeUtils.js +1 -1
  168. package/dist/smaatoBidAdapter.js +1 -1
  169. package/dist/smartadserverBidAdapter.js +1 -1
  170. package/dist/smartxBidAdapter.js +1 -1
  171. package/dist/smilewantedBidAdapter.js +1 -1
  172. package/dist/snigelBidAdapter.js +1 -1
  173. package/dist/sonobiBidAdapter.js +1 -1
  174. package/dist/sovrnBidAdapter.js +1 -1
  175. package/dist/sspBCBidAdapter.js +1 -1
  176. package/dist/stnBidAdapter.js +1 -1
  177. package/dist/stvBidAdapter.js +1 -1
  178. package/dist/sublimeBidAdapter.js +1 -1
  179. package/dist/symitriDapRtdProvider.js +1 -0
  180. package/dist/taboolaBidAdapter.js +1 -1
  181. package/dist/tappxBidAdapter.js +1 -1
  182. package/dist/targetVideoBidAdapter.js +1 -1
  183. package/dist/targetVideoUtils.js +1 -0
  184. package/dist/teadsBidAdapter.js +1 -1
  185. package/dist/terceptAnalyticsAdapter.js +1 -1
  186. package/dist/themoneytizerBidAdapter.js +1 -1
  187. package/dist/trionBidAdapter.js +1 -1
  188. package/dist/tripleliftBidAdapter.js +1 -1
  189. package/dist/ttdBidAdapter.js +1 -1
  190. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  191. package/dist/uid2IdSystem.js +1 -1
  192. package/dist/underdogmediaBidAdapter.js +1 -1
  193. package/dist/undertoneBidAdapter.js +1 -1
  194. package/dist/unrulyBidAdapter.js +1 -1
  195. package/dist/userAgentUtils.js +1 -0
  196. package/dist/utiqIdSystem.js +1 -1
  197. package/dist/vidazooUtils.js +1 -1
  198. package/dist/videobyteBidAdapter.js +1 -1
  199. package/dist/visxBidAdapter.js +1 -1
  200. package/dist/vuukleBidAdapter.js +1 -1
  201. package/dist/widespaceBidAdapter.js +1 -1
  202. package/dist/winrBidAdapter.js +1 -1
  203. package/dist/yahooAdsBidAdapter.js +1 -1
  204. package/dist/yandexIdSystem.js +1 -1
  205. package/dist/yieldmoBidAdapter.js +1 -1
  206. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  207. package/integrationExamples/gpt/x-domain/creative.html +1 -1
  208. package/libraries/adkernelUtils/adkernelUtils.js +11 -0
  209. package/libraries/currencyUtils/floor.js +23 -0
  210. package/libraries/dfpUtils/dfpUtils.js +7 -0
  211. package/libraries/fpdUtils/deviceInfo.js +58 -0
  212. package/libraries/fpdUtils/pageInfo.js +73 -0
  213. package/libraries/gptUtils/gptUtils.js +23 -1
  214. package/libraries/schainSerializer/schainSerializer.js +24 -0
  215. package/libraries/sizeUtils/tranformSize.js +43 -0
  216. package/libraries/targetVideoUtils/bidderUtils.js +178 -0
  217. package/libraries/targetVideoUtils/constants.js +23 -0
  218. package/libraries/userAgentUtils/index.js +58 -0
  219. package/libraries/userAgentUtils/userAgentTypes.enums.js +22 -0
  220. package/modules/.submodules.json +1 -0
  221. package/modules/33acrossAnalyticsAdapter.js +2 -0
  222. package/modules/adagioBidAdapter.js +1 -1
  223. package/modules/adagioRtdProvider.js +18 -4
  224. package/modules/adkernelAdnBidAdapter.js +1 -12
  225. package/modules/adkernelBidAdapter.js +4 -13
  226. package/modules/adlooxAnalyticsAdapter.js +1 -0
  227. package/modules/admixerBidAdapter.js +10 -6
  228. package/modules/admixerBidAdapter.md +7 -10
  229. package/modules/adtrgtmeBidAdapter.js +1 -1
  230. package/modules/advRedAnalyticsAdapter.js +198 -0
  231. package/modules/advRedAnalyticsAdapter.md +30 -0
  232. package/modules/akamaiDapRtdProvider.js +19 -798
  233. package/modules/anonymisedRtdProvider.js +5 -1
  234. package/modules/anonymisedRtdProvider.md +1 -1
  235. package/modules/apacdexBidAdapter.js +1 -1
  236. package/modules/appnexusBidAdapter.js +56 -2
  237. package/modules/automatadAnalyticsAdapter.js +2 -0
  238. package/modules/azerionedgeRtdProvider.js +13 -3
  239. package/modules/azerionedgeRtdProvider.md +0 -17
  240. package/modules/bridBidAdapter.js +47 -47
  241. package/modules/cleanioRtdProvider.js +1 -0
  242. package/modules/concertBidAdapter.js +1 -1
  243. package/modules/connatixBidAdapter.js +36 -8
  244. package/modules/connectIdSystem.js +3 -1
  245. package/modules/contxtfulRtdProvider.js +20 -2
  246. package/modules/contxtfulRtdProvider.md +1 -0
  247. package/modules/craftBidAdapter.js +1 -1
  248. package/modules/criteoBidAdapter.js +1 -1
  249. package/modules/cwireBidAdapter.js +5 -1
  250. package/modules/dailymotionBidAdapter.js +85 -65
  251. package/modules/debugging/debugging.js +3 -0
  252. package/modules/dfpAdServerVideo.js +15 -33
  253. package/modules/dfpAdpod.js +2 -6
  254. package/modules/dgkeywordRtdProvider.js +2 -0
  255. package/modules/discoveryBidAdapter.js +26 -210
  256. package/modules/dspxBidAdapter.js +176 -54
  257. package/modules/eightPodAnalyticsAdapter.js +28 -34
  258. package/modules/eightPodBidAdapter.js +113 -57
  259. package/modules/fintezaAnalyticsAdapter.js +9 -4
  260. package/modules/goldbachBidAdapter.js +1 -1
  261. package/modules/gptPreAuction.js +63 -4
  262. package/modules/growthCodeAnalyticsAdapter.js +1 -1
  263. package/modules/growthCodeRtdProvider.js +1 -1
  264. package/modules/gumgumBidAdapter.js +14 -10
  265. package/modules/improvedigitalBidAdapter.js +1 -1
  266. package/modules/intentIqAnalyticsAdapter.js +234 -0
  267. package/modules/intentIqAnalyticsAdapter.md +27 -0
  268. package/modules/intentIqIdSystem.md +0 -0
  269. package/modules/jwplayerBidAdapter.js +1 -1
  270. package/modules/jwplayerRtdProvider.js +26 -6
  271. package/modules/jwplayerVideoProvider.js +6 -0
  272. package/modules/mediafuseBidAdapter.js +1 -1
  273. package/modules/mediagoBidAdapter.js +7 -176
  274. package/modules/medianetBidAdapter.js +101 -40
  275. package/modules/mgidBidAdapter.js +3 -1
  276. package/modules/mobianRtdProvider.js +16 -2
  277. package/modules/nextMillenniumBidAdapter.js +1 -27
  278. package/modules/nobidBidAdapter.js +1 -1
  279. package/modules/optoutBidAdapter.js +1 -1
  280. package/modules/paapi.js +48 -35
  281. package/modules/permutiveRtdProvider.js +72 -22
  282. package/modules/playdigoBidAdapter.js +4 -2
  283. package/modules/prebidServerBidAdapter/index.js +4 -2
  284. package/modules/prebidServerBidAdapter/ortbConverter.js +1 -0
  285. package/modules/programmaticaBidAdapter.js +1 -1
  286. package/modules/pubmaticBidAdapter.js +12 -0
  287. package/modules/pubxaiAnalyticsAdapter.js +306 -164
  288. package/modules/relevatehealthBidAdapter.js +2 -1
  289. package/modules/richaudienceBidAdapter.js +1 -1
  290. package/modules/rtdModule/index.js +5 -3
  291. package/modules/sirdataRtdProvider.js +2 -0
  292. package/modules/sizeMapping.js +2 -5
  293. package/modules/smaatoBidAdapter.js +18 -1
  294. package/modules/smilewantedBidAdapter.js +26 -22
  295. package/modules/snigelBidAdapter.js +1 -1
  296. package/modules/sonobiBidAdapter.js +5 -10
  297. package/modules/symitriDapRtdProvider.js +812 -0
  298. package/modules/symitriDapRtdProvider.md +49 -0
  299. package/modules/targetVideoBidAdapter.js +120 -152
  300. package/modules/targetVideoBidAdapter.md +20 -3
  301. package/modules/userId/eids.js +3 -0
  302. package/modules/utiqIdSystem.js +12 -10
  303. package/modules/validationFpdModule/index.js +22 -17
  304. package/modules/videojsVideoProvider.js +3 -0
  305. package/modules/visxBidAdapter.js +1 -1
  306. package/modules/winrBidAdapter.js +2 -27
  307. package/modules/yahooAdsBidAdapter.js +1 -1
  308. package/modules/yandexIdSystem.js +1 -1
  309. package/package.json +4 -4
  310. package/plugins/eslint/index.js +73 -45
  311. package/src/adRendering.js +7 -3
  312. package/src/adloader.js +1 -0
  313. package/src/ajax.js +15 -0
  314. package/src/config.js +0 -4
  315. package/src/debugging.js +1 -0
  316. package/src/secureCreatives.js +1 -1
  317. package/src/storageManager.js +62 -73
  318. package/src/targeting.js +26 -20
  319. package/src/utils.js +9 -0
  320. package/test/pages/banner_sync.html +97 -0
  321. package/test/pages/consent_mgt_gdpr.html +1 -1
  322. package/test/spec/ajax_spec.js +11 -0
  323. package/test/spec/creative/crossDomainCreative_spec.js +26 -9
  324. package/test/spec/e2e/banner/basic_banner_ad.spec.js +20 -14
  325. package/test/spec/fpd/gdpr_spec.js +1 -1
  326. package/test/spec/libraries/userAgentUtils_spec.js +109 -0
  327. package/test/spec/modules/adagioRtdProvider_spec.js +72 -0
  328. package/test/spec/modules/admixerBidAdapter_spec.js +21 -17
  329. package/test/spec/modules/advRedAnalyticsAdapter_spec.js +114 -0
  330. package/test/spec/modules/adxcgBidAdapter_spec.js +1 -1
  331. package/test/spec/modules/appnexusBidAdapter_spec.js +36 -0
  332. package/test/spec/modules/azerionedgeRtdProvider_spec.js +36 -21
  333. package/test/spec/modules/connatixBidAdapter_spec.js +55 -2
  334. package/test/spec/modules/consentManagement_spec.js +1 -1
  335. package/test/spec/modules/contxtfulRtdProvider_spec.js +6 -0
  336. package/test/spec/modules/dailymotionBidAdapter_spec.js +497 -4
  337. package/test/spec/modules/discoveryBidAdapter_spec.js +9 -6
  338. package/test/spec/modules/dspxBidAdapter_spec.js +188 -7
  339. package/test/spec/modules/eightPodAnalyticsAdapter_spec.js +22 -13
  340. package/test/spec/modules/gptPreAuction_spec.js +143 -1
  341. package/test/spec/modules/gumgumBidAdapter_spec.js +17 -0
  342. package/test/spec/modules/intentIqAnalyticsAdapter_spec.js +172 -0
  343. package/test/spec/modules/jwplayerRtdProvider_spec.js +61 -0
  344. package/test/spec/modules/mediagoBidAdapter_spec.js +34 -37
  345. package/test/spec/modules/medianetBidAdapter_spec.js +297 -16
  346. package/test/spec/modules/mgidBidAdapter_spec.js +15 -5
  347. package/test/spec/modules/mobianRtdProvider_spec.js +1 -3
  348. package/test/spec/modules/paapi_spec.js +177 -111
  349. package/test/spec/modules/permutiveRtdProvider_spec.js +42 -8
  350. package/test/spec/modules/prebidServerBidAdapter_spec.js +17 -3
  351. package/test/spec/modules/proxistoreBidAdapter_spec.js +1 -1
  352. package/test/spec/modules/pubmaticBidAdapter_spec.js +40 -0
  353. package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +970 -603
  354. package/test/spec/modules/pulsepointBidAdapter_spec.js +4 -4
  355. package/test/spec/modules/smaatoBidAdapter_spec.js +36 -1
  356. package/test/spec/modules/smilewantedBidAdapter_spec.js +57 -1
  357. package/test/spec/modules/symitriDapRtdProvider_spec.js +600 -0
  358. package/test/spec/modules/targetVideoBidAdapter_spec.js +112 -11
  359. package/test/spec/modules/yandexIdSystem_spec.js +6 -1
  360. package/test/spec/schainSerializer/schainSerializer_spec.js +138 -0
  361. package/test/spec/unit/core/storageManager_spec.js +68 -51
  362. package/test/spec/utils_spec.js +19 -0
  363. /package/src/utils/{gpdr.js → gdpr.js} +0 -0
@@ -1,52 +1,13 @@
1
1
  const _ = require('lodash');
2
2
  const { flagErrors } = require('./validateImports.js');
3
+ const noGlobal = require('eslint/lib/rules/no-restricted-globals.js');
4
+
5
+ function getName(node) {
6
+ return node.type === 'Literal' ? node.value : node.name;
7
+ }
3
8
 
4
9
  module.exports = {
5
10
  rules: {
6
- 'no-outerText': {
7
- meta: {
8
- docs: {
9
- description: '.outerText property on DOM elements should not be used due to performance issues'
10
- },
11
- messages: {
12
- noInnerText: 'Use of `.outerText` is not allowed. Use `.textContent` instead.',
13
- }
14
- },
15
- create: function(context) {
16
- return {
17
- MemberExpression(node) {
18
- if (node.property && node.property.name === 'outerText') {
19
- context.report({
20
- node: node.property,
21
- messageId: 'noOuterText',
22
- });
23
- }
24
- }
25
- }
26
- }
27
- },
28
- 'no-innerText': {
29
- meta: {
30
- docs: {
31
- description: '.innerText property on DOM elements should not be used due to performance issues'
32
- },
33
- messages: {
34
- noInnerText: 'Use of `.innerText` is not allowed. Use `.textContent` instead.',
35
- }
36
- },
37
- create: function(context) {
38
- return {
39
- MemberExpression(node) {
40
- if (node.property && node.property.name === 'innerText') {
41
- context.report({
42
- node: node.property,
43
- messageId: 'noInnerText',
44
- });
45
- }
46
- }
47
- }
48
- }
49
- },
50
11
  'validate-imports': {
51
12
  meta: {
52
13
  docs: {
@@ -69,8 +30,75 @@ module.exports = {
69
30
  let importPath = node.source.value.trim();
70
31
  flagErrors(context, node, importPath);
71
32
  }
33
+ };
34
+ }
35
+ },
36
+ 'no-member': {
37
+ meta: {
38
+ schema: {
39
+ type: 'array',
40
+ items: {
41
+ type: 'object',
42
+ properties: {
43
+ target: { type: 'string' },
44
+ name: { type: 'string' },
45
+ message: { type: 'string' }
46
+ },
47
+ required: ['name', 'message'],
48
+ additionalProperties: false
49
+ },
50
+ uniqueItems: true,
51
+ minItems: 1
52
+ },
53
+
54
+ messages: {
55
+ noMember: "Unexpected use of '{{target}}.{{name}}'. {{message}}",
72
56
  }
57
+ },
58
+
59
+ create(context) {
60
+ return {
61
+ MemberExpression(node) {
62
+ context.options.forEach(({name, target, message}) => {
63
+ if (target === node.object.name && getName(node.property) === name) {
64
+ context.report({
65
+ node,
66
+ messageId: 'noMember',
67
+ data: {
68
+ name,
69
+ target: target || '',
70
+ message
71
+ }
72
+ });
73
+ }
74
+ });
75
+ }
76
+ }
77
+ }
78
+ },
79
+ 'no-global': Object.assign({}, noGlobal, {
80
+ // no-restricted-global that also looks for `window.GLOBAL`
81
+ create(context) {
82
+ const globals = Object.fromEntries(
83
+ context.options.map(option => typeof option === 'string' ? [option, null] : [option.name, option.message])
84
+ )
85
+ return Object.assign(noGlobal.create(context), {
86
+ MemberExpression(node) {
87
+ const name = getName(node.property);
88
+ if (node.object.name === 'window' && globals.hasOwnProperty(name)) {
89
+ const customMessage = globals[name];
90
+ context.report({
91
+ node,
92
+ messageId: customMessage == null ? 'defaultMessage' : 'customMessage',
93
+ data: {
94
+ name,
95
+ customMessage
96
+ }
97
+ })
98
+ }
99
+ }
100
+ })
73
101
  }
74
- }
102
+ }),
75
103
  }
76
104
  };
@@ -253,8 +253,12 @@ export function renderAdDirect(doc, adId, options) {
253
253
  */
254
254
  export function insertLocatorFrame() {
255
255
  if (!window.frames[PB_LOCATOR]) {
256
- const frame = createInvisibleIframe();
257
- frame.name = PB_LOCATOR;
258
- document.body.appendChild(frame);
256
+ if (!document.body) {
257
+ window.requestAnimationFrame(insertLocatorFrame);
258
+ } else {
259
+ const frame = createInvisibleIframe();
260
+ frame.name = PB_LOCATOR;
261
+ document.body.appendChild(frame);
262
+ }
259
263
  }
260
264
  }
package/src/adloader.js CHANGED
@@ -31,6 +31,7 @@ const _approvedLoadExternalJSList = [
31
31
  'qortex',
32
32
  'dynamicAdBoost',
33
33
  '51Degrees',
34
+ 'symitridap',
34
35
  // UserId Submodules
35
36
  'justtag',
36
37
  'tncId',
package/src/ajax.js CHANGED
@@ -104,6 +104,7 @@ function toXHR({status, statusText = '', headers, url}, responseText) {
104
104
  return xml;
105
105
  }
106
106
  return {
107
+ // eslint-disable-next-line prebid/no-global
107
108
  readyState: XMLHttpRequest.DONE,
108
109
  status,
109
110
  statusText,
@@ -147,5 +148,19 @@ export function ajaxBuilder(timeout = 3000, {request, done} = {}) {
147
148
  };
148
149
  }
149
150
 
151
+ /**
152
+ * simple wrapper around sendBeacon such that invocations of navigator.sendBeacon can be centrally maintained.
153
+ * verifies that the navigator and sendBeacon are defined for maximum compatibility
154
+ * @param {string} url The URL that will receive the data. Can be relative or absolute.
155
+ * @param {*} data An ArrayBuffer, a TypedArray, a DataView, a Blob, a string literal or object, a FormData or a URLSearchParams object containing the data to send.
156
+ * @returns {boolean} true if the user agent successfully queued the data for transfer. Otherwise, it returns false.
157
+ */
158
+ export function sendBeacon(url, data) {
159
+ if (!window.navigator || !window.navigator.sendBeacon) {
160
+ return false;
161
+ }
162
+ return window.navigator.sendBeacon(url, data);
163
+ }
164
+
150
165
  export const ajax = ajaxBuilder();
151
166
  export const fetch = fetcherFactory();
package/src/config.js CHANGED
@@ -38,8 +38,6 @@ const DEFAULT_DEVICE_ACCESS = true;
38
38
  const DEFAULT_MAX_NESTED_IFRAMES = 10;
39
39
  const DEFAULT_MAXBID_VALUE = 5000
40
40
 
41
- const DEFAULT_TIMEOUTBUFFER = 400;
42
-
43
41
  const DEFAULT_IFRAMES_CONFIG = {};
44
42
 
45
43
  export const RANDOM = 'random';
@@ -157,8 +155,6 @@ export function newConfig() {
157
155
  */
158
156
  deviceAccess: DEFAULT_DEVICE_ACCESS,
159
157
 
160
- // timeout buffer to adjust for bidder CDN latency
161
- timeoutBuffer: DEFAULT_TIMEOUTBUFFER,
162
158
  disableAjaxTimeout: DEFAULT_DISABLE_AJAX_TIMEOUT,
163
159
 
164
160
  // default max nested iframes for referer detection
package/src/debugging.js CHANGED
@@ -73,6 +73,7 @@ export const reset = ctl.reset;
73
73
  export function loadSession() {
74
74
  let storage = null;
75
75
  try {
76
+ // eslint-disable-next-line prebid/no-global
76
77
  storage = window.sessionStorage;
77
78
  } catch (e) {}
78
79
 
@@ -144,7 +144,7 @@ export function resizeRemoteCreative({adId, adUnitCode, width, height}) {
144
144
  elementStyle.width = getDimension(width)
145
145
  elementStyle.height = getDimension(height);
146
146
  } else {
147
- logWarn(`Unable to locate matching page element for adUnitCode ${adUnitCode}. Can't resize it to ad's dimensions. Please review setup.`);
147
+ logError(`Unable to locate matching page element for adUnitCode ${adUnitCode}. Can't resize it to ad's dimensions. Please review setup.`);
148
148
  }
149
149
  });
150
150
 
@@ -18,6 +18,8 @@ export const STORAGE_TYPE_COOKIES = 'cookie';
18
18
 
19
19
  export let storageCallbacks = [];
20
20
 
21
+ /* eslint-disable prebid/no-global */
22
+
21
23
  /*
22
24
  * Storage manager constructor. Consumers should prefer one of `getStorageManager` or `getCoreStorageManager`.
23
25
  */
@@ -64,6 +66,7 @@ export function newStorageManager({moduleName, moduleType} = {}, {isAllowed = is
64
66
  const expiresPortion = (expires && expires !== '') ? ` ;expires=${expires}` : '';
65
67
  const isNone = (sameSite != null && sameSite.toLowerCase() == 'none')
66
68
  const secure = (isNone) ? '; Secure' : '';
69
+ // eslint-disable-next-line prebid/no-member
67
70
  document.cookie = `${key}=${encodeURIComponent(value)}${expiresPortion}; path=/${domainPortion}${sameSite ? `; SameSite=${sameSite}` : ''}${secure}`;
68
71
  }
69
72
  }
@@ -85,27 +88,6 @@ export function newStorageManager({moduleName, moduleType} = {}, {isAllowed = is
85
88
  return schedule(cb, STORAGE_TYPE_COOKIES, done);
86
89
  };
87
90
 
88
- /**
89
- * @returns {boolean}
90
- */
91
- const localStorageIsEnabled = function (done) {
92
- let cb = function (result) {
93
- if (result && result.valid) {
94
- try {
95
- localStorage.setItem('prebid.cookieTest', '1');
96
- return localStorage.getItem('prebid.cookieTest') === '1';
97
- } catch (error) {
98
- } finally {
99
- try {
100
- localStorage.removeItem('prebid.cookieTest');
101
- } catch (error) {}
102
- }
103
- }
104
- return false;
105
- }
106
- return schedule(cb, STORAGE_TYPE_LOCALSTORAGE, done);
107
- }
108
-
109
91
  /**
110
92
  * @returns {boolean}
111
93
  */
@@ -119,60 +101,69 @@ export function newStorageManager({moduleName, moduleType} = {}, {isAllowed = is
119
101
  return schedule(cb, STORAGE_TYPE_COOKIES, done);
120
102
  }
121
103
 
122
- /**
123
- * @param {string} key
124
- * @param {string} value
125
- */
126
- const setDataInLocalStorage = function (key, value, done) {
127
- let cb = function (result) {
128
- if (result && result.valid && hasLocalStorage()) {
129
- window.localStorage.setItem(key, value);
130
- }
131
- }
132
- return schedule(cb, STORAGE_TYPE_LOCALSTORAGE, done);
133
- }
104
+ function storageMethods(name) {
105
+ const capName = name.charAt(0).toUpperCase() + name.substring(1);
106
+ const backend = () => window[name];
134
107
 
135
- /**
136
- * @param {string} key
137
- * @returns {(string|null)}
138
- */
139
- const getDataFromLocalStorage = function (key, done) {
140
- let cb = function (result) {
141
- if (result && result.valid && hasLocalStorage()) {
142
- return window.localStorage.getItem(key);
143
- }
144
- return null;
145
- }
146
- return schedule(cb, STORAGE_TYPE_LOCALSTORAGE, done);
147
- }
148
-
149
- /**
150
- * @param {string} key
151
- */
152
- const removeDataFromLocalStorage = function (key, done) {
153
- let cb = function (result) {
154
- if (result && result.valid && hasLocalStorage()) {
155
- window.localStorage.removeItem(key);
108
+ const hasStorage = function (done) {
109
+ let cb = function (result) {
110
+ if (result && result.valid) {
111
+ try {
112
+ return !!backend();
113
+ } catch (e) {
114
+ logError(`${name} api disabled`);
115
+ }
116
+ }
117
+ return false;
156
118
  }
119
+ return schedule(cb, STORAGE_TYPE_LOCALSTORAGE, done);
157
120
  }
158
- return schedule(cb, STORAGE_TYPE_LOCALSTORAGE, done);
159
- }
160
121
 
161
- /**
162
- * @returns {boolean}
163
- */
164
- const hasLocalStorage = function (done) {
165
- let cb = function (result) {
166
- if (result && result.valid) {
167
- try {
168
- return !!window.localStorage;
169
- } catch (e) {
170
- logError('Local storage api disabled');
122
+ return {
123
+ [`has${capName}`]: hasStorage,
124
+ [`${name}IsEnabled`](done) {
125
+ let cb = function (result) {
126
+ if (result && result.valid) {
127
+ try {
128
+ backend().setItem('prebid.cookieTest', '1');
129
+ return backend().getItem('prebid.cookieTest') === '1';
130
+ } catch (error) {
131
+ } finally {
132
+ try {
133
+ backend().removeItem('prebid.cookieTest');
134
+ } catch (error) {}
135
+ }
136
+ }
137
+ return false;
171
138
  }
139
+ return schedule(cb, STORAGE_TYPE_LOCALSTORAGE, done);
140
+ },
141
+ [`setDataIn${capName}`](key, value, done) {
142
+ let cb = function (result) {
143
+ if (result && result.valid && hasStorage()) {
144
+ backend().setItem(key, value);
145
+ }
146
+ }
147
+ return schedule(cb, STORAGE_TYPE_LOCALSTORAGE, done);
148
+ },
149
+ [`getDataFrom${capName}`](key, done) {
150
+ let cb = function (result) {
151
+ if (result && result.valid && hasStorage()) {
152
+ return backend().getItem(key);
153
+ }
154
+ return null;
155
+ }
156
+ return schedule(cb, STORAGE_TYPE_LOCALSTORAGE, done);
157
+ },
158
+ [`removeDataFrom${capName}`](key, done) {
159
+ let cb = function (result) {
160
+ if (result && result.valid && hasStorage()) {
161
+ backend().removeItem(key);
162
+ }
163
+ }
164
+ return schedule(cb, STORAGE_TYPE_LOCALSTORAGE, done);
172
165
  }
173
- return false;
174
166
  }
175
- return schedule(cb, STORAGE_TYPE_LOCALSTORAGE, done);
176
167
  }
177
168
 
178
169
  /**
@@ -186,6 +177,7 @@ export function newStorageManager({moduleName, moduleType} = {}, {isAllowed = is
186
177
  if (result && result.valid) {
187
178
  const all = [];
188
179
  if (hasDeviceAccess()) {
180
+ // eslint-disable-next-line prebid/no-member
189
181
  const cookies = document.cookie.split(';');
190
182
  while (cookies.length) {
191
183
  const cookie = cookies.pop();
@@ -207,12 +199,9 @@ export function newStorageManager({moduleName, moduleType} = {}, {isAllowed = is
207
199
  return {
208
200
  setCookie,
209
201
  getCookie,
210
- localStorageIsEnabled,
211
202
  cookiesAreEnabled,
212
- setDataInLocalStorage,
213
- getDataFromLocalStorage,
214
- removeDataFromLocalStorage,
215
- hasLocalStorage,
203
+ ...storageMethods('localStorage'),
204
+ ...storageMethods('sessionStorage'),
216
205
  findSimilarCookies
217
206
  }
218
207
  }
package/src/targeting.js CHANGED
@@ -1,3 +1,21 @@
1
+ import { auctionManager } from './auctionManager.js';
2
+ import { getTTL } from './bidTTL.js';
3
+ import { bidderSettings } from './bidderSettings.js';
4
+ import { config } from './config.js';
5
+ import {
6
+ BID_STATUS,
7
+ DEFAULT_TARGETING_KEYS,
8
+ EVENTS,
9
+ JSON_MAPPING,
10
+ NATIVE_KEYS,
11
+ STATUS,
12
+ TARGETING_KEYS
13
+ } from './constants.js';
14
+ import * as events from './events.js';
15
+ import { hook } from './hook.js';
16
+ import { ADPOD } from './mediaTypes.js';
17
+ import { NATIVE_TARGETING_KEYS } from './native.js';
18
+ import { find, includes } from './polyfill.js';
1
19
  import {
2
20
  deepAccess,
3
21
  deepClone,
@@ -14,25 +32,7 @@ import {
14
32
  timestamp,
15
33
  uniques,
16
34
  } from './utils.js';
17
- import {config} from './config.js';
18
- import {NATIVE_TARGETING_KEYS} from './native.js';
19
- import {auctionManager} from './auctionManager.js';
20
- import {ADPOD} from './mediaTypes.js';
21
- import {hook} from './hook.js';
22
- import {bidderSettings} from './bidderSettings.js';
23
- import {find, includes} from './polyfill.js';
24
- import {
25
- BID_STATUS,
26
- DEFAULT_TARGETING_KEYS,
27
- EVENTS,
28
- JSON_MAPPING,
29
- NATIVE_KEYS,
30
- STATUS,
31
- TARGETING_KEYS
32
- } from './constants.js';
33
- import {getHighestCpm, getOldestHighestCpmBid} from './utils/reducers.js';
34
- import {getTTL} from './bidTTL.js';
35
- import * as events from './events.js';
35
+ import { getHighestCpm, getOldestHighestCpmBid } from './utils/reducers.js';
36
36
 
37
37
  var pbTargetingKeys = [];
38
38
 
@@ -139,7 +139,7 @@ export function sortByDealAndPriceBucketOrCpm(useCpm = false) {
139
139
  * @param {Array<String>} adUnitCodes
140
140
  * @param customSlotMatching
141
141
  * @param getSlots
142
- * @return {{[p: string]: any}}
142
+ * @return {Object.<string,any>}
143
143
  */
144
144
  export function getGPTSlotsForAdUnits(adUnitCodes, customSlotMatching, getSlots = () => window.googletag.pubads().getSlots()) {
145
145
  return getSlots().reduce((auToSlots, slot) => {
@@ -461,10 +461,16 @@ export function newTargeting(auctionManager) {
461
461
  });
462
462
  });
463
463
 
464
+ targeting.targetingDone(targetingSet);
465
+
464
466
  // emit event
465
467
  events.emit(EVENTS.SET_TARGETING, targetingSet);
466
468
  }, 'setTargetingForGPT');
467
469
 
470
+ targeting.targetingDone = hook('sync', function (targetingSet) {
471
+ return targetingSet;
472
+ }, 'targetingDone');
473
+
468
474
  /**
469
475
  * normlizes input to a `adUnit.code` array
470
476
  * @param {(string|string[])} adUnitCode [description]
package/src/utils.js CHANGED
@@ -748,6 +748,7 @@ export function hasDeviceAccess() {
748
748
  * @returns {(boolean|undefined)}
749
749
  */
750
750
  export function checkCookieSupport() {
751
+ // eslint-disable-next-line prebid/no-member
751
752
  if (window.navigator.cookieEnabled || !!document.cookie.length) {
752
753
  return true;
753
754
  }
@@ -1109,6 +1110,14 @@ export function safeJSONParse(data) {
1109
1110
  } catch (e) {}
1110
1111
  }
1111
1112
 
1113
+ export function safeJSONEncode(data) {
1114
+ try {
1115
+ return JSON.stringify(data);
1116
+ } catch (e) {
1117
+ return '';
1118
+ }
1119
+ }
1120
+
1112
1121
  /**
1113
1122
  * Returns a memoized version of `fn`.
1114
1123
  *
@@ -0,0 +1,97 @@
1
+ <!-- This is a Test Page for a Banner End-to-End test -->
2
+ <!DOCTYPE html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <meta charset="UTF-8">
7
+ <title>Prebid.js Banner Example</title>
8
+
9
+ <!-- Prebid.js -->
10
+ <script src="http://localhost:4444/bundle?modules=appnexusBidAdapter"></script>
11
+
12
+ <!-- Google Publisher Tag -->
13
+ <script async src="https://www.googletagservices.com/tag/js/gpt.js"></script>
14
+
15
+ <script>
16
+ var pbjs = pbjs || {};
17
+ pbjs.que = pbjs.que || [];
18
+
19
+ // Prebid Banner Ad Unit
20
+ const adUnits = [{
21
+ code: 'div-gpt-ad-1460505748561-0',
22
+ mediaTypes: {
23
+ banner: {
24
+ sizes: [[300, 250], [300, 600]],
25
+ }
26
+ },
27
+ bids: [{
28
+ bidder: 'appnexus',
29
+ params: {
30
+ placementId: 13144370
31
+ }
32
+ }]
33
+ }
34
+ ,{
35
+ code: 'div-gpt-ad-1460505748561-1',
36
+ mediaTypes: {
37
+ banner: {
38
+ sizes: [[300, 250], [300, 600]],
39
+ }
40
+ },
41
+ bids: [{
42
+ bidder: "appnexus",
43
+ params: {
44
+ placementId: 13144370
45
+ }
46
+ }]
47
+ }
48
+ ];
49
+ </script>
50
+
51
+ <script>
52
+ var googletag = googletag || {};
53
+ googletag.cmd = googletag.cmd || [];
54
+
55
+ googletag.cmd.push(function() {
56
+ googletag.pubads().disableInitialLoad();
57
+ });
58
+
59
+ pbjs.que.push(function () {
60
+ pbjs.setConfig({enableTIDs: true});
61
+ pbjs.addAdUnits(adUnits);
62
+ pbjs.requestBids({ bidsBackHandler: sendAdServerRequest });
63
+ });
64
+
65
+ function sendAdServerRequest() {
66
+ googletag.cmd.push(function () {
67
+ pbjs.que.push(function () {
68
+ pbjs.setTargetingForGPTAsync('div-gpt-ad-1460505748561-0');
69
+ googletag.pubads().refresh();
70
+ });
71
+ });
72
+ }
73
+ </script>
74
+
75
+ <script>
76
+ googletag.cmd.push(function () {
77
+ googletag
78
+ .defineSlot('/19968336/header-bid-tag-0', [[300, 250], [300, 600]], 'div-gpt-ad-1460505748561-0')
79
+ .addService(googletag.pubads());
80
+
81
+ googletag.pubads().enableSingleRequest();
82
+ googletag.enableServices();
83
+ });
84
+ </script>
85
+ </head>
86
+
87
+ <body>
88
+ <h2>Prebid.js Banner Ad Unit Test</h2>
89
+ <div id='div-gpt-ad-1460505748561-0'>
90
+ <script>
91
+ googletag.cmd.push(function () { googletag.display('div-gpt-ad-1460505748561-0'); });
92
+ </script>
93
+ </div>
94
+ <div id="targeting-keys"></div>
95
+ </body>
96
+
97
+ </html>
@@ -1,6 +1,6 @@
1
1
  <html>
2
2
  <head>
3
- <script async src="http://localhost:4444/bundle?modules=appnexusBidAdapter&modules=consentManagement&modules=gpdrEnforcement"></script>
3
+ <script async src="http://localhost:4444/bundle?modules=appnexusBidAdapter&modules=consentManagement&modules=gdprEnforcement"></script>
4
4
  <script async src="https://www.googletagservices.com/tag/js/gpt.js"></script>
5
5
  <script>
6
6
  (function (window, document) {
@@ -0,0 +1,11 @@
1
+ import { expect } from 'chai';
2
+ import { sendBeacon } from '../../src/ajax.js'
3
+
4
+ describe('test sendBeacon wrapper', () => {
5
+ it('with legitimate behaviour', () => {
6
+ sinon.stub(navigator, 'sendBeacon').returns(true);
7
+ expect(sendBeacon('http://localhost:80/')).to.equal(true);
8
+ expect(navigator.sendBeacon.callCount).to.equal(1);
9
+ navigator.sendBeacon.restore();
10
+ })
11
+ })
@@ -72,12 +72,6 @@ describe('cross-domain creative', () => {
72
72
  expect(messages[0].targetOrigin).to.eql('https://domain.com:123')
73
73
  });
74
74
 
75
- it('posts to first parent if no __pb_locator__ can be found', () => {
76
- delete win.parent.frames['__pb_locator__'];
77
- renderAd({pubUrl: 'https://www.example.com'});
78
- expect(messages.length).to.eql(1);
79
- })
80
-
81
75
  describe('when there are multiple ancestors', () => {
82
76
  let target;
83
77
  beforeEach(() => {
@@ -88,16 +82,39 @@ describe('cross-domain creative', () => {
88
82
  parent: {
89
83
  ...target,
90
84
  parent: {
85
+ top,
91
86
  frames: {'__pb_locator__': {}},
92
- top
87
+ parent: {
88
+ top,
89
+ frames: {}
90
+ },
93
91
  }
94
92
  }
95
93
  }
96
94
  })
97
- it('posts message to the first ancestor with __pb_locator__ child', () => {
95
+ Object.entries({
96
+ 'throws': () => { throw new DOMException() },
97
+ 'does not throw': () => ({})
98
+ }).forEach(([t, getFrames]) => {
99
+ describe(`when an ancestor ${t}`, () => {
100
+ beforeEach(() => {
101
+ Object.defineProperty(win.parent.parent.parent.parent, 'frames', {get: getFrames})
102
+ })
103
+ it('posts message to the first ancestor with __pb_locator__ child', () => {
104
+ renderAd({pubUrl: 'https://www.example.com'});
105
+ expect(messages.length).to.eql(1);
106
+ });
107
+ })
108
+ })
109
+ it('posts to first restricted parent, if __pb_locator__ cannot be found', () => {
110
+ Object.defineProperty(win.parent.parent.parent, 'frames', {
111
+ get() {
112
+ throw new DOMException();
113
+ }
114
+ });
98
115
  renderAd({pubUrl: 'https://www.example.com'});
99
116
  expect(messages.length).to.eql(1);
100
- });
117
+ })
101
118
  })
102
119
 
103
120
  it('generates request message with adId and clickUrl', () => {