dommy 0.15.0 → 0.16.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.
Files changed (171) hide show
  1. checksums.yaml +4 -4
  2. data/lib/dommy/backend.rb +16 -15
  3. data/lib/dommy/blob.rb +17 -0
  4. data/lib/dommy/bridge/values.rb +29 -2
  5. data/lib/dommy/bridge/wire_tags.rb +8 -4
  6. data/lib/dommy/browser.rb +324 -49
  7. data/lib/dommy/character_data.rb +20 -27
  8. data/lib/dommy/class_list.rb +24 -9
  9. data/lib/dommy/cookie_jar.rb +408 -0
  10. data/lib/dommy/cookie_store.rb +104 -49
  11. data/lib/dommy/css.rb +34 -8
  12. data/lib/dommy/custom_elements.rb +362 -114
  13. data/lib/dommy/data_transfer.rb +22 -2
  14. data/lib/dommy/document.rb +1071 -200
  15. data/lib/dommy/dom_exception.rb +6 -0
  16. data/lib/dommy/dom_parser.rb +46 -14
  17. data/lib/dommy/dom_string_list.rb +36 -0
  18. data/lib/dommy/element.rb +217 -102
  19. data/lib/dommy/element_internals.rb +215 -0
  20. data/lib/dommy/encodings.rb +10 -0
  21. data/lib/dommy/event.rb +378 -122
  22. data/lib/dommy/event_source.rb +4 -30
  23. data/lib/dommy/file_reader.rb +5 -29
  24. data/lib/dommy/form_data.rb +40 -6
  25. data/lib/dommy/form_entry_list.rb +106 -137
  26. data/lib/dommy/fragment.rb +11 -10
  27. data/lib/dommy/history.rb +247 -90
  28. data/lib/dommy/html_canvas_element.rb +15 -35
  29. data/lib/dommy/html_collection.rb +49 -30
  30. data/lib/dommy/html_elements/base.rb +111 -69
  31. data/lib/dommy/html_elements/embedded.rb +349 -105
  32. data/lib/dommy/html_elements/forms/form.rb +407 -368
  33. data/lib/dommy/html_elements/forms/input.rb +333 -174
  34. data/lib/dommy/html_elements/forms/select.rb +90 -74
  35. data/lib/dommy/html_elements/interactive.rb +274 -64
  36. data/lib/dommy/html_elements/media.rb +71 -30
  37. data/lib/dommy/html_elements/metadata.rb +215 -71
  38. data/lib/dommy/html_elements/miscellaneous.rb +58 -14
  39. data/lib/dommy/html_elements/tables.rb +7 -9
  40. data/lib/dommy/html_elements.rb +23 -1
  41. data/lib/dommy/hyperlink_utils.rb +15 -4
  42. data/lib/dommy/interaction/drag_and_drop.rb +187 -0
  43. data/lib/dommy/interaction/event_synthesis.rb +182 -24
  44. data/lib/dommy/interaction/field_interactor.rb +17 -5
  45. data/lib/dommy/interaction/form_submission.rb +10 -4
  46. data/lib/dommy/interaction/key_sender.rb +101 -16
  47. data/lib/dommy/interaction.rb +1 -0
  48. data/lib/dommy/internal/accessibility_tree.rb +15 -3
  49. data/lib/dommy/internal/accessible_description.rb +1 -1
  50. data/lib/dommy/internal/accessible_name.rb +10 -17
  51. data/lib/dommy/internal/aria_role.rb +1 -1
  52. data/lib/dommy/internal/autofill.rb +2 -2
  53. data/lib/dommy/internal/backend_prefilter.rb +1 -5
  54. data/lib/dommy/internal/ce_reactions.rb +285 -0
  55. data/lib/dommy/internal/ce_reactions_table.rb +296 -0
  56. data/lib/dommy/internal/child_list.rb +7 -43
  57. data/lib/dommy/internal/child_navigable.rb +155 -0
  58. data/lib/dommy/internal/child_node.rb +44 -41
  59. data/lib/dommy/internal/close_watcher_manager.rb +238 -0
  60. data/lib/dommy/internal/complex_match.rb +3 -1
  61. data/lib/dommy/internal/constraint_validation.rb +130 -0
  62. data/lib/dommy/internal/css/ancestor_filter.rb +107 -0
  63. data/lib/dommy/internal/css/cascade.rb +7 -7
  64. data/lib/dommy/internal/css/cascaded_declarations.rb +4 -1
  65. data/lib/dommy/internal/css/computed_style_builder.rb +9 -3
  66. data/lib/dommy/internal/css/custom_properties.rb +41 -29
  67. data/lib/dommy/internal/css/parser.rb +0 -22
  68. data/lib/dommy/internal/css/renderability.rb +6 -0
  69. data/lib/dommy/internal/css/rule_index.rb +149 -98
  70. data/lib/dommy/internal/css/rule_index_inputs.rb +135 -0
  71. data/lib/dommy/internal/css/selector_dependencies.rb +8 -2
  72. data/lib/dommy/internal/css/style_cache.rb +7 -4
  73. data/lib/dommy/internal/css/ua_stylesheet.rb +34 -0
  74. data/lib/dommy/internal/declarative_shadow_roots.rb +182 -0
  75. data/lib/dommy/internal/document_generations.rb +55 -2
  76. data/lib/dommy/internal/document_interaction_state.rb +293 -9
  77. data/lib/dommy/internal/dom_matching.rb +2 -2
  78. data/lib/dommy/internal/element_aria.rb +25 -19
  79. data/lib/dommy/internal/element_popover.rb +226 -25
  80. data/lib/dommy/internal/element_shadow.rb +97 -26
  81. data/lib/dommy/internal/element_state.rb +98 -5
  82. data/lib/dommy/internal/element_top_layer.rb +15 -1
  83. data/lib/dommy/internal/enumerated_keyword_sets.rb +40 -0
  84. data/lib/dommy/internal/event_handler_tables.rb +241 -0
  85. data/lib/dommy/internal/event_handlers.rb +149 -0
  86. data/lib/dommy/internal/exception_report.rb +1 -1
  87. data/lib/dommy/internal/focusability.rb +267 -0
  88. data/lib/dommy/internal/form_associated_custom_elements.rb +127 -0
  89. data/lib/dommy/internal/html_or_svg_or_mathml_element.rb +34 -23
  90. data/lib/dommy/internal/html_serialization.rb +292 -0
  91. data/lib/dommy/internal/idl_reflection.rb +202 -0
  92. data/lib/dommy/internal/idl_reflection_table.rb +589 -0
  93. data/lib/dommy/internal/infra.rb +9 -0
  94. data/lib/dommy/internal/input_type.rb +76 -18
  95. data/lib/dommy/internal/insertion_point.rb +27 -3
  96. data/lib/dommy/internal/js_number.rb +60 -0
  97. data/lib/dommy/internal/light_dismiss.rb +178 -0
  98. data/lib/dommy/internal/mime_type.rb +8 -0
  99. data/lib/dommy/internal/mutation_coordinator.rb +94 -62
  100. data/lib/dommy/internal/node_adopter.rb +52 -4
  101. data/lib/dommy/internal/node_factory.rb +111 -7
  102. data/lib/dommy/internal/node_identity.rb +1 -1
  103. data/lib/dommy/internal/node_traversal.rb +22 -4
  104. data/lib/dommy/internal/node_wrapper_cache.rb +6 -38
  105. data/lib/dommy/internal/observer_options.rb +24 -14
  106. data/lib/dommy/internal/origin.rb +86 -0
  107. data/lib/dommy/internal/parent_node.rb +10 -8
  108. data/lib/dommy/internal/popover_invoker_element.rb +67 -0
  109. data/lib/dommy/internal/popover_stack.rb +120 -0
  110. data/lib/dommy/internal/post_insertion_steps.rb +140 -71
  111. data/lib/dommy/internal/reflected_attributes.rb +128 -18
  112. data/lib/dommy/internal/rendered_text/collector.rb +1 -5
  113. data/lib/dommy/internal/rendered_text/fragment.rb +6 -2
  114. data/lib/dommy/internal/selector_arguments.rb +2 -1
  115. data/lib/dommy/internal/selector_match.rb +1 -1
  116. data/lib/dommy/internal/selector_matcher.rb +11 -6
  117. data/lib/dommy/internal/selector_parser.rb +14 -1
  118. data/lib/dommy/internal/sequential_focus_navigation.rb +210 -0
  119. data/lib/dommy/internal/shadow_root_registry.rb +7 -0
  120. data/lib/dommy/internal/template_content_registry.rb +7 -1
  121. data/lib/dommy/internal/text_selection.rb +185 -32
  122. data/lib/dommy/internal/toggle_events.rb +6 -4
  123. data/lib/dommy/internal/unsafe_html.rb +107 -0
  124. data/lib/dommy/internal/url_parser.rb +84 -8
  125. data/lib/dommy/internal/user_activation.rb +192 -0
  126. data/lib/dommy/internal/web_idl.rb +149 -16
  127. data/lib/dommy/internal/window_constructors.rb +26 -6
  128. data/lib/dommy/internal/xml_serialization.rb +3 -3
  129. data/lib/dommy/js/constructor_resolver.rb +18 -0
  130. data/lib/dommy/js/custom_element_bridge.rb +57 -82
  131. data/lib/dommy/js/dom_interfaces.rb +50 -15
  132. data/lib/dommy/js/host_bridge.rb +189 -40
  133. data/lib/dommy/js/host_runtime.js +1897 -415
  134. data/lib/dommy/js/marshaller.rb +13 -4
  135. data/lib/dommy/js/module_loader.rb +37 -6
  136. data/lib/dommy/js/module_preload.rb +107 -29
  137. data/lib/dommy/js/script_boot.rb +197 -115
  138. data/lib/dommy/js/serialized_record.rb +32 -0
  139. data/lib/dommy/js/webidl_event_handlers.js +45 -0
  140. data/lib/dommy/js/webidl_members.js +196 -0
  141. data/lib/dommy/js/webidl_signatures.js +2055 -0
  142. data/lib/dommy/js/webidl_tables.js +47 -100
  143. data/lib/dommy/js/window_wiring.rb +9 -5
  144. data/lib/dommy/location.rb +129 -76
  145. data/lib/dommy/media_query_list.rb +4 -13
  146. data/lib/dommy/message_channel.rb +137 -64
  147. data/lib/dommy/mutation_observer.rb +2 -0
  148. data/lib/dommy/navigation.rb +59 -9
  149. data/lib/dommy/navigator.rb +131 -5
  150. data/lib/dommy/node.rb +19 -11
  151. data/lib/dommy/notification.rb +9 -1
  152. data/lib/dommy/promise.rb +8 -0
  153. data/lib/dommy/range.rb +5 -34
  154. data/lib/dommy/resources.rb +38 -3
  155. data/lib/dommy/scheduler.rb +176 -48
  156. data/lib/dommy/shadow_root.rb +117 -19
  157. data/lib/dommy/storage.rb +135 -25
  158. data/lib/dommy/structured_data.rb +45 -0
  159. data/lib/dommy/style_declaration.rb +16 -0
  160. data/lib/dommy/text_codec.rb +2 -14
  161. data/lib/dommy/tree_walker.rb +10 -18
  162. data/lib/dommy/url.rb +11 -4
  163. data/lib/dommy/validity_state.rb +109 -107
  164. data/lib/dommy/version.rb +1 -1
  165. data/lib/dommy/web_socket.rb +5 -28
  166. data/lib/dommy/window.rb +811 -99
  167. data/lib/dommy/worker.rb +4 -28
  168. data/lib/dommy/xml_http_request.rb +32 -45
  169. data/lib/dommy.rb +35 -1
  170. metadata +35 -4
  171. data/lib/dommy/internal/cookie_jar.rb +0 -29
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b0d28c900db6681f80910f285f05e95985648e6bf824990f23d4f4b4b47bdaf9
4
- data.tar.gz: 509faf8cfe617d13f1ff69507254c3ef7987d77a9bdf796fa7ce44836d63c798
3
+ metadata.gz: d948ccbb7ca08b92aedc5222fe46bf219060f0e2ae2903bc49b8de3401321cb2
4
+ data.tar.gz: 621b638bd22e4decae148605015885c49ef93b0c44f2fbadcb0d0b542b489a0d
5
5
  SHA512:
6
- metadata.gz: d52a0dec8dca36a172c0ff93e89ab75126049a6b85eeea2a7527c99a162cc087b98cdf11afa7a98d0cd5024bce642ac612f955babf15a3b02af63cbddc336981
7
- data.tar.gz: f8de49a82844eee7f75e5b5db13a798b7210b70a9bc1e902b85c37819fc79e98c71a2dd8d60abeeaa4f16de9a2679c15f27d48d57f7005b2345ac5a1e0fce7b5
6
+ metadata.gz: 89eec9a0136a58ce216bee43e800b584b42a9e41702ebf172d5f4938d937707ab8209e43ca4d5d314eee39aeefbb8c3097317aca6aba7fa6d5fee3f38c95952c
7
+ data.tar.gz: cac802773d9c86b06ecd2e50057741521c6bfea1d7e1f86a8cbbf520f73827207cb4b9f3bef12c19dc0e699850a042487c0704f4f6c290a7af2f53e03f50199a
data/lib/dommy/backend.rb CHANGED
@@ -78,12 +78,15 @@ module Dommy
78
78
  # which matches no-quirks everywhere Dommy asks). An XML document is
79
79
  # never in it.
80
80
  def quirks_mode?(doc)
81
- doc.respond_to?(:quirks_mode?) && doc.quirks_mode?
81
+ doc.quirks_mode?
82
82
  end
83
83
 
84
84
  # An empty backing document matching `doc`'s kind (HTML stays HTML, XML
85
85
  # stays XML) — for a shallow document clone, whose result keeps the
86
86
  # source flavor.
87
+ # Whether `doc` is an HTML-backed document (the HTML parser built it).
88
+ def html_backed?(doc) = !doc.is_a?(::Makiri::XML::Document)
89
+
87
90
  def empty_document_like(doc)
88
91
  doc.is_a?(::Makiri::XML::Document) ? empty_xml_document : empty_document
89
92
  end
@@ -135,21 +138,13 @@ module Dommy
135
138
  end
136
139
 
137
140
  # The DOM's createElement: an element whose local name is `local_name`
138
- # as written, colons included (`foo:` and `f::oo` are valid local names,
139
- # not prefixed ones), in `namespace` — the HTML namespace in an HTML or
140
- # XHTML document, nil in any other. An XML document's own creator parses
141
- # a QName, so its element is built from the parts. An HTML-backed one —
142
- # which a document typed as XHTML or XML after an HTML parse also is —
143
- # makes it by createElementNS, which keeps the name's case and the
144
- # namespace given; that splits a name at its colon, and refuses `xmlns`
145
- # outside the XMLNS namespace, as createElementNS must — so a name with
146
- # a colon, or `xmlns`, takes the HTML document's creator, which keeps
147
- # the name as written but folds it into the HTML namespace in lower case.
141
+ # as written, colons and case included (`foo:` and `f::oo` are valid
142
+ # local names, not prefixed ones), in `namespace` — the HTML namespace
143
+ # in an HTML or XHTML document, nil in any other. Makiri builds it from
144
+ # the parts in an HTML and an XML document alike, without parsing the
145
+ # name as a QName.
148
146
  def create_element(local_name, namespace, doc)
149
- return doc.create_loose_dom_element(local_name, nil, local_name, namespace) unless doc.is_a?(::Makiri::HTML::Document)
150
- return doc.create_element(local_name) if local_name.include?(":") || local_name == "xmlns"
151
-
152
- doc.create_element_ns(namespace, local_name)
147
+ doc.create_loose_dom_element(local_name, nil, local_name, namespace)
153
148
  end
154
149
 
155
150
  # The DOM's createElementNS, in an HTML or an XML document alike: the
@@ -327,6 +322,12 @@ module Dommy
327
322
  node.attribute_value_ns(nil, local_name)
328
323
  end
329
324
 
325
+ # The qualified names of the element's attributes, in order, without
326
+ # materializing an attribute node for each (Element#getAttributeNames).
327
+ def attribute_names(node)
328
+ node.keys
329
+ end
330
+
330
331
  # The element's attribute nodes (each readable via attribute_ns_info).
331
332
  # The single choke point so DOM code doesn't touch parser internals.
332
333
  def attribute_nodes(node)
data/lib/dommy/blob.rb CHANGED
@@ -43,6 +43,12 @@ module Dommy
43
43
  File.new([@data], name, {"type" => @type}, @window)
44
44
  end
45
45
 
46
+ # Blob's serialization + deserialization steps (structured clone): a new
47
+ # Blob over the same bytes and type.
48
+ def __internal_structured_clone__(_for_storage = false)
49
+ Blob.new([@data], {"type" => @type}, @window)
50
+ end
51
+
46
52
  # Return a new Blob over a byte range of this one.
47
53
  # Negative indices are treated as offsets from the end (per spec).
48
54
  def slice(start = 0, last = @size, content_type = "")
@@ -181,6 +187,12 @@ module Dommy
181
187
  @last_modified = (raw_lm || (Time.now.to_f * 1000)).to_i
182
188
  end
183
189
 
190
+ # File's serialization + deserialization steps: bytes, type, name and
191
+ # lastModified.
192
+ def __internal_structured_clone__(_for_storage = false)
193
+ File.new([@data], @name, {"type" => @type, "lastModified" => @last_modified}, @window)
194
+ end
195
+
184
196
  def __js_get__(key)
185
197
  case key
186
198
  when "name"
@@ -210,6 +222,11 @@ module Dommy
210
222
 
211
223
  alias size length
212
224
 
225
+ # FileList's serialization + deserialization steps: each File cloned.
226
+ def __internal_structured_clone__(for_storage = false)
227
+ FileList.new(@files.map { |file| file.__internal_structured_clone__(for_storage) })
228
+ end
229
+
213
230
  def item(index)
214
231
  @files[index.to_i]
215
232
  end
@@ -3,8 +3,8 @@
3
3
  module Dommy
4
4
  module Bridge
5
5
  # The Ruby shapes a JS value takes while it is on this side: an opaque
6
- # reference, and the two byte buffers that cross as a typed array or a bare
7
- # ArrayBuffer.
6
+ # reference (a Date one carrying its time value), and the two byte buffers
7
+ # that cross as a typed array or a bare ArrayBuffer.
8
8
 
9
9
  # An opaque handle to a JS-side value that Ruby only stores and hands back
10
10
  # (an AbortSignal's reason, a CustomEvent's detail). A non-plain JS object
@@ -35,6 +35,33 @@ module Dommy
35
35
  def inspect = "#<Dommy::Bridge::JSValue #{to_s}>"
36
36
  end
37
37
 
38
+ # A JS Date that crossed into Ruby. It is still an opaque reference, so
39
+ # handing it back returns the same Date, but it also carries its time value
40
+ # (ms since the epoch, NaN for an invalid date) — the one thing a host API
41
+ # taking a Date (`input.valueAsDate = d`) needs to read off it. A Date the
42
+ # host creates crosses from a Ruby ::Time instead.
43
+ class Date < JSValue
44
+ # The largest time value a JS Date can hold, either side of the epoch.
45
+ MAX_TIME_VALUE = 8_640_000_000_000_000
46
+
47
+ # The time value a JS Date made from `time` holds — ECMAScript's TimeClip:
48
+ # whole milliseconds truncated toward zero (0.1 ms before the epoch is 0,
49
+ # not -1), and NaN beyond MAX_TIME_VALUE.
50
+ def self.time_value_of(time)
51
+ ms = (time.to_r * 1000).truncate
52
+ ms.abs > MAX_TIME_VALUE ? ::Float::NAN : ms.to_f
53
+ end
54
+
55
+ attr_reader :time_value
56
+
57
+ def initialize(ref, time_value)
58
+ super(ref, nil, nil, "Date")
59
+ @time_value = time_value
60
+ end
61
+
62
+ def inspect = "#<Dommy::Bridge::Date #{time_value}>"
63
+ end
64
+
38
65
  # A byte buffer that crosses the JS boundary as a `Uint8Array` (rather than a
39
66
  # plain Array). Wrap a host method's byte-array result in this so JS sees a
40
67
  # real typed array — e.g. `TextEncoder#encode`, `Blob#arrayBuffer`. The
@@ -25,10 +25,6 @@ module Dommy
25
25
  # method set) instead of a `__rb_host_describe` round trip per new proxy —
26
26
  # the dominant overhead when JS traverses/builds many nodes.
27
27
  INTERFACE = "__rb_if"
28
- # The custom-element tag of a handle whose node is a registered custom
29
- # element (so makeProxy upgrades it), carried per-instance since it is the
30
- # one part of a describe that is NOT per-interface.
31
- CUSTOM_ELEMENT = "__rb_ce"
32
28
  # A live JS function that crossed into Ruby, referenced by callback id.
33
29
  CALLBACK = "__rb_callback"
34
30
  # An opaque JS value referenced by its id in the JS-side `jsRefs` table
@@ -58,6 +54,10 @@ module Dommy
58
54
  BYTES = "__rb_bytes"
59
55
  # A byte buffer crossing as a bare JS ArrayBuffer.
60
56
  ARRAY_BUFFER = "__rb_arraybuffer"
57
+ # A JS Date's time value (ms since the epoch). Host -> JS it builds a new
58
+ # Date; JS -> host it decorates a JS_REF, so the Date keeps its identity
59
+ # and the host can still read the time (see Dommy::Bridge::Date).
60
+ DATE = "__rb_date"
61
61
  # A host-raised DOMException/TypeError/RangeError, re-thrown JS-side.
62
62
  EXCEPTION = "__rb_exception__"
63
63
  # A host-created native JS error (TypeError/RangeError) crossing as a VALUE
@@ -68,6 +68,10 @@ module Dommy
68
68
  THROW = "__rb_throw__"
69
69
  # A callback whose JS invocation threw (the thrown value is carried here).
70
70
  CALLBACK_THREW = "__rb_cb_threw__"
71
+ # A structured-serialization record the JS realm holds (by id), crossing
72
+ # as an opaque Dommy::Js::SerializedRecord (see host_runtime.js
73
+ # serializedTag).
74
+ SERIALIZED = "__rb_serialized"
71
75
  end
72
76
  end
73
77
  end