Class: Puppeteer::FirefoxTargetManager

Inherits:
Object
  • Object
show all
Includes:
EventCallbackable
Defined in:
lib/puppeteer/firefox_target_manager.rb

Overview

FirefoxTargetManager implements target management using ‘Target.setDiscoverTargets` without using auto-attach. It, therefore, creates targets that lazily establish their CDP sessions.

Although the approach is potentially flaky, there is no other way for Firefox because Firefox’s CDP implementation does not support auto-attach.

Firefox does not support targetInfoChanged and detachedFromTarget events:

Defined Under Namespace

Classes: SessionNotCreatedError

Instance Method Summary collapse

Methods included from EventCallbackable

#add_event_listener, #emit_event, #observe_first, #on_event, #remove_event_listener

Constructor Details

#initialize(connection:, target_factory:, target_filter_callback:) ⇒ FirefoxTargetManager



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
# File 'lib/puppeteer/firefox_target_manager.rb', line 14

def initialize(connection:, target_factory:, target_filter_callback:)
  @discovered_targets_by_target_id = {}
  @available_targets_by_target_id = {}
  @available_targets_by_session_id = {}
  @ignored_targets = Set.new
  @target_ids_for_init = Set.new

  @connection = connection
  @target_filter_callback = target_filter_callback
  @target_factory = target_factory
  @target_interceptors = {}
  @initialize_promise = resolvable_future

  @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(
    'sessiondetached',
    &method(:handle_session_detached)
  )

  setup_attachment_listeners(@connection)
end

Instance Method Details

#add_target_interceptor(client, interceptor) ⇒ Object



44
45
46
47
48
# File 'lib/puppeteer/firefox_target_manager.rb', line 44

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

#available_targetsObject



74
75
76
# File 'lib/puppeteer/firefox_target_manager.rb', line 74

def available_targets
  @available_targets_by_target_id
end

#disposeObject



78
79
80
81
# File 'lib/puppeteer/firefox_target_manager.rb', line 78

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

#initObject



83
84
85
86
87
# File 'lib/puppeteer/firefox_target_manager.rb', line 83

def init
  @connection.send_message('Target.setDiscoverTargets', discover: true)
  @target_ids_for_init.merge(@discovered_targets_by_target_id.keys)
  @initialize_promise.value!
end

#remove_target_interceptor(client, interceptor) ⇒ Object



50
51
52
# File 'lib/puppeteer/firefox_target_manager.rb', line 50

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