1
1
/* @flow */
2
2
3
- import { isSameDomain , isWindowClosed , type CrossDomainWindowType , type DomainMatcher , getOpener , WINDOW_TYPE , isWindow } from 'cross-domain-utils/src' ;
3
+ import { isSameDomain , isWindowClosed , type CrossDomainWindowType ,
4
+ type DomainMatcher , getOpener , WINDOW_TYPE , isWindow , assertSameDomain } from 'cross-domain-utils/src' ;
4
5
import { ZalgoPromise } from 'zalgo-promise/src' ;
5
6
import { uniqueID , memoizePromise } from 'belter/src' ;
6
7
import { serializeType , type CustomSerializedType } from 'universal-serialize/src' ;
@@ -32,6 +33,51 @@ type SerializedProxyWindow = {|
32
33
getInstanceID : ( ) => ZalgoPromise < string >
33
34
| } ;
34
35
36
+ function getSerializedWindow ( id : string , win : CrossDomainWindowType , { send } : { send : SendType } ) : SerializedProxyWindow {
37
+ return {
38
+ id,
39
+ type : getOpener ( win ) ? WINDOW_TYPE . POPUP : WINDOW_TYPE . IFRAME ,
40
+ getInstanceID : ( ) => getWindowInstanceID ( win , { send } ) ,
41
+ close : ( ) => ZalgoPromise . try ( ( ) => {
42
+ win . close ( ) ;
43
+ } ) ,
44
+ focus : ( ) => ZalgoPromise . try ( ( ) => {
45
+ win . focus ( ) ;
46
+ } ) ,
47
+ isClosed : ( ) => ZalgoPromise . try ( ( ) => {
48
+ return isWindowClosed ( win ) ;
49
+ } ) ,
50
+ setLocation : ( href ) => ZalgoPromise . try ( ( ) => {
51
+ if ( isSameDomain ( win ) ) {
52
+ try {
53
+ if ( win . location && typeof win . location . replace === 'function' ) {
54
+ // $FlowFixMe
55
+ win . location . replace ( href ) ;
56
+ return ;
57
+ }
58
+ } catch ( err ) {
59
+ // pass
60
+ }
61
+ }
62
+
63
+ win . location = href ;
64
+ } ) ,
65
+ setName : ( name ) => ZalgoPromise . try ( ( ) => {
66
+ if ( __POST_ROBOT__ . __IE_POPUP_SUPPORT__ ) {
67
+ linkWindow ( { win, name } ) ;
68
+ }
69
+
70
+ win = assertSameDomain ( win ) ;
71
+
72
+ win . name = name ;
73
+
74
+ if ( win . frameElement ) {
75
+ win . frameElement . setAttribute ( 'name' , name ) ;
76
+ }
77
+ } )
78
+ } ;
79
+ }
80
+
35
81
export class ProxyWindow {
36
82
37
83
isProxyWindow : true = true
@@ -43,11 +89,11 @@ export class ProxyWindow {
43
89
constructor ( serializedWindow : SerializedProxyWindow , actualWindow ? : ?CrossDomainWindowType , { send } : { send : SendType } ) {
44
90
this . serializedWindow = serializedWindow ;
45
91
this . actualWindowPromise = new ZalgoPromise ( ) ;
92
+ this . send = send ;
46
93
if ( actualWindow ) {
47
94
this . setWindow ( actualWindow ) ;
48
95
}
49
96
this . serializedWindow . getInstanceID = memoizePromise ( this . serializedWindow . getInstanceID ) ;
50
- this . send = send ;
51
97
}
52
98
53
99
getType ( ) : $Values < typeof WINDOW_TYPE > {
@@ -63,67 +109,23 @@ export class ProxyWindow {
63
109
}
64
110
65
111
setLocation ( href : string ) : ZalgoPromise < ProxyWindow > {
66
- return ZalgoPromise . try ( ( ) => {
67
- if ( this . actualWindow ) {
68
- this . actualWindow . location = href ;
69
- } else {
70
- return this . serializedWindow . setLocation ( href ) ;
71
- }
72
- } ) . then ( ( ) => this ) ;
112
+ return this . serializedWindow . setLocation ( href ) . then ( ( ) => this ) ;
73
113
}
74
114
75
115
setName ( name : string ) : ZalgoPromise < ProxyWindow > {
76
- return ZalgoPromise . try ( ( ) => {
77
- if ( this . actualWindow ) {
78
- if ( ! isSameDomain ( this . actualWindow ) ) {
79
- throw new Error ( `Can not set name for window on different domain` ) ;
80
- }
81
- // $FlowFixMe
82
- this . actualWindow . name = name ;
83
- // $FlowFixMe
84
- if ( this . actualWindow . frameElement ) {
85
- // $FlowFixMe
86
- this . actualWindow . frameElement . setAttribute ( 'name' , name ) ;
87
- }
88
-
89
- if ( __POST_ROBOT__ . __IE_POPUP_SUPPORT__ ) {
90
-
91
- linkWindow ( { win : this . actualWindow , name } ) ;
92
- }
93
-
94
- } else {
95
- return this . serializedWindow . setName ( name ) ;
96
- }
97
- } ) . then ( ( ) => this ) ;
116
+ return this . serializedWindow . setName ( name ) . then ( ( ) => this ) ;
98
117
}
99
118
100
119
close ( ) : ZalgoPromise < ProxyWindow > {
101
- return ZalgoPromise . try ( ( ) => {
102
- if ( this . actualWindow ) {
103
- this . actualWindow . close ( ) ;
104
- } else {
105
- return this . serializedWindow . close ( ) ;
106
- }
107
- } ) . then ( ( ) => this ) ;
120
+ return this . serializedWindow . close ( ) . then ( ( ) => this ) ;
108
121
}
109
122
110
123
focus ( ) : ZalgoPromise < ProxyWindow > {
111
- return ZalgoPromise . try ( ( ) => {
112
- if ( this . actualWindow ) {
113
- this . actualWindow . focus ( ) ;
114
- }
115
- return this . serializedWindow . focus ( ) ;
116
- } ) . then ( ( ) => this ) ;
124
+ return this . serializedWindow . focus ( ) . then ( ( ) => this ) ;
117
125
}
118
126
119
127
isClosed ( ) : ZalgoPromise < boolean > {
120
- return ZalgoPromise . try ( ( ) => {
121
- if ( this . actualWindow ) {
122
- return isWindowClosed ( this . actualWindow ) ;
123
- } else {
124
- return this . serializedWindow . isClosed ( ) ;
125
- }
126
- } ) ;
128
+ return this . serializedWindow . isClosed ( ) ;
127
129
}
128
130
129
131
getWindow ( ) : ?CrossDomainWindowType {
@@ -132,6 +134,7 @@ export class ProxyWindow {
132
134
133
135
setWindow ( win : CrossDomainWindowType ) {
134
136
this . actualWindow = win ;
137
+ this . serializedWindow = getSerializedWindow ( this . serializedWindow . id , win , { send : this . send } ) ;
135
138
this . actualWindowPromise . resolve ( win ) ;
136
139
}
137
140
@@ -165,11 +168,7 @@ export class ProxyWindow {
165
168
}
166
169
167
170
getInstanceID ( ) : ZalgoPromise < string > {
168
- if ( this . actualWindow ) {
169
- return getWindowInstanceID ( this . actualWindow , { send : this . send } ) ;
170
- } else {
171
- return this . serializedWindow . getInstanceID ( ) ;
172
- }
171
+ return this . serializedWindow . getInstanceID ( ) ;
173
172
}
174
173
175
174
serialize ( ) : SerializedProxyWindow {
@@ -214,53 +213,16 @@ export class ProxyWindow {
214
213
return win ;
215
214
}
216
215
216
+ // $FlowFixMe
217
+ const realWin : CrossDomainWindowType = win ;
218
+
217
219
// $FlowFixMe
218
220
return windowStore ( 'winToProxyWindow' ) . getOrSet ( win , ( ) => {
219
221
const id = uniqueID ( ) ;
222
+ const serializedWindow = getSerializedWindow ( id , realWin , { send } ) ;
223
+ const proxyWindow = new ProxyWindow ( serializedWindow , realWin , { send } ) ;
220
224
221
- return globalStore ( 'idToProxyWindow' ) . set ( id , new ProxyWindow ( {
222
- id,
223
- // $FlowFixMe
224
- type : getOpener ( win ) ? WINDOW_TYPE . POPUP : WINDOW_TYPE . IFRAME ,
225
- // $FlowFixMe
226
- getInstanceID : ( ) => getWindowInstanceID ( win , { send } ) ,
227
- close : ( ) => ZalgoPromise . try ( ( ) => {
228
- win . close ( ) ;
229
- } ) ,
230
- focus : ( ) => ZalgoPromise . try ( ( ) => {
231
- win . focus ( ) ;
232
- } ) ,
233
- isClosed : ( ) => ZalgoPromise . try ( ( ) => {
234
- // $FlowFixMe
235
- return isWindowClosed ( win ) ;
236
- } ) ,
237
- setLocation : ( href ) => ZalgoPromise . try ( ( ) => {
238
- // $FlowFixMe
239
- if ( isSameDomain ( win ) ) {
240
- try {
241
- if ( win . location && typeof win . location . replace === 'function' ) {
242
- // $FlowFixMe
243
- win . location . replace ( href ) ;
244
- return ;
245
- }
246
- } catch ( err ) {
247
- // pass
248
- }
249
- }
250
-
251
- // $FlowFixMe
252
- win . location = href ;
253
- } ) ,
254
- setName : ( name ) => ZalgoPromise . try ( ( ) => {
255
- if ( __POST_ROBOT__ . __IE_POPUP_SUPPORT__ ) {
256
- // $FlowFixMe
257
- linkWindow ( { win, name } ) ;
258
- }
259
- // $FlowFixMe
260
- win . name = name ;
261
- } )
262
- // $FlowFixMe
263
- } , win , { send } ) ) ;
225
+ return globalStore ( 'idToProxyWindow' ) . set ( id , proxyWindow ) ;
264
226
} ) ;
265
227
}
266
228
}
0 commit comments