prebid.js 6.5.0 → 6.9.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 (139) hide show
  1. package/.eslintrc.js +8 -1
  2. package/integrationExamples/gpt/amp/creative.html +11 -33
  3. package/integrationExamples/gpt/weboramaRtdProvider_example.html +154 -115
  4. package/integrationExamples/gpt/x-domain/creative.html +63 -29
  5. package/modules/.submodules.json +2 -1
  6. package/modules/adagioBidAdapter.js +0 -8
  7. package/modules/adagioBidAdapter.md +1 -1
  8. package/modules/adbookpspBidAdapter.js +27 -10
  9. package/modules/adhashBidAdapter.js +3 -3
  10. package/modules/adkernelBidAdapter.js +2 -1
  11. package/modules/admanBidAdapter.js +10 -4
  12. package/modules/adomikAnalyticsAdapter.js +23 -11
  13. package/modules/adqueryIdSystem.js +103 -0
  14. package/modules/adqueryIdSystem.md +35 -0
  15. package/modules/appnexusBidAdapter.js +14 -2
  16. package/modules/asealBidAdapter.js +58 -0
  17. package/modules/asealBidAdapter.md +52 -0
  18. package/modules/bliinkBidAdapter.js +2 -1
  19. package/modules/brandmetricsRtdProvider.js +168 -0
  20. package/modules/brandmetricsRtdProvider.md +40 -0
  21. package/modules/colossussspBidAdapter.js +12 -8
  22. package/modules/colossussspBidAdapter.md +15 -1
  23. package/modules/compassBidAdapter.js +10 -3
  24. package/modules/consumableBidAdapter.md +1 -1
  25. package/modules/conversantBidAdapter.js +7 -0
  26. package/modules/criteoBidAdapter.js +10 -1
  27. package/modules/criteoIdSystem.js +29 -7
  28. package/modules/currency.js +26 -1
  29. package/modules/displayioBidAdapter.js +157 -0
  30. package/modules/displayioBidAdapter.md +148 -0
  31. package/modules/e_volutionBidAdapter.js +158 -0
  32. package/modules/glimpseBidAdapter.js +66 -44
  33. package/modules/gnetBidAdapter.js +3 -3
  34. package/modules/gnetBidAdapter.md +4 -4
  35. package/modules/gumgumBidAdapter.js +56 -42
  36. package/modules/idImportLibrary.js +45 -8
  37. package/modules/idImportLibrary.md +4 -0
  38. package/modules/improvedigitalBidAdapter.js +29 -2
  39. package/modules/interactiveOffersBidAdapter.js +9 -6
  40. package/modules/jwplayerRtdProvider.js +71 -6
  41. package/modules/jwplayerRtdProvider.md +27 -11
  42. package/modules/kargoBidAdapter.js +2 -2
  43. package/modules/lunamediahbBidAdapter.js +32 -4
  44. package/modules/nextMillenniumBidAdapter.js +3 -1
  45. package/modules/oguryBidAdapter.js +14 -14
  46. package/modules/onetagBidAdapter.js +4 -2
  47. package/modules/pilotxBidAdapter.js +147 -0
  48. package/modules/pilotxBidAdapter.md +50 -0
  49. package/modules/priceFloors.js +2 -1
  50. package/modules/proxistoreBidAdapter.js +0 -2
  51. package/modules/pubmaticAnalyticsAdapter.js +16 -0
  52. package/modules/richaudienceBidAdapter.js +10 -4
  53. package/modules/riseBidAdapter.js +18 -7
  54. package/modules/rtbhouseBidAdapter.js +14 -4
  55. package/modules/rtdModule/index.js +14 -15
  56. package/modules/rubiconAnalyticsAdapter.js +8 -2
  57. package/modules/seedingAllianceBidAdapter.js +3 -3
  58. package/modules/sharethroughBidAdapter.js +12 -17
  59. package/modules/showheroes-bsBidAdapter.js +13 -2
  60. package/modules/sortableAnalyticsAdapter.js +5 -4
  61. package/modules/sovrnBidAdapter.js +93 -18
  62. package/modules/sovrnBidAdapter.md +80 -2
  63. package/modules/synacormediaBidAdapter.js +31 -10
  64. package/modules/tappxBidAdapter.js +8 -5
  65. package/modules/teadsBidAdapter.js +1 -2
  66. package/modules/undertoneBidAdapter.js +17 -1
  67. package/modules/userId/eids.js +7 -1
  68. package/modules/userId/userId.md +8 -0
  69. package/modules/viewability.js +177 -0
  70. package/modules/viewability.md +87 -0
  71. package/modules/weboramaRtdProvider.js +264 -34
  72. package/modules/weboramaRtdProvider.md +110 -40
  73. package/modules/welectBidAdapter.js +106 -0
  74. package/modules/yahoosspBidAdapter.js +2 -0
  75. package/package.json +2 -1
  76. package/src/adRendering.js +38 -0
  77. package/src/adloader.js +2 -1
  78. package/src/auction.js +103 -73
  79. package/src/bidderSettings.js +69 -0
  80. package/src/hook.js +5 -1
  81. package/src/prebid.js +19 -21
  82. package/src/secureCreatives.js +131 -47
  83. package/src/targeting.js +3 -2
  84. package/src/utils.js +13 -10
  85. package/test/helpers/syncPromise.js +71 -0
  86. package/test/spec/auctionmanager_spec.js +179 -15
  87. package/test/spec/modules/adagioBidAdapter_spec.js +0 -10
  88. package/test/spec/modules/adbookpspBidAdapter_spec.js +17 -3
  89. package/test/spec/modules/adhashBidAdapter_spec.js +2 -2
  90. package/test/spec/modules/admanBidAdapter_spec.js +2 -2
  91. package/test/spec/modules/adomikAnalyticsAdapter_spec.js +3 -1
  92. package/test/spec/modules/adqueryIdSystem_spec.js +74 -0
  93. package/test/spec/modules/appnexusBidAdapter_spec.js +27 -0
  94. package/test/spec/modules/asealBidAdapter_spec.js +144 -0
  95. package/test/spec/modules/bliinkBidAdapter_spec.js +2 -0
  96. package/test/spec/modules/brandmetricsRtdProvider_spec.js +191 -0
  97. package/test/spec/modules/colossussspBidAdapter_spec.js +5 -2
  98. package/test/spec/modules/compassBidAdapter_spec.js +1 -0
  99. package/test/spec/modules/conversantBidAdapter_spec.js +54 -2
  100. package/test/spec/modules/criteoBidAdapter_spec.js +21 -0
  101. package/test/spec/modules/criteoIdSystem_spec.js +6 -3
  102. package/test/spec/modules/currency_spec.js +21 -6
  103. package/test/spec/modules/displayioBidAdapter_spec.js +239 -0
  104. package/test/spec/modules/e_volutionBidAdapter_spec.js +242 -0
  105. package/test/spec/modules/eids_spec.js +15 -0
  106. package/test/spec/modules/glimpseBidAdapter_spec.js +0 -18
  107. package/test/spec/modules/gnetBidAdapter_spec.js +6 -6
  108. package/test/spec/modules/gumgumBidAdapter_spec.js +46 -0
  109. package/test/spec/modules/idImportLibrary_spec.js +197 -10
  110. package/test/spec/modules/improvedigitalBidAdapter_spec.js +61 -0
  111. package/test/spec/modules/jwplayerRtdProvider_spec.js +195 -2
  112. package/test/spec/modules/kargoBidAdapter_spec.js +1 -1
  113. package/test/spec/modules/loglyliftBidAdapter_spec.js +1 -1
  114. package/test/spec/modules/lunamediahbBidAdapter_spec.js +27 -1
  115. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +1 -1
  116. package/test/spec/modules/oguryBidAdapter_spec.js +69 -3
  117. package/test/spec/modules/pilotxBidAdapter_spec.js +244 -0
  118. package/test/spec/modules/pubmaticAnalyticsAdapter_spec.js +13 -1
  119. package/test/spec/modules/realTimeDataModule_spec.js +67 -5
  120. package/test/spec/modules/richaudienceBidAdapter_spec.js +40 -0
  121. package/test/spec/modules/riseBidAdapter_spec.js +31 -5
  122. package/test/spec/modules/rtbhouseBidAdapter_spec.js +20 -0
  123. package/test/spec/modules/rubiconAnalyticsAdapter_spec.js +61 -1
  124. package/test/spec/modules/sharethroughBidAdapter_spec.js +91 -6
  125. package/test/spec/modules/showheroes-bsBidAdapter_spec.js +2 -0
  126. package/test/spec/modules/sortableAnalyticsAdapter_spec.js +2 -3
  127. package/test/spec/modules/sovrnBidAdapter_spec.js +413 -333
  128. package/test/spec/modules/synacormediaBidAdapter_spec.js +70 -0
  129. package/test/spec/modules/tappxBidAdapter_spec.js +0 -19
  130. package/test/spec/modules/teadsBidAdapter_spec.js +14 -59
  131. package/test/spec/modules/undertoneBidAdapter_spec.js +55 -2
  132. package/test/spec/modules/userId_spec.js +68 -19
  133. package/test/spec/modules/viewability_spec.js +280 -0
  134. package/test/spec/modules/weboramaRtdProvider_spec.js +536 -20
  135. package/test/spec/modules/welectBidAdapter_spec.js +211 -0
  136. package/test/spec/modules/yahoosspBidAdapter_spec.js +10 -0
  137. package/test/spec/unit/core/bidderSettings_spec.js +123 -0
  138. package/test/spec/unit/pbjs_api_spec.js +21 -8
  139. package/test/spec/unit/secureCreatives_spec.js +143 -24
package/.eslintrc.js CHANGED
@@ -23,10 +23,13 @@ module.exports = {
23
23
  'BROWSERSTACK_USERNAME': false,
24
24
  'BROWSERSTACK_KEY': false
25
25
  },
26
+ // use babel as parser for fancy syntax
27
+ parser: '@babel/eslint-parser',
26
28
  parserOptions: {
27
29
  sourceType: 'module',
28
30
  ecmaVersion: 2018,
29
31
  },
32
+
30
33
  rules: {
31
34
  'comma-dangle': 'off',
32
35
  semi: 'off',
@@ -49,5 +52,9 @@ module.exports = {
49
52
  rules: {
50
53
  'prebid/validate-imports': ['error', allowedModules[key]]
51
54
  }
52
- }))
55
+ })).concat([{
56
+ // code in other packages (such as plugins/eslint) is not "seen" by babel and its parser will complain.
57
+ files: 'plugins/*/**/*.js',
58
+ parser: 'esprima'
59
+ }])
53
60
  };
@@ -1,38 +1,16 @@
1
1
  <!-- This script tag should be returned by your ad server -->
2
2
 
3
+ <script src="https://cdn.jsdelivr.net/npm/prebid-universal-creative@latest/dist/creative.js"></script>
3
4
  <script>
4
- // This is the `renderAd` function from Prebid.js moved within the creative iframe
5
- var renderAd = function (ev) {
6
- var key = ev.message ? "message" : "data";
7
- var data = {};
8
- try {
9
- data = JSON.parse(ev[key]);
10
- } catch (e) {
11
- // Do nothing. No ad found.
12
- }
13
- if (data.ad || data.adUrl) {
14
- if (data.ad) {
15
- document.write(data.ad);
16
- document.close();
17
- } else if (data.adUrl) {
18
- document.write('<IFRAME SRC="' + data.adUrl + '" WIDTH="'+ data.width +'" HEIGHT="'+ data.height +'" FRAMEBORDER="0" SCROLLING="no" MARGINHEIGHT="0" MARGINWIDTH="0" TOPMARGIN="0" LEFTMARGIN="0" ALLOWTRANSPARENCY="true"></IFRAME>');
19
- document.close();
20
- }
21
- }
22
- };
5
+ var ucTagData = {};
6
+ ucTagData.adServerDomain = "";
7
+ ucTagData.pubUrl = "%%PATTERN:url%%";
8
+ ucTagData.targetingMap = "%%PATTERN:TARGETINGMAP%%";
9
+ ucTagData.hbPb = "%%PATTERN:hb_pb%%";
23
10
 
24
- var requestAdFromPrebid = function () {
25
- var message = JSON.stringify({
26
- message: 'Prebid creative requested: %%PATTERN:hb_adid%%',
27
- adId: '%%PATTERN:hb_adid%%'
28
- });
29
- window.parent.postMessage(message, '*');
30
- };
31
-
32
- var listenAdFromPrebid = function () {
33
- window.addEventListener("message", renderAd, false);
34
- };
35
-
36
- listenAdFromPrebid();
37
- requestAdFromPrebid();
11
+ try {
12
+ ucTag.renderAd(document, ucTagData);
13
+ } catch (e) {
14
+ console.log(e);
15
+ }
38
16
  </script>
@@ -1,135 +1,174 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
1
+ <!DOCTYPE html
2
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
3
  <html xmlns="http://www.w3.org/1999/xhtml">
4
+
3
5
  <head>
4
6
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
7
  </head>
8
+
6
9
  <body>
7
10
 
8
- <script async src="https://securepubads.g.doubleclick.net/tag/js/gpt.js"></script>
9
- <script src="../../build/dev/prebid.js" async></script>
11
+ <script async src="https://securepubads.g.doubleclick.net/tag/js/gpt.js"></script>
12
+ <script src="../../build/dev/prebid.js" async></script>
10
13
 
11
- <script>
12
- var pbjs = pbjs || {};
13
- pbjs.que = pbjs.que || [];
14
+ <script>
15
+ var pbjs = pbjs || {};
16
+ pbjs.que = pbjs.que || [];
14
17
 
15
- pbjs.que.push(function() {
16
- pbjs.setConfig({
17
- debug: true,
18
- realTimeData: {
19
- auctionDelay: 1000,
20
- dataProviders: [{
18
+ pbjs.que.push(function () {
19
+ pbjs.setConfig({
20
+ debug: true,
21
+ realTimeData: {
22
+ auctionDelay: 1000,
23
+ dataProviders: [{
21
24
  name: "weborama",
22
25
  waitForIt: true,
23
26
  params: {
24
- weboCtxConf: {
25
- token: "to-be-defined", // mandatory
26
- targetURL: "https://prebid.org", // default is document.URL
27
- setPrebidTargeting: true, // default
28
- sendToBidders: true, // default
29
- defaultProfile: { // optional
30
- webo_ctx: ['moon'],
31
- webo_ds: ['bar']
32
- }
33
- },
34
- weboUserDataConf: {
35
- setPrebidTargeting: true, // default
36
- sendToBidders: true, // default
37
- defaultProfile: { // optional
38
- webo_cs: ['Red'],
39
- webo_audiences: ['bam']
40
- },
41
- localStorageProfileKey: 'webo_wam2gam_entry' // default
42
- }
43
- }
27
+ setPrebidTargeting: true, // optional
28
+ sendToBidders: true, // optional
29
+ onData: function (data, site) { // optional
30
+ var kind = (site) ? 'site' : 'user';
31
+ console.log('onData', kind, data);
32
+ },
33
+ weboCtxConf: {
34
+ token: "to-be-defined", // mandatory
35
+ targetURL: "https://prebid.org", // default is document.URL
36
+ setPrebidTargeting: true, // override param.setPrebidTargeting or default true
37
+ sendToBidders: true, // override param.sendToBidders or default true
38
+ defaultProfile: { // optional
39
+ webo_ctx: ['moon'],
40
+ webo_ds: ['bar']
41
+ },
42
+ //, onData: function (data, ...) { ...}
43
+ },
44
+ weboUserDataConf: {
45
+ accountId: 12345, // optional
46
+ setPrebidTargeting: true, // override param.setPrebidTargeting or default true
47
+ sendToBidders: true, // override param.sendToBidders or default true
48
+ defaultProfile: { // optional
49
+ webo_cs: ['Red'],
50
+ webo_audiences: ['bam']
51
+ },
52
+ localStorageProfileKey: 'webo_wam2gam_entry', // default
53
+ //, onData: function (data,...) { ...}
54
+ }
55
+ }
56
+ }]
57
+ }
58
+ });
59
+ });
60
+ </script>
61
+ <script>
62
+ var div_1_sizes = [
63
+ [300, 300]
64
+ ];
65
+
66
+ var PREBID_TIMEOUT = 3000;
67
+ var FAILSAFE_TIMEOUT = 5000;
68
+
69
+ var adUnits = [
70
+ {
71
+ code: '/1056029/webo-ctx-prebid',
72
+ mediaTypes: {
73
+ banner: {
74
+ sizes: div_1_sizes
75
+ }
76
+ },
77
+ bids: [{
78
+ bidder: 'smartadserver',
79
+ params: {
80
+ siteId: 1234,
81
+ pageId: 1234,
82
+ formatId: 1234,
83
+ }
84
+ }, {
85
+ bidder: 'pubmatic',
86
+ params: {
87
+ publisherId: '32572',
88
+ }
89
+ }, {
90
+ bidder: 'appnexus',
91
+ params: {
92
+ placementId: 234234,
93
+ }
94
+ }, {
95
+ bidder: 'rubicon',
96
+ params: {
97
+ accountId: '14062',
98
+ siteId: '70608',
99
+ zoneId: '335918',
100
+ userId: '12346',
101
+ }
102
+ }, {
103
+ bidder: 'criteo',
104
+ params: {
105
+ zoneId: 234234,
106
+ networkId: 456456,
107
+ },
44
108
  }]
45
109
  }
46
- });
47
- });
48
- </script>
49
- <script>
50
- var div_1_sizes = [
51
- [300, 300]
52
- ];
53
-
54
- var PREBID_TIMEOUT = 3000;
55
- var FAILSAFE_TIMEOUT = 5000;
56
-
57
- var adUnits = [
58
- {
59
- code: '/1056029/webo-ctx-prebid',
60
- mediaTypes: {
61
- banner: {
62
- sizes: div_1_sizes
63
- }
64
- },
65
- bids: [{
66
- bidder: 'smartadserver',
67
- params: {
68
- placementId: 1
69
- }
70
- }]
71
- }
72
110
  ];
73
111
 
74
- // ======== DO NOT EDIT BELOW THIS LINE =========== //
75
- var googletag = googletag || {};
76
- googletag.cmd = googletag.cmd || [];
77
- googletag.cmd.push(function() {
78
- googletag.pubads().disableInitialLoad();
79
- });
80
-
81
- var pbjs = pbjs || {};
82
- pbjs.que = pbjs.que || [];
83
-
84
- pbjs.que.push(function() {
85
- pbjs.addAdUnits(adUnits);
86
- pbjs.requestBids({
87
- bidsBackHandler: initAdserver,
88
- timeout: PREBID_TIMEOUT
112
+ // ======== DO NOT EDIT BELOW THIS LINE =========== //
113
+ var googletag = googletag || {};
114
+ googletag.cmd = googletag.cmd || [];
115
+ googletag.cmd.push(function () {
116
+ googletag.pubads().disableInitialLoad();
89
117
  });
90
- });
91
-
92
- function initAdserver() {
93
- if (pbjs.initAdserverSet) return;
94
- pbjs.initAdserverSet = true;
95
- googletag.cmd.push(function() {
96
- pbjs.que.push(function() {
97
- pbjs.setTargetingForGPTAsync();
98
- googletag.pubads().refresh();
118
+
119
+ var pbjs = pbjs || {};
120
+ pbjs.que = pbjs.que || [];
121
+
122
+ pbjs.que.push(function () {
123
+ pbjs.addAdUnits(adUnits);
124
+ pbjs.requestBids({
125
+ bidsBackHandler: initAdserver,
126
+ timeout: PREBID_TIMEOUT
99
127
  });
100
128
  });
101
- }
102
-
103
-
104
- // in case PBJS doesn't load
105
- setTimeout(function() {
106
- initAdserver();
107
- }, FAILSAFE_TIMEOUT);
108
-
109
- googletag.cmd.push(function() {
110
- googletag.defineSlot('/1056029/webo-ctx-prebid', div_1_sizes, 'div-gpt-ad-1620653642627-0').addService(googletag.pubads());
111
- googletag.pubads().disableInitialLoad();
112
- googletag.enableServices();
113
- });
114
-
115
- </script>
116
-
117
- <article>
118
- <p>
119
- test webo ctx using prebid.js
120
- </p>
121
- </article>
122
- <h2>Basic Prebid.js Example</h2>
123
- <h5>Div-1</h5>
124
- <div id='div-gpt-ad-1620653642627-0' style='width: 300px; height: 300px;'>
125
- <script type='text/javascript'>
126
- googletag.cmd.push(function() {
127
- googletag.display('div-gpt-ad-1620653642627-0');
129
+
130
+ function initAdserver() {
131
+ if (pbjs.initAdserverSet) return;
132
+ pbjs.initAdserverSet = true;
133
+ googletag.cmd.push(function () {
134
+ pbjs.que.push(function () {
135
+ pbjs.setTargetingForGPTAsync();
136
+ googletag.pubads().refresh();
128
137
  });
129
- </script>
130
- </div>
131
- <button onclick="googletag.cmd.push(function() { googletag.pubads().refresh(); });">
132
- Show/Refresh Ad
133
- </button>
138
+ });
139
+ }
140
+
141
+
142
+ // in case PBJS doesn't load
143
+ setTimeout(function () {
144
+ initAdserver();
145
+ }, FAILSAFE_TIMEOUT);
146
+
147
+ googletag.cmd.push(function () {
148
+ googletag.defineSlot('/1056029/webo-ctx-prebid', div_1_sizes, 'div-gpt-ad-1620653642627-0').addService(googletag.pubads());
149
+ googletag.pubads().disableInitialLoad();
150
+ googletag.enableServices();
151
+ });
152
+
153
+ </script>
154
+
155
+ <article>
156
+ <p>
157
+ test webo ctx using prebid.js
158
+ </p>
159
+ </article>
160
+ <h2>Basic Prebid.js Example</h2>
161
+ <h5>Div-1</h5>
162
+ <div id='div-gpt-ad-1620653642627-0' style='width: 300px; height: 300px;'>
163
+ <script type='text/javascript'>
164
+ googletag.cmd.push(function () {
165
+ googletag.display('div-gpt-ad-1620653642627-0');
166
+ });
167
+ </script>
168
+ </div>
169
+ <button onclick="googletag.cmd.push(function() { googletag.pubads().refresh(); });">
170
+ Show/Refresh Ad
171
+ </button>
134
172
  </body>
135
- </html>
173
+
174
+ </html>
@@ -2,37 +2,45 @@
2
2
  // this script can be returned by an ad server delivering a cross domain iframe, into which the
3
3
  // creative will be rendered, e.g. DFP delivering a SafeFrame
4
4
 
5
- let windowLocation = window.location;
6
- var urlParser = document.createElement('a');
5
+ const windowLocation = window.location;
6
+ const urlParser = document.createElement('a');
7
7
  urlParser.href = '%%PATTERN:url%%';
8
- var publisherDomain = urlParser.protocol + '//' + urlParser.hostname;
8
+ const publisherDomain = urlParser.protocol + '//' + urlParser.hostname;
9
+ const adId = '%%PATTERN:hb_adid%%';
10
+
11
+ function receiveMessage(ev) {
12
+ const origin = ev.origin || ev.originalEvent.origin;
13
+ if (origin === publisherDomain) {
14
+ renderAd(ev);
15
+ }
16
+ }
9
17
 
10
18
  function renderAd(ev) {
11
- var key = ev.message ? 'message' : 'data';
12
- var adObject = {};
13
- try {
14
- adObject = JSON.parse(ev[key]);
15
- } catch (e) {
16
- return;
17
- }
19
+ const key = ev.message ? 'message' : 'data';
20
+ let adObject = {};
21
+ try {
22
+ adObject = JSON.parse(ev[key]);
23
+ } catch (e) {
24
+ return;
25
+ }
18
26
 
19
- var origin = ev.origin || ev.originalEvent.origin;
20
- if (adObject.message && adObject.message === 'Prebid Response' &&
21
- publisherDomain === origin &&
22
- adObject.adId === '%%PATTERN:hb_adid%%' &&
23
- (adObject.ad || adObject.adUrl)) {
24
- var body = window.document.body;
25
- var ad = adObject.ad;
26
- var url = adObject.adUrl;
27
- var width = adObject.width;
28
- var height = adObject.height;
27
+ if (adObject.message && adObject.message === 'Prebid Response' &&
28
+ adObject.adId === adId) {
29
+ try {
30
+ const body = window.document.body;
31
+ const ad = adObject.ad;
32
+ const url = adObject.adUrl;
33
+ const width = adObject.width;
34
+ const height = adObject.height;
29
35
 
30
36
  if (adObject.mediaType === 'video') {
37
+ signalRenderResult(false, {
38
+ reason: 'preventWritingOnMainDocument',
39
+ message: `Cannot render video ad ${adId}`
40
+ });
31
41
  console.log('Error trying to write ad.');
32
- } else
33
-
34
- if (ad) {
35
- var frame = document.createElement('iframe');
42
+ } else if (ad) {
43
+ const frame = document.createElement('iframe');
36
44
  frame.setAttribute('FRAMEBORDER', 0);
37
45
  frame.setAttribute('SCROLLING', 'no');
38
46
  frame.setAttribute('MARGINHEIGHT', 0);
@@ -46,24 +54,50 @@ function renderAd(ev) {
46
54
  frame.contentDocument.open();
47
55
  frame.contentDocument.write(ad);
48
56
  frame.contentDocument.close();
57
+ signalRenderResult(true);
49
58
  } else if (url) {
50
59
  body.insertAdjacentHTML('beforeend', '<IFRAME SRC="' + url + '" FRAMEBORDER="0" SCROLLING="no" MARGINHEIGHT="0" MARGINWIDTH="0" TOPMARGIN="0" LEFTMARGIN="0" ALLOWTRANSPARENCY="true" WIDTH="' + width + '" HEIGHT="' + height + '"></IFRAME>');
60
+ signalRenderResult(true);
51
61
  } else {
52
- console.log('Error trying to write ad. No ad for bid response id: ' + id);
62
+ signalRenderResult(false, {
63
+ reason: 'noAd',
64
+ message: `No ad for ${adId}`
65
+ });
66
+ console.log(`Error trying to write ad. No ad markup or adUrl for ${adId}`);
53
67
  }
68
+ } catch (e) {
69
+ signalRenderResult(false, {reason: 'exception', message: e.message});
70
+ console.log(`Error in rendering ad`, e);
71
+ }
72
+ }
73
+
74
+ function signalRenderResult(success, {reason, message} = {}) {
75
+ const payload = {
76
+ message: 'Prebid Event',
77
+ adId,
78
+ event: success ? 'adRenderSucceeded' : 'adRenderFailed',
54
79
  }
80
+ if (!success) {
81
+ payload.info = {reason, message};
82
+ }
83
+ window.parent.postMessage(JSON.stringify(payload), publisherDomain);
55
84
  }
56
85
 
86
+ }
87
+
88
+
57
89
  function requestAdFromPrebid() {
58
- var message = JSON.stringify({
90
+ const message = JSON.stringify({
59
91
  message: 'Prebid Request',
60
- adId: '%%PATTERN:hb_adid%%'
92
+ adId
61
93
  });
62
- window.parent.postMessage(message, publisherDomain);
94
+ const channel = new MessageChannel();
95
+ channel.port1.onmessage = renderAd;
96
+ window.parent.postMessage(message, publisherDomain, [channel.port2]);
63
97
  }
64
98
 
65
99
  function listenAdFromPrebid() {
66
- window.addEventListener('message', renderAd, false);
100
+ window.addEventListener('message', receiveMessage, false);
67
101
  }
68
102
 
69
103
  listenAdFromPrebid();
@@ -35,7 +35,8 @@
35
35
  "uid2IdSystem",
36
36
  "unifiedIdSystem",
37
37
  "verizonMediaIdSystem",
38
- "zeotapIdPlusIdSystem"
38
+ "zeotapIdPlusIdSystem",
39
+ "adqueryIdSystem"
39
40
  ],
40
41
  "adpod": [
41
42
  "freeWheelAdserverVideo",
@@ -268,8 +268,6 @@ function getSite(bidderRequest) {
268
268
  } else if (refererInfo.stack && refererInfo.stack.length && refererInfo.stack[0]) {
269
269
  // important note check if refererInfo.stack[0] is 'thruly' because a `null` value
270
270
  // will be considered as "localhost" by the parseUrl function.
271
- // As the isBidRequestValid returns false when it does not reach the referer
272
- // this should never called.
273
271
  const url = parseUrl(refererInfo.stack[0]);
274
272
  domain = url.hostname;
275
273
  }
@@ -873,12 +871,6 @@ export const spec = {
873
871
 
874
872
  autoFillParams(bid);
875
873
 
876
- if (!internal.getRefererInfo().reachedTop) {
877
- logWarn(`${LOG_PREFIX} the main page url is unreachabled.`);
878
- // internal.enqueue(debugData());
879
- return false;
880
- }
881
-
882
874
  if (!(bid.params.organizationId && bid.params.site && bid.params.placement)) {
883
875
  logWarn(`${LOG_PREFIX} at least one required param is missing.`);
884
876
  // internal.enqueue(debugData());
@@ -18,7 +18,7 @@ Below, the list of Adagio params and where they can be set.
18
18
  | ---------- | ------------- | ------------- |
19
19
  | siteId | x |
20
20
  | organizationId (obsolete) | | x
21
- | site (obsolete) | | x
21
+ | site (obsolete) | | x
22
22
  | pagetype | x | x
23
23
  | environment | x | x
24
24
  | category | x | x
@@ -363,7 +363,7 @@ function impBidsToPrebidBids(
363
363
  }
364
364
 
365
365
  const impToPrebidBid =
366
- (bidderRequestBody, bidResponseCurrency, referrer, targetingMap) => (bid) => {
366
+ (bidderRequestBody, bidResponseCurrency, referrer, targetingMap) => (bid, bidIndex) => {
367
367
  try {
368
368
  const bidRequest = findBidRequest(bidderRequestBody, bid);
369
369
 
@@ -377,7 +377,7 @@ const impToPrebidBid =
377
377
  let prebidBid = {
378
378
  ad: bid.adm,
379
379
  adId: bid.adid,
380
- adserverTargeting: targetingMap[bid.impid],
380
+ adserverTargeting: targetingMap[bidIndex],
381
381
  adUnitCode: bidRequest.tagid,
382
382
  bidderRequestId: bidderRequestBody.id,
383
383
  bidId: bid.id,
@@ -408,6 +408,9 @@ const impToPrebidBid =
408
408
  };
409
409
  }
410
410
 
411
+ if (deepAccess(bid, 'ext.pa_win') === true) {
412
+ prebidBid.auctionWinner = true;
413
+ }
411
414
  return prebidBid;
412
415
  } catch (error) {
413
416
  logError(`${BIDDER_CODE}: Error while building bid`, error);
@@ -429,29 +432,43 @@ function buildTargetingMap(bids) {
429
432
  const values = impIds.reduce((result, id) => {
430
433
  result[id] = {
431
434
  lineItemIds: [],
435
+ orderIds: [],
432
436
  dealIds: [],
433
437
  adIds: [],
438
+ adAndOrderIndexes: []
434
439
  };
435
440
 
436
441
  return result;
437
442
  }, {});
438
443
 
439
- bids.forEach((bid) => {
440
- values[bid.impid].lineItemIds.push(bid.ext.liid);
441
- values[bid.impid].dealIds.push(bid.dealid);
442
- values[bid.impid].adIds.push(bid.adid);
444
+ bids.forEach((bid, bidIndex) => {
445
+ let impId = bid.impid;
446
+ values[impId].lineItemIds.push(bid.ext.liid);
447
+ values[impId].dealIds.push(bid.dealid);
448
+ values[impId].adIds.push(bid.adid);
449
+
450
+ if (deepAccess(bid, 'ext.ordid')) {
451
+ values[impId].orderIds.push(bid.ext.ordid);
452
+ bid.ext.ordid.split(TARGETING_VALUE_SEPARATOR).forEach((ordid, ordIndex) => {
453
+ let adIdIndex = values[impId].adIds.indexOf(bid.adid);
454
+ values[impId].adAndOrderIndexes.push(adIdIndex + '_' + ordIndex)
455
+ })
456
+ }
443
457
  });
444
458
 
445
459
  const targetingMap = {};
446
460
 
447
- for (const id of impIds) {
448
- targetingMap[id] = {
461
+ bids.forEach((bid, bidIndex) => {
462
+ let id = bid.impid;
463
+
464
+ targetingMap[bidIndex] = {
449
465
  hb_liid_adbookpsp: values[id].lineItemIds.join(TARGETING_VALUE_SEPARATOR),
450
466
  hb_deal_adbookpsp: values[id].dealIds.join(TARGETING_VALUE_SEPARATOR),
467
+ hb_ad_ord_adbookpsp: values[id].adAndOrderIndexes.join(TARGETING_VALUE_SEPARATOR),
451
468
  hb_adid_c_adbookpsp: values[id].adIds.join(TARGETING_VALUE_SEPARATOR),
469
+ hb_ordid_adbookpsp: values[id].orderIds.join(TARGETING_VALUE_SEPARATOR),
452
470
  };
453
- }
454
-
471
+ })
455
472
  return targetingMap;
456
473
  }
457
474
 
@@ -6,7 +6,7 @@ const VERSION = '1.0';
6
6
 
7
7
  export const spec = {
8
8
  code: 'adhash',
9
- url: 'https://bidder.adhash.org/rtb?version=' + VERSION + '&prebid=true',
9
+ url: 'https://bidder.adhash.com/rtb?version=' + VERSION + '&prebid=true',
10
10
  supportedMediaTypes: [ BANNER ],
11
11
 
12
12
  isBidRequestValid: (bid) => {
@@ -37,7 +37,7 @@ export const spec = {
37
37
  var size = validBidRequests[i].sizes[index].join('x');
38
38
  bidRequests.push({
39
39
  method: 'POST',
40
- url: url,
40
+ url: url + '&publisher=' + validBidRequests[i].params.publisherId,
41
41
  bidRequest: validBidRequests[i],
42
42
  data: {
43
43
  timezone: new Date().getTimezoneOffset() / 60,
@@ -87,7 +87,7 @@ export const spec = {
87
87
  cpm: responseBody.creatives[0].costEUR,
88
88
  ad:
89
89
  `<div id="${oneTimeId}"></div>
90
- <script src="https://bidder.adhash.org/static/scripts/creative.min.js"></script>
90
+ <script src="https://bidder.adhash.com/static/scripts/creative.min.js"></script>
91
91
  <script>callAdvertiser(${bidderResponse},['${oneTimeId}'],${requestData},${publisherURL})</script>`,
92
92
  width: request.bidRequest.sizes[0][0],
93
93
  height: request.bidRequest.sizes[0][1],
@@ -77,7 +77,8 @@ export const spec = {
77
77
  {code: 'unibots'},
78
78
  {code: 'catapultx'},
79
79
  {code: 'ergadx'},
80
- {code: 'turktelekom'}
80
+ {code: 'turktelekom'},
81
+ {code: 'felixads'}
81
82
  ],
82
83
  supportedMediaTypes: [BANNER, VIDEO, NATIVE],
83
84