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

Returns a new instance of 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