Forward webkit_server's stdout to Ruby's stdout.
This allows console.log() messages to be visible, and prevents large numbers of console.log() calls from filling up webkit_server's pipe which would block the process.
This commit is contained in:
parent
82ae0c298f
commit
dc49e5f875
|
@ -1,4 +1,5 @@
|
||||||
require 'socket'
|
require 'socket'
|
||||||
|
require 'thread'
|
||||||
require 'capybara/util/timeout'
|
require 'capybara/util/timeout'
|
||||||
require 'json'
|
require 'json'
|
||||||
|
|
||||||
|
@ -8,6 +9,9 @@ class Capybara::Driver::Webkit
|
||||||
|
|
||||||
def initialize(options = {})
|
def initialize(options = {})
|
||||||
@socket_class = options[:socket_class] || TCPSocket
|
@socket_class = options[:socket_class] || TCPSocket
|
||||||
|
@stdout = options.has_key?(:stdout) ?
|
||||||
|
options[:stdout] :
|
||||||
|
$stdout
|
||||||
start_server
|
start_server
|
||||||
connect
|
connect
|
||||||
end
|
end
|
||||||
|
@ -79,6 +83,10 @@ class Capybara::Driver::Webkit
|
||||||
def start_server
|
def start_server
|
||||||
read_pipe, write_pipe = fork_server
|
read_pipe, write_pipe = fork_server
|
||||||
@server_port = discover_server_port(read_pipe)
|
@server_port = discover_server_port(read_pipe)
|
||||||
|
@stdout_thread = Thread.new do
|
||||||
|
Thread.current.abort_on_exception = true
|
||||||
|
forward_stdout(read_pipe)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def fork_server
|
def fork_server
|
||||||
|
@ -101,6 +109,17 @@ class Capybara::Driver::Webkit
|
||||||
((read_pipe.first || '').match(/listening on port: (\d+)/) || [])[1].to_i
|
((read_pipe.first || '').match(/listening on port: (\d+)/) || [])[1].to_i
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def forward_stdout(pipe)
|
||||||
|
while !pipe.eof?
|
||||||
|
line = pipe.readline
|
||||||
|
if @stdout
|
||||||
|
@stdout.write(line)
|
||||||
|
@stdout.flush
|
||||||
|
end
|
||||||
|
end
|
||||||
|
rescue EOFError
|
||||||
|
end
|
||||||
|
|
||||||
def connect
|
def connect
|
||||||
Capybara.timeout(5) do
|
Capybara.timeout(5) do
|
||||||
attempt_connect
|
attempt_connect
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
require 'stringio'
|
||||||
require 'capybara/driver/webkit/browser'
|
require 'capybara/driver/webkit/browser'
|
||||||
|
|
||||||
describe Capybara::Driver::Webkit::Browser do
|
describe Capybara::Driver::Webkit::Browser do
|
||||||
|
@ -23,4 +24,12 @@ describe Capybara::Driver::Webkit::Browser do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'forwards stdout to the given IO object' do
|
||||||
|
io = StringIO.new
|
||||||
|
new_browser = Capybara::Driver::Webkit::Browser.new(:stdout => io)
|
||||||
|
new_browser.execute_script('console.log("hello world")')
|
||||||
|
sleep(0.5)
|
||||||
|
io.string.should == "hello world\n"
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -18,7 +18,7 @@ end
|
||||||
require File.join(spec_dir,"spec_helper")
|
require File.join(spec_dir,"spec_helper")
|
||||||
|
|
||||||
require 'capybara/driver/webkit/browser'
|
require 'capybara/driver/webkit/browser'
|
||||||
$webkit_browser = Capybara::Driver::Webkit::Browser.new(:socket_class => TCPSocket)
|
$webkit_browser = Capybara::Driver::Webkit::Browser.new(:socket_class => TCPSocket, :stdout => nil)
|
||||||
|
|
||||||
Capybara.register_driver :reusable_webkit do |app|
|
Capybara.register_driver :reusable_webkit do |app|
|
||||||
Capybara::Driver::Webkit.new(app, :browser => $webkit_browser)
|
Capybara::Driver::Webkit.new(app, :browser => $webkit_browser)
|
||||||
|
|
Loading…
Reference in New Issue