Class: Puppeteer::ChromeTargetManager
Defined Under Namespace
Classes: SessionNotCreatedError
Instance Method Summary
collapse
#add_event_listener, #emit_event, #observe_first, #off, #on_event, #remove_event_listener
Methods included from DebugPrint
#debug_print, #debug_puts
Constructor Details
#initialize(connection:, target_factory:, target_filter_callback:, block_list: nil, allow_list: nil) ⇒ ChromeTargetManager
Returns a new instance of ChromeTargetManager.
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
# File 'lib/puppeteer/chrome_target_manager.rb', line 5
def initialize(connection:, target_factory:, target_filter_callback:, block_list: nil, allow_list: nil)
@discovered_targets_by_target_id = {}
@attached_targets_by_target_id = {}
@attached_targets_by_session_id = {}
@ignored_targets = Set.new
@target_ids_for_init = Set.new
@service_worker_detach_promises = {}
@connection = connection
@target_filter_callback = target_filter_callback
@target_factory = target_factory
if block_list && allow_list
raise ArgumentError.new('Cannot specify both blocklist and allowlist')
end
if block_list && !block_list.is_a?(Array)
raise ArgumentError.new('block_list must be an Array of URL patterns')
end
if allow_list && !allow_list.is_a?(Array)
raise ArgumentError.new('allow_list must be an Array of URL patterns')
end
@block_list = map_patterns(block_list)
@allow_list = map_patterns(allow_list)
@target_interceptors = {}
@initialize_promise = Async::Promise.new
@initial_attach_done = false
@connection_event_listeners = []
@connection_event_listeners << @connection.add_event_listener(
'Target.targetCreated',
&method(:handle_target_created)
)
@connection_event_listeners << @connection.add_event_listener(
'Target.targetDestroyed',
&method(:handle_target_destroyed)
)
@connection_event_listeners << @connection.add_event_listener(
'Target.targetInfoChanged',
&method(:handle_target_info_changed)
)
@connection_event_listeners << @connection.add_event_listener(
'sessiondetached',
&method(:handle_session_detached)
)
setup_attachment_listeners(@connection)
Async do
@connection.async_send_message('Target.setDiscoverTargets', {
discover: true,
filter: [{}],
}).wait
store_existing_targets_for_init
rescue => err
debug_puts(err)
end
end
|
Instance Method Details
#add_target_interceptor(client, interceptor) ⇒ Object
115
116
117
118
119
|
# File 'lib/puppeteer/chrome_target_manager.rb', line 115
def add_target_interceptor(client, interceptor)
interceptors = @target_interceptors[client] || []
interceptors << interceptor
@target_interceptors[client] = interceptors
end
|
#available_targets ⇒ Object
90
91
92
|
# File 'lib/puppeteer/chrome_target_manager.rb', line 90
def available_targets
@attached_targets_by_target_id
end
|
#dispose ⇒ Object
85
86
87
88
|
# File 'lib/puppeteer/chrome_target_manager.rb', line 85
def dispose
@connection.remove_event_listener(*@connection_event_listeners)
remove_attachment_listeners(@connection)
end
|
#init ⇒ Object
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
# File 'lib/puppeteer/chrome_target_manager.rb', line 70
def init
@connection.send_message('Target.setAutoAttach', {
waitForDebuggerOnStart: true,
flatten: true,
autoAttach: true,
filter: [
{ type: 'page', exclude: true },
{},
],
})
@initial_attach_done = true
finish_initialization_if_ready
@initialize_promise.wait
end
|
#remove_extension_service_workers(extension_id) ⇒ Object
94
95
96
97
98
99
100
101
102
103
104
105
|
# File 'lib/puppeteer/chrome_target_manager.rb', line 94
def remove_extension_service_workers(extension_id)
extension_url = "chrome-extension://#{extension_id}/"
target_ids = @discovered_targets_by_target_id.filter_map do |target_id, target_info|
if target_info.type == 'service_worker' && target_info.url.start_with?(extension_url)
target_id
end
end
target_ids.each do |target_id|
@ignored_targets << target_id
handle_target_destroyed('targetId' => target_id)
end
end
|
#remove_target_interceptor(client, interceptor) ⇒ Object
121
122
123
|
# File 'lib/puppeteer/chrome_target_manager.rb', line 121
def remove_target_interceptor(client, interceptor)
@target_interceptors[client]&.delete_if { |current| current == interceptor }
end
|
#url_allowed?(url) ⇒ Boolean
375
376
377
378
379
380
381
382
383
384
385
386
387
|
# File 'lib/puppeteer/chrome_target_manager.rb', line 375
private def url_allowed?(url)
block_list = @block_list || []
allow_list = @allow_list || []
return true if block_list.empty? && allow_list.empty?
return true if url.nil? || url.empty? || url == 'about:blank'
blocked = block_list.any? { |item| item[:pattern].test?(url) }
return false if blocked
return true if allow_list.empty?
allow_list.any? { |item| item[:pattern].test?(url) }
end
|
#wait_for_service_worker_detach(target_id) ⇒ Object
107
108
109
110
111
112
113
|
# File 'lib/puppeteer/chrome_target_manager.rb', line 107
def wait_for_service_worker_detach(target_id)
promise = @service_worker_detach_promises[target_id]
return unless promise
promise.wait
ensure
@service_worker_detach_promises.delete(target_id)
end
|