1
- import React , { useState , useEffect , useRef } from 'react' ;
1
+ import React , { useState , useEffect , useRef , useMemo } from 'react' ;
2
2
import Scrollable from './Scrollable' ;
3
3
import PreviewHint from './PreviewHint' ;
4
4
import AddHtml from './AddHtml' ;
@@ -25,6 +25,7 @@ function Preview({ markup, accessibleRoles, elements, dispatch }) {
25
25
// Indicating that the `parsed` element can be highlighted again.
26
26
const [ highlighted , setHighlighted ] = useState ( false ) ;
27
27
const [ roles , setRoles ] = useState ( [ ] ) ;
28
+ const [ scripts , setScripts ] = useState ( [ ] ) ;
28
29
const htmlRoot = useRef ( ) ;
29
30
30
31
const { suggestion } = getQueryAdvise ( {
@@ -34,6 +35,61 @@ function Preview({ markup, accessibleRoles, elements, dispatch }) {
34
35
35
36
// TestingLibraryDom?.getSuggestedQuery(highlighted, 'get').toString() : null
36
37
38
+ useEffect ( ( ) => {
39
+ const container = document . createElement ( 'div' ) ;
40
+ container . innerHTML = markup ;
41
+ const scriptsCollections = container . getElementsByTagName ( 'script' ) ;
42
+ const jsScripts = Array . from ( scriptsCollections ) . filter (
43
+ ( script ) => script . type === 'text/javascript' || script . type === '' ,
44
+ ) ;
45
+ setScripts ( ( scripts ) => [
46
+ ...scripts . filter ( ( script ) =>
47
+ jsScripts
48
+ . map ( ( jsScript ) => jsScript . innerHTML )
49
+ . includes ( script . innerHTML ) ,
50
+ ) ,
51
+ ...jsScripts
52
+ . filter (
53
+ ( jsScript ) =>
54
+ ! scripts
55
+ . map ( ( script ) => script . innerHTML )
56
+ . includes ( jsScript . innerHTML ) ,
57
+ )
58
+ . map ( ( jsScript ) => ( {
59
+ scriptCode : jsScript . innerHTML ,
60
+ toBeRemoved : jsScript . outerHTML ,
61
+ evaluated : false ,
62
+ } ) ) ,
63
+ ] ) ;
64
+ } , [ markup , setScripts ] ) ;
65
+
66
+ const actualMarkup = useMemo (
67
+ ( ) =>
68
+ scripts . length
69
+ ? scripts . reduce (
70
+ ( html , script ) => html . replace ( script . toBeRemoved , '' ) ,
71
+ markup ,
72
+ )
73
+ : markup ,
74
+ [ scripts , markup ] ,
75
+ ) ;
76
+
77
+ useEffect ( ( ) => {
78
+ if ( htmlRoot . current && highlighted ) {
79
+ scripts
80
+ . filter ( ( script ) => ! script . evaluated )
81
+ . forEach ( ( script ) => {
82
+ try {
83
+ script . evaluated = true ;
84
+ const executeScript = new Function ( script . scriptCode ) ;
85
+ executeScript ( ) ;
86
+ } catch ( e ) {
87
+ alert ( 'Failing script inserted in markup!' ) ;
88
+ }
89
+ } ) ;
90
+ }
91
+ } , [ highlighted , scripts , htmlRoot . current ] ) ;
92
+
37
93
useEffect ( ( ) => {
38
94
setRoles ( Object . keys ( accessibleRoles || { } ) . sort ( ) ) ;
39
95
} , [ accessibleRoles ] ) ;
@@ -99,7 +155,9 @@ function Preview({ markup, accessibleRoles, elements, dispatch }) {
99
155
onClick = { handleClick }
100
156
onMouseMove = { handleMove }
101
157
ref = { htmlRoot }
102
- dangerouslySetInnerHTML = { { __html : markup } }
158
+ dangerouslySetInnerHTML = { {
159
+ __html : actualMarkup ,
160
+ } }
103
161
/>
104
162
</ Scrollable >
105
163
</ div >
0 commit comments