4
4
*/
5
5
6
6
import events from './events.js' ;
7
- import { fireNativeTrackers , getAssetMessage , getAllAssetsMessage } from './native.js' ;
7
+ import { fireNativeTrackers , getAllAssetsMessage , getAssetMessage } from './native.js' ;
8
8
import constants from './constants.json' ;
9
- import { logWarn , replaceAuctionPrice , deepAccess , isGptPubadsDefined , isApnGetTagDefined } from './utils.js' ;
10
- import { auctionManager } from './auctionManager.js' ;
9
+ import { deepAccess , isApnGetTagDefined , isGptPubadsDefined , logError , logWarn , replaceAuctionPrice } from './utils.js' ;
10
+ import { auctionManager } from './auctionManager.js' ;
11
11
import find from 'core-js-pure/features/array/find.js' ;
12
- import { isRendererRequired , executeRenderer } from './Renderer.js' ;
12
+ import { executeRenderer , isRendererRequired } from './Renderer.js' ;
13
13
import includes from 'core-js-pure/features/array/includes.js' ;
14
- import { config } from './config.js' ;
14
+ import { config } from './config.js' ;
15
+ import { emitAdRenderFail , emitAdRenderSucceeded } from './adRendering.js' ;
15
16
16
17
const BID_WON = constants . EVENTS . BID_WON ;
17
18
const STALE_RENDER = constants . EVENTS . STALE_RENDER ;
18
19
20
+ const HANDLER_MAP = {
21
+ 'Prebid Request' : handleRenderRequest ,
22
+ 'Prebid Native' : handleNativeRequest ,
23
+ 'Prebid Event' : handleEventRequest ,
24
+ }
25
+
19
26
export function listenMessagesFromCreative ( ) {
20
27
window . addEventListener ( 'message' , receiveMessage , false ) ;
21
28
}
@@ -29,52 +36,97 @@ export function receiveMessage(ev) {
29
36
return ;
30
37
}
31
38
32
- if ( data && data . adId ) {
39
+ if ( data && data . adId && data . message ) {
33
40
const adObject = find ( auctionManager . getBidsReceived ( ) , function ( bid ) {
34
41
return bid . adId === data . adId ;
35
42
} ) ;
43
+ if ( HANDLER_MAP . hasOwnProperty ( data . message ) ) {
44
+ HANDLER_MAP [ data . message ] ( ev , data , adObject ) ;
45
+ }
46
+ }
47
+ }
36
48
37
- if ( adObject && data . message === 'Prebid Request' ) {
38
- if ( adObject . status === constants . BID_STATUS . RENDERED ) {
39
- logWarn ( `Ad id ${ adObject . adId } has been rendered before` ) ;
40
- events . emit ( STALE_RENDER , adObject ) ;
41
- if ( deepAccess ( config . getConfig ( 'auctionOptions' ) , 'suppressStaleRender' ) ) {
42
- return ;
43
- }
44
- }
49
+ function handleRenderRequest ( ev , data , adObject ) {
50
+ if ( adObject == null ) {
51
+ emitAdRenderFail ( {
52
+ reason : constants . AD_RENDER_FAILED_REASON . CANNOT_FIND_AD ,
53
+ message : `Cannot find ad '${ data . adId } ' for cross-origin render request` ,
54
+ id : data . adId
55
+ } ) ;
56
+ return ;
57
+ }
58
+ if ( adObject . status === constants . BID_STATUS . RENDERED ) {
59
+ logWarn ( `Ad id ${ adObject . adId } has been rendered before` ) ;
60
+ events . emit ( STALE_RENDER , adObject ) ;
61
+ if ( deepAccess ( config . getConfig ( 'auctionOptions' ) , 'suppressStaleRender' ) ) {
62
+ return ;
63
+ }
64
+ }
45
65
46
- _sendAdToCreative ( adObject , ev ) ;
66
+ _sendAdToCreative ( adObject , ev ) ;
47
67
48
- // save winning bids
49
- auctionManager . addWinningBid ( adObject ) ;
68
+ // save winning bids
69
+ auctionManager . addWinningBid ( adObject ) ;
50
70
51
- events . emit ( BID_WON , adObject ) ;
52
- }
71
+ events . emit ( BID_WON , adObject ) ;
72
+ }
53
73
54
- // handle this script from native template in an ad server
55
- // window.parent.postMessage(JSON.stringify({
56
- // message: 'Prebid Native',
57
- // adId: '%%PATTERN:hb_adid%%'
58
- // }), '*');
59
- if ( adObject && data . message === 'Prebid Native' ) {
60
- if ( data . action === 'assetRequest' ) {
61
- const message = getAssetMessage ( data , adObject ) ;
62
- ev . source . postMessage ( JSON . stringify ( message ) , ev . origin ) ;
63
- } else if ( data . action === 'allAssetRequest' ) {
64
- const message = getAllAssetsMessage ( data , adObject ) ;
65
- ev . source . postMessage ( JSON . stringify ( message ) , ev . origin ) ;
66
- } else if ( data . action === 'resizeNativeHeight' ) {
67
- adObject . height = data . height ;
68
- adObject . width = data . width ;
69
- resizeRemoteCreative ( adObject ) ;
70
- } else {
71
- const trackerType = fireNativeTrackers ( data , adObject ) ;
72
- if ( trackerType === 'click' ) { return ; }
73
-
74
- auctionManager . addWinningBid ( adObject ) ;
75
- events . emit ( BID_WON , adObject ) ;
76
- }
77
- }
74
+ function handleNativeRequest ( ev , data , adObject ) {
75
+ // handle this script from native template in an ad server
76
+ // window.parent.postMessage(JSON.stringify({
77
+ // message: 'Prebid Native',
78
+ // adId: '%%PATTERN:hb_adid%%'
79
+ // }), '*');
80
+ if ( adObject == null ) {
81
+ logError ( `Cannot find ad '${ data . adId } ' for x-origin event request` )
82
+ return ;
83
+ }
84
+ if ( data . action === 'assetRequest' ) {
85
+ const message = getAssetMessage ( data , adObject ) ;
86
+ ev . source . postMessage ( JSON . stringify ( message ) , ev . origin ) ;
87
+ } else if ( data . action === 'allAssetRequest' ) {
88
+ const message = getAllAssetsMessage ( data , adObject ) ;
89
+ ev . source . postMessage ( JSON . stringify ( message ) , ev . origin ) ;
90
+ } else if ( data . action === 'resizeNativeHeight' ) {
91
+ adObject . height = data . height ;
92
+ adObject . width = data . width ;
93
+ resizeRemoteCreative ( adObject ) ;
94
+ } else {
95
+ const trackerType = fireNativeTrackers ( data , adObject ) ;
96
+ if ( trackerType === 'click' ) { return ; }
97
+
98
+ auctionManager . addWinningBid ( adObject ) ;
99
+ events . emit ( BID_WON , adObject ) ;
100
+ }
101
+ }
102
+
103
+ function handleEventRequest ( ev , data , adObject ) {
104
+ if ( adObject == null ) {
105
+ logError ( `Cannot find ad '${ data . adId } ' for x-origin event request` ) ;
106
+ return ;
107
+ }
108
+ if ( adObject . status !== constants . BID_STATUS . RENDERED ) {
109
+ logWarn ( `Received x-origin event request without corresponding render request for ad '${ data . adId } '` ) ;
110
+ return ;
111
+ }
112
+ switch ( data . event ) {
113
+ case constants . EVENTS . AD_RENDER_FAILED :
114
+ emitAdRenderFail ( {
115
+ bid : adObject ,
116
+ id : data . adId ,
117
+ reason : data . info . reason ,
118
+ message : data . info . message
119
+ } ) ;
120
+ break ;
121
+ case constants . EVENTS . AD_RENDER_SUCCEEDED :
122
+ emitAdRenderSucceeded ( {
123
+ doc : null ,
124
+ bid : adObject ,
125
+ id : data . adId
126
+ } ) ;
127
+ break ;
128
+ default :
129
+ logError ( `Received x-origin event request for unsupported event: '${ data . event } ' (adId: '${ data . adId } ')` )
78
130
}
79
131
}
80
132
0 commit comments