-
-
Notifications
You must be signed in to change notification settings - Fork 36
/
target.rb
158 lines (136 loc) · 4.45 KB
/
target.rb
1
2
3
4
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# https://github.com/puppeteer/puppeteer/blob/master/lib/Target.js
class Puppeteer::Target
class TargetInfo
def initialize(options)
@target_id = options['targetId']
@type = options['type']
@title = options['title']
@url = options['url']
@attached = options['attached']
@browser_context_id = options['browserContextId']
@opener_id = options['openerId']
end
attr_reader :target_id, :type, :title, :url, :attached, :browser_context_id, :opener_id
end
# @param {!Protocol.Target.TargetInfo} targetInfo
# @param {!Puppeteer.BrowserContext} browserContext
# @param {!function():!Promise<!Puppeteer.CDPSession>} sessionFactory
# @param {boolean} ignoreHTTPSErrors
# @param {?Puppeteer.Viewport} defaultViewport
def initialize(target_info:,
browser_context:,
session_factory:,
ignore_https_errors:,
default_viewport:,
is_page_target_callback:)
@target_info = target_info
@browser_context = browser_context
@target_id = target_info.target_id
@session_factory = session_factory
@ignore_https_errors = ignore_https_errors
@default_viewport = default_viewport
@is_page_target_callback = is_page_target_callback
# /** @type {?Promise<!Puppeteer.Page>} */
# this._pagePromise = null;
# /** @type {?Promise<!Worker>} */
# this._workerPromise = null;
@initialize_callback_promise = resolvable_future
@initialized_promise = @initialize_callback_promise.then do |success|
handle_initialized(success)
end
@is_closed_promise = resolvable_future
@is_initialized = !@is_page_target_callback.call(@target_info) || !@target_info.url.empty?
if @is_initialized
@initialize_callback_promise.fulfill(true)
end
end
attr_reader :target_id, :initialized_promise, :is_closed_promise
def closed_callback
@is_closed_promise.fulfill(true)
end
class InitializeFailure < StandardError; end
def ignore_initialize_callback_promise
unless @initialize_callback_promise.fulfilled?
@initialize_callback_promise.fulfill(false)
end
end
private def handle_initialized(success)
unless success
raise InitializeFailure.new('Failed to create target for page')
end
opener_page = opener&.page
if opener_page.nil? || type != 'page'
return true
end
# if (!openerPage.listenerCount(PageEmittedEvents::Popup))
# return true;
popup_page = page
opener_page.emit_event(PageEmittedEvents::Popup, popup_page)
true
end
def initialized?
@is_initialized
end
def create_cdp_session
@session_factory.call
end
def page
if @is_page_target_callback.call(@target_info) && @page.nil?
client = @session_factory.call
@page = Puppeteer::Page.create(client, self, @ignore_https_errors, @default_viewport)
end
@page
end
# /**
# * @return {!Promise<?Worker>}
# */
# async worker() {
# if (this._targetInfo.type !== 'service_worker' && this._targetInfo.type !== 'shared_worker')
# return null;
# if (!this._workerPromise) {
# // TODO(einbinder): Make workers send their console logs.
# this._workerPromise = this._sessionFactory()
# .then(client => new Worker(client, this._targetInfo.url, () => {} /* consoleAPICalled */, () => {} /* exceptionThrown */));
# }
# return this._workerPromise;
# }
# @return {string}
def url
@target_info.url
end
# @return {"page"|"background_page"|"service_worker"|"shared_worker"|"other"|"browser"}
def type
type = @target_info.type
if ['page', 'background_page', 'service_worker', 'shared_worker', 'browser'].include?(type)
type
else
'other'
end
end
# @internal
def raw_type
@target_info.type
end
# @return {!Puppeteer.Browser}
def browser
@browser_context.browser
end
# @return {!Puppeteer.BrowserContext}
def browser_context
@browser_context
end
# @return {?Puppeteer.Target}
def opener
opener_id = @target_info.opener_id
return nil if opener_id.nil?
browser.send(:find_target_by_id, opener_id)
end
# @param {!Protocol.Target.TargetInfo} targetInfo
def handle_target_info_changed(target_info)
@target_info = target_info
if !@is_initialized && (!@is_page_target_callback.call(@target_info) || !@target_info.url.empty?)
@is_initialized = true
@initialize_callback_promise.fulfill(true)
end
end
end