Class: Dommy::Selection

Inherits:
Object
  • Object
show all
Includes:
Bridge::Methods
Defined in:
lib/dommy/range.rb

Overview

Selection — represents user-selected ranges in the document. Always at most one range in Dommy's stub implementation (matching common browser behavior).

Spec: https://www.w3.org/TR/selection-api/

Instance Method Summary collapse

Methods included from Bridge::Methods

included

Constructor Details

#initialize(document) ⇒ Selection

Returns a new instance of Selection.



699
700
701
702
# File 'lib/dommy/range.rb', line 699

def initialize(document)
  @document = document
  @ranges = []
end

Instance Method Details

#__js_call__(method, args) ⇒ Object



799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
# File 'lib/dommy/range.rb', line 799

def __js_call__(method, args)
  case method
  when "getRangeAt"
    get_range_at(args[0])
  when "addRange"
    add_range(args[0])
  when "removeRange"
    remove_range(args[0])
  when "removeAllRanges"
    remove_all_ranges
  when "empty"
    empty
  when "collapse"
    collapse(args[0], args[1] || 0)
  when "selectAllChildren"
    select_all_children(args[0])
  when "toString"
    to_s
  end
end

#__js_get__(key) ⇒ Object



774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
# File 'lib/dommy/range.rb', line 774

def __js_get__(key)
  case key
  when "rangeCount"
    range_count
  when "anchorNode"
    anchor_node
  when "anchorOffset"
    anchor_offset
  when "focusNode"
    focus_node
  when "focusOffset"
    focus_offset
  when "isCollapsed"
    is_collapsed
  when "type"
    is_collapsed ? "Caret" : "Range"
  else
    Bridge::ABSENT
  end
end

#add_range(range) ⇒ Object



712
713
714
715
716
717
# File 'lib/dommy/range.rb', line 712

def add_range(range)
  # Spec says modern browsers ignore add_range if a range already
  # exists; we keep the behavior simple and replace.
  @ranges = [range]
  nil
end

#anchor_nodeObject



752
753
754
# File 'lib/dommy/range.rb', line 752

def anchor_node
  @ranges.first&.start_container
end

#anchor_offsetObject



756
757
758
# File 'lib/dommy/range.rb', line 756

def anchor_offset
  @ranges.first&.start_offset || 0
end

#collapse(node, offset = 0) ⇒ Object



733
734
735
736
737
738
739
# File 'lib/dommy/range.rb', line 733

def collapse(node, offset = 0)
  range = Range.new(@document)
  range.set_start(node, offset)
  range.set_end(node, offset)
  add_range(range)
  nil
end

#emptyObject



729
730
731
# File 'lib/dommy/range.rb', line 729

def empty
  remove_all_ranges
end

#focus_nodeObject



760
761
762
# File 'lib/dommy/range.rb', line 760

def focus_node
  @ranges.first&.end_container
end

#focus_offsetObject



764
765
766
# File 'lib/dommy/range.rb', line 764

def focus_offset
  @ranges.first&.end_offset || 0
end

#get_range_at(index) ⇒ Object



708
709
710
# File 'lib/dommy/range.rb', line 708

def get_range_at(index)
  @ranges[index.to_i]
end

#is_collapsedObject Also known as: isCollapsed



768
769
770
# File 'lib/dommy/range.rb', line 768

def is_collapsed
  @ranges.empty? || @ranges.first.collapsed?
end

#range_countObject



704
705
706
# File 'lib/dommy/range.rb', line 704

def range_count
  @ranges.length
end

#remove_all_rangesObject



724
725
726
727
# File 'lib/dommy/range.rb', line 724

def remove_all_ranges
  @ranges.clear
  nil
end

#remove_range(range) ⇒ Object



719
720
721
722
# File 'lib/dommy/range.rb', line 719

def remove_range(range)
  @ranges.delete(range)
  nil
end

#select_all_children(node) ⇒ Object



741
742
743
744
745
746
# File 'lib/dommy/range.rb', line 741

def select_all_children(node)
  range = Range.new(@document)
  range.select_node_contents(node)
  add_range(range)
  nil
end

#to_sObject



748
749
750
# File 'lib/dommy/range.rb', line 748

def to_s
  @ranges.map(&:to_s).join
end