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) ⇒ 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
# File 'lib/puppeteer/chrome_target_manager.rb', line 5

def initialize(connection:, target_factory:, target_filter_callback:, block_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
  @block_list = block_list
  if @block_list && !@block_list.is_a?(Array)
    raise ArgumentError.new('block_list must be an Array of URL patterns')
  end
  @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: [
        { type: 'tab', exclude: true },
        {},
      ],
    }).wait
    store_existing_targets_for_init
  rescue => err
    debug_puts(err)
  end
end

Instance Method Details

#add_target_interceptor(client, interceptor) ⇒ Object



94
95
96
97
98
# File 'lib/puppeteer/chrome_target_manager.rb', line 94

def add_target_interceptor(client, interceptor)
  interceptors = @target_interceptors[client] || []
  interceptors << interceptor
  @target_interceptors[client] = interceptors
end

#available_targetsObject



82
83
84
# File 'lib/puppeteer/chrome_target_manager.rb', line 82

def available_targets
  @attached_targets_by_target_id
end

#disposeObject



77
78
79
80
# File 'lib/puppeteer/chrome_target_manager.rb', line 77

def dispose
  @connection.remove_event_listener(*@connection_event_listeners)
  remove_attachment_listeners(@connection)
end

#initObject



66
67
68
69
70
71
72
73
74
75
# File 'lib/puppeteer/chrome_target_manager.rb', line 66

def init
  @connection.send_message('Target.setAutoAttach', {
    waitForDebuggerOnStart: true,
    flatten: true,
    autoAttach: true,
  })
  @initial_attach_done = true
  finish_initialization_if_ready
  @initialize_promise.wait
end

#remove_target_interceptor(client, interceptor) ⇒ Object



100
101
102
# File 'lib/puppeteer/chrome_target_manager.rb', line 100

def remove_target_interceptor(client, interceptor)
  @target_interceptors[client]&.delete_if { |current| current == interceptor }
end

#wait_for_service_worker_detach(target_id) ⇒ Object



86
87
88
89
90
91
92
# File 'lib/puppeteer/chrome_target_manager.rb', line 86

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