class Selenium::WebDriver::Support::EventFiringBridge

def clear_element(ref)

def clear_element(ref)
  dispatch(:change_value_of, create_element(ref), driver) do
    @delegate.clear_element(ref)
  end
end

def click_element(ref)

def click_element(ref)
  dispatch(:click, create_element(ref), driver) do
    @delegate.click_element(ref)
  end
end

def close

def close
  dispatch(:close, driver) { @delegate.close }
end

def create_element(ref)

def create_element(ref)
  # hmm. we're not passing self here to not fire events for potential calls made by the listener
  Element.new @delegate, ref
end

def dispatch(name, *args)

def dispatch(name, *args)
  @listener.__send__("before_#{name}", *args)
  returned = yield
  @listener.__send__("after_#{name}", *args)
  returned
end

def driver

def driver
  @driver ||= Driver.new(bridge: self)
end

def execute_script(script, *args)

def execute_script(script, *args)
  dispatch(:execute_script, script, driver) do
    @delegate.execute_script(script, *args)
  end
end

def find_element_by(how, what, parent = nil)

def find_element_by(how, what, parent = nil)
  e = dispatch(:find, how, what, driver) do
    @delegate.find_element_by how, what, parent
  end
  Element.new self, e.ref.last
end

def find_elements_by(how, what, parent = nil)

def find_elements_by(how, what, parent = nil)
  es = dispatch(:find, how, what, driver) do
    @delegate.find_elements_by(how, what, parent)
  end
  es.map { |e| Element.new self, e.ref.last }
end

def get(url)

def get(url)
  dispatch(:navigate_to, url, driver) do
    @delegate.get(url)
  end
end

def go_back

def go_back
  dispatch(:navigate_back, driver) do
    @delegate.go_back
  end
end

def go_forward

def go_forward
  dispatch(:navigate_forward, driver) do
    @delegate.go_forward
  end
end

def initialize(delegate, listener)

def initialize(delegate, listener)
  @delegate = delegate
  @listener = if listener.respond_to? :call
                BlockEventListener.new(listener)
              else
                listener
              end
end

def method_missing(meth, *args, &blk) # rubocop:disable Style/MissingRespondToMissing

rubocop:disable Style/MissingRespondToMissing
def method_missing(meth, *args, &blk) # rubocop:disable Style/MissingRespondToMissing
  @delegate.__send__(meth, *args, &blk)
end

def quit

def quit
  dispatch(:quit, driver) { @delegate.quit }
end

def send_keys_to_element(ref, keys)

def send_keys_to_element(ref, keys)
  dispatch(:change_value_of, create_element(ref), driver) do
    @delegate.send_keys_to_element(ref, keys)
  end
end