Class: Dommy::MutationObserver

Inherits:
Object
  • Object
show all
Defined in:
lib/dommy/observer.rb

Instance Method Summary collapse

Constructor Details

#initialize(window, callback) ⇒ MutationObserver

Returns a new instance of MutationObserver.



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

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

Instance Method Details

#__js_call__(method, args) ⇒ Object



80
81
82
83
84
85
86
87
88
89
# File 'lib/dommy/observer.rb', line 80

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



114
115
116
117
118
119
120
121
# File 'lib/dommy/observer.rb', line 114

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.



100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/dommy/observer.rb', line 100

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)


93
94
95
# File 'lib/dommy/observer.rb', line 93

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`).



125
126
127
# File 'lib/dommy/observer.rb', line 125

def records
  @records.dup
end