@@ -27,14 +27,58 @@ const { RemoteValue } = require('./protocolValue')
2727const { Source } = require ( './scriptTypes' )
2828const { WebDriverError } = require ( '../lib/error' )
2929
30+ const ScriptEvent = {
31+ MESSAGE : 'script.message' ,
32+ REALM_CREATED : 'script.realmCreated' ,
33+ REALM_DESTROYED : 'script.realmDestroyed' ,
34+ }
35+
3036/**
3137 * Represents class to run events and commands of Script module.
3238 * Described in https://w3c.github.io/webdriver-bidi/#module-script.
3339 * @class
3440 */
3541class ScriptManager {
42+ #callbackId = 0
43+ #listener
44+
3645 constructor ( driver ) {
3746 this . _driver = driver
47+ this . #listener = new Map ( )
48+ this . #listener. set ( ScriptEvent . MESSAGE , new Map ( ) )
49+ this . #listener. set ( ScriptEvent . REALM_CREATED , new Map ( ) )
50+ this . #listener. set ( ScriptEvent . REALM_DESTROYED , new Map ( ) )
51+ }
52+
53+ addCallback ( eventType , callback ) {
54+ const id = ++ this . #callbackId
55+
56+ const eventCallbackMap = this . #listener. get ( eventType )
57+ eventCallbackMap . set ( id , callback )
58+ return id
59+ }
60+
61+ removeCallback ( id ) {
62+ let hasId = false
63+ for ( const [ , callbacks ] of this . #listener) {
64+ if ( callbacks . has ( id ) ) {
65+ callbacks . delete ( id )
66+ hasId = true
67+ }
68+ }
69+
70+ if ( ! hasId ) {
71+ throw Error ( `Callback with id ${ id } not found` )
72+ }
73+ }
74+
75+ invokeCallbacks ( eventType , data ) {
76+ const callbacks = this . #listener. get ( eventType )
77+ if ( callbacks ) {
78+ for ( const [ , callback ] of callbacks ) {
79+ callback ( data )
80+ }
81+ }
3882 }
3983
4084 async init ( browsingContextIds ) {
@@ -251,6 +295,14 @@ class ScriptManager {
251295 params . contexts = new Array ( this . _browsingContextIds )
252296 }
253297
298+ if ( argumentValueList != null ) {
299+ let argumentParams = [ ]
300+ argumentValueList . forEach ( ( argumentValue ) => {
301+ argumentParams . push ( argumentValue . asMap ( ) )
302+ } )
303+ params [ 'arguments' ] = argumentParams
304+ }
305+
254306 const command = {
255307 method : 'script.addPreloadScript' ,
256308 params,
@@ -433,7 +485,7 @@ class ScriptManager {
433485 * @returns {Promise<void> } - A promise that resolves when the subscription is successful.
434486 */
435487 async onMessage ( callback ) {
436- await this . subscribeAndHandleEvent ( 'script.message' , callback )
488+ return await this . subscribeAndHandleEvent ( ScriptEvent . MESSAGE , callback )
437489 }
438490
439491 /**
@@ -443,7 +495,7 @@ class ScriptManager {
443495 * @returns {Promise<void> } - A promise that resolves when the subscription is successful.
444496 */
445497 async onRealmCreated ( callback ) {
446- await this . subscribeAndHandleEvent ( 'script.realmCreated' , callback )
498+ return await this . subscribeAndHandleEvent ( ScriptEvent . REALM_CREATED , callback )
447499 }
448500
449501 /**
@@ -453,19 +505,18 @@ class ScriptManager {
453505 * @returns {Promise<void> } - A promise that resolves when the subscription is successful.
454506 */
455507 async onRealmDestroyed ( callback ) {
456- await this . subscribeAndHandleEvent ( 'script.realmDestroyed' , callback )
508+ return await this . subscribeAndHandleEvent ( ScriptEvent . REALM_DESTROYED , callback )
457509 }
458510
459511 async subscribeAndHandleEvent ( eventType , callback ) {
460- if ( this . browsingContextIds != null ) {
461- await this . bidi . subscribe ( eventType , this . browsingContextIds )
512+ if ( this . _browsingContextIds != null ) {
513+ await this . bidi . subscribe ( eventType , this . _browsingContextIds )
462514 } else {
463515 await this . bidi . subscribe ( eventType )
464516 }
465- await this . _on ( callback )
466- }
467517
468- async _on ( callback ) {
518+ let id = this . addCallback ( eventType , callback )
519+
469520 this . ws = await this . bidi . socket
470521 this . ws . on ( 'message' , ( event ) => {
471522 const { params } = JSON . parse ( Buffer . from ( event . toString ( ) ) )
@@ -482,9 +533,11 @@ class ScriptManager {
482533 response = params . realm
483534 }
484535 }
485- callback ( response )
536+ this . invokeCallbacks ( eventType , response )
486537 }
487538 } )
539+
540+ return id
488541 }
489542
490543 async close ( ) {
0 commit comments