Skip to content

Commit e7f1ef3

Browse files
committed
add suggested fixes
1 parent 9bf0deb commit e7f1ef3

File tree

3 files changed

+23
-14
lines changed

3 files changed

+23
-14
lines changed

rb/lib/selenium/webdriver/common/websocket_connection.rb

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,11 @@ class WebSocketConnection
3737

3838
def initialize(url:)
3939
@callback_threads = ThreadGroup.new
40-
@mtx = Mutex.new
40+
41+
@callbacks_mtx = Mutex.new
42+
@messages_mtx = Mutex.new
43+
@closing_mtx = Mutex.new
44+
4145
@closing = false
4246
@session_id = nil
4347
@url = url
@@ -47,7 +51,7 @@ def initialize(url:)
4751
end
4852

4953
def close
50-
@mtx.synchronize do
54+
@closing_mtx.synchronize do
5155
return if @closing
5256

5357
@closing = true
@@ -64,8 +68,8 @@ def close
6468
@socket_thread&.join(0.5)
6569
@callback_threads.list.each do |thread|
6670
thread.join(0.5)
67-
rescue StandardError
68-
nil
71+
rescue StandardError => e
72+
WebDriver.logger.debug "Failed to join thread during close: #{e.class}: #{e.message}", id: :ws
6973
end
7074
end
7175

@@ -74,18 +78,22 @@ def callbacks
7478
end
7579

7680
def add_callback(event, &block)
77-
@mtx.synchronize do
81+
@callbacks_mtx.synchronize do
7882
callbacks[event] << block
7983
block.object_id
8084
end
8185
end
8286

8387
def remove_callback(event, id)
84-
removed = @mtx.synchronize { callbacks[event].reject! { |cb| cb.object_id == id } }
85-
return if removed || @closing
88+
@callbacks_mtx.synchronize do
89+
return if @closing
90+
91+
callbacks_for_event = callbacks[event]
92+
return if callbacks_for_event.reject! { |cb| cb.object_id == id }
8693

87-
ids = @mtx.synchronize { callbacks[event]&.map(&:object_id) }
88-
raise Error::WebDriverError, "Callback with ID #{id} does not exist for event #{event}: #{ids}"
94+
ids = callbacks[event]&.map(&:object_id)
95+
raise Error::WebDriverError, "Callback with ID #{id} does not exist for event #{event}: #{ids}"
96+
end
8997
end
9098

9199
def send_cmd(**payload)
@@ -102,7 +110,7 @@ def send_cmd(**payload)
102110
end
103111

104112
wait.until do
105-
@mtx.synchronize { messages.delete(id) }
113+
@messages_mtx.synchronize { messages.delete(id) }
106114
end
107115
end
108116

@@ -133,7 +141,7 @@ def attach_socket_listener
133141
next unless message['method']
134142

135143
params = message['params']
136-
@mtx.synchronize { callbacks[message['method']].dup }.each do |callback|
144+
@messages_mtx.synchronize { callbacks[message['method']].dup }.each do |callback|
137145
@callback_threads.add(callback_thread(params, &callback))
138146
end
139147
end
@@ -154,7 +162,7 @@ def process_frame(frame)
154162
return {} if message.empty?
155163

156164
msg = JSON.parse(message)
157-
@mtx.synchronize { messages[msg['id']] = msg if msg.key?('id') }
165+
@messages_mtx.synchronize { messages[msg['id']] = msg if msg.key?('id') }
158166

159167
WebDriver.logger.debug "WebSocket <- #{msg}"[...MAX_LOG_MESSAGE_SIZE], id: :ws
160168
msg

rb/lib/selenium/webdriver/remote/bidi_bridge.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,10 @@ def refresh
4747

4848
def quit
4949
bidi.close
50-
super
5150
rescue *QUIT_ERRORS
5251
nil
52+
ensure
53+
super
5354
end
5455

5556
def close

rb/lib/selenium/webdriver/remote/bridge.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ def quit
217217
begin
218218
http.close
219219
rescue *QUIT_ERRORS => e
220-
WebDriver.logger.debug "http.close failed during quit: #{e.class}: #{e&.message}", id: :quit
220+
WebDriver.logger.debug "http.close failed during quit: #{e.class}: #{e.message}", id: :quit
221221
end
222222
end
223223
nil

0 commit comments

Comments
 (0)