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.
- package/.eslintrc.js +31 -5
- package/.github/workflows/jscpd.yml +2 -2
- package/.github/workflows/linter.yml +107 -0
- package/creative/crossDomain.js +6 -3
- package/dist/33acrossAnalyticsAdapter.js +1 -1
- package/dist/33acrossBidAdapter.js +1 -1
- package/dist/33acrossIdSystem.js +1 -1
- package/dist/BTBidAdapter.js +1 -1
- package/dist/adagioAnalyticsAdapter.js +1 -1
- package/dist/adagioBidAdapter.js +1 -1
- package/dist/adagioRtdProvider.js +1 -1
- package/dist/adagioUtils.js +1 -1
- package/dist/addefendBidAdapter.js +1 -1
- package/dist/adgenerationBidAdapter.js +1 -1
- package/dist/adkernelAdnBidAdapter.js +1 -1
- package/dist/adkernelBidAdapter.js +1 -1
- package/dist/adkernelUtils.js +1 -0
- package/dist/adlooxRtdProvider.js +1 -1
- package/dist/admixerBidAdapter.js +1 -1
- package/dist/adqueryBidAdapter.js +1 -1
- package/dist/adrelevantisBidAdapter.js +1 -1
- package/dist/adstirBidAdapter.js +1 -1
- package/dist/adtrgtmeBidAdapter.js +1 -1
- package/dist/advRedAnalyticsAdapter.js +1 -0
- package/dist/adxcgAnalyticsAdapter.js +1 -1
- package/dist/adxcgBidAdapter.js +1 -1
- package/dist/adyoulikeBidAdapter.js +1 -1
- package/dist/agmaAnalyticsAdapter.js +1 -1
- package/dist/ajaBidAdapter.js +1 -1
- package/dist/akamaiDapRtdProvider.js +1 -1
- package/dist/amxBidAdapter.js +1 -1
- package/dist/amxIdSystem.js +1 -1
- package/dist/anonymisedRtdProvider.js +1 -1
- package/dist/apacdexBidAdapter.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/azerionedgeRtdProvider.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/carodaBidAdapter.js +1 -1
- package/dist/chtnwBidAdapter.js +1 -1
- package/dist/chunk-core.js +1 -1
- package/dist/concertBidAdapter.js +1 -1
- package/dist/connatixBidAdapter.js +1 -1
- package/dist/connectadBidAdapter.js +1 -1
- package/dist/consumableBidAdapter.js +1 -1
- package/dist/contxtfulRtdProvider.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/currencyUtils.js +1 -1
- package/dist/cwireBidAdapter.js +1 -1
- package/dist/dailymotionBidAdapter.js +1 -1
- package/dist/debugging-standalone.js +1 -1
- package/dist/dependencies.json +43 -7
- package/dist/dfpAdServerVideo.js +1 -1
- package/dist/dfpAdpod.js +1 -1
- package/dist/dfpUtils.js +1 -1
- package/dist/discoveryBidAdapter.js +1 -1
- package/dist/dspxBidAdapter.js +1 -1
- package/dist/dxkultureBidAdapter.js +1 -1
- package/dist/eightPodAnalyticsAdapter.js +1 -1
- package/dist/eightPodBidAdapter.js +1 -1
- package/dist/eplanningBidAdapter.js +1 -1
- package/dist/euidIdSystem.js +1 -1
- package/dist/exadsBidAdapter.js +1 -1
- package/dist/feedadBidAdapter.js +1 -1
- package/dist/finativeBidAdapter.js +1 -1
- package/dist/fintezaAnalyticsAdapter.js +1 -1
- package/dist/fpdUtils.js +1 -0
- package/dist/freewheel-sspBidAdapter.js +1 -1
- package/dist/gmosspBidAdapter.js +1 -1
- package/dist/goldbachBidAdapter.js +1 -1
- package/dist/gptPreAuction.js +1 -1
- package/dist/gptUtils.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/growthCodeRtdProvider.js +1 -1
- package/dist/gumgumBidAdapter.js +1 -1
- package/dist/h12mediaBidAdapter.js +1 -1
- package/dist/hypelabBidAdapter.js +1 -1
- package/dist/id5AnalyticsAdapter.js +1 -1
- package/dist/id5IdSystem.js +1 -1
- package/dist/imdsBidAdapter.js +1 -1
- package/dist/improvedigitalBidAdapter.js +1 -1
- package/dist/insticatorBidAdapter.js +1 -1
- package/dist/intentIqAnalyticsAdapter.js +1 -0
- package/dist/ixBidAdapter.js +1 -1
- package/dist/jixieBidAdapter.js +1 -1
- package/dist/justpremiumBidAdapter.js +1 -1
- package/dist/jwplayerBidAdapter.js +1 -1
- package/dist/jwplayerRtdProvider.js +1 -1
- package/dist/kargoBidAdapter.js +1 -1
- package/dist/kimberliteBidAdapter.js +1 -1
- package/dist/konduitAnalyticsAdapter.js +1 -1
- package/dist/kueezBidAdapter.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/luceadBidAdapter.js +1 -1
- package/dist/mabidderBidAdapter.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/mediagoBidAdapter.js +1 -1
- package/dist/medianetAnalyticsAdapter.js +1 -1
- package/dist/medianetBidAdapter.js +1 -1
- package/dist/mediasquareBidAdapter.js +1 -1
- package/dist/mgidBidAdapter.js +1 -1
- package/dist/minutemediaBidAdapter.js +1 -1
- package/dist/missenaBidAdapter.js +1 -1
- package/dist/mobianRtdProvider.js +1 -1
- package/dist/nextMillenniumBidAdapter.js +1 -1
- package/dist/nexx360BidAdapter.js +1 -1
- package/dist/nobidAnalyticsAdapter.js +1 -1
- package/dist/nobidBidAdapter.js +1 -1
- package/dist/not-for-prod/prebid.js +201 -193
- package/dist/oguryBidAdapter.js +1 -1
- package/dist/onetagBidAdapter.js +1 -1
- package/dist/ooloAnalyticsAdapter.js +1 -1
- package/dist/openwebBidAdapter.js +1 -1
- package/dist/openxBidAdapter.js +1 -1
- package/dist/optidigitalBidAdapter.js +1 -1
- package/dist/optoutBidAdapter.js +1 -1
- package/dist/orbidderBidAdapter.js +1 -1
- package/dist/outbrainBidAdapter.js +1 -1
- package/dist/paapi.js +1 -1
- package/dist/permutiveRtdProvider.js +1 -1
- package/dist/pixfutureBidAdapter.js +1 -1
- package/dist/playdigoBidAdapter.js +1 -1
- package/dist/prebidServerBidAdapter.js +1 -1
- package/dist/programmaticaBidAdapter.js +1 -1
- package/dist/publinkIdSystem.js +1 -1
- package/dist/publirBidAdapter.js +1 -1
- package/dist/pubmaticAnalyticsAdapter.js +1 -1
- package/dist/pubmaticBidAdapter.js +1 -1
- package/dist/pubwiseAnalyticsAdapter.js +1 -1
- package/dist/pubxaiAnalyticsAdapter.js +1 -1
- package/dist/pxyzBidAdapter.js +1 -1
- package/dist/quantcastBidAdapter.js +1 -1
- package/dist/readpeakBidAdapter.js +1 -1
- package/dist/relaidoBidAdapter.js +1 -1
- package/dist/relevatehealthBidAdapter.js +1 -1
- package/dist/retailspotBidAdapter.js +1 -1
- package/dist/rhythmoneBidAdapter.js +1 -1
- package/dist/ringieraxelspringerBidAdapter.js +1 -1
- package/dist/riseBidAdapter.js +1 -1
- package/dist/rubiconBidAdapter.js +1 -1
- package/dist/schainSerializer.js +1 -0
- package/dist/seedingAllianceBidAdapter.js +1 -1
- package/dist/seedtagBidAdapter.js +1 -1
- package/dist/sharethroughAnalyticsAdapter.js +1 -1
- package/dist/sharethroughBidAdapter.js +1 -1
- package/dist/shinezBidAdapter.js +1 -1
- package/dist/sizeMapping.js +1 -1
- package/dist/sizeUtils.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/snigelBidAdapter.js +1 -1
- package/dist/sonobiBidAdapter.js +1 -1
- package/dist/sovrnBidAdapter.js +1 -1
- package/dist/sspBCBidAdapter.js +1 -1
- package/dist/stnBidAdapter.js +1 -1
- package/dist/stvBidAdapter.js +1 -1
- package/dist/sublimeBidAdapter.js +1 -1
- package/dist/symitriDapRtdProvider.js +1 -0
- package/dist/taboolaBidAdapter.js +1 -1
- package/dist/tappxBidAdapter.js +1 -1
- package/dist/targetVideoBidAdapter.js +1 -1
- package/dist/targetVideoUtils.js +1 -0
- package/dist/teadsBidAdapter.js +1 -1
- package/dist/terceptAnalyticsAdapter.js +1 -1
- package/dist/themoneytizerBidAdapter.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/unrulyBidAdapter.js +1 -1
- package/dist/userAgentUtils.js +1 -0
- package/dist/utiqIdSystem.js +1 -1
- package/dist/vidazooUtils.js +1 -1
- package/dist/videobyteBidAdapter.js +1 -1
- package/dist/visxBidAdapter.js +1 -1
- package/dist/vuukleBidAdapter.js +1 -1
- package/dist/widespaceBidAdapter.js +1 -1
- package/dist/winrBidAdapter.js +1 -1
- package/dist/yahooAdsBidAdapter.js +1 -1
- package/dist/yandexIdSystem.js +1 -1
- package/dist/yieldmoBidAdapter.js +1 -1
- package/dist/yieldoneAnalyticsAdapter.js +1 -1
- package/integrationExamples/gpt/x-domain/creative.html +1 -1
- package/libraries/adkernelUtils/adkernelUtils.js +11 -0
- package/libraries/currencyUtils/floor.js +23 -0
- package/libraries/dfpUtils/dfpUtils.js +7 -0
- package/libraries/fpdUtils/deviceInfo.js +58 -0
- package/libraries/fpdUtils/pageInfo.js +73 -0
- package/libraries/gptUtils/gptUtils.js +23 -1
- package/libraries/schainSerializer/schainSerializer.js +24 -0
- package/libraries/sizeUtils/tranformSize.js +43 -0
- package/libraries/targetVideoUtils/bidderUtils.js +178 -0
- package/libraries/targetVideoUtils/constants.js +23 -0
- package/libraries/userAgentUtils/index.js +58 -0
- package/libraries/userAgentUtils/userAgentTypes.enums.js +22 -0
- package/modules/.submodules.json +1 -0
- package/modules/33acrossAnalyticsAdapter.js +2 -0
- package/modules/adagioBidAdapter.js +1 -1
- package/modules/adagioRtdProvider.js +18 -4
- package/modules/adkernelAdnBidAdapter.js +1 -12
- package/modules/adkernelBidAdapter.js +4 -13
- package/modules/adlooxAnalyticsAdapter.js +1 -0
- package/modules/admixerBidAdapter.js +10 -6
- package/modules/admixerBidAdapter.md +7 -10
- package/modules/adtrgtmeBidAdapter.js +1 -1
- package/modules/advRedAnalyticsAdapter.js +198 -0
- package/modules/advRedAnalyticsAdapter.md +30 -0
- package/modules/akamaiDapRtdProvider.js +19 -798
- package/modules/anonymisedRtdProvider.js +5 -1
- package/modules/anonymisedRtdProvider.md +1 -1
- package/modules/apacdexBidAdapter.js +1 -1
- package/modules/appnexusBidAdapter.js +56 -2
- package/modules/automatadAnalyticsAdapter.js +2 -0
- package/modules/azerionedgeRtdProvider.js +13 -3
- package/modules/azerionedgeRtdProvider.md +0 -17
- package/modules/bridBidAdapter.js +47 -47
- package/modules/cleanioRtdProvider.js +1 -0
- package/modules/concertBidAdapter.js +1 -1
- package/modules/connatixBidAdapter.js +36 -8
- package/modules/connectIdSystem.js +3 -1
- package/modules/contxtfulRtdProvider.js +20 -2
- package/modules/contxtfulRtdProvider.md +1 -0
- package/modules/craftBidAdapter.js +1 -1
- package/modules/criteoBidAdapter.js +1 -1
- package/modules/cwireBidAdapter.js +5 -1
- package/modules/dailymotionBidAdapter.js +85 -65
- package/modules/debugging/debugging.js +3 -0
- package/modules/dfpAdServerVideo.js +15 -33
- package/modules/dfpAdpod.js +2 -6
- package/modules/dgkeywordRtdProvider.js +2 -0
- package/modules/discoveryBidAdapter.js +26 -210
- package/modules/dspxBidAdapter.js +176 -54
- package/modules/eightPodAnalyticsAdapter.js +28 -34
- package/modules/eightPodBidAdapter.js +113 -57
- package/modules/fintezaAnalyticsAdapter.js +9 -4
- package/modules/goldbachBidAdapter.js +1 -1
- package/modules/gptPreAuction.js +63 -4
- package/modules/growthCodeAnalyticsAdapter.js +1 -1
- package/modules/growthCodeRtdProvider.js +1 -1
- package/modules/gumgumBidAdapter.js +14 -10
- package/modules/improvedigitalBidAdapter.js +1 -1
- package/modules/intentIqAnalyticsAdapter.js +234 -0
- package/modules/intentIqAnalyticsAdapter.md +27 -0
- package/modules/intentIqIdSystem.md +0 -0
- package/modules/jwplayerBidAdapter.js +1 -1
- package/modules/jwplayerRtdProvider.js +26 -6
- package/modules/jwplayerVideoProvider.js +6 -0
- package/modules/mediafuseBidAdapter.js +1 -1
- package/modules/mediagoBidAdapter.js +7 -176
- package/modules/medianetBidAdapter.js +101 -40
- package/modules/mgidBidAdapter.js +3 -1
- package/modules/mobianRtdProvider.js +16 -2
- package/modules/nextMillenniumBidAdapter.js +1 -27
- package/modules/nobidBidAdapter.js +1 -1
- package/modules/optoutBidAdapter.js +1 -1
- package/modules/paapi.js +48 -35
- package/modules/permutiveRtdProvider.js +72 -22
- package/modules/playdigoBidAdapter.js +4 -2
- package/modules/prebidServerBidAdapter/index.js +4 -2
- package/modules/prebidServerBidAdapter/ortbConverter.js +1 -0
- package/modules/programmaticaBidAdapter.js +1 -1
- package/modules/pubmaticBidAdapter.js +12 -0
- package/modules/pubxaiAnalyticsAdapter.js +306 -164
- package/modules/relevatehealthBidAdapter.js +2 -1
- package/modules/richaudienceBidAdapter.js +1 -1
- package/modules/rtdModule/index.js +5 -3
- package/modules/sirdataRtdProvider.js +2 -0
- package/modules/sizeMapping.js +2 -5
- package/modules/smaatoBidAdapter.js +18 -1
- package/modules/smilewantedBidAdapter.js +26 -22
- package/modules/snigelBidAdapter.js +1 -1
- package/modules/sonobiBidAdapter.js +5 -10
- package/modules/symitriDapRtdProvider.js +812 -0
- package/modules/symitriDapRtdProvider.md +49 -0
- package/modules/targetVideoBidAdapter.js +120 -152
- package/modules/targetVideoBidAdapter.md +20 -3
- package/modules/userId/eids.js +3 -0
- package/modules/utiqIdSystem.js +12 -10
- package/modules/validationFpdModule/index.js +22 -17
- package/modules/videojsVideoProvider.js +3 -0
- package/modules/visxBidAdapter.js +1 -1
- package/modules/winrBidAdapter.js +2 -27
- package/modules/yahooAdsBidAdapter.js +1 -1
- package/modules/yandexIdSystem.js +1 -1
- package/package.json +4 -4
- package/plugins/eslint/index.js +73 -45
- package/src/adRendering.js +7 -3
- package/src/adloader.js +1 -0
- package/src/ajax.js +15 -0
- package/src/config.js +0 -4
- package/src/debugging.js +1 -0
- package/src/secureCreatives.js +1 -1
- package/src/storageManager.js +62 -73
- package/src/targeting.js +26 -20
- package/src/utils.js +9 -0
- package/test/pages/banner_sync.html +97 -0
- package/test/pages/consent_mgt_gdpr.html +1 -1
- package/test/spec/ajax_spec.js +11 -0
- package/test/spec/creative/crossDomainCreative_spec.js +26 -9
- package/test/spec/e2e/banner/basic_banner_ad.spec.js +20 -14
- package/test/spec/fpd/gdpr_spec.js +1 -1
- package/test/spec/libraries/userAgentUtils_spec.js +109 -0
- package/test/spec/modules/adagioRtdProvider_spec.js +72 -0
- package/test/spec/modules/admixerBidAdapter_spec.js +21 -17
- package/test/spec/modules/advRedAnalyticsAdapter_spec.js +114 -0
- package/test/spec/modules/adxcgBidAdapter_spec.js +1 -1
- package/test/spec/modules/appnexusBidAdapter_spec.js +36 -0
- package/test/spec/modules/azerionedgeRtdProvider_spec.js +36 -21
- package/test/spec/modules/connatixBidAdapter_spec.js +55 -2
- package/test/spec/modules/consentManagement_spec.js +1 -1
- package/test/spec/modules/contxtfulRtdProvider_spec.js +6 -0
- package/test/spec/modules/dailymotionBidAdapter_spec.js +497 -4
- package/test/spec/modules/discoveryBidAdapter_spec.js +9 -6
- package/test/spec/modules/dspxBidAdapter_spec.js +188 -7
- package/test/spec/modules/eightPodAnalyticsAdapter_spec.js +22 -13
- package/test/spec/modules/gptPreAuction_spec.js +143 -1
- package/test/spec/modules/gumgumBidAdapter_spec.js +17 -0
- package/test/spec/modules/intentIqAnalyticsAdapter_spec.js +172 -0
- package/test/spec/modules/jwplayerRtdProvider_spec.js +61 -0
- package/test/spec/modules/mediagoBidAdapter_spec.js +34 -37
- package/test/spec/modules/medianetBidAdapter_spec.js +297 -16
- package/test/spec/modules/mgidBidAdapter_spec.js +15 -5
- package/test/spec/modules/mobianRtdProvider_spec.js +1 -3
- package/test/spec/modules/paapi_spec.js +177 -111
- package/test/spec/modules/permutiveRtdProvider_spec.js +42 -8
- package/test/spec/modules/prebidServerBidAdapter_spec.js +17 -3
- package/test/spec/modules/proxistoreBidAdapter_spec.js +1 -1
- package/test/spec/modules/pubmaticBidAdapter_spec.js +40 -0
- package/test/spec/modules/pubxaiAnalyticsAdapter_spec.js +970 -603
- package/test/spec/modules/pulsepointBidAdapter_spec.js +4 -4
- package/test/spec/modules/smaatoBidAdapter_spec.js +36 -1
- package/test/spec/modules/smilewantedBidAdapter_spec.js +57 -1
- package/test/spec/modules/symitriDapRtdProvider_spec.js +600 -0
- package/test/spec/modules/targetVideoBidAdapter_spec.js +112 -11
- package/test/spec/modules/yandexIdSystem_spec.js +6 -1
- package/test/spec/schainSerializer/schainSerializer_spec.js +138 -0
- package/test/spec/unit/core/storageManager_spec.js +68 -51
- package/test/spec/utils_spec.js +19 -0
- /package/src/utils/{gpdr.js → gdpr.js} +0 -0
|
@@ -7,7 +7,7 @@ import {hook} from '../../../src/hook.js';
|
|
|
7
7
|
import 'modules/appnexusBidAdapter.js';
|
|
8
8
|
import 'modules/rubiconBidAdapter.js';
|
|
9
9
|
import {
|
|
10
|
-
addPaapiConfigHook,
|
|
10
|
+
addPaapiConfigHook, addPaapiData,
|
|
11
11
|
buyersToAuctionConfigs,
|
|
12
12
|
getPAAPIConfig,
|
|
13
13
|
getPAAPISize,
|
|
@@ -652,110 +652,171 @@ describe('paapi module', () => {
|
|
|
652
652
|
config.resetConfig();
|
|
653
653
|
});
|
|
654
654
|
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
function expectFledgeFlags(...enableFlags) {
|
|
669
|
-
const bidRequests = mark();
|
|
670
|
-
expect(bidRequests.appnexus.paapi?.enabled).to.eql(enableFlags[0].enabled);
|
|
671
|
-
bidRequests.appnexus.bids.forEach(bid => expect(bid.ortb2Imp.ext.ae).to.eql(enableFlags[0].ae));
|
|
655
|
+
describe('makeBidRequests', () => {
|
|
656
|
+
function mark() {
|
|
657
|
+
return Object.fromEntries(
|
|
658
|
+
adapterManager.makeBidRequests(
|
|
659
|
+
adUnits,
|
|
660
|
+
Date.now(),
|
|
661
|
+
utils.getUniqueIdentifierStr(),
|
|
662
|
+
function callback() {
|
|
663
|
+
},
|
|
664
|
+
[]
|
|
665
|
+
).map(b => [b.bidderCode, b])
|
|
666
|
+
);
|
|
667
|
+
}
|
|
672
668
|
|
|
673
|
-
|
|
674
|
-
|
|
669
|
+
function expectFledgeFlags(...enableFlags) {
|
|
670
|
+
const bidRequests = mark();
|
|
671
|
+
expect(bidRequests.appnexus.paapi?.enabled).to.eql(enableFlags[0].enabled);
|
|
672
|
+
bidRequests.appnexus.bids.forEach(bid => expect(bid.ortb2Imp.ext.ae).to.eql(enableFlags[0].ae));
|
|
675
673
|
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
sinon.assert.match(bid.ortb2Imp.ext.igs, {
|
|
679
|
-
ae: bid.ortb2Imp.ext.ae,
|
|
680
|
-
biddable: 1
|
|
681
|
-
});
|
|
682
|
-
}
|
|
683
|
-
});
|
|
684
|
-
}
|
|
674
|
+
expect(bidRequests.rubicon.paapi?.enabled).to.eql(enableFlags[1].enabled);
|
|
675
|
+
bidRequests.rubicon.bids.forEach(bid => expect(bid.ortb2Imp?.ext?.ae).to.eql(enableFlags[1].ae));
|
|
685
676
|
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
bidders: ['appnexus'],
|
|
693
|
-
defaultForSlots: 1,
|
|
677
|
+
Object.values(bidRequests).flatMap(req => req.bids).forEach(bid => {
|
|
678
|
+
if (bid.ortb2Imp?.ext?.ae) {
|
|
679
|
+
sinon.assert.match(bid.ortb2Imp.ext.igs, {
|
|
680
|
+
ae: bid.ortb2Imp.ext.ae,
|
|
681
|
+
biddable: 1
|
|
682
|
+
});
|
|
694
683
|
}
|
|
695
684
|
});
|
|
696
|
-
|
|
697
|
-
});
|
|
685
|
+
}
|
|
698
686
|
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
687
|
+
describe('with setConfig()', () => {
|
|
688
|
+
it('should set paapi.enabled correctly per bidder', function () {
|
|
689
|
+
config.setConfig({
|
|
690
|
+
bidderSequence: 'fixed',
|
|
691
|
+
paapi: {
|
|
692
|
+
enabled: true,
|
|
693
|
+
bidders: ['appnexus'],
|
|
694
|
+
defaultForSlots: 1,
|
|
695
|
+
}
|
|
696
|
+
});
|
|
697
|
+
expectFledgeFlags({enabled: true, ae: 1}, {enabled: false, ae: 0});
|
|
706
698
|
});
|
|
707
|
-
expectFledgeFlags({enabled: true, ae: 1}, {enabled: true, ae: 1});
|
|
708
|
-
});
|
|
709
699
|
|
|
710
|
-
|
|
711
|
-
'not set': {
|
|
712
|
-
cfg: {},
|
|
713
|
-
componentSeller: false
|
|
714
|
-
},
|
|
715
|
-
'set': {
|
|
716
|
-
cfg: {
|
|
717
|
-
componentSeller: {
|
|
718
|
-
auctionConfig: {
|
|
719
|
-
decisionLogicURL: 'publisher.example'
|
|
720
|
-
}
|
|
721
|
-
}
|
|
722
|
-
},
|
|
723
|
-
componentSeller: true
|
|
724
|
-
}
|
|
725
|
-
}).forEach(([t, {cfg, componentSeller}]) => {
|
|
726
|
-
it(`should set request paapi.componentSeller = ${componentSeller} when config componentSeller is ${t}`, () => {
|
|
700
|
+
it('should set paapi.enabled correctly for all bidders', function () {
|
|
727
701
|
config.setConfig({
|
|
702
|
+
bidderSequence: 'fixed',
|
|
728
703
|
paapi: {
|
|
729
704
|
enabled: true,
|
|
730
705
|
defaultForSlots: 1,
|
|
731
|
-
...cfg
|
|
732
706
|
}
|
|
733
707
|
});
|
|
734
|
-
|
|
708
|
+
expectFledgeFlags({enabled: true, ae: 1}, {enabled: true, ae: 1});
|
|
709
|
+
});
|
|
710
|
+
|
|
711
|
+
Object.entries({
|
|
712
|
+
'not set': {
|
|
713
|
+
cfg: {},
|
|
714
|
+
componentSeller: false
|
|
715
|
+
},
|
|
716
|
+
'set': {
|
|
717
|
+
cfg: {
|
|
718
|
+
componentSeller: {
|
|
719
|
+
auctionConfig: {
|
|
720
|
+
decisionLogicURL: 'publisher.example'
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
},
|
|
724
|
+
componentSeller: true
|
|
725
|
+
}
|
|
726
|
+
}).forEach(([t, {cfg, componentSeller}]) => {
|
|
727
|
+
it(`should set request paapi.componentSeller = ${componentSeller} when config componentSeller is ${t}`, () => {
|
|
728
|
+
config.setConfig({
|
|
729
|
+
paapi: {
|
|
730
|
+
enabled: true,
|
|
731
|
+
defaultForSlots: 1,
|
|
732
|
+
...cfg
|
|
733
|
+
}
|
|
734
|
+
});
|
|
735
|
+
Object.values(mark()).forEach(br => expect(br.paapi?.componentSeller).to.eql(componentSeller));
|
|
736
|
+
});
|
|
735
737
|
});
|
|
736
738
|
});
|
|
739
|
+
});
|
|
740
|
+
describe('addPaapiData', () => {
|
|
741
|
+
function getEnrichedAdUnits() {
|
|
742
|
+
const next = sinon.stub();
|
|
743
|
+
addPaapiData(next, adUnits);
|
|
744
|
+
sinon.assert.calledWith(next, adUnits);
|
|
745
|
+
return adUnits;
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
function getImpExt() {
|
|
749
|
+
const next = sinon.stub();
|
|
750
|
+
addPaapiData(next, adUnits);
|
|
751
|
+
sinon.assert.calledWith(next, adUnits);
|
|
752
|
+
return {
|
|
753
|
+
global: adUnits[0].ortb2Imp?.ext,
|
|
754
|
+
...Object.fromEntries(adUnits[0].bids.map(bid => [bid.bidder, bid.ortb2Imp?.ext]))
|
|
755
|
+
}
|
|
756
|
+
}
|
|
737
757
|
|
|
738
758
|
it('should not override pub-defined ext.ae', () => {
|
|
739
759
|
config.setConfig({
|
|
740
|
-
bidderSequence: 'fixed',
|
|
741
760
|
paapi: {
|
|
742
761
|
enabled: true,
|
|
743
762
|
defaultForSlots: 1,
|
|
744
763
|
}
|
|
745
764
|
});
|
|
746
765
|
Object.assign(adUnits[0], {ortb2Imp: {ext: {ae: 0}}});
|
|
747
|
-
|
|
766
|
+
sinon.assert.match(getImpExt(), {
|
|
767
|
+
global: {
|
|
768
|
+
ae: 0,
|
|
769
|
+
},
|
|
770
|
+
rubicon: undefined,
|
|
771
|
+
appnexus: undefined
|
|
772
|
+
});
|
|
748
773
|
});
|
|
749
774
|
|
|
775
|
+
it('should override per-bidder when excluded via paapi.bidders', () => {
|
|
776
|
+
config.setConfig({
|
|
777
|
+
paapi: {
|
|
778
|
+
enabled: true,
|
|
779
|
+
defaultForSlots: 1,
|
|
780
|
+
bidders: ['rubicon']
|
|
781
|
+
}
|
|
782
|
+
})
|
|
783
|
+
sinon.assert.match(getImpExt(), {
|
|
784
|
+
global: {
|
|
785
|
+
ae: 1,
|
|
786
|
+
igs: {
|
|
787
|
+
ae: 1,
|
|
788
|
+
biddable: 1
|
|
789
|
+
}
|
|
790
|
+
},
|
|
791
|
+
rubicon: undefined,
|
|
792
|
+
appnexus: {
|
|
793
|
+
ae: 0,
|
|
794
|
+
igs: {
|
|
795
|
+
ae: 0,
|
|
796
|
+
biddable: 0
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
})
|
|
800
|
+
})
|
|
801
|
+
|
|
750
802
|
it('should populate ext.igs when request has ext.ae', () => {
|
|
751
803
|
config.setConfig({
|
|
752
|
-
bidderSequence: 'fixed',
|
|
753
804
|
paapi: {
|
|
754
805
|
enabled: true
|
|
755
806
|
}
|
|
756
807
|
});
|
|
757
808
|
Object.assign(adUnits[0], {ortb2Imp: {ext: {ae: 3}}});
|
|
758
|
-
|
|
809
|
+
sinon.assert.match(getImpExt(), {
|
|
810
|
+
global: {
|
|
811
|
+
ae: 3,
|
|
812
|
+
igs: {
|
|
813
|
+
ae: 3,
|
|
814
|
+
biddable: 1
|
|
815
|
+
}
|
|
816
|
+
},
|
|
817
|
+
rubicon: undefined,
|
|
818
|
+
appnexus: undefined,
|
|
819
|
+
});
|
|
759
820
|
});
|
|
760
821
|
|
|
761
822
|
it('should not override pub-defined ext.igs', () => {
|
|
@@ -765,16 +826,17 @@ describe('paapi module', () => {
|
|
|
765
826
|
}
|
|
766
827
|
});
|
|
767
828
|
Object.assign(adUnits[0], {ortb2Imp: {ext: {ae: 1, igs: {biddable: 0}}}});
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
sinon.assert.match(bid.ortb2Imp.ext, {
|
|
829
|
+
sinon.assert.match(getImpExt(), {
|
|
830
|
+
global: {
|
|
771
831
|
ae: 1,
|
|
772
832
|
igs: {
|
|
773
833
|
ae: 1,
|
|
774
834
|
biddable: 0
|
|
775
835
|
}
|
|
776
|
-
}
|
|
777
|
-
|
|
836
|
+
},
|
|
837
|
+
rubicon: undefined,
|
|
838
|
+
appnexus: undefined
|
|
839
|
+
})
|
|
778
840
|
});
|
|
779
841
|
|
|
780
842
|
it('should fill ext.ae from ext.igs, if defined', () => {
|
|
@@ -784,60 +846,64 @@ describe('paapi module', () => {
|
|
|
784
846
|
}
|
|
785
847
|
});
|
|
786
848
|
Object.assign(adUnits[0], {ortb2Imp: {ext: {igs: {}}}});
|
|
787
|
-
|
|
849
|
+
sinon.assert.match(getImpExt(), {
|
|
850
|
+
global: {
|
|
851
|
+
ae: 1,
|
|
852
|
+
igs: {
|
|
853
|
+
ae: 1,
|
|
854
|
+
biddable: 1
|
|
855
|
+
}
|
|
856
|
+
},
|
|
857
|
+
appnexus: undefined,
|
|
858
|
+
rubicon: undefined
|
|
859
|
+
})
|
|
788
860
|
});
|
|
789
|
-
});
|
|
790
861
|
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
862
|
+
describe('ortb2Imp.ext.paapi.requestedSize', () => {
|
|
863
|
+
beforeEach(() => {
|
|
864
|
+
config.setConfig({
|
|
865
|
+
paapi: {
|
|
866
|
+
enabled: true,
|
|
867
|
+
defaultForSlots: 1,
|
|
868
|
+
}
|
|
869
|
+
});
|
|
798
870
|
});
|
|
799
|
-
});
|
|
800
871
|
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
sinon.assert.match(bidRequest.ortb2Imp.ext.paapi, {
|
|
872
|
+
it('should default to value returned by getPAAPISize', () => {
|
|
873
|
+
getPAAPISizeStub.returns([123, 321]);
|
|
874
|
+
expect(getImpExt().global.paapi).to.eql({
|
|
805
875
|
requestedSize: {
|
|
806
876
|
width: 123,
|
|
807
877
|
height: 321
|
|
808
878
|
}
|
|
809
879
|
});
|
|
810
880
|
});
|
|
811
|
-
});
|
|
812
881
|
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
882
|
+
it('should not be overridden, if provided by the pub', () => {
|
|
883
|
+
adUnits[0].ortb2Imp = {
|
|
884
|
+
ext: {
|
|
885
|
+
paapi: {
|
|
886
|
+
requestedSize: {
|
|
887
|
+
width: '123px',
|
|
888
|
+
height: '321px'
|
|
889
|
+
}
|
|
820
890
|
}
|
|
821
891
|
}
|
|
822
|
-
}
|
|
823
|
-
|
|
824
|
-
Object.values(mark()).flatMap(b => b.bids).forEach(bidRequest => {
|
|
825
|
-
sinon.assert.match(bidRequest.ortb2Imp.ext.paapi, {
|
|
892
|
+
};
|
|
893
|
+
expect(getImpExt().global.paapi).to.eql({
|
|
826
894
|
requestedSize: {
|
|
827
895
|
width: '123px',
|
|
828
896
|
height: '321px'
|
|
829
897
|
}
|
|
830
|
-
})
|
|
898
|
+
})
|
|
899
|
+
sinon.assert.notCalled(getPAAPISizeStub);
|
|
831
900
|
});
|
|
832
|
-
sinon.assert.notCalled(getPAAPISizeStub);
|
|
833
|
-
});
|
|
834
901
|
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
expect(bidRequest.ortb2Imp?.ext?.paapi?.requestedSize).to.not.exist;
|
|
902
|
+
it('should not be set if adUnit has no banner sizes', () => {
|
|
903
|
+
adUnits[0].mediaTypes = {
|
|
904
|
+
video: {}
|
|
905
|
+
};
|
|
906
|
+
expect(getImpExt().global?.paapi?.requestedSize).to.not.exist;
|
|
841
907
|
});
|
|
842
908
|
});
|
|
843
909
|
});
|
|
@@ -484,7 +484,9 @@ describe('permutiveRtdProvider', function () {
|
|
|
484
484
|
_psegs: [],
|
|
485
485
|
_ppam: [],
|
|
486
486
|
_pcrprs: [],
|
|
487
|
-
|
|
487
|
+
_pindexs: [],
|
|
488
|
+
_pssps: { ssps: [], cohorts: [] },
|
|
489
|
+
_ppsts: {},
|
|
488
490
|
})
|
|
489
491
|
|
|
490
492
|
setBidderRtb(bidderConfig, moduleConfig, segmentsData)
|
|
@@ -568,6 +570,7 @@ describe('permutiveRtdProvider', function () {
|
|
|
568
570
|
const data = transformedTargeting()
|
|
569
571
|
expect(getSegments(250)).to.deep.equal(data)
|
|
570
572
|
})
|
|
573
|
+
|
|
571
574
|
it('should enforce max segments', function () {
|
|
572
575
|
const max = 1
|
|
573
576
|
const segments = getSegments(max)
|
|
@@ -584,6 +587,26 @@ describe('permutiveRtdProvider', function () {
|
|
|
584
587
|
}
|
|
585
588
|
}
|
|
586
589
|
})
|
|
590
|
+
|
|
591
|
+
it('should coerce numbers to strings', function () {
|
|
592
|
+
setLocalStorage({ _prubicons: [1, 2, 3], _pssps: { ssps: ['foo', 'bar'], cohorts: [4, 5, 6] } })
|
|
593
|
+
|
|
594
|
+
const segments = getSegments(200)
|
|
595
|
+
|
|
596
|
+
expect(segments.rubicon).to.deep.equal(['1', '2', '3'])
|
|
597
|
+
expect(segments.ssp.ssps).to.deep.equal(['foo', 'bar'])
|
|
598
|
+
expect(segments.ssp.cohorts).to.deep.equal(['4', '5', '6'])
|
|
599
|
+
})
|
|
600
|
+
|
|
601
|
+
it('should return empty values on unexpected format', function () {
|
|
602
|
+
setLocalStorage({ _prubicons: 'a string instead?', _pssps: 123 })
|
|
603
|
+
|
|
604
|
+
const segments = getSegments(200)
|
|
605
|
+
|
|
606
|
+
expect(segments.rubicon).to.deep.equal([])
|
|
607
|
+
expect(segments.ssp.ssps).to.deep.equal([])
|
|
608
|
+
expect(segments.ssp.cohorts).to.deep.equal([])
|
|
609
|
+
})
|
|
587
610
|
})
|
|
588
611
|
|
|
589
612
|
describe('Existing key-value targeting', function () {
|
|
@@ -703,14 +726,25 @@ function getConfig () {
|
|
|
703
726
|
}
|
|
704
727
|
|
|
705
728
|
function transformedTargeting (data = getTargetingData()) {
|
|
729
|
+
const topics = (() => {
|
|
730
|
+
const topics = {}
|
|
731
|
+
for (const topic in data._ppsts) {
|
|
732
|
+
topics[topic] = data._ppsts[topic].map(String)
|
|
733
|
+
}
|
|
734
|
+
return topics
|
|
735
|
+
})()
|
|
736
|
+
|
|
706
737
|
return {
|
|
707
|
-
ac: [...data._pcrprs, ...data._ppam, ...data._psegs.filter(seg => seg >= 1000000)],
|
|
708
|
-
appnexus: data._papns,
|
|
709
|
-
ix: data._pindexs,
|
|
710
|
-
rubicon: data._prubicons,
|
|
711
|
-
gam: data._pdfps,
|
|
712
|
-
ssp:
|
|
713
|
-
|
|
738
|
+
ac: [...data._pcrprs, ...data._ppam, ...data._psegs.filter(seg => seg >= 1000000)].map(String),
|
|
739
|
+
appnexus: data._papns.map(String),
|
|
740
|
+
ix: data._pindexs.map(String),
|
|
741
|
+
rubicon: data._prubicons.map(String),
|
|
742
|
+
gam: data._pdfps.map(String),
|
|
743
|
+
ssp: {
|
|
744
|
+
ssps: data._pssps.ssps.map(String),
|
|
745
|
+
cohorts: data._pssps.cohorts.map(String)
|
|
746
|
+
},
|
|
747
|
+
topics,
|
|
714
748
|
}
|
|
715
749
|
}
|
|
716
750
|
|
|
@@ -825,7 +825,7 @@ describe('S2S Adapter', function () {
|
|
|
825
825
|
})
|
|
826
826
|
})
|
|
827
827
|
})
|
|
828
|
-
|
|
828
|
+
|
|
829
829
|
it('should set customHeaders correctly when publisher has provided it', () => {
|
|
830
830
|
let configWithCustomHeaders = utils.deepClone(CONFIG);
|
|
831
831
|
configWithCustomHeaders.customHeaders = { customHeader1: 'customHeader1Value' };
|
|
@@ -3578,18 +3578,32 @@ describe('S2S Adapter', function () {
|
|
|
3578
3578
|
sinon.assert.calledWith(fledgeStub, sinon.match({auctionId, adUnitCode: AU, ortb2: undefined, ortb2Imp: undefined}), sinon.match({config: {id: 2}}))
|
|
3579
3579
|
}
|
|
3580
3580
|
|
|
3581
|
-
it('calls
|
|
3581
|
+
it('calls addPaapiConfig alongside addBidResponse', function () {
|
|
3582
3582
|
adapter.callBids(request, bidderRequests, addBidResponse, done, ajax);
|
|
3583
3583
|
server.requests[0].respond(200, {}, JSON.stringify(mergeDeep({}, RESPONSE_OPENRTB, FLEDGE_RESP)));
|
|
3584
3584
|
expect(addBidResponse.called).to.be.true;
|
|
3585
3585
|
expectFledgeCalls();
|
|
3586
3586
|
});
|
|
3587
3587
|
|
|
3588
|
-
it('calls
|
|
3588
|
+
it('calls addPaapiConfig when there is no bid in the response', () => {
|
|
3589
3589
|
adapter.callBids(request, bidderRequests, addBidResponse, done, ajax);
|
|
3590
3590
|
server.requests[0].respond(200, {}, JSON.stringify(FLEDGE_RESP));
|
|
3591
3591
|
expect(addBidResponse.called).to.be.false;
|
|
3592
3592
|
expectFledgeCalls();
|
|
3593
|
+
});
|
|
3594
|
+
|
|
3595
|
+
it('wraps call in runWithBidder', () => {
|
|
3596
|
+
let fail = false;
|
|
3597
|
+
fledgeStub.callsFake(({bidder}) => {
|
|
3598
|
+
try {
|
|
3599
|
+
expect(bidder).to.exist.and.to.eql(config.getCurrentBidder());
|
|
3600
|
+
} catch (e) {
|
|
3601
|
+
fail = true;
|
|
3602
|
+
}
|
|
3603
|
+
});
|
|
3604
|
+
adapter.callBids(request, bidderRequests, addBidResponse, done, ajax);
|
|
3605
|
+
server.requests[0].respond(200, {}, JSON.stringify(FLEDGE_RESP));
|
|
3606
|
+
expect(fail).to.be.false;
|
|
3593
3607
|
})
|
|
3594
3608
|
});
|
|
3595
3609
|
});
|
|
@@ -81,7 +81,7 @@ describe('ProxistoreBidAdapter', function () {
|
|
|
81
81
|
it('should contain a valid url', function () {
|
|
82
82
|
// has gdpr consent
|
|
83
83
|
expect(request.url).equal(url.cookieBase);
|
|
84
|
-
// doens't have
|
|
84
|
+
// doens't have gdpr consent
|
|
85
85
|
bidderRequest.gdprConsent.vendorData = null;
|
|
86
86
|
|
|
87
87
|
request = spec.buildRequests([bid], bidderRequest);
|
|
@@ -4084,6 +4084,46 @@ describe('PubMatic adapter', function () {
|
|
|
4084
4084
|
})
|
|
4085
4085
|
});
|
|
4086
4086
|
}
|
|
4087
|
+
|
|
4088
|
+
describe('Banner Request param battr checking', function() {
|
|
4089
|
+
it('should add battr params to bannerObj if present in ortb2Imp.banner', function() {
|
|
4090
|
+
let originalBidRequests = utils.deepClone(bidRequests);
|
|
4091
|
+
let bannerObj = utils.deepClone(originalBidRequests[0].ortb2Imp.banner);
|
|
4092
|
+
originalBidRequests[0].ortb2Imp.banner = Object.assign(bannerObj, {
|
|
4093
|
+
battr: [1, 2]
|
|
4094
|
+
});
|
|
4095
|
+
|
|
4096
|
+
const req = spec.buildRequests(originalBidRequests, {
|
|
4097
|
+
auctionId: 'new-auction-id'
|
|
4098
|
+
});
|
|
4099
|
+
let data = JSON.parse(req.data);
|
|
4100
|
+
expect(data.imp[0]['banner']['battr']).to.exist.and.to.be.an('array');
|
|
4101
|
+
expect(data.imp[0]['banner']['battr'][0]).to.equal(originalBidRequests[0].ortb2Imp.banner['battr'][0]);
|
|
4102
|
+
expect(data.imp[0]['banner']['battr'][1]).to.equal(originalBidRequests[0].ortb2Imp.banner['battr'][1]);
|
|
4103
|
+
});
|
|
4104
|
+
|
|
4105
|
+
it('should not add battr params to bannerObj if not present in ortb2Imp.banner', function() {
|
|
4106
|
+
const req = spec.buildRequests(bidRequests, {
|
|
4107
|
+
auctionId: 'new-auction-id'
|
|
4108
|
+
});
|
|
4109
|
+
let data = JSON.parse(req.data);
|
|
4110
|
+
expect(data.imp[0]['banner']['battr']).to.equal(undefined);
|
|
4111
|
+
});
|
|
4112
|
+
|
|
4113
|
+
it('should not add battr params if _checkParamDataType returns undefined (Mismatch data type)', function() {
|
|
4114
|
+
let originalBidRequests = utils.deepClone(bidRequests);
|
|
4115
|
+
let bannerObj = utils.deepClone(originalBidRequests[0].ortb2Imp.banner);
|
|
4116
|
+
originalBidRequests[0].ortb2Imp.banner = Object.assign(bannerObj, {
|
|
4117
|
+
battr: 1
|
|
4118
|
+
});
|
|
4119
|
+
|
|
4120
|
+
const req = spec.buildRequests(originalBidRequests, {
|
|
4121
|
+
auctionId: 'new-auction-id'
|
|
4122
|
+
});
|
|
4123
|
+
let data = JSON.parse(req.data);
|
|
4124
|
+
expect(data.imp[0]['banner']['battr']).to.equal(undefined);
|
|
4125
|
+
});
|
|
4126
|
+
});
|
|
4087
4127
|
});
|
|
4088
4128
|
|
|
4089
4129
|
if (FEATURES.VIDEO) {
|