dommy 0.7.0 → 0.8.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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/lib/dommy/animation.rb +9 -1
  3. data/lib/dommy/attr.rb +192 -39
  4. data/lib/dommy/backend/nokogiri_adapter.rb +76 -0
  5. data/lib/dommy/backend/nokolexbor_adapter.rb +37 -0
  6. data/lib/dommy/backend.rb +46 -0
  7. data/lib/dommy/blob.rb +28 -9
  8. data/lib/dommy/bridge/constructor_registry.rb +28 -0
  9. data/lib/dommy/bridge/methods.rb +57 -0
  10. data/lib/dommy/bridge.rb +97 -0
  11. data/lib/dommy/callable_invoker.rb +36 -0
  12. data/lib/dommy/cookie_store.rb +3 -1
  13. data/lib/dommy/crypto.rb +7 -1
  14. data/lib/dommy/css.rb +46 -0
  15. data/lib/dommy/custom_elements.rb +27 -3
  16. data/lib/dommy/data_transfer.rb +4 -0
  17. data/lib/dommy/document.rb +615 -48
  18. data/lib/dommy/dom_parser.rb +28 -15
  19. data/lib/dommy/element.rb +999 -471
  20. data/lib/dommy/event.rb +260 -96
  21. data/lib/dommy/event_source.rb +6 -2
  22. data/lib/dommy/fetch.rb +505 -43
  23. data/lib/dommy/file_reader.rb +11 -3
  24. data/lib/dommy/form_data.rb +2 -0
  25. data/lib/dommy/history.rb +43 -8
  26. data/lib/dommy/html_collection.rb +55 -2
  27. data/lib/dommy/html_elements.rb +102 -1519
  28. data/lib/dommy/internal/css_pseudo_handlers.rb +109 -0
  29. data/lib/dommy/internal/global_functions.rb +26 -0
  30. data/lib/dommy/internal/idna.rb +16 -7
  31. data/lib/dommy/internal/ipv4_parser.rb +22 -7
  32. data/lib/dommy/internal/mutation_coordinator.rb +11 -2
  33. data/lib/dommy/internal/namespaces.rb +70 -0
  34. data/lib/dommy/internal/node_equality.rb +86 -0
  35. data/lib/dommy/internal/node_wrapper_cache.rb +62 -27
  36. data/lib/dommy/internal/observable_callback.rb +1 -5
  37. data/lib/dommy/internal/parent_node.rb +126 -0
  38. data/lib/dommy/internal/reflected_attributes.rb +103 -13
  39. data/lib/dommy/internal/selector_parser.rb +664 -0
  40. data/lib/dommy/internal/url_parser.rb +677 -0
  41. data/lib/dommy/intersection_observer.rb +2 -0
  42. data/lib/dommy/location.rb +2 -0
  43. data/lib/dommy/media_query_list.rb +7 -1
  44. data/lib/dommy/message_channel.rb +32 -2
  45. data/lib/dommy/mutation_observer.rb +55 -12
  46. data/lib/dommy/navigator.rb +26 -12
  47. data/lib/dommy/node.rb +158 -28
  48. data/lib/dommy/notification.rb +3 -1
  49. data/lib/dommy/performance.rb +4 -0
  50. data/lib/dommy/performance_observer.rb +2 -0
  51. data/lib/dommy/promise.rb +14 -14
  52. data/lib/dommy/range.rb +74 -5
  53. data/lib/dommy/resize_observer.rb +2 -0
  54. data/lib/dommy/scheduler.rb +34 -13
  55. data/lib/dommy/shadow_root.rb +23 -54
  56. data/lib/dommy/storage.rb +2 -0
  57. data/lib/dommy/streams.rb +18 -27
  58. data/lib/dommy/svg_elements.rb +204 -3606
  59. data/lib/dommy/text_codec.rb +174 -21
  60. data/lib/dommy/tree_walker.rb +255 -66
  61. data/lib/dommy/url.rb +287 -449
  62. data/lib/dommy/url_pattern.rb +2 -0
  63. data/lib/dommy/version.rb +1 -1
  64. data/lib/dommy/web_socket.rb +37 -7
  65. data/lib/dommy/window.rb +202 -213
  66. data/lib/dommy/worker.rb +7 -7
  67. data/lib/dommy/xml_http_request.rb +15 -5
  68. data/lib/dommy.rb +7 -0
  69. metadata +12 -3
@@ -22,9 +22,11 @@ module Dommy
22
22
  when "text/html", ""
23
23
  parse_html(str)
24
24
  when "application/xhtml+xml", "application/xml", "text/xml", "image/svg+xml"
25
- parse_xml(str)
25
+ parse_xml(str, mime_type.to_s.downcase)
26
26
  else
27
- raise DOMException::TypeMismatchError, "Unsupported mime type: #{mime_type}"
27
+ # `type` is a WebIDL enum (DOMParserSupportedType); an out-of-enum value
28
+ # is a TypeError, not a DOMException.
29
+ raise Bridge::TypeError, "The provided value '#{mime_type}' is not a valid enum value of type DOMParserSupportedType."
28
30
  end
29
31
  end
30
32
 
@@ -34,6 +36,8 @@ module Dommy
34
36
  nil
35
37
  end
36
38
 
39
+ include Bridge::Methods
40
+ js_methods %w[parseFromString]
37
41
  def __js_call__(method, args)
38
42
  case method
39
43
  when "parseFromString"
@@ -48,10 +52,11 @@ module Dommy
48
52
  Document.new(nil, nokogiri_doc: nokogiri_doc)
49
53
  end
50
54
 
51
- def parse_xml(str)
52
- # Backends are HTML-only; parse XML input as HTML for now.
53
- nokogiri_doc = Backend.parse(str.empty? ? "<html><body></body></html>" : str)
54
- Document.new(nil, nokogiri_doc: nokogiri_doc)
55
+ def parse_xml(str, mime_type = "application/xml")
56
+ nokogiri_doc = Backend.parse_xml(str.empty? ? "<root/>" : str)
57
+ doc = Document.new(nil, nokogiri_doc: nokogiri_doc)
58
+ doc.content_type = mime_type
59
+ doc
55
60
  end
56
61
  end
57
62
 
@@ -59,18 +64,24 @@ module Dommy
59
64
  # XML output, SVG inlining, and "serialize this Element" patterns.
60
65
  # For HTML, prefer `Element#outer_html` directly.
61
66
  class XMLSerializer
67
+ # WHATWG "XML serialization" — produce XML (self-closing empty tags, real XML
68
+ # escaping) rather than the HTML serialization `outer_html` gives. Delegates
69
+ # to the backend's XML serializer (Nokogiri); namespace handling is whatever
70
+ # the backend produces. A Document serializes its root element.
62
71
  def serialize_to_string(node)
63
72
  return "" unless node
64
73
 
65
- if node.respond_to?(:outer_html)
66
- node.outer_html
67
- elsif node.respond_to?(:__dommy_backend_node__)
68
- node.__dommy_backend_node__.to_xml
69
- elsif node.respond_to?(:to_xml)
70
- node.to_xml
71
- else
72
- node.to_s
73
- end
74
+ backend =
75
+ if node.respond_to?(:nokogiri_doc) && !node.respond_to?(:__dommy_backend_node__)
76
+ node.nokogiri_doc # a Document
77
+ elsif node.respond_to?(:__dommy_backend_node__)
78
+ node.__dommy_backend_node__
79
+ end
80
+ return node.to_s unless backend.respond_to?(:to_xml)
81
+
82
+ opts = ::Nokogiri::XML::Node::SaveOptions::AS_XML | ::Nokogiri::XML::Node::SaveOptions::NO_DECLARATION
83
+ target = backend.respond_to?(:root) && backend.respond_to?(:document?) && backend.document? ? backend.root : backend
84
+ target ? target.to_xml(save_with: opts) : ""
74
85
  end
75
86
 
76
87
  alias serializeToString serialize_to_string
@@ -79,6 +90,8 @@ module Dommy
79
90
  nil
80
91
  end
81
92
 
93
+ include Bridge::Methods
94
+ js_methods %w[serializeToString]
82
95
  def __js_call__(method, args)
83
96
  case method
84
97
  when "serializeToString"