prebid.js 8.4.0 → 8.6.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.
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/a1MediaRtdProvider.js +1 -0
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adbookpspBidAdapter.js +1 -1
- package/dist/adfBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adkernelAdnBidAdapter.js +1 -1
- package/dist/adkernelBidAdapter.js +1 -1
- package/dist/admixerIdSystem.js +1 -1
- package/dist/adnuntiusBidAdapter.js +1 -1
- package/dist/adqueryBidAdapter.js +1 -1
- package/dist/adqueryIdSystem.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adsinteractiveBidAdapter.js +1 -1
- package/dist/adtelligentIdSystem.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adyoulikeBidAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/appierAnalyticsAdapter.js +1 -1
- package/dist/appnexusBidAdapter.js +1 -1
- package/dist/asoBidAdapter.js +1 -1
- package/dist/axonixBidAdapter.js +1 -1
- package/dist/beachfrontBidAdapter.js +1 -1
- package/dist/bidglassBidAdapter.js +1 -1
- package/dist/big-richmediaBidAdapter.js +1 -1
- package/dist/bridBidAdapter.js +1 -1
- package/dist/bridgewellBidAdapter.js +1 -1
- package/dist/brightMountainMediaBidAdapter.js +1 -1
- package/dist/britepoolIdSystem.js +1 -1
- package/dist/carodaBidAdapter.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connectIdSystem.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consentManagementGpp.js +1 -1
- package/dist/consumableBidAdapter.js +1 -1
- package/dist/conversantAnalyticsAdapter.js +1 -1
- package/dist/conversantBidAdapter.js +1 -1
- package/dist/craftBidAdapter.js +1 -1
- package/dist/criteoBidAdapter.js +1 -1
- package/dist/criteoIdSystem.js +1 -1
- package/dist/cwireBidAdapter.js +1 -1
- package/dist/czechAdIdSystem.js +1 -1
- package/dist/dacIdSystem.js +1 -1
- package/dist/deepintentDpesIdSystem.js +1 -1
- package/dist/dependencies.json +6 -0
- package/dist/dmdIdSystem.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/euidIdSystem.js +1 -1
- package/dist/fabrickIdSystem.js +1 -1
- package/dist/feedadBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/freewheel-sspBidAdapter.js +1 -1
- package/dist/ftrackIdSystem.js +1 -1
- package/dist/geolocationRtdProvider.js +1 -0
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/gravitoIdSystem.js +1 -1
- package/dist/greenbidsAnalyticsAdapter.js +1 -1
- package/dist/greenbidsRtdProvider.js +1 -1
- package/dist/gridBidAdapter.js +1 -1
- package/dist/growthCodeAnalyticsAdapter.js +1 -1
- package/dist/growthCodeIdSystem.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/hadronIdSystem.js +1 -1
- package/dist/hypelabBidAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/identityLinkIdSystem.js +1 -1
- package/dist/idxIdSystem.js +1 -1
- package/dist/imdsBidAdapter.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/imuIdSystem.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/intentIqIdSystem.js +1 -1
- package/dist/invibesBidAdapter.js +1 -1
- package/dist/ixBidAdapter.js +1 -1
- package/dist/justIdSystem.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/kargoBidAdapter.js +1 -1
- package/dist/kinessoIdSystem.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.js +1 -1
- package/dist/kueezRtbBidAdapter.js +1 -1
- package/dist/kulturemediaBidAdapter.js +1 -1
- package/dist/lassoBidAdapter.js +1 -1
- package/dist/lifestreetBidAdapter.js +1 -1
- package/dist/liveIntentIdSystem.js +1 -1
- package/dist/logicadBidAdapter.js +1 -1
- package/dist/loglyliftBidAdapter.js +1 -1
- package/dist/lotamePanoramaIdSystem.js +1 -1
- package/dist/magniteAnalyticsAdapter.js +1 -1
- package/dist/malltvAnalyticsAdapter.js +1 -1
- package/dist/marsmediaBidAdapter.js +1 -1
- package/dist/mediafuseBidAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/merkleIdSystem.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/minutemediaplusBidAdapter.js +1 -1
- package/dist/mspa.js +1 -1
- package/dist/mwOpenLinkIdSystem.js +1 -1
- package/dist/naveggIdSystem.js +1 -1
- package/dist/netIdSystem.js +1 -1
- package/dist/newspassidBidAdapter.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +186 -181
- package/dist/novatiqIdSystem.js +1 -1
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/oneKeyIdSystem.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/optidigitalBidAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/ozoneBidAdapter.js +1 -1
- package/dist/pairIdSystem.js +1 -1
- package/dist/parrableIdSystem.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/prebid-core.js +1 -1
- package/dist/pubCircleBidAdapter.js +1 -0
- package/dist/publinkIdSystem.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/quantcastIdSystem.js +1 -1
- package/dist/readpeakBidAdapter.js +1 -1
- package/dist/relaidoBidAdapter.js +1 -1
- package/dist/relevadRtdProvider.js +1 -1
- package/dist/retailspotBidAdapter.js +1 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/rubiconBidAdapter.js +1 -1
- package/dist/seedingAllianceBidAdapter.js +1 -1
- package/dist/seedtagBidAdapter.js +1 -1
- package/dist/sharedIdSystem.js +1 -1
- package/dist/sharethroughAnalyticsAdapter.js +1 -1
- package/dist/sharethroughBidAdapter.js +1 -1
- package/dist/shinezBidAdapter.js +1 -1
- package/dist/silverpushBidAdapter.js +1 -1
- package/dist/smaatoBidAdapter.js +1 -1
- package/dist/smartadserverBidAdapter.js +1 -1
- package/dist/smartxBidAdapter.js +1 -1
- package/dist/smilewantedBidAdapter.js +1 -1
- package/dist/sonobiBidAdapter.js +1 -1
- package/dist/sovrnAnalyticsAdapter.js +1 -1
- package/dist/sovrnBidAdapter.js +1 -1
- package/dist/ssmasBidAdapter.js +1 -0
- package/dist/sspBCBidAdapter.js +1 -1
- package/dist/stvBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/tapadIdSystem.js +1 -1
- package/dist/tappxBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/tncIdSystem.js +1 -1
- package/dist/topicsFpdModule.js +1 -1
- package/dist/trionBidAdapter.js +1 -1
- package/dist/tripleliftBidAdapter.js +1 -1
- package/dist/ttdBidAdapter.js +1 -1
- package/dist/ucfunnelAnalyticsAdapter.js +1 -1
- package/dist/uid2IdSystem.js +1 -1
- package/dist/underdogmediaBidAdapter.js +1 -1
- package/dist/undertoneBidAdapter.js +1 -1
- package/dist/unifiedIdSystem.js +1 -1
- package/dist/userId.js +1 -1
- package/dist/utiqSystem.js +1 -1
- package/dist/verizonMediaIdSystem.js +1 -1
- package/dist/viantOrtbBidAdapter.js +1 -0
- package/dist/vidazooBidAdapter.js +1 -1
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/videojsVideoProvider.js +1 -1
- package/dist/visxBidAdapter.js +1 -1
- package/dist/vrtcalBidAdapter.js +1 -1
- package/dist/vuukleBidAdapter.js +1 -1
- package/dist/widespaceBidAdapter.js +1 -1
- package/dist/winrBidAdapter.js +1 -1
- package/dist/yahoosspBidAdapter.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/dist/zeotapIdPlusIdSystem.js +1 -1
- package/integrationExamples/gpt/adUnitFloors.html +0 -1
- package/integrationExamples/videoModule/jwplayer/bidMarkedAsUsed.html +1 -1
- package/integrationExamples/videoModule/jwplayer/bidRequestScheduling.html +1 -1
- package/integrationExamples/videoModule/jwplayer/bidsBackHandlerOverride.html +137 -0
- package/integrationExamples/videoModule/jwplayer/eventListeners.html +1 -1
- package/integrationExamples/videoModule/jwplayer/eventsUI.html +1 -1
- package/integrationExamples/videoModule/jwplayer/gamAdServerMediation.html +1 -1
- package/integrationExamples/videoModule/jwplayer/mediaMetadata.html +1 -1
- package/integrationExamples/videoModule/jwplayer/playlist.html +1 -1
- package/integrationExamples/videoModule/videojs/bidsBackHandlerOverride.html +164 -0
- package/libraries/mspa/activityControls.js +51 -32
- package/modules/.submodules.json +1 -0
- package/modules/33acrossIdSystem.js +9 -0
- package/modules/a1MediaRtdProvider.js +92 -0
- package/modules/a1MediaRtdProvider.md +46 -0
- package/modules/adfBidAdapter.js +4 -1
- package/modules/adgenerationBidAdapter.js +3 -3
- package/modules/adkernelAdnBidAdapter.js +1 -1
- package/modules/adkernelBidAdapter.js +10 -3
- package/modules/admixerIdSystem.js +6 -0
- package/modules/adnuntiusBidAdapter.js +5 -13
- package/modules/adqueryIdSystem.js +6 -0
- package/modules/adsinteractiveBidAdapter.js +2 -2
- package/modules/adtelligentIdSystem.js +6 -0
- package/modules/adyoulikeBidAdapter.js +6 -3
- package/modules/amxIdSystem.js +6 -0
- package/modules/appnexusBidAdapter.js +1 -1
- package/modules/beachfrontBidAdapter.js +32 -6
- package/modules/britepoolIdSystem.js +6 -0
- package/modules/connectIdSystem.js +6 -0
- package/modules/consentManagementGpp.js +10 -1
- package/modules/consumableBidAdapter.js +9 -1
- package/modules/criteoBidAdapter.js +18 -0
- package/modules/criteoIdSystem.js +6 -0
- package/modules/cwireBidAdapter.js +19 -0
- package/modules/czechAdIdSystem.js +6 -0
- package/modules/dacIdSystem.js +6 -0
- package/modules/deepintentDpesIdSystem.js +7 -2
- package/modules/dmdIdSystem.js +6 -0
- package/modules/euidIdSystem.js +9 -0
- package/modules/fabrickIdSystem.js +6 -0
- package/modules/ftrackIdSystem.js +16 -0
- package/modules/geolocationRtdProvider.js +65 -0
- package/modules/gravitoIdSystem.js +6 -0
- package/modules/greenbidsRtdProvider.js +1 -1
- package/modules/growthCodeAnalyticsAdapter.js +7 -2
- package/modules/growthCodeIdSystem.js +20 -1
- package/modules/hadronIdSystem.js +6 -0
- package/modules/id5IdSystem.js +34 -8
- package/modules/identityLinkIdSystem.js +6 -0
- package/modules/idxIdSystem.js +6 -0
- package/modules/imdsBidAdapter.js +38 -14
- package/modules/imuIdSystem.js +10 -0
- package/modules/intentIqIdSystem.js +6 -0
- package/modules/invibesBidAdapter.js +5 -5
- package/modules/ixBidAdapter.js +16 -0
- package/modules/justIdSystem.js +6 -0
- package/modules/kinessoIdSystem.js +7 -2
- package/modules/liveIntentIdSystem.js +53 -0
- package/modules/lotamePanoramaIdSystem.js +6 -0
- package/modules/merkleIdSystem.js +24 -0
- package/modules/mwOpenLinkIdSystem.js +6 -0
- package/modules/naveggIdSystem.js +6 -0
- package/modules/netIdSystem.js +6 -0
- package/modules/newspassid.md +76 -0
- package/modules/newspassidBidAdapter.js +44 -18
- package/modules/novatiqIdSystem.js +12 -0
- package/modules/oneKeyIdSystem.js +26 -0
- package/modules/ozoneBidAdapter.js +65 -18
- package/modules/ozoneBidAdapter.md +3 -1
- package/modules/pairIdSystem.js +6 -0
- package/modules/parrableIdSystem.js +38 -2
- package/modules/pubCircleBidAdapter.js +231 -0
- package/modules/pubCircleBidAdapter.md +79 -0
- package/modules/publinkIdSystem.js +7 -1
- package/modules/quantcastIdSystem.js +6 -0
- package/modules/relevadRtdProvider.js +6 -7
- package/modules/rubiconBidAdapter.js +9 -0
- package/modules/sharedIdSystem.js +6 -0
- package/modules/silverpushBidAdapter.js +2 -2
- package/modules/ssmasBidAdapter.js +126 -0
- package/modules/ssmasBidAdapter.md +35 -0
- package/modules/sspBCBidAdapter.js +36 -13
- package/modules/tapadIdSystem.js +6 -0
- package/modules/tappxBidAdapter.js +10 -1
- package/modules/tappxBidAdapter.md +17 -0
- package/modules/tncIdSystem.js +6 -0
- package/modules/topicsFpdModule.js +21 -48
- package/modules/tripleliftBidAdapter.js +5 -0
- package/modules/uid2IdSystem.js +14 -0
- package/modules/unifiedIdSystem.js +11 -0
- package/modules/userId/eids.js +6 -445
- package/modules/userId/index.js +36 -24
- package/modules/utiqSystem.js +9 -0
- package/modules/verizonMediaIdSystem.js +6 -0
- package/modules/viantOrtbBidAdapter.js +113 -0
- package/modules/viantOrtbBidAdapter.md +54 -0
- package/modules/vidazooBidAdapter.js +9 -2
- package/modules/videojsVideoProvider.js +9 -2
- package/modules/vrtcalBidAdapter.js +10 -6
- package/modules/zeotapIdPlusIdSystem.js +6 -0
- package/package.json +1 -1
- package/src/adapters/bidderFactory.js +15 -6
- package/src/adloader.js +2 -1
- package/test/spec/libraries/mspa/activityControls_spec.js +145 -212
- package/test/spec/modules/a1MediaRtdProvider_spec.js +105 -0
- package/test/spec/modules/adfBidAdapter_spec.js +47 -0
- package/test/spec/modules/adgenerationBidAdapter_spec.js +6 -6
- package/test/spec/modules/adkernelAdnBidAdapter_spec.js +1 -2
- package/test/spec/modules/adkernelBidAdapter_spec.js +7 -2
- package/test/spec/modules/adnuntiusBidAdapter_spec.js +116 -64
- package/test/spec/modules/adyoulikeBidAdapter_spec.js +13 -24
- package/test/spec/modules/appnexusBidAdapter_spec.js +12 -1
- package/test/spec/modules/beachfrontBidAdapter_spec.js +35 -2
- package/test/spec/modules/consentManagementGpp_spec.js +16 -0
- package/test/spec/modules/consumableBidAdapter_spec.js +15 -0
- package/test/spec/modules/criteoBidAdapter_spec.js +31 -3
- package/test/spec/modules/cwireBidAdapter_spec.js +47 -0
- package/test/spec/modules/freewheel-sspBidAdapter_spec.js +5 -5
- package/test/spec/modules/geolocationRtdProvider_spec.js +119 -0
- package/test/spec/modules/greenbidsRtdProvider_spec.js +1 -1
- package/test/spec/modules/id5IdSystem_spec.js +18 -0
- package/test/spec/modules/imdsBidAdapter_spec.js +98 -17
- package/test/spec/modules/invibesBidAdapter_spec.js +123 -32
- package/test/spec/modules/ixBidAdapter_spec.js +23 -5
- package/test/spec/modules/medianetBidAdapter_spec.js +117 -0
- package/test/spec/modules/newspassidBidAdapter_spec.js +6 -0
- package/test/spec/modules/outbrainBidAdapter_spec.js +3 -5
- package/test/spec/modules/ozoneBidAdapter_spec.js +27 -1
- package/test/spec/modules/prebidServerBidAdapter_spec.js +2 -20
- package/test/spec/modules/priceFloors_spec.js +14 -0
- package/test/spec/modules/pubCircleBidAdapter_spec.js +399 -0
- package/test/spec/modules/pubmaticBidAdapter_spec.js +6 -373
- package/test/spec/modules/rubiconBidAdapter_spec.js +220 -9
- package/test/spec/modules/smaatoBidAdapter_spec.js +4 -6
- package/test/spec/modules/ssmasBidAdapter_spec.js +244 -0
- package/test/spec/modules/sspBCBidAdapter_spec.js +18 -19
- package/test/spec/modules/topicsFpdModule_spec.js +343 -365
- package/test/spec/modules/tripleliftBidAdapter_spec.js +40 -0
- package/test/spec/modules/userId_spec.js +116 -7
- package/test/spec/modules/viantOrtbBidAdapter_spec.js +432 -0
- package/test/spec/modules/vrtcalBidAdapter_spec.js +12 -4
- package/test/spec/modules/xeBidAdapter_spec.js +366 -368
- package/test/spec/modules/yahoosspBidAdapter_spec.js +5 -18
- package/test/spec/unit/core/bidderFactory_spec.js +61 -14
- package/integrationExamples/gpt/pbjs_video_adUnit.html +0 -109
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Overview
|
|
2
|
+
|
|
3
|
+
Module Name: VIANT Bidder Adapter
|
|
4
|
+
Module Type: Bidder Adapter
|
|
5
|
+
Maintainer: dist-runtime@viantinc.com
|
|
6
|
+
|
|
7
|
+
# Description
|
|
8
|
+
|
|
9
|
+
An adapter to get a bid from VIANT DSP.
|
|
10
|
+
|
|
11
|
+
# Test Parameters
|
|
12
|
+
```javascript
|
|
13
|
+
var adUnits = [ // Banner adUnit with only required parameters
|
|
14
|
+
{
|
|
15
|
+
code: 'test-div-minimal',
|
|
16
|
+
mediaTypes: {
|
|
17
|
+
banner: {
|
|
18
|
+
sizes: [[728, 90]]
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
bids: [
|
|
22
|
+
{
|
|
23
|
+
bidder: 'viant',
|
|
24
|
+
params: {
|
|
25
|
+
supplySourceId: 'supplier',
|
|
26
|
+
publisherId: '464'
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
code: 'test-div-minimal-video',
|
|
33
|
+
mediaTypes: {
|
|
34
|
+
video: {
|
|
35
|
+
playerSize: [640, 480],
|
|
36
|
+
context: 'outstream'
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
bids: [
|
|
40
|
+
{
|
|
41
|
+
bidder: 'viant',
|
|
42
|
+
params: {
|
|
43
|
+
supplySourceId: 'supplier',
|
|
44
|
+
publisherId: '464' // required
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
];
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Where:
|
|
53
|
+
|
|
54
|
+
* placementId - Placement ID of the ad unit (required)
|
|
@@ -320,13 +320,20 @@ function interpretResponse(serverResponse, request) {
|
|
|
320
320
|
}
|
|
321
321
|
}
|
|
322
322
|
|
|
323
|
-
function getUserSyncs(syncOptions, responses, gdprConsent = {}, uspConsent = '') {
|
|
323
|
+
function getUserSyncs(syncOptions, responses, gdprConsent = {}, uspConsent = '', gppConsent = {}) {
|
|
324
324
|
let syncs = [];
|
|
325
325
|
const {iframeEnabled, pixelEnabled} = syncOptions;
|
|
326
326
|
const {gdprApplies, consentString = ''} = gdprConsent;
|
|
327
|
+
const {gppString, applicableSections} = gppConsent;
|
|
327
328
|
|
|
328
329
|
const cidArr = responses.filter(resp => deepAccess(resp, 'body.cid')).map(resp => resp.body.cid).filter(uniques);
|
|
329
|
-
|
|
330
|
+
let params = `?cid=${encodeURIComponent(cidArr.join(','))}&gdpr=${gdprApplies ? 1 : 0}&gdpr_consent=${encodeURIComponent(consentString || '')}&us_privacy=${encodeURIComponent(uspConsent || '')}`;
|
|
331
|
+
|
|
332
|
+
if (gppString && applicableSections?.length) {
|
|
333
|
+
params += '&gpp=' + encodeURIComponent(gppString);
|
|
334
|
+
params += '&gpp_sid=' + encodeURIComponent(applicableSections.join(','));
|
|
335
|
+
}
|
|
336
|
+
|
|
330
337
|
if (iframeEnabled) {
|
|
331
338
|
syncs.push({
|
|
332
339
|
type: 'iframe',
|
|
@@ -201,8 +201,15 @@ export function VideojsProvider(providerConfig, vjs_, adState_, timeState_, call
|
|
|
201
201
|
return;
|
|
202
202
|
}
|
|
203
203
|
|
|
204
|
-
|
|
205
|
-
|
|
204
|
+
// The VideoJS IMA plugin version 1.11.0 will throw when the ad is empty.
|
|
205
|
+
try {
|
|
206
|
+
player.ima.changeAdTag(adTagUrl);
|
|
207
|
+
player.ima.requestAds();
|
|
208
|
+
} catch (e) {
|
|
209
|
+
/*
|
|
210
|
+
Handling is not required; ad errors are emitted automatically by video.js
|
|
211
|
+
*/
|
|
212
|
+
}
|
|
206
213
|
}
|
|
207
214
|
|
|
208
215
|
function onEvent(type, callback, payload) {
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import {registerBidder} from '../src/adapters/bidderFactory.js';
|
|
2
2
|
import { BANNER } from '../src/mediaTypes.js';
|
|
3
3
|
import {ajax} from '../src/ajax.js';
|
|
4
|
-
import {isFn, isPlainObject} from '../src/utils.js';
|
|
5
4
|
import { config } from '../src/config.js';
|
|
5
|
+
import {deepAccess, isFn, isPlainObject} from '../src/utils.js';
|
|
6
|
+
|
|
7
|
+
const GVLID = 706;
|
|
6
8
|
|
|
7
9
|
export const spec = {
|
|
8
10
|
code: 'vrtcal',
|
|
11
|
+
gvlid: GVLID,
|
|
9
12
|
supportedMediaTypes: [BANNER],
|
|
10
13
|
isBidRequestValid: function (bid) {
|
|
11
14
|
return true;
|
|
@@ -62,13 +65,14 @@ export const spec = {
|
|
|
62
65
|
site: {
|
|
63
66
|
id: 'VRTCAL_FILLED',
|
|
64
67
|
name: 'VRTCAL_FILLED',
|
|
65
|
-
cat:
|
|
66
|
-
domain: decodeURIComponent(window.location.href).replace('https://', '').replace('http://', '').split('/')[0]
|
|
67
|
-
|
|
68
|
+
cat: deepAccess(bid, 'ortb2.site.cat', []),
|
|
69
|
+
domain: decodeURIComponent(window.location.href).replace('https://', '').replace('http://', '').split('/')[0],
|
|
70
|
+
page: bid.refererInfo.page
|
|
68
71
|
},
|
|
69
72
|
device: {
|
|
70
|
-
|
|
71
|
-
|
|
73
|
+
language: navigator.language,
|
|
74
|
+
ua: navigator.userAgent,
|
|
75
|
+
ip: deepAccess(bid, 'params.bidOverride.device.ip') || deepAccess(bid, 'params.ext.ip') || undefined
|
|
72
76
|
},
|
|
73
77
|
regs: {
|
|
74
78
|
coppa: coppa,
|
|
@@ -60,6 +60,12 @@ export const zeotapIdPlusSubmodule = {
|
|
|
60
60
|
getId() {
|
|
61
61
|
const id = readCookie() || readFromLocalStorage();
|
|
62
62
|
return id ? { id } : undefined;
|
|
63
|
+
},
|
|
64
|
+
eids: {
|
|
65
|
+
'IDP': {
|
|
66
|
+
source: 'zeotap.com',
|
|
67
|
+
atype: 1
|
|
68
|
+
},
|
|
63
69
|
}
|
|
64
70
|
};
|
|
65
71
|
submodule('userId', zeotapIdPlusSubmodule);
|
package/package.json
CHANGED
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
logError,
|
|
16
16
|
logWarn, memoize,
|
|
17
17
|
parseQueryStringParameters,
|
|
18
|
-
parseSizesInput,
|
|
18
|
+
parseSizesInput, pick,
|
|
19
19
|
uniques
|
|
20
20
|
} from '../utils.js';
|
|
21
21
|
import {hook} from '../hook.js';
|
|
@@ -150,6 +150,7 @@ import {ACTIVITY_TRANSMIT_TID} from '../activities/activities.js';
|
|
|
150
150
|
|
|
151
151
|
// common params for all mediaTypes
|
|
152
152
|
const COMMON_BID_RESPONSE_KEYS = ['cpm', 'ttl', 'creativeId', 'netRevenue', 'currency'];
|
|
153
|
+
const TIDS = ['auctionId', 'transactionId'];
|
|
153
154
|
|
|
154
155
|
/**
|
|
155
156
|
* Register a bidder with prebid, using the given spec.
|
|
@@ -184,7 +185,7 @@ export function registerBidder(spec) {
|
|
|
184
185
|
}
|
|
185
186
|
}
|
|
186
187
|
|
|
187
|
-
function guardTids(bidderCode) {
|
|
188
|
+
export function guardTids(bidderCode) {
|
|
188
189
|
if (isActivityAllowed(ACTIVITY_TRANSMIT_TID, activityParams(MODULE_TYPE_BIDDER, bidderCode))) {
|
|
189
190
|
return {
|
|
190
191
|
bidRequest: (br) => br,
|
|
@@ -192,12 +193,20 @@ function guardTids(bidderCode) {
|
|
|
192
193
|
};
|
|
193
194
|
}
|
|
194
195
|
function get(target, prop, receiver) {
|
|
195
|
-
if (
|
|
196
|
+
if (TIDS.includes(prop)) {
|
|
196
197
|
return null;
|
|
197
198
|
}
|
|
198
199
|
return Reflect.get(target, prop, receiver);
|
|
199
200
|
}
|
|
200
|
-
|
|
201
|
+
function privateAccessProxy(target, handler) {
|
|
202
|
+
const proxy = new Proxy(target, handler);
|
|
203
|
+
// always allow methods (such as getFloor) private access to TIDs
|
|
204
|
+
Object.entries(target)
|
|
205
|
+
.filter(([_, v]) => typeof v === 'function')
|
|
206
|
+
.forEach(([prop, fn]) => proxy[prop] = fn.bind(target));
|
|
207
|
+
return proxy;
|
|
208
|
+
}
|
|
209
|
+
const bidRequest = memoize((br) => privateAccessProxy(br, {get}), (arg) => arg.bidId);
|
|
201
210
|
/**
|
|
202
211
|
* Return a view on bidd(er) requests where auctionId/transactionId are nulled if the bidder is not allowed `transmitTid`.
|
|
203
212
|
*
|
|
@@ -207,7 +216,7 @@ function guardTids(bidderCode) {
|
|
|
207
216
|
*/
|
|
208
217
|
return {
|
|
209
218
|
bidRequest,
|
|
210
|
-
bidderRequest: (br) =>
|
|
219
|
+
bidderRequest: (br) => privateAccessProxy(br, {
|
|
211
220
|
get(target, prop, receiver) {
|
|
212
221
|
if (prop === 'bids') return br.bids.map(bidRequest);
|
|
213
222
|
return get(target, prop, receiver);
|
|
@@ -312,7 +321,7 @@ export function newBidder(spec) {
|
|
|
312
321
|
bid.originalCpm = bid.cpm;
|
|
313
322
|
bid.originalCurrency = bid.currency;
|
|
314
323
|
bid.meta = bid.meta || Object.assign({}, bid[bidRequest.bidder]);
|
|
315
|
-
const prebidBid = Object.assign(createBid(CONSTANTS.STATUS.GOOD, bidRequest), bid);
|
|
324
|
+
const prebidBid = Object.assign(createBid(CONSTANTS.STATUS.GOOD, bidRequest), bid, pick(bidRequest, TIDS));
|
|
316
325
|
addBidWithCode(bidRequest.adUnitCode, prebidBid);
|
|
317
326
|
} else {
|
|
318
327
|
logWarn(`Bidder ${spec.code} made bid for unknown request ID: ${bid.requestId}. Ignoring.`);
|
package/src/adloader.js
CHANGED
|
@@ -1,220 +1,153 @@
|
|
|
1
|
-
import {mspaRule, setupRules, isTransmitUfpdConsentDenied, isTransmitGeoConsentDenied, isBasicConsentDenied,
|
|
1
|
+
import {mspaRule, setupRules, isTransmitUfpdConsentDenied, isTransmitGeoConsentDenied, isBasicConsentDenied, sensitiveNoticeIs, isConsentDenied} from '../../../../libraries/mspa/activityControls.js';
|
|
2
2
|
import {ruleRegistry} from '../../../../src/activities/rules.js';
|
|
3
|
-
describe('isBasicConsentDenied', () => {
|
|
4
|
-
const cd = {
|
|
5
|
-
// not covered, opt in to targeted, sale, and share, all notices given, opt into precise geo
|
|
6
|
-
Gpc: 0,
|
|
7
|
-
KnownChildSensitiveDataConsents: [0, 0],
|
|
8
|
-
MspaCoveredTransaction: 2,
|
|
9
|
-
MspaOptOutOptionMode: 0,
|
|
10
|
-
MspaServiceProviderMode: 0,
|
|
11
|
-
PersonalDataConsents: 0,
|
|
12
|
-
SaleOptOut: 2,
|
|
13
|
-
SaleOptOutNotice: 1,
|
|
14
|
-
SensitiveDataLimitUseNotice: 1,
|
|
15
|
-
SensitiveDataProcessing: [0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0],
|
|
16
|
-
SensitiveDataProcessingOptOutNotice: 1,
|
|
17
|
-
SharingNotice: 1,
|
|
18
|
-
SharingOptOut: 2,
|
|
19
|
-
SharingOptOutNotice: 1,
|
|
20
|
-
TargetedAdvertisingOptOut: 2,
|
|
21
|
-
TargetedAdvertisingOptOutNotice: 1,
|
|
22
|
-
Version: 1
|
|
23
|
-
};
|
|
24
|
-
it('should be false (basic consent conditions pass) with variety of notice and opt in', () => {
|
|
25
|
-
const result = isBasicConsentDenied(cd);
|
|
26
|
-
expect(result).to.equal(false);
|
|
27
|
-
});
|
|
28
|
-
it('should be true (basic consent conditions do not pass) with personal data consent set to true (invalid state)', () => {
|
|
29
|
-
cd.PersonalDataConsents = 2;
|
|
30
|
-
const result = isBasicConsentDenied(cd);
|
|
31
|
-
expect(result).to.equal(true);
|
|
32
|
-
cd.PersonalDataConsents = 0;
|
|
33
|
-
});
|
|
34
|
-
it('should be true (basic consent conditions do not pass) with sensitive opt in but no notice', () => {
|
|
35
|
-
cd.SensitiveDataLimitUseNotice = 0;
|
|
36
|
-
const result = isBasicConsentDenied(cd);
|
|
37
|
-
expect(result).to.equal(true);
|
|
38
|
-
cd.SensitiveDataLimitUseNotice = 1;
|
|
39
|
-
});
|
|
40
|
-
})
|
|
41
|
-
describe('isSensitiveNoticeMissing', () => {
|
|
42
|
-
const cd = {
|
|
43
|
-
// not covered, opt in to targeted, sale, and share, all notices given, opt into precise geo
|
|
44
|
-
Gpc: 0,
|
|
45
|
-
KnownChildSensitiveDataConsents: [0, 0],
|
|
46
|
-
MspaCoveredTransaction: 2,
|
|
47
|
-
MspaOptOutOptionMode: 0,
|
|
48
|
-
MspaServiceProviderMode: 0,
|
|
49
|
-
PersonalDataConsents: 0,
|
|
50
|
-
SaleOptOut: 2,
|
|
51
|
-
SaleOptOutNotice: 1,
|
|
52
|
-
SensitiveDataLimitUseNotice: 1,
|
|
53
|
-
SensitiveDataProcessing: [0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0],
|
|
54
|
-
SensitiveDataProcessingOptOutNotice: 1,
|
|
55
|
-
SharingNotice: 1,
|
|
56
|
-
SharingOptOut: 2,
|
|
57
|
-
SharingOptOutNotice: 1,
|
|
58
|
-
TargetedAdvertisingOptOut: 2,
|
|
59
|
-
TargetedAdvertisingOptOutNotice: 1,
|
|
60
|
-
Version: 1
|
|
61
|
-
};
|
|
62
|
-
it('should be false (sensitive notice is given or not needed) with variety of notice and opt in', () => {
|
|
63
|
-
const result = isSensitiveNoticeMissing(cd);
|
|
64
|
-
expect(result).to.equal(false);
|
|
65
|
-
});
|
|
66
|
-
it('should be true (sensitive notice is missing) with variety of notice and opt in', () => {
|
|
67
|
-
cd.SensitiveDataLimitUseNotice = 2;
|
|
68
|
-
const result = isSensitiveNoticeMissing(cd);
|
|
69
|
-
expect(result).to.equal(true);
|
|
70
|
-
cd.SensitiveDataLimitUseNotice = 1;
|
|
71
|
-
});
|
|
72
|
-
})
|
|
73
|
-
describe('isConsentDenied', () => {
|
|
74
|
-
const cd = {
|
|
75
|
-
// not covered, opt in to targeted, sale, and share, all notices given, opt into precise geo
|
|
76
|
-
Gpc: 0,
|
|
77
|
-
KnownChildSensitiveDataConsents: [0, 0],
|
|
78
|
-
MspaCoveredTransaction: 2,
|
|
79
|
-
MspaOptOutOptionMode: 0,
|
|
80
|
-
MspaServiceProviderMode: 0,
|
|
81
|
-
PersonalDataConsents: 0,
|
|
82
|
-
SaleOptOut: 2,
|
|
83
|
-
SaleOptOutNotice: 1,
|
|
84
|
-
SensitiveDataLimitUseNotice: 1,
|
|
85
|
-
SensitiveDataProcessing: [0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0],
|
|
86
|
-
SensitiveDataProcessingOptOutNotice: 1,
|
|
87
|
-
SharingNotice: 1,
|
|
88
|
-
SharingOptOut: 2,
|
|
89
|
-
SharingOptOutNotice: 1,
|
|
90
|
-
TargetedAdvertisingOptOut: 2,
|
|
91
|
-
TargetedAdvertisingOptOutNotice: 1,
|
|
92
|
-
Version: 1
|
|
93
|
-
};
|
|
94
|
-
it('should be false (consent given personalized ads / sale / share) with variety of notice and opt in', () => {
|
|
95
|
-
const result = isConsentDenied(cd);
|
|
96
|
-
expect(result).to.equal(false);
|
|
97
|
-
});
|
|
98
|
-
it('should be true (no consent) on opt out of targeted ads via TargetedAdvertisingOptOut', () => {
|
|
99
|
-
cd.TargetedAdvertisingOptOut = 1;
|
|
100
|
-
const result = isConsentDenied(cd);
|
|
101
|
-
expect(result).to.equal(true);
|
|
102
|
-
cd.TargetedAdvertisingOptOut = 2;
|
|
103
|
-
});
|
|
104
|
-
it('should be true (no consent) on opt out of targeted ads via no TargetedAdvertisingOptOutNotice', () => {
|
|
105
|
-
cd.TargetedAdvertisingOptOutNotice = 2;
|
|
106
|
-
const result = isConsentDenied(cd);
|
|
107
|
-
expect(result).to.equal(true);
|
|
108
|
-
cd.TargetedAdvertisingOptOutNotice = 1;
|
|
109
|
-
});
|
|
110
|
-
it('should be true (no consent) if TargetedAdvertisingOptOutNotice is 0 and TargetedAdvertisingOptOut is 2', () => {
|
|
111
|
-
cd.TargetedAdvertisingOptOutNotice = 0;
|
|
112
|
-
const result = isConsentDenied(cd);
|
|
113
|
-
expect(result).to.equal(true);
|
|
114
|
-
cd.TargetedAdvertisingOptOutNotice = 1;
|
|
115
|
-
});
|
|
116
|
-
})
|
|
117
|
-
describe('isTransmitUfpdConsentDenied', () => {
|
|
118
|
-
const cd = {
|
|
119
|
-
// not covered, opt in to targeted, sale, and share, all notices given, opt into precise geo
|
|
120
|
-
Gpc: 0,
|
|
121
|
-
KnownChildSensitiveDataConsents: [0, 0],
|
|
122
|
-
MspaCoveredTransaction: 2,
|
|
123
|
-
MspaOptOutOptionMode: 0,
|
|
124
|
-
MspaServiceProviderMode: 0,
|
|
125
|
-
PersonalDataConsents: 0,
|
|
126
|
-
SaleOptOut: 2,
|
|
127
|
-
SaleOptOutNotice: 1,
|
|
128
|
-
SensitiveDataLimitUseNotice: 1,
|
|
129
|
-
SensitiveDataProcessing: [0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0],
|
|
130
|
-
SensitiveDataProcessingOptOutNotice: 1,
|
|
131
|
-
SharingNotice: 1,
|
|
132
|
-
SharingOptOut: 2,
|
|
133
|
-
SharingOptOutNotice: 1,
|
|
134
|
-
TargetedAdvertisingOptOut: 2,
|
|
135
|
-
TargetedAdvertisingOptOutNotice: 1,
|
|
136
|
-
Version: 1
|
|
137
|
-
};
|
|
138
|
-
it('should be false (consent given to add ufpd) with variety of notice and opt in', () => {
|
|
139
|
-
const result = isTransmitUfpdConsentDenied(cd);
|
|
140
|
-
expect(result).to.equal(false);
|
|
141
|
-
});
|
|
142
|
-
it('should be true (consent denied to add ufpd) if no consent to process health information', () => {
|
|
143
|
-
cd.SensitiveDataProcessing[2] = 1;
|
|
144
|
-
const result = isTransmitUfpdConsentDenied(cd);
|
|
145
|
-
expect(result).to.equal(true);
|
|
146
|
-
cd.SensitiveDataProcessing[2] = 0;
|
|
147
|
-
});
|
|
148
|
-
it('should be true (consent denied to add ufpd) with consent to process biometric data, as this should not be on openrtb', () => {
|
|
149
|
-
cd.SensitiveDataProcessing[6] = 1;
|
|
150
|
-
const result = isTransmitUfpdConsentDenied(cd);
|
|
151
|
-
expect(result).to.equal(true);
|
|
152
|
-
cd.SensitiveDataProcessing[6] = 1;
|
|
153
|
-
});
|
|
154
|
-
it('should be true (consent denied to add ufpd) without sharing notice', () => {
|
|
155
|
-
cd.SharingNotice = 2;
|
|
156
|
-
const result = isTransmitUfpdConsentDenied(cd);
|
|
157
|
-
expect(result).to.equal(true);
|
|
158
|
-
cd.SharingNotice = 1;
|
|
159
|
-
});
|
|
160
|
-
it('should be true (consent denied to add ufpd) with sale opt out', () => {
|
|
161
|
-
cd.SaleOptOut = 1;
|
|
162
|
-
const result = isTransmitUfpdConsentDenied(cd);
|
|
163
|
-
expect(result).to.equal(true);
|
|
164
|
-
cd.SaleOptOut = 2;
|
|
165
|
-
});
|
|
166
|
-
it('should be true (consent denied to add ufpd) without targeted ads opt out', () => {
|
|
167
|
-
cd.TargetedAdvertisingOptOut = 1;
|
|
168
|
-
const result = isTransmitUfpdConsentDenied(cd);
|
|
169
|
-
expect(result).to.equal(true);
|
|
170
|
-
cd.TargetedAdvertisingOptOut = 2;
|
|
171
|
-
});
|
|
172
|
-
it('should be true (consent denied to add ufpd) with missing sensitive data limit notice', () => {
|
|
173
|
-
cd.SensitiveDataLimitUseNotice = 2;
|
|
174
|
-
const result = isTransmitUfpdConsentDenied(cd);
|
|
175
|
-
expect(result).to.equal(true);
|
|
176
|
-
cd.SensitiveDataLimitUseNotice = 1;
|
|
177
|
-
});
|
|
178
|
-
})
|
|
179
3
|
|
|
180
|
-
describe('
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
4
|
+
describe('Consent interpretation', () => {
|
|
5
|
+
function mkConsent(flags) {
|
|
6
|
+
return Object.assign({
|
|
7
|
+
// not covered, opt in to targeted, sale, and share, all notices given, opt into precise geo
|
|
8
|
+
Gpc: 0,
|
|
9
|
+
KnownChildSensitiveDataConsents: [0, 0],
|
|
10
|
+
MspaCoveredTransaction: 2,
|
|
11
|
+
MspaOptOutOptionMode: 0,
|
|
12
|
+
MspaServiceProviderMode: 0,
|
|
13
|
+
PersonalDataConsents: 0,
|
|
14
|
+
SaleOptOut: 2,
|
|
15
|
+
SaleOptOutNotice: 1,
|
|
16
|
+
SensitiveDataLimitUseNotice: 1,
|
|
17
|
+
SensitiveDataProcessing: [0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0],
|
|
18
|
+
SensitiveDataProcessingOptOutNotice: 1,
|
|
19
|
+
SharingNotice: 1,
|
|
20
|
+
SharingOptOut: 2,
|
|
21
|
+
SharingOptOutNotice: 1,
|
|
22
|
+
TargetedAdvertisingOptOut: 2,
|
|
23
|
+
TargetedAdvertisingOptOutNotice: 1,
|
|
24
|
+
Version: 1
|
|
25
|
+
}, flags)
|
|
26
|
+
}
|
|
27
|
+
describe('isBasicConsentDenied', () => {
|
|
28
|
+
it('should be false (basic consent conditions pass) with variety of notice and opt in', () => {
|
|
29
|
+
const result = isBasicConsentDenied(mkConsent());
|
|
30
|
+
expect(result).to.equal(false);
|
|
31
|
+
});
|
|
32
|
+
it('should be true (basic consent conditions do not pass) with personal data consent set to true (invalid state)', () => {
|
|
33
|
+
const result = isBasicConsentDenied(mkConsent({
|
|
34
|
+
PersonalDataConsents: 2
|
|
35
|
+
}));
|
|
36
|
+
expect(result).to.equal(true);
|
|
37
|
+
});
|
|
38
|
+
it('should not deny when consent for under-13 is null', () => {
|
|
39
|
+
expect(isBasicConsentDenied(mkConsent({
|
|
40
|
+
KnownChildSensitiveDataConsents: [0, null]
|
|
41
|
+
}))).to.be.false;
|
|
42
|
+
})
|
|
204
43
|
});
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
44
|
+
|
|
45
|
+
describe('isConsentDenied', () => {
|
|
46
|
+
it('should be false (consent given personalized ads / sale / share) with variety of notice and opt in', () => {
|
|
47
|
+
const result = isConsentDenied(mkConsent());
|
|
48
|
+
expect(result).to.equal(false);
|
|
49
|
+
});
|
|
50
|
+
it('should be true (no consent) on opt out of targeted ads via TargetedAdvertisingOptOut', () => {
|
|
51
|
+
const result = isConsentDenied(mkConsent({
|
|
52
|
+
TargetedAdvertisingOptOut: 1
|
|
53
|
+
}));
|
|
54
|
+
expect(result).to.equal(true);
|
|
55
|
+
});
|
|
56
|
+
it('should be true (no consent) on opt out of targeted ads via no TargetedAdvertisingOptOutNotice', () => {
|
|
57
|
+
const result = isConsentDenied(mkConsent({
|
|
58
|
+
TargetedAdvertisingOptOutNotice: 2
|
|
59
|
+
}));
|
|
60
|
+
expect(result).to.equal(true);
|
|
61
|
+
});
|
|
62
|
+
it('should be true (no consent) if TargetedAdvertisingOptOutNotice is 0 and TargetedAdvertisingOptOut is 2', () => {
|
|
63
|
+
const result = isConsentDenied(mkConsent({
|
|
64
|
+
TargetedAdvertisingOptOutNotice: 0
|
|
65
|
+
}));
|
|
66
|
+
expect(result).to.equal(true);
|
|
67
|
+
});
|
|
68
|
+
it('requires also SharingNotice to accept opt-in for Sharing', () => {
|
|
69
|
+
expect(isConsentDenied(mkConsent({
|
|
70
|
+
SharingNotice: 0
|
|
71
|
+
}))).to.be.true;
|
|
72
|
+
})
|
|
210
73
|
});
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
74
|
+
|
|
75
|
+
describe('isTransmitUfpdConsentDenied', () => {
|
|
76
|
+
it('should be false (consent given to add ufpd) with variety of notice and opt in', () => {
|
|
77
|
+
const result = isTransmitUfpdConsentDenied(mkConsent());
|
|
78
|
+
expect(result).to.equal(false);
|
|
79
|
+
});
|
|
80
|
+
Object.entries({
|
|
81
|
+
'health information': 2,
|
|
82
|
+
'biometric data': 6,
|
|
83
|
+
}).forEach(([t, flagNo]) => {
|
|
84
|
+
it(`'should be true (consent denied to add ufpd) if no consent to process ${t}'`, () => {
|
|
85
|
+
const consent = mkConsent();
|
|
86
|
+
consent.SensitiveDataProcessing[flagNo] = 1;
|
|
87
|
+
expect(isTransmitUfpdConsentDenied(consent)).to.be.true;
|
|
88
|
+
})
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
['SharingNotice', 'SensitiveDataLimitUseNotice'].forEach(flag => {
|
|
92
|
+
it(`should be true (consent denied to add ufpd) without ${flag}`, () => {
|
|
93
|
+
expect(isTransmitUfpdConsentDenied(mkConsent({
|
|
94
|
+
[flag]: 2
|
|
95
|
+
}))).to.be.true;
|
|
96
|
+
})
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
['SaleOptOut', 'TargetedAdvertisingOptOut'].forEach(flag => {
|
|
100
|
+
it(`should be true (consent denied to add ufpd) with ${flag}`, () => {
|
|
101
|
+
expect(isTransmitUfpdConsentDenied(mkConsent({
|
|
102
|
+
[flag]: 1
|
|
103
|
+
}))).to.be.true;
|
|
104
|
+
})
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('should be true (basic consent conditions do not pass) with sensitive opt in but no notice', () => {
|
|
108
|
+
const cd = mkConsent({
|
|
109
|
+
SensitiveDataLimitUseNotice: 0
|
|
110
|
+
});
|
|
111
|
+
cd.SensitiveDataProcessing[0] = 2;
|
|
112
|
+
expect(isTransmitUfpdConsentDenied(cd)).to.be.true;
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('should deny when sensitive notice is missing', () => {
|
|
116
|
+
const result = isTransmitUfpdConsentDenied(mkConsent({
|
|
117
|
+
SensitiveDataLimitUseNotice: 2
|
|
118
|
+
}));
|
|
119
|
+
expect(result).to.equal(true);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it('should not deny when biometric data opt-out is null', () => {
|
|
123
|
+
const cd = mkConsent();
|
|
124
|
+
cd.SensitiveDataProcessing[6] = null;
|
|
125
|
+
expect(isTransmitUfpdConsentDenied(cd)).to.be.false;
|
|
126
|
+
})
|
|
216
127
|
});
|
|
217
|
-
|
|
128
|
+
|
|
129
|
+
describe('isTransmitGeoConsentDenied', () => {
|
|
130
|
+
function geoConsent(geoOptOut, flags) {
|
|
131
|
+
const consent = mkConsent(flags);
|
|
132
|
+
consent.SensitiveDataProcessing[7] = geoOptOut;
|
|
133
|
+
return consent;
|
|
134
|
+
}
|
|
135
|
+
it('should be true (consent denied to add precise geo) -- sensitive flag denied', () => {
|
|
136
|
+
const result = isTransmitGeoConsentDenied(geoConsent(1));
|
|
137
|
+
expect(result).to.equal(true);
|
|
138
|
+
});
|
|
139
|
+
it('should be true (consent denied to add precise geo) -- sensitive data limit usage not given', () => {
|
|
140
|
+
const result = isTransmitGeoConsentDenied(geoConsent(1, {
|
|
141
|
+
SensitiveDataLimitUseNotice: 0
|
|
142
|
+
}));
|
|
143
|
+
expect(result).to.equal(true);
|
|
144
|
+
});
|
|
145
|
+
it('should be false (consent given to add precise geo) -- sensitive position 8 (index 7) is true', () => {
|
|
146
|
+
const result = isTransmitGeoConsentDenied(geoConsent(2));
|
|
147
|
+
expect(result).to.equal(false);
|
|
148
|
+
});
|
|
149
|
+
})
|
|
150
|
+
});
|
|
218
151
|
|
|
219
152
|
describe('mspaRule', () => {
|
|
220
153
|
it('does not apply if SID is not applicable', () => {
|