1
- window . addEventListener ( 'message' , async ( e ) => {
2
- if ( e . data . type === 'fetch' ) {
3
- const names = e . data . names ;
4
-
5
- const transformed = await Promise . all (
6
- names . map ( async ( name ) => {
7
- const res = await fetch ( name ) ;
8
- return {
9
- name,
10
- code : await res . text ( )
11
- } ;
12
- } )
13
- ) ;
14
-
15
- const css_files = [ ] ;
16
-
17
- for ( const { name, code } of transformed ) {
18
- if (
19
- name . endsWith ( '.svelte' ) &&
20
- code . includes ( 'svelte&type=style&lang.css' )
21
- ) {
22
- css_files . push ( name + '?svelte&type=style&lang.css' ) ;
23
- }
24
- }
25
-
26
- if ( css_files . length > 0 ) {
27
- const css_transformed = await Promise . all (
28
- css_files . map ( async ( name ) => {
29
- const res = await fetch ( name ) ;
30
- return {
31
- name,
32
- code : await res . text ( )
33
- } ;
34
- } )
35
- ) ;
36
-
37
- transformed . push ( ...css_transformed ) ;
38
- }
1
+ function post ( data ) {
2
+ parent . postMessage ( data , '*' ) ;
3
+ }
39
4
40
- parent . postMessage (
41
- {
42
- type : 'fetch-result' ,
43
- data : transformed
44
- } ,
45
- '*'
46
- ) ;
47
- }
48
- } ) ;
5
+ function ping ( ) {
6
+ post ( {
7
+ type : 'ping' ,
8
+ path : location . pathname + location . search + location . hash
9
+ } ) ;
10
+ }
49
11
50
- let can_focus = false ;
12
+ function pause ( ) {
13
+ post ( { type : 'ping-pause' } ) ;
14
+ }
51
15
52
- window . addEventListener ( 'pointerdown' , ( e ) => {
53
- can_focus = true ;
54
- } ) ;
16
+ // Hack into the alert that's used in some tutorials and send a message prior to the alert,
17
+ // else the parent thinks we lost contact and wrongfully reloads the page.
18
+ // The drawback is that alert is no longer blocking, but no tutorial relies on this.
19
+ const alert = window . alert ;
20
+ window . alert = ( message ) => {
21
+ pause ( ) ;
55
22
56
- window . addEventListener ( 'pointerup' , ( e ) => {
57
- can_focus = false ;
58
- } ) ;
23
+ setTimeout ( ( ) => {
24
+ alert ( message ) ;
25
+ } ) ;
26
+ } ;
59
27
60
- window . addEventListener ( 'keydown' , ( e ) => {
61
- can_focus = true ;
62
- } ) ;
28
+ let can_focus = false ;
63
29
64
- window . addEventListener ( 'keyup' , ( e ) => {
65
- can_focus = false ;
66
- } ) ;
30
+ window . addEventListener ( 'pointerdown' , ( e ) => can_focus = true ) ;
31
+ window . addEventListener ( 'pointerup' , ( e ) => can_focus = false ) ;
32
+ window . addEventListener ( 'keydown' , ( e ) => can_focus = true ) ;
33
+ window . addEventListener ( 'keyup' , ( e ) => can_focus = false ) ;
67
34
68
35
/**
69
36
* The iframe sometimes takes focus control in ways we can't prevent
@@ -78,12 +45,7 @@ window.addEventListener('focusin', (e) => {
78
45
if ( e . target . tagName === 'BODY' && e . relatedTarget ) return ;
79
46
80
47
// otherwise, broadcast an event that causes the editor to reclaim focus
81
- parent . postMessage (
82
- {
83
- type : 'iframe_took_focus'
84
- } ,
85
- '*'
86
- ) ;
48
+ post ( { type : 'iframe_took_focus' } ) ;
87
49
} ) ;
88
50
89
51
window . addEventListener ( 'click' , ( e ) => {
@@ -102,47 +64,38 @@ window.addEventListener('click', (e) => {
102
64
}
103
65
} ) ;
104
66
105
- function ping ( ) {
106
- parent . postMessage (
107
- {
108
- type : 'ping' ,
109
- data : {
110
- path : location . pathname + location . search + location . hash
111
- }
112
- } ,
113
- '*'
114
- ) ;
115
- }
67
+ window . addEventListener ( 'visibilitychange' , ( ) => {
68
+ if ( document . visibilityState === 'visible' ) {
69
+ ping ( ) ;
70
+ } else {
71
+ pause ( ) ;
72
+ }
73
+ } ) ;
74
+
75
+ let previous_href = location . href ;
116
76
117
- let pre_url = location . href ;
118
77
const url_observer = new MutationObserver ( ( ) => {
119
- if ( location . href !== pre_url ) {
120
- pre_url = location . href ;
78
+ if ( location . href !== previous_href ) {
79
+ previous_href = location . href ;
121
80
ping ( ) ;
122
81
}
123
82
} ) ;
124
- url_observer . observe ( document , { subtree : true , childList : true , attributes : true } ) ;
125
83
84
+ url_observer . observe ( document , {
85
+ subtree : true ,
86
+ childList : true ,
87
+ attributes : true
88
+ } ) ;
89
+
90
+ setInterval ( ping , 100 ) ;
126
91
ping ( ) ;
127
92
128
93
if ( import . meta. hot ) {
129
94
import . meta. hot . on ( 'vite:beforeUpdate' , ( event ) => {
130
- parent . postMessage (
131
- {
132
- type : 'hmr' ,
133
- data : event . updates
134
- } ,
135
- '*'
136
- ) ;
95
+ post ( { type : 'hmr' , data : event . updates } ) ;
137
96
} ) ;
138
97
139
98
import . meta. hot . on ( 'svelte:warnings' , ( data ) => {
140
- parent . postMessage (
141
- {
142
- type : 'warnings' ,
143
- data
144
- } ,
145
- '*'
146
- ) ;
99
+ post ( { type : 'warnings' , data } ) ;
147
100
} ) ;
148
101
}
0 commit comments