2011-02-18 22:53:06 -05:00
|
|
|
require 'socket'
|
2011-02-25 23:47:55 -05:00
|
|
|
require 'capybara/util/timeout'
|
2011-02-26 13:02:43 -05:00
|
|
|
require 'json'
|
2011-02-18 22:53:06 -05:00
|
|
|
|
|
|
|
class Capybara::Driver::Webkit
|
|
|
|
class Browser
|
2011-03-11 11:19:59 -05:00
|
|
|
def initialize(options = {})
|
|
|
|
@socket_class = options[:socket_class] || TCPSocket
|
2011-02-18 22:53:06 -05:00
|
|
|
start_server
|
|
|
|
connect
|
|
|
|
end
|
|
|
|
|
|
|
|
def visit(url)
|
2011-02-24 23:48:18 -05:00
|
|
|
command "Visit", url
|
2011-02-18 22:53:06 -05:00
|
|
|
end
|
|
|
|
|
2011-06-08 05:36:45 -04:00
|
|
|
def header(key, value)
|
|
|
|
command("Header", key, value)
|
|
|
|
end
|
|
|
|
|
2011-02-18 22:53:06 -05:00
|
|
|
def find(query)
|
2011-02-24 23:48:18 -05:00
|
|
|
command("Find", query).split(",")
|
2011-02-18 22:53:06 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def reset!
|
2011-02-24 23:48:18 -05:00
|
|
|
command("Reset")
|
2011-02-18 22:53:06 -05:00
|
|
|
end
|
|
|
|
|
2011-02-25 18:04:23 -05:00
|
|
|
def source
|
|
|
|
command("Source")
|
|
|
|
end
|
|
|
|
|
2011-02-25 17:53:36 -05:00
|
|
|
def url
|
|
|
|
command("Url")
|
|
|
|
end
|
|
|
|
|
2011-04-20 01:42:20 -04:00
|
|
|
def frame_focus(frame_id_or_index=nil)
|
|
|
|
if frame_id_or_index.is_a? Fixnum
|
|
|
|
command("FrameFocus", "", frame_id_or_index.to_s)
|
|
|
|
elsif frame_id_or_index
|
|
|
|
command("FrameFocus", frame_id_or_index)
|
|
|
|
else
|
|
|
|
command("FrameFocus")
|
|
|
|
end
|
2011-04-19 03:16:25 -04:00
|
|
|
end
|
|
|
|
|
2011-02-25 00:15:08 -05:00
|
|
|
def command(name, *args)
|
|
|
|
@socket.puts name
|
2011-02-26 13:38:10 -05:00
|
|
|
@socket.puts args.size
|
|
|
|
args.each do |arg|
|
2011-02-26 17:02:00 -05:00
|
|
|
@socket.puts arg.to_s.bytesize
|
2011-06-25 16:35:18 -04:00
|
|
|
@socket.print arg.to_s
|
2011-02-26 13:38:10 -05:00
|
|
|
end
|
2011-02-25 00:15:08 -05:00
|
|
|
check
|
|
|
|
read_response
|
|
|
|
end
|
|
|
|
|
2011-02-26 13:02:43 -05:00
|
|
|
def evaluate_script(script)
|
|
|
|
json = command('Evaluate', script)
|
|
|
|
JSON.parse("[#{json}]").first
|
|
|
|
end
|
|
|
|
|
2011-02-26 14:03:30 -05:00
|
|
|
def execute_script(script)
|
|
|
|
command('Execute', script)
|
|
|
|
end
|
|
|
|
|
2011-02-18 22:53:06 -05:00
|
|
|
private
|
|
|
|
|
|
|
|
def start_server
|
2011-02-26 18:28:42 -05:00
|
|
|
server_path = File.expand_path("../../../../../bin/webkit_server", __FILE__)
|
|
|
|
@pid = fork { exec(server_path) }
|
2011-02-18 22:53:06 -05:00
|
|
|
at_exit { Process.kill("INT", @pid) }
|
|
|
|
end
|
|
|
|
|
|
|
|
def connect
|
|
|
|
Capybara.timeout(5) do
|
|
|
|
attempt_connect
|
|
|
|
!@socket.nil?
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def attempt_connect
|
2011-06-29 13:14:27 -04:00
|
|
|
@socket = @socket_class.open("localhost", 8200)
|
2011-02-18 22:53:06 -05:00
|
|
|
rescue Errno::ECONNREFUSED
|
|
|
|
end
|
|
|
|
|
|
|
|
def check
|
|
|
|
result = @socket.gets.strip
|
2011-02-25 17:44:16 -05:00
|
|
|
|
2011-02-18 22:53:06 -05:00
|
|
|
unless result == 'ok'
|
2011-02-24 23:22:56 -05:00
|
|
|
raise WebkitError, read_response
|
2011-02-18 22:53:06 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def read_response
|
|
|
|
response_length = @socket.gets.to_i
|
2011-06-14 10:44:17 -04:00
|
|
|
response = @socket.read(response_length)
|
2011-06-14 10:45:05 -04:00
|
|
|
response.force_encoding("UTF-8") if response.respond_to?(:force_encoding)
|
2011-06-14 10:44:17 -04:00
|
|
|
response
|
2011-02-18 22:53:06 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|