-
Notifications
You must be signed in to change notification settings - Fork 76
/
Copy pathrenderingManager.js
127 lines (117 loc) · 3.78 KB
/
renderingManager.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import { parseUrl, transformAuctionTargetingData } from './utils';
import { canLocatePrebid } from './environment';
import { insertElement, getEmptyIframe } from './domHelper';
import {prebidMessenger, renderEventMessage} from './messaging.js';
import {runDynamicRenderer} from './dynamicRenderer.js';
export function renderBannerOrDisplayAd(doc, dataObject) {
const targetingData = transformAuctionTargetingData(dataObject);
if (!canLocatePrebid(window)) {
renderCrossDomain(window, targetingData.adId, targetingData.adServerDomain, targetingData.pubUrl);
} else {
renderLegacy(doc, targetingData.adId);
}
}
/**
* Calls prebid.js renderAd function to render ad
* @param {Object} doc Document
* @param {string} adId Id of creative to render
*/
export function renderLegacy(doc, adId) {
let found = false;
let w = window;
for (let i = 0; i < 10; i++) {
w = w.parent;
if (w.$$PREBID_GLOBAL$$) {
try {
w.$$PREBID_GLOBAL$$.renderAd(doc, adId);
found = true;
break;
} catch (e) {
continue;
}
}
}
if (!found) {
console.error("Unable to locate $$PREBID_GLOBAL$$.renderAd function!");
}
}
/**
* Render ad in safeframe using postmessage
* @param {string} adId Id of creative to render
* @param {string} pubAdServerDomain publisher adserver domain name
* @param {string} pubUrl Url of publisher page
*/
export function renderCrossDomain(win, adId, pubAdServerDomain = '', pubUrl) {
let windowLocation = win.location;
let adServerDomain = pubAdServerDomain || win.location.hostname;
let fullAdServerDomain = windowLocation.protocol + '//' + adServerDomain;
const sendMessage = prebidMessenger(pubUrl, win);
const signalRenderResult = (errorInfo) => sendMessage(renderEventMessage(adId, errorInfo));
function renderAd(ev) {
let key = ev.message ? "message" : "data";
let adObject = {};
try {
adObject = JSON.parse(ev[key]);
} catch (e) {
return;
}
if (
adObject.message &&
adObject.message === "Prebid Response" &&
adObject.adId === adId
) {
if (adObject.renderer) {
runDynamicRenderer(adId, adObject, sendMessage, win);
return;
}
try {
let body = win.document.body;
let ad = adObject.ad;
let url = adObject.adUrl;
let width = adObject.width;
let height = adObject.height;
if (adObject.mediaType === "video") {
signalRenderResult({
reason: "preventWritingOnMainDocument",
message: `Cannot render video ad ${adId}`,
});
console.log("Error trying to write ad.");
} else if (ad) {
const iframe = getEmptyIframe(adObject.height, adObject.width);
body.appendChild(iframe);
iframe.contentDocument.open();
iframe.contentDocument.write(ad);
iframe.contentDocument.close();
signalRenderResult();
} else if (url) {
const iframe = getEmptyIframe(height, width);
iframe.style.display = "inline";
iframe.style.overflow = "hidden";
iframe.src = url;
insertElement(iframe, document, "body");
signalRenderResult();
} else {
signalRenderResult({
reason: "noAd",
message: `No ad for ${adId}`,
});
console.log(
`Error trying to write ad. No ad markup or adUrl for ${adId}`
);
}
} catch (e) {
signalRenderResult({ reason: "exception", message: e.message });
console.log(`Error in rendering ad`, e);
}
}
}
function requestAdFromPrebid() {
let message = {
message: 'Prebid Request',
adId: adId,
adServerDomain: fullAdServerDomain
}
sendMessage(message, renderAd);
}
requestAdFromPrebid();
}