module Cucumber::Rails::Capybara::JavascriptEmulation
Public Class Methods
Source
# File lib/cucumber/rails/capybara/javascript_emulation.rb, line 7 def self.included(base) base.class_eval do alias_method :click_without_javascript_emulation, :click alias_method :click, :click_with_javascript_emulation end end
Public Instance Methods
Source
# File lib/cucumber/rails/capybara/javascript_emulation.rb, line 14 def click_with_javascript_emulation(*) if link_with_non_get_http_method? ::Capybara::RackTest::Form.new( driver, js_form(element_node.document, self[:href], emulated_method) ).submit(self) else click_without_javascript_emulation end end
Private Instance Methods
Source
# File lib/cucumber/rails/capybara/javascript_emulation.rb, line 26 def csrf? csrf_param_node && csrf_token_node end
Source
# File lib/cucumber/rails/capybara/javascript_emulation.rb, line 34 def csrf_param csrf_param_node['content'] end
Source
# File lib/cucumber/rails/capybara/javascript_emulation.rb, line 30 def csrf_param_node element_node.document.at_xpath("//meta[@name='csrf-param']") end
Source
# File lib/cucumber/rails/capybara/javascript_emulation.rb, line 42 def csrf_token csrf_token_node['content'] end
Source
# File lib/cucumber/rails/capybara/javascript_emulation.rb, line 38 def csrf_token_node element_node.document.at_xpath("//meta[@name='csrf-token']") end
Source
# File lib/cucumber/rails/capybara/javascript_emulation.rb, line 93 def element_node native end
Source
# File lib/cucumber/rails/capybara/javascript_emulation.rb, line 89 def emulated_method element_node['data-method'] end
Source
# File lib/cucumber/rails/capybara/javascript_emulation.rb, line 71 def get?(emulated_method) same?(emulated_method, 'get') end
Source
# File lib/cucumber/rails/capybara/javascript_emulation.rb, line 46 def js_form(document, action, emulated_method, method = 'POST') js_form = document.create_element('form') js_form['action'] = action js_form['method'] = method add_hidden_method_input(document, js_form) unless same?(emulated_method, method) # rails will wipe the session if the CSRF token is not sent with non-GET requests add_hidden_csrf_input(document, js_form) if csrf? && !get?(emulated_method) js_form end
Source
# File lib/cucumber/rails/capybara/javascript_emulation.rb, line 83 def link_with_non_get_http_method? tag_name == 'a' && element_node['data-method'] && element_node['data-method'] =~ /(?:delete|put|post)/ end
Source
# File lib/cucumber/rails/capybara/javascript_emulation.rb, line 59 def same?(emulated_method, method) emulated_method.casecmp(method).zero? end