### Home Classes Methods

### In Files

- lib/selenium/webdriver/safari/server.rb

### Parent

Object

### Methods

- ::new
- #encode_form_component
- #process_handshake
- #process_initial_http_request
- #receive
- #send
- #start
- #stop
- #uri
- #wait_for_connection
- #ws_uri

### Class/Module Index

Quicksearch

- Selenium
- Selenium::Client
- Selenium::Client::Base
- Selenium::Client::CommandError
- Selenium::Client::Driver
- Selenium::Client::Extensions
- Selenium::Client::GeneratedDriver
- Selenium::Client::Idiomatic
- Selenium::Client::JavascriptExpressionBuilder
- Selenium::Client::JavascriptFrameworks
- Selenium::Client::JavascriptFrameworks::JQuery
- Selenium::Client::JavascriptFrameworks::Prototype
- Selenium::Client::Protocol
- Selenium::Client::ProtocolError
- Selenium::Client::SeleniumHelper
- Selenium::Rake
- Selenium::Rake::MissingJarFileError
- Selenium::Rake::ServerTask
- Selenium::Server
- Selenium::Server::Error
- Selenium::WebDriver
- Selenium::WebDriver::ActionBuilder
- Selenium::WebDriver::Alert
- Selenium::WebDriver::Android
- Selenium::WebDriver::Android::Bridge
- Selenium::WebDriver::BridgeHelper
- Selenium::WebDriver::Chrome
- Selenium::WebDriver::Chrome::Bridge
- Selenium::WebDriver::Chrome::Profile
- Selenium::WebDriver::Chrome::Service
- Selenium::WebDriver::Driver
- Selenium::WebDriver::DriverExtensions
- Selenium::WebDriver::DriverExtensions::HasBrowserConnection
- Selenium::WebDriver::DriverExtensions::HasInputDevices
- Selenium::WebDriver::DriverExtensions::HasLocation
- Selenium::WebDriver::DriverExtensions::HasSessionId
- Selenium::WebDriver::DriverExtensions::HasTouchScreen
- Selenium::WebDriver::DriverExtensions::HasWebStorage
- Selenium::WebDriver::DriverExtensions::Rotatable
- Selenium::WebDriver::DriverExtensions::TakesScreenshot
- Selenium::WebDriver::DriverExtensions::UploadsFiles
- Selenium::WebDriver::Element
- Selenium::WebDriver::Error
- Selenium::WebDriver::Error::ElementNotDisplayedError
- Selenium::WebDriver::Error::ElementNotSelectableError
- Selenium::WebDriver::Error::ElementNotVisibleError
- Selenium::WebDriver::Error::ExpectedError
- Selenium::WebDriver::Error::IMEEngineActivationFailedError
- Selenium::WebDriver::Error::IMENotAvailableError
- Selenium::WebDriver::Error::IndexOutOfBoundsError
- Selenium::WebDriver::Error::InvalidCookieDomainError
- Selenium::WebDriver::Error::InvalidElementCoordinatesError
- Selenium::WebDriver::Error::InvalidElementStateError
- Selenium::WebDriver::Error::InvalidSelectorError
- Selenium::WebDriver::Error::JavascriptError
- Selenium::WebDriver::Error::MoveTargetOutOfBoundsError
- Selenium::WebDriver::Error::NoAlertOpenError
- Selenium::WebDriver::Error::NoAlertPresentError
- Selenium::WebDriver::Error::NoCollectionError
- Selenium::WebDriver::Error::NoScriptResultError
- Selenium::WebDriver::Error::NoStringError
- Selenium::WebDriver::Error::NoStringLengthError
- Selenium::WebDriver::Error::NoStringWrapperError
- Selenium::WebDriver::Error::NoSuchCollectionError
- Selenium::WebDriver::Error::NoSuchDocumentError
- Selenium::WebDriver::Error::NoSuchDriverError
- Selenium::WebDriver::Error::NoSuchElementError
- Selenium::WebDriver::Error::NoSuchFrameError
- Selenium::WebDriver::Error::NoSuchWindowError
- Selenium::WebDriver::Error::NullPointerError
- Selenium::WebDriver::Error::ObsoleteElementError
- Selenium::WebDriver::Error::ScriptTimeOutError
- Selenium::WebDriver::Error::ServerError
- Selenium::WebDriver::Error::StaleElementReferenceError
- Selenium::WebDriver::Error::TimeOutError
- Selenium::WebDriver::Error::UnableToSetCookieError
- Selenium::WebDriver::Error::UnexpectedJavascriptError
- Selenium::WebDriver::Error::UnhandledAlertError
- Selenium::WebDriver::Error::UnhandledError
- Selenium::WebDriver::Error::UnknownCommandError
- Selenium::WebDriver::Error::UnknownError
- Selenium::WebDriver::Error::UnsupportedOperationError
- Selenium::WebDriver::Error::WebDriverError
- Selenium::WebDriver::Error::XPathLookupError
- Selenium::WebDriver::FileReaper
- Selenium::WebDriver::Firefox
- Selenium::WebDriver::Firefox::Binary
- Selenium::WebDriver::Firefox::Bridge
- Selenium::WebDriver::Firefox::Extension
- Selenium::WebDriver::Firefox::Launcher
- Selenium::WebDriver::Firefox::Profile
- Selenium::WebDriver::Firefox::ProfilesIni
- Selenium::WebDriver::Firefox::SocketLock
- Selenium::WebDriver::Firefox::Util
- Selenium::WebDriver::HTML5
- Selenium::WebDriver::HTML5::LocalStorage
- Selenium::WebDriver::HTML5::SessionStorage
- Selenium::WebDriver::HTML5::SharedWebStorage
- Selenium::WebDriver::IE
- Selenium::WebDriver::IE::Bridge
- Selenium::WebDriver::IE::Server
- Selenium::WebDriver::IPhone
- Selenium::WebDriver::IPhone::Bridge
- Selenium::WebDriver::JsonHelper
- Selenium::WebDriver::Keyboard
- Selenium::WebDriver::Keys
- Selenium::WebDriver::LogEntry
- Selenium::WebDriver::Mouse
- Selenium::WebDriver::Navigation
- Selenium::WebDriver::Opera
- Selenium::WebDriver::Opera::Bridge
- Selenium::WebDriver::Opera::Service
- Selenium::WebDriver::Options
- Selenium::WebDriver::PhantomJS
- Selenium::WebDriver::PhantomJS::Bridge
- Selenium::WebDriver::PhantomJS::Service
- Selenium::WebDriver::Platform
- Selenium::WebDriver::PortProber
- Selenium::WebDriver::ProfileHelper
- Selenium::WebDriver::ProfileHelper::ClassMethods
- Selenium::WebDriver::Proxy
- Selenium::WebDriver::Remote
- Selenium::WebDriver::Remote::Bridge
- Selenium::WebDriver::Remote::Capabilities
- Selenium::WebDriver::Remote::Http
- Selenium::WebDriver::Remote::Http::Common
- Selenium::WebDriver::Remote::Http::Curb
- Selenium::WebDriver::Remote::Http::Default
- Selenium::WebDriver::Remote::Http::Persistent
- Selenium::WebDriver::Remote::Response
- Selenium::WebDriver::Safari
- Selenium::WebDriver::Safari::Bridge
- Selenium::WebDriver::Safari::Browser
- Selenium::WebDriver::Safari::Extension
- Selenium::WebDriver::Safari::Server
- Selenium::WebDriver::SearchContext
- Selenium::WebDriver::SocketPoller
- Selenium::WebDriver::Support
- Selenium::WebDriver::Support::AbstractEventListener
- Selenium::WebDriver::Support::BlockEventListener
- Selenium::WebDriver::Support::Color
- Selenium::WebDriver::Support::EventFiringBridge
- Selenium::WebDriver::Support::Select
- Selenium::WebDriver::Support::Select::Escaper
- Selenium::WebDriver::TargetLocator
- Selenium::WebDriver::Timeouts
- Selenium::WebDriver::TouchActionBuilder
- Selenium::WebDriver::TouchScreen
- Selenium::WebDriver::Wait
- Selenium::WebDriver::Window
- Selenium::WebDriver::Zipper
- Base64
- Dir
- SocketError
- String

No matching classes.

# Selenium::WebDriver::Safari::Server

### Constants

HEADERS
HTML

### Public Class Methods

new(port, command_timeout) click to toggle source

    # File lib/selenium/webdriver/safari/server.rb, line 6
    def initialize(port, command_timeout)
      @port  = port
      @command_timeout = command_timeout
    end

### Public Instance Methods

encode_form_component(str) click to toggle source

    # File lib/selenium/webdriver/safari/server.rb, line 133
    def encode_form_component(str)
      if URI.respond_to?(:encode_www_form_component) # >= 1.9
        URI.encode_www_form_component(str)
      else
        # best effort for 1.8
        str.gsub(":", '%3A').gsub('/', '%2F')
      end
    end

process_handshake() click to toggle source

    # File lib/selenium/webdriver/safari/server.rb, line 103
    def process_handshake
      @ws = @server.accept
      hs  = WebSocket::Handshake::Server.new

      req = ''
      until hs.finished?
        data = @ws.getc || next

        req << data.chr
        hs << data
      end

      unless hs.valid?
        if req.include? "favicon.ico"
          @ws.close
          process_handshake
          return
        else
          raise Error::WebDriverError, "#{hs.error}: #{req}"
        end
      end

      @ws.write(hs.to_s)
      @ws.flush

      puts "handshake complete, v#{hs.version}" if $DEBUG
      @server.close
      @version = hs.version
    end

process_initial_http_request() click to toggle source

    # File lib/selenium/webdriver/safari/server.rb, line 80
    def process_initial_http_request
      http = @server.accept

      req = ''
      until req.include?("\r\n\r\n")
        req << http.read(1)
      end

      if !req.include?("?url=")
        http << HEADERS % [302, 'Moved Temporarily']
        http << "Location: #{uri}?url=#{encode_form_component ws_uri}\r\n"
        http << "\r\n\r\n"
        http.close

        process_initial_http_request
      else
        http << HEADERS % [200, 'OK']
        http << "\r\n\r\n"
        http << HTML
        http.close
      end
    end

receive() click to toggle source

    # File lib/selenium/webdriver/safari/server.rb, line 30
    def receive
      @frame ||= WebSocket::Frame::Incoming::Server.new(:version => @version)

      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 << data
      end

      puts "<<< #{msg}" if $DEBUG

      WebDriver.json_load msg.to_s
    end

send(command) click to toggle source

    # File lib/selenium/webdriver/safari/server.rb, line 20
    def send(command)
      json = WebDriver.json_dump(command)
      puts ">>> #{json}" if $DEBUG

      frame = WebSocket::Frame::Outgoing::Server.new(:version => @version, :data => json, :type => :text)

      @ws.write frame.to_s
      @ws.flush
    end

start() click to toggle source

    # File lib/selenium/webdriver/safari/server.rb, line 11
    def start
      @server = TCPServer.new(Platform.localhost, @port)
    end

stop() click to toggle source

    # File lib/selenium/webdriver/safari/server.rb, line 15
    def stop
      @server.close if @server && !@server.closed?
      @ws.close if @ws && !@ws.closed?
    end

uri() click to toggle source

    # File lib/selenium/webdriver/safari/server.rb, line 60
    def uri
      "http://#{Platform.localhost}:#{@port}"
    end

wait_for_connection() click to toggle source

    # File lib/selenium/webdriver/safari/server.rb, line 64
    def wait_for_connection
      # TODO: timeouts / non-blocking accept
      process_initial_http_request
      process_handshake
    end

ws_uri() click to toggle source

    # File lib/selenium/webdriver/safari/server.rb, line 56
    def ws_uri
      "ws://#{Platform.localhost}:#{@port}/wd"
    end

[Validate]

Generated with the Darkfish Rdoc Generator 2.