Skip to content

Commit

Permalink
Native multiple js trackers (prebid#9019)
Browse files Browse the repository at this point in the history
Co-authored-by: François Maturel <francoismaturel@dijit.fr>
  • Loading branch information
2 people authored and JacobKlein26 committed Feb 8, 2023
1 parent 4ec9a84 commit c3448ce
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 44 deletions.
7 changes: 6 additions & 1 deletion modules/mediakeysBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -572,7 +572,12 @@ function nativeBidResponseHandler(bid) {
native.impressionTrackers.push(tracker.url);
break;
case 2:
native.javascriptTrackers = `<script src=\"${tracker.url}\"></script>`;
const script = `<script async src=\"${tracker.url}\"></script>`;
if (!native.javascriptTrackers) {
native.javascriptTrackers = script;
} else {
native.javascriptTrackers += `\n${script}`;
}
break;
}
});
Expand Down
90 changes: 50 additions & 40 deletions modules/mediakeysBidAdapter.md
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand All @@ -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: [{
Expand All @@ -52,7 +59,7 @@ var adUnits = [
}
}
}]
},
}]
```

## Video only Ad Unit
Expand All @@ -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: {
Expand All @@ -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
}
}]
},
}]
```
23 changes: 20 additions & 3 deletions test/spec/modules/mediakeysBidAdapter_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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' }
]
};

Expand Down Expand Up @@ -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('<script src="https://click-script.me"></script>');
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('<script async src="https://eventrack-js.me/impression-1"></script>');
});

it('should ignore eventtrackers with a unsupported type', function() {
Expand All @@ -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 = '<script async src=\"https://eventrack-js.me/impression-1\"></script>\n<script async src=\"https://eventrack-js.me/impression-2\"></script>';
expect(response[0].native.javascriptTrackers).to.equal(expected);
});
});
});

Expand Down

0 comments on commit c3448ce

Please sign in to comment.