dommy 0.6.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 (75) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +30 -38
  3. data/lib/dommy/animation.rb +10 -2
  4. data/lib/dommy/attr.rb +197 -32
  5. data/lib/dommy/backend/nokogiri_adapter.rb +127 -0
  6. data/lib/dommy/backend/nokolexbor_adapter.rb +117 -0
  7. data/lib/dommy/backend.rb +175 -0
  8. data/lib/dommy/blob.rb +30 -11
  9. data/lib/dommy/bridge/constructor_registry.rb +28 -0
  10. data/lib/dommy/bridge/methods.rb +57 -0
  11. data/lib/dommy/bridge.rb +97 -0
  12. data/lib/dommy/callable_invoker.rb +36 -0
  13. data/lib/dommy/compression_streams.rb +4 -4
  14. data/lib/dommy/cookie_store.rb +4 -2
  15. data/lib/dommy/crypto.rb +16 -9
  16. data/lib/dommy/css.rb +53 -7
  17. data/lib/dommy/custom_elements.rb +33 -9
  18. data/lib/dommy/data_transfer.rb +4 -0
  19. data/lib/dommy/document.rb +693 -60
  20. data/lib/dommy/dom_parser.rb +29 -15
  21. data/lib/dommy/element.rb +1147 -438
  22. data/lib/dommy/event.rb +279 -79
  23. data/lib/dommy/event_source.rb +14 -10
  24. data/lib/dommy/fetch.rb +509 -39
  25. data/lib/dommy/file_reader.rb +14 -6
  26. data/lib/dommy/form_data.rb +3 -3
  27. data/lib/dommy/history.rb +46 -8
  28. data/lib/dommy/html_collection.rb +59 -6
  29. data/lib/dommy/html_elements.rb +153 -1502
  30. data/lib/dommy/internal/css_pseudo_handlers.rb +137 -0
  31. data/lib/dommy/internal/dom_matching.rb +3 -3
  32. data/lib/dommy/internal/global_functions.rb +26 -0
  33. data/lib/dommy/internal/idna.rb +16 -7
  34. data/lib/dommy/internal/ipv4_parser.rb +22 -7
  35. data/lib/dommy/internal/mutation_coordinator.rb +11 -2
  36. data/lib/dommy/internal/namespaces.rb +70 -0
  37. data/lib/dommy/internal/node_equality.rb +86 -0
  38. data/lib/dommy/internal/node_traversal.rb +1 -1
  39. data/lib/dommy/internal/node_wrapper_cache.rb +77 -31
  40. data/lib/dommy/internal/observable_callback.rb +1 -5
  41. data/lib/dommy/internal/parent_node.rb +126 -0
  42. data/lib/dommy/internal/reflected_attributes.rb +103 -13
  43. data/lib/dommy/internal/selector_parser.rb +664 -0
  44. data/lib/dommy/internal/template_content_registry.rb +6 -6
  45. data/lib/dommy/internal/url_parser.rb +677 -0
  46. data/lib/dommy/intersection_observer.rb +4 -2
  47. data/lib/dommy/location.rb +10 -4
  48. data/lib/dommy/media_query_list.rb +10 -4
  49. data/lib/dommy/message_channel.rb +41 -11
  50. data/lib/dommy/mutation_observer.rb +76 -23
  51. data/lib/dommy/navigator.rb +38 -24
  52. data/lib/dommy/node.rb +158 -16
  53. data/lib/dommy/notification.rb +6 -4
  54. data/lib/dommy/parser.rb +13 -13
  55. data/lib/dommy/performance.rb +4 -0
  56. data/lib/dommy/performance_observer.rb +4 -2
  57. data/lib/dommy/promise.rb +14 -14
  58. data/lib/dommy/range.rb +74 -5
  59. data/lib/dommy/resize_observer.rb +4 -2
  60. data/lib/dommy/scheduler.rb +34 -13
  61. data/lib/dommy/shadow_root.rb +31 -60
  62. data/lib/dommy/storage.rb +2 -0
  63. data/lib/dommy/streams.rb +40 -49
  64. data/lib/dommy/svg_elements.rb +204 -3606
  65. data/lib/dommy/text_codec.rb +178 -25
  66. data/lib/dommy/tree_walker.rb +270 -81
  67. data/lib/dommy/url.rb +305 -450
  68. data/lib/dommy/url_pattern.rb +2 -0
  69. data/lib/dommy/version.rb +1 -1
  70. data/lib/dommy/web_socket.rb +49 -19
  71. data/lib/dommy/window.rb +205 -203
  72. data/lib/dommy/worker.rb +12 -12
  73. data/lib/dommy/xml_http_request.rb +32 -7
  74. data/lib/dommy.rb +19 -2
  75. metadata +22 -27
@@ -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"
@@ -44,13 +48,15 @@ module Dommy
44
48
  private
45
49
 
46
50
  def parse_html(str)
47
- nokogiri_doc = Nokogiri::HTML5(str.empty? ? "<html><body></body></html>" : str, max_errors: 0)
51
+ nokogiri_doc = Backend.parse(str.empty? ? "<html><body></body></html>" : str)
48
52
  Document.new(nil, nokogiri_doc: nokogiri_doc)
49
53
  end
50
54
 
51
- def parse_xml(str)
52
- nokogiri_doc = Nokogiri::XML(str)
53
- 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
54
60
  end
55
61
  end
56
62
 
@@ -58,18 +64,24 @@ module Dommy
58
64
  # XML output, SVG inlining, and "serialize this Element" patterns.
59
65
  # For HTML, prefer `Element#outer_html` directly.
60
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.
61
71
  def serialize_to_string(node)
62
72
  return "" unless node
63
73
 
64
- if node.respond_to?(:outer_html)
65
- node.outer_html
66
- elsif node.respond_to?(:__node__)
67
- node.__node__.to_xml
68
- elsif node.respond_to?(:to_xml)
69
- node.to_xml
70
- else
71
- node.to_s
72
- 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) : ""
73
85
  end
74
86
 
75
87
  alias serializeToString serialize_to_string
@@ -78,6 +90,8 @@ module Dommy
78
90
  nil
79
91
  end
80
92
 
93
+ include Bridge::Methods
94
+ js_methods %w[serializeToString]
81
95
  def __js_call__(method, args)
82
96
  case method
83
97
  when "serializeToString"