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
@@ -0,0 +1,280 @@
1
+ import { expect } from 'chai';
2
+ import * as sinon from 'sinon';
3
+ import * as utils from 'src/utils.js';
4
+ import * as viewability from 'modules/viewability.js';
5
+
6
+ describe('viewability test', () => {
7
+ describe('start measurement', () => {
8
+ let sandbox;
9
+ let intersectionObserverStub;
10
+ let setTimeoutStub;
11
+ let observeCalled;
12
+ let unobserveCalled;
13
+ let ti = 1;
14
+ beforeEach(() => {
15
+ observeCalled = false;
16
+ unobserveCalled = false;
17
+ sandbox = sinon.sandbox.create();
18
+
19
+ let fakeIntersectionObserver = (stateChange, options) => {
20
+ return {
21
+ observe: (element) => {
22
+ observeCalled = true;
23
+ stateChange([{ isIntersecting: true }]);
24
+ },
25
+ unobserve: (element) => {
26
+ unobserveCalled = true;
27
+ },
28
+ };
29
+ };
30
+
31
+ intersectionObserverStub = sandbox.stub(window, 'IntersectionObserver').callsFake(fakeIntersectionObserver);
32
+ setTimeoutStub = sandbox.stub(window, 'setTimeout').callsFake((callback, timeout) => {
33
+ callback();
34
+ return ti++;
35
+ });
36
+ });
37
+
38
+ afterEach(() => {
39
+ sandbox.restore();
40
+ });
41
+
42
+ it('should trigger appropriate callbacks', () => {
43
+ viewability.startMeasurement('0', {}, { method: 'img', value: 'http://my.tracker/123' }, { inViewThreshold: 0.5, timeInView: 1000 });
44
+
45
+ sinon.assert.called(intersectionObserverStub);
46
+ sinon.assert.called(setTimeoutStub);
47
+ expect(observeCalled).to.equal(true);
48
+ expect(unobserveCalled).to.equal(true);
49
+ });
50
+
51
+ it('should trigger img tracker', () => {
52
+ let triggerPixelSpy = sandbox.spy(utils, ['triggerPixel']);
53
+ viewability.startMeasurement('1', {}, { method: 'img', value: 'http://my.tracker/123' }, { inViewThreshold: 0.5, timeInView: 1000 });
54
+ expect(triggerPixelSpy.callCount).to.equal(1);
55
+ });
56
+
57
+ it('should trigger js tracker', () => {
58
+ let insertHtmlIntoIframeSpy = sandbox.spy(utils, ['insertHtmlIntoIframe']);
59
+ viewability.startMeasurement('2', {}, { method: 'js', value: 'http://my.tracker/123.js' }, { inViewThreshold: 0.5, timeInView: 1000 });
60
+ expect(insertHtmlIntoIframeSpy.callCount).to.equal(1);
61
+ });
62
+
63
+ it('should trigger callback tracker', () => {
64
+ let callbackFired = false;
65
+ viewability.startMeasurement('3', {}, { method: 'callback', value: () => { callbackFired = true; } }, { inViewThreshold: 0.5, timeInView: 1000 });
66
+ expect(callbackFired).to.equal(true);
67
+ });
68
+
69
+ it('should check for vid uniqueness', () => {
70
+ let logWarnSpy = sandbox.spy(utils, 'logWarn');
71
+ viewability.startMeasurement('4', {}, { method: 'js', value: 'http://my.tracker/123.js' }, { inViewThreshold: 0.5, timeInView: 1000 });
72
+ expect(logWarnSpy.callCount).to.equal(0);
73
+
74
+ viewability.startMeasurement('4', {}, { method: 'js', value: 'http://my.tracker/123.js' }, { inViewThreshold: 0.5, timeInView: 1000 });
75
+ expect(logWarnSpy.callCount).to.equal(1);
76
+ expect(logWarnSpy.calledWith(`${viewability.MODULE_NAME}: must provide an unregistered vid`, '4')).to.equal(true);
77
+ });
78
+
79
+ it('should check for valid criteria', () => {
80
+ let logWarnSpy = sandbox.spy(utils, 'logWarn');
81
+ viewability.startMeasurement('5', {}, { method: 'js', value: 'http://my.tracker/123.js' }, { timeInView: 1000 });
82
+ expect(logWarnSpy.callCount).to.equal(1);
83
+ expect(logWarnSpy.calledWith(`${viewability.MODULE_NAME}: missing criteria`, { timeInView: 1000 })).to.equal(true);
84
+ });
85
+
86
+ it('should check for valid tracker', () => {
87
+ let logWarnSpy = sandbox.spy(utils, 'logWarn');
88
+ viewability.startMeasurement('6', {}, { method: 'callback', value: 'string' }, { inViewThreshold: 0.5, timeInView: 1000 });
89
+ expect(logWarnSpy.callCount).to.equal(1);
90
+ expect(logWarnSpy.calledWith(`${viewability.MODULE_NAME}: invalid tracker`, { method: 'callback', value: 'string' })).to.equal(true);
91
+ });
92
+
93
+ it('should check if element provided', () => {
94
+ let logWarnSpy = sandbox.spy(utils, 'logWarn');
95
+ viewability.startMeasurement('7', undefined, { method: 'js', value: 'http://my.tracker/123.js' }, { timeInView: 1000 });
96
+ expect(logWarnSpy.callCount).to.equal(1);
97
+ expect(logWarnSpy.calledWith(`${viewability.MODULE_NAME}: no html element provided`)).to.equal(true);
98
+ });
99
+ });
100
+
101
+ describe('stop measurement', () => {
102
+ let sandbox;
103
+ let intersectionObserverStub;
104
+ let setTimeoutStub;
105
+ let clearTimeoutStub;
106
+ let observeCalled;
107
+ let unobserveCalled;
108
+ let stateChangeBackup;
109
+ let ti = 1;
110
+ beforeEach(() => {
111
+ observeCalled = false;
112
+ unobserveCalled = false;
113
+ sandbox = sinon.sandbox.create();
114
+
115
+ let fakeIntersectionObserver = (stateChange, options) => {
116
+ return {
117
+ observe: (element) => {
118
+ stateChangeBackup = stateChange;
119
+ observeCalled = true;
120
+ stateChange([{ isIntersecting: true }]);
121
+ },
122
+ unobserve: (element) => {
123
+ unobserveCalled = true;
124
+ },
125
+ };
126
+ };
127
+
128
+ intersectionObserverStub = sandbox.stub(window, 'IntersectionObserver').callsFake(fakeIntersectionObserver);
129
+ setTimeoutStub = sandbox.stub(window, 'setTimeout').callsFake((callback, timeout) => {
130
+ // skipping the callback
131
+ return ti++;
132
+ });
133
+ clearTimeoutStub = sandbox.stub(window, 'clearTimeout').callsFake((timeoutId) => { });
134
+ });
135
+
136
+ afterEach(() => {
137
+ sandbox.restore();
138
+ });
139
+
140
+ it('should clear the timeout', () => {
141
+ viewability.startMeasurement('10', {}, { method: 'img', value: 'http://my.tracker/123' }, { inViewThreshold: 0.5, timeInView: 1000 });
142
+ stateChangeBackup([{ isIntersecting: false }]);
143
+ sinon.assert.called(intersectionObserverStub);
144
+ sinon.assert.called(setTimeoutStub);
145
+ sinon.assert.called(clearTimeoutStub);
146
+ expect(observeCalled).to.equal(true);
147
+ });
148
+
149
+ it('should unobserve', () => {
150
+ viewability.startMeasurement('11', {}, { method: 'img', value: 'http://my.tracker/123' }, { inViewThreshold: 0.5, timeInView: 1000 });
151
+ sinon.assert.called(intersectionObserverStub);
152
+ sinon.assert.called(setTimeoutStub);
153
+ expect(observeCalled).to.equal(true);
154
+ expect(unobserveCalled).to.equal(false);
155
+
156
+ viewability.stopMeasurement('11');
157
+ expect(unobserveCalled).to.equal(true);
158
+ sinon.assert.called(clearTimeoutStub);
159
+ });
160
+
161
+ it('should check for vid existence', () => {
162
+ let logWarnSpy = sandbox.spy(utils, 'logWarn');
163
+ viewability.stopMeasurement('100');
164
+ expect(logWarnSpy.callCount).to.equal(1);
165
+ expect(logWarnSpy.calledWith(`${viewability.MODULE_NAME}: must provide a registered vid`, '100')).to.equal(true);
166
+ });
167
+ });
168
+
169
+ describe('handle creative messages', () => {
170
+ let sandbox;
171
+ let intersectionObserverStub;
172
+ let setTimeoutStub;
173
+ let observeCalled;
174
+ let unobserveCalled;
175
+ let ti = 1;
176
+ let getElementsByTagStub;
177
+ let getElementByIdStub;
178
+
179
+ let fakeContentWindow = {};
180
+ beforeEach(() => {
181
+ observeCalled = false;
182
+ unobserveCalled = false;
183
+ sandbox = sinon.sandbox.create();
184
+
185
+ let fakeIntersectionObserver = (stateChange, options) => {
186
+ return {
187
+ observe: (element) => {
188
+ observeCalled = true;
189
+ stateChange([{ isIntersecting: true }]);
190
+ },
191
+ unobserve: (element) => {
192
+ unobserveCalled = true;
193
+ },
194
+ };
195
+ };
196
+
197
+ intersectionObserverStub = sandbox.stub(window, 'IntersectionObserver').callsFake(fakeIntersectionObserver);
198
+ setTimeoutStub = sandbox.stub(window, 'setTimeout').callsFake((callback, timeout) => {
199
+ callback();
200
+ return ti++;
201
+ });
202
+
203
+ getElementsByTagStub = sandbox.stub(document, 'getElementsByTagName').callsFake((tagName) => {
204
+ return [{
205
+ contentWindow: fakeContentWindow,
206
+ }];
207
+ });
208
+ getElementByIdStub = sandbox.stub(document, 'getElementById').callsFake((id) => {
209
+ return {};
210
+ });
211
+ });
212
+
213
+ afterEach(() => {
214
+ sandbox.restore();
215
+ });
216
+
217
+ it('should find element by contentWindow', () => {
218
+ let viewabilityRecord = {
219
+ vid: 1000,
220
+ tracker: {
221
+ value: 'http://my.tracker/123',
222
+ method: 'img',
223
+ },
224
+ criteria: { inViewThreshold: 0.5, timeInView: 1000 },
225
+ message: 'Prebid Viewability',
226
+ action: 'startMeasurement',
227
+ };
228
+ let data = JSON.stringify(viewabilityRecord);
229
+
230
+ viewability.receiveMessage({
231
+ data: data,
232
+ source: fakeContentWindow,
233
+ });
234
+
235
+ sinon.assert.called(getElementsByTagStub);
236
+ sinon.assert.called(intersectionObserverStub);
237
+ sinon.assert.called(setTimeoutStub);
238
+ expect(observeCalled).to.equal(true);
239
+ expect(unobserveCalled).to.equal(true);
240
+ });
241
+
242
+ it('should find element by id', () => {
243
+ let viewabilityRecord = {
244
+ vid: 1001,
245
+ tracker: {
246
+ value: 'http://my.tracker/123',
247
+ method: 'img',
248
+ },
249
+ criteria: { inViewThreshold: 0.5, timeInView: 1000 },
250
+ message: 'Prebid Viewability',
251
+ action: 'startMeasurement',
252
+ elementId: '1',
253
+ };
254
+ let data = JSON.stringify(viewabilityRecord);
255
+ viewability.receiveMessage({
256
+ data: data,
257
+ });
258
+
259
+ sinon.assert.called(getElementByIdStub);
260
+ sinon.assert.called(intersectionObserverStub);
261
+ sinon.assert.called(setTimeoutStub);
262
+ expect(observeCalled).to.equal(true);
263
+ expect(unobserveCalled).to.equal(true);
264
+ });
265
+
266
+ it('should stop measurement', () => {
267
+ let viewabilityRecord = {
268
+ vid: 1001,
269
+ message: 'Prebid Viewability',
270
+ action: 'stopMeasurement',
271
+ };
272
+ let data = JSON.stringify(viewabilityRecord);
273
+ viewability.receiveMessage({
274
+ data: data,
275
+ });
276
+
277
+ expect(unobserveCalled).to.equal(true);
278
+ });
279
+ });
280
+ });