dommy 0.16.0 → 0.17.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 (122) hide show
  1. checksums.yaml +4 -4
  2. data/lib/dommy/animation.rb +1 -0
  3. data/lib/dommy/backend.rb +3 -0
  4. data/lib/dommy/blob.rb +6 -0
  5. data/lib/dommy/browser.rb +12 -4
  6. data/lib/dommy/character_data.rb +1 -13
  7. data/lib/dommy/cookie_store.rb +2 -1
  8. data/lib/dommy/document.rb +67 -30
  9. data/lib/dommy/element.rb +11 -0
  10. data/lib/dommy/element_internals.rb +12 -0
  11. data/lib/dommy/encodings/legacy_multibyte.rb +800 -0
  12. data/lib/dommy/encodings/multibyte_overrides.rb +76 -0
  13. data/lib/dommy/encodings/prescan.rb +234 -0
  14. data/lib/dommy/encodings.rb +121 -57
  15. data/lib/dommy/event.rb +107 -54
  16. data/lib/dommy/event_source.rb +1 -0
  17. data/lib/dommy/fetch.rb +244 -53
  18. data/lib/dommy/file_reader.rb +1 -0
  19. data/lib/dommy/form_data.rb +22 -9
  20. data/lib/dommy/form_entry_list.rb +3 -3
  21. data/lib/dommy/html_canvas_element.rb +85 -12
  22. data/lib/dommy/html_elements/base.rb +1 -0
  23. data/lib/dommy/html_elements/forms/input.rb +3 -0
  24. data/lib/dommy/html_elements/interactive.rb +56 -48
  25. data/lib/dommy/html_elements/metadata.rb +23 -0
  26. data/lib/dommy/interaction/form_submission.rb +24 -42
  27. data/lib/dommy/internal/accessibility_tree.rb +149 -162
  28. data/lib/dommy/internal/accessibility_visibility.rb +16 -17
  29. data/lib/dommy/internal/accessible_name.rb +231 -246
  30. data/lib/dommy/internal/aria_role.rb +182 -195
  31. data/lib/dommy/internal/aria_snapshot.rb +35 -38
  32. data/lib/dommy/internal/aria_state.rb +102 -118
  33. data/lib/dommy/internal/autofill.rb +75 -75
  34. data/lib/dommy/internal/backend_prefilter.rb +127 -130
  35. data/lib/dommy/internal/child_navigable.rb +86 -83
  36. data/lib/dommy/internal/close_watcher_manager.rb +1 -0
  37. data/lib/dommy/internal/css/ancestor_filter.rb +64 -64
  38. data/lib/dommy/internal/css/calc.rb +90 -71
  39. data/lib/dommy/internal/css/cascade.rb +69 -67
  40. data/lib/dommy/internal/css/color.rb +249 -187
  41. data/lib/dommy/internal/css/computed_style_builder.rb +34 -0
  42. data/lib/dommy/internal/css/computed_style_declaration.rb +50 -11
  43. data/lib/dommy/internal/css/counters.rb +67 -67
  44. data/lib/dommy/internal/css/custom_properties.rb +114 -114
  45. data/lib/dommy/internal/css/parser.rb +277 -239
  46. data/lib/dommy/internal/css/property_registry.rb +321 -302
  47. data/lib/dommy/internal/css/renderability.rb +37 -35
  48. data/lib/dommy/internal/css/rule_index.rb +2 -2
  49. data/lib/dommy/internal/css/rule_index_inputs.rb +2 -2
  50. data/lib/dommy/internal/css/supports.rb +115 -113
  51. data/lib/dommy/internal/css/ua_stylesheet.rb +55 -53
  52. data/lib/dommy/internal/css_rule_text.rb +121 -119
  53. data/lib/dommy/internal/css_source.rb +1 -3
  54. data/lib/dommy/internal/css_syntax.rb +157 -92
  55. data/lib/dommy/internal/declarative_shadow_roots.rb +1 -0
  56. data/lib/dommy/internal/directionality.rb +120 -123
  57. data/lib/dommy/internal/document_live_ranges.rb +26 -1
  58. data/lib/dommy/internal/dom_matching.rb +185 -184
  59. data/lib/dommy/internal/element_geometry.rb +8 -1
  60. data/lib/dommy/internal/element_matching.rb +71 -69
  61. data/lib/dommy/internal/element_shadow.rb +1 -13
  62. data/lib/dommy/internal/element_state.rb +255 -265
  63. data/lib/dommy/internal/event_handlers.rb +66 -64
  64. data/lib/dommy/internal/exception_report.rb +88 -86
  65. data/lib/dommy/internal/focusability.rb +205 -205
  66. data/lib/dommy/internal/global_functions.rb +49 -47
  67. data/lib/dommy/internal/idl_reflection.rb +99 -97
  68. data/lib/dommy/internal/js_number.rb +35 -33
  69. data/lib/dommy/internal/light_dismiss.rb +130 -132
  70. data/lib/dommy/internal/literal_lookup.rb +75 -75
  71. data/lib/dommy/internal/mime_type.rb +54 -49
  72. data/lib/dommy/internal/mutation_coordinator.rb +46 -0
  73. data/lib/dommy/internal/mutation_observer_microtask.rb +60 -0
  74. data/lib/dommy/internal/namespaces.rb +51 -49
  75. data/lib/dommy/internal/node_adopter.rb +25 -1
  76. data/lib/dommy/internal/node_equality.rb +61 -59
  77. data/lib/dommy/internal/post_insertion_steps.rb +1 -0
  78. data/lib/dommy/internal/referrer.rb +144 -0
  79. data/lib/dommy/internal/rendered_text/collector.rb +22 -3
  80. data/lib/dommy/internal/rendered_text/computed_box.rb +3 -2
  81. data/lib/dommy/internal/rendered_text/fragment.rb +37 -38
  82. data/lib/dommy/internal/rendered_text/items.rb +7 -5
  83. data/lib/dommy/internal/selector_matcher.rb +361 -359
  84. data/lib/dommy/internal/selector_parser.rb +74 -62
  85. data/lib/dommy/internal/sequential_focus_navigation.rb +150 -151
  86. data/lib/dommy/internal/shadow_root_registry.rb +7 -0
  87. data/lib/dommy/internal/slot_assignment.rb +117 -0
  88. data/lib/dommy/internal/slot_signals.rb +125 -0
  89. data/lib/dommy/internal/unsafe_html.rb +79 -77
  90. data/lib/dommy/internal/url_parser.rb +5 -29
  91. data/lib/dommy/internal/web_idl.rb +158 -153
  92. data/lib/dommy/internal/window_bound.rb +14 -0
  93. data/lib/dommy/internal/window_constructors.rb +3 -0
  94. data/lib/dommy/internal/xml_serialization.rb +298 -296
  95. data/lib/dommy/js/dom_interfaces.rb +13 -1
  96. data/lib/dommy/js/host_bridge.rb +23 -1
  97. data/lib/dommy/js/host_callbacks.rb +7 -0
  98. data/lib/dommy/js/host_runtime.js +625 -61
  99. data/lib/dommy/js/import_map.rb +1 -1
  100. data/lib/dommy/js/observable_runtime.js +295 -128
  101. data/lib/dommy/js/webidl_members.js +1 -1
  102. data/lib/dommy/js/webidl_signatures.js +35 -6
  103. data/lib/dommy/media_query_list.rb +1 -0
  104. data/lib/dommy/message_channel.rb +2 -0
  105. data/lib/dommy/mutation_observer.rb +25 -29
  106. data/lib/dommy/navigator.rb +4 -1
  107. data/lib/dommy/node.rb +4 -0
  108. data/lib/dommy/notification.rb +1 -0
  109. data/lib/dommy/promise.rb +12 -0
  110. data/lib/dommy/range.rb +20 -3
  111. data/lib/dommy/shadow_root.rb +25 -1
  112. data/lib/dommy/streams.rb +18 -0
  113. data/lib/dommy/style_declaration.rb +15 -4
  114. data/lib/dommy/text_codec.rb +7 -5
  115. data/lib/dommy/tree_walker.rb +68 -61
  116. data/lib/dommy/version.rb +1 -1
  117. data/lib/dommy/web_socket.rb +1 -0
  118. data/lib/dommy/window.rb +22 -4
  119. data/lib/dommy/worker.rb +1 -0
  120. data/lib/dommy/xml_http_request.rb +12 -2
  121. data/lib/dommy.rb +17 -2
  122. metadata +11 -3
@@ -179,7 +179,19 @@ module Dommy
179
179
  %w[HTMLUnknownElement HTMLElement Element Node EventTarget],
180
180
  %w[HTMLMediaElement HTMLElement Element Node EventTarget],
181
181
  %w[HTMLAudioElement HTMLMediaElement HTMLElement Element Node EventTarget],
182
- %w[HTMLVideoElement HTMLMediaElement HTMLElement Element Node EventTarget]
182
+ %w[HTMLVideoElement HTMLMediaElement HTMLElement Element Node EventTarget],
183
+ # The rest of the Window-exposed interfaces Dommy has a class for,
184
+ # which a script reaches through an instance (location, navigator,
185
+ # el.style, matchMedia(), …) rather than constructs: an interface
186
+ # object is a global before any instance has crossed.
187
+ %w[Window EventTarget], %w[Location], %w[History], %w[Navigator], %w[Screen], %w[BarProp],
188
+ %w[External], %w[CustomElementRegistry], %w[MimeTypeArray], %w[PluginArray],
189
+ %w[MessagePort EventTarget], %w[MediaQueryList EventTarget], %w[MediaQueryListEvent Event],
190
+ %w[CSSStyleDeclaration], %w[MediaList], %w[DOMStringMap], %w[NamedNodeMap],
191
+ %w[HTMLOptionsCollection HTMLCollection], %w[MutationRecord], %w[ValidityState],
192
+ %w[DataTransferItem], %w[DataTransferItemList], %w[TouchList],
193
+ %w[ImageData], %w[CanvasRenderingContext2D], %w[CanvasGradient], %w[TextMetrics],
194
+ %w[Crypto], %w[SubtleCrypto], %w[Performance], %w[DOMRect]
183
195
  ].freeze
184
196
 
185
197
  module_function
@@ -96,6 +96,21 @@ module Dommy
96
96
  obj
97
97
  end
98
98
 
99
+ # Make the engine's global object the window `win` (`window ===
100
+ # globalThis`), in place of define_host_object("window", win): the
101
+ # window's members, named elements and event handler attributes resolve
102
+ # through globalThis's prototype chain, and wherever the host hands out
103
+ # `win`, JS gets globalThis. Only for an engine whose identifier
104
+ # resolution asks a Proxy on the global's prototype chain for `has`, so
105
+ # an unresolvable bare name still throws a ReferenceError (not QuickJS).
106
+ def unify_global_window(win)
107
+ @backend.call_js("__rbHost.unifyGlobalWindow", @codec.register(win))
108
+ win
109
+ end
110
+
111
+ # The Window this realm's global is (nil before install_window).
112
+ attr_reader :window
113
+
99
114
  # Bind the window the bridge draws on for JS constructors (new Event(...))
100
115
  # and custom element registration. Called by Runtime#install_window — kept
101
116
  # distinct from define_host_object so the generic binder has no hidden
@@ -454,7 +469,14 @@ module Dommy
454
469
  @backend.define_host_function("__rb_run_microtask") do |id|
455
470
  @profile.count(:__rb_run_microtask)
456
471
  callback = @microtask_procs.delete(id)
457
- callback&.call
472
+ # A Ruby proc (MutationObserver delivery) or a JS function the page
473
+ # queued with window.queueMicrotask. What a JS one throws is reported
474
+ # at the window, as HTML's microtask callback steps do.
475
+ begin
476
+ CallableInvoker.invoke_raising(callback) if callback
477
+ rescue Dommy::Bridge::ThrowValue => e
478
+ Internal::ExceptionReport.report_at(@window, e) if @window
479
+ end
458
480
  nil
459
481
  end
460
482
  # Opt-in rejection diagnostics: __rbHost.installRejectionTracker (only run
@@ -40,6 +40,10 @@ module Dommy
40
40
  @bridge.invoke_callback(@id, args)
41
41
  end
42
42
 
43
+ # The Window that is the function's realm's global: whose `event` a
44
+ # listener sees set (DOM "inner invoke").
45
+ def __internal_window__ = @bridge.window
46
+
43
47
  # The full invocation, with both of the choices a caller has:
44
48
  #
45
49
  # this: the receiver the JS function sees as `this` — a
@@ -75,6 +79,9 @@ module Dommy
75
79
  def handle_event(event)
76
80
  @bridge.invoke_js_ref_handle_event(@ref, event)
77
81
  end
82
+
83
+ # See HostCallback#__internal_window__.
84
+ def __internal_window__ = @bridge.window
78
85
  end
79
86
 
80
87
  # A NodeFilter backed by a live JS object implementing the callback interface