class Selenium::WebDriver::Network

def add_authentication_handler(username = nil, password = nil, *filter, pattern_type: nil, &block)

def add_authentication_handler(username = nil, password = nil, *filter, pattern_type: nil, &block)
  selected_block =
    if username && password
      proc { |auth| auth.authenticate(username, password) }
    else
      block
    end
  add_handler(
    :auth_required,
    BiDi::Network::PHASES[:auth_required],
    BiDi::InterceptedAuth,
    filter,
    pattern_type: pattern_type,
    &selected_block
  )
end

def add_handler(event_type, phase, intercept_type, filter, pattern_type: nil)

def add_handler(event_type, phase, intercept_type, filter, pattern_type: nil)
  intercept = network.add_intercept(phases: [phase], url_patterns: [filter].flatten, pattern_type: pattern_type)
  callback_id = network.on(event_type) do |event|
    request = event['request']
    intercepted_item = intercept_type.new(network, request)
    yield(intercepted_item)
  end
  callbacks[callback_id] = intercept
  callback_id
end

def add_request_handler(*filter, pattern_type: nil, &block)

def add_request_handler(*filter, pattern_type: nil, &block)
  add_handler(
    :before_request,
    BiDi::Network::PHASES[:before_request],
    BiDi::InterceptedRequest,
    filter,
    pattern_type: pattern_type,
    &block
  )
end

def add_response_handler(*filter, pattern_type: nil, &block)

def add_response_handler(*filter, pattern_type: nil, &block)
  add_handler(
    :response_started,
    BiDi::Network::PHASES[:response_started],
    BiDi::InterceptedResponse,
    filter,
    pattern_type: pattern_type,
    &block
  )
end

def clear_handlers

def clear_handlers
  callbacks.each_key { |id| remove_handler(id) }
end

def initialize(bridge)

def initialize(bridge)
  @network = BiDi::Network.new(bridge.bidi)
  @callbacks = {}
end

def remove_handler(id)

def remove_handler(id)
  intercept = callbacks[id]
  network.remove_intercept(intercept['intercept'])
  callbacks.delete(id)
end