prebid-universal-creative 1.12.0 → 1.14.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.
@@ -60,7 +60,7 @@
60
60
  /******/ __webpack_require__.p = "";
61
61
  /******/
62
62
  /******/ // Load entry module and return exports
63
- /******/ return __webpack_require__(__webpack_require__.s = 1);
63
+ /******/ return __webpack_require__(__webpack_require__.s = 2);
64
64
  /******/ })
65
65
  /************************************************************************/
66
66
  /******/ ([
@@ -70,6 +70,289 @@
70
70
  "use strict";
71
71
 
72
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);
95
+
96
+ /**
97
+ * Inserts an image pixel with the specified `url` for cookie sync
98
+ * @param {string} url URL string of the image pixel to load
99
+ * @param {function} [done] an optional exit callback, used when this usersync pixel is added during an async process
100
+ */
101
+ function triggerPixel(url, done) {
102
+ var img = new Image();
103
+
104
+ if (done && typeof done === 'function') {
105
+ img.addEventListener('load', done);
106
+ img.addEventListener('error', done);
107
+ }
108
+
109
+ img.src = url;
110
+ }
111
+
112
+ function createTrackPixelHtml(url) {
113
+ if (!url) {
114
+ return '';
115
+ }
116
+
117
+ var escapedUrl = encodeURI(url);
118
+ var img = "<div style=\"position:absolute;left:0px;top:0px;visibility:hidden;\"><img src=\"".concat(escapedUrl, "\"></div>");
119
+ return img;
120
+ }
121
+
122
+ function writeAdUrl(adUrl, width, height) {
123
+ var iframe = domHelper.getEmptyIframe(height, width);
124
+ iframe.src = adUrl;
125
+ document.body.appendChild(iframe);
126
+ }
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
+ function sendRequest(url, callback) {
138
+ function reqListener() {
139
+ callback(oReq.responseText);
140
+ }
141
+
142
+ var oReq = new XMLHttpRequest();
143
+ oReq.addEventListener('load', reqListener);
144
+ oReq.open('GET', url);
145
+ oReq.send();
146
+ }
147
+
148
+ function getUUID() {
149
+ var d = new Date().getTime();
150
+ var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
151
+ var r = (d + Math.random() * 16) % 16 | 0;
152
+ d = Math.floor(d / 16);
153
+ return (c === 'x' ? r : r & 0x3 | 0x8).toString(16);
154
+ });
155
+ return uuid;
156
+ }
157
+
158
+ ;
159
+
160
+ function loadScript(currentWindow, tagSrc, successCallback, errorCallback) {
161
+ var doc = currentWindow.document;
162
+ var scriptTag = doc.createElement('script');
163
+ scriptTag.type = 'text/javascript'; // Execute success callback if necessary
164
+
165
+ if (successCallback && typeof successCallback === 'function') {
166
+ if (scriptTag.readyState) {
167
+ scriptTag.onreadystatechange = function () {
168
+ if (scriptTag.readyState === 'loaded' || scriptTag.readyState === 'complete') {
169
+ scriptTag.onreadystatechange = null;
170
+ successCallback();
171
+ }
172
+ };
173
+ } else {
174
+ scriptTag.onload = function () {
175
+ successCallback();
176
+ };
177
+ }
178
+ } // Execute error callback if necessary
179
+
180
+
181
+ if (errorCallback && typeof errorCallback === 'function') {
182
+ scriptTag.onerror = function () {
183
+ errorCallback();
184
+ };
185
+ }
186
+
187
+ scriptTag.src = tagSrc; //add the new script tag to the page
188
+
189
+ var elToAppend = doc.getElementsByTagName('head');
190
+ elToAppend = elToAppend.length ? elToAppend : doc.getElementsByTagName('body');
191
+
192
+ if (elToAppend.length) {
193
+ elToAppend = elToAppend[0];
194
+ elToAppend.insertBefore(scriptTag, elToAppend.firstChild);
195
+ }
196
+
197
+ return scriptTag;
198
+ }
199
+
200
+ ;
201
+ /**
202
+ * Return comment element
203
+ * @param {*} bid
204
+ */
205
+
206
+ function getCreativeComment(bid) {
207
+ return document.createComment("Creative ".concat(bid.crid, " served by Prebid.js Header Bidding"));
208
+ }
209
+ /**
210
+ * Returns comment element markup
211
+ * @param {*} bid
212
+ */
213
+
214
+
215
+ function getCreativeCommentMarkup(bid) {
216
+ var creativeComment = exports.getCreativeComment(bid);
217
+ var wrapper = document.createElement('div');
218
+ wrapper.appendChild(creativeComment);
219
+ return wrapper.innerHTML;
220
+ }
221
+
222
+ function transformAuctionTargetingData(tagData) {
223
+ // this map object translates the Prebid.js auction keys to their equivalent Prebid Universal Creative keys
224
+ // when the publisher uses their adserver's generic macro that provides all targeting keys (ie tagData.targetingMap), we need to convert the keys
225
+ var auctionKeyMap = {
226
+ hb_adid: 'adId',
227
+ hb_cache_host: 'cacheHost',
228
+ hb_cache_path: 'cachePath',
229
+ hb_cache_id: 'uuid',
230
+ hb_format: 'mediaType',
231
+ hb_env: 'env',
232
+ hb_size: 'size',
233
+ hb_pb: 'hbPb'
234
+ };
235
+ /**
236
+ * Determine if the supplied property of the tagData object exists and is populated with its own values/properties according to its type
237
+ * @param {string} paramName name of the property to check (eg tagData.targetingMap)
238
+ * @returns true/false
239
+ */
240
+
241
+ function isMacroPresent(paramName) {
242
+ return !!(tagData[paramName] && (isPlainObject(tagData[paramName]) && Object.keys(tagData[paramName]).length > 0 || isStr(tagData[paramName]) && tagData[paramName] !== ''));
243
+ }
244
+ /**
245
+ * Converts the specifically formatted object of keypairs to a more generalized structure
246
+ * It specifically extracts the keyvalue from an array and stores it as a normal string
247
+ * @param {object} tarMap object of keys with the keyvalue stored in an array; eg {"hb_adid":["26566ee8c7f251"], ...}
248
+ * @returns {object} result is an object map like the following: {"hb_cache_id":"123456", "other_key":"other_value", ...}
249
+ */
250
+
251
+
252
+ function convertTargetingMapToNormalMap(tarMap) {
253
+ var newTarMap = {};
254
+ Object.keys(tarMap).forEach(function (key) {
255
+ if (Array.isArray(tarMap[key]) && tarMap[key].length > 0) {
256
+ newTarMap[key] = tarMap[key][0];
257
+ }
258
+ });
259
+ return newTarMap;
260
+ }
261
+ /**
262
+ * Converts a specifically formatted string of keypairs to a specifically formatted object map
263
+ * @param {String} keywordsStr string of keypairs; eg "hb_cache_id:123456,other_key:other_value"
264
+ * @returns {object} result is an object map like the following: {"hb_cache_id":"123456", "other_key":"other_value", ...}
265
+ */
266
+
267
+
268
+ function convertKeyPairStringToMap(keywordsStr) {
269
+ var keywordsMap = {};
270
+ var keywordsArr = keywordsStr.split(',');
271
+
272
+ if (keywordsArr.length > 0) {
273
+ keywordsArr.forEach(function (keyPairStr) {
274
+ var keyPairArr = keyPairStr.split(':');
275
+
276
+ if (keyPairArr.length === 2) {
277
+ var k = keyPairArr[0];
278
+ var v = keyPairArr[1];
279
+ keywordsMap[k] = v;
280
+ }
281
+ });
282
+ }
283
+
284
+ return keywordsMap;
285
+ }
286
+ /**
287
+ * Rename key if it's part of the auctionKeyMap object; if not, leave key as is
288
+ * Store the resultant keypair in the auctionData object for later use in renderingManager.renderAd()
289
+ * @param {object} adServerKeyMap incoming object map of the auction keys from the UC tag; eg {'key1':'value1', 'key2':'value2', ...}
290
+ */
291
+
292
+
293
+ function renameKnownAuctionKeys(adServerKeyMap) {
294
+ Object.keys(adServerKeyMap).forEach(function (key) {
295
+ var internalKey = auctionKeyMap[key] || key;
296
+ auctionData[internalKey] = adServerKeyMap[key];
297
+ });
298
+ }
299
+
300
+ var auctionData = {};
301
+ var formattedKeyMap = {};
302
+
303
+ if (isMacroPresent('targetingMap')) {
304
+ formattedKeyMap = convertTargetingMapToNormalMap(tagData.targetingMap);
305
+ } else if (isMacroPresent('targetingKeywords')) {
306
+ formattedKeyMap = convertKeyPairStringToMap(tagData.targetingKeywords);
307
+ }
308
+
309
+ renameKnownAuctionKeys(formattedKeyMap); // set keys not in defined map macros (eg targetingMap) and/or the keys setup within a non-DFP adserver
310
+
311
+ Object.keys(tagData).forEach(function (key) {
312
+ if (key !== 'targetingMap' && key !== 'targetingKeywords' && isStr(tagData[key]) && tagData[key] !== '') {
313
+ auctionData[key] = tagData[key];
314
+ }
315
+ });
316
+ return auctionData;
317
+ }
318
+
319
+ function parseUrl(url) {
320
+ var parsed = document.createElement('a');
321
+ parsed.href = decodeURIComponent(url);
322
+ return {
323
+ href: parsed.href,
324
+ protocol: (parsed.protocol || '').replace(/:$/, ''),
325
+ hostname: parsed.hostname,
326
+ port: +parsed.port,
327
+ pathname: parsed.pathname.replace(/^(?!\/)/, '/'),
328
+ hash: (parsed.hash || '').replace(/^#/, ''),
329
+ host: (parsed.host || window.location.host).replace(/:(443|80)$/, '')
330
+ };
331
+ }
332
+
333
+ function isA(object, _t) {
334
+ return Object.prototype.toString.call(object) === '[object ' + _t + ']';
335
+ }
336
+
337
+ ;
338
+
339
+ function isPlainObject(object) {
340
+ return isA(object, 'Object');
341
+ }
342
+
343
+ function isStr(object) {
344
+ return isA(object, 'String');
345
+ }
346
+
347
+ ;
348
+
349
+ /***/ }),
350
+ /* 1 */
351
+ /***/ (function(module, exports, __webpack_require__) {
352
+
353
+ "use strict";
354
+
355
+
73
356
  Object.defineProperty(exports, "__esModule", {
74
357
  value: true
75
358
  });
@@ -128,15 +411,15 @@ function insertElement(elm, doc, target) {
128
411
  }
129
412
 
130
413
  /***/ }),
131
- /* 1 */
414
+ /* 2 */
132
415
  /***/ (function(module, exports, __webpack_require__) {
133
416
 
134
417
  "use strict";
135
418
 
136
419
 
137
- var _renderingManager = __webpack_require__(2);
420
+ var _renderingManager = __webpack_require__(3);
138
421
 
139
- var _environment = __webpack_require__(5);
422
+ var _environment = __webpack_require__(6);
140
423
 
141
424
  /**
142
425
  * creative.js
@@ -154,7 +437,7 @@ var renderCreative = (0, _renderingManager.newRenderingManager)(window, environm
154
437
  window.ucTag.renderAd = renderCreative.renderAd;
155
438
 
156
439
  /***/ }),
157
- /* 2 */
440
+ /* 3 */
158
441
  /***/ (function(module, exports, __webpack_require__) {
159
442
 
160
443
  "use strict";
@@ -165,9 +448,11 @@ Object.defineProperty(exports, "__esModule", {
165
448
  });
166
449
  exports.newRenderingManager = newRenderingManager;
167
450
 
168
- var utils = _interopRequireWildcard(__webpack_require__(3));
451
+ var utils = _interopRequireWildcard(__webpack_require__(0));
452
+
453
+ var domHelper = _interopRequireWildcard(__webpack_require__(1));
169
454
 
170
- var domHelper = _interopRequireWildcard(__webpack_require__(0));
455
+ var _messaging = __webpack_require__(5);
171
456
 
172
457
  function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
173
458
 
@@ -247,10 +532,9 @@ function newRenderingManager(win, environment) {
247
532
  var pubAdServerDomain = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
248
533
  var pubUrl = arguments.length > 2 ? arguments[2] : undefined;
249
534
  var windowLocation = win.location;
250
- var parsedUrl = utils.parseUrl(pubUrl);
251
- var publisherDomain = parsedUrl.protocol + '://' + parsedUrl.host;
252
535
  var adServerDomain = pubAdServerDomain || win.location.hostname;
253
536
  var fullAdServerDomain = windowLocation.protocol + '//' + adServerDomain;
537
+ var sendMessage = (0, _messaging.prebidMessenger)(pubUrl, win);
254
538
 
255
539
  function renderAd(ev) {
256
540
  var key = ev.message ? 'message' : 'data';
@@ -262,50 +546,82 @@ function newRenderingManager(win, environment) {
262
546
  return;
263
547
  }
264
548
 
265
- var origin = ev.origin || ev.originalEvent.origin;
266
-
267
- if (adObject.message && adObject.message === 'Prebid Response' && publisherDomain === origin && adObject.adId === adId && (adObject.ad || adObject.adUrl)) {
268
- var body = win.document.body;
269
- var ad = adObject.ad;
270
- var url = adObject.adUrl;
271
- var width = adObject.width;
272
- var height = adObject.height;
273
-
274
- if (adObject.mediaType === 'video') {
275
- console.log('Error trying to write ad.');
276
- } else if (ad) {
277
- var iframe = domHelper.getEmptyIframe(adObject.height, adObject.width);
278
- body.appendChild(iframe);
279
- iframe.contentDocument.open();
280
- iframe.contentDocument.write(ad);
281
- iframe.contentDocument.close();
282
- } else if (url) {
283
- var _iframe = domHelper.getEmptyIframe(height, width);
284
-
285
- _iframe.style.display = 'inline';
286
- _iframe.style.overflow = 'hidden';
287
- _iframe.src = url;
288
- domHelper.insertElement(_iframe, document, 'body');
289
- } else {
290
- console.log("Error trying to write ad. No ad for bid response id: ".concat(id));
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) {
586
+ signalRenderResult(false, {
587
+ reason: "exception",
588
+ message: e.message
589
+ });
590
+ console.log("Error in rendering ad", e);
591
+ }
592
+ }
593
+
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
+ };
604
+
605
+ if (!success) {
606
+ payload.info = {
607
+ reason: reason,
608
+ message: message
609
+ };
291
610
  }
611
+
612
+ sendMessage(payload);
292
613
  }
293
614
  }
294
615
 
295
616
  function requestAdFromPrebid() {
296
- var message = JSON.stringify({
617
+ var message = {
297
618
  message: 'Prebid Request',
298
619
  adId: adId,
299
620
  adServerDomain: fullAdServerDomain
300
- });
301
- win.parent.postMessage(message, publisherDomain);
302
- }
303
-
304
- function listenAdFromPrebid() {
305
- win.addEventListener('message', renderAd, false);
621
+ };
622
+ sendMessage(message, renderAd);
306
623
  }
307
624
 
308
- listenAdFromPrebid();
309
625
  requestAdFromPrebid();
310
626
  }
311
627
  /**
@@ -432,418 +748,138 @@ function newRenderingManager(win, environment) {
432
748
  var commentElm = utils.getCreativeComment(bidObject);
433
749
  domHelper.insertElement(commentElm, document, 'body');
434
750
  utils.writeAdUrl(nurl, width, height);
435
- }
436
- }
437
- };
438
- }
439
-
440
- ;
441
- /**
442
- * Load response from localStorage. In case of MoPub, sdk caches response
443
- * @param {string} cacheId
444
- */
445
-
446
- function loadFromLocalCache(cacheId) {
447
- var bid = win.localStorage.getItem(cacheId);
448
- var displayFn = responseCallback(true);
449
- displayFn(bid);
450
- }
451
- /**
452
- * Parse response
453
- * @param {string} response
454
- * @returns {Object} bidObject parsed response
455
- */
456
-
457
-
458
- function parseResponse(response) {
459
- var bidObject;
460
-
461
- try {
462
- bidObject = JSON.parse(response);
463
- } catch (error) {
464
- console.log("Error parsing response from cache host: ".concat(error));
465
- }
466
-
467
- return bidObject;
468
- }
469
- /**
470
- * Wrap mobile app creative in div
471
- * @param {string} ad html for creative
472
- * @param {Number} width width of creative
473
- * @param {Number} height height of creative
474
- * @returns {string} creative markup
475
- */
476
-
477
-
478
- function constructMarkup(ad, width, height) {
479
- var id = utils.getUUID();
480
- 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>");
481
- }
482
- /**
483
- * Resize container iframe
484
- * @param {Number} width width of creative
485
- * @param {Number} height height of creative
486
- */
487
-
488
-
489
- function resizeIframe(width, height) {
490
- if (environment.isSafeFrame()) {
491
- var resize = function resize(status) {
492
- var newWidth = width - iframeWidth;
493
- var newHeight = height - iframeHeight;
494
- win.$sf.ext.expand({
495
- r: newWidth,
496
- b: newHeight,
497
- push: true
498
- });
499
- };
500
-
501
- var iframeWidth = win.innerWidth;
502
- var iframeHeight = win.innerHeight;
503
-
504
- if (iframeWidth !== width || iframeHeight !== height) {
505
- win.$sf.ext.register(width, height, resize); // we need to resize the DFP container as well
506
-
507
- win.parent.postMessage({
508
- sentinel: 'amp',
509
- type: 'embed-size',
510
- width: width,
511
- height: height
512
- }, '*');
513
- }
514
- }
515
- }
516
-
517
- function registerMRAIDViewableEvent(callback) {
518
- function exposureChangeListener(exposure) {
519
- if (exposure > 0) {
520
- mraid.removeEventListener('exposureChange', exposureChangeListener);
521
- callback();
522
- }
523
- }
524
-
525
- function viewableChangeListener(viewable) {
526
- if (viewable) {
527
- mraid.removeEventListener('viewableChange', viewableChangeListener);
528
- callback();
529
- }
530
- }
531
-
532
- function registerViewableChecks() {
533
- if (win.MRAID_ENV && parseFloat(win.MRAID_ENV.version) >= 3) {
534
- mraid.addEventListener('exposureChange', exposureChangeListener);
535
- } else if (win.MRAID_ENV && parseFloat(win.MRAID_ENV.version) < 3) {
536
- if (mraid.isViewable()) {
537
- callback();
538
- } else {
539
- mraid.addEventListener('viewableChange', viewableChangeListener);
540
- }
541
- }
542
- }
543
-
544
- function readyListener() {
545
- mraid.removeEventListener('ready', readyListener);
546
- registerViewableChecks();
547
- }
548
-
549
- if (win.mraid && win.MRAID_ENV) {
550
- if (mraid.getState() == 'loading') {
551
- mraid.addEventListener('ready', readyListener);
552
- } else {
553
- registerViewableChecks();
554
- }
555
-
556
- return true;
557
- } else {
558
- return false;
559
- }
560
- }
561
-
562
- return {
563
- renderAd: renderAd
564
- };
565
- }
566
-
567
- /***/ }),
568
- /* 3 */
569
- /***/ (function(module, exports, __webpack_require__) {
570
-
571
- "use strict";
572
-
573
-
574
- Object.defineProperty(exports, "__esModule", {
575
- value: true
576
- });
577
- exports.triggerPixel = triggerPixel;
578
- exports.createTrackPixelHtml = createTrackPixelHtml;
579
- exports.writeAdUrl = writeAdUrl;
580
- exports.writeAdHtml = writeAdHtml;
581
- exports.sendRequest = sendRequest;
582
- exports.getUUID = getUUID;
583
- exports.loadScript = loadScript;
584
- exports.getCreativeComment = getCreativeComment;
585
- exports.getCreativeCommentMarkup = getCreativeCommentMarkup;
586
- exports.transformAuctionTargetingData = transformAuctionTargetingData;
587
- exports.parseUrl = parseUrl;
588
-
589
- var domHelper = _interopRequireWildcard(__webpack_require__(0));
590
-
591
- function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
592
-
593
- 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; }
594
-
595
- var postscribe = __webpack_require__(4);
596
-
597
- /**
598
- * Inserts an image pixel with the specified `url` for cookie sync
599
- * @param {string} url URL string of the image pixel to load
600
- * @param {function} [done] an optional exit callback, used when this usersync pixel is added during an async process
601
- */
602
- function triggerPixel(url, done) {
603
- var img = new Image();
604
-
605
- if (done && typeof done === 'function') {
606
- img.addEventListener('load', done);
607
- img.addEventListener('error', done);
608
- }
609
-
610
- img.src = url;
611
- }
612
-
613
- function createTrackPixelHtml(url) {
614
- if (!url) {
615
- return '';
616
- }
617
-
618
- var escapedUrl = encodeURI(url);
619
- var img = "<div style=\"position:absolute;left:0px;top:0px;visibility:hidden;\"><img src=\"".concat(escapedUrl, "\"></div>");
620
- return img;
621
- }
622
-
623
- function writeAdUrl(adUrl, width, height) {
624
- var iframe = domHelper.getEmptyIframe(height, width);
625
- iframe.src = adUrl;
626
- document.body.appendChild(iframe);
627
- }
628
-
629
- function writeAdHtml(markup) {
630
- postscribe(document.body, markup, {
631
- error: console.error
632
- });
633
- }
634
-
635
- function sendRequest(url, callback) {
636
- function reqListener() {
637
- callback(oReq.responseText);
638
- }
639
-
640
- var oReq = new XMLHttpRequest();
641
- oReq.addEventListener('load', reqListener);
642
- oReq.open('GET', url);
643
- oReq.send();
644
- }
645
-
646
- function getUUID() {
647
- var d = new Date().getTime();
648
- var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
649
- var r = (d + Math.random() * 16) % 16 | 0;
650
- d = Math.floor(d / 16);
651
- return (c === 'x' ? r : r & 0x3 | 0x8).toString(16);
652
- });
653
- return uuid;
654
- }
655
-
656
- ;
657
-
658
- function loadScript(currentWindow, tagSrc, successCallback, errorCallback) {
659
- var doc = currentWindow.document;
660
- var scriptTag = doc.createElement('script');
661
- scriptTag.type = 'text/javascript'; // Execute success callback if necessary
662
-
663
- if (successCallback && typeof successCallback === 'function') {
664
- if (scriptTag.readyState) {
665
- scriptTag.onreadystatechange = function () {
666
- if (scriptTag.readyState === 'loaded' || scriptTag.readyState === 'complete') {
667
- scriptTag.onreadystatechange = null;
668
- successCallback();
669
- }
670
- };
671
- } else {
672
- scriptTag.onload = function () {
673
- successCallback();
674
- };
675
- }
676
- } // Execute error callback if necessary
677
-
678
-
679
- if (errorCallback && typeof errorCallback === 'function') {
680
- scriptTag.onerror = function () {
681
- errorCallback();
751
+ }
752
+ }
682
753
  };
683
754
  }
684
755
 
685
- scriptTag.src = tagSrc; //add the new script tag to the page
686
-
687
- var elToAppend = doc.getElementsByTagName('head');
688
- elToAppend = elToAppend.length ? elToAppend : doc.getElementsByTagName('body');
756
+ ;
757
+ /**
758
+ * Load response from localStorage. In case of MoPub, sdk caches response
759
+ * @param {string} cacheId
760
+ */
689
761
 
690
- if (elToAppend.length) {
691
- elToAppend = elToAppend[0];
692
- elToAppend.insertBefore(scriptTag, elToAppend.firstChild);
762
+ function loadFromLocalCache(cacheId) {
763
+ var bid = win.localStorage.getItem(cacheId);
764
+ var displayFn = responseCallback(true);
765
+ displayFn(bid);
693
766
  }
694
-
695
- return scriptTag;
696
- }
697
-
698
- ;
699
- /**
700
- * Return comment element
701
- * @param {*} bid
702
- */
703
-
704
- function getCreativeComment(bid) {
705
- return document.createComment("Creative ".concat(bid.crid, " served by Prebid.js Header Bidding"));
706
- }
707
- /**
708
- * Returns comment element markup
709
- * @param {*} bid
710
- */
767
+ /**
768
+ * Parse response
769
+ * @param {string} response
770
+ * @returns {Object} bidObject parsed response
771
+ */
711
772
 
712
773
 
713
- function getCreativeCommentMarkup(bid) {
714
- var creativeComment = exports.getCreativeComment(bid);
715
- var wrapper = document.createElement('div');
716
- wrapper.appendChild(creativeComment);
717
- return wrapper.innerHTML;
718
- }
774
+ function parseResponse(response) {
775
+ var bidObject;
719
776
 
720
- function transformAuctionTargetingData(tagData) {
721
- // this map object translates the Prebid.js auction keys to their equivalent Prebid Universal Creative keys
722
- // when the publisher uses their adserver's generic macro that provides all targeting keys (ie tagData.targetingMap), we need to convert the keys
723
- var auctionKeyMap = {
724
- hb_adid: 'adId',
725
- hb_cache_host: 'cacheHost',
726
- hb_cache_path: 'cachePath',
727
- hb_cache_id: 'uuid',
728
- hb_format: 'mediaType',
729
- hb_env: 'env',
730
- hb_size: 'size',
731
- hb_pb: 'hbPb'
732
- };
733
- /**
734
- * Determine if the supplied property of the tagData object exists and is populated with its own values/properties according to its type
735
- * @param {string} paramName name of the property to check (eg tagData.targetingMap)
736
- * @returns true/false
737
- */
777
+ try {
778
+ bidObject = JSON.parse(response);
779
+ } catch (error) {
780
+ console.log("Error parsing response from cache host: ".concat(error));
781
+ }
738
782
 
739
- function isMacroPresent(paramName) {
740
- return !!(tagData[paramName] && (isPlainObject(tagData[paramName]) && Object.keys(tagData[paramName]).length > 0 || isStr(tagData[paramName]) && tagData[paramName] !== ''));
783
+ return bidObject;
741
784
  }
742
785
  /**
743
- * Converts the specifically formatted object of keypairs to a more generalized structure
744
- * It specifically extracts the keyvalue from an array and stores it as a normal string
745
- * @param {object} tarMap object of keys with the keyvalue stored in an array; eg {"hb_adid":["26566ee8c7f251"], ...}
746
- * @returns {object} result is an object map like the following: {"hb_cache_id":"123456", "other_key":"other_value", ...}
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
747
791
  */
748
792
 
749
793
 
750
- function convertTargetingMapToNormalMap(tarMap) {
751
- var newTarMap = {};
752
- Object.keys(tarMap).forEach(function (key) {
753
- if (Array.isArray(tarMap[key]) && tarMap[key].length > 0) {
754
- newTarMap[key] = tarMap[key][0];
755
- }
756
- });
757
- return newTarMap;
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>");
758
797
  }
759
798
  /**
760
- * Converts a specifically formatted string of keypairs to a specifically formatted object map
761
- * @param {String} keywordsStr string of keypairs; eg "hb_cache_id:123456,other_key:other_value"
762
- * @returns {object} result is an object map like the following: {"hb_cache_id":"123456", "other_key":"other_value", ...}
799
+ * Resize container iframe
800
+ * @param {Number} width width of creative
801
+ * @param {Number} height height of creative
763
802
  */
764
803
 
765
804
 
766
- function convertKeyPairStringToMap(keywordsStr) {
767
- var keywordsMap = {};
768
- var keywordsArr = keywordsStr.split(',');
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
+ };
769
816
 
770
- if (keywordsArr.length > 0) {
771
- keywordsArr.forEach(function (keyPairStr) {
772
- var keyPairArr = keyPairStr.split(':');
817
+ var iframeWidth = win.innerWidth;
818
+ var iframeHeight = win.innerHeight;
773
819
 
774
- if (keyPairArr.length === 2) {
775
- var k = keyPairArr[0];
776
- var v = keyPairArr[1];
777
- keywordsMap[k] = v;
778
- }
779
- });
780
- }
820
+ if (iframeWidth !== width || iframeHeight !== height) {
821
+ win.$sf.ext.register(width, height, resize); // we need to resize the DFP container as well
781
822
 
782
- return keywordsMap;
823
+ win.parent.postMessage({
824
+ sentinel: 'amp',
825
+ type: 'embed-size',
826
+ width: width,
827
+ height: height
828
+ }, '*');
829
+ }
830
+ }
783
831
  }
784
- /**
785
- * Rename key if it's part of the auctionKeyMap object; if not, leave key as is
786
- * Store the resultant keypair in the auctionData object for later use in renderingManager.renderAd()
787
- * @param {object} adServerKeyMap incoming object map of the auction keys from the UC tag; eg {'key1':'value1', 'key2':'value2', ...}
788
- */
789
832
 
833
+ function registerMRAIDViewableEvent(callback) {
834
+ function exposureChangeListener(exposure) {
835
+ if (exposure > 0) {
836
+ mraid.removeEventListener('exposureChange', exposureChangeListener);
837
+ callback();
838
+ }
839
+ }
790
840
 
791
- function renameKnownAuctionKeys(adServerKeyMap) {
792
- Object.keys(adServerKeyMap).forEach(function (key) {
793
- var internalKey = auctionKeyMap[key] || key;
794
- auctionData[internalKey] = adServerKeyMap[key];
795
- });
796
- }
841
+ function viewableChangeListener(viewable) {
842
+ if (viewable) {
843
+ mraid.removeEventListener('viewableChange', viewableChangeListener);
844
+ callback();
845
+ }
846
+ }
797
847
 
798
- var auctionData = {};
799
- var formattedKeyMap = {};
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();
854
+ } else {
855
+ mraid.addEventListener('viewableChange', viewableChangeListener);
856
+ }
857
+ }
858
+ }
800
859
 
801
- if (isMacroPresent('targetingMap')) {
802
- formattedKeyMap = convertTargetingMapToNormalMap(tagData.targetingMap);
803
- } else if (isMacroPresent('targetingKeywords')) {
804
- formattedKeyMap = convertKeyPairStringToMap(tagData.targetingKeywords);
805
- }
860
+ function readyListener() {
861
+ mraid.removeEventListener('ready', readyListener);
862
+ registerViewableChecks();
863
+ }
806
864
 
807
- renameKnownAuctionKeys(formattedKeyMap); // set keys not in defined map macros (eg targetingMap) and/or the keys setup within a non-DFP adserver
865
+ if (win.mraid && win.MRAID_ENV) {
866
+ if (mraid.getState() == 'loading') {
867
+ mraid.addEventListener('ready', readyListener);
868
+ } else {
869
+ registerViewableChecks();
870
+ }
808
871
 
809
- Object.keys(tagData).forEach(function (key) {
810
- if (key !== 'targetingMap' && key !== 'targetingKeywords' && isStr(tagData[key]) && tagData[key] !== '') {
811
- auctionData[key] = tagData[key];
872
+ return true;
873
+ } else {
874
+ return false;
812
875
  }
813
- });
814
- return auctionData;
815
- }
876
+ }
816
877
 
817
- function parseUrl(url) {
818
- var parsed = document.createElement('a');
819
- parsed.href = decodeURIComponent(url);
820
878
  return {
821
- href: parsed.href,
822
- protocol: (parsed.protocol || '').replace(/:$/, ''),
823
- hostname: parsed.hostname,
824
- port: +parsed.port,
825
- pathname: parsed.pathname.replace(/^(?!\/)/, '/'),
826
- hash: (parsed.hash || '').replace(/^#/, ''),
827
- host: (parsed.host || window.location.host).replace(/:(443|80)$/, '')
879
+ renderAd: renderAd
828
880
  };
829
881
  }
830
882
 
831
- function isA(object, _t) {
832
- return Object.prototype.toString.call(object) === '[object ' + _t + ']';
833
- }
834
-
835
- ;
836
-
837
- function isPlainObject(object) {
838
- return isA(object, 'Object');
839
- }
840
-
841
- function isStr(object) {
842
- return isA(object, 'String');
843
- }
844
-
845
- ;
846
-
847
883
  /***/ }),
848
884
  /* 4 */
849
885
  /***/ (function(module, exports, __webpack_require__) {
@@ -2944,6 +2980,66 @@ return /******/ (function(modules) { // webpackBootstrap
2944
2980
  "use strict";
2945
2981
 
2946
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
+
2947
3043
  Object.defineProperty(exports, "__esModule", {
2948
3044
  value: true
2949
3045
  });