@@ -35,7 +35,7 @@ class WebSocketConnection
3535
3636      MAX_LOG_MESSAGE_SIZE  =  9999 
3737
38-       def  initialize ( url :) 
38+       def  initialize ( url :,   protocol :  nil ) 
3939        @callback_threads  =  ThreadGroup . new 
4040
4141        @callbacks_mtx  =  Mutex . new 
@@ -45,6 +45,7 @@ def initialize(url:)
4545        @closing  =  false 
4646        @session_id  =  nil 
4747        @url  =  url 
48+         @protocol  =  protocol 
4849
4950        process_handshake 
5051        @socket_thread  =  attach_socket_listener 
@@ -91,7 +92,7 @@ def remove_callback(event, id)
9192          callbacks_for_event  =  callbacks [ event ] 
9293          return  if  callbacks_for_event . reject!  {  |cb | cb . object_id  == id  } 
9394
94-           ids  =  callbacks [ event ] & .map ( &:object_id ) 
95+           ids  =  callbacks_for_event . map ( &:object_id ) 
9596          raise  Error ::WebDriverError ,  "Callback with ID #{ id }   does not exist for event #{ event }  : #{ ids }  " 
9697        end 
9798      end 
@@ -109,9 +110,7 @@ def send_cmd(**payload)
109110          raise  e ,  "WebSocket is closed (#{ e . class }  : #{ e . message }  )" 
110111        end 
111112
112-         wait . until  do 
113-           @messages_mtx . synchronize  {  messages . delete ( id )  } 
114-         end 
113+         wait . until  {  @messages_mtx . synchronize  {  messages . delete ( id )  }  } 
115114      end 
116115
117116      private 
@@ -140,9 +139,8 @@ def attach_socket_listener
140139              message  =  process_frame ( frame ) 
141140              next  unless  message [ 'method' ] 
142141
143-               params  =  message [ 'params' ] 
144142              @messages_mtx . synchronize  {  callbacks [ message [ 'method' ] ] . dup  } . each  do  |callback |
145-                 @callback_threads . add ( callback_thread ( params ,  &callback ) ) 
143+                 @callback_threads . add ( callback_thread ( message [ ' params' ] ,  &callback ) ) 
146144              end 
147145            end 
148146          end 
@@ -178,10 +176,14 @@ def callback_thread(params)
178176        rescue  Error ::WebDriverError ,  *CONNECTION_ERRORS  =>  e 
179177          WebDriver . logger . debug  "Callback aborted: #{ e . class }  : #{ e . message }  " ,  id : :ws 
180178        rescue  StandardError  =>  e 
181-           # Main thread needs to know that it can stop waiting 
182-           Thread . main . raise ( e )  if  params [ 'isBlocked' ] 
183179          return  if  @closing 
184180
181+           if  devtools? 
182+             # Async thread exceptions are not deterministic and should not be relied on; we should stop 
183+             WebDriver . logger . deprecate ( 'propogating errors from DevTools callbacks' ) 
184+             Thread . main . raise ( e ) 
185+           end 
186+ 
185187          bt  =  Array ( e . backtrace ) . first ( 5 ) . join ( "\n " ) 
186188          WebDriver . logger . error  "Callback error: #{ e . class }  : #{ e . message } \n #{ bt }  " ,  id : :ws 
187189        end 
@@ -208,6 +210,14 @@ def ws
208210        @ws  ||= WebSocket ::Handshake ::Client . new ( url : @url ) 
209211      end 
210212
213+       def  devtools? 
214+         @protocol  == :devtools 
215+       end 
216+ 
217+       def  bidi? 
218+         @protocol  == :bidi 
219+       end 
220+ 
211221      def  next_id 
212222        @id  ||= 0 
213223        @id  += 1 
0 commit comments