diff --git a/modules/mediakeysBidAdapter.js b/modules/mediakeysBidAdapter.js index 8c2b2c32e1c..60ced650329 100644 --- a/modules/mediakeysBidAdapter.js +++ b/modules/mediakeysBidAdapter.js @@ -572,7 +572,12 @@ function nativeBidResponseHandler(bid) { native.impressionTrackers.push(tracker.url); break; case 2: - native.javascriptTrackers = ``; + const script = ``; + if (!native.javascriptTrackers) { + native.javascriptTrackers = script; + } else { + native.javascriptTrackers += `\n${script}`; + } break; } }); diff --git a/modules/mediakeysBidAdapter.md b/modules/mediakeysBidAdapter.md index ec313c2fe3a..b0654771d19 100644 --- a/modules/mediakeysBidAdapter.md +++ b/modules/mediakeysBidAdapter.md @@ -14,9 +14,10 @@ Connects to Mediakeys demand source to fetch bids. ## Banner only Ad Unit -``` -var adUnits = [ -{ +The Mediakeys adapter accepts any valid OpenRTB Spec 2.5 property. + +```javascript +var adUnits = [{ code: 'test', mediaTypes: { banner: { @@ -27,20 +28,26 @@ var adUnits = [ bidder: 'mediakeys', params: {} // no params required. }] -}, +}] ``` ## Native only Ad Unit The Mediakeys adapter accepts two optional params for native requests. Please see the [OpenRTB Native Ads Specification](https://www.iab.com/wp-content/uploads/2018/03/OpenRTB-Native-Ads-Specification-Final-1.2.pdf) for valid values. -``` -var adUnits = [ -{ +```javascript +var adUnits = [{ code: 'test', mediaTypes: { native: { - type: 'image', + title: { + required: true, + len: 120 + }, + image: { + required: true, + sizes: [300, 250] + } } }, bids: [{ @@ -52,7 +59,7 @@ var adUnits = [ } } }] -}, +}] ``` ## Video only Ad Unit @@ -61,63 +68,65 @@ The Mediakeys adapter accepts any valid openRTB 2.5 video property. Properties c ### Outstream context -``` -var adUnits = [ -{ +```javascript +var adUnits = [{ code: 'test', mediaTypes: { video: { context: 'outstream', - playerSize: [300, 250], + playerSize: [1280, 720], // additional OpenRTB video params // placement: 2, // api: [1], // … + mimes: ['video/mp4'], + protocols: [2, 3], + skip: 0 } }, renderer: { url: 'https://acdn.adnxs.com/video/outstream/ANOutstreamVideo.js', + // the render method must fetch the vast xml document before displaying video render: function (bid) { - var bidReqConfig = pbjs.adUnits.find(bidReq => bidReq.bidId === bid.impid); - - if (bidReqConfig && bidReqConfig.mediaTypes && bidReqConfig.mediaTypes.video && bidReqConfig.mediaTypes.video.context === 'outstream') { - var adResponse = fetch(bid.vastUrl).then(resp => resp.text()).then(text => ({ - ad: { - video: { - content: text, - player_width: bid.width || bidReqConfig.mediaTypes.video.playerSize[0], - player_height: bid.height || bidReqConfig.mediaTypes.video.playerSize[1], - } + var adResponse = fetch(bid.vastUrl).then(resp => resp.text()).then(text => ({ + ad: { + video: { + content: text, + player_height: bid.playerHeight, + player_width: bid.playerWidth } - })) - - adResponse.then((ad) => { - bid.renderer.push(() => { - ANOutstreamVideo.renderAd({ - targetId: bid.adUnitCode, - adResponse: ad - }); + } + })) + + adResponse.then((content) => { + bid.renderer.push(() => { + ANOutstreamVideo.renderAd({ + targetId: bid.adUnitCode, + adResponse: content }); - }) - } + }); + }) } }, bids: [{ bidder: 'mediakeys', params: { video: { - // additional OpenRTB video params. Will be merged with params defined at mediaTypes level + // additional OpenRTB video params. + // will be merged with params defined at mediaTypes level + api: [1] } } }] -}, +}] ``` ### Instream context -``` -var adUnits = [ -{ +For Instream Video, you have to enable the Instream Tracking Module to have Prebid emit the onBidWon required event. + +```javascript +var adUnits = [{ code: 'test', mediaTypes: { video: { @@ -132,8 +141,9 @@ var adUnits = [ bids: [{ bidder: 'mediakeys', params: { - // additional OpenRTB video params. Will be merged with params defined at mediaTypes level + // additional OpenRTB video params. + // will be merged with params defined at mediaTypes level } }] -}, +}] ``` diff --git a/test/spec/modules/mediakeysBidAdapter_spec.js b/test/spec/modules/mediakeysBidAdapter_spec.js index 47ac54d49df..393b6ac6764 100644 --- a/test/spec/modules/mediakeysBidAdapter_spec.js +++ b/test/spec/modules/mediakeysBidAdapter_spec.js @@ -808,8 +808,8 @@ describe('mediakeysBidAdapter', function () { ] }, eventtrackers: [ - { event: 1, method: 1, url: 'https://click.me' }, - { event: 1, method: 2, url: 'https://click-script.me' } + { event: 1, method: 1, url: 'https://eventrack.me/impression' }, + { event: 1, method: 2, url: 'https://eventrack-js.me/impression-1' } ] }; @@ -845,9 +845,11 @@ describe('mediakeysBidAdapter', function () { expect(response[0].native.clickUrl).to.exist; expect(response[0].native.clickTrackers).to.exist; expect(response[0].native.clickTrackers.length).to.equal(1); - expect(response[0].native.javascriptTrackers).to.equal(''); expect(response[0].native.impressionTrackers).to.exist; expect(response[0].native.impressionTrackers.length).to.equal(1); + expect(response[0].native.impressionTrackers[0]).to.equal('https://eventrack.me/impression'); + expect(response[0].native.javascriptTrackers).to.exist; + expect(response[0].native.javascriptTrackers).to.equal(''); }); it('should ignore eventtrackers with a unsupported type', function() { @@ -859,6 +861,21 @@ describe('mediakeysBidAdapter', function () { expect(response[0].native.impressionTrackers).to.exist; expect(response[0].native.impressionTrackers.length).to.equal(0); }) + + it('Should handle multiple javascriptTrackers in one single string', () => { + const rawServerResponseNativeCopy = utils.deepClone(rawServerResponseNative); + const nativeObjectCopy = utils.deepClone(nativeObject); + nativeObjectCopy.eventtrackers.push( + { + event: 1, + method: 2, + url: 'https://eventrack-js.me/impression-2' + },) + rawServerResponseNativeCopy.body.seatbid[0].bid[0].adm = JSON.stringify(nativeObjectCopy); + const response = spec.interpretResponse(rawServerResponseNativeCopy, request); + const expected = '\n'; + expect(response[0].native.javascriptTrackers).to.equal(expected); + }); }); });