# File lib/capybara/driver/envjs_driver.rb, line 151 def initialize(app) if rack_test? require 'rack/test' class << self; self; end.instance_eval do include ::Rack::Test::Methods alias_method :response, :last_response alias_method :request, :last_request define_method :build_rack_mock_session do # p default_host Rack::MockSession.new(app, default_host) end end end @app = app master_load = browser.master["load"] if rack_test? browser.master["load"] = proc do |*args| if args.size == 2 and args[1].to_s != "[object split_global]" file, window = *args body = nil if file.index(app_host) == 0 get(file, {}, env) body = response.body else body = Net::HTTP.get(URI.parse(file)) end window["evaluate"].call body else master_load.call *args end end browser["window"]["$envx"]["connection"] = browser.master["connection"] = @connection = proc do |*args| xhr, responseHandler, data = *args url = xhr.url params = data || "" method = xhr["method"].downcase.to_sym e = env; if method == :post or method == :put e.merge! "CONTENT_TYPE" => xhr.headers["Content-Type"] end e.merge! "HTTP_ACCEPT" => xhr.headers["Accept"] if xhr.headers["Accept"] if e["CONTENT_TYPE"] =~ %r{^multipart/form-data;} e["CONTENT_LENGTH"] ||= params.length end times = 0 begin # p url, app_host if url.index(app_host) == 0 url.slice! 0..(app_host.length-1) end # p url # puts "send #{method} #{url} #{params} #{e}" send method, url, params, e # p "after" #, response while response.status == 302 || response.status == 301 if (times += 1) > 5 raise Capybara::InfiniteRedirectError, "redirected more than 5 times, check for infinite redirects." end params = {} method = :get url = response.location if url.index(app_host) == 0 url.slice! 0..(app_host.length-1) end # puts "redirect #{method} #{url} #{params}" send method, url, params, env end rescue Exception => e # print "got #{e} #{response.inspect}\n" raise e end @source = response.body response.headers.each do |k,v| xhr.responseHeaders[k] = v end xhr.status = response.status xhr.responseText = response.body xhr.readyState = 4 if url.index(app_host) == 0 url.slice! 0..(app_host.length-1) end if url.slice(0..0) == "/" url = app_host+url end xhr.__url = url responseHandler.call end end end
# File lib/capybara/driver/envjs_driver.rb, line 147 def app_host (ENV["CAPYBARA_APP_HOST"] || Capybara.app_host || default_url) end
# File lib/capybara/driver/envjs_driver.rb, line 263 def body browser["window"].document.xml end
# File lib/capybara/driver/envjs_driver.rb, line 317 def browser unless @_browser require 'johnson/tracemonkey' require 'envjs/runtime' @_browser = Johnson::Runtime.new :size => Integer(ENV["JOHNSON_HEAP_SIZE"] || 0x4000000) @_browser.extend Envjs::Runtime end @_browser end
# File lib/capybara/driver/envjs_driver.rb, line 255 def current_url browser["window"].location.href end
# File lib/capybara/driver/envjs_driver.rb, line 139 def default_host (Capybara.default_host || "www.example.com") end
# File lib/capybara/driver/envjs_driver.rb, line 143 def default_url "http://"+default_host end
# File lib/capybara/driver/envjs_driver.rb, line 313 def evaluate_script(script) browser["window"]["evaluate"].call(script) end
# File lib/capybara/driver/envjs_driver.rb, line 308 def execute_script(script) browser["window"]["evaluate"].call(script) nil end
# File lib/capybara/driver/envjs_driver.rb, line 289 def find(selector) window = browser["window"] null = browser["null"] type = window["XPathResult"]["ANY_TYPE"] result_set = window.document.evaluate selector, window.document, null, type, null nodes = [] while n = result_set.iterateNext() nodes << Node.new(self, n) end nodes end
# File lib/capybara/driver/envjs_driver.rb, line 328 def has_shortcircuit_timeout? true end
# File lib/capybara/driver/envjs_driver.rb, line 134 def rack_test? # p "rt?", app_host, default_url, (app_host == default_url) app_host == default_url end
# File lib/capybara/driver/envjs_driver.rb, line 267 def reset! clear_cookies end
# File lib/capybara/driver/envjs_driver.rb, line 281 def response_headers Headers.new(browser["window"]["document"]["__headers__"]) end
# File lib/capybara/driver/envjs_driver.rb, line 259 def source browser["window"].document.__original_text__ end
# File lib/capybara/driver/envjs_driver.rb, line 285 def status_code response.status end
# File lib/capybara/driver/envjs_driver.rb, line 247 def visit(path) as_url = URI.parse path base = URI.parse app_host path = (base + as_url).to_s # p path browser["window"].location.href = path end
# File lib/capybara/driver/envjs_driver.rb, line 301 def wait?; true; end
# File lib/capybara/driver/envjs_driver.rb, line 303 def wait_until max fired, wait = *browser["Envjs"].wait(-max*1000) raise Capybara::TimeoutError if !fired && wait.nil? end