capybara-webkit 1.9.0 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 60209d81bf188faa0999eaefc0ed131547e4bcc1
4
- data.tar.gz: 69865244998cee40ed5a6a49225f6ae555962ecf
3
+ metadata.gz: bfe45069f7c609493f80959297ea7d06b1cba3f6
4
+ data.tar.gz: 144cd7bbc569e2ba13898e82ef283c0ba7bfdcd4
5
5
  SHA512:
6
- metadata.gz: f9287cdc79dc08a5c996d8cb7275bbf002e53589f68d009472f057ed66b17391e14d30ed5ff4264bc87f71c26aa2eb76ca1861e5ac25592c4e6715095a6f50b1
7
- data.tar.gz: 0ce7df637af72ca80c176649c9e9ec456b0ebf6991f0f8e47edc33e81fced0b577ee351ce7cf7c5e016bebb7e39aab01189cf0f8fc35f4a55b562f7adcf39c1c
6
+ metadata.gz: 67ece91583df2ece012ee3ed52f31388ab07fa06216f66466c07b33dfab3b0daecbd97726ebd7376d57ff712ad201e152780edf36a4daa0635a564aaa19a2ed7
7
+ data.tar.gz: ee13cf5f47fb27b8ffc044bf4e592df638e7963647432255ec9744c016453291b3cfa72b64b4091e9cfab63ca7dd2f91e3dc249007feb9eb30018f694138f3e2
data/Appraisals CHANGED
@@ -1,9 +1,9 @@
1
- appraise "2.4" do
2
- gem "capybara", "~> 2.4.0"
1
+ appraise "2.6" do
2
+ gem "capybara", "~> 2.6.0"
3
3
  end
4
4
 
5
- appraise "2.5" do
6
- gem "capybara", "~> 2.5.0"
5
+ appraise "2.7" do
6
+ gem "capybara", "~> 2.7.0"
7
7
  end
8
8
 
9
9
  appraise "master" do
data/NEWS.md CHANGED
@@ -1,3 +1,12 @@
1
+ New for 1.10.0:
2
+
3
+ * Capybara 2.7 compatibility
4
+ * Extract class for booting the server
5
+ * Move stderr option to config
6
+ * Deprecate webkit_debug driver
7
+ * Abort requests before changing settings
8
+ * Convert JavaScript DateTime objects to Ruby Date objects on evaluation
9
+
1
10
  New for 1.9.0:
2
11
 
3
12
  * Raise error for Qt version greater than 5.5
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
19
19
 
20
20
  s.required_ruby_version = ">= 1.9.0"
21
21
 
22
- s.add_runtime_dependency("capybara", ">= 2.3.0", "< 2.7.0")
22
+ s.add_runtime_dependency("capybara", ">= 2.3.0", "< 2.8.0")
23
23
  s.add_runtime_dependency("json")
24
24
 
25
25
  s.add_development_dependency("rspec", "~> 2.14.0")
data/gemfiles/2.6.gemfile CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  source "https://rubygems.org"
4
4
 
5
+ gem "mime-types", "< 3.0", :platforms=>[:ruby_19, :jruby_19]
5
6
  gem "capybara", "~> 2.6.0"
6
- gem "mime-types", "< 3.0", platforms: [:ruby_19, :jruby_19]
7
7
 
8
8
  gemspec :path=>"../"
@@ -3,6 +3,6 @@
3
3
  source "https://rubygems.org"
4
4
 
5
5
  gem "mime-types", "< 3.0", :platforms=>[:ruby_19, :jruby_19]
6
- gem "capybara", "~> 2.4.0"
6
+ gem "capybara", "~> 2.7.0"
7
7
 
8
8
  gemspec :path=>"../"
@@ -16,6 +16,14 @@ Capybara.register_driver :webkit do |app|
16
16
  end
17
17
 
18
18
  Capybara.register_driver :webkit_debug do |app|
19
+ warn "[DEPRECATION] The webkit_debug driver is deprecated. " \
20
+ "Please use Capybara::Webkit.configure instead:\n\n" \
21
+ " Capybara::Webkit.configure do |config|\n" \
22
+ " config.debug = true\n" \
23
+ " end\n\n" \
24
+ "This option is global and can be configured once" \
25
+ " (not in a `before` or `setup` block)."
26
+
19
27
  Capybara::Webkit::Driver.new(
20
28
  app,
21
29
  Capybara::Webkit::Configuration.to_hash.merge(debug: true)
@@ -27,6 +27,7 @@ module Capybara
27
27
  attr_accessor :debug
28
28
  attr_writer :ignore_ssl_errors
29
29
  attr_accessor :proxy
30
+ attr_accessor :stderr
30
31
  attr_accessor :timeout
31
32
  attr_writer :skip_image_loading
32
33
 
@@ -38,6 +39,7 @@ module Capybara
38
39
  @ignore_ssl_errors = false
39
40
  @proxy = nil
40
41
  @skip_image_loading = false
42
+ @stderr = $stderr
41
43
  @timeout = -1
42
44
  end
43
45
 
@@ -90,6 +92,7 @@ module Capybara
90
92
  ignore_ssl_errors: ignore_ssl_errors?,
91
93
  proxy: proxy,
92
94
  skip_image_loading: skip_image_loading?,
95
+ stderr: stderr,
93
96
  timeout: timeout
94
97
  }
95
98
  end
@@ -1,15 +1,9 @@
1
1
  require 'socket'
2
2
  require 'timeout'
3
3
  require 'thread'
4
- require 'open3'
5
4
 
6
5
  module Capybara::Webkit
7
6
  class Connection
8
- SERVER_PATH = File.expand_path("../../../../bin/webkit_server", __FILE__)
9
- WEBKIT_SERVER_START_TIMEOUT = 15
10
-
11
- attr_reader :port, :pid
12
-
13
7
  def initialize(options = {})
14
8
  @socket = nil
15
9
  if options.has_key?(:socket_class)
@@ -19,15 +13,7 @@ module Capybara::Webkit
19
13
  else
20
14
  @socket_class = TCPSocket
21
15
  end
22
- if options.has_key?(:stderr)
23
- @output_target = options[:stderr]
24
- elsif options.has_key?(:stdout)
25
- warn '[DEPRECATION] The Capybara::Webkit::Connection `stdout` option ' \
26
- 'is deprecated. Please use `stderr` instead.'
27
- @output_target = options[:stdout]
28
- else
29
- @output_target = $stderr
30
- end
16
+ @server = options[:server]
31
17
  start_server
32
18
  connect
33
19
  end
@@ -67,44 +53,18 @@ module Capybara::Webkit
67
53
  connect
68
54
  end
69
55
 
70
- private
71
-
72
- def start_server
73
- open_pipe
74
- discover_port
75
- discover_pid
76
- forward_output_in_background_thread
56
+ def port
57
+ @server.port
77
58
  end
78
59
 
79
- def open_pipe
80
- @pipe_stdin, @pipe_stdout, @pipe_stderr, @wait_thr = Open3.popen3(SERVER_PATH)
60
+ def pid
61
+ @server.pid
81
62
  end
82
63
 
83
- def parse_port(line)
84
- if match = line.to_s.match(/listening on port: (\d+)/)
85
- match[1].to_i
86
- else
87
- raise ConnectionError, "#{SERVER_PATH} failed to start."
88
- end
89
- end
90
-
91
- def discover_port
92
- if IO.select([@pipe_stdout], nil, nil, WEBKIT_SERVER_START_TIMEOUT)
93
- @port = parse_port(@pipe_stdout.first)
94
- else
95
- raise ConnectionError, "#{SERVER_PATH} failed to start after #{WEBKIT_SERVER_START_TIMEOUT} seconds."
96
- end
97
- end
98
-
99
- def discover_pid
100
- @pid = @wait_thr[:pid]
101
- end
64
+ private
102
65
 
103
- def forward_output_in_background_thread
104
- Thread.new do
105
- Thread.current.abort_on_exception = true
106
- IO.copy_stream(@pipe_stderr, @output_target) if @output_target
107
- end
66
+ def start_server
67
+ @server.start
108
68
  end
109
69
 
110
70
  def connect
@@ -116,7 +76,7 @@ module Capybara::Webkit
116
76
  end
117
77
 
118
78
  def attempt_connect
119
- @socket = @socket_class.open("127.0.0.1", @port)
79
+ @socket = @socket_class.open("127.0.0.1", port)
120
80
  if defined?(Socket::TCP_NODELAY)
121
81
  @socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, true)
122
82
  end
@@ -5,12 +5,14 @@ require "capybara/webkit/connection"
5
5
  require "capybara/webkit/browser"
6
6
  require "capybara/webkit/cookie_jar"
7
7
  require "capybara/webkit/errors"
8
+ require "capybara/webkit/server"
8
9
 
9
10
  module Capybara::Webkit
10
11
  class Driver < Capybara::Driver::Base
11
12
  def initialize(app, options={})
12
13
  @app = app
13
- @options = options
14
+ @options = options.dup
15
+ @options[:server] ||= Server.new(options)
14
16
  @browser = options[:browser] || Browser.new(Connection.new(options))
15
17
  apply_options
16
18
  end
@@ -0,0 +1,72 @@
1
+ require "open3"
2
+ require "thread"
3
+
4
+ module Capybara
5
+ module Webkit
6
+ class Server
7
+ SERVER_PATH = File.expand_path("../../../../bin/webkit_server", __FILE__)
8
+ WEBKIT_SERVER_START_TIMEOUT = 15
9
+
10
+ attr_reader :port, :pid
11
+
12
+ def initialize(options = {})
13
+ if options.has_key?(:stderr)
14
+ @output_target = options[:stderr]
15
+ elsif options.has_key?(:stdout)
16
+ warn "[DEPRECATION] The Capybara::Webkit::Connection `stdout` " \
17
+ "option is deprecated. Please use `stderr` instead."
18
+ @output_target = options[:stdout]
19
+ else
20
+ @output_target = $stderr
21
+ end
22
+ end
23
+
24
+ def start
25
+ open_pipe
26
+ discover_port
27
+ discover_pid
28
+ forward_output_in_background_thread
29
+ end
30
+
31
+ private
32
+
33
+ def open_pipe
34
+ @pipe_stdin,
35
+ @pipe_stdout,
36
+ @pipe_stderr,
37
+ @wait_thr = Open3.popen3(SERVER_PATH)
38
+ end
39
+
40
+ def discover_port
41
+ if IO.select([@pipe_stdout], nil, nil, WEBKIT_SERVER_START_TIMEOUT)
42
+ @port = parse_port(@pipe_stdout.first)
43
+ else
44
+ raise(
45
+ ConnectionError,
46
+ "#{SERVER_PATH} failed to start after " \
47
+ "#{WEBKIT_SERVER_START_TIMEOUT} seconds.",
48
+ )
49
+ end
50
+ end
51
+
52
+ def parse_port(line)
53
+ if match = line.to_s.match(/listening on port: (\d+)/)
54
+ match[1].to_i
55
+ else
56
+ raise ConnectionError, "#{SERVER_PATH} failed to start."
57
+ end
58
+ end
59
+
60
+ def discover_pid
61
+ @pid = @wait_thr[:pid]
62
+ end
63
+
64
+ def forward_output_in_background_thread
65
+ Thread.new do
66
+ Thread.current.abort_on_exception = true
67
+ IO.copy_stream(@pipe_stderr, @output_target) if @output_target
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -1,7 +1,7 @@
1
1
  module Capybara
2
2
  module Driver
3
3
  class Webkit
4
- VERSION = "1.9.0".freeze
4
+ VERSION = "1.10.0".freeze
5
5
  end
6
6
  end
7
7
  end
data/spec/browser_spec.rb CHANGED
@@ -7,7 +7,8 @@ require 'base64'
7
7
 
8
8
  describe Capybara::Webkit::Browser do
9
9
 
10
- let(:connection) { Capybara::Webkit::Connection.new }
10
+ let(:server) { Capybara::Webkit::Server.new }
11
+ let(:connection) { Capybara::Webkit::Connection.new(server: server) }
11
12
  let(:browser) { Capybara::Webkit::Browser.new(connection) }
12
13
 
13
14
  describe "forking", skip_on_windows: true, skip_on_jruby: true do
@@ -2,144 +2,18 @@ require 'spec_helper'
2
2
  require 'capybara/webkit/connection'
3
3
 
4
4
  describe Capybara::Webkit::Connection do
5
- it "kills the process when the parent process dies", skip_on_windows: true, skip_on_jruby: true do
6
- read_io, write_io = IO.pipe
7
-
8
- fork_pid = fork do
9
- read_io.close
10
- connection = Capybara::Webkit::Connection.new
11
- write_io.write(connection.pid)
12
- write_io.close
13
- Process.wait(connection.pid)
14
- end
15
-
16
- write_io.close
17
-
18
- webkit_pid = read_io.read.to_i
19
- webkit_pid.should be > 1
20
- read_io.close
21
- Process.kill(9, fork_pid)
22
- eventually { expect { Process.getpgid(webkit_pid) }.to raise_error Errno::ESRCH }
23
- end
24
-
25
- def eventually
26
- polling_interval = 0.1
27
- time_limit = Time.now + 3
28
- loop do
29
- begin
30
- yield
31
- return
32
- rescue RSpec::Expectations::ExpectationNotMetError => error
33
- raise error if Time.now >= time_limit
34
- sleep polling_interval
35
- end
36
- end
37
- end
38
-
39
- it "raises an error if the server has stopped", skip_on_windows: true do
40
- path = 'false'
41
- stub_const("Capybara::Webkit::Connection::SERVER_PATH", path)
42
-
43
- expect { Capybara::Webkit::Connection.new }.
44
- to raise_error(
45
- Capybara::Webkit::ConnectionError,
46
- "#{path} failed to start.")
47
- end
48
-
49
- it "raises an error if the server is not ready", skip_on_windows: true do
50
- server_path = 'sleep 1'
51
- stub_const("Capybara::Webkit::Connection::SERVER_PATH", server_path)
52
- start_timeout = 0.5
53
- stub_const("Capybara::Webkit::Connection::WEBKIT_SERVER_START_TIMEOUT", start_timeout)
54
-
55
- error_string =
56
- if defined?(::JRUBY_VERSION)
57
- "#{server_path} failed to start."
58
- else
59
- "#{server_path} failed to start after #{start_timeout} seconds."
60
- end
61
-
62
- expect { Capybara::Webkit::Connection.new }.
63
- to raise_error(Capybara::Webkit::ConnectionError, error_string)
64
- end
65
-
66
- it "boots a server to talk to" do
67
- url = "http://#{@rack_server.host}:#{@rack_server.port}/"
68
- connection.puts "Visit"
69
- connection.puts 1
70
- connection.puts url.to_s.bytesize
71
- connection.print url
72
- connection.gets.should eq "ok\n"
73
- connection.gets.should eq "0\n"
74
- connection.puts "Body"
75
- connection.puts 0
76
- connection.gets.should eq "ok\n"
77
- response_length = connection.gets.to_i
78
- response = connection.read(response_length)
79
- response.should include("Hey there")
80
- end
81
-
82
- it 'forwards stderr to the given IO object' do
83
- read_io, write_io = IO.pipe
84
- redirected_connection = Capybara::Webkit::Connection.new(:stderr => write_io)
85
- redirected_connection.puts "EnableLogging"
86
- redirected_connection.puts 0
87
-
88
- script = 'console.log("hello world")'
89
- redirected_connection.puts "Execute"
90
- redirected_connection.puts 1
91
- redirected_connection.puts script.to_s.bytesize
92
- redirected_connection.print script
93
-
94
- expect(read_io).to include_response "\nhello world"
95
- end
96
-
97
- it 'does not forward stderr to nil' do
98
- IO.should_not_receive(:copy_stream)
99
- Capybara::Webkit::Connection.new(:stderr => nil)
100
- end
101
-
102
- it 'prints a deprecation warning if the stdout option is used' do
103
- Capybara::Webkit::Connection.any_instance.should_receive(:warn)
104
- Capybara::Webkit::Connection.new(:stdout => nil)
105
- end
106
-
107
- it 'does not forward stdout to nil if the stdout option is used' do
108
- Capybara::Webkit::Connection.any_instance.stub(:warn)
109
- IO.should_not_receive(:copy_stream)
110
- Capybara::Webkit::Connection.new(:stdout => nil)
111
- end
112
-
113
- it "returns the server port" do
114
- connection.port.should be_between 0x400, 0xffff
115
- end
116
-
117
- it 'sets appropriate options on its socket' do
118
- socket = double('socket')
5
+ it "sets appropriate options on its socket" do
6
+ socket = double("socket")
7
+ server = double(:Server, start: nil, port: 123)
119
8
  TCPSocket.stub(:open).and_return(socket)
120
9
  if defined?(Socket::TCP_NODELAY)
121
- socket.should_receive(:setsockopt).with(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, true)
10
+ socket.
11
+ should_receive(:setsockopt).
12
+ with(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, true)
122
13
  else
123
14
  socket.should_not_receive(:setsockopt)
124
15
  end
125
- Capybara::Webkit::Connection.new
126
- end
127
16
 
128
- it "chooses a new port number for a new connection" do
129
- new_connection = Capybara::Webkit::Connection.new
130
- new_connection.port.should_not == connection.port
131
- end
132
-
133
- let(:connection) { Capybara::Webkit::Connection.new }
134
-
135
- before(:all) do
136
- @app = lambda do |env|
137
- body = "<html><body>Hey there</body></html>"
138
- [200,
139
- { 'Content-Type' => 'text/html', 'Content-Length' => body.size.to_s },
140
- [body]]
141
- end
142
- @rack_server = Capybara::Server.new(@app)
143
- @rack_server.boot
17
+ Capybara::Webkit::Connection.new(server: server)
144
18
  end
145
19
  end
data/spec/driver_spec.rb CHANGED
@@ -479,6 +479,11 @@ describe Capybara::Webkit::Driver do
479
479
  result.should eq nil
480
480
  end
481
481
 
482
+ it "evaluates Javascript and returns a date" do
483
+ result = driver.evaluate_script(%<new Date("2016-04-01T00:00:00Z")>)
484
+ result.should eq "2016-04-01T00:00:00Z"
485
+ end
486
+
482
487
  it "evaluates Javascript and returns an object" do
483
488
  result = driver.evaluate_script(%<({ 'one' : 1 })>)
484
489
  result.should eq 'one' => 1
@@ -1821,13 +1826,14 @@ describe Capybara::Webkit::Driver do
1821
1826
 
1822
1827
  context "no response app" do
1823
1828
  let(:driver) do
1824
- driver_for_html(<<-HTML, browser: browser)
1829
+ driver_for_html(<<-HTML)
1825
1830
  <html><body>
1826
1831
  <form action="/error"><input type="submit"/></form>
1827
1832
  </body></html>
1828
1833
  HTML
1829
1834
  end
1830
1835
 
1836
+ let!(:connection) { fork_connection }
1831
1837
  before { visit("/") }
1832
1838
 
1833
1839
  it "raises a webkit error for the requested url" do
@@ -1850,9 +1856,6 @@ describe Capybara::Webkit::Driver do
1850
1856
  connection.stub(:puts)
1851
1857
  connection.stub(:print)
1852
1858
  end
1853
-
1854
- let(:browser) { Capybara::Webkit::Browser.new(connection) }
1855
- let(:connection) { Capybara::Webkit::Connection.new }
1856
1859
  end
1857
1860
 
1858
1861
  context "custom font app" do
@@ -2722,7 +2725,7 @@ CACHE MANIFEST
2722
2725
  describe "url whitelisting", skip_if_offline: true do
2723
2726
  it_behaves_like "output writer" do
2724
2727
  let(:driver) do
2725
- driver_for_html(<<-HTML, browser: browser)
2728
+ driver_for_html(<<-HTML)
2726
2729
  <<-HTML
2727
2730
  <html>
2728
2731
  <body>
@@ -2885,7 +2888,7 @@ CACHE MANIFEST
2885
2888
  describe "logger app" do
2886
2889
  it_behaves_like "output writer" do
2887
2890
  let(:driver) do
2888
- driver_for_html("<html><body>Hello</body></html>", browser: browser)
2891
+ driver_for_html("<html><body>Hello</body></html>")
2889
2892
  end
2890
2893
 
2891
2894
  it "logs nothing in normal mode" do
@@ -3066,7 +3069,7 @@ CACHE MANIFEST
3066
3069
  it_behaves_like "output writer" do
3067
3070
  let(:driver) do
3068
3071
  count = 0
3069
- driver_for_app browser: browser do
3072
+ driver_for_app do
3070
3073
  get "/" do
3071
3074
  count += 1
3072
3075
  <<-HTML
@@ -3111,17 +3114,15 @@ CACHE MANIFEST
3111
3114
 
3112
3115
  context "when the driver process crashes" do
3113
3116
  let(:driver) do
3114
- driver_for_app browser: browser do
3117
+ driver_for_app do
3115
3118
  get "/" do
3116
3119
  "<html><body>Relaunched</body></html>"
3117
3120
  end
3118
3121
  end
3119
3122
  end
3120
3123
 
3121
- let(:browser) { Capybara::Webkit::Browser.new(connection) }
3122
- let(:connection) { Capybara::Webkit::Connection.new }
3123
-
3124
3124
  it "reports and relaunches on reset" do
3125
+ connection = fork_connection
3125
3126
  Process.kill "KILL", connection.pid
3126
3127
  expect { driver.reset! }.to raise_error(Capybara::Webkit::CrashError)
3127
3128
  visit "/"
@@ -3157,6 +3158,8 @@ CACHE MANIFEST
3157
3158
  conn.close
3158
3159
  end
3159
3160
  end
3161
+
3162
+ fork_connection
3160
3163
  end
3161
3164
 
3162
3165
  after do
@@ -3190,9 +3193,7 @@ CACHE MANIFEST
3190
3193
  end
3191
3194
  end
3192
3195
 
3193
- let(:driver) { driver_for_html("", browser: browser) }
3194
- let(:browser) { Capybara::Webkit::Browser.new(connection) }
3195
- let(:connection) { Capybara::Webkit::Connection.new }
3196
+ let(:driver) { driver_for_html("") }
3196
3197
  end
3197
3198
 
3198
3199
  context "skip image loading" do
@@ -3295,6 +3296,8 @@ CACHE MANIFEST
3295
3296
  config.use_proxy host: @host, port: @port, user: @user, pass: @pass
3296
3297
  end
3297
3298
 
3299
+ fork_connection
3300
+
3298
3301
  driver.visit @url
3299
3302
  @proxy_requests.size.should eq 2
3300
3303
  @request = @proxy_requests[-1]
@@ -3306,7 +3309,7 @@ CACHE MANIFEST
3306
3309
  end
3307
3310
 
3308
3311
  let(:driver) do
3309
- driver_for_html("", browser: nil)
3312
+ driver_for_html("")
3310
3313
  end
3311
3314
 
3312
3315
  it "uses the HTTP proxy correctly" do
@@ -0,0 +1,150 @@
1
+ require "spec_helper"
2
+ require "capybara/webkit/server"
3
+
4
+ describe Capybara::Webkit::Connection do
5
+ it "ensures the process ends", skip_on_windows: true, skip_on_jruby: true do
6
+ read_io, write_io = IO.pipe
7
+
8
+ fork_pid = fork do
9
+ read_io.close
10
+ server = start_server
11
+ write_io.write(server.pid)
12
+ write_io.close
13
+ Process.wait(server.pid)
14
+ end
15
+
16
+ write_io.close
17
+
18
+ webkit_pid = read_io.read.to_i
19
+ webkit_pid.should be > 1
20
+ read_io.close
21
+ Process.kill(9, fork_pid)
22
+
23
+ eventually do
24
+ expect { Process.getpgid(webkit_pid) }.to raise_error Errno::ESRCH
25
+ end
26
+ end
27
+
28
+ it "raises an error if the server has stopped", skip_on_windows: true do
29
+ path = "false"
30
+ stub_const("Capybara::Webkit::Server::SERVER_PATH", path)
31
+
32
+ expect { start_server }.
33
+ to raise_error(
34
+ Capybara::Webkit::ConnectionError,
35
+ "#{path} failed to start.")
36
+ end
37
+
38
+ it "raises an error if the server is not ready", skip_on_windows: true do
39
+ server_path = "sleep 1"
40
+ stub_const("Capybara::Webkit::Server::SERVER_PATH", server_path)
41
+ start_timeout = 0.5
42
+ stub_const(
43
+ "Capybara::Webkit::Server::WEBKIT_SERVER_START_TIMEOUT",
44
+ start_timeout,
45
+ )
46
+
47
+ error_string =
48
+ if defined?(::JRUBY_VERSION)
49
+ "#{server_path} failed to start."
50
+ else
51
+ "#{server_path} failed to start after #{start_timeout} seconds."
52
+ end
53
+
54
+ expect { start_server }.
55
+ to raise_error(Capybara::Webkit::ConnectionError, error_string)
56
+ end
57
+
58
+ it "boots a server to talk to" do
59
+ url = "http://#{@rack_server.host}:#{@rack_server.port}/"
60
+ server = start_server
61
+ socket = connect_to(server)
62
+ socket.puts "Visit"
63
+ socket.puts 1
64
+ socket.puts url.to_s.bytesize
65
+ socket.print url
66
+ socket.gets.should eq "ok\n"
67
+ socket.gets.should eq "0\n"
68
+ socket.puts "Body"
69
+ socket.puts 0
70
+ socket.gets.should eq "ok\n"
71
+ response_length = socket.gets.to_i
72
+ response = socket.read(response_length)
73
+ response.should include("Hey there")
74
+ end
75
+
76
+ it "forwards stderr to the given IO object" do
77
+ read_io, write_io = IO.pipe
78
+ server = start_server(stderr: write_io)
79
+ socket = connect_to(server)
80
+ socket.puts "EnableLogging"
81
+ socket.puts 0
82
+
83
+ script = "console.log('hello world')"
84
+ socket.puts "Execute"
85
+ socket.puts 1
86
+ socket.puts script.to_s.bytesize
87
+ socket.print script
88
+
89
+ expect(read_io).to include_response "\nhello world"
90
+ end
91
+
92
+ it "does not forward stderr to nil" do
93
+ IO.should_not_receive(:copy_stream)
94
+ start_server(stderr: nil)
95
+ end
96
+
97
+ it "prints a deprecation warning if the stdout option is used" do
98
+ Capybara::Webkit::Server.any_instance.should_receive(:warn)
99
+ start_server(stdout: nil)
100
+ end
101
+
102
+ it "does not forward stdout to nil if the stdout option is used" do
103
+ Capybara::Webkit::Server.any_instance.stub(:warn)
104
+ IO.should_not_receive(:copy_stream)
105
+ start_server(stdout: nil)
106
+ end
107
+
108
+ it "returns the server port" do
109
+ start_server.port.should be_between 0x400, 0xffff
110
+ end
111
+
112
+ it "chooses a new port number for a new connection" do
113
+ start_server.port.should_not == start_server.port
114
+ end
115
+
116
+ before(:all) do
117
+ @app = lambda do |_|
118
+ body = "<html><body>Hey there</body></html>"
119
+ [
120
+ 200,
121
+ { "Content-Type" => "text/html", "Content-Length" => body.size.to_s },
122
+ [body],
123
+ ]
124
+ end
125
+ @rack_server = Capybara::Server.new(@app)
126
+ @rack_server.boot
127
+ end
128
+
129
+ def start_server(options = {})
130
+ Capybara::Webkit::Server.new(options).tap(&:start)
131
+ end
132
+
133
+ def connect_to(server)
134
+ TCPSocket.open("127.0.0.1", server.port)
135
+ end
136
+
137
+ def eventually
138
+ polling_interval = 0.1
139
+ time_limit = Time.now + 3
140
+ loop do
141
+ begin
142
+ yield
143
+ return
144
+ rescue RSpec::Expectations::ExpectationNotMetError => error
145
+ raise error if Time.now >= time_limit
146
+ sleep polling_interval
147
+ end
148
+ end
149
+ end
150
+ end
data/spec/spec_helper.rb CHANGED
@@ -10,7 +10,8 @@ $LOAD_PATH << File.join(PROJECT_ROOT, 'lib')
10
10
  Dir[File.join(PROJECT_ROOT, 'spec', 'support', '**', '*.rb')].each { |file| require(file) }
11
11
 
12
12
  require 'capybara/webkit'
13
- $webkit_connection = Capybara::Webkit::Connection.new
13
+ $webkit_server = Capybara::Webkit::Server.new
14
+ $webkit_connection = Capybara::Webkit::Connection.new(server: $webkit_server)
14
15
  $webkit_browser = Capybara::Webkit::Browser.new($webkit_connection)
15
16
 
16
17
  if ENV['DEBUG']
@@ -5,7 +5,7 @@ require 'sinatra/base'
5
5
 
6
6
  module AppRunner
7
7
  class << self
8
- attr_accessor :app, :app_host, :configuration
8
+ attr_accessor :app, :app_host, :browser, :configuration
9
9
  end
10
10
 
11
11
  def self.boot
@@ -20,6 +20,8 @@ module AppRunner
20
20
  [200, { 'Content-Type' => 'html', 'Content-Length' => 0 }, []]
21
21
  end
22
22
 
23
+ self.browser = $webkit_browser
24
+
23
25
  self.configuration = Capybara::Webkit::Configuration.new
24
26
  end
25
27
 
@@ -31,15 +33,26 @@ module AppRunner
31
33
  yield AppRunner.configuration
32
34
  end
33
35
 
34
- def driver_for_app(*driver_args, &body)
36
+ def fork_connection
37
+ AppRunner.fork_connection
38
+ end
39
+
40
+ def self.fork_connection
41
+ server = Capybara::Webkit::Server.new(options)
42
+ connection = Capybara::Webkit::Connection.new(server: server)
43
+ AppRunner.browser = Capybara::Webkit::Browser.new(connection)
44
+ connection
45
+ end
46
+
47
+ def driver_for_app(&body)
35
48
  app = Class.new(ExampleApp, &body)
36
49
  run_application app
37
- build_driver(*driver_args)
50
+ AppRunner.build_driver
38
51
  end
39
52
 
40
- def driver_for_html(html, *driver_args)
53
+ def driver_for_html(html)
41
54
  run_application_for_html html
42
- build_driver(*driver_args)
55
+ AppRunner.build_driver
43
56
  end
44
57
 
45
58
  def session_for_app(&body)
@@ -54,15 +67,14 @@ module AppRunner
54
67
  }
55
68
  end
56
69
 
57
- private
70
+ def self.build_driver
71
+ Capybara::Webkit::Driver.new(app, options.merge(browser: browser))
72
+ end
58
73
 
59
- def build_driver(overrides = {})
60
- options = AppRunner.configuration.
61
- to_hash.
62
- merge(browser: $webkit_browser).
63
- merge(overrides)
64
- Capybara::Webkit::Driver.new(AppRunner.app, options)
74
+ def self.options
75
+ configuration.to_hash
65
76
  end
77
+ private_class_method :options
66
78
 
67
79
  def self.included(example_group)
68
80
  example_group.class_eval do
@@ -1,11 +1,8 @@
1
1
  shared_examples_for "output writer" do
2
2
  before do
3
3
  @read, @write = IO.pipe
4
- end
5
-
6
- let(:browser) do
7
- connection = Capybara::Webkit::Connection.new(:stderr => @write)
8
- Capybara::Webkit::Browser.new(connection)
4
+ configure { |config| config.stderr = @write }
5
+ fork_connection
9
6
  end
10
7
 
11
8
  let(:stderr) do
@@ -13,9 +13,9 @@ void JsonSerializer::addVariant(const QVariant &object) {
13
13
  if (object.isValid()) {
14
14
  switch(object.type()) {
15
15
  case QMetaType::QString:
16
+ case QMetaType::QDateTime:
16
17
  {
17
- QString string = object.toString();
18
- addString(string);
18
+ addString(object.toString());
19
19
  }
20
20
  break;
21
21
  case QMetaType::QVariantList:
@@ -145,14 +145,6 @@ void WebPageManager::setTimeout(int timeout) {
145
145
  }
146
146
 
147
147
  void WebPageManager::reset() {
148
- m_timeout = -1;
149
- m_cookieJar->clearCookies();
150
- m_networkAccessManager->reset();
151
- m_customHeadersRequestHandler->reset();
152
- m_currentPage->resetLocalStorage();
153
- m_blacklistedRequestHandler->reset();
154
- m_unknownUrlHandler->reset();
155
-
156
148
  foreach(QNetworkReply *reply, m_pendingReplies) {
157
149
  logger() << "Aborting request to" << reply->url().toString();
158
150
  reply->abort();
@@ -164,6 +156,15 @@ void WebPageManager::reset() {
164
156
  page->deleteLater();
165
157
  }
166
158
 
159
+ m_timeout = -1;
160
+ m_cookieJar->clearCookies();
161
+ m_networkAccessManager->reset();
162
+ m_customHeadersRequestHandler->reset();
163
+ m_currentPage->resetLocalStorage();
164
+ m_blacklistedRequestHandler->reset();
165
+ m_unknownUrlHandler->reset();
166
+
167
+
167
168
  qint64 size = QWebSettings::offlineWebApplicationCacheQuota();
168
169
  // No public function was found to wrap the empty() call to
169
170
  // WebCore::cacheStorage().empty()
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capybara-webkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.0
4
+ version: 1.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - thoughtbot
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2016-03-30 00:00:00.000000000 Z
16
+ date: 2016-04-08 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: capybara
@@ -24,7 +24,7 @@ dependencies:
24
24
  version: 2.3.0
25
25
  - - "<"
26
26
  - !ruby/object:Gem::Version
27
- version: 2.7.0
27
+ version: 2.8.0
28
28
  type: :runtime
29
29
  prerelease: false
30
30
  version_requirements: !ruby/object:Gem::Requirement
@@ -34,7 +34,7 @@ dependencies:
34
34
  version: 2.3.0
35
35
  - - "<"
36
36
  - !ruby/object:Gem::Version
37
- version: 2.7.0
37
+ version: 2.8.0
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: json
40
40
  requirement: !ruby/object:Gem::Requirement
@@ -169,9 +169,8 @@ files:
169
169
  - bin/Info.plist
170
170
  - capybara-webkit.gemspec
171
171
  - extconf.rb
172
- - gemfiles/2.4.gemfile
173
- - gemfiles/2.5.gemfile
174
172
  - gemfiles/2.6.gemfile
173
+ - gemfiles/2.7.gemfile
175
174
  - gemfiles/master.gemfile
176
175
  - lib/capybara-webkit.rb
177
176
  - lib/capybara/webkit.rb
@@ -183,6 +182,7 @@ files:
183
182
  - lib/capybara/webkit/errors.rb
184
183
  - lib/capybara/webkit/matchers.rb
185
184
  - lib/capybara/webkit/node.rb
185
+ - lib/capybara/webkit/server.rb
186
186
  - lib/capybara/webkit/version.rb
187
187
  - lib/capybara_webkit_builder.rb
188
188
  - spec/browser_spec.rb
@@ -197,6 +197,7 @@ files:
197
197
  - spec/integration/session_spec.rb
198
198
  - spec/selenium_compatibility_spec.rb
199
199
  - spec/self_signed_ssl_cert.rb
200
+ - spec/server_spec.rb
200
201
  - spec/spec_helper.rb
201
202
  - spec/support/app_runner.rb
202
203
  - spec/support/matchers/include_response.rb
data/gemfiles/2.5.gemfile DELETED
@@ -1,8 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "mime-types", "< 3.0", :platforms=>[:ruby_19, :jruby_19]
6
- gem "capybara", "~> 2.5.0"
7
-
8
- gemspec :path=>"../"