Class: Puppeteer::ChromeTargetManager

Inherits:
Object
  • Object
show all
Includes:
DebugPrint, EventCallbackable
Defined in:
lib/puppeteer/chrome_target_manager.rb

Defined Under Namespace

Classes: SessionNotCreatedError

Instance Method Summary collapse

Methods included from EventCallbackable

#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_targetsObject



90
91
92
# File 'lib/puppeteer/chrome_target_manager.rb', line 90

def available_targets
  @attached_targets_by_target_id
end

#disposeObject



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

#initObject



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

Returns:

  • (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