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.
- checksums.yaml +4 -4
- data/lib/dommy/backend.rb +16 -15
- data/lib/dommy/blob.rb +17 -0
- data/lib/dommy/bridge/values.rb +29 -2
- data/lib/dommy/bridge/wire_tags.rb +8 -4
- data/lib/dommy/browser.rb +324 -49
- data/lib/dommy/character_data.rb +20 -27
- data/lib/dommy/class_list.rb +24 -9
- data/lib/dommy/cookie_jar.rb +408 -0
- data/lib/dommy/cookie_store.rb +104 -49
- data/lib/dommy/css.rb +34 -8
- data/lib/dommy/custom_elements.rb +362 -114
- data/lib/dommy/data_transfer.rb +22 -2
- data/lib/dommy/document.rb +1071 -200
- data/lib/dommy/dom_exception.rb +6 -0
- data/lib/dommy/dom_parser.rb +46 -14
- data/lib/dommy/dom_string_list.rb +36 -0
- data/lib/dommy/element.rb +217 -102
- data/lib/dommy/element_internals.rb +215 -0
- data/lib/dommy/encodings.rb +10 -0
- data/lib/dommy/event.rb +378 -122
- data/lib/dommy/event_source.rb +4 -30
- data/lib/dommy/file_reader.rb +5 -29
- data/lib/dommy/form_data.rb +40 -6
- data/lib/dommy/form_entry_list.rb +106 -137
- data/lib/dommy/fragment.rb +11 -10
- data/lib/dommy/history.rb +247 -90
- data/lib/dommy/html_canvas_element.rb +15 -35
- data/lib/dommy/html_collection.rb +49 -30
- data/lib/dommy/html_elements/base.rb +111 -69
- data/lib/dommy/html_elements/embedded.rb +349 -105
- data/lib/dommy/html_elements/forms/form.rb +407 -368
- data/lib/dommy/html_elements/forms/input.rb +333 -174
- data/lib/dommy/html_elements/forms/select.rb +90 -74
- data/lib/dommy/html_elements/interactive.rb +274 -64
- data/lib/dommy/html_elements/media.rb +71 -30
- data/lib/dommy/html_elements/metadata.rb +215 -71
- data/lib/dommy/html_elements/miscellaneous.rb +58 -14
- data/lib/dommy/html_elements/tables.rb +7 -9
- data/lib/dommy/html_elements.rb +23 -1
- data/lib/dommy/hyperlink_utils.rb +15 -4
- data/lib/dommy/interaction/drag_and_drop.rb +187 -0
- data/lib/dommy/interaction/event_synthesis.rb +182 -24
- data/lib/dommy/interaction/field_interactor.rb +17 -5
- data/lib/dommy/interaction/form_submission.rb +10 -4
- data/lib/dommy/interaction/key_sender.rb +101 -16
- data/lib/dommy/interaction.rb +1 -0
- data/lib/dommy/internal/accessibility_tree.rb +15 -3
- data/lib/dommy/internal/accessible_description.rb +1 -1
- data/lib/dommy/internal/accessible_name.rb +10 -17
- data/lib/dommy/internal/aria_role.rb +1 -1
- data/lib/dommy/internal/autofill.rb +2 -2
- data/lib/dommy/internal/backend_prefilter.rb +1 -5
- data/lib/dommy/internal/ce_reactions.rb +285 -0
- data/lib/dommy/internal/ce_reactions_table.rb +296 -0
- data/lib/dommy/internal/child_list.rb +7 -43
- data/lib/dommy/internal/child_navigable.rb +155 -0
- data/lib/dommy/internal/child_node.rb +44 -41
- data/lib/dommy/internal/close_watcher_manager.rb +238 -0
- data/lib/dommy/internal/complex_match.rb +3 -1
- data/lib/dommy/internal/constraint_validation.rb +130 -0
- data/lib/dommy/internal/css/ancestor_filter.rb +107 -0
- data/lib/dommy/internal/css/cascade.rb +7 -7
- data/lib/dommy/internal/css/cascaded_declarations.rb +4 -1
- data/lib/dommy/internal/css/computed_style_builder.rb +9 -3
- data/lib/dommy/internal/css/custom_properties.rb +41 -29
- data/lib/dommy/internal/css/parser.rb +0 -22
- data/lib/dommy/internal/css/renderability.rb +6 -0
- data/lib/dommy/internal/css/rule_index.rb +149 -98
- data/lib/dommy/internal/css/rule_index_inputs.rb +135 -0
- data/lib/dommy/internal/css/selector_dependencies.rb +8 -2
- data/lib/dommy/internal/css/style_cache.rb +7 -4
- data/lib/dommy/internal/css/ua_stylesheet.rb +34 -0
- data/lib/dommy/internal/declarative_shadow_roots.rb +182 -0
- data/lib/dommy/internal/document_generations.rb +55 -2
- data/lib/dommy/internal/document_interaction_state.rb +293 -9
- data/lib/dommy/internal/dom_matching.rb +2 -2
- data/lib/dommy/internal/element_aria.rb +25 -19
- data/lib/dommy/internal/element_popover.rb +226 -25
- data/lib/dommy/internal/element_shadow.rb +97 -26
- data/lib/dommy/internal/element_state.rb +98 -5
- data/lib/dommy/internal/element_top_layer.rb +15 -1
- data/lib/dommy/internal/enumerated_keyword_sets.rb +40 -0
- data/lib/dommy/internal/event_handler_tables.rb +241 -0
- data/lib/dommy/internal/event_handlers.rb +149 -0
- data/lib/dommy/internal/exception_report.rb +1 -1
- data/lib/dommy/internal/focusability.rb +267 -0
- data/lib/dommy/internal/form_associated_custom_elements.rb +127 -0
- data/lib/dommy/internal/html_or_svg_or_mathml_element.rb +34 -23
- data/lib/dommy/internal/html_serialization.rb +292 -0
- data/lib/dommy/internal/idl_reflection.rb +202 -0
- data/lib/dommy/internal/idl_reflection_table.rb +589 -0
- data/lib/dommy/internal/infra.rb +9 -0
- data/lib/dommy/internal/input_type.rb +76 -18
- data/lib/dommy/internal/insertion_point.rb +27 -3
- data/lib/dommy/internal/js_number.rb +60 -0
- data/lib/dommy/internal/light_dismiss.rb +178 -0
- data/lib/dommy/internal/mime_type.rb +8 -0
- data/lib/dommy/internal/mutation_coordinator.rb +94 -62
- data/lib/dommy/internal/node_adopter.rb +52 -4
- data/lib/dommy/internal/node_factory.rb +111 -7
- data/lib/dommy/internal/node_identity.rb +1 -1
- data/lib/dommy/internal/node_traversal.rb +22 -4
- data/lib/dommy/internal/node_wrapper_cache.rb +6 -38
- data/lib/dommy/internal/observer_options.rb +24 -14
- data/lib/dommy/internal/origin.rb +86 -0
- data/lib/dommy/internal/parent_node.rb +10 -8
- data/lib/dommy/internal/popover_invoker_element.rb +67 -0
- data/lib/dommy/internal/popover_stack.rb +120 -0
- data/lib/dommy/internal/post_insertion_steps.rb +140 -71
- data/lib/dommy/internal/reflected_attributes.rb +128 -18
- data/lib/dommy/internal/rendered_text/collector.rb +1 -5
- data/lib/dommy/internal/rendered_text/fragment.rb +6 -2
- data/lib/dommy/internal/selector_arguments.rb +2 -1
- data/lib/dommy/internal/selector_match.rb +1 -1
- data/lib/dommy/internal/selector_matcher.rb +11 -6
- data/lib/dommy/internal/selector_parser.rb +14 -1
- data/lib/dommy/internal/sequential_focus_navigation.rb +210 -0
- data/lib/dommy/internal/shadow_root_registry.rb +7 -0
- data/lib/dommy/internal/template_content_registry.rb +7 -1
- data/lib/dommy/internal/text_selection.rb +185 -32
- data/lib/dommy/internal/toggle_events.rb +6 -4
- data/lib/dommy/internal/unsafe_html.rb +107 -0
- data/lib/dommy/internal/url_parser.rb +84 -8
- data/lib/dommy/internal/user_activation.rb +192 -0
- data/lib/dommy/internal/web_idl.rb +149 -16
- data/lib/dommy/internal/window_constructors.rb +26 -6
- data/lib/dommy/internal/xml_serialization.rb +3 -3
- data/lib/dommy/js/constructor_resolver.rb +18 -0
- data/lib/dommy/js/custom_element_bridge.rb +57 -82
- data/lib/dommy/js/dom_interfaces.rb +50 -15
- data/lib/dommy/js/host_bridge.rb +189 -40
- data/lib/dommy/js/host_runtime.js +1897 -415
- data/lib/dommy/js/marshaller.rb +13 -4
- data/lib/dommy/js/module_loader.rb +37 -6
- data/lib/dommy/js/module_preload.rb +107 -29
- data/lib/dommy/js/script_boot.rb +197 -115
- data/lib/dommy/js/serialized_record.rb +32 -0
- data/lib/dommy/js/webidl_event_handlers.js +45 -0
- data/lib/dommy/js/webidl_members.js +196 -0
- data/lib/dommy/js/webidl_signatures.js +2055 -0
- data/lib/dommy/js/webidl_tables.js +47 -100
- data/lib/dommy/js/window_wiring.rb +9 -5
- data/lib/dommy/location.rb +129 -76
- data/lib/dommy/media_query_list.rb +4 -13
- data/lib/dommy/message_channel.rb +137 -64
- data/lib/dommy/mutation_observer.rb +2 -0
- data/lib/dommy/navigation.rb +59 -9
- data/lib/dommy/navigator.rb +131 -5
- data/lib/dommy/node.rb +19 -11
- data/lib/dommy/notification.rb +9 -1
- data/lib/dommy/promise.rb +8 -0
- data/lib/dommy/range.rb +5 -34
- data/lib/dommy/resources.rb +38 -3
- data/lib/dommy/scheduler.rb +176 -48
- data/lib/dommy/shadow_root.rb +117 -19
- data/lib/dommy/storage.rb +135 -25
- data/lib/dommy/structured_data.rb +45 -0
- data/lib/dommy/style_declaration.rb +16 -0
- data/lib/dommy/text_codec.rb +2 -14
- data/lib/dommy/tree_walker.rb +10 -18
- data/lib/dommy/url.rb +11 -4
- data/lib/dommy/validity_state.rb +109 -107
- data/lib/dommy/version.rb +1 -1
- data/lib/dommy/web_socket.rb +5 -28
- data/lib/dommy/window.rb +811 -99
- data/lib/dommy/worker.rb +4 -28
- data/lib/dommy/xml_http_request.rb +32 -45
- data/lib/dommy.rb +35 -1
- metadata +35 -4
- data/lib/dommy/internal/cookie_jar.rb +0 -29
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d948ccbb7ca08b92aedc5222fe46bf219060f0e2ae2903bc49b8de3401321cb2
|
|
4
|
+
data.tar.gz: 621b638bd22e4decae148605015885c49ef93b0c44f2fbadcb0d0b542b489a0d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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.
|
|
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
|
|
139
|
-
# not prefixed ones), in `namespace` — the HTML namespace
|
|
140
|
-
# XHTML document, nil in any other.
|
|
141
|
-
#
|
|
142
|
-
#
|
|
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
|
-
|
|
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
|
data/lib/dommy/bridge/values.rb
CHANGED
|
@@ -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
|
|
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
|