puppeteer-ruby 0.41.0 → 0.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -50,33 +50,11 @@ class Puppeteer::Page
50
50
  @workers = {}
51
51
  @user_drag_interception_enabled = false
52
52
 
53
- @client.add_event_listener('Target.attachedToTarget') do |event|
54
- if event['targetInfo']['type'] != 'worker' && event['targetInfo']['type'] != 'iframe'
55
- # If we don't detach from service workers, they will never die.
56
- # We still want to attach to workers for emitting events.
57
- # We still want to attach to iframes so sessions may interact with them.
58
- # We detach from all other types out of an abundance of caution.
59
- # See https://source.chromium.org/chromium/chromium/src/+/main:content/browser/devtools/devtools_agent_host_impl.cc?ss=chromium&q=f:devtools%20-f:out%20%22::kTypePage%5B%5D%22
60
- # for the complete list of available types.
61
- @client.async_send_message('Target.detachFromTarget', sessionId: event['sessionId'])
62
- next
63
- end
64
-
65
- if event['targetInfo']['type'] == 'worker'
66
- session = Puppeteer::Connection.from_session(@client).session(event['sessionId']) # rubocop:disable Lint/UselessAssignment
67
- # const worker = new Worker(session, event.targetInfo.url, this._addConsoleMessage.bind(this), this._handleException.bind(this));
68
- # this._workers.set(event.sessionId, worker);
69
- # this.emit(PageEmittedEvents::WorkerCreated, worker);
70
- end
71
- end
72
- @client.add_event_listener('Target.detachedFromTarget') do |event|
73
- session_id = event['sessionId']
74
- worker = @workers[session_id]
75
- next unless worker
76
-
77
- emit_event(PageEmittedEvents::WorkerDestroyed, worker)
78
- @workers.delete(session_id)
79
- end
53
+ @target.target_manager.add_target_interceptor(@client, method(:handle_attached_to_target))
54
+ @target_gone_listener_id = @target.target_manager.add_event_listener(
55
+ TargetManagerEmittedEvents::TargetGone,
56
+ &method(:handle_detached_from_target)
57
+ )
80
58
 
81
59
  @frame_manager.on_event(FrameManagerEmittedEvents::FrameAttached) do |event|
82
60
  emit_event(PageEmittedEvents::FrameAttached, event)
@@ -135,15 +113,46 @@ class Puppeteer::Page
135
113
  handle_file_chooser(event)
136
114
  end
137
115
  @target.is_closed_promise.then do
116
+ @target.target_manager.remove_target_interceptor(@client, method(:handle_attached_to_target))
117
+ @target.target_manager.remove_event_listener(@target_gone_listener_id)
118
+
138
119
  emit_event(PageEmittedEvents::Close)
139
120
  @closed = true
140
121
  end
141
122
  end
142
123
 
124
+ private def handle_detached_from_target(target)
125
+ session_id = target.session&.id
126
+ @frame_manager.handle_detached_from_target(target)
127
+ return unless session_id
128
+ worker = @workers.delete(session_id)
129
+ return unless worker
130
+ emit_event(PageEmittedEvents::WorkerDestroyed, worker)
131
+ end
132
+
133
+ private def handle_attached_to_target(target, _)
134
+ @frame_manager.handle_attached_to_target(target)
135
+ if target.raw_type == 'worker'
136
+ # const session = createdTarget._session();
137
+ # assert(session);
138
+ # const worker = new WebWorker(
139
+ # session,
140
+ # createdTarget.url(),
141
+ # this.#addConsoleMessage.bind(this),
142
+ # this.#handleException.bind(this)
143
+ # );
144
+ # this.#workers.set(session.id(), worker);
145
+ # this.emit(PageEmittedEvents.WorkerCreated, worker);
146
+ end
147
+
148
+ if target.session
149
+ @target.target_manager.add_target_interceptor(target.session, method(:handle_attached_to_target))
150
+ end
151
+ end
152
+
143
153
  def init
144
154
  await_all(
145
- @frame_manager.async_init,
146
- @client.async_send_message('Target.setAutoAttach', autoAttach: true, waitForDebuggerOnStart: false, flatten: true),
155
+ @frame_manager.async_init(@target.target_id),
147
156
  @client.async_send_message('Performance.enable'),
148
157
  @client.async_send_message('Log.enable'),
149
158
  )
@@ -110,7 +110,7 @@ class Puppeteer::Puppeteer
110
110
  default_viewport: default_viewport,
111
111
  slow_mo: slow_mo,
112
112
  }.compact
113
- browser = launcher.connect(options)
113
+ browser = Puppeteer::BrowserConnector.new(options).connect_to_browser
114
114
  if block_given?
115
115
  begin
116
116
  yield(browser)
@@ -176,4 +176,8 @@ class Puppeteer::RemoteObject
176
176
  def set_file_input_files(client, files, backend_node_id)
177
177
  client.send_message('DOM.setFileInputFiles', objectId: @object_id, files: files, backendNodeId: backend_node_id)
178
178
  end
179
+
180
+ def scroll_into_view_if_needed(client)
181
+ client.send_message('DOM.scrollIntoViewIfNeeded', objectId: @object_id)
182
+ end
179
183
  end
@@ -19,11 +19,15 @@ class Puppeteer::Target
19
19
  # @param {boolean} ignoreHTTPSErrors
20
20
  # @param {?Puppeteer.Viewport} defaultViewport
21
21
  def initialize(target_info:,
22
+ session:,
22
23
  browser_context:,
24
+ target_manager:,
23
25
  session_factory:,
24
26
  ignore_https_errors:,
25
27
  default_viewport:,
26
28
  is_page_target_callback:)
29
+ @session = session
30
+ @target_manager = target_manager
27
31
  @target_info = target_info
28
32
  @browser_context = browser_context
29
33
  @target_id = target_info.target_id
@@ -83,13 +87,22 @@ class Puppeteer::Target
83
87
  @is_initialized
84
88
  end
85
89
 
90
+ # @return [CDPSession|nil]
91
+ def session
92
+ @session
93
+ end
94
+
86
95
  def create_cdp_session
87
96
  @session_factory.call
88
97
  end
89
98
 
99
+ def target_manager
100
+ @target_manager
101
+ end
102
+
90
103
  def page
91
104
  if @is_page_target_callback.call(@target_info) && @page.nil?
92
- client = @session_factory.call
105
+ client = @session || @session_factory.call
93
106
  @page = Puppeteer::Page.create(client, self, @ignore_https_errors, @default_viewport)
94
107
  end
95
108
  @page
@@ -1,3 +1,3 @@
1
1
  module Puppeteer
2
- VERSION = '0.41.0'
2
+ VERSION = '0.43.0'
3
3
  end
data/lib/puppeteer.rb CHANGED
@@ -22,7 +22,9 @@ require 'puppeteer/aria_query_handler'
22
22
  require 'puppeteer/browser'
23
23
  require 'puppeteer/browser_context'
24
24
  require 'puppeteer/browser_runner'
25
+ require 'puppeteer/browser_connector'
25
26
  require 'puppeteer/cdp_session'
27
+ require 'puppeteer/chrome_target_manager'
26
28
  require 'puppeteer/connection'
27
29
  require 'puppeteer/console_message'
28
30
  require 'puppeteer/coverage'
@@ -36,6 +38,7 @@ require 'puppeteer/exception_details'
36
38
  require 'puppeteer/executable_path_finder'
37
39
  require 'puppeteer/execution_context'
38
40
  require 'puppeteer/file_chooser'
41
+ require 'puppeteer/firefox_target_manager'
39
42
  require 'puppeteer/frame'
40
43
  require 'puppeteer/frame_manager'
41
44
  require 'puppeteer/http_request'
@@ -32,7 +32,7 @@ Gem::Specification.new do |spec|
32
32
  spec.add_development_dependency 'rollbar'
33
33
  spec.add_development_dependency 'rspec', '~> 3.11.0'
34
34
  spec.add_development_dependency 'rspec_junit_formatter' # for CircleCI.
35
- spec.add_development_dependency 'rubocop', '~> 1.31.0'
35
+ spec.add_development_dependency 'rubocop', '~> 1.36.0'
36
36
  spec.add_development_dependency 'rubocop-rspec'
37
37
  spec.add_development_dependency 'sinatra'
38
38
  spec.add_development_dependency 'webrick'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puppeteer-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.41.0
4
+ version: 0.43.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - YusukeIwaki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-07-03 00:00:00.000000000 Z
11
+ date: 2022-09-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -170,14 +170,14 @@ dependencies:
170
170
  requirements:
171
171
  - - "~>"
172
172
  - !ruby/object:Gem::Version
173
- version: 1.31.0
173
+ version: 1.36.0
174
174
  type: :development
175
175
  prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
178
  - - "~>"
179
179
  - !ruby/object:Gem::Version
180
- version: 1.31.0
180
+ version: 1.36.0
181
181
  - !ruby/object:Gem::Dependency
182
182
  name: rubocop-rspec
183
183
  requirement: !ruby/object:Gem::Requirement
@@ -255,10 +255,12 @@ files:
255
255
  - lib/puppeteer.rb
256
256
  - lib/puppeteer/aria_query_handler.rb
257
257
  - lib/puppeteer/browser.rb
258
+ - lib/puppeteer/browser_connector.rb
258
259
  - lib/puppeteer/browser_context.rb
259
260
  - lib/puppeteer/browser_fetcher.rb
260
261
  - lib/puppeteer/browser_runner.rb
261
262
  - lib/puppeteer/cdp_session.rb
263
+ - lib/puppeteer/chrome_target_manager.rb
262
264
  - lib/puppeteer/concurrent_ruby_utils.rb
263
265
  - lib/puppeteer/connection.rb
264
266
  - lib/puppeteer/console_message.rb
@@ -285,6 +287,7 @@ files:
285
287
  - lib/puppeteer/executable_path_finder.rb
286
288
  - lib/puppeteer/execution_context.rb
287
289
  - lib/puppeteer/file_chooser.rb
290
+ - lib/puppeteer/firefox_target_manager.rb
288
291
  - lib/puppeteer/frame.rb
289
292
  - lib/puppeteer/frame_manager.rb
290
293
  - lib/puppeteer/geolocation.rb