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.
Files changed (41) hide show
  1. package/.babelrc +1 -2
  2. package/.github/workflows/issue_tracker.yml +31 -16
  3. package/README.md +21 -3
  4. package/dist/amp.js +3 -0
  5. package/dist/banner.js +3 -0
  6. package/dist/creative.js +4 -3
  7. package/dist/creative.max.js +546 -593
  8. package/dist/load-cookie-with-consent.html +1 -1
  9. package/dist/load-cookie.html +1 -1
  10. package/dist/mobile.js +3 -0
  11. package/dist/native-render.js +3 -3
  12. package/dist/native-trk.js +3 -3
  13. package/dist/native.js +3 -0
  14. package/dist/uid.js +3 -3
  15. package/dist/video.js +3 -0
  16. package/gulpfile.js +84 -45
  17. package/karma.conf.maker.js +4 -6
  18. package/package.json +80 -82
  19. package/src/ampOrMobile.js +14 -0
  20. package/src/creative.js +2 -9
  21. package/src/environment.js +62 -75
  22. package/src/legacy.js +29 -0
  23. package/src/legacyNativeRender.js +6 -0
  24. package/src/mobileAndAmpRender.js +239 -0
  25. package/src/nativeAssetManager.js +91 -57
  26. package/src/nativeORTBTrackerManager.js +2 -2
  27. package/src/nativeRender.js +2 -2
  28. package/src/nativeRenderManager.js +46 -69
  29. package/src/postscribeRender.js +10 -0
  30. package/src/renderingManager.js +106 -358
  31. package/src/utils.js +1 -11
  32. package/template/amp/dfp-creative.html +1 -1
  33. package/test/spec/environment_spec.js +4 -11
  34. package/test/spec/legacyNativeRender_spec.js +25 -0
  35. package/test/spec/mobileAndAmpRender_spec.js +316 -0
  36. package/test/spec/nativeAssetManager_spec.js +227 -79
  37. package/test/spec/nativeORTBTrackerManager_spec.js +3 -19
  38. package/test/spec/nativeRenderManager_spec.js +77 -55
  39. package/test/spec/nativeRender_spec.js +23 -0
  40. package/test/spec/renderingManager_spec.js +16 -265
  41. package/webpack.conf.js +3 -1
@@ -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 = 2);
63
+ /******/ return __webpack_require__(__webpack_require__.s = 3);
64
64
  /******/ })
65
65
  /************************************************************************/
66
66
  /******/ ([
67
67
  /* 0 */
68
- /***/ (function(module, exports, __webpack_require__) {
68
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
69
69
 
70
70
  "use strict";
71
-
72
-
73
- Object.defineProperty(exports, "__esModule", {
74
- value: true
75
- });
76
- exports.triggerPixel = triggerPixel;
77
- exports.createTrackPixelHtml = createTrackPixelHtml;
78
- exports.writeAdUrl = writeAdUrl;
79
- exports.writeAdHtml = writeAdHtml;
80
- exports.sendRequest = sendRequest;
81
- exports.getUUID = getUUID;
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 = domHelper.getEmptyIframe(height, width);
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 = exports.getCreativeComment(bid);
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, exports, __webpack_require__) {
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, exports, __webpack_require__) {
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
- var _renderingManager = __webpack_require__(3);
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
- var _environment = __webpack_require__(6);
457
+ if (currentWindow === window.top) break;
458
+ currentWindow = currentWindow.parent;
459
+ }
423
460
 
461
+ return result;
462
+ }
424
463
  /**
425
- * creative.js
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
- window.ucTag = window.ucTag || {};
435
- var environment = (0, _environment.newEnvironment)(window);
436
- var renderCreative = (0, _renderingManager.newRenderingManager)(window, environment);
437
- window.ucTag.renderAd = renderCreative.renderAd;
467
+
468
+ function isMobileApp(env) {
469
+ return env && env === 'mobile-app';
470
+ }
438
471
 
439
472
  /***/ }),
440
473
  /* 3 */
441
- /***/ (function(module, exports, __webpack_require__) {
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
- var domHelper = _interopRequireWildcard(__webpack_require__(1));
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
- var _messaging = __webpack_require__(5);
510
+ /***/ }),
511
+ /* 4 */
512
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
456
513
 
457
- function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
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
- * Public render ad function to be used in dfp creative setup
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
- function renderLegacy(doc, adId) {
508
- var w = win;
541
+ function renderLegacy(doc, adId) {
542
+ var found = false;
543
+ var w = window;
509
544
 
510
- for (var i = 0; i < 10; i++) {
511
- w = w.parent;
545
+ for (var i = 0; i < 10; i++) {
546
+ w = w.parent;
512
547
 
513
- if (w.pbjs) {
514
- try {
515
- w.pbjs.renderAd(doc, adId);
516
- break;
517
- } catch (e) {
518
- continue;
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
- function renderCrossDomain(adId) {
532
- var pubAdServerDomain = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
533
- var pubUrl = arguments.length > 2 ? arguments[2] : undefined;
534
- var windowLocation = win.location;
535
- var adServerDomain = pubAdServerDomain || win.location.hostname;
536
- var fullAdServerDomain = windowLocation.protocol + '//' + adServerDomain;
537
- var sendMessage = (0, _messaging.prebidMessenger)(pubUrl, win);
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
- function renderAd(ev) {
540
- var key = ev.message ? 'message' : 'data';
541
- var adObject = {};
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
- adObject = JSON.parse(ev[key]);
545
- } catch (e) {
546
- return;
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
- if (adObject.message && adObject.message === 'Prebid Response' && adObject.adId === adId) {
550
- try {
551
- var body = win.document.body;
552
- var ad = adObject.ad;
553
- var url = adObject.adUrl;
554
- var width = adObject.width;
555
- var height = adObject.height;
556
-
557
- if (adObject.mediaType === 'video') {
558
- signalRenderResult(false, {
559
- reason: 'preventWritingOnMainDocument',
560
- message: "Cannot render video ad ".concat(adId)
561
- });
562
- console.log('Error trying to write ad.');
563
- } else if (ad) {
564
- var iframe = domHelper.getEmptyIframe(adObject.height, adObject.width);
565
- body.appendChild(iframe);
566
- iframe.contentDocument.open();
567
- iframe.contentDocument.write(ad);
568
- iframe.contentDocument.close();
569
- signalRenderResult(true);
570
- } else if (url) {
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: "exception",
588
- message: e.message
619
+ reason: "noAd",
620
+ message: "No ad for ".concat(adId)
589
621
  });
590
- console.log("Error in rendering ad", e);
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
- function signalRenderResult(success) {
595
- var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
596
- reason = _ref.reason,
597
- message = _ref.message;
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
- if (!success) {
606
- payload.info = {
607
- reason: reason,
608
- message: message
609
- };
610
- }
638
+ var payload = {
639
+ message: "Prebid Event",
640
+ adId: adId,
641
+ event: success ? "adRenderSucceeded" : "adRenderFailed"
642
+ };
611
643
 
612
- sendMessage(payload);
644
+ if (!success) {
645
+ payload.info = {
646
+ reason: reason,
647
+ message: message
648
+ };
613
649
  }
614
- }
615
650
 
616
- function requestAdFromPrebid() {
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
- requestAdFromPrebid();
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
- function getCacheEndpoint(cacheHost, cachePath) {
635
- var host = typeof cacheHost === 'undefined' || cacheHost === "" ? DEFAULT_CACHE_HOST : cacheHost;
636
- var path = typeof cachePath === 'undefined' || cachePath === "" ? DEFAULT_CACHE_PATH : cachePath;
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
- function updateIframe(size) {
646
- if (size) {
647
- var sizeArr = size.split('x').map(Number);
648
- resizeIframe(sizeArr[0], sizeArr[1]);
649
- } else {
650
- console.log('Targeting key hb_size not found to resize creative');
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 renderAmpOrMobileAd(cacheHost, cachePath) {
665
- var uuid = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
666
- var size = arguments.length > 3 ? arguments[3] : undefined;
667
- var hbPb = arguments.length > 4 ? arguments[4] : undefined;
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
- if (uuid.substr(0, search.length) === search) {
673
- loadFromLocalCache(uuid); //register creative right away to not miss initial geom-update
692
+ message = JSON.stringify(message);
693
+ var messagePort;
674
694
 
675
- updateIframe(size);
695
+ if (onResponse == null) {
696
+ win.parent.postMessage(message, prebidDomain);
676
697
  } else {
677
- var adUrl = "".concat(getCacheEndpoint(cacheHost, cachePath), "?uuid=").concat(uuid); //register creative right away to not miss initial geom-update
678
-
679
- updateIframe(size);
680
- utils.sendRequest(adUrl, responseCallback(isMobileApp, hbPb));
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
- function responseCallback(isMobileApp, hbPb) {
692
- return function (response) {
693
- var bidObject = parseResponse(response);
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
- if (bidObject.adm) {
704
- if (auctionPrice) {
705
- // replace ${AUCTION_PRICE} macro with the bidObject.price or hb_pb.
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
- ad += isMobileApp ? constructMarkup(bidObject.adm, width, height) : bidObject.adm;
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
- * Load response from localStorage. In case of MoPub, sdk caches response
759
- * @param {string} cacheId
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
- function loadFromLocalCache(cacheId) {
763
- var bid = win.localStorage.getItem(cacheId);
764
- var displayFn = responseCallback(true);
765
- displayFn(bid);
766
- }
767
- /**
768
- * Parse response
769
- * @param {string} response
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
- function parseResponse(response) {
775
- var bidObject;
758
+ if (uuid.substr(0, search.length) === search) {
759
+ loadFromLocalCache(uuid); //register creative right away to not miss initial geom-update
776
760
 
777
- try {
778
- bidObject = JSON.parse(response);
779
- } catch (error) {
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
- return bidObject;
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
- * Wrap mobile app creative in div
787
- * @param {string} ad html for creative
788
- * @param {Number} width width of creative
789
- * @param {Number} height height of creative
790
- * @returns {string} creative markup
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
- function constructMarkup(ad, width, height) {
795
- var id = utils.getUUID();
796
- 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>");
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
- * Resize container iframe
800
- * @param {Number} width width of creative
801
- * @param {Number} height height of creative
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
- function resizeIframe(width, height) {
806
- if (environment.isSafeFrame()) {
807
- var resize = function resize(status) {
808
- var newWidth = width - iframeWidth;
809
- var newHeight = height - iframeHeight;
810
- win.$sf.ext.expand({
811
- r: newWidth,
812
- b: newHeight,
813
- push: true
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
- var iframeWidth = win.innerWidth;
818
- var iframeHeight = win.innerHeight;
812
+ var iframeWidth = window.innerWidth;
813
+ var iframeHeight = window.innerHeight;
819
814
 
820
- if (iframeWidth !== width || iframeHeight !== height) {
821
- win.$sf.ext.register(width, height, resize); // we need to resize the DFP container as well
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
- win.parent.postMessage({
824
- sentinel: 'amp',
825
- type: 'embed-size',
826
- width: width,
827
- height: height
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
- function registerMRAIDViewableEvent(callback) {
834
- function exposureChangeListener(exposure) {
835
- if (exposure > 0) {
836
- mraid.removeEventListener('exposureChange', exposureChangeListener);
837
- callback();
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
- function viewableChangeListener(viewable) {
842
- if (viewable) {
843
- mraid.removeEventListener('viewableChange', viewableChangeListener);
844
- callback();
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
- function registerViewableChecks() {
849
- if (win.MRAID_ENV && parseFloat(win.MRAID_ENV.version) >= 3) {
850
- mraid.addEventListener('exposureChange', exposureChangeListener);
851
- } else if (win.MRAID_ENV && parseFloat(win.MRAID_ENV.version) < 3) {
852
- if (mraid.isViewable()) {
853
- callback();
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
- mraid.addEventListener('viewableChange', viewableChangeListener);
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
- function readyListener() {
861
- mraid.removeEventListener('ready', readyListener);
862
- registerViewableChecks();
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
- if (win.mraid && win.MRAID_ENV) {
866
- if (mraid.getState() == 'loading') {
867
- mraid.addEventListener('ready', readyListener);
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
- registerViewableChecks();
966
+ mraid.addEventListener('viewableChange', viewableChangeListener);
870
967
  }
968
+ }
969
+ }
871
970
 
872
- return true;
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
- return false;
980
+ registerViewableChecks();
875
981
  }
982
+
983
+ return true;
984
+ } else {
985
+ return false;
876
986
  }
987
+ }
877
988
 
878
- return {
879
- renderAd: renderAd
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
- /* 4 */
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
  /******/ ]);