puppeteer-bidi 0.0.6 → 0.0.7
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.
- checksums.yaml +4 -4
- data/API_COVERAGE.md +26 -3
- data/lib/puppeteer/bidi/browser.rb +43 -4
- data/lib/puppeteer/bidi/browser_context.rb +48 -0
- data/lib/puppeteer/bidi/core/browsing_context.rb +3 -2
- data/lib/puppeteer/bidi/core/user_prompt.rb +32 -18
- data/lib/puppeteer/bidi/dialog.rb +65 -0
- data/lib/puppeteer/bidi/element_handle.rb +12 -24
- data/lib/puppeteer/bidi/frame.rb +4 -0
- data/lib/puppeteer/bidi/http_response.rb +6 -1
- data/lib/puppeteer/bidi/injected.js +1 -1
- data/lib/puppeteer/bidi/injected_source.rb +2 -2
- data/lib/puppeteer/bidi/version.rb +2 -2
- data/lib/puppeteer/bidi.rb +1 -0
- data/scripts/update_injected_source.rb +2 -2
- data/sig/puppeteer/bidi/browser.rbs +14 -0
- data/sig/puppeteer/bidi/browser_context.rbs +18 -0
- data/sig/puppeteer/bidi/core/user_prompt.rbs +6 -2
- data/sig/puppeteer/bidi/dialog.rbs +39 -0
- data/sig/puppeteer/bidi/injected_source.rbs +2 -2
- metadata +3 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 50cd7d1f0b4246d67ee0efc626abb598e50e2f7d043df7d76ea9616ba5c366fe
|
|
4
|
+
data.tar.gz: cd7700bd4f70674e71e6ded417f357f84a5c0cdf2d9a6cf918db383f8c6f60d8
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7dc2fe84ec1a08a05307f72206c85eabe7fd3452e946a7820a056a13761c2c9cf1dc79e1b69b567374cf278c2c68505c9ed3c70716132f72aba462f7fbf85301
|
|
7
|
+
data.tar.gz: 8b8586c88aba62bd88d7c0a49c770ae5be331c130616c068865a9f593e000fb820b2e928342841a28ca3d9b8550c1b124b7971a97db45f6afab80f03d5ad3993
|
data/API_COVERAGE.md
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
# API Coverage
|
|
2
2
|
|
|
3
|
-
- Puppeteer version: `25.
|
|
4
|
-
- Puppeteer commit: `
|
|
3
|
+
- Puppeteer version: `25.5.0`
|
|
4
|
+
- Puppeteer commit: `f8d63c73c3d7c21a8b0f421411e7df8386195436`
|
|
5
5
|
- Generated by: `development/generate_api_coverage.rb`
|
|
6
|
-
- Coverage: `
|
|
6
|
+
- Coverage: `201/298` (`67.45%`)
|
|
7
7
|
|
|
8
8
|
## Browser (Puppeteer::Bidi::Browser)
|
|
9
9
|
|
|
10
10
|
| Node.js | Ruby | Supported |
|
|
11
11
|
| --- | --- | :---: |
|
|
12
|
+
| `Browser.[asyncDisposeSymbol]` | `Puppeteer::Bidi::Browser#[async_dispose_symbol]` | ❌ |
|
|
13
|
+
| `Browser.[disposeSymbol]` | `Puppeteer::Bidi::Browser#[dispose_symbol]` | ❌ |
|
|
12
14
|
| `Browser.addScreen` | `Puppeteer::Bidi::Browser#add_screen` | ❌ |
|
|
13
15
|
| `Browser.browserContexts` | `Puppeteer::Bidi::Browser#browser_contexts` | ❌ |
|
|
14
16
|
| `Browser.close` | `Puppeteer::Bidi::Browser#close` | ✅ |
|
|
@@ -19,8 +21,11 @@
|
|
|
19
21
|
| `Browser.deleteMatchingCookies` | `Puppeteer::Bidi::Browser#delete_matching_cookies` | ✅ |
|
|
20
22
|
| `Browser.disconnect` | `Puppeteer::Bidi::Browser#disconnect` | ✅ |
|
|
21
23
|
| `Browser.extensions` | `Puppeteer::Bidi::Browser#extensions` | ❌ |
|
|
24
|
+
| `Browser.getPWAState` | `Puppeteer::Bidi::Browser#get_pwa_state` | ❌ |
|
|
22
25
|
| `Browser.getWindowBounds` | `Puppeteer::Bidi::Browser#get_window_bounds` | ✅ |
|
|
23
26
|
| `Browser.installExtension` | `Puppeteer::Bidi::Browser#install_extension` | ❌ |
|
|
27
|
+
| `Browser.installPWA` | `Puppeteer::Bidi::Browser#install_pwa` | ❌ |
|
|
28
|
+
| `Browser.launchPWA` | `Puppeteer::Bidi::Browser#launch_pwa` | ❌ |
|
|
24
29
|
| `Browser.newPage` | `Puppeteer::Bidi::Browser#new_page` | ✅ |
|
|
25
30
|
| `Browser.pages` | `Puppeteer::Bidi::Browser#pages` | ✅ |
|
|
26
31
|
| `Browser.process` | `Puppeteer::Bidi::Browser#process` | ✅ |
|
|
@@ -32,6 +37,7 @@
|
|
|
32
37
|
| `Browser.target` | `Puppeteer::Bidi::Browser#target` | ✅ |
|
|
33
38
|
| `Browser.targets` | `Puppeteer::Bidi::Browser#targets` | ✅ |
|
|
34
39
|
| `Browser.uninstallExtension` | `Puppeteer::Bidi::Browser#uninstall_extension` | ❌ |
|
|
40
|
+
| `Browser.uninstallPWA` | `Puppeteer::Bidi::Browser#uninstall_pwa` | ❌ |
|
|
35
41
|
| `Browser.userAgent` | `Puppeteer::Bidi::Browser#user_agent` | ✅ |
|
|
36
42
|
| `Browser.version` | `Puppeteer::Bidi::Browser#version` | ❌ |
|
|
37
43
|
| `Browser.waitForTarget` | `Puppeteer::Bidi::Browser#wait_for_target` | ✅ |
|
|
@@ -41,6 +47,8 @@
|
|
|
41
47
|
|
|
42
48
|
| Node.js | Ruby | Supported |
|
|
43
49
|
| --- | --- | :---: |
|
|
50
|
+
| `BrowserContext.[asyncDisposeSymbol]` | `Puppeteer::Bidi::BrowserContext#[async_dispose_symbol]` | ❌ |
|
|
51
|
+
| `BrowserContext.[disposeSymbol]` | `Puppeteer::Bidi::BrowserContext#[dispose_symbol]` | ❌ |
|
|
44
52
|
| `BrowserContext.browser` | `Puppeteer::Bidi::BrowserContext#browser` | ✅ |
|
|
45
53
|
| `BrowserContext.clearPermissionOverrides` | `Puppeteer::Bidi::BrowserContext#clear_permission_overrides` | ✅ |
|
|
46
54
|
| `BrowserContext.close` | `Puppeteer::Bidi::BrowserContext#close` | ✅ |
|
|
@@ -55,6 +63,17 @@
|
|
|
55
63
|
| `BrowserContext.targets` | `Puppeteer::Bidi::BrowserContext#targets` | ✅ |
|
|
56
64
|
| `BrowserContext.waitForTarget` | `Puppeteer::Bidi::BrowserContext#wait_for_target` | ✅ |
|
|
57
65
|
|
|
66
|
+
## Dialog (Puppeteer::Bidi::Dialog)
|
|
67
|
+
|
|
68
|
+
| Node.js | Ruby | Supported |
|
|
69
|
+
| --- | --- | :---: |
|
|
70
|
+
| `Dialog.accept` | `Puppeteer::Bidi::Dialog#accept` | ✅ |
|
|
71
|
+
| `Dialog.defaultValue` | `Puppeteer::Bidi::Dialog#default_value` | ✅ |
|
|
72
|
+
| `Dialog.dismiss` | `Puppeteer::Bidi::Dialog#dismiss` | ✅ |
|
|
73
|
+
| `Dialog.handled` | `Puppeteer::Bidi::Dialog#handled?` | ✅ |
|
|
74
|
+
| `Dialog.message` | `Puppeteer::Bidi::Dialog#message` | ✅ |
|
|
75
|
+
| `Dialog.type` | `Puppeteer::Bidi::Dialog#type` | ✅ |
|
|
76
|
+
|
|
58
77
|
## ElementHandle (Puppeteer::Bidi::ElementHandle)
|
|
59
78
|
|
|
60
79
|
| Node.js | Ruby | Supported |
|
|
@@ -190,6 +209,8 @@
|
|
|
190
209
|
|
|
191
210
|
| Node.js | Ruby | Supported |
|
|
192
211
|
| --- | --- | :---: |
|
|
212
|
+
| `JSHandle.[asyncDisposeSymbol]` | `Puppeteer::Bidi::JSHandle#[async_dispose_symbol]` | ❌ |
|
|
213
|
+
| `JSHandle.[disposeSymbol]` | `Puppeteer::Bidi::JSHandle#[dispose_symbol]` | ❌ |
|
|
193
214
|
| `JSHandle.asElement` | `Puppeteer::Bidi::JSHandle#as_element` | ✅ |
|
|
194
215
|
| `JSHandle.dispose` | `Puppeteer::Bidi::JSHandle#dispose` | ✅ |
|
|
195
216
|
| `JSHandle.evaluate` | `Puppeteer::Bidi::JSHandle#evaluate` | ✅ |
|
|
@@ -234,6 +255,8 @@
|
|
|
234
255
|
| `Page.$$` | `Puppeteer::Bidi::Page#query_selector_all` | ✅ |
|
|
235
256
|
| `Page.$$eval` | `Puppeteer::Bidi::Page#eval_on_selector_all` | ✅ |
|
|
236
257
|
| `Page.$eval` | `Puppeteer::Bidi::Page#eval_on_selector` | ✅ |
|
|
258
|
+
| `Page.[asyncDisposeSymbol]` | `Puppeteer::Bidi::Page#[async_dispose_symbol]` | ❌ |
|
|
259
|
+
| `Page.[disposeSymbol]` | `Puppeteer::Bidi::Page#[dispose_symbol]` | ❌ |
|
|
237
260
|
| `Page.addScriptTag` | `Puppeteer::Bidi::Page#add_script_tag` | ❌ |
|
|
238
261
|
| `Page.addStyleTag` | `Puppeteer::Bidi::Page#add_style_tag` | ❌ |
|
|
239
262
|
| `Page.authenticate` | `Puppeteer::Bidi::Page#authenticate` | ✅ |
|
|
@@ -8,6 +8,8 @@ module Puppeteer
|
|
|
8
8
|
module Bidi
|
|
9
9
|
# Browser represents a browser instance with BiDi connection
|
|
10
10
|
class Browser
|
|
11
|
+
TARGET_EVENTS = %i[targetcreated targetchanged targetdestroyed].freeze
|
|
12
|
+
|
|
11
13
|
attr_reader :connection #: Connection
|
|
12
14
|
attr_reader :process #: untyped
|
|
13
15
|
attr_reader :default_browser_context #: BrowserContext
|
|
@@ -57,13 +59,14 @@ module Puppeteer
|
|
|
57
59
|
@core_browser = core_browser
|
|
58
60
|
@session = session
|
|
59
61
|
@ws_endpoint = ws_endpoint
|
|
62
|
+
@emitter = Core::EventEmitter.new
|
|
63
|
+
@browser_contexts = {}
|
|
64
|
+
|
|
65
|
+
@core_browser.once(:disconnected) { @emitter.dispose }
|
|
60
66
|
|
|
61
67
|
# Create default browser context
|
|
62
68
|
default_user_context = @core_browser.default_user_context
|
|
63
|
-
@default_browser_context =
|
|
64
|
-
@browser_contexts = {
|
|
65
|
-
default_user_context.id => @default_browser_context
|
|
66
|
-
}
|
|
69
|
+
@default_browser_context = browser_context_for(default_user_context)
|
|
67
70
|
|
|
68
71
|
register_exit_cleanup if @launcher
|
|
69
72
|
end
|
|
@@ -259,9 +262,36 @@ module Puppeteer
|
|
|
259
262
|
# @rbs &block: (untyped) -> void -- Event handler
|
|
260
263
|
# @rbs return: void
|
|
261
264
|
def on(event, &block)
|
|
265
|
+
return @emitter.on(event, &block) if TARGET_EVENTS.include?(event.to_sym)
|
|
266
|
+
|
|
262
267
|
@connection.on(event, &block)
|
|
263
268
|
end
|
|
264
269
|
|
|
270
|
+
# Register a one-time event handler
|
|
271
|
+
# @rbs event: String | Symbol -- Event name
|
|
272
|
+
# @rbs &block: (untyped) -> void -- Event handler
|
|
273
|
+
# @rbs return: void
|
|
274
|
+
def once(event, &block)
|
|
275
|
+
return @emitter.once(event, &block) if TARGET_EVENTS.include?(event.to_sym)
|
|
276
|
+
|
|
277
|
+
# @type var wrapper: ^(untyped) -> void
|
|
278
|
+
wrapper = proc do |data|
|
|
279
|
+
@connection.off(event, &wrapper)
|
|
280
|
+
block.call(data)
|
|
281
|
+
end
|
|
282
|
+
@connection.on(event, &wrapper)
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
# Remove an event handler
|
|
286
|
+
# @rbs event: String | Symbol -- Event name
|
|
287
|
+
# @rbs &block: ((untyped) -> void)? -- Event handler to remove
|
|
288
|
+
# @rbs return: void
|
|
289
|
+
def off(event, &block)
|
|
290
|
+
return @emitter.off(event, &block) if TARGET_EVENTS.include?(event.to_sym)
|
|
291
|
+
|
|
292
|
+
@connection.off(event, &block)
|
|
293
|
+
end
|
|
294
|
+
|
|
265
295
|
# Close the browser
|
|
266
296
|
# @rbs return: void
|
|
267
297
|
def close
|
|
@@ -279,6 +309,8 @@ module Puppeteer
|
|
|
279
309
|
end
|
|
280
310
|
rescue => e
|
|
281
311
|
debug_error(e)
|
|
312
|
+
ensure
|
|
313
|
+
@emitter.dispose
|
|
282
314
|
end
|
|
283
315
|
|
|
284
316
|
@launcher&.kill
|
|
@@ -300,6 +332,8 @@ module Puppeteer
|
|
|
300
332
|
@connection.close
|
|
301
333
|
rescue StandardError => e
|
|
302
334
|
debug_error(e)
|
|
335
|
+
ensure
|
|
336
|
+
@emitter.dispose
|
|
303
337
|
end
|
|
304
338
|
end
|
|
305
339
|
end
|
|
@@ -461,6 +495,11 @@ module Puppeteer
|
|
|
461
495
|
return @browser_contexts[user_context.id] if @browser_contexts.key?(user_context.id)
|
|
462
496
|
|
|
463
497
|
context = BrowserContext.new(self, user_context)
|
|
498
|
+
TARGET_EVENTS.each do |event|
|
|
499
|
+
context.on(event) do |target|
|
|
500
|
+
@emitter.emit(event, target)
|
|
501
|
+
end
|
|
502
|
+
end
|
|
464
503
|
user_context.once(:closed) do
|
|
465
504
|
@browser_contexts.delete(user_context.id)
|
|
466
505
|
end
|
|
@@ -44,6 +44,35 @@ module Puppeteer
|
|
|
44
44
|
@pages = {}
|
|
45
45
|
@frame_targets = {}
|
|
46
46
|
@overrides = []
|
|
47
|
+
@emitter = Core::EventEmitter.new
|
|
48
|
+
|
|
49
|
+
@user_context.browsing_contexts.each { |browsing_context| page_for(browsing_context) }
|
|
50
|
+
@user_context.on(:browsingcontext) { |browsing_context| page_for(browsing_context) }
|
|
51
|
+
@user_context.once(:closed) { @emitter.dispose }
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Register an event listener
|
|
55
|
+
# @rbs event: Symbol | String -- Event name
|
|
56
|
+
# @rbs &block: (untyped) -> void -- Event handler
|
|
57
|
+
# @rbs return: void
|
|
58
|
+
def on(event, &block)
|
|
59
|
+
@emitter.on(event, &block)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Register a one-time event listener
|
|
63
|
+
# @rbs event: Symbol | String -- Event name
|
|
64
|
+
# @rbs &block: (untyped) -> void -- Event handler
|
|
65
|
+
# @rbs return: void
|
|
66
|
+
def once(event, &block)
|
|
67
|
+
@emitter.once(event, &block)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Remove an event listener
|
|
71
|
+
# @rbs event: Symbol | String -- Event name
|
|
72
|
+
# @rbs &block: ((untyped) -> void)? -- Event handler to remove
|
|
73
|
+
# @rbs return: void
|
|
74
|
+
def off(event, &block)
|
|
75
|
+
@emitter.off(event, &block)
|
|
47
76
|
end
|
|
48
77
|
|
|
49
78
|
# Create a new page (tab/window)
|
|
@@ -196,11 +225,30 @@ module Puppeteer
|
|
|
196
225
|
def page_for(browsing_context)
|
|
197
226
|
@pages[browsing_context.id] ||= begin
|
|
198
227
|
page = Page.new(self, browsing_context)
|
|
228
|
+
page_target = page.target
|
|
229
|
+
|
|
230
|
+
page.on(:frameattached) do |frame|
|
|
231
|
+
@emitter.emit(:targetcreated, target_for_frame(frame))
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
page.on(:framenavigated) do |frame|
|
|
235
|
+
target = frame.parent_frame ? target_for_frame(frame) : page_target
|
|
236
|
+
@emitter.emit(:targetchanged, target)
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
page.on(:framedetached) do |frame|
|
|
240
|
+
next unless frame.parent_frame
|
|
241
|
+
|
|
242
|
+
target = @frame_targets.delete(frame.browsing_context.id)
|
|
243
|
+
@emitter.emit(:targetdestroyed, target) if target
|
|
244
|
+
end
|
|
199
245
|
|
|
200
246
|
browsing_context.once(:closed) do
|
|
201
247
|
@pages.delete(browsing_context.id)
|
|
248
|
+
@emitter.emit(:targetdestroyed, page_target)
|
|
202
249
|
end
|
|
203
250
|
|
|
251
|
+
@emitter.emit(:targetcreated, page_target)
|
|
204
252
|
page
|
|
205
253
|
end
|
|
206
254
|
end
|
|
@@ -630,8 +630,9 @@ module Puppeteer
|
|
|
630
630
|
# User prompts
|
|
631
631
|
session.on('browsingContext.userPromptOpened') do |info|
|
|
632
632
|
next unless info['context'] == @id
|
|
633
|
-
|
|
634
|
-
|
|
633
|
+
|
|
634
|
+
user_prompt = UserPrompt.from(self, info)
|
|
635
|
+
emit(:userprompt, user_prompt)
|
|
635
636
|
end
|
|
636
637
|
|
|
637
638
|
# File dialog
|
|
@@ -48,27 +48,37 @@ module Puppeteer
|
|
|
48
48
|
# Handle the user prompt
|
|
49
49
|
# @rbs accept: bool? -- Whether to accept the prompt
|
|
50
50
|
# @rbs user_text: String? -- Text to enter (for prompt dialogs)
|
|
51
|
-
# @rbs return: Hash[String, untyped] -- Result of handling the prompt
|
|
51
|
+
# @rbs return: Async::Task[Hash[String, untyped]] -- Result of handling the prompt
|
|
52
52
|
def handle(accept: nil, user_text: nil)
|
|
53
|
-
|
|
53
|
+
Async do
|
|
54
|
+
raise UserPromptClosedError, @reason if closed?
|
|
54
55
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
params = { context: @info["context"] }
|
|
57
|
+
params[:accept] = accept unless accept.nil?
|
|
58
|
+
params[:userText] = user_text if user_text
|
|
58
59
|
|
|
59
|
-
|
|
60
|
+
session.async_send_command("browsingContext.handleUserPrompt", params).wait
|
|
60
61
|
|
|
61
|
-
|
|
62
|
-
|
|
62
|
+
# The handled event is emitted before the command response resolves.
|
|
63
|
+
@result
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def dispose
|
|
68
|
+
return if @disposed
|
|
69
|
+
|
|
70
|
+
@reason ||= "User prompt already closed, probably because the associated browsing context was destroyed."
|
|
71
|
+
emit(:closed, @reason)
|
|
72
|
+
super
|
|
63
73
|
end
|
|
64
74
|
|
|
65
75
|
protected
|
|
66
76
|
|
|
67
77
|
def perform_dispose
|
|
68
|
-
@
|
|
69
|
-
|
|
78
|
+
@browsing_context.off(:closed, &@context_closed_listener) if @context_closed_listener
|
|
79
|
+
session.off("browsingContext.userPromptClosed", &@prompt_closed_listener) if @prompt_closed_listener
|
|
70
80
|
@disposables.dispose
|
|
71
|
-
|
|
81
|
+
remove_all_listeners
|
|
72
82
|
end
|
|
73
83
|
|
|
74
84
|
private
|
|
@@ -79,18 +89,22 @@ module Puppeteer
|
|
|
79
89
|
|
|
80
90
|
def initialize_prompt
|
|
81
91
|
# Listen for browsing context closure
|
|
82
|
-
@
|
|
92
|
+
@context_closed_listener = proc do |reason|
|
|
83
93
|
dispose_prompt("User prompt already closed: #{reason}")
|
|
84
94
|
end
|
|
95
|
+
@browsing_context.on(:closed, &@context_closed_listener)
|
|
85
96
|
|
|
86
97
|
# Listen for prompt closed event
|
|
87
|
-
|
|
88
|
-
|
|
98
|
+
@prompt_closed_listener = method(:handle_prompt_closed).to_proc
|
|
99
|
+
session.on("browsingContext.userPromptClosed", &@prompt_closed_listener)
|
|
100
|
+
end
|
|
89
101
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
102
|
+
def handle_prompt_closed(params)
|
|
103
|
+
return unless params["context"] == @browsing_context.id
|
|
104
|
+
|
|
105
|
+
@result = params
|
|
106
|
+
emit(:handled, params)
|
|
107
|
+
dispose_prompt("User prompt already handled.")
|
|
94
108
|
end
|
|
95
109
|
|
|
96
110
|
def dispose_prompt(reason)
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
# rbs_inline: enabled
|
|
3
|
+
|
|
4
|
+
module Puppeteer
|
|
5
|
+
module Bidi
|
|
6
|
+
# Dialog instances are dispatched by Page via the :dialog event.
|
|
7
|
+
class Dialog
|
|
8
|
+
attr_reader :type #: String
|
|
9
|
+
attr_reader :message #: String
|
|
10
|
+
attr_reader :default_value #: String
|
|
11
|
+
|
|
12
|
+
# @rbs prompt: Core::UserPrompt -- Core user prompt
|
|
13
|
+
# @rbs return: Dialog -- Public dialog wrapper
|
|
14
|
+
def self.from(prompt)
|
|
15
|
+
new(prompt)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# @rbs prompt: Core::UserPrompt -- Core user prompt
|
|
19
|
+
# @rbs return: void
|
|
20
|
+
def initialize(prompt)
|
|
21
|
+
@prompt = prompt
|
|
22
|
+
@type = prompt.info["type"]
|
|
23
|
+
@message = prompt.info["message"]
|
|
24
|
+
@default_value = prompt.info.fetch("defaultValue", "")
|
|
25
|
+
@handled = prompt.handled?
|
|
26
|
+
|
|
27
|
+
prompt.once(:handled) do
|
|
28
|
+
@handled = true
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# @rbs return: bool -- Whether the dialog has been handled
|
|
33
|
+
def handled?
|
|
34
|
+
@handled
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# @rbs prompt_text: String? -- Text entered into a prompt dialog
|
|
38
|
+
# @rbs return: void
|
|
39
|
+
def accept(prompt_text = nil)
|
|
40
|
+
raise Error, "Cannot accept dialog which is already handled!" if handled?
|
|
41
|
+
|
|
42
|
+
@handled = true
|
|
43
|
+
handle(accept: true, text: prompt_text)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# @rbs return: void
|
|
47
|
+
def dismiss
|
|
48
|
+
raise Error, "Cannot dismiss dialog which is already handled!" if handled?
|
|
49
|
+
|
|
50
|
+
@handled = true
|
|
51
|
+
handle(accept: false)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
# @rbs accept: bool -- Whether to accept the dialog
|
|
57
|
+
# @rbs text: String? -- Prompt text
|
|
58
|
+
# @rbs return: void
|
|
59
|
+
def handle(accept:, text: nil)
|
|
60
|
+
@prompt.handle(accept: accept, user_text: text).wait
|
|
61
|
+
nil
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -702,31 +702,19 @@ module Puppeteer
|
|
|
702
702
|
def check_visibility(visible)
|
|
703
703
|
assert_not_disposed
|
|
704
704
|
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
return
|
|
711
|
-
}
|
|
712
|
-
|
|
713
|
-
// For text nodes, check parent element
|
|
714
|
-
const element = node.nodeType === Node.TEXT_NODE ? node.parentElement : node;
|
|
715
|
-
if (!element) {
|
|
716
|
-
return visible === false;
|
|
705
|
+
realm = frame.isolated_realm
|
|
706
|
+
adopted_element = realm.adopt_handle(self)
|
|
707
|
+
adopted_element.evaluate(
|
|
708
|
+
<<~JS,
|
|
709
|
+
(element, PuppeteerUtil, visibility) => {
|
|
710
|
+
return Boolean(PuppeteerUtil.checkVisibility(element, visibility));
|
|
717
711
|
}
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
!HIDDEN_VISIBILITY_VALUES.includes(style.visibility) &&
|
|
725
|
-
!isBoundingBoxEmpty;
|
|
726
|
-
|
|
727
|
-
return visible === isVisible;
|
|
728
|
-
}
|
|
729
|
-
JS
|
|
712
|
+
JS
|
|
713
|
+
realm.puppeteer_util_lazy_arg,
|
|
714
|
+
visible
|
|
715
|
+
)
|
|
716
|
+
ensure
|
|
717
|
+
adopted_element&.dispose
|
|
730
718
|
end
|
|
731
719
|
|
|
732
720
|
# Get bounding box ensuring it's non-empty and visible
|
data/lib/puppeteer/bidi/frame.rb
CHANGED
|
@@ -663,6 +663,10 @@ module Puppeteer
|
|
|
663
663
|
page.emit(:framenavigated, self)
|
|
664
664
|
end
|
|
665
665
|
|
|
666
|
+
@browsing_context.on(:userprompt) do |user_prompt|
|
|
667
|
+
page.emit(:dialog, Dialog.from(user_prompt))
|
|
668
|
+
end
|
|
669
|
+
|
|
666
670
|
@browsing_context.on(:request) do |request|
|
|
667
671
|
http_request = HTTPRequest.from(
|
|
668
672
|
request,
|
|
@@ -76,7 +76,12 @@ module Puppeteer
|
|
|
76
76
|
next unless value["type"] == "string"
|
|
77
77
|
|
|
78
78
|
header_name = header["name"].to_s.downcase
|
|
79
|
-
|
|
79
|
+
header_value = if headers.key?(header_name)
|
|
80
|
+
"#{headers[header_name]}\n#{value["value"]}"
|
|
81
|
+
else
|
|
82
|
+
value["value"]
|
|
83
|
+
end
|
|
84
|
+
headers[header_name] = HTTPUtils.normalize_header_value(header_name, header_value)
|
|
80
85
|
end
|
|
81
86
|
headers
|
|
82
87
|
end
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var N=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var G=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var r in e)N(t,r,{get:e[r],enumerable:!0})},J=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Y(e))!G.call(t,n)&&n!==r&&N(t,n,{get:()=>e[n],enumerable:!(o=B(e,n))||o.enumerable});return t};var z=t=>J(N({},"__esModule",{value:!0}),t);var ye={};l(ye,{default:()=>pe});module.exports=z(ye);var b=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}get[Symbol.toStringTag](){return this.constructor.name}},p=class extends b{};var c=class t{static create(e){return new t(e)}static async race(e){let r=new Set;try{let o=e.map(n=>n instanceof t?(n.#n&&r.add(n),n.valueOrThrow()):n);return await Promise.race(o)}finally{for(let o of r)o.reject(new Error("Timeout cleared"))}}#e=!1;#r=!1;#o;#t;#a=new Promise(e=>{this.#t=e});#n;#i;constructor(e){e&&e.timeout>0&&(this.#i=new p(e.message),this.#n=setTimeout(()=>{this.reject(this.#i)},e.timeout))}#l(e){clearTimeout(this.#n),this.#o=e,this.#t()}resolve(e){this.#r||this.#e||(this.#e=!0,this.#l(e))}reject(e){this.#r||this.#e||(this.#r=!0,this.#l(e))}resolved(){return this.#e}finished(){return this.#e||this.#r}value(){return this.#o}#s;valueOrThrow(){return this.#s||(this.#s=(async()=>{if(await this.#a,this.#r)throw this.#o;return this.#o})()),this.#s}};var W=new Map,j=t=>{let e=W.get(t);return e||(e=new Function(`return ${t}`)(),W.set(t,e),e)};var v={};l(v,{ariaQuerySelector:()=>K,ariaQuerySelectorAll:()=>x});var K=(t,e)=>globalThis.__ariaQuerySelector(t,e),x=async function*(t,e){yield*await globalThis.__ariaQuerySelectorAll(t,e)};var E={};l(E,{cssQuerySelector:()=>Z,cssQuerySelectorAll:()=>ee});var Z=(t,e)=>t.querySelector(e),ee=function(t,e){return t.querySelectorAll(e)};var A={};l(A,{CustomQuerySelectorRegistry:()=>y,customQuerySelectors:()=>P});var y=class{#e=new Map;register(e,r){if(!r.queryOne&&r.queryAll){let o=r.queryAll;r.queryOne=(n,i)=>{for(let s of o(n,i))return s;return null}}else if(r.queryOne&&!r.queryAll){let o=r.queryOne;r.queryAll=(n,i)=>{let s=o(n,i);return s?[s]:[]}}else if(!r.queryOne||!r.queryAll)throw new Error("At least one query method must be defined.");this.#e.set(e,{querySelector:r.queryOne,querySelectorAll:r.queryAll})}unregister(e){this.#e.delete(e)}get(e){return this.#e.get(e)}clear(){this.#e.clear()}},P=new y;var R={};l(R,{pierceQuerySelector:()=>te,pierceQuerySelectorAll:()=>re});var te=(t,e)=>{let r=null,o=n=>{let i=document.createTreeWalker(n,NodeFilter.SHOW_ELEMENT);do{let s=i.currentNode;s.shadowRoot&&o(s.shadowRoot),!(s instanceof ShadowRoot)&&s!==n&&!r&&s.matches(e)&&(r=s)}while(!r&&i.nextNode())};return t instanceof Document&&(t=t.documentElement),o(t),r},re=(t,e)=>{let r=[],o=n=>{let i=document.createTreeWalker(n,NodeFilter.SHOW_ELEMENT);do{let s=i.currentNode;s.shadowRoot&&o(s.shadowRoot),!(s instanceof ShadowRoot)&&s!==n&&s.matches(e)&&r.push(s)}while(i.nextNode())};return t instanceof Document&&(t=t.documentElement),o(t),r};var u=(t,e)=>{if(!t)throw new Error(e)};var w=class{#e;#r;#o;#t;constructor(e,r){this.#e=e,this.#r=r}async start(){let e=this.#t=c.create(),r=await this.#e();if(r){e.resolve(r);return}this.#o=new MutationObserver(async()=>{let o=await this.#e();o&&(e.resolve(o),await this.stop())}),this.#o.observe(this.#r,{childList:!0,subtree:!0,attributes:!0})}async stop(){u(this.#t,"Polling never started."),this.#t.finished()||this.#t.reject(new Error("Polling stopped")),this.#o&&(this.#o.disconnect(),this.#o=void 0)}result(){return u(this.#t,"Polling never started."),this.#t.valueOrThrow()}},T=class{#e;#r;constructor(e){this.#e=e}async start(){let e=this.#r=c.create(),r=await this.#e();if(r){e.resolve(r);return}let o=async()=>{if(e.finished())return;let n=await this.#e();if(!n){window.requestAnimationFrame(o);return}e.resolve(n),await this.stop()};window.requestAnimationFrame(o)}async stop(){u(this.#r,"Polling never started."),this.#r.finished()||this.#r.reject(new Error("Polling stopped"))}result(){return u(this.#r,"Polling never started."),this.#r.valueOrThrow()}},S=class{#e;#r;#o;#t;constructor(e,r){this.#e=e,this.#r=r}async start(){let e=this.#t=c.create(),r=await this.#e();if(r){e.resolve(r);return}this.#o=setInterval(async()=>{let o=await this.#e();o&&(e.resolve(o),await this.stop())},this.#r)}async stop(){u(this.#t,"Polling never started."),this.#t.finished()||this.#t.reject(new Error("Polling stopped")),this.#o&&(clearInterval(this.#o),this.#o=void 0)}result(){return u(this.#t,"Polling never started."),this.#t.valueOrThrow()}};var L={};l(L,{PCombinator:()=>U,pQuerySelector:()=>me,pQuerySelectorAll:()=>X});var a=class{static async*map(e,r){for await(let o of e)yield await r(o)}static async*flatMap(e,r){for await(let o of e)yield*r(o)}static async collect(e){let r=[];for await(let o of e)r.push(o);return r}static async first(e){for await(let r of e)return r}};var O={};l(O,{textQuerySelectorAll:()=>m});var oe=new Set(["checkbox","image","radio"]),ne=t=>t instanceof HTMLSelectElement||t instanceof HTMLTextAreaElement||t instanceof HTMLInputElement&&!oe.has(t.type),se=new Set(["SCRIPT","STYLE"]),f=t=>!se.has(t.nodeName)&&!document.head?.contains(t),C=new WeakMap,V=t=>{for(;t;)C.delete(t),t instanceof ShadowRoot?t=t.host:t=t.parentNode},F=new WeakSet,I,ie=()=>{let t=globalThis.MutationObserver;if(!t)throw new Error("MutationObserver is not available in this environment.");return I||(I=new t(e=>{for(let r of e)V(r.target)})),I},d=t=>{let e=C.get(t);if(e||(e={full:"",immediate:[]},!f(t)))return e;let r="";if(ne(t))e.full=t.value,e.immediate.push(t.value),t.addEventListener("input",o=>{V(o.target)},{once:!0,capture:!0});else{for(let o=t.firstChild;o;o=o.nextSibling){if(o.nodeType===Node.TEXT_NODE){e.full+=o.nodeValue??"",r+=o.nodeValue??"";continue}r&&e.immediate.push(r),r="",o.nodeType===Node.ELEMENT_NODE&&(e.full+=d(o).full)}r&&e.immediate.push(r),t instanceof Element&&t.shadowRoot&&(e.full+=d(t.shadowRoot).full),F.has(t)||(ie().observe(t,{childList:!0,characterData:!0,subtree:!0}),F.add(t))}return C.set(t,e),e};var m=function*(t,e){let r=!1;for(let o of t.childNodes)if(o instanceof Element&&f(o)){let n;o.shadowRoot?n=m(o.shadowRoot,e):n=m(o,e);for(let i of n)yield i,r=!0}r||t instanceof Element&&f(t)&&d(t).full.includes(e)&&(yield t)};var M={};l(M,{checkVisibility:()=>ae,pierce:()=>g,pierceAll:()=>k});var le=["hidden","collapse"],ae=(t,e)=>{if(!t)return e===!1;if(e===void 0)return t;let r=t.nodeType===Node.TEXT_NODE?t.parentElement:t
|
|
1
|
+
"use strict";var N=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var G=Object.prototype.hasOwnProperty;var l=(t,e)=>{for(var r in e)N(t,r,{get:e[r],enumerable:!0})},J=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Y(e))!G.call(t,n)&&n!==r&&N(t,n,{get:()=>e[n],enumerable:!(o=B(e,n))||o.enumerable});return t};var z=t=>J(N({},"__esModule",{value:!0}),t);var ye={};l(ye,{default:()=>pe});module.exports=z(ye);var b=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}get[Symbol.toStringTag](){return this.constructor.name}},p=class extends b{};var c=class t{static create(e){return new t(e)}static async race(e){let r=new Set;try{let o=e.map(n=>n instanceof t?(n.#n&&r.add(n),n.valueOrThrow()):n);return await Promise.race(o)}finally{for(let o of r)o.reject(new Error("Timeout cleared"))}}#e=!1;#r=!1;#o;#t;#a=new Promise(e=>{this.#t=e});#n;#i;constructor(e){e&&e.timeout>0&&(this.#i=new p(e.message),this.#n=setTimeout(()=>{this.reject(this.#i)},e.timeout))}#l(e){clearTimeout(this.#n),this.#o=e,this.#t()}resolve(e){this.#r||this.#e||(this.#e=!0,this.#l(e))}reject(e){this.#r||this.#e||(this.#r=!0,this.#l(e))}resolved(){return this.#e}finished(){return this.#e||this.#r}value(){return this.#o}#s;valueOrThrow(){return this.#s||(this.#s=(async()=>{if(await this.#a,this.#r)throw this.#o;return this.#o})()),this.#s}};var W=new Map,j=t=>{let e=W.get(t);return e||(e=new Function(`return ${t}`)(),W.set(t,e),e)};var v={};l(v,{ariaQuerySelector:()=>K,ariaQuerySelectorAll:()=>x});var K=(t,e)=>globalThis.__ariaQuerySelector(t,e),x=async function*(t,e){yield*await globalThis.__ariaQuerySelectorAll(t,e)};var E={};l(E,{cssQuerySelector:()=>Z,cssQuerySelectorAll:()=>ee});var Z=(t,e)=>t.querySelector(e),ee=function(t,e){return t.querySelectorAll(e)};var A={};l(A,{CustomQuerySelectorRegistry:()=>y,customQuerySelectors:()=>P});var y=class{#e=new Map;register(e,r){if(!r.queryOne&&r.queryAll){let o=r.queryAll;r.queryOne=(n,i)=>{for(let s of o(n,i))return s;return null}}else if(r.queryOne&&!r.queryAll){let o=r.queryOne;r.queryAll=(n,i)=>{let s=o(n,i);return s?[s]:[]}}else if(!r.queryOne||!r.queryAll)throw new Error("At least one query method must be defined.");this.#e.set(e,{querySelector:r.queryOne,querySelectorAll:r.queryAll})}unregister(e){this.#e.delete(e)}get(e){return this.#e.get(e)}clear(){this.#e.clear()}},P=new y;var R={};l(R,{pierceQuerySelector:()=>te,pierceQuerySelectorAll:()=>re});var te=(t,e)=>{let r=null,o=n=>{let i=document.createTreeWalker(n,NodeFilter.SHOW_ELEMENT);do{let s=i.currentNode;s.shadowRoot&&o(s.shadowRoot),!(s instanceof ShadowRoot)&&s!==n&&!r&&s.matches(e)&&(r=s)}while(!r&&i.nextNode())};return t instanceof Document&&(t=t.documentElement),o(t),r},re=(t,e)=>{let r=[],o=n=>{let i=document.createTreeWalker(n,NodeFilter.SHOW_ELEMENT);do{let s=i.currentNode;s.shadowRoot&&o(s.shadowRoot),!(s instanceof ShadowRoot)&&s!==n&&s.matches(e)&&r.push(s)}while(i.nextNode())};return t instanceof Document&&(t=t.documentElement),o(t),r};var u=(t,e)=>{if(!t)throw new Error(e)};var w=class{#e;#r;#o;#t;constructor(e,r){this.#e=e,this.#r=r}async start(){let e=this.#t=c.create(),r=await this.#e();if(r){e.resolve(r);return}this.#o=new MutationObserver(async()=>{let o=await this.#e();o&&(e.resolve(o),await this.stop())}),this.#o.observe(this.#r,{childList:!0,subtree:!0,attributes:!0})}async stop(){u(this.#t,"Polling never started."),this.#t.finished()||this.#t.reject(new Error("Polling stopped")),this.#o&&(this.#o.disconnect(),this.#o=void 0)}result(){return u(this.#t,"Polling never started."),this.#t.valueOrThrow()}},T=class{#e;#r;constructor(e){this.#e=e}async start(){let e=this.#r=c.create(),r=await this.#e();if(r){e.resolve(r);return}let o=async()=>{if(e.finished())return;let n=await this.#e();if(!n){window.requestAnimationFrame(o);return}e.resolve(n),await this.stop()};window.requestAnimationFrame(o)}async stop(){u(this.#r,"Polling never started."),this.#r.finished()||this.#r.reject(new Error("Polling stopped"))}result(){return u(this.#r,"Polling never started."),this.#r.valueOrThrow()}},S=class{#e;#r;#o;#t;constructor(e,r){this.#e=e,this.#r=r}async start(){let e=this.#t=c.create(),r=await this.#e();if(r){e.resolve(r);return}this.#o=setInterval(async()=>{let o=await this.#e();o&&(e.resolve(o),await this.stop())},this.#r)}async stop(){u(this.#t,"Polling never started."),this.#t.finished()||this.#t.reject(new Error("Polling stopped")),this.#o&&(clearInterval(this.#o),this.#o=void 0)}result(){return u(this.#t,"Polling never started."),this.#t.valueOrThrow()}};var L={};l(L,{PCombinator:()=>U,pQuerySelector:()=>me,pQuerySelectorAll:()=>X});var a=class{static async*map(e,r){for await(let o of e)yield await r(o)}static async*flatMap(e,r){for await(let o of e)yield*r(o)}static async collect(e){let r=[];for await(let o of e)r.push(o);return r}static async first(e){for await(let r of e)return r}};var O={};l(O,{textQuerySelectorAll:()=>m});var oe=new Set(["checkbox","image","radio"]),ne=t=>t instanceof HTMLSelectElement||t instanceof HTMLTextAreaElement||t instanceof HTMLInputElement&&!oe.has(t.type),se=new Set(["SCRIPT","STYLE"]),f=t=>!se.has(t.nodeName)&&!document.head?.contains(t),C=new WeakMap,V=t=>{for(;t;)C.delete(t),t instanceof ShadowRoot?t=t.host:t=t.parentNode},F=new WeakSet,I,ie=()=>{let t=globalThis.MutationObserver;if(!t)throw new Error("MutationObserver is not available in this environment.");return I||(I=new t(e=>{for(let r of e)V(r.target)})),I},d=t=>{let e=C.get(t);if(e||(e={full:"",immediate:[]},!f(t)))return e;let r="";if(ne(t))e.full=t.value,e.immediate.push(t.value),t.addEventListener("input",o=>{V(o.target)},{once:!0,capture:!0});else{for(let o=t.firstChild;o;o=o.nextSibling){if(o.nodeType===Node.TEXT_NODE){e.full+=o.nodeValue??"",r+=o.nodeValue??"";continue}r&&e.immediate.push(r),r="",o.nodeType===Node.ELEMENT_NODE&&(e.full+=d(o).full)}r&&e.immediate.push(r),t instanceof Element&&t.shadowRoot&&(e.full+=d(t.shadowRoot).full),F.has(t)||(ie().observe(t,{childList:!0,characterData:!0,subtree:!0}),F.add(t))}return C.set(t,e),e};var m=function*(t,e){let r=!1;for(let o of t.childNodes)if(o instanceof Element&&f(o)){let n;o.shadowRoot?n=m(o.shadowRoot,e):n=m(o,e);for(let i of n)yield i,r=!0}r||t instanceof Element&&f(t)&&d(t).full.includes(e)&&(yield t)};var M={};l(M,{checkVisibility:()=>ae,pierce:()=>g,pierceAll:()=>k});var le=["hidden","collapse"],ae=(t,e)=>{if(!t)return e===!1;if(e===void 0)return t;let r=t.nodeType===Node.TEXT_NODE?t.parentElement:t;if(!r)return e===!1;let o=window.getComputedStyle(r),n=o&&!le.includes(o.visibility)&&!ce(r);return e===n?t:!1};function ce(t){let e=t.getBoundingClientRect();return e.width===0||e.height===0}var ue=t=>"shadowRoot"in t&&t.shadowRoot instanceof ShadowRoot;function*g(t){ue(t)?yield t.shadowRoot:yield t}function*k(t){t=g(t).next().value,yield t;let e=[document.createTreeWalker(t,NodeFilter.SHOW_ELEMENT)];for(let r of e){let o;for(;o=r.nextNode();)o.shadowRoot&&(yield o.shadowRoot,e.push(document.createTreeWalker(o.shadowRoot,NodeFilter.SHOW_ELEMENT)))}}var D={};l(D,{xpathQuerySelectorAll:()=>q});var q=function*(t,e,r=-1){let n=(t.ownerDocument||document).evaluate(e,t,null,XPathResult.ORDERED_NODE_ITERATOR_TYPE),i=[],s;for(;(s=n.iterateNext())&&(i.push(s),!(r&&i.length===r)););for(let h=0;h<i.length;h++)s=i[h],yield s,i[h]=null};var de=/[-\w\P{ASCII}*]/u,U=(r=>(r.Descendent=">>>",r.Child=">>>>",r))(U||{}),H=t=>"querySelectorAll"in t,Q=class{#e;#r=[];#o=void 0;elements;constructor(e,r){this.elements=[e],this.#e=r,this.#t()}async run(){for(typeof this.#o=="string"&&this.#o.trimStart()===":scope"&&this.#t();this.#o!==void 0;this.#t()){let e=this.#o;typeof e=="string"?e[0]&&de.test(e[0])?this.elements=a.flatMap(this.elements,async function*(r){H(r)&&(yield*r.querySelectorAll(e))}):this.elements=a.flatMap(this.elements,async function*(r){if(!r.parentElement){if(!H(r))return;yield*r.querySelectorAll(e);return}let o=0;for(let n of r.parentElement.children)if(++o,n===r)break;yield*r.parentElement.querySelectorAll(`:scope>:nth-child(${o})${e}`)}):this.elements=a.flatMap(this.elements,async function*(r){switch(e.name){case"text":yield*m(r,e.value);break;case"xpath":yield*q(r,e.value);break;case"aria":yield*x(r,e.value);break;default:let o=P.get(e.name);if(!o)throw new Error(`Unknown selector type: ${e.name}`);yield*o.querySelectorAll(r,e.value)}})}}#t(){if(this.#r.length!==0){this.#o=this.#r.shift();return}if(this.#e.length===0){this.#o=void 0;return}let e=this.#e.shift();switch(e){case">>>>":{this.elements=a.flatMap(this.elements,g),this.#t();break}case">>>":{this.elements=a.flatMap(this.elements,k),this.#t();break}default:this.#r=e,this.#t();break}}},_=class{#e=new WeakMap;calculate(e,r=[]){if(e===null)return r;e instanceof ShadowRoot&&(e=e.host);let o=this.#e.get(e);if(o)return[...o,...r];let n=0;for(let s=e.previousSibling;s;s=s.previousSibling)++n;let i=this.calculate(e.parentNode,[n]);return this.#e.set(e,i),[...i,...r]}},$=(t,e)=>{if(t.length+e.length===0)return 0;let[r=-1,...o]=t,[n=-1,...i]=e;return r===n?$(o,i):r<n?-1:1},fe=async function*(t){let e=new Set;for await(let o of t)e.add(o);let r=new _;yield*[...e.values()].map(o=>[o,r.calculate(o)]).sort(([,o],[,n])=>$(o,n)).map(([o])=>o)},X=function(t,e){let r=JSON.parse(e);if(r.some(o=>{let n=0;return o.some(i=>(typeof i=="string"?++n:n=0,n>1))}))throw new Error("Multiple deep combinators found in sequence.");return fe(a.flatMap(r,o=>{let n=new Q(t,o);return n.run(),n.elements}))},me=async function(t,e){for await(let r of X(t,e))return r;return null};var he=Object.freeze({...v,...A,...R,...L,...O,...M,...D,...E,Deferred:c,createFunction:j,createTextContent:d,IntervalPoller:S,isSuitableNodeForTextMatching:f,MutationPoller:w,RAFPoller:T}),pe=he;
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
module Puppeteer
|
|
5
5
|
module Bidi
|
|
6
6
|
# Puppeteer's injected utilities (Poller classes, Deferred, etc.)
|
|
7
|
-
# Source: https://unpkg.com/puppeteer-core@25.
|
|
8
|
-
# Version: puppeteer-core@25.
|
|
7
|
+
# Source: https://unpkg.com/puppeteer-core@25.5.0/lib/puppeteer/generated/injected.js
|
|
8
|
+
# Version: puppeteer-core@25.5.0
|
|
9
9
|
#
|
|
10
10
|
# To update this file, run:
|
|
11
11
|
# bundle exec ruby scripts/update_injected_source.rb
|
data/lib/puppeteer/bidi.rb
CHANGED
|
@@ -34,6 +34,7 @@ require "puppeteer/bidi/mouse"
|
|
|
34
34
|
require "puppeteer/bidi/http_request"
|
|
35
35
|
require "puppeteer/bidi/http_response"
|
|
36
36
|
require "puppeteer/bidi/console_message"
|
|
37
|
+
require "puppeteer/bidi/dialog"
|
|
37
38
|
require "puppeteer/bidi/element_handle"
|
|
38
39
|
require "puppeteer/bidi/locator"
|
|
39
40
|
require "puppeteer/bidi/query_handler"
|
|
@@ -5,12 +5,12 @@
|
|
|
5
5
|
# Usage: bundle exec ruby scripts/update_injected_source.rb [VERSION]
|
|
6
6
|
#
|
|
7
7
|
# Example:
|
|
8
|
-
# bundle exec ruby scripts/update_injected_source.rb 25.
|
|
8
|
+
# bundle exec ruby scripts/update_injected_source.rb 25.5.0
|
|
9
9
|
|
|
10
10
|
require "net/http"
|
|
11
11
|
require "json"
|
|
12
12
|
|
|
13
|
-
VERSION = ARGV[0] || "25.
|
|
13
|
+
VERSION = ARGV[0] || "25.5.0"
|
|
14
14
|
PACKAGE_PATH = if VERSION.split(".", 2).first.to_i >= 25
|
|
15
15
|
"lib/puppeteer/generated/injected.js"
|
|
16
16
|
else
|
|
@@ -4,6 +4,8 @@ module Puppeteer
|
|
|
4
4
|
module Bidi
|
|
5
5
|
# Browser represents a browser instance with BiDi connection
|
|
6
6
|
class Browser
|
|
7
|
+
TARGET_EVENTS: untyped
|
|
8
|
+
|
|
7
9
|
attr_reader connection: Connection
|
|
8
10
|
|
|
9
11
|
attr_reader process: untyped
|
|
@@ -120,6 +122,18 @@ module Puppeteer
|
|
|
120
122
|
# @rbs return: void
|
|
121
123
|
def on: (String | Symbol event) { (untyped) -> void } -> void
|
|
122
124
|
|
|
125
|
+
# Register a one-time event handler
|
|
126
|
+
# @rbs event: String | Symbol -- Event name
|
|
127
|
+
# @rbs &block: (untyped) -> void -- Event handler
|
|
128
|
+
# @rbs return: void
|
|
129
|
+
def once: (String | Symbol event) { (untyped) -> void } -> void
|
|
130
|
+
|
|
131
|
+
# Remove an event handler
|
|
132
|
+
# @rbs event: String | Symbol -- Event name
|
|
133
|
+
# @rbs &block: ((untyped) -> void)? -- Event handler to remove
|
|
134
|
+
# @rbs return: void
|
|
135
|
+
def off: (String | Symbol event) ?{ (?) -> untyped } -> void
|
|
136
|
+
|
|
123
137
|
# Close the browser
|
|
124
138
|
# @rbs return: void
|
|
125
139
|
def close: () -> void
|
|
@@ -18,6 +18,24 @@ module Puppeteer
|
|
|
18
18
|
# @rbs return: void
|
|
19
19
|
def initialize: (Browser browser, Core::UserContext user_context) -> void
|
|
20
20
|
|
|
21
|
+
# Register an event listener
|
|
22
|
+
# @rbs event: Symbol | String -- Event name
|
|
23
|
+
# @rbs &block: (untyped) -> void -- Event handler
|
|
24
|
+
# @rbs return: void
|
|
25
|
+
def on: (Symbol | String event) { (untyped) -> void } -> void
|
|
26
|
+
|
|
27
|
+
# Register a one-time event listener
|
|
28
|
+
# @rbs event: Symbol | String -- Event name
|
|
29
|
+
# @rbs &block: (untyped) -> void -- Event handler
|
|
30
|
+
# @rbs return: void
|
|
31
|
+
def once: (Symbol | String event) { (untyped) -> void } -> void
|
|
32
|
+
|
|
33
|
+
# Remove an event listener
|
|
34
|
+
# @rbs event: Symbol | String -- Event name
|
|
35
|
+
# @rbs &block: ((untyped) -> void)? -- Event handler to remove
|
|
36
|
+
# @rbs return: void
|
|
37
|
+
def off: (Symbol | String event) ?{ (?) -> untyped } -> void
|
|
38
|
+
|
|
21
39
|
# Create a new page (tab/window)
|
|
22
40
|
# @rbs background: bool? -- Whether to open the page in background
|
|
23
41
|
# @rbs type: String? -- 'tab' or 'window'
|
|
@@ -34,8 +34,10 @@ module Puppeteer
|
|
|
34
34
|
# Handle the user prompt
|
|
35
35
|
# @rbs accept: bool? -- Whether to accept the prompt
|
|
36
36
|
# @rbs user_text: String? -- Text to enter (for prompt dialogs)
|
|
37
|
-
# @rbs return: Hash[String, untyped] -- Result of handling the prompt
|
|
38
|
-
def handle: (?accept: bool?, ?user_text: String?) -> Hash[String, untyped]
|
|
37
|
+
# @rbs return: Async::Task[Hash[String, untyped]] -- Result of handling the prompt
|
|
38
|
+
def handle: (?accept: bool?, ?user_text: String?) -> Async::Task[Hash[String, untyped]]
|
|
39
|
+
|
|
40
|
+
def dispose: () -> untyped
|
|
39
41
|
|
|
40
42
|
def perform_dispose: () -> untyped
|
|
41
43
|
|
|
@@ -45,6 +47,8 @@ module Puppeteer
|
|
|
45
47
|
|
|
46
48
|
def initialize_prompt: () -> untyped
|
|
47
49
|
|
|
50
|
+
def handle_prompt_closed: (untyped params) -> untyped
|
|
51
|
+
|
|
48
52
|
def dispose_prompt: (untyped reason) -> untyped
|
|
49
53
|
end
|
|
50
54
|
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Generated from lib/puppeteer/bidi/dialog.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Puppeteer
|
|
4
|
+
module Bidi
|
|
5
|
+
# Dialog instances are dispatched by Page via the :dialog event.
|
|
6
|
+
class Dialog
|
|
7
|
+
attr_reader type: String
|
|
8
|
+
|
|
9
|
+
attr_reader message: String
|
|
10
|
+
|
|
11
|
+
attr_reader default_value: String
|
|
12
|
+
|
|
13
|
+
# @rbs prompt: Core::UserPrompt -- Core user prompt
|
|
14
|
+
# @rbs return: Dialog -- Public dialog wrapper
|
|
15
|
+
def self.from: (Core::UserPrompt prompt) -> Dialog
|
|
16
|
+
|
|
17
|
+
# @rbs prompt: Core::UserPrompt -- Core user prompt
|
|
18
|
+
# @rbs return: void
|
|
19
|
+
def initialize: (Core::UserPrompt prompt) -> void
|
|
20
|
+
|
|
21
|
+
# @rbs return: bool -- Whether the dialog has been handled
|
|
22
|
+
def handled?: () -> bool
|
|
23
|
+
|
|
24
|
+
# @rbs prompt_text: String? -- Text entered into a prompt dialog
|
|
25
|
+
# @rbs return: void
|
|
26
|
+
def accept: (?String? prompt_text) -> void
|
|
27
|
+
|
|
28
|
+
# @rbs return: void
|
|
29
|
+
def dismiss: () -> void
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
# @rbs accept: bool -- Whether to accept the dialog
|
|
34
|
+
# @rbs text: String? -- Prompt text
|
|
35
|
+
# @rbs return: void
|
|
36
|
+
def handle: (accept: bool, ?text: String?) -> void
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
module Puppeteer
|
|
4
4
|
module Bidi
|
|
5
5
|
# Puppeteer's injected utilities (Poller classes, Deferred, etc.)
|
|
6
|
-
# Source: https://unpkg.com/puppeteer-core@25.
|
|
7
|
-
# Version: puppeteer-core@25.
|
|
6
|
+
# Source: https://unpkg.com/puppeteer-core@25.5.0/lib/puppeteer/generated/injected.js
|
|
7
|
+
# Version: puppeteer-core@25.5.0
|
|
8
8
|
#
|
|
9
9
|
# To update this file, run:
|
|
10
10
|
# bundle exec ruby scripts/update_injected_source.rb
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: puppeteer-bidi
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.7
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- YusukeIwaki
|
|
@@ -110,6 +110,7 @@ files:
|
|
|
110
110
|
- lib/puppeteer/bidi/core/user_context.rb
|
|
111
111
|
- lib/puppeteer/bidi/core/user_prompt.rb
|
|
112
112
|
- lib/puppeteer/bidi/deserializer.rb
|
|
113
|
+
- lib/puppeteer/bidi/dialog.rb
|
|
113
114
|
- lib/puppeteer/bidi/element_handle.rb
|
|
114
115
|
- lib/puppeteer/bidi/errors.rb
|
|
115
116
|
- lib/puppeteer/bidi/exposed_function.rb
|
|
@@ -160,6 +161,7 @@ files:
|
|
|
160
161
|
- sig/puppeteer/bidi/core/user_context.rbs
|
|
161
162
|
- sig/puppeteer/bidi/core/user_prompt.rbs
|
|
162
163
|
- sig/puppeteer/bidi/deserializer.rbs
|
|
164
|
+
- sig/puppeteer/bidi/dialog.rbs
|
|
163
165
|
- sig/puppeteer/bidi/element_handle.rbs
|
|
164
166
|
- sig/puppeteer/bidi/errors.rbs
|
|
165
167
|
- sig/puppeteer/bidi/exposed_function.rbs
|