dommy 0.8.0 → 0.9.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/README.md +3 -3
- data/lib/dommy/animation.rb +4 -0
- data/lib/dommy/attr.rb +11 -5
- data/lib/dommy/backend/makiri_adapter.rb +330 -0
- data/lib/dommy/backend.rb +114 -33
- data/lib/dommy/blob.rb +2 -0
- data/lib/dommy/bridge.rb +11 -0
- data/lib/dommy/browser.rb +217 -0
- data/lib/dommy/compression_streams.rb +4 -0
- data/lib/dommy/crypto.rb +4 -0
- data/lib/dommy/css.rb +487 -50
- data/lib/dommy/custom_elements.rb +2 -2
- data/lib/dommy/data_transfer.rb +2 -0
- data/lib/dommy/data_uri.rb +35 -0
- data/lib/dommy/deferred_response.rb +59 -0
- data/lib/dommy/document.rb +386 -228
- data/lib/dommy/dom_exception.rb +2 -0
- data/lib/dommy/dom_parser.rb +7 -17
- data/lib/dommy/element.rb +502 -155
- data/lib/dommy/event.rb +240 -9
- data/lib/dommy/fetch.rb +152 -34
- data/lib/dommy/form_data.rb +2 -0
- data/lib/dommy/history.rb +2 -0
- data/lib/dommy/html_canvas_element.rb +230 -0
- data/lib/dommy/html_collection.rb +5 -6
- data/lib/dommy/html_elements.rb +304 -27
- data/lib/dommy/interaction/debug.rb +35 -0
- data/lib/dommy/interaction/dom_summary.rb +131 -0
- data/lib/dommy/interaction/driver.rb +244 -0
- data/lib/dommy/interaction/event_synthesis.rb +56 -0
- data/lib/dommy/interaction/field_interactor.rb +117 -0
- data/lib/dommy/interaction/form_submission.rb +268 -0
- data/lib/dommy/interaction/locator.rb +158 -0
- data/lib/dommy/interaction/role_query.rb +58 -0
- data/lib/dommy/interaction.rb +32 -0
- data/lib/dommy/internal/accessibility_tree.rb +215 -0
- data/lib/dommy/internal/accessible_description.rb +38 -0
- data/lib/dommy/internal/accessible_name.rb +301 -0
- data/lib/dommy/internal/aria_role.rb +252 -0
- data/lib/dommy/internal/aria_snapshot.rb +64 -0
- data/lib/dommy/internal/aria_state.rb +151 -0
- data/lib/dommy/internal/css/calc.rb +242 -0
- data/lib/dommy/internal/css/cascade.rb +430 -0
- data/lib/dommy/internal/css/color.rb +381 -0
- data/lib/dommy/internal/css/computed_style_declaration.rb +130 -0
- data/lib/dommy/internal/css/counters.rb +227 -0
- data/lib/dommy/internal/css/custom_properties.rb +183 -0
- data/lib/dommy/internal/css/media_query.rb +302 -0
- data/lib/dommy/internal/css/parser.rb +265 -0
- data/lib/dommy/internal/css/property_registry.rb +512 -0
- data/lib/dommy/internal/css/rule_index.rb +494 -0
- data/lib/dommy/internal/css/supports.rb +158 -0
- data/lib/dommy/internal/css/ua_stylesheet.rb +53 -0
- data/lib/dommy/internal/css_pseudo_handlers.rb +283 -42
- data/lib/dommy/internal/css_rule_text.rb +160 -0
- data/lib/dommy/internal/dom_matching.rb +80 -9
- data/lib/dommy/internal/element_matching.rb +109 -0
- data/lib/dommy/internal/global_functions.rb +33 -0
- data/lib/dommy/internal/mutation_coordinator.rb +95 -4
- data/lib/dommy/internal/namespaces.rb +49 -5
- data/lib/dommy/internal/node_wrapper_cache.rb +163 -26
- data/lib/dommy/internal/parent_node.rb +82 -5
- data/lib/dommy/internal/selector_ast.rb +124 -0
- data/lib/dommy/internal/selector_index.rb +146 -0
- data/lib/dommy/internal/selector_matcher.rb +756 -0
- data/lib/dommy/internal/selector_parser.rb +283 -131
- data/lib/dommy/internal/shadow_root_registry.rb +9 -2
- data/lib/dommy/internal/template_content_registry.rb +26 -18
- data/lib/dommy/internal/xml_serialization.rb +344 -0
- data/lib/dommy/intersection_observer.rb +2 -0
- data/lib/dommy/js/bridge_conformance.rb +80 -0
- data/lib/dommy/js/constructor_resolver.rb +44 -0
- data/lib/dommy/js/custom_element_bridge.rb +90 -0
- data/lib/dommy/js/dom_interfaces.rb +162 -0
- data/lib/dommy/js/handle_table.rb +60 -0
- data/lib/dommy/js/host_bridge.rb +517 -0
- data/lib/dommy/js/host_runtime.js +1495 -0
- data/lib/dommy/js/import_map.rb +58 -0
- data/lib/dommy/js/marshaller.rb +240 -0
- data/lib/dommy/js/module_loader.rb +99 -0
- data/lib/dommy/js/observable_runtime.js +742 -0
- data/lib/dommy/js/runtime.rb +115 -0
- data/lib/dommy/js/script_boot.rb +221 -0
- data/lib/dommy/js/wire_tags.rb +62 -0
- data/lib/dommy/location.rb +2 -0
- data/lib/dommy/media_query_list.rb +50 -14
- data/lib/dommy/message_channel.rb +22 -6
- data/lib/dommy/minitest/assertions.rb +27 -0
- data/lib/dommy/mutation_observer.rb +89 -4
- data/lib/dommy/navigator.rb +34 -2
- data/lib/dommy/node.rb +24 -14
- data/lib/dommy/notification.rb +2 -0
- data/lib/dommy/parser.rb +1 -1
- data/lib/dommy/performance.rb +21 -1
- data/lib/dommy/promise.rb +94 -10
- data/lib/dommy/range.rb +173 -31
- data/lib/dommy/resources.rb +178 -0
- data/lib/dommy/rspec/capy_style_matchers.rb +126 -0
- data/lib/dommy/scheduler.rb +149 -13
- data/lib/dommy/screen.rb +91 -0
- data/lib/dommy/shadow_root.rb +76 -13
- data/lib/dommy/storage.rb +2 -1
- data/lib/dommy/streams.rb +6 -0
- data/lib/dommy/text_codec.rb +7 -1
- data/lib/dommy/tree_walker.rb +33 -10
- data/lib/dommy/url.rb +13 -1
- data/lib/dommy/version.rb +1 -1
- data/lib/dommy/window.rb +199 -11
- data/lib/dommy/worker.rb +8 -4
- data/lib/dommy/xml_http_request.rb +47 -6
- data/lib/dommy.rb +36 -1
- metadata +96 -10
- data/lib/dommy/backend/nokogiri_adapter.rb +0 -127
- data/lib/dommy/backend/nokolexbor_adapter.rb +0 -117
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "base64"
|
|
4
|
+
|
|
5
|
+
module Dommy
|
|
6
|
+
# Decode an RFC 2397 `data:` URI into its bytes + media type, so `fetch` / XHR
|
|
7
|
+
# to an inline `data:` URL resolves like a browser (200 + the decoded payload)
|
|
8
|
+
# instead of falling through to a 404. note.com loads its icon SVGs as
|
|
9
|
+
# `data:image/svg+xml;base64,…` via XHR, which hit this.
|
|
10
|
+
module DataUri
|
|
11
|
+
module_function
|
|
12
|
+
|
|
13
|
+
# `{ body:, content_type: }` for a `data:` URL, or nil for any other URL.
|
|
14
|
+
# The payload is returned as UTF-8 text (the common case for the `text/*` and
|
|
15
|
+
# `image/svg+xml` data URLs fetched this way).
|
|
16
|
+
def parse(url)
|
|
17
|
+
str = url.to_s
|
|
18
|
+
return nil unless str.start_with?("data:")
|
|
19
|
+
|
|
20
|
+
meta, data = str[5..].split(",", 2)
|
|
21
|
+
return nil if data.nil?
|
|
22
|
+
|
|
23
|
+
base64 = meta.end_with?(";base64")
|
|
24
|
+
media = meta.sub(/;base64\z/, "")
|
|
25
|
+
media = "text/plain;charset=US-ASCII" if media.empty?
|
|
26
|
+
bytes =
|
|
27
|
+
if base64
|
|
28
|
+
Base64.decode64(data)
|
|
29
|
+
else
|
|
30
|
+
data.gsub(/%([0-9A-Fa-f]{2})/) { Regexp.last_match(1).hex.chr }
|
|
31
|
+
end
|
|
32
|
+
{body: bytes.dup.force_encoding(Encoding::UTF_8), content_type: media}
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Dommy
|
|
4
|
+
# The async-network handoff for fetch / XHR. A `__fetch_handler__` (or XHR stub
|
|
5
|
+
# lookup) may return one of these instead of a response entry to answer a
|
|
6
|
+
# request ASYNCHRONOUSLY: the response is produced off the page thread (e.g. by
|
|
7
|
+
# a network worker doing blocking HTTP), and `#complete(entry)` is called from
|
|
8
|
+
# that thread when it is ready. Delivery is routed through the scheduler's
|
|
9
|
+
# external inbox, so the waiting fetch/XHR is fulfilled on the PAGE thread —
|
|
10
|
+
# single-threaded with the DOM/JS. The worker only ever passes a plain entry
|
|
11
|
+
# Hash (status / headers / body bytes); it never touches Dommy/JS state.
|
|
12
|
+
#
|
|
13
|
+
# `#complete` is thread-safe and races cleanly with `#on_complete` (whichever
|
|
14
|
+
# of register / complete happens last triggers the single delivery).
|
|
15
|
+
class DeferredResponse
|
|
16
|
+
def initialize(scheduler)
|
|
17
|
+
@scheduler = scheduler
|
|
18
|
+
@mutex = Mutex.new
|
|
19
|
+
@on_complete = nil
|
|
20
|
+
@entry = nil
|
|
21
|
+
@completed = false
|
|
22
|
+
@flushed = false
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# fetch/XHR registers its delivery callback here (invoked on the page thread
|
|
26
|
+
# with the response entry, or nil for a network failure -> a 404-style miss).
|
|
27
|
+
def on_complete(&block)
|
|
28
|
+
@mutex.synchronize { @on_complete = block }
|
|
29
|
+
flush
|
|
30
|
+
self
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Called by the worker thread when the response (or nil) is ready. THREAD-SAFE.
|
|
34
|
+
def complete(entry)
|
|
35
|
+
@mutex.synchronize do
|
|
36
|
+
@entry = entry
|
|
37
|
+
@completed = true
|
|
38
|
+
end
|
|
39
|
+
flush
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
# Once BOTH the callback is registered and the response has arrived, post the
|
|
45
|
+
# one-shot delivery onto the page thread's inbox.
|
|
46
|
+
def flush
|
|
47
|
+
callback = nil
|
|
48
|
+
entry = nil
|
|
49
|
+
@mutex.synchronize do
|
|
50
|
+
return if @flushed || !@completed || @on_complete.nil?
|
|
51
|
+
|
|
52
|
+
@flushed = true
|
|
53
|
+
callback = @on_complete
|
|
54
|
+
entry = @entry
|
|
55
|
+
end
|
|
56
|
+
@scheduler.post_external { callback.call(entry) }
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|