Class: Capybara::Poltergeist::Client
- Inherits:
-
Object
- Object
- Capybara::Poltergeist::Client
- Defined in:
- lib/capybara/poltergeist/client.rb
Constant Summary collapse
- PHANTOMJS_SCRIPT =
File.('../client/compiled/main.js', __FILE__)
- PHANTOMJS_VERSION =
['>= 1.8.1', '< 3.0']
- PHANTOMJS_NAME =
'phantomjs'
- KILL_TIMEOUT =
seconds
2
Instance Attribute Summary collapse
-
#path ⇒ Object
readonly
Returns the value of attribute path.
-
#phantomjs_options ⇒ Object
readonly
Returns the value of attribute phantomjs_options.
-
#pid ⇒ Object
readonly
Returns the value of attribute pid.
-
#server ⇒ Object
readonly
Returns the value of attribute server.
-
#window_size ⇒ Object
readonly
Returns the value of attribute window_size.
Class Method Summary collapse
-
.process_killer(pid) ⇒ Object
Returns a proc, that when called will attempt to kill the given process.
- .start(*args) ⇒ Object
Instance Method Summary collapse
- #command ⇒ Object
-
#initialize(server, options = {}) ⇒ Client
constructor
A new instance of Client.
- #restart ⇒ Object
- #start ⇒ Object
- #stop ⇒ Object
Constructor Details
#initialize(server, options = {}) ⇒ Client
Returns a new instance of Client.
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/capybara/poltergeist/client.rb', line 34 def initialize(server, = {}) @server = server @path = Cliver::detect!(([:path] || PHANTOMJS_NAME), *PHANTOMJS_VERSION) @window_size = [:window_size] || [1024, 768] @phantomjs_options = [:phantomjs_options] || [] @phantomjs_logger = [:phantomjs_logger] || $stdout pid = Process.pid at_exit do # do the work in a separate thread, to avoid stomping on $!, # since other libraries depend on it directly. Thread.new do stop if Process.pid == pid end.join end end |
Instance Attribute Details
#path ⇒ Object (readonly)
Returns the value of attribute path.
32 33 34 |
# File 'lib/capybara/poltergeist/client.rb', line 32 def path @path end |
#phantomjs_options ⇒ Object (readonly)
Returns the value of attribute phantomjs_options.
32 33 34 |
# File 'lib/capybara/poltergeist/client.rb', line 32 def @phantomjs_options end |
#pid ⇒ Object (readonly)
Returns the value of attribute pid.
32 33 34 |
# File 'lib/capybara/poltergeist/client.rb', line 32 def pid @pid end |
#server ⇒ Object (readonly)
Returns the value of attribute server.
32 33 34 |
# File 'lib/capybara/poltergeist/client.rb', line 32 def server @server end |
#window_size ⇒ Object (readonly)
Returns the value of attribute window_size.
32 33 34 |
# File 'lib/capybara/poltergeist/client.rb', line 32 def window_size @window_size end |
Class Method Details
.process_killer(pid) ⇒ Object
Returns a proc, that when called will attempt to kill the given process. This is because implementing ObjectSpace.define_finalizer is tricky. Hat-Tip to @mperham for describing in detail: www.mikeperham.com/2010/02/24/the-trouble-with-ruby-finalizers/
23 24 25 26 27 28 29 30 |
# File 'lib/capybara/poltergeist/client.rb', line 23 def self.process_killer(pid) proc do begin Process.kill('KILL', pid) rescue Errno::ESRCH, Errno::ECHILD end end end |
.start(*args) ⇒ Object
13 14 15 16 17 |
# File 'lib/capybara/poltergeist/client.rb', line 13 def self.start(*args) client = new(*args) client.start client end |
Instance Method Details
#command ⇒ Object
84 85 86 87 88 89 90 91 |
# File 'lib/capybara/poltergeist/client.rb', line 84 def command parts = [path] parts.concat parts << PHANTOMJS_SCRIPT parts << server.port parts.concat window_size parts end |
#restart ⇒ Object
79 80 81 82 |
# File 'lib/capybara/poltergeist/client.rb', line 79 def restart stop start end |
#start ⇒ Object
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/capybara/poltergeist/client.rb', line 53 def start @read_io, @write_io = IO.pipe @out_thread = Thread.new { while !@read_io.eof? && data = @read_io.readpartial(1024) @phantomjs_logger.write(data) end } = {} [:pgroup] = true unless Capybara::Poltergeist.windows? redirect_stdout do @pid = Process.spawn(*command.map(&:to_s), ) ObjectSpace.define_finalizer(self, self.class.process_killer(@pid)) end end |
#stop ⇒ Object
70 71 72 73 74 75 76 77 |
# File 'lib/capybara/poltergeist/client.rb', line 70 def stop if pid kill_phantomjs @out_thread.kill close_io ObjectSpace.undefine_finalizer(self) end end |