Module: Dommy
- Defined in:
- lib/dommy/window.rb,
lib/dommy.rb,
lib/dommy/css.rb,
lib/dommy/url.rb,
lib/dommy/attr.rb,
lib/dommy/blob.rb,
lib/dommy/node.rb,
lib/dommy/event.rb,
lib/dommy/fetch.rb,
lib/dommy/range.rb,
lib/dommy/bridge.rb,
lib/dommy/crypto.rb,
lib/dommy/parser.rb,
lib/dommy/worker.rb,
lib/dommy/backend.rb,
lib/dommy/element.rb,
lib/dommy/history.rb,
lib/dommy/promise.rb,
lib/dommy/storage.rb,
lib/dommy/streams.rb,
lib/dommy/version.rb,
lib/dommy/document.rb,
lib/dommy/location.rb,
lib/dommy/animation.rb,
lib/dommy/form_data.rb,
lib/dommy/navigator.rb,
lib/dommy/scheduler.rb,
lib/dommy/dom_parser.rb,
lib/dommy/text_codec.rb,
lib/dommy/web_socket.rb,
lib/dommy/file_reader.rb,
lib/dommy/performance.rb,
lib/dommy/shadow_root.rb,
lib/dommy/tree_walker.rb,
lib/dommy/url_pattern.rb,
lib/dommy/cookie_store.rb,
lib/dommy/event_source.rb,
lib/dommy/notification.rb,
lib/dommy/svg_elements.rb,
lib/dommy/test_helpers.rb,
lib/dommy/data_transfer.rb,
lib/dommy/dom_exception.rb,
lib/dommy/html_elements.rb,
lib/dommy/internal/idna.rb,
lib/dommy/rspec/matchers.rb,
lib/dommy/custom_elements.rb,
lib/dommy/html_collection.rb,
lib/dommy/message_channel.rb,
lib/dommy/resize_observer.rb,
lib/dommy/media_query_list.rb,
lib/dommy/xml_http_request.rb,
lib/dommy/internal/punycode.rb,
lib/dommy/mutation_observer.rb,
lib/dommy/internal/idna_data.rb,
lib/dommy/compression_streams.rb,
lib/dommy/internal/cookie_jar.rb,
lib/dommy/minitest/assertions.rb,
lib/dommy/internal/ipv4_parser.rb,
lib/dommy/performance_observer.rb,
lib/dommy/internal/dom_matching.rb,
lib/dommy/intersection_observer.rb,
lib/dommy/internal/node_traversal.rb,
lib/dommy/backend/nokogiri_adapter.rb,
lib/dommy/internal/observer_manager.rb,
lib/dommy/internal/observer_matcher.rb,
lib/dommy/internal/scope_resolution.rb,
lib/dommy/rspec/capy_style_matchers.rb,
lib/dommy/backend/nokolexbor_adapter.rb,
lib/dommy/internal/node_wrapper_cache.rb,
lib/dommy/internal/css_pseudo_handlers.rb,
lib/dommy/internal/observable_callback.rb,
lib/dommy/internal/mutation_coordinator.rb,
lib/dommy/internal/reflected_attributes.rb,
lib/dommy/internal/shadow_root_registry.rb,
lib/dommy/internal/range_text_serializer.rb,
lib/dommy/internal/template_content_registry.rb
Overview
Generated by script/build_idna_tables.rb from Unicode 16.0.0 source files in vendor/unicode/. Re-run after upgrading.
Tables are sorted, non-overlapping [start, end, value…] rows. ‘IDNAData.lookup(table, cp)` does a binary search and returns the matching row (or nil).
Defined Under Namespace
Modules: Backend, Bridge, EventTarget, Internal, Minitest, Node, NodeFilter, Parser, RSpec, TestHelpers, TreeTraversalCore Classes: AbortController, AbortSignal, Animation, Attr, BatteryManager, BeforeUnloadEvent, Blob, BroadcastChannel, CSSRule, CSSRuleList, CSSStyleSheet, CharacterDataNode, ClassList, Clipboard, ClipboardEvent, CloseEvent, CommentNode, CompositionEvent, CompressionStream, CookieChangeEvent, CookieStore, Crypto, CryptoKey, CustomElementRegistry, CustomEvent, DOMException, DOMParser, DOMRect, DataTransfer, DatasetMap, DecompressionStream, Document, DocumentType, DragEvent, Element, ErrorValue, Event, EventSource, FetchFn, File, FileList, FileReader, FocusEvent, FormData, Fragment, Geolocation, HTMLAnchorElement, HTMLAreaElement, HTMLAudioElement, HTMLBRElement, HTMLBaseElement, HTMLBodyElement, HTMLButtonElement, HTMLCollection, HTMLDataElement, HTMLDetailsElement, HTMLDialogElement, HTMLDivElement, HTMLElement, HTMLEmbedElement, HTMLFieldsetElement, HTMLFormElement, HTMLHRElement, HTMLHeadElement, HTMLHeadingElement, HTMLHtmlElement, HTMLIFrameElement, HTMLImageElement, HTMLInputElement, HTMLLIElement, HTMLLabelElement, HTMLLegendElement, HTMLLinkElement, HTMLMapElement, HTMLMediaElement, HTMLMetaElement, HTMLMeterElement, HTMLModElement, HTMLOListElement, HTMLObjectElement, HTMLOptGroupElement, HTMLOptionElement, HTMLOptionsCollection, HTMLOutputElement, HTMLParagraphElement, HTMLPictureElement, HTMLPreElement, HTMLProgressElement, HTMLQuoteElement, HTMLScriptElement, HTMLSelectElement, HTMLSlotElement, HTMLSourceElement, HTMLSpanElement, HTMLStyleElement, HTMLTableCaptionElement, HTMLTableCellElement, HTMLTableElement, HTMLTableRowElement, HTMLTableSectionElement, HTMLTemplateElement, HTMLTextAreaElement, HTMLTimeElement, HTMLTitleElement, HTMLTrackElement, HTMLUListElement, HTMLVideoElement, Headers, History, InputEvent, IntersectionObserver, KeyboardEvent, KeyframeEffect, LiveNodeList, Location, Lock, LockManager, MediaQueryList, MediaQueryListEvent, MessageChannel, MessageEvent, MessagePort, MouseEvent, MutationObserver, MutationRecord, NamedNodeMap, Navigator, NodeIterator, NodeList, Notification, Performance, PerformanceEntry, PerformanceObserver, PermissionStatus, Permissions, PointerEvent, ProgressEvent, PromiseValue, Range, ReadableStream, ReadableStreamDefaultController, ReadableStreamDefaultReader, Request, ResizeObserver, Response, SVGAElement, SVGAnimateElement, SVGAnimateMotionElement, SVGAnimateTransformElement, SVGAnimationElement, SVGCircleElement, SVGClipPathElement, SVGComponentTransferFunctionElement, SVGDefsElement, SVGDescElement, SVGDiscardElement, SVGElement, SVGEllipseElement, SVGFEBlendElement, SVGFEColorMatrixElement, SVGFEComponentTransferElement, SVGFECompositeElement, SVGFEConvolveMatrixElement, SVGFEDiffuseLightingElement, SVGFEDisplacementMapElement, SVGFEDistantLightElement, SVGFEDropShadowElement, SVGFEFloodElement, SVGFEFuncAElement, SVGFEFuncBElement, SVGFEFuncGElement, SVGFEFuncRElement, SVGFEGaussianBlurElement, SVGFEImageElement, SVGFEMergeElement, SVGFEMergeNodeElement, SVGFEMorphologyElement, SVGFEOffsetElement, SVGFEPointLightElement, SVGFESpecularLightingElement, SVGFESpotLightElement, SVGFETileElement, SVGFETurbulenceElement, SVGFilterElement, SVGFilterPrimitiveElement, SVGForeignObjectElement, SVGGElement, SVGImageElement, SVGLineElement, SVGLinearGradientElement, SVGMPathElement, SVGMarkerElement, SVGMaskElement, SVGMetadataElement, SVGPathElement, SVGPatternElement, SVGPolygonElement, SVGPolylineElement, SVGRadialGradientElement, SVGRectElement, SVGSVGElement, SVGSetElement, SVGStopElement, SVGSwitchElement, SVGSymbolElement, SVGTSpanElement, SVGTextElement, SVGTextPathElement, SVGTitleElement, SVGUseElement, SVGViewElement, Scheduler, Selection, ShadowRoot, StandaloneEventTarget, Storage, StorageManager, StyleDeclaration, SubtleCrypto, TextDecoder, TextDecoderStream, TextEncoder, TextEncoderStream, TextNode, Touch, TouchEvent, TouchList, TransformStream, TransformStreamDefaultController, TreeWalker, URL, URLPattern, URLSearchParams, ValidityState, ViewTransition, WakeLock, WakeLockSentinel, WebSocket, WheelEvent, Window, Worker, WritableStream, WritableStreamDefaultWriter, XMLHttpRequest, XMLHttpRequestUpload, XMLSerializer
Constant Summary collapse
- VERSION =
"0.7.0"- SVG_ELEMENT_CLASSES =
Tag-name → class lookup. Keys are the lowercased form Nokogiri::HTML5 stores in the tree. Tags absent from this table fall through to ‘Dommy::SVGElement` via `element_class_for`.
{ "svg" => SVGSVGElement, "g" => SVGGElement, "circle" => SVGCircleElement, "rect" => SVGRectElement, "ellipse" => SVGEllipseElement, "line" => SVGLineElement, "polygon" => SVGPolygonElement, "polyline" => SVGPolylineElement, "path" => SVGPathElement, "text" => SVGTextElement, "tspan" => SVGTSpanElement, "defs" => SVGDefsElement, "use" => SVGUseElement, "image" => SVGImageElement, "symbol" => SVGSymbolElement, "foreignobject" => SVGForeignObjectElement, "title" => SVGTitleElement, "desc" => SVGDescElement, "mask" => SVGMaskElement, "clippath" => SVGClipPathElement, "pattern" => SVGPatternElement, "lineargradient" => SVGLinearGradientElement, "radialgradient" => SVGRadialGradientElement, "stop" => SVGStopElement, "filter" => SVGFilterElement, "marker" => SVGMarkerElement, # Recommended additions "a" => SVGAElement, "textpath" => SVGTextPathElement, "view" => SVGViewElement, "switch" => SVGSwitchElement, "metadata" => SVGMetadataElement, # Filter primitives (common ones) "fegaussianblur" => SVGFEGaussianBlurElement, "feoffset" => SVGFEOffsetElement, "feblend" => SVGFEBlendElement, "fecolormatrix" => SVGFEColorMatrixElement, "feflood" => SVGFEFloodElement, "fecomposite" => SVGFECompositeElement, "femerge" => SVGFEMergeElement, "femergenode" => SVGFEMergeNodeElement, "fecomponenttransfer" => SVGFEComponentTransferElement, "fefuncr" => SVGFEFuncRElement, "fefuncg" => SVGFEFuncGElement, "fefuncb" => SVGFEFuncBElement, "fefunca" => SVGFEFuncAElement, "fetile" => SVGFETileElement, "femorphology" => SVGFEMorphologyElement, "feimage" => SVGFEImageElement, "fedropshadow" => SVGFEDropShadowElement, "feturbulence" => SVGFETurbulenceElement, "fedisplacementmap" => SVGFEDisplacementMapElement, "fedistantlight" => SVGFEDistantLightElement, "fepointlight" => SVGFEPointLightElement, "fespotlight" => SVGFESpotLightElement, "feconvolvematrix" => SVGFEConvolveMatrixElement, "fediffuselighting" => SVGFEDiffuseLightingElement, "fespecularlighting" => SVGFESpecularLightingElement, # SMIL animation "animate" => SVGAnimateElement, "animatetransform" => SVGAnimateTransformElement, "animatemotion" => SVGAnimateMotionElement, "set" => SVGSetElement, "mpath" => SVGMPathElement, "discard" => SVGDiscardElement }.freeze
- HTML_ELEMENT_CLASSES =
Look up the subclass for a given HTML tag. Document#wrap_node consults this map; defaults to plain Element.
{ "a" => HTMLAnchorElement, "form" => HTMLFormElement, "input" => HTMLInputElement, "button" => HTMLButtonElement, "img" => HTMLImageElement, "script" => HTMLScriptElement, "link" => HTMLLinkElement, "select" => HTMLSelectElement, "option" => HTMLOptionElement, "optgroup" => HTMLOptGroupElement, "textarea" => HTMLTextAreaElement, "label" => HTMLLabelElement, "fieldset" => HTMLFieldsetElement, "output" => HTMLOutputElement, "legend" => HTMLLegendElement, "slot" => HTMLSlotElement, "table" => HTMLTableElement, "thead" => HTMLTableSectionElement, "tbody" => HTMLTableSectionElement, "tfoot" => HTMLTableSectionElement, "tr" => HTMLTableRowElement, "td" => HTMLTableCellElement, "th" => HTMLTableCellElement, "caption" => HTMLTableCaptionElement, "dialog" => HTMLDialogElement, "details" => HTMLDetailsElement, "meter" => HTMLMeterElement, "progress" => HTMLProgressElement, "template" => HTMLTemplateElement, "audio" => HTMLAudioElement, "video" => HTMLVideoElement, "source" => HTMLSourceElement, "track" => HTMLTrackElement, "iframe" => HTMLIFrameElement, "picture" => HTMLPictureElement, "ol" => HTMLOListElement, "ul" => HTMLUListElement, "li" => HTMLLIElement, "time" => HTMLTimeElement, "data" => HTMLDataElement, "area" => HTMLAreaElement, "map" => HTMLMapElement, "object" => HTMLObjectElement, "embed" => HTMLEmbedElement, "base" => HTMLBaseElement, "meta" => HTMLMetaElement, "style" => HTMLStyleElement, "title" => HTMLTitleElement, "q" => HTMLQuoteElement, "blockquote" => HTMLQuoteElement, "ins" => HTMLModElement, "del" => HTMLModElement, "div" => HTMLDivElement, "span" => HTMLSpanElement, "p" => HTMLParagraphElement, "h1" => HTMLHeadingElement, "h2" => HTMLHeadingElement, "h3" => HTMLHeadingElement, "h4" => HTMLHeadingElement, "h5" => HTMLHeadingElement, "h6" => HTMLHeadingElement, "br" => HTMLBRElement, "hr" => HTMLHRElement, "pre" => HTMLPreElement, "body" => HTMLBodyElement, "head" => HTMLHeadElement, "html" => HTMLHtmlElement }.freeze
- SVG_NAMESPACE_URI =
"http://www.w3.org/2000/svg"
Class Method Summary collapse
-
.backend ⇒ Object
Convenience accessor: ‘Dommy.backend` / `Dommy.backend=`.
- .backend=(new_backend) ⇒ Object
- .element_class_for(tag_name, namespace_uri = nil) ⇒ Object
-
.new_window ⇒ Object
Build a fresh, empty Window (no host).
-
.parse(html) ⇒ Object
Parse an HTML string and return a fresh ‘Window`.
-
.structured_clone(value, memo = {}) ⇒ Object
‘structuredClone(value)` — deep clone for plain Ruby values and DOM nodes (via `cloneNode(true)`).
-
.structuredClone(value) ⇒ Object
JS-style global alias for symmetry with ‘window.structuredClone(…)`.
Class Method Details
.backend ⇒ Object
Convenience accessor: ‘Dommy.backend` / `Dommy.backend=`.
86 87 88 |
# File 'lib/dommy.rb', line 86 def self.backend Backend.current end |
.backend=(new_backend) ⇒ Object
90 91 92 |
# File 'lib/dommy.rb', line 90 def self.backend=(new_backend) Backend.current = new_backend end |
.element_class_for(tag_name, namespace_uri = nil) ⇒ Object
4511 4512 4513 4514 4515 4516 4517 |
# File 'lib/dommy/html_elements.rb', line 4511 def self.element_class_for(tag_name, namespace_uri = nil) if namespace_uri == SVG_NAMESPACE_URI SVG_ELEMENT_CLASSES[tag_name.to_s.downcase] || SVGElement else HTML_ELEMENT_CLASSES[tag_name.to_s.downcase] || Element end end |
.new_window ⇒ Object
Build a fresh, empty Window (no host). Equivalent to opening a blank document.
96 97 98 |
# File 'lib/dommy.rb', line 96 def self.new_window Window.new end |
.parse(html) ⇒ Object
Parse an HTML string and return a fresh ‘Window`.
When the input starts with ‘<!doctype` or `<html>`, it is parsed as a full HTML document (preserving <head>, <title>, etc.). Otherwise the input is treated as a body fragment and inserted into a fresh document’s <body>.
The Window has no host (standalone CRuby usage); embedders that need bridge callbacks (e.g. a wasm host) pass a host instead.
74 75 76 77 78 79 80 81 82 83 |
# File 'lib/dommy.rb', line 74 def self.parse(html) s = html.to_s if s.match?(/\A\s*(<!doctype|<html\b)/i) Window.new(nil, nokogiri_doc: Backend.parse(s)) else window = Window.new window.document.body.inner_html = s window end end |
.structured_clone(value, memo = {}) ⇒ Object
‘structuredClone(value)` — deep clone for plain Ruby values and DOM nodes (via `cloneNode(true)`). Mirrors the JS structured-clone algorithm for the subset we support:
- primitives (String / Numeric / Boolean / nil) → copied
- Array / Hash / Set → deep-cloned
- DOM nodes (anything responding to `clone_node`) → deep-cloned
- cyclic structures → preserved
- Proc / Method / Class / Module / IO → DataCloneError
Symbols are passed through unchanged (Ruby has no ‘Symbol` clone concept; JS treats Symbols as DataCloneError, but Ruby code uses them as hash keys so this is the pragmatic choice).
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
# File 'lib/dommy.rb', line 113 def self.structured_clone(value, memo = {}) return memo[value.object_id] if memo.key?(value.object_id) case value when nil, true, false, Numeric, Symbol value when String value.dup when Array arr = [] memo[value.object_id] = arr value.each { |v| arr << structured_clone(v, memo) } arr when Hash h = {} memo[value.object_id] = h value.each { |k, v| h[structured_clone(k, memo)] = structured_clone(v, memo) } h when Set s = Set.new memo[value.object_id] = s value.each { |v| s << structured_clone(v, memo) } s when Time value.dup when Regexp value.dup when Proc, Method, UnboundMethod, IO, Class, Module raise DOMException::DataCloneError, "#{value.class} cannot be cloned" else if value.respond_to?(:clone_node) value.clone_node(true) else # Fallback: rely on the object's own `dup` (which handles # custom classes the user might pass through). value.dup end end end |
.structuredClone(value) ⇒ Object
JS-style global alias for symmetry with ‘window.structuredClone(…)`.
155 156 157 |
# File 'lib/dommy.rb', line 155 def Dommy.structuredClone(value) structured_clone(value) end |