Class: Dommy::HTMLTextAreaElement

Inherits:
HTMLElement show all
Defined in:
lib/dommy/html_elements.rb

Overview

<textarea> — multi-line text input.

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

#document

Instance Method Summary collapse

Methods inherited from HTMLElement

#case_sensitive_attribute_names?, #disabled_by_ancestor_fieldset?, #labels_node_list, #parse_non_negative_reflected, #set_non_negative_reflected

Methods included from Internal::ReflectedAttributes

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__, #__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

included

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

#__apply_cloning_state__(state) ⇒ Object



2216
2217
2218
2219
2220
2221
# File 'lib/dommy/html_elements.rb', line 2216

def __apply_cloning_state__(state)
  return unless state[:dirty]

  @__value = state[:value]
  @__value_dirty = true
end

#__cloning_state__Object

HTML cloning steps: copy the dirty value flag + raw value so a clone keeps the user-entered text rather than reverting to the default (child text).



2212
2213
2214
# File 'lib/dommy/html_elements.rb', line 2212

def __cloning_state__
  @__value_dirty ? { value: @__value, dirty: true } : nil
end

#__js_call__(method, args) ⇒ Object



2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
# File 'lib/dommy/html_elements.rb', line 2379

def __js_call__(method, args)
  case method
  when "select"
    select
  when "setSelectionRange"
    set_selection_range(args[0], args[1], args[2])
  when "setRangeText"
    set_range_text(args[0])
  when "checkValidity"
    check_validity
  when "reportValidity"
    report_validity
  when "setCustomValidity"
    set_custom_validity(args[0])
  else
    super
  end
end

#__js_get__(key) ⇒ Object



2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
# File 'lib/dommy/html_elements.rb', line 2324

def __js_get__(key)
  case key
  when "value"
    value
  when "defaultValue"
    default_value
  when "rows"
    rows
  when "cols"
    cols
  when "maxLength"
    max_length
  when "minLength"
    min_length
  when "textLength"
    text_length
  when "type"
    type
  when "form"
    form
  when "labels"
    labels
  when "validity"
    validity
  when "willValidate"
    will_validate
  when "validationMessage"
    validation_message
  else
    super
  end
end

#__js_set__(key, v) ⇒ Object



2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
# File 'lib/dommy/html_elements.rb', line 2357

def __js_set__(key, v)
  case key
  when "value"
    self.value = v
  when "defaultValue"
    self.default_value = v
  when "rows"
    self.rows = v
  when "cols"
    self.cols = v
  when "maxLength"
    self.max_length = v
  when "minLength"
    self.min_length = v
  else
    super
  end
end

#check_validityObject



2309
2310
2311
2312
2313
# File 'lib/dommy/html_elements.rb', line 2309

def check_validity
  ok = !will_validate || validity.valid
  dispatch_event(Event.new("invalid", "bubbles" => false, "cancelable" => true)) unless ok
  ok
end

#colsObject



2231
2232
2233
# File 'lib/dommy/html_elements.rb', line 2231

def cols
  (@__node__["cols"] || "20").to_i
end

#cols=(v) ⇒ Object



2235
2236
2237
# File 'lib/dommy/html_elements.rb', line 2235

def cols=(v)
  set_reflected_string("cols", v.to_s)
end

#default_valueObject

defaultValue is the child text content; setting it (or text) leaves the dirty value flag alone.



2202
2203
2204
# File 'lib/dommy/html_elements.rb', line 2202

def default_value
  text_content
end

#default_value=(v) ⇒ Object



2206
2207
2208
# File 'lib/dommy/html_elements.rb', line 2206

def default_value=(v)
  self.text_content = v
end

#formObject



2269
2270
2271
# File 'lib/dommy/html_elements.rb', line 2269

def form
  closest("form")
end

#labelsObject



2273
2274
2275
# File 'lib/dommy/html_elements.rb', line 2273

def labels
  labels_node_list
end

#max_lengthObject

maxLength / minLength reflect a "limited to only non-negative numbers" long: a missing / negative / non-numeric content attribute is -1.



2241
2242
2243
# File 'lib/dommy/html_elements.rb', line 2241

def max_length
  parse_non_negative_reflected("maxlength")
end

#max_length=(value) ⇒ Object



2249
2250
2251
# File 'lib/dommy/html_elements.rb', line 2249

def max_length=(value)
  set_non_negative_reflected("maxlength", value)
end

#min_lengthObject



2245
2246
2247
# File 'lib/dommy/html_elements.rb', line 2245

def min_length
  parse_non_negative_reflected("minlength")
end

#min_length=(value) ⇒ Object



2253
2254
2255
# File 'lib/dommy/html_elements.rb', line 2253

def min_length=(value)
  set_non_negative_reflected("minlength", value)
end

#report_validityObject



2315
2316
2317
# File 'lib/dommy/html_elements.rb', line 2315

def report_validity
  check_validity
end

#rowsObject



2223
2224
2225
# File 'lib/dommy/html_elements.rb', line 2223

def rows
  (@__node__["rows"] || "2").to_i
end

#rows=(v) ⇒ Object



2227
2228
2229
# File 'lib/dommy/html_elements.rb', line 2227

def rows=(v)
  set_reflected_string("rows", v.to_s)
end

#selectObject

No real selection — same stub story as input.



2278
2279
2280
# File 'lib/dommy/html_elements.rb', line 2278

def select
  nil
end

#set_custom_validity(msg) ⇒ Object



2319
2320
2321
2322
# File 'lib/dommy/html_elements.rb', line 2319

def set_custom_validity(msg)
  @custom_validity_message = msg.to_s
  nil
end

#set_range_text(_replacement, *_) ⇒ Object



2286
2287
2288
# File 'lib/dommy/html_elements.rb', line 2286

def set_range_text(_replacement, *_)
  nil
end

#set_selection_range(_s, _e, _direction = nil) ⇒ Object



2282
2283
2284
# File 'lib/dommy/html_elements.rb', line 2282

def set_selection_range(_s, _e, _direction = nil)
  nil
end

#text_lengthObject



2261
2262
2263
# File 'lib/dommy/html_elements.rb', line 2261

def text_length
  value.length
end

#typeObject



2265
2266
2267
# File 'lib/dommy/html_elements.rb', line 2265

def type
  "textarea"
end

#validation_messageObject



2299
2300
2301
2302
2303
2304
2305
2306
2307
# File 'lib/dommy/html_elements.rb', line 2299

def validation_message
  return "" unless will_validate

  msg = (@custom_validity_message || "").to_s
  return msg unless msg.empty?
  return "Please fill out this field." if validity.value_missing

  ""
end

#validityObject



2290
2291
2292
# File 'lib/dommy/html_elements.rb', line 2290

def validity
  @__validity ||= ValidityState.new(self)
end

#valueObject

The API value is the "raw value" — the dirty value once set (a wrapper-level flag, NOT a content attribute, so setAttribute("value", …) can't touch it), otherwise the default value (the element's child text content).



2191
2192
2193
# File 'lib/dommy/html_elements.rb', line 2191

def value
  @__value_dirty ? @__value.to_s : default_value
end

#value=(v) ⇒ Object



2195
2196
2197
2198
# File 'lib/dommy/html_elements.rb', line 2195

def value=(v)
  @__value = v.to_s
  @__value_dirty = true
end

#will_validateObject



2294
2295
2296
2297
# File 'lib/dommy/html_elements.rb', line 2294

def will_validate
  !reflected_boolean("disabled") && !disabled_by_ancestor_fieldset? &&
    !reflected_boolean("readonly") && closest("datalist").nil?
end