Skip to content

Commit a49a934

Browse files
authored
Allow subscriptions to be removed (#455)
1 parent 4ede96c commit a49a934

File tree

4 files changed

+64
-0
lines changed

4 files changed

+64
-0
lines changed

lib/ferrum/client.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ def on(event, &block)
2828
@client.on(event_name(event), &block)
2929
end
3030

31+
def off(event, id)
32+
@client.off(event_name(event), id)
33+
end
34+
3135
def subscribed?(event)
3236
@client.subscribed?(event_name(event))
3337
end
@@ -101,6 +105,10 @@ def on(event, &block)
101105
@subscriber.on(event, &block)
102106
end
103107

108+
def off(event, id)
109+
@subscriber.off(event, id)
110+
end
111+
104112
def subscribed?(event)
105113
@subscriber.subscribed?(event)
106114
end

lib/ferrum/client/subscriber.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ def <<(message)
2424
def on(event, &block)
2525
@on[event] ||= Concurrent::Array.new
2626
@on[event] << block
27+
@on[event].index(block)
28+
end
29+
30+
def off(event, id)
31+
@on[event].delete_at(id)
2732
true
2833
end
2934

lib/ferrum/page.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,19 @@ def on(name, &block)
393393
end
394394
end
395395

396+
def off(name, id)
397+
case name
398+
when :dialog
399+
client.off("Page.javascriptDialogOpening", id)
400+
when :request
401+
client.off("Fetch.requestPaused", id)
402+
when :auth
403+
client.off("Fetch.authRequired", id)
404+
else
405+
client.off(name, id)
406+
end
407+
end
408+
396409
def subscribed?(event)
397410
client.subscribed?(event)
398411
end

spec/page_spec.rb

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,4 +196,42 @@
196196
expect(page.device_pixel_ratio).to eq(2)
197197
end
198198
end
199+
200+
describe "#on" do
201+
it "subscribes to an event" do
202+
message = nil
203+
204+
page.on("Runtime.consoleAPICalled") do |params|
205+
message = params.dig("args", 0, "value")
206+
end
207+
208+
page.evaluate("console.log('hello')")
209+
expect(message).to eq("hello")
210+
end
211+
end
212+
213+
describe "#off" do
214+
it "unsubscribes a specific event handler" do
215+
message_a = nil
216+
message_b = nil
217+
218+
a = page.on("Runtime.consoleAPICalled") do |params|
219+
message_a = params.dig("args", 0, "value")
220+
end
221+
222+
page.on("Runtime.consoleAPICalled") do |params|
223+
message_b = params.dig("args", 0, "value")
224+
end
225+
226+
page.evaluate("console.log('hello')")
227+
expect(message_a).to eq("hello")
228+
expect(message_b).to eq("hello")
229+
230+
page.off("Runtime.consoleAPICalled", a)
231+
page.evaluate("console.log('goodbye')")
232+
233+
expect(message_a).to eq("hello")
234+
expect(message_b).to eq("goodbye")
235+
end
236+
end
199237
end

0 commit comments

Comments
 (0)