prebid-universal-creative 1.14.2 → 1.16.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/.babelrc +1 -2
- package/.github/workflows/issue_tracker.yml +31 -16
- package/README.md +21 -3
- package/dist/amp.js +3 -0
- package/dist/banner.js +3 -0
- package/dist/creative.js +4 -3
- package/dist/creative.max.js +546 -593
- package/dist/load-cookie-with-consent.html +1 -1
- package/dist/load-cookie.html +1 -1
- package/dist/mobile.js +3 -0
- package/dist/native-render.js +3 -3
- package/dist/native-trk.js +3 -3
- package/dist/native.js +3 -0
- package/dist/uid.js +3 -3
- package/dist/video.js +3 -0
- package/gulpfile.js +84 -45
- package/karma.conf.maker.js +4 -6
- package/package.json +80 -82
- package/src/ampOrMobile.js +14 -0
- package/src/creative.js +2 -9
- package/src/environment.js +62 -75
- package/src/legacy.js +29 -0
- package/src/legacyNativeRender.js +6 -0
- package/src/mobileAndAmpRender.js +239 -0
- package/src/nativeAssetManager.js +91 -57
- package/src/nativeORTBTrackerManager.js +2 -2
- package/src/nativeRender.js +2 -2
- package/src/nativeRenderManager.js +46 -69
- package/src/postscribeRender.js +10 -0
- package/src/renderingManager.js +106 -358
- package/src/utils.js +1 -11
- package/template/amp/dfp-creative.html +1 -1
- package/test/spec/environment_spec.js +4 -11
- package/test/spec/legacyNativeRender_spec.js +25 -0
- package/test/spec/mobileAndAmpRender_spec.js +316 -0
- package/test/spec/nativeAssetManager_spec.js +227 -79
- package/test/spec/nativeORTBTrackerManager_spec.js +3 -19
- package/test/spec/nativeRenderManager_spec.js +77 -55
- package/test/spec/nativeRender_spec.js +23 -0
- package/test/spec/renderingManager_spec.js +16 -265
- package/webpack.conf.js +3 -1
package/dist/creative.max.js
CHANGED
@@ -60,44 +60,32 @@
|
|
60
60
|
/******/ __webpack_require__.p = "";
|
61
61
|
/******/
|
62
62
|
/******/ // Load entry module and return exports
|
63
|
-
/******/ return __webpack_require__(__webpack_require__.s =
|
63
|
+
/******/ return __webpack_require__(__webpack_require__.s = 3);
|
64
64
|
/******/ })
|
65
65
|
/************************************************************************/
|
66
66
|
/******/ ([
|
67
67
|
/* 0 */
|
68
|
-
/***/ (function(module,
|
68
|
+
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
69
69
|
|
70
70
|
"use strict";
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
exports.loadScript = loadScript;
|
83
|
-
exports.getCreativeComment = getCreativeComment;
|
84
|
-
exports.getCreativeCommentMarkup = getCreativeCommentMarkup;
|
85
|
-
exports.transformAuctionTargetingData = transformAuctionTargetingData;
|
86
|
-
exports.parseUrl = parseUrl;
|
87
|
-
|
88
|
-
var domHelper = _interopRequireWildcard(__webpack_require__(1));
|
89
|
-
|
90
|
-
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
|
91
|
-
|
92
|
-
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; if (obj != null) { var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
93
|
-
|
94
|
-
var postscribe = __webpack_require__(4);
|
71
|
+
/* harmony export (immutable) */ __webpack_exports__["i"] = triggerPixel;
|
72
|
+
/* harmony export (immutable) */ __webpack_exports__["a"] = createTrackPixelHtml;
|
73
|
+
/* harmony export (immutable) */ __webpack_exports__["j"] = writeAdUrl;
|
74
|
+
/* harmony export (immutable) */ __webpack_exports__["g"] = sendRequest;
|
75
|
+
/* harmony export (immutable) */ __webpack_exports__["d"] = getUUID;
|
76
|
+
/* harmony export (immutable) */ __webpack_exports__["e"] = loadScript;
|
77
|
+
/* harmony export (immutable) */ __webpack_exports__["b"] = getCreativeComment;
|
78
|
+
/* harmony export (immutable) */ __webpack_exports__["c"] = getCreativeCommentMarkup;
|
79
|
+
/* harmony export (immutable) */ __webpack_exports__["h"] = transformAuctionTargetingData;
|
80
|
+
/* harmony export (immutable) */ __webpack_exports__["f"] = parseUrl;
|
81
|
+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__domHelper__ = __webpack_require__(1);
|
95
82
|
|
96
83
|
/**
|
97
84
|
* Inserts an image pixel with the specified `url` for cookie sync
|
98
85
|
* @param {string} url URL string of the image pixel to load
|
99
86
|
* @param {function} [done] an optional exit callback, used when this usersync pixel is added during an async process
|
100
87
|
*/
|
88
|
+
|
101
89
|
function triggerPixel(url, done) {
|
102
90
|
var img = new Image();
|
103
91
|
|
@@ -108,7 +96,6 @@ function triggerPixel(url, done) {
|
|
108
96
|
|
109
97
|
img.src = url;
|
110
98
|
}
|
111
|
-
|
112
99
|
function createTrackPixelHtml(url) {
|
113
100
|
if (!url) {
|
114
101
|
return '';
|
@@ -118,22 +105,11 @@ function createTrackPixelHtml(url) {
|
|
118
105
|
var img = "<div style=\"position:absolute;left:0px;top:0px;visibility:hidden;\"><img src=\"".concat(escapedUrl, "\"></div>");
|
119
106
|
return img;
|
120
107
|
}
|
121
|
-
|
122
108
|
function writeAdUrl(adUrl, width, height) {
|
123
|
-
var iframe =
|
109
|
+
var iframe = __WEBPACK_IMPORTED_MODULE_0__domHelper__["a" /* getEmptyIframe */](height, width);
|
124
110
|
iframe.src = adUrl;
|
125
111
|
document.body.appendChild(iframe);
|
126
112
|
}
|
127
|
-
|
128
|
-
function writeAdHtml(markup) {
|
129
|
-
// remove <?xml> and <!doctype> tags
|
130
|
-
// https://github.com/prebid/prebid-universal-creative/issues/134
|
131
|
-
markup = markup.replace(/\<(\?xml|(\!DOCTYPE[^\>\[]+(\[[^\]]+)?))+[^>]+\>/g, '');
|
132
|
-
postscribe(document.body, markup, {
|
133
|
-
error: console.error
|
134
|
-
});
|
135
|
-
}
|
136
|
-
|
137
113
|
function sendRequest(url, callback) {
|
138
114
|
function reqListener() {
|
139
115
|
callback(oReq.responseText);
|
@@ -144,7 +120,6 @@ function sendRequest(url, callback) {
|
|
144
120
|
oReq.open('GET', url);
|
145
121
|
oReq.send();
|
146
122
|
}
|
147
|
-
|
148
123
|
function getUUID() {
|
149
124
|
var d = new Date().getTime();
|
150
125
|
var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
@@ -154,9 +129,7 @@ function getUUID() {
|
|
154
129
|
});
|
155
130
|
return uuid;
|
156
131
|
}
|
157
|
-
|
158
132
|
;
|
159
|
-
|
160
133
|
function loadScript(currentWindow, tagSrc, successCallback, errorCallback) {
|
161
134
|
var doc = currentWindow.document;
|
162
135
|
var scriptTag = doc.createElement('script');
|
@@ -196,7 +169,6 @@ function loadScript(currentWindow, tagSrc, successCallback, errorCallback) {
|
|
196
169
|
|
197
170
|
return scriptTag;
|
198
171
|
}
|
199
|
-
|
200
172
|
;
|
201
173
|
/**
|
202
174
|
* Return comment element
|
@@ -211,14 +183,12 @@ function getCreativeComment(bid) {
|
|
211
183
|
* @param {*} bid
|
212
184
|
*/
|
213
185
|
|
214
|
-
|
215
186
|
function getCreativeCommentMarkup(bid) {
|
216
|
-
var creativeComment =
|
187
|
+
var creativeComment = getCreativeComment(bid);
|
217
188
|
var wrapper = document.createElement('div');
|
218
189
|
wrapper.appendChild(creativeComment);
|
219
190
|
return wrapper.innerHTML;
|
220
191
|
}
|
221
|
-
|
222
192
|
function transformAuctionTargetingData(tagData) {
|
223
193
|
// this map object translates the Prebid.js auction keys to their equivalent Prebid Universal Creative keys
|
224
194
|
// when the publisher uses their adserver's generic macro that provides all targeting keys (ie tagData.targetingMap), we need to convert the keys
|
@@ -315,7 +285,6 @@ function transformAuctionTargetingData(tagData) {
|
|
315
285
|
});
|
316
286
|
return auctionData;
|
317
287
|
}
|
318
|
-
|
319
288
|
function parseUrl(url) {
|
320
289
|
var parsed = document.createElement('a');
|
321
290
|
parsed.href = decodeURIComponent(url);
|
@@ -348,17 +317,11 @@ function isStr(object) {
|
|
348
317
|
|
349
318
|
/***/ }),
|
350
319
|
/* 1 */
|
351
|
-
/***/ (function(module,
|
320
|
+
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
352
321
|
|
353
322
|
"use strict";
|
354
|
-
|
355
|
-
|
356
|
-
Object.defineProperty(exports, "__esModule", {
|
357
|
-
value: true
|
358
|
-
});
|
359
|
-
exports.getEmptyIframe = getEmptyIframe;
|
360
|
-
exports.insertElement = insertElement;
|
361
|
-
|
323
|
+
/* harmony export (immutable) */ __webpack_exports__["a"] = getEmptyIframe;
|
324
|
+
/* harmony export (immutable) */ __webpack_exports__["b"] = insertElement;
|
362
325
|
/**
|
363
326
|
* domHelper: a collection of helpful dom things
|
364
327
|
*/
|
@@ -389,7 +352,6 @@ function getEmptyIframe(height, width) {
|
|
389
352
|
* @param {string} target
|
390
353
|
*/
|
391
354
|
|
392
|
-
|
393
355
|
function insertElement(elm, doc, target) {
|
394
356
|
doc = doc || document;
|
395
357
|
var elToAppend;
|
@@ -412,476 +374,639 @@ function insertElement(elm, doc, target) {
|
|
412
374
|
|
413
375
|
/***/ }),
|
414
376
|
/* 2 */
|
415
|
-
/***/ (function(module,
|
377
|
+
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
416
378
|
|
417
379
|
"use strict";
|
380
|
+
/* harmony export (immutable) */ __webpack_exports__["b"] = isAmp;
|
381
|
+
/* harmony export (immutable) */ __webpack_exports__["d"] = isSafeFrame;
|
382
|
+
/* unused harmony export isCrossDomain */
|
383
|
+
/* unused harmony export canInspectWindow */
|
384
|
+
/* harmony export (immutable) */ __webpack_exports__["a"] = canLocatePrebid;
|
385
|
+
/* harmony export (immutable) */ __webpack_exports__["c"] = isMobileApp;
|
386
|
+
/***************************************
|
387
|
+
* Detect Environment Helper Functions
|
388
|
+
***************************************/
|
389
|
+
|
390
|
+
/**
|
391
|
+
* Functions to detect below environments:
|
392
|
+
* Amp: google Accelerate Mobile Pages ampproject.org
|
393
|
+
* SafeFrame: SafeFrame
|
394
|
+
* CrossDomain: An iframe that can't get to the top window
|
395
|
+
* Mobile App: function to detect mobile app environment
|
396
|
+
*/
|
397
|
+
|
398
|
+
/**
|
399
|
+
* @param {String} uuid key value from auction, contains the cache id of the winning bid stored in prebid cache
|
400
|
+
* @returns true if there is an AMP context object
|
401
|
+
*/
|
402
|
+
function isAmp(uuid, win) {
|
403
|
+
// TODO Use amp context once it is available in cross domain
|
404
|
+
// https://github.com/ampproject/amphtml/issues/6829
|
405
|
+
return typeof uuid === 'string' && uuid !== "" && isCrossDomain(win);
|
406
|
+
}
|
407
|
+
/**
|
408
|
+
* @returns true if the environment is a SafeFrame.
|
409
|
+
*/
|
410
|
+
|
411
|
+
function isSafeFrame(win) {
|
412
|
+
return !!(win.$sf && win.$sf.ext);
|
413
|
+
}
|
414
|
+
/**
|
415
|
+
* Return true if we are in an iframe and can't access the top window.
|
416
|
+
* @returns true if the environment is a Cross Domain
|
417
|
+
*/
|
418
418
|
|
419
|
+
function isCrossDomain(win) {
|
420
|
+
return win.top !== win && !canInspectWindow(win);
|
421
|
+
}
|
422
|
+
/**
|
423
|
+
* Returns true if win's properties can be accessed and win is defined.
|
424
|
+
* This functioned is used to determine if a window is cross-domained
|
425
|
+
* from the perspective of the current window.
|
426
|
+
* @param {!Window} win
|
427
|
+
* @return {boolean}
|
428
|
+
*/
|
419
429
|
|
420
|
-
|
430
|
+
function canInspectWindow(win) {
|
431
|
+
try {
|
432
|
+
// force an exception in x-domain environments. #1509
|
433
|
+
win.top.location.toString();
|
434
|
+
return true;
|
435
|
+
} catch (e) {
|
436
|
+
return false;
|
437
|
+
}
|
438
|
+
}
|
439
|
+
/**
|
440
|
+
* Returns true if we can find the prebid global object (eg pbjs) as we
|
441
|
+
* climb the accessible windows. Return false if it's not found.
|
442
|
+
* @returns {boolean}
|
443
|
+
*/
|
444
|
+
|
445
|
+
function canLocatePrebid(win) {
|
446
|
+
var result = false;
|
447
|
+
var currentWindow = win;
|
448
|
+
|
449
|
+
while (!result) {
|
450
|
+
try {
|
451
|
+
if (currentWindow.pbjs) {
|
452
|
+
result = true;
|
453
|
+
break;
|
454
|
+
}
|
455
|
+
} catch (e) {}
|
421
456
|
|
422
|
-
|
457
|
+
if (currentWindow === window.top) break;
|
458
|
+
currentWindow = currentWindow.parent;
|
459
|
+
}
|
423
460
|
|
461
|
+
return result;
|
462
|
+
}
|
424
463
|
/**
|
425
|
-
*
|
426
|
-
*
|
427
|
-
* This file is inserted into the prebid creative as a placeholder for the winning prebid creative. It should support the following formats:
|
428
|
-
* - Banner
|
429
|
-
* - Outstream Video
|
430
|
-
* - Mobile
|
431
|
-
* - AMP creatives
|
432
|
-
* - All safeFrame creatives
|
464
|
+
* @param {String} env key value from auction, indicates the environment where tag is served
|
465
|
+
* @returns true if env exists and is equal to the string 'mobile-app'
|
433
466
|
*/
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
467
|
+
|
468
|
+
function isMobileApp(env) {
|
469
|
+
return env && env === 'mobile-app';
|
470
|
+
}
|
438
471
|
|
439
472
|
/***/ }),
|
440
473
|
/* 3 */
|
441
|
-
/***/ (function(module,
|
474
|
+
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
442
475
|
|
443
476
|
"use strict";
|
477
|
+
Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
|
478
|
+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils__ = __webpack_require__(0);
|
479
|
+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__renderingManager__ = __webpack_require__(4);
|
480
|
+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__mobileAndAmpRender__ = __webpack_require__(6);
|
481
|
+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__environment__ = __webpack_require__(2);
|
482
|
+
/**
|
483
|
+
* legacy.js
|
484
|
+
* This is deprecated code, publishers should not use one .js creative to handle all different types of creative.
|
485
|
+
* To reduce bytes transfered for each ad, publishers should use specific .js based on hb_format targeting key-value.
|
486
|
+
*
|
487
|
+
* This file is inserted into the prebid creative as a placeholder for the winning prebid creative. It should support the following formats:
|
488
|
+
* - Banner
|
489
|
+
* - AMP
|
490
|
+
* - Mobile
|
491
|
+
* - Outstream Video
|
492
|
+
* - All safeFrame creatives
|
493
|
+
*/
|
444
494
|
|
445
495
|
|
446
|
-
Object.defineProperty(exports, "__esModule", {
|
447
|
-
value: true
|
448
|
-
});
|
449
|
-
exports.newRenderingManager = newRenderingManager;
|
450
496
|
|
451
|
-
var utils = _interopRequireWildcard(__webpack_require__(0));
|
452
497
|
|
453
|
-
|
498
|
+
window.ucTag = window.ucTag || {};
|
499
|
+
|
500
|
+
window.ucTag.renderAd = function (doc, dataObject) {
|
501
|
+
var targetingData = Object(__WEBPACK_IMPORTED_MODULE_0__utils__["h" /* transformAuctionTargetingData */])(dataObject);
|
502
|
+
|
503
|
+
if (Object(__WEBPACK_IMPORTED_MODULE_3__environment__["c" /* isMobileApp */])(targetingData.env) || Object(__WEBPACK_IMPORTED_MODULE_3__environment__["b" /* isAmp */])(targetingData.uuid, window)) {
|
504
|
+
Object(__WEBPACK_IMPORTED_MODULE_2__mobileAndAmpRender__["a" /* renderAmpOrMobileAd */])(dataObject);
|
505
|
+
} else {
|
506
|
+
Object(__WEBPACK_IMPORTED_MODULE_1__renderingManager__["a" /* renderBannerOrDisplayAd */])(doc, dataObject);
|
507
|
+
}
|
508
|
+
};
|
454
509
|
|
455
|
-
|
510
|
+
/***/ }),
|
511
|
+
/* 4 */
|
512
|
+
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
456
513
|
|
457
|
-
|
514
|
+
"use strict";
|
515
|
+
/* harmony export (immutable) */ __webpack_exports__["a"] = renderBannerOrDisplayAd;
|
516
|
+
/* unused harmony export renderLegacy */
|
517
|
+
/* unused harmony export renderCrossDomain */
|
518
|
+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils__ = __webpack_require__(0);
|
519
|
+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__environment__ = __webpack_require__(2);
|
520
|
+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__domHelper__ = __webpack_require__(1);
|
521
|
+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__messaging_js__ = __webpack_require__(5);
|
458
522
|
|
459
|
-
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; if (obj != null) { var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
460
523
|
|
461
|
-
var DEFAULT_CACHE_HOST = 'prebid.adnxs.com';
|
462
|
-
var DEFAULT_CACHE_PATH = '/pbc/v1/cache';
|
463
|
-
/**
|
464
|
-
*
|
465
|
-
* @param {Object} win Window object
|
466
|
-
* @param {Object} environment Environment object
|
467
|
-
* @returns {Object}
|
468
|
-
*/
|
469
524
|
|
470
|
-
function newRenderingManager(win, environment) {
|
471
|
-
/**
|
472
|
-
* DataObject passed to render the ad
|
473
|
-
* @typedef {Object} dataObject
|
474
|
-
* @property {string} host - Prebid cache host
|
475
|
-
* @property {string} uuid - ID to fetch the value from prebid cache
|
476
|
-
* @property {string} mediaType - Creative media type, It can be banner, native or video
|
477
|
-
* @property {string} pubUrl - Publisher url
|
478
|
-
* @property {string} winurl
|
479
|
-
* @property {string} winbidid
|
480
|
-
*/
|
481
525
|
|
482
|
-
|
483
|
-
|
484
|
-
* @param {object} doc
|
485
|
-
* @param {dataObject} dataObject
|
486
|
-
*/
|
487
|
-
var renderAd = function renderAd(doc, dataObject) {
|
488
|
-
var targetingData = utils.transformAuctionTargetingData(dataObject);
|
489
|
-
|
490
|
-
if (environment.isMobileApp(targetingData.env)) {
|
491
|
-
renderAmpOrMobileAd(targetingData.cacheHost, targetingData.cachePath, targetingData.uuid, targetingData.size, targetingData.hbPb, true);
|
492
|
-
} else if (environment.isAmp(targetingData.uuid)) {
|
493
|
-
renderAmpOrMobileAd(targetingData.cacheHost, targetingData.cachePath, targetingData.uuid, targetingData.size, targetingData.hbPb);
|
494
|
-
} else if (!environment.canLocatePrebid()) {
|
495
|
-
renderCrossDomain(targetingData.adId, targetingData.adServerDomain, targetingData.pubUrl);
|
496
|
-
} else {
|
497
|
-
renderLegacy(doc, targetingData.adId);
|
498
|
-
}
|
499
|
-
};
|
500
|
-
/**
|
501
|
-
* Calls prebid.js renderAd function to render ad
|
502
|
-
* @param {Object} doc Document
|
503
|
-
* @param {string} adId Id of creative to render
|
504
|
-
*/
|
526
|
+
function renderBannerOrDisplayAd(doc, dataObject) {
|
527
|
+
var targetingData = Object(__WEBPACK_IMPORTED_MODULE_0__utils__["h" /* transformAuctionTargetingData */])(dataObject);
|
505
528
|
|
529
|
+
if (!Object(__WEBPACK_IMPORTED_MODULE_1__environment__["a" /* canLocatePrebid */])(window)) {
|
530
|
+
renderCrossDomain(window, targetingData.adId, targetingData.adServerDomain, targetingData.pubUrl);
|
531
|
+
} else {
|
532
|
+
renderLegacy(doc, targetingData.adId);
|
533
|
+
}
|
534
|
+
}
|
535
|
+
/**
|
536
|
+
* Calls prebid.js renderAd function to render ad
|
537
|
+
* @param {Object} doc Document
|
538
|
+
* @param {string} adId Id of creative to render
|
539
|
+
*/
|
506
540
|
|
507
|
-
|
508
|
-
|
541
|
+
function renderLegacy(doc, adId) {
|
542
|
+
var found = false;
|
543
|
+
var w = window;
|
509
544
|
|
510
|
-
|
511
|
-
|
545
|
+
for (var i = 0; i < 10; i++) {
|
546
|
+
w = w.parent;
|
512
547
|
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
548
|
+
if (w.pbjs) {
|
549
|
+
try {
|
550
|
+
found = true;
|
551
|
+
w.pbjs.renderAd(doc, adId);
|
552
|
+
break;
|
553
|
+
} catch (e) {
|
554
|
+
continue;
|
520
555
|
}
|
521
556
|
}
|
522
557
|
}
|
523
|
-
/**
|
524
|
-
* Render ad in safeframe using postmessage
|
525
|
-
* @param {string} adId Id of creative to render
|
526
|
-
* @param {string} pubAdServerDomain publisher adserver domain name
|
527
|
-
* @param {string} pubUrl Url of publisher page
|
528
|
-
*/
|
529
558
|
|
559
|
+
if (!found) {
|
560
|
+
console.error("Unable to locate pbjs.renderAd function!");
|
561
|
+
}
|
562
|
+
}
|
563
|
+
/**
|
564
|
+
* Render ad in safeframe using postmessage
|
565
|
+
* @param {string} adId Id of creative to render
|
566
|
+
* @param {string} pubAdServerDomain publisher adserver domain name
|
567
|
+
* @param {string} pubUrl Url of publisher page
|
568
|
+
*/
|
530
569
|
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
570
|
+
function renderCrossDomain(win, adId) {
|
571
|
+
var pubAdServerDomain = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
|
572
|
+
var pubUrl = arguments.length > 3 ? arguments[3] : undefined;
|
573
|
+
var windowLocation = win.location;
|
574
|
+
var adServerDomain = pubAdServerDomain || win.location.hostname;
|
575
|
+
var fullAdServerDomain = windowLocation.protocol + '//' + adServerDomain;
|
576
|
+
var sendMessage = Object(__WEBPACK_IMPORTED_MODULE_3__messaging_js__["a" /* prebidMessenger */])(pubUrl, win);
|
538
577
|
|
539
|
-
|
540
|
-
|
541
|
-
|
578
|
+
function renderAd(ev) {
|
579
|
+
var key = ev.message ? "message" : "data";
|
580
|
+
var adObject = {};
|
542
581
|
|
582
|
+
try {
|
583
|
+
adObject = JSON.parse(ev[key]);
|
584
|
+
} catch (e) {
|
585
|
+
return;
|
586
|
+
}
|
587
|
+
|
588
|
+
if (adObject.message && adObject.message === "Prebid Response" && adObject.adId === adId) {
|
543
589
|
try {
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
590
|
+
var body = win.document.body;
|
591
|
+
var ad = adObject.ad;
|
592
|
+
var url = adObject.adUrl;
|
593
|
+
var width = adObject.width;
|
594
|
+
var height = adObject.height;
|
548
595
|
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
var _iframe = domHelper.getEmptyIframe(height, width);
|
572
|
-
|
573
|
-
_iframe.style.display = 'inline';
|
574
|
-
_iframe.style.overflow = 'hidden';
|
575
|
-
_iframe.src = url;
|
576
|
-
domHelper.insertElement(_iframe, document, 'body');
|
577
|
-
signalRenderResult(true);
|
578
|
-
} else {
|
579
|
-
signalRenderResult(false, {
|
580
|
-
reason: 'noAd',
|
581
|
-
message: "No ad for ".concat(adId)
|
582
|
-
});
|
583
|
-
console.log("Error trying to write ad. No ad markup or adUrl for ".concat(adId));
|
584
|
-
}
|
585
|
-
} catch (e) {
|
596
|
+
if (adObject.mediaType === "video") {
|
597
|
+
signalRenderResult(false, {
|
598
|
+
reason: "preventWritingOnMainDocument",
|
599
|
+
message: "Cannot render video ad ".concat(adId)
|
600
|
+
});
|
601
|
+
console.log("Error trying to write ad.");
|
602
|
+
} else if (ad) {
|
603
|
+
var iframe = Object(__WEBPACK_IMPORTED_MODULE_2__domHelper__["a" /* getEmptyIframe */])(adObject.height, adObject.width);
|
604
|
+
body.appendChild(iframe);
|
605
|
+
iframe.contentDocument.open();
|
606
|
+
iframe.contentDocument.write(ad);
|
607
|
+
iframe.contentDocument.close();
|
608
|
+
signalRenderResult(true);
|
609
|
+
} else if (url) {
|
610
|
+
var _iframe = Object(__WEBPACK_IMPORTED_MODULE_2__domHelper__["a" /* getEmptyIframe */])(height, width);
|
611
|
+
|
612
|
+
_iframe.style.display = "inline";
|
613
|
+
_iframe.style.overflow = "hidden";
|
614
|
+
_iframe.src = url;
|
615
|
+
Object(__WEBPACK_IMPORTED_MODULE_2__domHelper__["b" /* insertElement */])(_iframe, document, "body");
|
616
|
+
signalRenderResult(true);
|
617
|
+
} else {
|
586
618
|
signalRenderResult(false, {
|
587
|
-
reason: "
|
588
|
-
message:
|
619
|
+
reason: "noAd",
|
620
|
+
message: "No ad for ".concat(adId)
|
589
621
|
});
|
590
|
-
console.log("Error
|
622
|
+
console.log("Error trying to write ad. No ad markup or adUrl for ".concat(adId));
|
591
623
|
}
|
624
|
+
} catch (e) {
|
625
|
+
signalRenderResult(false, {
|
626
|
+
reason: "exception",
|
627
|
+
message: e.message
|
628
|
+
});
|
629
|
+
console.log("Error in rendering ad", e);
|
592
630
|
}
|
631
|
+
}
|
593
632
|
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
var payload = {
|
600
|
-
message: 'Prebid Event',
|
601
|
-
adId: adId,
|
602
|
-
event: success ? 'adRenderSucceeded' : 'adRenderFailed'
|
603
|
-
};
|
633
|
+
function signalRenderResult(success) {
|
634
|
+
var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
635
|
+
reason = _ref.reason,
|
636
|
+
message = _ref.message;
|
604
637
|
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
|
610
|
-
}
|
638
|
+
var payload = {
|
639
|
+
message: "Prebid Event",
|
640
|
+
adId: adId,
|
641
|
+
event: success ? "adRenderSucceeded" : "adRenderFailed"
|
642
|
+
};
|
611
643
|
|
612
|
-
|
644
|
+
if (!success) {
|
645
|
+
payload.info = {
|
646
|
+
reason: reason,
|
647
|
+
message: message
|
648
|
+
};
|
613
649
|
}
|
614
|
-
}
|
615
650
|
|
616
|
-
|
617
|
-
var message = {
|
618
|
-
message: 'Prebid Request',
|
619
|
-
adId: adId,
|
620
|
-
adServerDomain: fullAdServerDomain
|
621
|
-
};
|
622
|
-
sendMessage(message, renderAd);
|
651
|
+
sendMessage(payload);
|
623
652
|
}
|
653
|
+
}
|
624
654
|
|
625
|
-
|
655
|
+
function requestAdFromPrebid() {
|
656
|
+
var message = {
|
657
|
+
message: 'Prebid Request',
|
658
|
+
adId: adId,
|
659
|
+
adServerDomain: fullAdServerDomain
|
660
|
+
};
|
661
|
+
sendMessage(message, renderAd);
|
626
662
|
}
|
627
|
-
/**
|
628
|
-
* Returns cache endpoint concatenated with cache path
|
629
|
-
* @param {string} cacheHost Cache Endpoint host
|
630
|
-
* @param {string} cachePath Cache Endpoint path
|
631
|
-
*/
|
632
663
|
|
664
|
+
requestAdFromPrebid();
|
665
|
+
}
|
633
666
|
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
return "https://".concat(host).concat(path);
|
638
|
-
}
|
639
|
-
/**
|
640
|
-
* update iframe by using size string to resize
|
641
|
-
* @param {string} size
|
642
|
-
*/
|
667
|
+
/***/ }),
|
668
|
+
/* 5 */
|
669
|
+
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
643
670
|
|
671
|
+
"use strict";
|
672
|
+
/* harmony export (immutable) */ __webpack_exports__["a"] = prebidMessenger;
|
673
|
+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils_js__ = __webpack_require__(0);
|
644
674
|
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
|
675
|
+
function prebidMessenger(publisherURL) {
|
676
|
+
var win = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window;
|
677
|
+
|
678
|
+
var prebidDomain = function () {
|
679
|
+
if (publisherURL == null) {
|
680
|
+
return null;
|
651
681
|
}
|
652
|
-
}
|
653
|
-
/**
|
654
|
-
* Render mobile or amp ad
|
655
|
-
* @param {string} cacheHost Cache host
|
656
|
-
* @param {string} cachePath Cache path
|
657
|
-
* @param {string} uuid id to render response from cache endpoint
|
658
|
-
* @param {string} size size of the creative
|
659
|
-
* @param {string} hbPb final price of the winning bid
|
660
|
-
* @param {Bool} isMobileApp flag to detect mobile app
|
661
|
-
*/
|
662
682
|
|
683
|
+
var parsedUrl = Object(__WEBPACK_IMPORTED_MODULE_0__utils_js__["f" /* parseUrl */])(publisherURL);
|
684
|
+
return parsedUrl.protocol + '://' + parsedUrl.host;
|
685
|
+
}();
|
663
686
|
|
664
|
-
function
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
var isMobileApp = arguments.length > 5 ? arguments[5] : undefined;
|
669
|
-
// For MoPub, creative is stored in localStorage via SDK.
|
670
|
-
var search = 'Prebid_';
|
687
|
+
return function sendMessage(message, onResponse) {
|
688
|
+
if (prebidDomain == null) {
|
689
|
+
throw new Error('Missing pubUrl');
|
690
|
+
}
|
671
691
|
|
672
|
-
|
673
|
-
|
692
|
+
message = JSON.stringify(message);
|
693
|
+
var messagePort;
|
674
694
|
|
675
|
-
|
695
|
+
if (onResponse == null) {
|
696
|
+
win.parent.postMessage(message, prebidDomain);
|
676
697
|
} else {
|
677
|
-
var
|
678
|
-
|
679
|
-
|
680
|
-
|
698
|
+
var channel = new MessageChannel();
|
699
|
+
messagePort = channel.port1;
|
700
|
+
messagePort.onmessage = onResponse;
|
701
|
+
win.addEventListener('message', windowListener);
|
702
|
+
win.parent.postMessage(message, prebidDomain, [channel.port2]);
|
681
703
|
}
|
682
|
-
}
|
683
|
-
/**
|
684
|
-
* Cache request Callback to display creative
|
685
|
-
* @param {Bool} isMobileApp
|
686
|
-
* @param {string} hbPb final price of the winning bid
|
687
|
-
* @returns {function} a callback function that parses response
|
688
|
-
*/
|
689
704
|
|
705
|
+
return function stopListening() {
|
706
|
+
if (messagePort != null) {
|
707
|
+
win.removeEventListener('message', windowListener);
|
708
|
+
messagePort.onmessage = null;
|
709
|
+
messagePort = null;
|
710
|
+
}
|
711
|
+
};
|
690
712
|
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
var auctionPrice = bidObject.price || hbPb;
|
695
|
-
var ad = utils.getCreativeCommentMarkup(bidObject);
|
696
|
-
var width = bidObject.width ? bidObject.width : bidObject.w;
|
697
|
-
var height = bidObject.height ? bidObject.height : bidObject.h; // When Prebid Universal Creative reads from Prebid Cache, we need to have it check for the existence of the wurl parameter. If it exists, hit it.
|
698
|
-
|
699
|
-
if (bidObject.wurl) {
|
700
|
-
(0, utils.triggerPixel)(decodeURIComponent(bidObject.wurl));
|
713
|
+
function windowListener(ev) {
|
714
|
+
if ((ev.origin || ev.originalEvent && ev.originalEvent.origin) === prebidDomain) {
|
715
|
+
onResponse(ev);
|
701
716
|
}
|
717
|
+
}
|
718
|
+
};
|
719
|
+
}
|
702
720
|
|
703
|
-
|
704
|
-
|
705
|
-
|
706
|
-
bidObject.adm = bidObject.adm.replace('${AUCTION_PRICE}', auctionPrice);
|
707
|
-
} else {
|
708
|
-
/*
|
709
|
-
From OpenRTB spec 2.5: If the source value is an optional parameter that was not specified, the macro will simply be removed (i.e., replaced with a zero-length string).
|
710
|
-
*/
|
711
|
-
bidObject.adm = bidObject.adm.replace('${AUCTION_PRICE}', '');
|
712
|
-
}
|
721
|
+
/***/ }),
|
722
|
+
/* 6 */
|
723
|
+
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
713
724
|
|
714
|
-
|
725
|
+
"use strict";
|
726
|
+
/* harmony export (immutable) */ __webpack_exports__["a"] = renderAmpOrMobileAd;
|
727
|
+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__utils__ = __webpack_require__(0);
|
728
|
+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__environment__ = __webpack_require__(2);
|
729
|
+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__domHelper__ = __webpack_require__(1);
|
730
|
+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__postscribeRender__ = __webpack_require__(7);
|
715
731
|
|
716
|
-
if (bidObject.nurl) {
|
717
|
-
ad += utils.createTrackPixelHtml(decodeURIComponent(bidObject.nurl));
|
718
|
-
}
|
719
732
|
|
720
|
-
if (bidObject.burl) {
|
721
|
-
var triggerBurl = function triggerBurl() {
|
722
|
-
utils.triggerPixel(bidObject.burl);
|
723
|
-
};
|
724
|
-
|
725
|
-
if (isMobileApp) {
|
726
|
-
var mraidScript = utils.loadScript(win, 'mraid.js', function () {
|
727
|
-
// Success loading MRAID
|
728
|
-
var result = registerMRAIDViewableEvent(triggerBurl);
|
729
|
-
|
730
|
-
if (!result) {
|
731
|
-
triggerBurl(); // Error registering event
|
732
|
-
}
|
733
|
-
}, triggerBurl // Error loading MRAID
|
734
|
-
);
|
735
|
-
} else {
|
736
|
-
triggerBurl(); // Not a mobile app
|
737
|
-
}
|
738
|
-
}
|
739
733
|
|
740
|
-
utils.writeAdHtml(ad);
|
741
|
-
} else if (bidObject.nurl) {
|
742
|
-
if (isMobileApp) {
|
743
|
-
var adhtml = utils.loadScript(win, bidObject.nurl);
|
744
|
-
ad += constructMarkup(adhtml.outerHTML, width, height);
|
745
|
-
utils.writeAdHtml(ad);
|
746
|
-
} else {
|
747
|
-
var nurl = bidObject.nurl;
|
748
|
-
var commentElm = utils.getCreativeComment(bidObject);
|
749
|
-
domHelper.insertElement(commentElm, document, 'body');
|
750
|
-
utils.writeAdUrl(nurl, width, height);
|
751
|
-
}
|
752
|
-
}
|
753
|
-
};
|
754
|
-
}
|
755
734
|
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
|
760
|
-
|
735
|
+
var DEFAULT_CACHE_HOST = 'prebid.adnxs.com';
|
736
|
+
var DEFAULT_CACHE_PATH = '/pbc/v1/cache';
|
737
|
+
/**
|
738
|
+
* Render mobile or amp ad
|
739
|
+
* @param {string} cacheHost Cache host
|
740
|
+
* @param {string} cachePath Cache path
|
741
|
+
* @param {string} uuid id to render response from cache endpoint
|
742
|
+
* @param {string} size size of the creative
|
743
|
+
* @param {string} hbPb final price of the winning bid
|
744
|
+
* @param {Bool} isMobileApp flag to detect mobile app
|
745
|
+
*/
|
761
746
|
|
762
|
-
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
|
767
|
-
|
768
|
-
|
769
|
-
|
770
|
-
* @returns {Object} bidObject parsed response
|
771
|
-
*/
|
747
|
+
function renderAmpOrMobileAd(dataObject) {
|
748
|
+
var targetingData = Object(__WEBPACK_IMPORTED_MODULE_0__utils__["h" /* transformAuctionTargetingData */])(dataObject);
|
749
|
+
var cacheHost = targetingData.cacheHost,
|
750
|
+
cachePath = targetingData.cachePath,
|
751
|
+
uuid = targetingData.uuid,
|
752
|
+
size = targetingData.size,
|
753
|
+
hbPb = targetingData.hbPb;
|
754
|
+
uuid = uuid || ''; // For MoPub, creative is stored in localStorage via SDK.
|
772
755
|
|
756
|
+
var search = 'Prebid_';
|
773
757
|
|
774
|
-
|
775
|
-
|
758
|
+
if (uuid.substr(0, search.length) === search) {
|
759
|
+
loadFromLocalCache(uuid); //register creative right away to not miss initial geom-update
|
776
760
|
|
777
|
-
|
778
|
-
|
779
|
-
|
780
|
-
console.log("Error parsing response from cache host: ".concat(error));
|
781
|
-
}
|
761
|
+
updateIframe(size);
|
762
|
+
} else {
|
763
|
+
var adUrl = "".concat(getCacheEndpoint(cacheHost, cachePath), "?uuid=").concat(uuid); //register creative right away to not miss initial geom-update
|
782
764
|
|
783
|
-
|
765
|
+
updateIframe(size);
|
766
|
+
Object(__WEBPACK_IMPORTED_MODULE_0__utils__["g" /* sendRequest */])(adUrl, responseCallback(Object(__WEBPACK_IMPORTED_MODULE_1__environment__["c" /* isMobileApp */])(targetingData.env), hbPb));
|
784
767
|
}
|
785
|
-
|
786
|
-
|
787
|
-
|
788
|
-
|
789
|
-
|
790
|
-
|
791
|
-
|
768
|
+
}
|
769
|
+
/**
|
770
|
+
* Load response from localStorage. In case of MoPub, sdk caches response
|
771
|
+
* @param {string} cacheId
|
772
|
+
*/
|
773
|
+
|
774
|
+
function loadFromLocalCache(cacheId) {
|
775
|
+
var bid = window.localStorage.getItem(cacheId);
|
776
|
+
var displayFn = responseCallback(true);
|
777
|
+
displayFn(bid);
|
778
|
+
}
|
779
|
+
/**
|
780
|
+
* update iframe by using size string to resize
|
781
|
+
* @param {string} size
|
782
|
+
*/
|
792
783
|
|
793
784
|
|
794
|
-
|
795
|
-
|
796
|
-
|
785
|
+
function updateIframe(size) {
|
786
|
+
if (size) {
|
787
|
+
var sizeArr = size.split('x').map(Number);
|
788
|
+
resizeIframe(sizeArr[0], sizeArr[1]);
|
789
|
+
} else {
|
790
|
+
console.log('Targeting key hb_size not found to resize creative');
|
797
791
|
}
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
|
802
|
-
|
792
|
+
}
|
793
|
+
/**
|
794
|
+
* Resize container iframe
|
795
|
+
* @param {Number} width width of creative
|
796
|
+
* @param {Number} height height of creative
|
797
|
+
*/
|
803
798
|
|
804
799
|
|
805
|
-
|
806
|
-
|
807
|
-
|
808
|
-
|
809
|
-
|
810
|
-
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
800
|
+
function resizeIframe(width, height) {
|
801
|
+
if (Object(__WEBPACK_IMPORTED_MODULE_1__environment__["d" /* isSafeFrame */])(window)) {
|
802
|
+
var resize = function resize(status) {
|
803
|
+
var newWidth = width - iframeWidth;
|
804
|
+
var newHeight = height - iframeHeight;
|
805
|
+
window.$sf.ext.expand({
|
806
|
+
r: newWidth,
|
807
|
+
b: newHeight,
|
808
|
+
push: true
|
809
|
+
});
|
810
|
+
};
|
816
811
|
|
817
|
-
|
818
|
-
|
812
|
+
var iframeWidth = window.innerWidth;
|
813
|
+
var iframeHeight = window.innerHeight;
|
819
814
|
|
820
|
-
|
821
|
-
|
815
|
+
if (iframeWidth !== width || iframeHeight !== height) {
|
816
|
+
window.$sf.ext.register(width, height, resize); // we need to resize the DFP container as well
|
822
817
|
|
823
|
-
|
824
|
-
|
825
|
-
|
826
|
-
|
827
|
-
|
828
|
-
|
829
|
-
}
|
818
|
+
window.parent.postMessage({
|
819
|
+
sentinel: 'amp',
|
820
|
+
type: 'embed-size',
|
821
|
+
width: width,
|
822
|
+
height: height
|
823
|
+
}, '*');
|
830
824
|
}
|
831
825
|
}
|
826
|
+
}
|
827
|
+
/**
|
828
|
+
* Returns cache endpoint concatenated with cache path
|
829
|
+
* @param {string} cacheHost Cache Endpoint host
|
830
|
+
* @param {string} cachePath Cache Endpoint path
|
831
|
+
*/
|
832
832
|
|
833
|
-
|
834
|
-
|
835
|
-
|
836
|
-
|
837
|
-
|
838
|
-
|
833
|
+
|
834
|
+
function getCacheEndpoint(cacheHost, cachePath) {
|
835
|
+
var host = typeof cacheHost === 'undefined' || cacheHost === "" ? DEFAULT_CACHE_HOST : cacheHost;
|
836
|
+
var path = typeof cachePath === 'undefined' || cachePath === "" ? DEFAULT_CACHE_PATH : cachePath;
|
837
|
+
return "https://".concat(host).concat(path);
|
838
|
+
}
|
839
|
+
/**
|
840
|
+
* Cache request Callback to display creative
|
841
|
+
* @param {Bool} isMobileApp
|
842
|
+
* @param {string} hbPb final price of the winning bid
|
843
|
+
* @returns {function} a callback function that parses response
|
844
|
+
*/
|
845
|
+
|
846
|
+
|
847
|
+
function responseCallback(isMobileApp, hbPb) {
|
848
|
+
return function (response) {
|
849
|
+
var bidObject = parseResponse(response);
|
850
|
+
var auctionPrice = bidObject.price || hbPb;
|
851
|
+
var ad = Object(__WEBPACK_IMPORTED_MODULE_0__utils__["c" /* getCreativeCommentMarkup */])(bidObject);
|
852
|
+
var width = bidObject.width ? bidObject.width : bidObject.w;
|
853
|
+
var height = bidObject.height ? bidObject.height : bidObject.h; // When Prebid Universal Creative reads from Prebid Cache, we need to have it check for the existence of the wurl parameter. If it exists, hit it.
|
854
|
+
|
855
|
+
if (bidObject.wurl) {
|
856
|
+
Object(__WEBPACK_IMPORTED_MODULE_0__utils__["i" /* triggerPixel */])(decodeURIComponent(bidObject.wurl));
|
839
857
|
}
|
840
858
|
|
841
|
-
|
842
|
-
if (
|
843
|
-
|
844
|
-
|
859
|
+
if (bidObject.adm) {
|
860
|
+
if (auctionPrice) {
|
861
|
+
// replace ${AUCTION_PRICE} macro with the bidObject.price or hb_pb.
|
862
|
+
bidObject.adm = bidObject.adm.replace('${AUCTION_PRICE}', auctionPrice);
|
863
|
+
} else {
|
864
|
+
/*
|
865
|
+
From OpenRTB spec 2.5: If the source value is an optional parameter that was not specified, the macro will simply be removed (i.e., replaced with a zero-length string).
|
866
|
+
*/
|
867
|
+
bidObject.adm = bidObject.adm.replace('${AUCTION_PRICE}', '');
|
845
868
|
}
|
846
|
-
}
|
847
869
|
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
852
|
-
|
853
|
-
|
870
|
+
ad += isMobileApp ? constructMarkup(bidObject.adm, width, height) : bidObject.adm;
|
871
|
+
|
872
|
+
if (bidObject.nurl) {
|
873
|
+
ad += Object(__WEBPACK_IMPORTED_MODULE_0__utils__["a" /* createTrackPixelHtml */])(decodeURIComponent(bidObject.nurl));
|
874
|
+
}
|
875
|
+
|
876
|
+
if (bidObject.burl) {
|
877
|
+
var triggerBurl = function triggerBurl() {
|
878
|
+
Object(__WEBPACK_IMPORTED_MODULE_0__utils__["i" /* triggerPixel */])(bidObject.burl);
|
879
|
+
};
|
880
|
+
|
881
|
+
if (isMobileApp) {
|
882
|
+
var mraidScript = Object(__WEBPACK_IMPORTED_MODULE_0__utils__["e" /* loadScript */])(window, 'mraid.js', function () {
|
883
|
+
// Success loading MRAID
|
884
|
+
var result = registerMRAIDViewableEvent(triggerBurl);
|
885
|
+
|
886
|
+
if (!result) {
|
887
|
+
triggerBurl(); // Error registering event
|
888
|
+
}
|
889
|
+
}, triggerBurl // Error loading MRAID
|
890
|
+
);
|
854
891
|
} else {
|
855
|
-
|
892
|
+
triggerBurl(); // Not a mobile app
|
856
893
|
}
|
857
894
|
}
|
895
|
+
|
896
|
+
Object(__WEBPACK_IMPORTED_MODULE_3__postscribeRender__["a" /* writeAdHtml */])(ad);
|
897
|
+
} else if (bidObject.nurl) {
|
898
|
+
if (isMobileApp) {
|
899
|
+
var adhtml = Object(__WEBPACK_IMPORTED_MODULE_0__utils__["e" /* loadScript */])(window, bidObject.nurl);
|
900
|
+
ad += constructMarkup(adhtml.outerHTML, width, height);
|
901
|
+
Object(__WEBPACK_IMPORTED_MODULE_3__postscribeRender__["a" /* writeAdHtml */])(ad);
|
902
|
+
} else {
|
903
|
+
var nurl = bidObject.nurl;
|
904
|
+
var commentElm = Object(__WEBPACK_IMPORTED_MODULE_0__utils__["b" /* getCreativeComment */])(bidObject);
|
905
|
+
Object(__WEBPACK_IMPORTED_MODULE_2__domHelper__["b" /* insertElement */])(commentElm, document, 'body');
|
906
|
+
Object(__WEBPACK_IMPORTED_MODULE_0__utils__["j" /* writeAdUrl */])(nurl, width, height);
|
907
|
+
}
|
858
908
|
}
|
909
|
+
};
|
910
|
+
}
|
859
911
|
|
860
|
-
|
861
|
-
|
862
|
-
|
912
|
+
;
|
913
|
+
/**
|
914
|
+
* Parse response
|
915
|
+
* @param {string} response
|
916
|
+
* @returns {Object} bidObject parsed response
|
917
|
+
*/
|
918
|
+
|
919
|
+
function parseResponse(response) {
|
920
|
+
var bidObject;
|
921
|
+
|
922
|
+
try {
|
923
|
+
bidObject = JSON.parse(response);
|
924
|
+
} catch (error) {
|
925
|
+
console.log("Error parsing response from cache host: ".concat(error));
|
926
|
+
}
|
927
|
+
|
928
|
+
return bidObject;
|
929
|
+
}
|
930
|
+
/**
|
931
|
+
* Wrap mobile app creative in div
|
932
|
+
* @param {string} ad html for creative
|
933
|
+
* @param {Number} width width of creative
|
934
|
+
* @param {Number} height height of creative
|
935
|
+
* @returns {string} creative markup
|
936
|
+
*/
|
937
|
+
|
938
|
+
|
939
|
+
function constructMarkup(ad, width, height) {
|
940
|
+
var id = Object(__WEBPACK_IMPORTED_MODULE_0__utils__["d" /* getUUID */])();
|
941
|
+
return "<div id=\"".concat(id, "\" style=\"border-style: none; position: absolute; width:100%; height:100%;\">\n <div id=\"").concat(id, "_inner\" style=\"margin: 0 auto; width:").concat(width, "px; height:").concat(height, "px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);\">").concat(ad, "</div>\n </div>");
|
942
|
+
}
|
943
|
+
|
944
|
+
function registerMRAIDViewableEvent(callback) {
|
945
|
+
function exposureChangeListener(exposure) {
|
946
|
+
if (exposure > 0) {
|
947
|
+
mraid.removeEventListener('exposureChange', exposureChangeListener);
|
948
|
+
callback();
|
863
949
|
}
|
950
|
+
}
|
951
|
+
|
952
|
+
function viewableChangeListener(viewable) {
|
953
|
+
if (viewable) {
|
954
|
+
mraid.removeEventListener('viewableChange', viewableChangeListener);
|
955
|
+
callback();
|
956
|
+
}
|
957
|
+
}
|
864
958
|
|
865
|
-
|
866
|
-
|
867
|
-
|
959
|
+
function registerViewableChecks() {
|
960
|
+
if (window.MRAID_ENV && parseFloat(window.MRAID_ENV.version) >= 3) {
|
961
|
+
mraid.addEventListener('exposureChange', exposureChangeListener);
|
962
|
+
} else if (window.MRAID_ENV && parseFloat(window.MRAID_ENV.version) < 3) {
|
963
|
+
if (mraid.isViewable()) {
|
964
|
+
callback();
|
868
965
|
} else {
|
869
|
-
|
966
|
+
mraid.addEventListener('viewableChange', viewableChangeListener);
|
870
967
|
}
|
968
|
+
}
|
969
|
+
}
|
871
970
|
|
872
|
-
|
971
|
+
function readyListener() {
|
972
|
+
mraid.removeEventListener('ready', readyListener);
|
973
|
+
registerViewableChecks();
|
974
|
+
}
|
975
|
+
|
976
|
+
if (window.mraid && window.MRAID_ENV) {
|
977
|
+
if (mraid.getState() == 'loading') {
|
978
|
+
mraid.addEventListener('ready', readyListener);
|
873
979
|
} else {
|
874
|
-
|
980
|
+
registerViewableChecks();
|
875
981
|
}
|
982
|
+
|
983
|
+
return true;
|
984
|
+
} else {
|
985
|
+
return false;
|
876
986
|
}
|
987
|
+
}
|
877
988
|
|
878
|
-
|
879
|
-
|
880
|
-
|
989
|
+
/***/ }),
|
990
|
+
/* 7 */
|
991
|
+
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
992
|
+
|
993
|
+
"use strict";
|
994
|
+
/* harmony export (immutable) */ __webpack_exports__["a"] = writeAdHtml;
|
995
|
+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_postscribe__ = __webpack_require__(8);
|
996
|
+
/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_postscribe___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_postscribe__);
|
997
|
+
|
998
|
+
function writeAdHtml(markup) {
|
999
|
+
var ps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : __WEBPACK_IMPORTED_MODULE_0_postscribe___default.a;
|
1000
|
+
// remove <?xml> and <!doctype> tags
|
1001
|
+
// https://github.com/prebid/prebid-universal-creative/issues/134
|
1002
|
+
markup = markup.replace(/\<(\?xml|(\!DOCTYPE[^\>\[]+(\[[^\]]+)?))+[^>]+\>/g, '');
|
1003
|
+
ps(document.body, markup, {
|
1004
|
+
error: console.error
|
1005
|
+
});
|
881
1006
|
}
|
882
1007
|
|
883
1008
|
/***/ }),
|
884
|
-
/*
|
1009
|
+
/* 8 */
|
885
1010
|
/***/ (function(module, exports, __webpack_require__) {
|
886
1011
|
|
887
1012
|
/**
|
@@ -2973,177 +3098,5 @@ return /******/ (function(modules) { // webpackBootstrap
|
|
2973
3098
|
;
|
2974
3099
|
//# sourceMappingURL=postscribe.js.map
|
2975
3100
|
|
2976
|
-
/***/ }),
|
2977
|
-
/* 5 */
|
2978
|
-
/***/ (function(module, exports, __webpack_require__) {
|
2979
|
-
|
2980
|
-
"use strict";
|
2981
|
-
|
2982
|
-
|
2983
|
-
Object.defineProperty(exports, "__esModule", {
|
2984
|
-
value: true
|
2985
|
-
});
|
2986
|
-
exports.prebidMessenger = prebidMessenger;
|
2987
|
-
|
2988
|
-
var _utils = __webpack_require__(0);
|
2989
|
-
|
2990
|
-
function prebidMessenger(publisherURL) {
|
2991
|
-
var win = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window;
|
2992
|
-
|
2993
|
-
var prebidDomain = function () {
|
2994
|
-
if (publisherURL == null) {
|
2995
|
-
return null;
|
2996
|
-
}
|
2997
|
-
|
2998
|
-
var parsedUrl = (0, _utils.parseUrl)(publisherURL);
|
2999
|
-
return parsedUrl.protocol + '://' + parsedUrl.host;
|
3000
|
-
}();
|
3001
|
-
|
3002
|
-
return function sendMessage(message, onResponse) {
|
3003
|
-
if (prebidDomain == null) {
|
3004
|
-
throw new Error('Missing pubUrl');
|
3005
|
-
}
|
3006
|
-
|
3007
|
-
message = JSON.stringify(message);
|
3008
|
-
var messagePort;
|
3009
|
-
|
3010
|
-
if (onResponse == null) {
|
3011
|
-
win.parent.postMessage(message, prebidDomain);
|
3012
|
-
} else {
|
3013
|
-
var channel = new MessageChannel();
|
3014
|
-
messagePort = channel.port1;
|
3015
|
-
messagePort.onmessage = onResponse;
|
3016
|
-
win.addEventListener('message', windowListener);
|
3017
|
-
win.parent.postMessage(message, prebidDomain, [channel.port2]);
|
3018
|
-
}
|
3019
|
-
|
3020
|
-
return function stopListening() {
|
3021
|
-
if (messagePort != null) {
|
3022
|
-
win.removeEventListener('message', windowListener);
|
3023
|
-
messagePort.onmessage = null;
|
3024
|
-
messagePort = null;
|
3025
|
-
}
|
3026
|
-
};
|
3027
|
-
|
3028
|
-
function windowListener(ev) {
|
3029
|
-
if ((ev.origin || ev.originalEvent && ev.originalEvent.origin) === prebidDomain) {
|
3030
|
-
onResponse(ev);
|
3031
|
-
}
|
3032
|
-
}
|
3033
|
-
};
|
3034
|
-
}
|
3035
|
-
|
3036
|
-
/***/ }),
|
3037
|
-
/* 6 */
|
3038
|
-
/***/ (function(module, exports, __webpack_require__) {
|
3039
|
-
|
3040
|
-
"use strict";
|
3041
|
-
|
3042
|
-
|
3043
|
-
Object.defineProperty(exports, "__esModule", {
|
3044
|
-
value: true
|
3045
|
-
});
|
3046
|
-
exports.newEnvironment = newEnvironment;
|
3047
|
-
|
3048
|
-
/***************************************
|
3049
|
-
* Detect Environment Helper Functions
|
3050
|
-
***************************************/
|
3051
|
-
|
3052
|
-
/**
|
3053
|
-
* Functions to detect below environments:
|
3054
|
-
* Amp: google Accelerate Mobile Pages ampproject.org
|
3055
|
-
* SafeFrame: SafeFrame
|
3056
|
-
* CrossDomain: An iframe that can't get to the top window
|
3057
|
-
* Mobile App: function to detect mobile app environment
|
3058
|
-
*/
|
3059
|
-
function newEnvironment(win) {
|
3060
|
-
/**
|
3061
|
-
* @param {String} uuid key value from auction, contains the cache id of the winning bid stored in prebid cache
|
3062
|
-
* @returns true if there is an AMP context object
|
3063
|
-
*/
|
3064
|
-
function isAmp(uuid) {
|
3065
|
-
// TODO Use amp context once it is available in cross domain
|
3066
|
-
// https://github.com/ampproject/amphtml/issues/6829
|
3067
|
-
return typeof uuid === 'string' && uuid !== "" && isCrossDomain();
|
3068
|
-
}
|
3069
|
-
/**
|
3070
|
-
* @returns true if the environment is a SafeFrame.
|
3071
|
-
*/
|
3072
|
-
|
3073
|
-
|
3074
|
-
function isSafeFrame() {
|
3075
|
-
return !!(win.$sf && win.$sf.ext);
|
3076
|
-
}
|
3077
|
-
/**
|
3078
|
-
* Return true if we are in an iframe and can't access the top window.
|
3079
|
-
* @returns true if the environment is a Cross Domain
|
3080
|
-
*/
|
3081
|
-
|
3082
|
-
|
3083
|
-
function isCrossDomain() {
|
3084
|
-
return win.top !== win && !canInspectWindow(win);
|
3085
|
-
}
|
3086
|
-
/**
|
3087
|
-
* Returns true if win's properties can be accessed and win is defined.
|
3088
|
-
* This functioned is used to determine if a window is cross-domained
|
3089
|
-
* from the perspective of the current window.
|
3090
|
-
* @param {!Window} win
|
3091
|
-
* @return {boolean}
|
3092
|
-
*/
|
3093
|
-
|
3094
|
-
|
3095
|
-
function canInspectWindow(win) {
|
3096
|
-
try {
|
3097
|
-
// force an exception in x-domain environments. #1509
|
3098
|
-
win.top.location.toString();
|
3099
|
-
return true;
|
3100
|
-
} catch (e) {
|
3101
|
-
return false;
|
3102
|
-
}
|
3103
|
-
}
|
3104
|
-
/**
|
3105
|
-
* Returns true if we can find the prebid global object (eg pbjs) as we
|
3106
|
-
* climb the accessible windows. Return false if it's not found.
|
3107
|
-
* @returns {boolean}
|
3108
|
-
*/
|
3109
|
-
|
3110
|
-
|
3111
|
-
function canLocatePrebid() {
|
3112
|
-
var result = false;
|
3113
|
-
var currentWindow = win;
|
3114
|
-
|
3115
|
-
while (!result) {
|
3116
|
-
try {
|
3117
|
-
if (currentWindow.pbjs) {
|
3118
|
-
result = true;
|
3119
|
-
break;
|
3120
|
-
}
|
3121
|
-
} catch (e) {}
|
3122
|
-
|
3123
|
-
if (currentWindow === window.top) break;
|
3124
|
-
currentWindow = currentWindow.parent;
|
3125
|
-
}
|
3126
|
-
|
3127
|
-
return result;
|
3128
|
-
}
|
3129
|
-
/**
|
3130
|
-
* @param {String} env key value from auction, indicates the environment where tag is served
|
3131
|
-
* @returns true if env exists and is equal to the string 'mobile-app'
|
3132
|
-
*/
|
3133
|
-
|
3134
|
-
|
3135
|
-
function isMobileApp(env) {
|
3136
|
-
return env && env === 'mobile-app';
|
3137
|
-
}
|
3138
|
-
|
3139
|
-
return {
|
3140
|
-
isMobileApp: isMobileApp,
|
3141
|
-
isCrossDomain: isCrossDomain,
|
3142
|
-
isSafeFrame: isSafeFrame,
|
3143
|
-
isAmp: isAmp,
|
3144
|
-
canLocatePrebid: canLocatePrebid
|
3145
|
-
};
|
3146
|
-
}
|
3147
|
-
|
3148
3101
|
/***/ })
|
3149
3102
|
/******/ ]);
|