lib/webrat/core/elements/field.rb in jwilger-webrat-0.4.3.4 vs lib/webrat/core/elements/field.rb in jwilger-webrat-0.4.4.2
- old
+ new
@@ -6,37 +6,37 @@
module Webrat
# Raised when Webrat is asked to manipulate a disabled form field
class DisabledFieldError < WebratError
end
-
+
class Field < Element #:nodoc:
attr_reader :value
-
+
def self.xpath_search
[".//button", ".//input", ".//textarea", ".//select"]
end
def self.xpath_search_excluding_hidden
[".//button", ".//input[ @type != 'hidden']", ".//textarea", ".//select"]
end
-
+
def self.field_classes
@field_classes || []
end
-
+
def self.inherited(klass)
@field_classes ||= []
@field_classes << klass
# raise args.inspect
end
-
+
def self.load(session, element)
return nil if element.nil?
session.elements[Webrat::XML.xpath_to(element)] ||= field_class(element).new(session, element)
end
-
+
def self.field_class(element)
case element.name
when "button" then ButtonField
when "select" then SelectField
when "textarea" then TextareaField
@@ -53,57 +53,57 @@
when "image" then ButtonField
else TextField
end
end
end
-
+
def initialize(*args)
super
@value = default_value
end
def label_text
return nil if labels.empty?
labels.first.text
end
-
+
def id
Webrat::XML.attribute(@element, "id")
end
def disabled?
@element.attributes.has_key?("disabled") && Webrat::XML.attribute(@element, "disabled") != 'false'
end
-
+
def raise_error_if_disabled
return unless disabled?
raise DisabledFieldError.new("Cannot interact with disabled form element (#{self})")
end
-
+
def to_param
return nil if disabled?
-
+
case Webrat.configuration.mode
when :rails
parse_rails_request_params("#{name}=#{escaped_value}")
when :merb
::Merb::Parse.query("#{name}=#{escaped_value}")
else
{ name => escaped_value }
end
end
-
+
def set(value)
@value = value
end
-
+
def unset
@value = default_value
end
-
+
protected
-
+
def parse_rails_request_params(params)
if defined?(ActionController::AbstractRequest)
ActionController::AbstractRequest.parse_query_parameters(params)
elsif defined?(ActionController::UrlEncodedPairParser)
# For Rails > 2.2
@@ -111,62 +111,62 @@
else
# For Rails > 2.3
Rack::Utils.parse_nested_query(params)
end
end
-
+
def form
Form.load(@session, form_element)
end
-
+
def form_element
parent = @element.parent
-
+
while parent.respond_to?(:parent)
return parent if parent.name == 'form'
parent = parent.parent
end
end
-
+
def name
Webrat::XML.attribute(@element, "name")
end
-
+
def escaped_value
CGI.escape(@value.to_s)
end
-
+
def labels
@labels ||= label_elements.map do |element|
Label.load(@session, element)
end
end
-
+
def label_elements
return @label_elements unless @label_elements.nil?
@label_elements = []
-
+
parent = @element.parent
while parent.respond_to?(:parent)
if parent.name == 'label'
@label_elements.push parent
break
end
parent = parent.parent
end
-
+
unless id.blank?
@label_elements += Webrat::XML.xpath_search(form.element, ".//label[@for = '#{id}']")
end
-
+
@label_elements
end
-
+
def default_value
Webrat::XML.attribute(@element, "value")
end
-
+
def replace_param_value(params, oval, nval)
output = Hash.new
params.each do |key, value|
case value
when Hash
@@ -179,17 +179,17 @@
output[key] = value
end
output
end
end
-
+
class ButtonField < Field #:nodoc:
def self.xpath_search
[".//button", ".//input[@type = 'submit']", ".//input[@type = 'button']", ".//input[@type = 'image']"]
end
-
+
def to_param
return nil if @value.nil?
super
end
@@ -208,11 +208,11 @@
class HiddenField < Field #:nodoc:
def self.xpath_search
".//input[@type = 'hidden']"
end
-
+
def to_param
if collection_name?
super
else
checkbox_with_same_name = form.field_named(name, CheckboxField)
@@ -236,21 +236,21 @@
class CheckboxField < Field #:nodoc:
def self.xpath_search
".//input[@type = 'checkbox']"
end
-
+
def to_param
return nil if @value.nil?
super
end
def check
raise_error_if_disabled
set(Webrat::XML.attribute(@element, "value") || "on")
end
-
+
def checked?
Webrat::XML.attribute(@element, "checked") == "checked"
end
def uncheck
@@ -269,47 +269,47 @@
end
end
class PasswordField < Field #:nodoc:
-
+
def self.xpath_search
".//input[@type = 'password']"
end
-
+
end
class RadioField < Field #:nodoc:
def self.xpath_search
".//input[@type = 'radio']"
end
-
+
def to_param
return nil if @value.nil?
super
end
-
+
def choose
raise_error_if_disabled
other_options.each do |option|
option.set(nil)
end
-
+
set(Webrat::XML.attribute(@element, "value") || "on")
end
-
+
def checked?
Webrat::XML.attribute(@element, "checked") == "checked"
end
-
+
protected
def other_options
form.fields.select { |f| f.name == name }
end
-
+
def default_value
if Webrat::XML.attribute(@element, "checked") == "checked"
Webrat::XML.attribute(@element, "value") || "on"
else
nil
@@ -321,25 +321,25 @@
class TextareaField < Field #:nodoc:
def self.xpath_search
".//textarea"
end
-
+
protected
def default_value
Webrat::XML.inner_html(@element)
end
end
-
+
class FileField < Field #:nodoc:
-
+
def self.xpath_search
".//input[@type = 'file']"
end
-
+
attr_accessor :content_type
def set(value, content_type = nil)
super(value)
@content_type = content_type
@@ -350,13 +350,13 @@
super
else
replace_param_value(super, @value, test_uploaded_file)
end
end
-
+
protected
-
+
def test_uploaded_file
if content_type
ActionController::TestUploadedFile.new(@value, content_type)
else
ActionController::TestUploadedFile.new(@value)
@@ -384,20 +384,20 @@
end
def options
@options ||= SelectOption.load_all(@session, @element)
end
-
+
protected
def default_value
selected_options = Webrat::XML.xpath_search(@element, ".//option[@selected = 'selected']")
- selected_options = Webrat::XML.xpath_search(@element, ".//option[position() = 1]") if selected_options.empty?
-
+ selected_options = Webrat::XML.xpath_search(@element, ".//option[position() = 1]") if selected_options.empty?
+
selected_options.map do |option|
return "" if option.nil?
Webrat::XML.attribute(option, "value") || Webrat::XML.inner_html(option)
- end
+ end.uniq
end
end
end