capybara 3.3.0 → 3.40.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 +4 -4
- data/.yardopts +1 -0
- data/History.md +803 -13
- data/License.txt +1 -1
- data/README.md +257 -84
- data/lib/capybara/config.rb +25 -9
- data/lib/capybara/cucumber.rb +1 -1
- data/lib/capybara/driver/base.rb +17 -3
- data/lib/capybara/driver/node.rb +31 -6
- data/lib/capybara/dsl.rb +9 -7
- data/lib/capybara/helpers.rb +31 -7
- data/lib/capybara/minitest/spec.rb +180 -88
- data/lib/capybara/minitest.rb +262 -149
- data/lib/capybara/node/actions.rb +202 -116
- data/lib/capybara/node/base.rb +34 -19
- data/lib/capybara/node/document.rb +14 -2
- data/lib/capybara/node/document_matchers.rb +10 -12
- data/lib/capybara/node/element.rb +269 -115
- data/lib/capybara/node/finders.rb +99 -77
- data/lib/capybara/node/matchers.rb +327 -151
- data/lib/capybara/node/simple.rb +48 -13
- data/lib/capybara/node/whitespace_normalizer.rb +81 -0
- data/lib/capybara/queries/active_element_query.rb +18 -0
- data/lib/capybara/queries/ancestor_query.rb +8 -9
- data/lib/capybara/queries/base_query.rb +23 -16
- data/lib/capybara/queries/current_path_query.rb +16 -6
- data/lib/capybara/queries/match_query.rb +1 -0
- data/lib/capybara/queries/selector_query.rb +587 -130
- data/lib/capybara/queries/sibling_query.rb +8 -6
- data/lib/capybara/queries/style_query.rb +6 -2
- data/lib/capybara/queries/text_query.rb +28 -14
- data/lib/capybara/queries/title_query.rb +2 -2
- data/lib/capybara/rack_test/browser.rb +92 -25
- data/lib/capybara/rack_test/driver.rb +16 -7
- data/lib/capybara/rack_test/errors.rb +6 -0
- data/lib/capybara/rack_test/form.rb +68 -41
- data/lib/capybara/rack_test/node.rb +106 -39
- data/lib/capybara/rails.rb +1 -1
- data/lib/capybara/registration_container.rb +41 -0
- data/lib/capybara/registrations/drivers.rb +42 -0
- data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
- data/lib/capybara/registrations/servers.rb +66 -0
- data/lib/capybara/result.rb +75 -52
- data/lib/capybara/rspec/features.rb +7 -7
- data/lib/capybara/rspec/matcher_proxies.rb +39 -18
- data/lib/capybara/rspec/matchers/base.rb +113 -0
- data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
- data/lib/capybara/rspec/matchers/compound.rb +88 -0
- data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
- data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
- data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
- data/lib/capybara/rspec/matchers/have_selector.rb +69 -0
- data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
- data/lib/capybara/rspec/matchers/have_text.rb +33 -0
- data/lib/capybara/rspec/matchers/have_title.rb +29 -0
- data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
- data/lib/capybara/rspec/matchers/match_style.rb +43 -0
- data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
- data/lib/capybara/rspec/matchers.rb +141 -339
- data/lib/capybara/rspec.rb +2 -0
- data/lib/capybara/selector/builders/css_builder.rb +84 -0
- data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
- data/lib/capybara/selector/css.rb +27 -25
- data/lib/capybara/selector/definition/button.rb +68 -0
- data/lib/capybara/selector/definition/checkbox.rb +26 -0
- data/lib/capybara/selector/definition/css.rb +10 -0
- data/lib/capybara/selector/definition/datalist_input.rb +35 -0
- data/lib/capybara/selector/definition/datalist_option.rb +25 -0
- data/lib/capybara/selector/definition/element.rb +28 -0
- data/lib/capybara/selector/definition/field.rb +40 -0
- data/lib/capybara/selector/definition/fieldset.rb +14 -0
- data/lib/capybara/selector/definition/file_field.rb +13 -0
- data/lib/capybara/selector/definition/fillable_field.rb +33 -0
- data/lib/capybara/selector/definition/frame.rb +17 -0
- data/lib/capybara/selector/definition/id.rb +6 -0
- data/lib/capybara/selector/definition/label.rb +62 -0
- data/lib/capybara/selector/definition/link.rb +55 -0
- data/lib/capybara/selector/definition/link_or_button.rb +16 -0
- data/lib/capybara/selector/definition/option.rb +27 -0
- data/lib/capybara/selector/definition/radio_button.rb +27 -0
- data/lib/capybara/selector/definition/select.rb +81 -0
- data/lib/capybara/selector/definition/table.rb +109 -0
- data/lib/capybara/selector/definition/table_row.rb +21 -0
- data/lib/capybara/selector/definition/xpath.rb +5 -0
- data/lib/capybara/selector/definition.rb +280 -0
- data/lib/capybara/selector/filter.rb +1 -0
- data/lib/capybara/selector/filter_set.rb +73 -25
- data/lib/capybara/selector/filters/base.rb +24 -5
- data/lib/capybara/selector/filters/expression_filter.rb +3 -3
- data/lib/capybara/selector/filters/locator_filter.rb +29 -0
- data/lib/capybara/selector/filters/node_filter.rb +16 -2
- data/lib/capybara/selector/regexp_disassembler.rb +211 -0
- data/lib/capybara/selector/selector.rb +85 -348
- data/lib/capybara/selector/xpath_extensions.rb +17 -0
- data/lib/capybara/selector.rb +474 -447
- data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
- data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
- data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
- data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
- data/lib/capybara/selenium/driver.rb +255 -143
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +93 -11
- data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
- data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -0
- data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
- data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
- data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
- data/lib/capybara/selenium/extensions/find.rb +110 -0
- data/lib/capybara/selenium/extensions/html5_drag.rb +229 -0
- data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
- data/lib/capybara/selenium/extensions/scroll.rb +76 -0
- data/lib/capybara/selenium/node.rb +436 -134
- data/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
- data/lib/capybara/selenium/nodes/edge_node.rb +110 -0
- data/lib/capybara/selenium/nodes/firefox_node.rb +136 -0
- data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
- data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
- data/lib/capybara/selenium/patches/atoms.rb +18 -0
- data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
- data/lib/capybara/selenium/patches/logs.rb +45 -0
- data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
- data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
- data/lib/capybara/server/animation_disabler.rb +56 -19
- data/lib/capybara/server/checker.rb +9 -3
- data/lib/capybara/server/middleware.rb +28 -12
- data/lib/capybara/server.rb +33 -10
- data/lib/capybara/session/config.rb +34 -10
- data/lib/capybara/session/matchers.rb +23 -16
- data/lib/capybara/session.rb +230 -170
- data/lib/capybara/spec/public/jquery.js +5 -5
- data/lib/capybara/spec/public/offset.js +6 -0
- data/lib/capybara/spec/public/test.js +121 -8
- data/lib/capybara/spec/session/accept_alert_spec.rb +11 -11
- data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -3
- data/lib/capybara/spec/session/accept_prompt_spec.rb +9 -10
- data/lib/capybara/spec/session/active_element_spec.rb +31 -0
- data/lib/capybara/spec/session/all_spec.rb +127 -40
- data/lib/capybara/spec/session/ancestor_spec.rb +24 -19
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +67 -38
- data/lib/capybara/spec/session/assert_current_path_spec.rb +21 -18
- data/lib/capybara/spec/session/assert_selector_spec.rb +52 -58
- data/lib/capybara/spec/session/assert_style_spec.rb +7 -7
- data/lib/capybara/spec/session/assert_text_spec.rb +74 -50
- data/lib/capybara/spec/session/assert_title_spec.rb +12 -12
- data/lib/capybara/spec/session/attach_file_spec.rb +126 -72
- data/lib/capybara/spec/session/body_spec.rb +6 -6
- data/lib/capybara/spec/session/check_spec.rb +102 -47
- data/lib/capybara/spec/session/choose_spec.rb +58 -32
- data/lib/capybara/spec/session/click_button_spec.rb +219 -163
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -23
- data/lib/capybara/spec/session/click_link_spec.rb +77 -54
- data/lib/capybara/spec/session/current_scope_spec.rb +8 -8
- data/lib/capybara/spec/session/current_url_spec.rb +38 -29
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +2 -2
- data/lib/capybara/spec/session/element/assert_match_selector_spec.rb +8 -8
- data/lib/capybara/spec/session/element/match_css_spec.rb +16 -10
- data/lib/capybara/spec/session/element/match_xpath_spec.rb +6 -6
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +68 -56
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +7 -7
- data/lib/capybara/spec/session/evaluate_script_spec.rb +28 -8
- data/lib/capybara/spec/session/execute_script_spec.rb +8 -7
- data/lib/capybara/spec/session/fill_in_spec.rb +101 -46
- data/lib/capybara/spec/session/find_button_spec.rb +23 -23
- data/lib/capybara/spec/session/find_by_id_spec.rb +7 -7
- data/lib/capybara/spec/session/find_field_spec.rb +32 -30
- data/lib/capybara/spec/session/find_link_spec.rb +31 -21
- data/lib/capybara/spec/session/find_spec.rb +244 -141
- data/lib/capybara/spec/session/first_spec.rb +43 -43
- data/lib/capybara/spec/session/frame/frame_title_spec.rb +5 -5
- data/lib/capybara/spec/session/frame/frame_url_spec.rb +5 -5
- data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +30 -18
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +45 -18
- data/lib/capybara/spec/session/go_back_spec.rb +1 -1
- data/lib/capybara/spec/session/go_forward_spec.rb +1 -1
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +23 -23
- data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
- data/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
- data/lib/capybara/spec/session/has_button_spec.rb +94 -13
- data/lib/capybara/spec/session/has_css_spec.rb +272 -132
- data/lib/capybara/spec/session/has_current_path_spec.rb +50 -35
- data/lib/capybara/spec/session/has_element_spec.rb +47 -0
- data/lib/capybara/spec/session/has_field_spec.rb +137 -58
- data/lib/capybara/spec/session/has_link_spec.rb +44 -4
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +31 -31
- data/lib/capybara/spec/session/has_select_spec.rb +84 -50
- data/lib/capybara/spec/session/has_selector_spec.rb +111 -71
- data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
- data/lib/capybara/spec/session/has_table_spec.rb +181 -4
- data/lib/capybara/spec/session/has_text_spec.rb +101 -53
- data/lib/capybara/spec/session/has_title_spec.rb +19 -14
- data/lib/capybara/spec/session/has_xpath_spec.rb +56 -38
- data/lib/capybara/spec/session/headers_spec.rb +1 -1
- data/lib/capybara/spec/session/html_spec.rb +13 -6
- data/lib/capybara/spec/session/matches_style_spec.rb +37 -0
- data/lib/capybara/spec/session/node_spec.rb +894 -142
- data/lib/capybara/spec/session/node_wrapper_spec.rb +10 -7
- data/lib/capybara/spec/session/refresh_spec.rb +9 -7
- data/lib/capybara/spec/session/reset_session_spec.rb +63 -35
- data/lib/capybara/spec/session/response_code_spec.rb +1 -1
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +2 -2
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +2 -2
- data/lib/capybara/spec/session/save_page_spec.rb +37 -37
- data/lib/capybara/spec/session/save_screenshot_spec.rb +10 -10
- data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
- data/lib/capybara/spec/session/scroll_spec.rb +119 -0
- data/lib/capybara/spec/session/select_spec.rb +85 -85
- data/lib/capybara/spec/session/selectors_spec.rb +49 -18
- data/lib/capybara/spec/session/sibling_spec.rb +9 -9
- data/lib/capybara/spec/session/text_spec.rb +25 -24
- data/lib/capybara/spec/session/title_spec.rb +7 -6
- data/lib/capybara/spec/session/uncheck_spec.rb +33 -21
- data/lib/capybara/spec/session/unselect_spec.rb +37 -37
- data/lib/capybara/spec/session/visit_spec.rb +68 -49
- data/lib/capybara/spec/session/window/become_closed_spec.rb +20 -17
- data/lib/capybara/spec/session/window/current_window_spec.rb +1 -1
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +20 -16
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +6 -2
- data/lib/capybara/spec/session/window/window_spec.rb +62 -63
- data/lib/capybara/spec/session/window/windows_spec.rb +5 -1
- data/lib/capybara/spec/session/window/within_window_spec.rb +14 -14
- data/lib/capybara/spec/session/within_spec.rb +79 -42
- data/lib/capybara/spec/spec_helper.rb +41 -53
- data/lib/capybara/spec/test_app.rb +132 -43
- data/lib/capybara/spec/views/animated.erb +49 -0
- data/lib/capybara/spec/views/form.erb +139 -42
- data/lib/capybara/spec/views/frame_child.erb +4 -3
- data/lib/capybara/spec/views/frame_one.erb +2 -1
- data/lib/capybara/spec/views/frame_parent.erb +1 -1
- data/lib/capybara/spec/views/frame_two.erb +1 -1
- data/lib/capybara/spec/views/initial_alert.erb +2 -1
- data/lib/capybara/spec/views/layout.erb +10 -0
- data/lib/capybara/spec/views/obscured.erb +47 -0
- data/lib/capybara/spec/views/offset.erb +33 -0
- data/lib/capybara/spec/views/path.erb +2 -2
- data/lib/capybara/spec/views/popup_one.erb +1 -1
- data/lib/capybara/spec/views/popup_two.erb +1 -1
- data/lib/capybara/spec/views/react.erb +45 -0
- data/lib/capybara/spec/views/scroll.erb +21 -0
- data/lib/capybara/spec/views/spatial.erb +31 -0
- data/lib/capybara/spec/views/tables.erb +67 -0
- data/lib/capybara/spec/views/with_animation.erb +39 -4
- data/lib/capybara/spec/views/with_base_tag.erb +2 -2
- data/lib/capybara/spec/views/with_dragula.erb +24 -0
- data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
- data/lib/capybara/spec/views/with_hover.erb +3 -2
- data/lib/capybara/spec/views/with_hover1.erb +10 -0
- data/lib/capybara/spec/views/with_html.erb +37 -9
- data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
- data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
- data/lib/capybara/spec/views/with_js.erb +26 -5
- data/lib/capybara/spec/views/with_jstree.erb +26 -0
- data/lib/capybara/spec/views/with_namespace.erb +1 -0
- data/lib/capybara/spec/views/with_scope.erb +2 -2
- data/lib/capybara/spec/views/with_scope_other.erb +6 -0
- data/lib/capybara/spec/views/with_shadow.erb +31 -0
- data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
- data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
- data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
- data/lib/capybara/spec/views/with_windows.erb +1 -1
- data/lib/capybara/spec/views/within_frames.erb +1 -1
- data/lib/capybara/version.rb +1 -1
- data/lib/capybara/window.rb +19 -25
- data/lib/capybara.rb +126 -111
- data/spec/basic_node_spec.rb +59 -34
- data/spec/capybara_spec.rb +56 -44
- data/spec/counter_spec.rb +35 -0
- data/spec/css_builder_spec.rb +101 -0
- data/spec/css_splitter_spec.rb +8 -8
- data/spec/dsl_spec.rb +79 -52
- data/spec/filter_set_spec.rb +9 -9
- data/spec/fixtures/selenium_driver_rspec_failure.rb +4 -4
- data/spec/fixtures/selenium_driver_rspec_success.rb +4 -4
- data/spec/minitest_spec.rb +45 -7
- data/spec/minitest_spec_spec.rb +87 -64
- data/spec/per_session_config_spec.rb +6 -6
- data/spec/rack_test_spec.rb +172 -116
- data/spec/regexp_dissassembler_spec.rb +250 -0
- data/spec/result_spec.rb +80 -72
- data/spec/rspec/features_spec.rb +21 -16
- data/spec/rspec/scenarios_spec.rb +10 -6
- data/spec/rspec/shared_spec_matchers.rb +407 -365
- data/spec/rspec/views_spec.rb +3 -3
- data/spec/rspec_matchers_spec.rb +35 -10
- data/spec/rspec_spec.rb +63 -41
- data/spec/sauce_spec_chrome.rb +43 -0
- data/spec/selector_spec.rb +334 -89
- data/spec/selenium_spec_chrome.rb +176 -62
- data/spec/selenium_spec_chrome_remote.rb +54 -14
- data/spec/selenium_spec_edge.rb +41 -8
- data/spec/selenium_spec_firefox.rb +228 -0
- data/spec/selenium_spec_firefox_remote.rb +94 -0
- data/spec/selenium_spec_ie.rb +129 -11
- data/spec/selenium_spec_safari.rb +162 -0
- data/spec/server_spec.rb +171 -97
- data/spec/session_spec.rb +34 -18
- data/spec/shared_selenium_node.rb +79 -0
- data/spec/shared_selenium_session.rb +344 -80
- data/spec/spec_helper.rb +124 -2
- data/spec/whitespace_normalizer_spec.rb +54 -0
- data/spec/xpath_builder_spec.rb +93 -0
- metadata +326 -28
- data/lib/capybara/rspec/compound.rb +0 -94
- data/lib/capybara/selenium/driver_specializations/marionette_driver.rb +0 -31
- data/lib/capybara/selenium/nodes/marionette_node.rb +0 -31
- data/lib/capybara/spec/session/has_style_spec.rb +0 -25
- data/lib/capybara/spec/session/source_spec.rb +0 -0
- data/lib/capybara/spec/views/with_title.erb +0 -5
- data/spec/selenium_spec_marionette.rb +0 -167
|
@@ -6,9 +6,11 @@ require 'rack'
|
|
|
6
6
|
require 'yaml'
|
|
7
7
|
|
|
8
8
|
class TestApp < Sinatra::Base
|
|
9
|
-
class TestAppError <
|
|
10
|
-
|
|
9
|
+
class TestAppError < Exception; end # rubocop:disable Lint/InheritException
|
|
10
|
+
|
|
11
|
+
class TestAppOtherError < Exception # rubocop:disable Lint/InheritException
|
|
11
12
|
def initialize(string1, msg)
|
|
13
|
+
super()
|
|
12
14
|
@something = string1
|
|
13
15
|
@message = msg
|
|
14
16
|
end
|
|
@@ -18,7 +20,6 @@ class TestApp < Sinatra::Base
|
|
|
18
20
|
set :raise_errors, true
|
|
19
21
|
set :show_exceptions, false
|
|
20
22
|
|
|
21
|
-
@@form_post_count = 0
|
|
22
23
|
# Also check lib/capybara/spec/views/*.erb for pages not listed here
|
|
23
24
|
|
|
24
25
|
get '/' do
|
|
@@ -34,6 +35,10 @@ class TestApp < Sinatra::Base
|
|
|
34
35
|
redirect '/redirect_again'
|
|
35
36
|
end
|
|
36
37
|
|
|
38
|
+
get '/redirect_with_fragment' do
|
|
39
|
+
redirect '/landed#with_fragment'
|
|
40
|
+
end
|
|
41
|
+
|
|
37
42
|
get '/redirect_again' do
|
|
38
43
|
redirect '/landed'
|
|
39
44
|
end
|
|
@@ -48,8 +53,8 @@ class TestApp < Sinatra::Base
|
|
|
48
53
|
|
|
49
54
|
get '/referer_base' do
|
|
50
55
|
'<a href="/get_referer">direct link</a>' \
|
|
51
|
-
|
|
52
|
-
|
|
56
|
+
'<a href="/redirect_to_get_referer">link via redirect</a>' \
|
|
57
|
+
'<form action="/get_referer" method="get"><input type="submit"></form>'
|
|
53
58
|
end
|
|
54
59
|
|
|
55
60
|
get '/redirect_to_get_referer' do
|
|
@@ -57,7 +62,7 @@ class TestApp < Sinatra::Base
|
|
|
57
62
|
end
|
|
58
63
|
|
|
59
64
|
get '/get_referer' do
|
|
60
|
-
request.referer.nil? ?
|
|
65
|
+
request.referer.nil? ? 'No referer' : "Got referer: #{request.referer}"
|
|
61
66
|
end
|
|
62
67
|
|
|
63
68
|
get '/host' do
|
|
@@ -67,14 +72,14 @@ class TestApp < Sinatra::Base
|
|
|
67
72
|
get '/redirect/:times/times' do
|
|
68
73
|
times = params[:times].to_i
|
|
69
74
|
if times.zero?
|
|
70
|
-
|
|
75
|
+
'redirection complete'
|
|
71
76
|
else
|
|
72
77
|
redirect "/redirect/#{times - 1}/times"
|
|
73
78
|
end
|
|
74
79
|
end
|
|
75
80
|
|
|
76
81
|
get '/landed' do
|
|
77
|
-
|
|
82
|
+
'You landed'
|
|
78
83
|
end
|
|
79
84
|
|
|
80
85
|
post '/landed' do
|
|
@@ -86,11 +91,11 @@ class TestApp < Sinatra::Base
|
|
|
86
91
|
end
|
|
87
92
|
|
|
88
93
|
get '/form/get' do
|
|
89
|
-
|
|
94
|
+
%(<pre id="results">#{params[:form].to_yaml}</pre>)
|
|
90
95
|
end
|
|
91
96
|
|
|
92
97
|
post '/relative' do
|
|
93
|
-
|
|
98
|
+
%(<pre id="results">#{params[:form].to_yaml}</pre>)
|
|
94
99
|
end
|
|
95
100
|
|
|
96
101
|
get '/favicon.ico' do
|
|
@@ -101,12 +106,12 @@ class TestApp < Sinatra::Base
|
|
|
101
106
|
redirect '/redirect_again'
|
|
102
107
|
end
|
|
103
108
|
|
|
104
|
-
delete
|
|
105
|
-
|
|
109
|
+
delete '/delete' do
|
|
110
|
+
'The requested object was deleted'
|
|
106
111
|
end
|
|
107
112
|
|
|
108
|
-
get
|
|
109
|
-
|
|
113
|
+
get '/delete' do
|
|
114
|
+
'Not deleted'
|
|
110
115
|
end
|
|
111
116
|
|
|
112
117
|
get '/redirect_back' do
|
|
@@ -141,11 +146,11 @@ class TestApp < Sinatra::Base
|
|
|
141
146
|
end
|
|
142
147
|
|
|
143
148
|
get '/error' do
|
|
144
|
-
raise TestAppError,
|
|
149
|
+
raise TestAppError, 'some error'
|
|
145
150
|
end
|
|
146
151
|
|
|
147
152
|
get '/other_error' do
|
|
148
|
-
raise TestAppOtherError.new(
|
|
153
|
+
raise TestAppOtherError.new('something', 'other error')
|
|
149
154
|
end
|
|
150
155
|
|
|
151
156
|
get '/load_error' do
|
|
@@ -158,59 +163,143 @@ class TestApp < Sinatra::Base
|
|
|
158
163
|
|
|
159
164
|
get '/with_title' do
|
|
160
165
|
<<-HTML
|
|
161
|
-
|
|
162
|
-
<
|
|
163
|
-
<
|
|
164
|
-
|
|
166
|
+
<!DOCTYPE html>
|
|
167
|
+
<html lang="en">
|
|
168
|
+
<head>
|
|
169
|
+
<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
|
|
170
|
+
<title>#{params[:title] || 'Test Title'}</title>
|
|
171
|
+
</head>
|
|
172
|
+
|
|
173
|
+
<body>
|
|
174
|
+
<svg><title>abcdefg</title></svg>
|
|
175
|
+
</body>
|
|
176
|
+
</html>
|
|
177
|
+
HTML
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
get '/with_iframe' do
|
|
181
|
+
<<-HTML
|
|
182
|
+
<!DOCTYPE html>
|
|
183
|
+
<html lang="en">
|
|
184
|
+
<head>
|
|
185
|
+
<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
|
|
186
|
+
<title>Test with Iframe</title>
|
|
187
|
+
</head>
|
|
188
|
+
|
|
189
|
+
<body>
|
|
190
|
+
<iframe src="#{params[:url]}" id="#{params[:id]}"></iframe>
|
|
191
|
+
</body>
|
|
192
|
+
</html>
|
|
193
|
+
HTML
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
get '/base/with_base' do
|
|
197
|
+
<<-HTML
|
|
198
|
+
<!DOCTYPE html>
|
|
199
|
+
<html>
|
|
200
|
+
<head>
|
|
201
|
+
<base href="/">
|
|
202
|
+
<title>Origin</title>
|
|
203
|
+
</head>
|
|
204
|
+
<body>
|
|
205
|
+
<a href="with_title">Title page</a>
|
|
206
|
+
<a href="?a=3">Bare query</a>
|
|
207
|
+
</body>
|
|
208
|
+
</html>
|
|
209
|
+
HTML
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
get '/base/with_other_base' do
|
|
213
|
+
<<-HTML
|
|
214
|
+
<!DOCTYPE html>
|
|
215
|
+
<html>
|
|
216
|
+
<head>
|
|
217
|
+
<base href="/base/">
|
|
218
|
+
<title>Origin</title>
|
|
219
|
+
</head>
|
|
220
|
+
<body>
|
|
221
|
+
<a href="with_title">Title page</a>
|
|
222
|
+
<a href="?a=3">Bare query</a>
|
|
223
|
+
</body>
|
|
224
|
+
</html>
|
|
225
|
+
HTML
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
get '/csp' do
|
|
229
|
+
response.headers['Content-Security-Policy'] = "default-src 'none'; connect-src 'self'; base-uri 'none'; font-src 'self'; img-src 'self' data:; object-src 'none'; script-src 'self' 'nonce-jAviMuMisoTisVXjgLoWdA=='; style-src 'self' 'nonce-jAviMuMisoTisVXjgLoWdA=='; form-action 'self';"
|
|
230
|
+
<<-HTML
|
|
231
|
+
<!DOCTYPE html>
|
|
232
|
+
<html lang="en">
|
|
233
|
+
<head>
|
|
234
|
+
<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
|
|
235
|
+
<title>CSP</title>
|
|
236
|
+
</head>
|
|
237
|
+
|
|
238
|
+
<body>
|
|
239
|
+
<div>CSP</div>
|
|
240
|
+
</body>
|
|
241
|
+
</html>
|
|
165
242
|
HTML
|
|
166
243
|
end
|
|
167
244
|
|
|
168
245
|
get '/download.csv' do
|
|
169
|
-
content_type
|
|
246
|
+
content_type 'text/csv'
|
|
170
247
|
'This, is, comma, separated' \
|
|
171
|
-
|
|
248
|
+
'Thomas, Walpole, was , here'
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
get %r{/apple-touch-.*\.png/} do
|
|
252
|
+
halt(404)
|
|
172
253
|
end
|
|
173
254
|
|
|
174
255
|
get '/:view' do |view|
|
|
175
|
-
|
|
256
|
+
view_template = "#{__dir__}/views/#{view}.erb"
|
|
257
|
+
has_layout = File.exist?(view_template) && File.open(view_template) { |f| f.first.downcase.include?('doctype') }
|
|
258
|
+
erb view.to_sym, locals: { referrer: request.referrer }, layout: !has_layout
|
|
176
259
|
end
|
|
177
260
|
|
|
178
261
|
post '/form' do
|
|
179
|
-
|
|
180
|
-
|
|
262
|
+
self.class.form_post_count += 1
|
|
263
|
+
%(
|
|
264
|
+
<pre id="content_type">#{request.content_type}</pre>
|
|
265
|
+
<pre id="results">#{params.fetch(:form, {}).merge('post_count' => self.class.form_post_count).to_yaml}</pre>
|
|
266
|
+
)
|
|
181
267
|
end
|
|
182
268
|
|
|
183
269
|
post '/upload_empty' do
|
|
184
270
|
if params[:form][:file].nil?
|
|
185
|
-
|
|
271
|
+
"Successfully ignored empty file field. Content type was #{request.content_type}"
|
|
186
272
|
else
|
|
187
273
|
'Something went wrong.'
|
|
188
274
|
end
|
|
189
275
|
end
|
|
190
276
|
|
|
191
277
|
post '/upload' do
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
'No file uploaded'
|
|
199
|
-
end
|
|
278
|
+
buffer = []
|
|
279
|
+
buffer << "Content-type: #{params.dig(:form, :document, :type)}"
|
|
280
|
+
buffer << "File content: #{params.dig(:form, :document, :tempfile).read}"
|
|
281
|
+
buffer.join(' | ')
|
|
282
|
+
rescue StandardError
|
|
283
|
+
'No file uploaded'
|
|
200
284
|
end
|
|
201
285
|
|
|
202
286
|
post '/upload_multiple' do
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
end
|
|
209
|
-
buffer.join(' | ')
|
|
210
|
-
rescue
|
|
211
|
-
'No files uploaded'
|
|
287
|
+
docs = params.dig(:form, :multiple_documents)
|
|
288
|
+
buffer = [docs.size.to_s]
|
|
289
|
+
docs.each do |doc|
|
|
290
|
+
buffer << "Content-type: #{doc[:type]}"
|
|
291
|
+
buffer << "File content: #{doc[:tempfile].read}"
|
|
212
292
|
end
|
|
293
|
+
buffer.join(' | ')
|
|
294
|
+
rescue StandardError
|
|
295
|
+
'No files uploaded'
|
|
213
296
|
end
|
|
297
|
+
|
|
298
|
+
class << self
|
|
299
|
+
attr_accessor :form_post_count
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
@form_post_count = 0
|
|
214
303
|
end
|
|
215
304
|
|
|
216
305
|
Rack::Handler::Puma.run TestApp, Port: 8070 if $PROGRAM_NAME == __FILE__
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
|
|
5
|
+
<title>with_animation</title>
|
|
6
|
+
<script src="/jquery.js" type="text/javascript" charset="utf-8"></script>
|
|
7
|
+
<script>
|
|
8
|
+
$(document).on('contextmenu', function(e){ e.preventDefault(); });
|
|
9
|
+
</script>
|
|
10
|
+
<style>
|
|
11
|
+
div {
|
|
12
|
+
width: 400px;
|
|
13
|
+
height: 400px;
|
|
14
|
+
position: absolute;
|
|
15
|
+
}
|
|
16
|
+
#obscured {
|
|
17
|
+
z-index: 1;
|
|
18
|
+
background-color: red;
|
|
19
|
+
}
|
|
20
|
+
#cover {
|
|
21
|
+
z-index: 2;
|
|
22
|
+
background-color: blue;
|
|
23
|
+
}
|
|
24
|
+
#offscreen {
|
|
25
|
+
top: 2000px;
|
|
26
|
+
left: 2000px;
|
|
27
|
+
background-color: green;
|
|
28
|
+
}
|
|
29
|
+
#offscreen_wrapper {
|
|
30
|
+
top: 2000px;
|
|
31
|
+
left: 2000px;
|
|
32
|
+
overflow-x: scroll;
|
|
33
|
+
background-color: yellow;
|
|
34
|
+
}
|
|
35
|
+
</style>
|
|
36
|
+
</head>
|
|
37
|
+
|
|
38
|
+
<body id="with_animation">
|
|
39
|
+
<div id="obscured">
|
|
40
|
+
<input id="obscured_input"/>
|
|
41
|
+
</div>
|
|
42
|
+
<div id="cover"></div>
|
|
43
|
+
<div id="offscreen_wrapper">
|
|
44
|
+
<div id="offscreen"></div>
|
|
45
|
+
</div>
|
|
46
|
+
</body>
|
|
47
|
+
|
|
48
|
+
<iframe id="frameOne" src="/frame_one"></iframe>
|
|
49
|
+
</html>
|
|
@@ -1,17 +1,23 @@
|
|
|
1
|
-
|
|
2
1
|
<h1>Form</h1>
|
|
3
2
|
|
|
4
|
-
<
|
|
3
|
+
<button type="button" tabindex="1">A Button</button>
|
|
4
|
+
|
|
5
|
+
<label>
|
|
6
|
+
An Input
|
|
7
|
+
<input type="text" tabindex="2">
|
|
8
|
+
</label>
|
|
9
|
+
|
|
10
|
+
<form action="/form" method="post" novalidate>
|
|
5
11
|
|
|
6
12
|
<p>
|
|
7
13
|
<label for="form_title">Title</label>
|
|
8
|
-
<select name="form[title]" id="form_title" class="title">
|
|
14
|
+
<select name="form[title]" id="form_title" class="title" tabindex="3">
|
|
9
15
|
<option class="title">Mrs</option>
|
|
10
16
|
<option class="title">Mr</option>
|
|
11
17
|
<option>Miss</option>
|
|
12
18
|
<option disabled="disabled">Other</option>
|
|
13
19
|
</select>
|
|
14
|
-
|
|
20
|
+
</p>
|
|
15
21
|
|
|
16
22
|
<p>
|
|
17
23
|
<label for="customer_name">Customer Name
|
|
@@ -25,6 +31,12 @@
|
|
|
25
31
|
</label>
|
|
26
32
|
</p>
|
|
27
33
|
|
|
34
|
+
<p>
|
|
35
|
+
<label for="customer_other_email">Customer Other Email
|
|
36
|
+
<input type="text" name="form[customer_other_email]" value="notben@notben.com" id="customer_other_email"/>
|
|
37
|
+
</label>
|
|
38
|
+
</p>
|
|
39
|
+
|
|
28
40
|
<p>
|
|
29
41
|
<label for="form_other_title">Other title</label>
|
|
30
42
|
<select name="form[other_title]" id="form_other_title">
|
|
@@ -56,6 +68,11 @@
|
|
|
56
68
|
<input type="text" name="form[name]" value="John Smith" id="form_name"/>
|
|
57
69
|
</p>
|
|
58
70
|
|
|
71
|
+
<p>
|
|
72
|
+
<label for="form_age">Age</label>
|
|
73
|
+
<input type="range" name="form[age]" value="18" min="13" max="100" step="0.5" id="form_age"/>
|
|
74
|
+
</p>
|
|
75
|
+
|
|
59
76
|
<p>
|
|
60
77
|
<label for="form_schmooo">Schmooo</label>
|
|
61
78
|
<input type="schmooo" name="form[schmooo]" value="This is Schmooo!" id="form_schmooo"/>
|
|
@@ -88,6 +105,11 @@
|
|
|
88
105
|
<input type="file" name="form[image]" id="form_image"/>
|
|
89
106
|
</p>
|
|
90
107
|
|
|
108
|
+
<p>
|
|
109
|
+
<label for="form_hidden_image">Hidden Image</label>
|
|
110
|
+
<input type="file" name="form[hidden_image]" id="form_hidden_image" style="display: none"/>
|
|
111
|
+
</p>
|
|
112
|
+
|
|
91
113
|
<p>
|
|
92
114
|
<input type="hidden" name="form[token]" value="12345" id="form_token"/>
|
|
93
115
|
</p>
|
|
@@ -97,7 +119,7 @@
|
|
|
97
119
|
<select name="form[locale]" id="form_locale">
|
|
98
120
|
<option value="sv">Swedish</option>
|
|
99
121
|
<option selected="selected" value="en">English</option>
|
|
100
|
-
<option value="fi">
|
|
122
|
+
<option value="fi">Finnish</option>
|
|
101
123
|
<option value="no">Norwegian</option>
|
|
102
124
|
<option value="jo">John's made-up language</option>
|
|
103
125
|
<option value="jbo"> Lojban </option>
|
|
@@ -124,7 +146,11 @@
|
|
|
124
146
|
|
|
125
147
|
<p>
|
|
126
148
|
<label for="form_zipcode">Zipcode</label>
|
|
127
|
-
<input type="text" maxlength="5" name="form[zipcode]" id="form_zipcode" />
|
|
149
|
+
<input type="text" maxlength="5" name="form[zipcode]" id="form_zipcode" pattern="[0-9]{5,9}" />
|
|
150
|
+
</p>
|
|
151
|
+
|
|
152
|
+
<p>
|
|
153
|
+
<input maxlength="35" id="long_length" />
|
|
128
154
|
</p>
|
|
129
155
|
|
|
130
156
|
<p>
|
|
@@ -150,7 +176,7 @@ New line after and before textarea tag
|
|
|
150
176
|
<label for="gender_male">Male</label>
|
|
151
177
|
<input type="radio" name="form[gender]" value="female" id="gender_female" checked="checked"/>
|
|
152
178
|
<label for="gender_female">Female</label>
|
|
153
|
-
<input type="radio" name="form[gender]" value="both" id="gender_both"/>
|
|
179
|
+
<input type="radio" name="form[gender]" value="both" id="gender_both" readonly="readonly"/>
|
|
154
180
|
<label for="gender_both">Both</label>
|
|
155
181
|
</p>
|
|
156
182
|
|
|
@@ -185,6 +211,12 @@ New line after and before textarea tag
|
|
|
185
211
|
<label for="form_cars_ferrari">Ferrari</label>
|
|
186
212
|
<input type="checkbox" value="pagani" name="form[cars][]" id="form_cars_pagani" style="position: absolute; left: -9999px"/>
|
|
187
213
|
<label for="form_cars_pagani">Pagani</label>
|
|
214
|
+
<div style="position: relative;">
|
|
215
|
+
<input type="checkbox" value="bugatti" name="form[cars][]" id="form_cars_bugatti"/>
|
|
216
|
+
<div style="position: absolute; top: 0; right: 0; bottom: 0; left: 0; background-color: #fff;">
|
|
217
|
+
<label for="form_cars_bugatti">Bugatti</label>
|
|
218
|
+
</div>
|
|
219
|
+
</div>
|
|
188
220
|
<input type="checkbox" value="ariel" name="form[cars][]" id="form_cars_ariel" style="display: none"/>
|
|
189
221
|
<input type="checkbox" value="porsche" name="form[cars][]" id="form_cars_porsche" checked="checked" style="display: none"/>
|
|
190
222
|
<label>
|
|
@@ -195,6 +227,10 @@ New line after and before textarea tag
|
|
|
195
227
|
Koenigsegg
|
|
196
228
|
<input type="checkbox" value="koenigsegg" name="form[cars][]" id="form_cars_koenigsegg" checked="checked" style="display: none"/>
|
|
197
229
|
</label>
|
|
230
|
+
<input type="checkbox" value="maserati" name="form[cars][]" id="form_cars_maserati" disabled="disabled"/>
|
|
231
|
+
<label for="form_cars_maserati">Maserati</label>
|
|
232
|
+
<input type="checkbox" value="lotus" name="form[cars][]" id="form_cars_lotus" style="display: none"/>
|
|
233
|
+
<label for="form_cars_lotus"><a href="#" onclick="return false;">Link here</a>Lotus</label>
|
|
198
234
|
</p>
|
|
199
235
|
|
|
200
236
|
<p>
|
|
@@ -370,7 +406,6 @@ New line after and before textarea tag
|
|
|
370
406
|
</label>
|
|
371
407
|
</p>
|
|
372
408
|
|
|
373
|
-
|
|
374
409
|
<p>
|
|
375
410
|
<label for="form_disabled_file">
|
|
376
411
|
Disabled File
|
|
@@ -378,41 +413,38 @@ New line after and before textarea tag
|
|
|
378
413
|
</label>
|
|
379
414
|
</p>
|
|
380
415
|
|
|
381
|
-
<
|
|
382
|
-
<
|
|
383
|
-
|
|
384
|
-
</fieldset>
|
|
385
|
-
</p>
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
<p>
|
|
389
|
-
<fieldset disabled="disabled">
|
|
390
|
-
<legend>Disabled Child</legend>
|
|
391
|
-
<input name="form[disabled_fieldset_child]" id="form_disabled_fieldset_child"/>
|
|
392
|
-
<select>
|
|
393
|
-
<option>Disabled Child Option</option>
|
|
394
|
-
</select>
|
|
395
|
-
</fieldset>
|
|
416
|
+
<fieldset>
|
|
417
|
+
<input name="form[enabled_fieldset_child]" id="form_enabled_fieldset_child"/>
|
|
418
|
+
</fieldset>
|
|
396
419
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
</
|
|
420
|
+
<fieldset disabled="disabled" id="form_disabled_fieldset">
|
|
421
|
+
<legend>Disabled Child</legend>
|
|
422
|
+
<input name="form[disabled_fieldset_child]" id="form_disabled_fieldset_child"/>
|
|
423
|
+
<select>
|
|
424
|
+
<option>Disabled Child Option</option>
|
|
425
|
+
</select>
|
|
426
|
+
</fieldset>
|
|
427
|
+
|
|
428
|
+
<fieldset disabled="disabled">
|
|
429
|
+
<legend>
|
|
430
|
+
Nested Disabled
|
|
431
|
+
<input type="checkbox" name="form[disabled_fieldeset_legend_child]" id="form_disabled_fieldset_legend_child"/>
|
|
432
|
+
</legend>
|
|
433
|
+
<legend>
|
|
434
|
+
Another WLegend
|
|
435
|
+
<input type="checkbox" name="form[disabled_fieldeset_second_legend_child]" id="form_disabled_fieldset_second_legend_child"/>
|
|
436
|
+
</legend>
|
|
437
|
+
<fieldset>
|
|
402
438
|
<legend>
|
|
403
|
-
|
|
404
|
-
<input
|
|
439
|
+
Disabled?
|
|
440
|
+
<input id="form_disabled_fieldset_descendant_legend_child">
|
|
405
441
|
</legend>
|
|
406
|
-
<
|
|
407
|
-
<fieldset>
|
|
408
|
-
<input name="form[disabled_fieldset_descendant]" id="form_disabled_fieldset_descendant"/>
|
|
409
|
-
</fieldset>
|
|
410
|
-
</p>
|
|
442
|
+
<input name="form[disabled_fieldset_descendant]" id="form_disabled_fieldset_descendant"/>
|
|
411
443
|
</fieldset>
|
|
412
|
-
</
|
|
444
|
+
</fieldset>
|
|
413
445
|
|
|
414
446
|
<p>
|
|
415
|
-
<select>
|
|
447
|
+
<select data-test-id="my_test_id">
|
|
416
448
|
<optgroup label="Level One">
|
|
417
449
|
<option> A.1 </option>
|
|
418
450
|
</optgroup>
|
|
@@ -424,15 +456,26 @@ New line after and before textarea tag
|
|
|
424
456
|
</p>
|
|
425
457
|
|
|
426
458
|
<p>
|
|
427
|
-
<input type="button" name="form[fresh]" id="fresh_btn" value="i am fresh"/>
|
|
428
|
-
<input type="submit" name="form[awesome]" id="awe123" title="What an Awesome Button" value="awesome"/>
|
|
459
|
+
<input type="button" aria-label="Aria button" name="form[fresh]" id="fresh_btn" value="i am fresh"/>
|
|
460
|
+
<input type="submit" name="form[awesome]" id="awe123" data-test-id="test_id_button" title="What an Awesome Button" value="awesome"/>
|
|
429
461
|
<input type="submit" name="form[crappy]" id="crap321" value="crappy"/>
|
|
430
462
|
<input type="image" name="form[okay]" id="okay556" title="Okay 556 Image" value="okay" alt="oh hai thar"/>
|
|
431
463
|
<button type="submit" id="click_me_123" title="Click Title button" value="click_me">Click me!</button>
|
|
432
464
|
<button type="submit" name="form[no_value]">No Value!</button>
|
|
433
465
|
<button id="no_type">No Type!</button>
|
|
434
466
|
<button><img alt="A horse eating hay"/></button>
|
|
467
|
+
<button id="button_with_label"></button>
|
|
468
|
+
<label for="button_with_label">button with label element</label>
|
|
469
|
+
<label>
|
|
470
|
+
button within label element
|
|
471
|
+
<button></button>
|
|
472
|
+
</label>
|
|
473
|
+
<label>
|
|
474
|
+
role=button within label element
|
|
475
|
+
<span role="button">with other text</span>
|
|
476
|
+
</label>
|
|
435
477
|
<input type="button" disabled="disabled" value="Disabled button"/>
|
|
478
|
+
<span role="button">ARIA button</span>
|
|
436
479
|
</p>
|
|
437
480
|
|
|
438
481
|
<p>
|
|
@@ -445,6 +488,11 @@ New line after and before textarea tag
|
|
|
445
488
|
<input id="readonly" name="form[readonly_test]" readonly/>
|
|
446
489
|
<input id="not_readonly" name="form[readonly_test]" />
|
|
447
490
|
</p>
|
|
491
|
+
|
|
492
|
+
<p>
|
|
493
|
+
<input id="required" name="form[required]" required />
|
|
494
|
+
<input id="length" name="form[length]" minlength="4" maxlength="4" />
|
|
495
|
+
</p>
|
|
448
496
|
</form>
|
|
449
497
|
|
|
450
498
|
<input type="text" name="form[outside_input]" value="outside_input" form="form1"/>
|
|
@@ -454,14 +502,21 @@ New line after and before textarea tag
|
|
|
454
502
|
<input type="text" name="nested_label" id="nested_label"/>
|
|
455
503
|
</label>
|
|
456
504
|
|
|
505
|
+
<label id="wrapper_label">
|
|
506
|
+
Wrapper Label
|
|
507
|
+
<input type="checkbox"/>
|
|
508
|
+
</label>
|
|
509
|
+
|
|
457
510
|
<form id="form1" action="/form" method="post">
|
|
458
511
|
<input type="text" name="form[which_form]" value="form1" id="form_which_form"/>
|
|
459
512
|
<input type="text" name="form[for_form2]" value="for_form2" form="form2"/>
|
|
460
513
|
<input type="submit" name="form[submit_form1]" value="submit_form1" id="submit_form1"/>
|
|
461
514
|
</form>
|
|
462
515
|
|
|
516
|
+
<button type="submit" name="form[outside_button]" value="outside_button" form="form2">Outside!</button>
|
|
517
|
+
|
|
463
518
|
<form id="form2" action="/form" method="post">
|
|
464
|
-
<input type="text" name="form[which_form]" value="form2" id="
|
|
519
|
+
<input type="text" name="form[which_form]" value="form2" id="form_which_form2"/>
|
|
465
520
|
<input type="submit" name="form[unused]" value="unused"/>
|
|
466
521
|
<button type="submit" name="form[other_form_button]" value="other_form_button" form="form1">Form1</button>
|
|
467
522
|
</form>
|
|
@@ -476,8 +531,6 @@ New line after and before textarea tag
|
|
|
476
531
|
</select>
|
|
477
532
|
|
|
478
533
|
<input type="submit" name="form[outside_submit]" value="outside_submit" form="form1"/>
|
|
479
|
-
<button type="submit" name="form[outside_button]" value="outside_button" form="form2">Outside!</button>
|
|
480
|
-
|
|
481
534
|
|
|
482
535
|
<form id="get-form" action="/form/get?foo=bar" method="get">
|
|
483
536
|
<p>
|
|
@@ -487,6 +540,7 @@ New line after and before textarea tag
|
|
|
487
540
|
|
|
488
541
|
<p>
|
|
489
542
|
<input type="submit" name="form[mediocre]" id="mediocre" value="med" aria-label="Mediocre Button"/>
|
|
543
|
+
<input type="submit" formaction="/form/get?bar=foo" id="mediocre2" value="med2"/>
|
|
490
544
|
<p>
|
|
491
545
|
</form>
|
|
492
546
|
|
|
@@ -532,6 +586,19 @@ New line after and before textarea tag
|
|
|
532
586
|
<p>
|
|
533
587
|
</form>
|
|
534
588
|
|
|
589
|
+
<form action="/form" method="post" enctype="multipart/form-data">
|
|
590
|
+
<input type="hidden" name="form[document2]" value="hidden_field"/>
|
|
591
|
+
|
|
592
|
+
<p>
|
|
593
|
+
<label for="form_document">Document with hidden</label>
|
|
594
|
+
<input type="file" name="form[document2]" id="form_document2"/>
|
|
595
|
+
</p>
|
|
596
|
+
|
|
597
|
+
<p>
|
|
598
|
+
<input type="submit" value="Upload Empty With Hidden"/>
|
|
599
|
+
<p>
|
|
600
|
+
</form>
|
|
601
|
+
|
|
535
602
|
<form action="/upload_multiple" method="post" enctype="multipart/form-data">
|
|
536
603
|
<p>
|
|
537
604
|
<label for="form_multiple_file_name">File Name</label>
|
|
@@ -543,6 +610,11 @@ New line after and before textarea tag
|
|
|
543
610
|
<input type="file" name="form[multiple_documents][]" id="form_multiple_documents" multiple="multiple" />
|
|
544
611
|
</p>
|
|
545
612
|
|
|
613
|
+
<p>
|
|
614
|
+
<label for="form_directory_upload">Directory Upload</label>
|
|
615
|
+
<input type="file" name="form[multiple_documents][]" id="form_directory_upload" multiple="multiple" webkitdirectory="webkitdirectory" mozdirectory="mozdirectory" />
|
|
616
|
+
</p>
|
|
617
|
+
|
|
546
618
|
<p>
|
|
547
619
|
<input type="submit" value="Upload Multiple"/>
|
|
548
620
|
<p>
|
|
@@ -623,6 +695,15 @@ New line after and before textarea tag
|
|
|
623
695
|
</p>
|
|
624
696
|
</form>
|
|
625
697
|
|
|
698
|
+
<form id="single_input_form" action="/form" method="post">
|
|
699
|
+
<input type="text" name="form[single_input]" id="single_input"/>
|
|
700
|
+
</form>
|
|
701
|
+
|
|
702
|
+
<form id="two_input_form" action="/form" method="post">
|
|
703
|
+
<input type="text" name="form[two_input_1]" id="two_input_1"/>
|
|
704
|
+
<input type="text" name="form[two_input_2]" id="two_input_2"/>
|
|
705
|
+
</form>
|
|
706
|
+
|
|
626
707
|
<label>Confusion
|
|
627
708
|
<input type="checkbox" id="confusion_checkbox" class="confusion-checkbox confusion"/>
|
|
628
709
|
</label>
|
|
@@ -639,3 +720,19 @@ New line after and before textarea tag
|
|
|
639
720
|
<label for="asterisk_input">With Asterisk<abbr title="required">*</abbr></label>
|
|
640
721
|
<input id="asterisk_input" type="number"value="2016"/>
|
|
641
722
|
</p>
|
|
723
|
+
|
|
724
|
+
<p>
|
|
725
|
+
<input id="special" {custom}="abcdef" value="custom attribute"/>
|
|
726
|
+
</p>
|
|
727
|
+
|
|
728
|
+
|
|
729
|
+
<label for="multi_label_checkbox">
|
|
730
|
+
Label to click
|
|
731
|
+
</label>
|
|
732
|
+
<div>Something random that justifies the usage of a separate label</div>
|
|
733
|
+
<label>
|
|
734
|
+
<div>
|
|
735
|
+
<input type="checkbox" id="multi_label_checkbox" style="display: none"/>
|
|
736
|
+
<div>Visual representation of the checkbox</div>
|
|
737
|
+
</div>
|
|
738
|
+
</label>
|