1616// under the License.
1717
1818const logInspector = require ( '../bidi/logInspector' )
19+ const scriptManager = require ( '../bidi//scriptManager' )
20+ const { ArgumentValue } = require ( '../bidi/argumentValue' )
21+ const { LocalValue, ChannelValue } = require ( '../bidi/protocolValue' )
22+ const fs = require ( 'node:fs' )
23+ const path = require ( 'node:path' )
24+ const by = require ( './by' )
1925
2026class Script {
2127 #driver
2228 #logInspector
29+ #script
2330
2431 constructor ( driver ) {
2532 this . #driver = driver
@@ -38,6 +45,13 @@ class Script {
3845 this . #logInspector = await logInspector ( this . #driver)
3946 }
4047
48+ async #initScript( ) {
49+ if ( this . #script !== undefined ) {
50+ return
51+ }
52+ this . #script = await scriptManager ( [ ] , this . #driver)
53+ }
54+
4155 async addJavaScriptErrorHandler ( callback ) {
4256 await this . #init( )
4357 return await this . #logInspector. onJavascriptException ( callback )
@@ -58,6 +72,46 @@ class Script {
5872
5973 await this . #logInspector. removeCallback ( id )
6074 }
75+
76+ async addDomMutationHandler ( callback ) {
77+ await this . #initScript( )
78+
79+ let argumentValues = [ ]
80+ let value = new ArgumentValue ( LocalValue . createChannelValue ( new ChannelValue ( 'channel_name' ) ) )
81+ argumentValues . push ( value )
82+
83+ const filePath = path . join ( __dirname , 'atoms' , 'bidi-mutation-listener.js' )
84+
85+ let mutationListener = fs . readFileSync ( filePath , 'utf-8' ) . toString ( )
86+ await this . #script. addPreloadScript ( mutationListener , argumentValues )
87+
88+ let id = await this . #script. onMessage ( async ( message ) => {
89+ let payload = JSON . parse ( message [ 'data' ] [ 'value' ] )
90+ let elements = await this . #driver. findElements ( {
91+ css : '*[data-__webdriver_id=' + by . escapeCss ( payload [ 'target' ] ) + ']' ,
92+ } )
93+
94+ if ( elements . length === 0 ) {
95+ return
96+ }
97+
98+ let event = {
99+ element : elements [ 0 ] ,
100+ attribute_name : payload [ 'name' ] ,
101+ current_value : payload [ 'value' ] ,
102+ old_value : payload [ 'oldValue' ] ,
103+ }
104+ callback ( event )
105+ } )
106+
107+ return id
108+ }
109+
110+ async removeDomMutationHandler ( id ) {
111+ await this . #initScript( )
112+
113+ await this . #script. removeCallback ( id )
114+ }
61115}
62116
63117module . exports = Script
0 commit comments