1
1
import { getAttributes } from '@cocreate/utils' ;
2
2
import { storage } from './getValue' ;
3
3
4
- HTMLElement . prototype . setValue = function ( value ) {
5
- setValue ( this , value )
4
+ HTMLElement . prototype . setValue = function ( value , dispatch ) {
5
+ setValue ( this , value , dispatch )
6
6
} ;
7
7
8
- HTMLInputElement . prototype . setValue = function ( value ) {
9
- setValue ( this , value )
8
+ HTMLInputElement . prototype . setValue = function ( value , dispatch ) {
9
+ setValue ( this , value , dispatch )
10
10
} ;
11
11
12
- HTMLHeadingElement . prototype . setValue = function ( value ) {
13
- setValue ( this , value )
12
+ HTMLHeadingElement . prototype . setValue = function ( value , dispatch ) {
13
+ setValue ( this , value , dispatch )
14
14
} ;
15
15
16
16
// TODO: check if using a a switch case will provide better performance
17
- const setValue = ( el , value ) => {
17
+ const setValue = ( el , value , dispatch ) => {
18
18
if ( value === null || value === undefined ) return ;
19
19
if ( el . hasAttribute ( 'component' ) || el . hasAttribute ( 'plugin' ) )
20
20
return storage . set ( el , value )
@@ -78,7 +78,7 @@ const setValue = (el, value) => {
78
78
79
79
el . value = value ;
80
80
}
81
- dispatchEvents ( el )
81
+ dispatchEvents ( el , dispatch )
82
82
} else if ( el . tagName === 'IMG' || el . tagName === 'SOURCE' ) {
83
83
el . src = value ;
84
84
} else if ( el . tagName === 'IFRAME' ) {
@@ -119,6 +119,12 @@ const setValue = (el, value) => {
119
119
}
120
120
} else
121
121
el . innerHTML = newElement . innerHTML ;
122
+
123
+ let scripts = el . querySelectorAll ( 'script' ) ;
124
+ for ( let script of scripts ) {
125
+ setScript ( script )
126
+ }
127
+
122
128
}
123
129
124
130
if ( el . hasAttribute ( "value" ) ) {
@@ -127,7 +133,7 @@ const setValue = (el, value) => {
127
133
}
128
134
129
135
if ( el . getAttribute ( 'contenteditable' ) )
130
- dispatchEvents ( el ) ;
136
+ dispatchEvents ( el , dispatch ) ;
131
137
132
138
if ( el . tagName == 'HEAD' || el . tagName == 'BODY' ) {
133
139
el . removeAttribute ( 'array' ) ;
@@ -150,8 +156,26 @@ function setState(el) {
150
156
}
151
157
152
158
function setScript ( script , value ) {
159
+ let srcAttribute = script . src
160
+ if ( srcAttribute ) {
161
+ let pageOrigin = window . location . origin ;
162
+ let srcOrigin ;
163
+
164
+ try {
165
+ srcOrigin = new URL ( srcAttribute , document . baseURI ) . origin ;
166
+ } catch ( e ) {
167
+ // Handle invalid URLs
168
+ console . error ( "Invalid URL in src attribute:" , srcAttribute ) ;
169
+ return ;
170
+ }
171
+ if ( pageOrigin !== srcOrigin )
172
+ return
173
+ }
174
+
153
175
let newScript = document . createElement ( 'script' ) ;
154
- newScript . attributes = script . attributes ;
176
+ for ( let attr of script . attributes ) {
177
+ newScript . setAttribute ( attr . name , attr . value ) ;
178
+ }
155
179
newScript . innerHTML = script . innerHTML ;
156
180
if ( value ) {
157
181
if ( script . hasAttribute ( "src" ) )
@@ -168,11 +192,11 @@ function __decryptPassword(str) {
168
192
return decode_str ;
169
193
}
170
194
171
- function dispatchEvents ( el ) {
195
+ function dispatchEvents ( el , skip = true ) {
172
196
let inputEvent = new CustomEvent ( 'input' , {
173
197
bubbles : true ,
174
198
detail : {
175
- skip : true
199
+ skip
176
200
} ,
177
201
} ) ;
178
202
@@ -185,7 +209,7 @@ function dispatchEvents(el) {
185
209
let changeEvent = new CustomEvent ( 'change' , {
186
210
bubbles : true ,
187
211
detail : {
188
- skip : true
212
+ skip
189
213
} ,
190
214
} ) ;
191
215
0 commit comments