-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'prebid:master' into master
- Loading branch information
Showing
152 changed files
with
2,512 additions
and
938 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,173 @@ | ||
<html> | ||
|
||
<head> | ||
<script type="text/javascript" src="../../build/dev/prebid.js" async></script> | ||
|
||
<script> | ||
var pbjs = pbjs || {}; | ||
pbjs.que = pbjs.que || []; | ||
|
||
pbjs.que.push(function () { | ||
const adUnits = [{ | ||
code: 'native-div', | ||
mediaTypes: { | ||
native: { | ||
adTemplate: document.getElementById('native-template').innerHTML, | ||
title: { | ||
required: true, | ||
len: 800 | ||
}, | ||
image: { | ||
required: true, | ||
sizes: [989, 742], | ||
}, | ||
sponsoredBy: { | ||
required: true | ||
} | ||
} | ||
}, | ||
bids: [{ | ||
bidder: 'appnexus', | ||
params: { | ||
placementId: 13232354, | ||
allowSmallerSizes: true | ||
} | ||
|
||
}] | ||
}]; | ||
|
||
pbjs.setConfig({ | ||
debug: true, | ||
s2sConfig: { | ||
accountId: '1', | ||
enabled: true, | ||
bidders: ['appnexuspsp'], | ||
timeout: 1000, | ||
adapter: 'prebidServer', | ||
endpoint: 'https://ib.adnxs.com/openrtb2/prebid', | ||
} | ||
}); | ||
|
||
pbjs.requestBids({ | ||
adUnits, | ||
bidsBackHandler: function (bidResponses) { | ||
Object.entries(bidResponses).forEach(([slot, {bids}]) => { | ||
bids?.length && renderNative(slot, bids[0]); | ||
}); | ||
} | ||
}); | ||
|
||
function renderNative(divId, bid) { | ||
const slot = document.getElementById(divId); | ||
const content = ` | ||
<!DOCTYPE html> | ||
<html> | ||
<body> | ||
<script src="https://cdn.jsdelivr.net/npm/prebid-universal-creative@latest/dist/native-render.js"> <\/script> | ||
<script> | ||
window.pbNativeData = { | ||
pubUrl: '${encodeURI(document.location)}', | ||
adId: '${bid.adId}', | ||
requestAllAssets: true | ||
}; | ||
pbNativeTag.renderNativeAd(pbNativeData); | ||
<\/script> | ||
</body> | ||
</html> | ||
`; | ||
|
||
const iframe = document.createElement('iframe'); | ||
slot.appendChild(iframe); | ||
Object.entries({ | ||
frameBorder: 0, | ||
marginWidth: 0, | ||
marginHeight: 0, | ||
srcdoc: content | ||
}).forEach(([prop, val]) => iframe.setAttribute(prop, val)); | ||
} | ||
}); | ||
|
||
</script> | ||
|
||
</head> | ||
|
||
<body> | ||
|
||
<template id="native-template"> | ||
<style> | ||
body { | ||
display: inline-block; | ||
} | ||
|
||
.container { | ||
display: inline-block; | ||
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; | ||
font-size: 14px; | ||
line-height: 1.42857143; | ||
color: #333; | ||
background: #fff url(##hb_native_image##) no-repeat center; | ||
background-size: cover; | ||
} | ||
|
||
|
||
.card { | ||
border: 4px solid #ffd724; | ||
display: inline-block; | ||
padding: 20px; | ||
height: 300px; | ||
width: 320px; | ||
} | ||
|
||
|
||
h1 a:link, a:active, a:visited, a:hover, a:focus { | ||
text-decoration: none; | ||
color: #fff; | ||
} | ||
|
||
h1 { | ||
line-height: 1.3; | ||
color: #fff; | ||
font-size: 26px; | ||
background-color: rgba(0, 0, 0, 0.7); | ||
display: inline; | ||
font-family: Roboto, serif; | ||
font-weight: 100; | ||
} | ||
|
||
.attribution { | ||
color: #fff; | ||
display: inline-block; | ||
letter-spacing: 2px; | ||
background-color: #ffd724; | ||
font-size: 12px; | ||
line-height: 1; | ||
padding: 6px 6px 0 6px; | ||
height: 24px; | ||
margin: 5px 0 10px 0; | ||
border-radius: 4px; | ||
} | ||
</style> | ||
<div class="container"> | ||
<div class="card"> | ||
<div class="title"> | ||
<h1> | ||
<a href="##hb_native_linkurl##">##hb_native_title##</a> | ||
</h1> | ||
</div> | ||
<div class="attribution"> | ||
##hb_native_brand## | ||
</div> | ||
</div> | ||
</div> | ||
</template> | ||
|
||
<h2>Prebid Native</h2> | ||
<div id='native-div'> | ||
</div> | ||
|
||
<br> | ||
<br> | ||
|
||
</body> | ||
|
||
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
/** | ||
* Converts a string value in camel-case to underscore eg 'placementId' becomes 'placement_id' | ||
* @param {string} value string value to convert | ||
*/ | ||
import {deepClone, isPlainObject} from '../../src/utils.js'; | ||
|
||
export function convertCamelToUnderscore(value) { | ||
return value.replace(/(?:^|\.?)([A-Z])/g, function (x, y) { | ||
return '_' + y.toLowerCase(); | ||
}).replace(/^_/, ''); | ||
} | ||
|
||
/** | ||
* Creates an array of n length and fills each item with the given value | ||
*/ | ||
export function fill(value, length) { | ||
let newArray = []; | ||
|
||
for (let i = 0; i < length; i++) { | ||
let valueToPush = isPlainObject(value) ? deepClone(value) : value; | ||
newArray.push(valueToPush); | ||
} | ||
|
||
return newArray; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
/** | ||
* http://npm.im/chunk | ||
* Returns an array with *size* chunks from given array | ||
* | ||
* Example: | ||
* ['a', 'b', 'c', 'd', 'e'] chunked by 2 => | ||
* [['a', 'b'], ['c', 'd'], ['e']] | ||
*/ | ||
export function chunk(array, size) { | ||
let newArray = []; | ||
|
||
for (let i = 0; i < Math.ceil(array.length / size); i++) { | ||
let start = i * size; | ||
let end = start + size; | ||
newArray.push(array.slice(start, end)); | ||
} | ||
|
||
return newArray; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
import {find} from '../../src/polyfill.js'; | ||
import {compareCodeAndSlot, isGptPubadsDefined} from '../../src/utils.js'; | ||
|
||
/** | ||
* Returns filter function to match adUnitCode in slot | ||
* @param {string} adUnitCode AdUnit code | ||
* @return {function} filter function | ||
*/ | ||
export function isSlotMatchingAdUnitCode(adUnitCode) { | ||
return (slot) => compareCodeAndSlot(slot, adUnitCode); | ||
} | ||
|
||
/** | ||
* @summary Uses the adUnit's code in order to find a matching gpt slot object on the page | ||
*/ | ||
export function getGptSlotForAdUnitCode(adUnitCode) { | ||
let matchingSlot; | ||
if (isGptPubadsDefined()) { | ||
// find the first matching gpt slot on the page | ||
matchingSlot = find(window.googletag.pubads().getSlots(), isSlotMatchingAdUnitCode(adUnitCode)); | ||
} | ||
return matchingSlot; | ||
} | ||
|
||
/** | ||
* @summary Uses the adUnit's code in order to find a matching gptSlot on the page | ||
*/ | ||
export function getGptSlotInfoForAdUnitCode(adUnitCode) { | ||
const matchingSlot = getGptSlotForAdUnitCode(adUnitCode); | ||
if (matchingSlot) { | ||
return { | ||
gptSlot: matchingSlot.getAdUnitPath(), | ||
divId: matchingSlot.getSlotElementId() | ||
}; | ||
} | ||
return {}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
/** | ||
* Encode a string for inclusion in HTML. | ||
* See https://pragmaticwebsecurity.com/articles/spasecurity/json-stringify-xss.html and | ||
* https://codeql.github.com/codeql-query-help/javascript/js-bad-code-sanitization/ | ||
* @return {string} | ||
*/ | ||
export const escapeUnsafeChars = (() => { | ||
const escapes = { | ||
'<': '\\u003C', | ||
'>': '\\u003E', | ||
'/': '\\u002F', | ||
'\\': '\\\\', | ||
'\b': '\\b', | ||
'\f': '\\f', | ||
'\n': '\\n', | ||
'\r': '\\r', | ||
'\t': '\\t', | ||
'\0': '\\0', | ||
'\u2028': '\\u2028', | ||
'\u2029': '\\u2029' | ||
}; | ||
|
||
return function (str) { | ||
return str.replace(/[<>\b\f\n\r\t\0\u2028\u2029\\]/g, x => escapes[x]); | ||
}; | ||
})(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
/** | ||
* Read an adUnit object and return the sizes used in an [[728, 90]] format (even if they had [728, 90] defined) | ||
* Preference is given to the `adUnit.mediaTypes.banner.sizes` object over the `adUnit.sizes` | ||
* @param {object} adUnit one adUnit object from the normal list of adUnits | ||
* @returns {Array.<number[]>} array of arrays containing numeric sizes | ||
*/ | ||
export function getAdUnitSizes(adUnit) { | ||
if (!adUnit) { | ||
return; | ||
} | ||
|
||
let sizes = []; | ||
if (adUnit.mediaTypes && adUnit.mediaTypes.banner && Array.isArray(adUnit.mediaTypes.banner.sizes)) { | ||
let bannerSizes = adUnit.mediaTypes.banner.sizes; | ||
if (Array.isArray(bannerSizes[0])) { | ||
sizes = bannerSizes; | ||
} else { | ||
sizes.push(bannerSizes); | ||
} | ||
// TODO - remove this else block when we're ready to deprecate adUnit.sizes for bidders | ||
} else if (Array.isArray(adUnit.sizes)) { | ||
if (Array.isArray(adUnit.sizes[0])) { | ||
sizes = adUnit.sizes; | ||
} else { | ||
sizes.push(adUnit.sizes); | ||
} | ||
} | ||
return sizes; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
import {isFn} from '../../src/utils.js'; | ||
|
||
/** | ||
* Try to convert a value to a type. | ||
* If it can't be done, the value will be returned. | ||
* | ||
* @param {string} typeToConvert The target type. e.g. "string", "number", etc. | ||
* @param {*} value The value to be converted into typeToConvert. | ||
*/ | ||
function tryConvertType(typeToConvert, value) { | ||
if (typeToConvert === 'string') { | ||
return value && value.toString(); | ||
} else if (typeToConvert === 'number') { | ||
return Number(value); | ||
} else { | ||
return value; | ||
} | ||
} | ||
|
||
export function convertTypes(types, params) { | ||
Object.keys(types).forEach(key => { | ||
if (params[key]) { | ||
if (isFn(types[key])) { | ||
params[key] = types[key](params[key]); | ||
} else { | ||
params[key] = tryConvertType(types[key], params[key]); | ||
} | ||
|
||
// don't send invalid values | ||
if (isNaN(params[key])) { | ||
delete params.key; | ||
} | ||
} | ||
}); | ||
return params; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
export function tryAppendQueryString(existingUrl, key, value) { | ||
if (value) { | ||
return existingUrl + key + '=' + encodeURIComponent(value) + '&'; | ||
} | ||
|
||
return existingUrl; | ||
} |
Oops, something went wrong.