module Selenium module WebDriver module Safari class Server def initialize(port, command_timeout) @port = port @command_timeout = command_timeout @frame = LibWebSocket::Frame.new end def start @server = TCPServer.new(Platform.localhost, @port) end def stop @server.close if @server && !@server.closed? @ws.close if @ws && !@ws.closed? end def send(command) json = WebDriver.json_dump(command) puts ">>> #{json}" if $DEBUG frame = LibWebSocket::Frame.new(json).to_s @ws.write frame @ws.flush end def receive until msg = @frame.next end_time = Time.now + @command_timeout begin data = @ws.read_nonblock(1) rescue Errno::EWOULDBLOCK, Errno::EAGAIN now = Time.now if now >= end_time raise Error::TimeOutError, "timed out waiting for Safari to respond" end IO.select([@ws], nil, nil, end_time - now) retry end @frame.append(data) end puts "<<< #{msg}" if $DEBUG WebDriver.json_load msg end def ws_uri "ws://#{Platform.localhost}:#{@port}/wd" end def uri "http://#{Platform.localhost}:#{@port}" end def wait_for_connection # TODO: timeouts / non-blocking accept process_initial_http_request process_handshake end HEADERS = <<-HEADERS HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Server: safaridriver-ruby HEADERS HEADERS.gsub!("\n", "\r\n") HTML = <<-HTML