class Selenium::WebDriver::Remote::Capabilities

def ==(other)

def ==(other)
  return false unless other.is_a? self.class
  as_json == other.as_json
end

def [](key)

def [](key)
  @capabilities[key]
end

def []=(key, value)

def []=(key, value)
  @capabilities[key] = value
end

def always_match(capabilities)

def always_match(capabilities)
  new(always_match: capabilities)
end

def as_json(*)

def as_json(*)
  @capabilities.each_with_object({}) do |(key, value), hash|
    hash[convert_key(key)] = process_capabilities(key, value, hash)
  end
end

def camel_case(str_or_sym)

def camel_case(str_or_sym)
  str_or_sym.to_s.gsub(/_([a-z])/) { Regexp.last_match(1)&.upcase }
end

def convert_key(key)

def convert_key(key)
  case key
  when String
    key.to_s
  when Symbol
    self.class.camel_case(key)
  else
    raise TypeError, "expected String or Symbol, got #{key.inspect}:#{key.class}"
  end
end

def convert_value(key, value)

def convert_value(key, value)
  case key
  when :platform
    value.to_s.upcase
  when :proxy
    value&.as_json
  when :unhandled_prompt_behavior
    value.is_a?(Symbol) ? value.to_s.tr('_', ' ') : value
  else
    value
  end
end

def first_match(*capabilities)

def first_match(*capabilities)
  new(first_match: capabilities)
end

def implicit_timeout

def implicit_timeout
  timeouts[:implicit]
end

def implicit_timeout=(timeout)

def implicit_timeout=(timeout)
  timeouts[:implicit] = timeout
end

def initialize(opts = {})

def initialize(opts = {})
  @capabilities = {}
  self.proxy = opts.delete(:proxy) if opts[:proxy]
  @capabilities.merge!(opts)
end

def json_create(data)

def json_create(data)
  data = data.dup
  caps = new
  process_timeouts(caps, data.delete('timeouts'))
  if data.key?('proxy')
    proxy = data.delete('proxy')
    caps.proxy = Proxy.json_create(proxy) unless proxy.nil? || proxy.empty?
  end
  # Remote Server Specific
  if data.key?('webdriver.remote.sessionid')
    caps[:remote_session_id] =
      data.delete('webdriver.remote.sessionid')
  end
  KNOWN.each do |cap|
    data_value = camel_case(cap)
    caps[cap] = data.delete(data_value) if data.key?(data_value)
  end
  # any remaining pairs will be added as is, with no conversion
  caps.merge!(data)
  caps
end

def merge!(other)

def merge!(other)
  if other.respond_to?(:capabilities, true) && other.capabilities.is_a?(Hash)
    @capabilities.merge! other.capabilities
  elsif other.is_a? Hash
    @capabilities.merge! other
  else
    raise ArgumentError, 'argument should be a Hash or implement #capabilities'
  end
end

def page_load_timeout

def page_load_timeout
  timeouts[:page_load] || timeouts[:pageLoad]
end

def page_load_timeout=(timeout)

def page_load_timeout=(timeout)
  timeouts[:page_load] = timeout
end

def process_capabilities(key, value, hash)

def process_capabilities(key, value, hash)
  case value
  when Array
    value.map { |v| process_capabilities(key, v, hash) }
  when Hash
    value.each_with_object({}) do |(k, v), h|
      h[convert_key(k)] = process_capabilities(k, v, h)
    end
  when Capabilities, Options
    value.as_json
  else
    convert_value(key, value)
  end
end

def process_timeouts(caps, timeouts)

def process_timeouts(caps, timeouts)
  return if timeouts.nil?
  caps.implicit_timeout = timeouts['implicit']
  caps.page_load_timeout = timeouts['pageLoad']
  caps.script_timeout = timeouts['script']
end

def proxy

def proxy
  @capabilities[:proxy]
end

def proxy=(proxy)

def proxy=(proxy)
  case proxy
  when Hash
    @capabilities[:proxy] = Proxy.new(proxy)
  when Proxy, nil
    @capabilities[:proxy] = proxy
  else
    raise TypeError, "expected Hash or #{Proxy.name}, got #{proxy.inspect}:#{proxy.class}"
  end
end

def script_timeout

def script_timeout
  timeouts[:script]
end

def script_timeout=(timeout)

def script_timeout=(timeout)
  timeouts[:script] = timeout
end

def timeouts

def timeouts
  @capabilities[:timeouts] ||= {}
end

def timeouts=(timeouts)

def timeouts=(timeouts)
  @capabilities[:timeouts] = timeouts
end

def to_json(*)

def to_json(*)
  JSON.generate as_json
end