Class: Dommy::HTMLElement
- Includes:
- Internal::ReflectedAttributes
- Defined in:
- lib/dommy/html_elements.rb
Overview
Base for specialized HTMLElement subclasses. Inherits reflection helpers from Internal::ReflectedAttributes (also shared with SVGElement).
Direct Known Subclasses
HTMLAnchorElement, HTMLAreaElement, HTMLBRElement, HTMLBaseElement, HTMLBodyElement, HTMLButtonElement, HTMLCanvasElement, HTMLDListElement, HTMLDataElement, HTMLDataListElement, HTMLDetailsElement, HTMLDialogElement, HTMLDirectoryElement, HTMLDivElement, HTMLEmbedElement, HTMLFieldSetElement, HTMLFontElement, HTMLFormElement, HTMLFrameElement, HTMLFrameSetElement, HTMLHRElement, HTMLHeadElement, HTMLHeadingElement, HTMLHtmlElement, HTMLIFrameElement, HTMLImageElement, HTMLInputElement, HTMLLIElement, HTMLLabelElement, HTMLLegendElement, HTMLLinkElement, HTMLMapElement, HTMLMediaElement, HTMLMetaElement, HTMLMeterElement, HTMLModElement, HTMLOListElement, HTMLObjectElement, HTMLOptGroupElement, HTMLOptionElement, HTMLOutputElement, HTMLParagraphElement, HTMLParamElement, HTMLPictureElement, HTMLPreElement, HTMLProgressElement, HTMLQuoteElement, HTMLScriptElement, HTMLSelectElement, HTMLSlotElement, HTMLSourceElement, HTMLSpanElement, HTMLStyleElement, HTMLTableCaptionElement, HTMLTableCellElement, HTMLTableColElement, HTMLTableElement, HTMLTableRowElement, HTMLTableSectionElement, HTMLTemplateElement, HTMLTextAreaElement, HTMLTimeElement, HTMLTitleElement, HTMLTrackElement, HTMLUListElement, HTMLUnknownElement, Js::BridgedCustomElement
Constant Summary
Constants inherited from Element
Element::ADJACENT_POSITIONS, Element::APPROX_CHAR_PX, Element::APPROX_LINE_PX, Element::ATTRIBUTE_NODE, Element::CDATA_SECTION_NODE, Element::COMMENT_NODE, Element::DOCUMENT_FRAGMENT_NODE, Element::DOCUMENT_NODE, Element::DOCUMENT_POSITION_CONTAINED_BY, Element::DOCUMENT_POSITION_CONTAINS, Element::DOCUMENT_POSITION_DISCONNECTED, Element::DOCUMENT_POSITION_FOLLOWING, Element::DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC, Element::DOCUMENT_POSITION_PRECEDING, Element::DOCUMENT_TYPE_NODE, Element::ELEMENT_NODE, Element::HTML_NAMESPACE, Element::INLINE_TAGS, Element::PROCESSING_INSTRUCTION_NODE, Element::REFLECTED_TOKEN_LIST_HOSTS, Element::SHADOW_HOST_TAGS, Element::SVG_NAMESPACE, Element::TEXT_NODE
Constants included from Node
Node::ATTRIBUTE_NODE, Node::CDATA_SECTION_NODE, Node::COMMENT_NODE, Node::DOCUMENT_FRAGMENT_NODE, Node::DOCUMENT_NODE, Node::DOCUMENT_POSITION_CONTAINED_BY, Node::DOCUMENT_POSITION_CONTAINS, Node::DOCUMENT_POSITION_DISCONNECTED, Node::DOCUMENT_POSITION_FOLLOWING, Node::DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC, Node::DOCUMENT_POSITION_PRECEDING, Node::DOCUMENT_TYPE_NODE, Node::ELEMENT_NODE, Node::HTML_NAMESPACE, Node::PROCESSING_INSTRUCTION_NODE, Node::TEXT_NODE, Node::XMLNS_NAMESPACE, Node::XML_NAMESPACE
Instance Attribute Summary
Attributes inherited from Element
Instance Method Summary collapse
-
#case_sensitive_attribute_names? ⇒ Boolean
HTML attribute names are case-insensitive only in an HTML document — the browser DOM lowercases everything there.
-
#disabled_by_ancestor_fieldset? ⇒ Boolean
WHATWG "actually disabled": a form control is disabled if it (or an ancestor
-
#labels_node_list ⇒ Object
The
labelsNodeList for a labelable control: every -
#parse_non_negative_reflected(attr) ⇒ Object
Shared "limited to only non-negative numbers" long reflection (maxLength / minLength on input and textarea): a missing / negative / non-numeric content attribute reads as -1; assigning a negative value throws.
- #set_non_negative_reflected(attr, value) ⇒ Object
Methods included from Internal::ReflectedAttributes
#__js_get__, #__js_set__, included
Methods inherited from Element
#[], #[]=, #__dommy_backend_node__, #__internal_approx_box, #__internal_case_sensitive_attribute_names__?, #__internal_created_namespace__, #__internal_normalize_attr_key__, #__internal_set_namespace__, #__internal_shadow_root__, #__js_attribute_snapshot__, #__js_call__, #__js_get__, #__js_set__, #__run_click_activation_behavior__, #__test_scroll_log__, #access_key_label, #accessibility_tree, #activation_behavior, #activation_target, #activation_target?, #after, #anchor_href, #animate, #approximate_layout?, #aria_content_attr, #aria_element_attr, #aria_element_get, #aria_element_set, #aria_elements_attr, #aria_elements_current, #aria_elements_get, #aria_elements_set, #aria_find_in_root, #aria_get, #aria_ref_in_valid_scope?, #aria_set, #aria_snapshot, #assigned_slot, #at_xpath, #attach_shadow, #attributes, #base_uri, #before, #blur, #child_element_count, #child_nodes, #children, #class_list, #class_name, #class_name=, #clear_aria_element_ref_for, #click, #clone_node, #closest, #computed_description, #computed_label, #computed_role, #contains?, #dataset, #element_prefix, #equal_node?, #first_child, #first_element_child, #focus, #get_animations, #get_attribute, #get_attribute_names, #get_attribute_node, #get_attribute_node_ns, #get_attribute_ns, #get_bounding_client_rect, #get_client_rects, #get_elements_by_class_name, #get_elements_by_tag_name, #get_elements_by_tag_name_ns, #get_html, #get_inner_html, #has_attribute?, #has_attribute_ns?, #has_attributes?, #has_child_nodes?, #hide_popover, #id, #id=, #initialize, #inner_html, #inner_html=, #insert_adjacent_element, #insert_adjacent_html, #insert_adjacent_text, #insert_before, #insertion_parent!, #is_connected?, #last_child, #last_element_child, #live_child_nodes, #local_name, #mark_fragment_scripts_started, #matches?, #namespace_uri, #next_element_sibling, #next_sibling, #on, #outer_html, #outer_html=, #owner_document, #parent_element, #parent_node, #path, #pre_click_activation_state, #previous_element_sibling, #previous_sibling, #query_selector, #query_selector_all, #reflected_attr_name, #reflected_token_list, #remove, #remove_attribute, #remove_attribute_node, #remove_attribute_ns, #remove_child, #replace_child, #replace_with_nodes, #request_fullscreen, #restore_pre_click_activation, #role, #role=, #root_node, #run_post_click_activation, #same_node?, #set_attribute, #set_attribute_node, #set_attribute_ns, #shadow_root, #show_popover, #slot, #slot=, #style, #tag_name, #text_content, #text_content=, #to_s, #toggle_attribute, #toggle_popover, #translate_mode?, #validate_adjacent_document_insert!, #with_selector_errors, #xpath
Methods included from Bridge::Methods
Methods included from Internal::ParentNode
#append, #append_child, #normalize, #prepend, #replace_children
Methods included from Internal::ChildNode
#child_node_after, #child_node_before, #child_node_replace_with, #nullable_dom_string, #validate_insert_before_ref!
Methods included from Node
#compare_document_position, #get_root_node, #is_default_namespace, #is_equal_node, #is_same_node, #lookup_namespace_uri, #lookup_prefix
Methods included from EventTarget
#__dommy_dump_event_failure__, #__internal_deliver_event__, #__internal_event_parent__, #__internal_process_event_handler_return__, #add_event_listener, capture_flag, #deliver_at, #dispatch_event, #event_name_from_on, #invoke_listener_isolated, js_truthy?, #on_handler, #remove_event_listener, #set_on_handler
Constructor Details
This class inherits a constructor from Dommy::Element
Instance Method Details
#case_sensitive_attribute_names? ⇒ Boolean
HTML attribute names are case-insensitive only in an HTML document — the browser DOM lowercases everything there. In a non-HTML (XML) document even an HTML-namespaced element preserves case. Shortcuts Element's namespace check for HTML's hot path while honoring the document-kind condition.
56 57 58 |
# File 'lib/dommy/html_elements.rb', line 56 def case_sensitive_attribute_names? !@document.html_document? end |
#disabled_by_ancestor_fieldset? ⇒ Boolean
WHATWG "actually disabled": a form control is disabled if it (or an ancestor
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/dommy/html_elements.rb', line 17 def disabled_by_ancestor_fieldset? node = parent_element while node if node.local_name.to_s.casecmp?("fieldset") && node.has_attribute?("disabled") legend = node.child_nodes.to_a.find do |c| c.respond_to?(:local_name) && c.local_name.to_s.casecmp?("legend") end return false if legend&.contains?(self) return true end node = node.parent_element end false end |
#labels_node_list ⇒ Object
The labels NodeList for a labelable control: every
67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/dommy/html_elements.rb', line 67 def labels_node_list el = self @__labels_node_list ||= LiveNodeList.new do me = el.__dommy_backend_node__ el.document.query_selector_all("label").select do |label| next false unless label.respond_to?(:control) c = label.control c.respond_to?(:__dommy_backend_node__) && c.__dommy_backend_node__.equal?(me) end end end |
#parse_non_negative_reflected(attr) ⇒ Object
Shared "limited to only non-negative numbers" long reflection (maxLength / minLength on input and textarea): a missing / negative / non-numeric content attribute reads as -1; assigning a negative value throws.
36 37 38 39 40 41 42 43 |
# File 'lib/dommy/html_elements.rb', line 36 def parse_non_negative_reflected(attr) raw = @__node__[attr] return -1 if raw.nil? # HTML "rules for parsing non-negative integers": leading ASCII whitespace, # then digits; anything else (a sign, letters) is an error → -1. m = raw.to_s.match(/\A[\t\n\f\r ]*(\d+)/) m ? m[1].to_i : -1 end |
#set_non_negative_reflected(attr, value) ⇒ Object
45 46 47 48 49 50 |
# File 'lib/dommy/html_elements.rb', line 45 def set_non_negative_reflected(attr, value) n = value.to_i raise DOMException::IndexSizeError, "#{attr} must be non-negative" if n.negative? set_reflected_string(attr, n.to_s) end |