Class: Dommy::MutationObserver

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

Instance Method Summary collapse

Methods included from Bridge::Methods

included

Constructor Details

#initialize(window, callback) ⇒ MutationObserver

Returns a new instance of MutationObserver.



71
72
73
74
75
76
77
78
79
# File 'lib/dommy/mutation_observer.rb', line 71

def initialize(window, callback)
  @window = window
  @document = window.document
  @callback = callback
  @observed = []
  @records = []
  @scheduled = false
  @registered_docs = []
end

Instance Method Details

#__js_call__(method, args) ⇒ Object



83
84
85
86
87
88
89
90
91
92
# File 'lib/dommy/mutation_observer.rb', line 83

def __js_call__(method, args)
  case method
  when "observe"
    observe(args[0], args[1])
  when "disconnect"
    disconnect
  when "takeRecords"
    take_records
  end
end

#enqueue(record) ⇒ Object



117
118
119
120
121
122
123
124
# File 'lib/dommy/mutation_observer.rb', line 117

def enqueue(record)
  @records << record
  return nil if @scheduled

  @scheduled = true
  @window.scheduler.queue_microtask(proc { flush })
  nil
end

#find_matching_entry(target_wrapped) ⇒ Object

Find the observer entry that matches target_wrapped. Returns the entry with options (attributes, attributeFilter, etc.) or nil if target doesn’t match any observed scope.



103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/dommy/mutation_observer.rb', line 103

def find_matching_entry(target_wrapped)
  matcher = Internal::ObserverMatcher.new
  @observed.find do |entry|
    observed_wrapped = entry[:target]
    next false unless observed_wrapped

    if observed_wrapped.is_a?(Document)
      matcher.matches_document?(target_wrapped, subtree: entry[:subtree])
    else
      matcher.matches?(observed_wrapped, target_wrapped, subtree: entry[:subtree])
    end
  end
end

#matches_wrapped?(target_wrapped) ⇒ Boolean

Matches a wrapped target against this observer’s scope. Called by MutationCoordinator.

Returns:

  • (Boolean)


96
97
98
# File 'lib/dommy/mutation_observer.rb', line 96

def matches_wrapped?(target_wrapped)
  find_matching_entry(target_wrapped) != nil
end

#recordsObject

Public: introspection used by linkedom-style tests that peek at pending records without draining (‘observer.records`).



128
129
130
# File 'lib/dommy/mutation_observer.rb', line 128

def records
  @records.dup
end