puppeteer-bidi 0.0.1.beta10 → 0.0.1

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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/AGENTS.md +44 -0
  3. data/API_COVERAGE.md +345 -0
  4. data/CLAUDE/porting_puppeteer.md +20 -0
  5. data/CLAUDE.md +2 -1
  6. data/DEVELOPMENT.md +14 -0
  7. data/README.md +47 -415
  8. data/development/generate_api_coverage.rb +411 -0
  9. data/development/puppeteer_revision.txt +1 -0
  10. data/lib/puppeteer/bidi/browser.rb +118 -22
  11. data/lib/puppeteer/bidi/browser_context.rb +185 -2
  12. data/lib/puppeteer/bidi/connection.rb +16 -5
  13. data/lib/puppeteer/bidi/cookie_utils.rb +192 -0
  14. data/lib/puppeteer/bidi/core/browsing_context.rb +83 -40
  15. data/lib/puppeteer/bidi/core/realm.rb +6 -0
  16. data/lib/puppeteer/bidi/core/request.rb +79 -35
  17. data/lib/puppeteer/bidi/core/user_context.rb +5 -3
  18. data/lib/puppeteer/bidi/element_handle.rb +200 -8
  19. data/lib/puppeteer/bidi/errors.rb +4 -0
  20. data/lib/puppeteer/bidi/frame.rb +115 -11
  21. data/lib/puppeteer/bidi/http_request.rb +577 -0
  22. data/lib/puppeteer/bidi/http_response.rb +161 -10
  23. data/lib/puppeteer/bidi/locator.rb +792 -0
  24. data/lib/puppeteer/bidi/page.rb +859 -7
  25. data/lib/puppeteer/bidi/query_handler.rb +1 -1
  26. data/lib/puppeteer/bidi/version.rb +1 -1
  27. data/lib/puppeteer/bidi.rb +39 -6
  28. data/sig/puppeteer/bidi/browser.rbs +53 -6
  29. data/sig/puppeteer/bidi/browser_context.rbs +36 -0
  30. data/sig/puppeteer/bidi/cookie_utils.rbs +64 -0
  31. data/sig/puppeteer/bidi/core/browsing_context.rbs +16 -6
  32. data/sig/puppeteer/bidi/core/request.rbs +14 -11
  33. data/sig/puppeteer/bidi/core/user_context.rbs +2 -2
  34. data/sig/puppeteer/bidi/element_handle.rbs +28 -0
  35. data/sig/puppeteer/bidi/errors.rbs +4 -0
  36. data/sig/puppeteer/bidi/frame.rbs +17 -0
  37. data/sig/puppeteer/bidi/http_request.rbs +162 -0
  38. data/sig/puppeteer/bidi/http_response.rbs +67 -8
  39. data/sig/puppeteer/bidi/locator.rbs +267 -0
  40. data/sig/puppeteer/bidi/page.rbs +170 -0
  41. data/sig/puppeteer/bidi.rbs +15 -3
  42. metadata +12 -1
@@ -1,23 +1,174 @@
1
1
  # frozen_string_literal: true
2
2
  # rbs_inline: enabled
3
3
 
4
+ require "json"
5
+
4
6
  module Puppeteer
5
7
  module Bidi
6
- # HTTPResponse represents a response to an HTTP request
8
+ # HTTPResponse represents a response to an HTTP request.
7
9
  class HTTPResponse
8
- attr_reader :url
10
+ # @rbs data: Hash[String, untyped] -- BiDi response data
11
+ # @rbs request: HTTPRequest -- Associated request
12
+ # @rbs return: HTTPResponse
13
+ def self.from(data, request)
14
+ existing = request.response
15
+ if existing
16
+ existing.send(:update_data, data)
17
+ return existing
18
+ end
19
+
20
+ response = new(data: data, request: request)
21
+ response.send(:initialize_response)
22
+ response
23
+ end
24
+
25
+ # Create a synthetic response for BFCache restoration
26
+ # @rbs url: String -- Response URL
27
+ # @rbs status: Integer -- HTTP status code
28
+ # @rbs return: HTTPResponse
29
+ def self.for_bfcache(url:, status: 200)
30
+ data = {
31
+ "url" => url,
32
+ "status" => status,
33
+ "statusText" => "OK",
34
+ "headers" => [],
35
+ "fromCache" => true
36
+ }
37
+ new(data: data, request: nil)
38
+ end
39
+
40
+ attr_reader :request
9
41
 
10
- # @param url [String] Response URL
11
- # @param status [Integer] HTTP status code
12
- def initialize(url:, status: 200)
13
- @url = url
14
- @status = status
42
+ # @rbs data: Hash[String, untyped] -- BiDi response data
43
+ # @rbs request: HTTPRequest? -- Associated request (nil for BFCache)
44
+ # @rbs return: void
45
+ def initialize(data:, request:)
46
+ @data = data
47
+ @request = request
15
48
  end
16
49
 
17
- # Check if the response was successful (status code 200-299)
18
- # @return [Boolean] True if status code is in 2xx range
50
+ # @rbs return: Hash[Symbol, untyped]
51
+ def remote_address
52
+ { ip: "", port: -1 }
53
+ end
54
+
55
+ # @rbs return: String
56
+ def url
57
+ @data["url"]
58
+ end
59
+
60
+ # @rbs return: Integer
61
+ def status
62
+ @data["status"]
63
+ end
64
+
65
+ # @rbs return: String
66
+ def status_text
67
+ @data["statusText"]
68
+ end
69
+
70
+ # @rbs return: Hash[String, String]
71
+ def headers
72
+ headers = {}
73
+ (@data["headers"] || []).each do |header|
74
+ value = header["value"]
75
+ next unless value.is_a?(Hash)
76
+ next unless value["type"] == "string"
77
+
78
+ headers[header["name"].to_s.downcase] = value["value"]
79
+ end
80
+ headers
81
+ end
82
+
83
+ # @rbs return: bool
19
84
  def ok?
20
- @status >= 200 && @status < 300
85
+ current_status = status
86
+ current_status == 0 || (current_status >= 200 && current_status <= 299)
87
+ end
88
+
89
+ # @rbs return: Hash[String, untyped]?
90
+ def security_details
91
+ nil
92
+ end
93
+
94
+ # @rbs return: Hash[String, Numeric]?
95
+ def timing
96
+ bidi_timing = @request.timing
97
+ return nil if bidi_timing.nil? || bidi_timing.empty?
98
+
99
+ {
100
+ "requestTime" => bidi_timing["requestTime"],
101
+ "proxyStart" => -1,
102
+ "proxyEnd" => -1,
103
+ "dnsStart" => bidi_timing["dnsStart"],
104
+ "dnsEnd" => bidi_timing["dnsEnd"],
105
+ "connectStart" => bidi_timing["connectStart"],
106
+ "connectEnd" => bidi_timing["connectEnd"],
107
+ "sslStart" => bidi_timing["tlsStart"],
108
+ "sslEnd" => -1,
109
+ "workerStart" => -1,
110
+ "workerReady" => -1,
111
+ "workerFetchStart" => -1,
112
+ "workerRespondWithSettled" => -1,
113
+ "workerRouterEvaluationStart" => -1,
114
+ "workerCacheLookupStart" => -1,
115
+ "sendStart" => bidi_timing["requestStart"],
116
+ "sendEnd" => -1,
117
+ "pushStart" => -1,
118
+ "pushEnd" => -1,
119
+ "receiveHeadersStart" => bidi_timing["responseStart"],
120
+ "receiveHeadersEnd" => bidi_timing["responseEnd"],
121
+ }
122
+ end
123
+
124
+ # @rbs return: String
125
+ def content
126
+ @request.get_response_content
127
+ end
128
+
129
+ # @rbs return: String
130
+ def buffer
131
+ content
132
+ end
133
+
134
+ # @rbs return: String
135
+ def text
136
+ content.dup.force_encoding("UTF-8")
137
+ end
138
+
139
+ # @rbs return: untyped
140
+ def json
141
+ JSON.parse(text)
142
+ end
143
+
144
+ # @rbs return: bool
145
+ def from_cache?
146
+ @data["fromCache"] == true
147
+ end
148
+
149
+ # @rbs return: bool
150
+ def from_service_worker?
151
+ false
152
+ end
153
+
154
+ # @rbs return: Frame?
155
+ def frame
156
+ @request.frame
157
+ end
158
+
159
+ private
160
+
161
+ def initialize_response
162
+ if from_cache?
163
+ @request.instance_variable_set(:@from_memory_cache, true)
164
+ @request.frame.page.emit(:requestservedfromcache, @request)
165
+ end
166
+
167
+ @request.frame.page.emit(:response, self)
168
+ end
169
+
170
+ def update_data(data)
171
+ @data = data
21
172
  end
22
173
  end
23
174
  end