capybara 2.15.1 → 3.36.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (311) hide show
  1. checksums.yaml +5 -5
  2. data/.yardopts +1 -1
  3. data/History.md +902 -10
  4. data/License.txt +1 -1
  5. data/README.md +103 -75
  6. data/lib/capybara/config.rb +29 -56
  7. data/lib/capybara/cucumber.rb +2 -3
  8. data/lib/capybara/driver/base.rb +39 -18
  9. data/lib/capybara/driver/node.rb +36 -10
  10. data/lib/capybara/dsl.rb +15 -6
  11. data/lib/capybara/helpers.rb +65 -30
  12. data/lib/capybara/minitest/spec.rb +173 -81
  13. data/lib/capybara/minitest.rb +220 -111
  14. data/lib/capybara/node/actions.rb +274 -171
  15. data/lib/capybara/node/base.rb +41 -34
  16. data/lib/capybara/node/document.rb +15 -3
  17. data/lib/capybara/node/document_matchers.rb +19 -21
  18. data/lib/capybara/node/element.rb +353 -137
  19. data/lib/capybara/node/finders.rb +144 -138
  20. data/lib/capybara/node/matchers.rb +369 -209
  21. data/lib/capybara/node/simple.rb +59 -26
  22. data/lib/capybara/queries/active_element_query.rb +18 -0
  23. data/lib/capybara/queries/ancestor_query.rb +13 -10
  24. data/lib/capybara/queries/base_query.rb +39 -28
  25. data/lib/capybara/queries/current_path_query.rb +22 -25
  26. data/lib/capybara/queries/match_query.rb +14 -7
  27. data/lib/capybara/queries/selector_query.rb +646 -145
  28. data/lib/capybara/queries/sibling_query.rb +12 -10
  29. data/lib/capybara/queries/style_query.rb +45 -0
  30. data/lib/capybara/queries/text_query.rb +56 -38
  31. data/lib/capybara/queries/title_query.rb +8 -11
  32. data/lib/capybara/rack_test/browser.rb +57 -41
  33. data/lib/capybara/rack_test/css_handlers.rb +6 -4
  34. data/lib/capybara/rack_test/driver.rb +18 -13
  35. data/lib/capybara/rack_test/errors.rb +6 -0
  36. data/lib/capybara/rack_test/form.rb +73 -58
  37. data/lib/capybara/rack_test/node.rb +188 -81
  38. data/lib/capybara/rails.rb +3 -7
  39. data/lib/capybara/registration_container.rb +44 -0
  40. data/lib/capybara/registrations/drivers.rb +42 -0
  41. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  42. data/lib/capybara/registrations/servers.rb +45 -0
  43. data/lib/capybara/result.rb +96 -62
  44. data/lib/capybara/rspec/features.rb +17 -50
  45. data/lib/capybara/rspec/matcher_proxies.rb +52 -15
  46. data/lib/capybara/rspec/matchers/base.rb +111 -0
  47. data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  48. data/lib/capybara/rspec/matchers/compound.rb +88 -0
  49. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  50. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  51. data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  52. data/lib/capybara/rspec/matchers/have_selector.rb +77 -0
  53. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  54. data/lib/capybara/rspec/matchers/have_text.rb +33 -0
  55. data/lib/capybara/rspec/matchers/have_title.rb +29 -0
  56. data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  57. data/lib/capybara/rspec/matchers/match_style.rb +43 -0
  58. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  59. data/lib/capybara/rspec/matchers.rb +144 -264
  60. data/lib/capybara/rspec.rb +7 -11
  61. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  62. data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  63. data/lib/capybara/selector/css.rb +89 -17
  64. data/lib/capybara/selector/definition/button.rb +68 -0
  65. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  66. data/lib/capybara/selector/definition/css.rb +10 -0
  67. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  68. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  69. data/lib/capybara/selector/definition/element.rb +28 -0
  70. data/lib/capybara/selector/definition/field.rb +40 -0
  71. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  72. data/lib/capybara/selector/definition/file_field.rb +13 -0
  73. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  74. data/lib/capybara/selector/definition/frame.rb +17 -0
  75. data/lib/capybara/selector/definition/id.rb +6 -0
  76. data/lib/capybara/selector/definition/label.rb +62 -0
  77. data/lib/capybara/selector/definition/link.rb +54 -0
  78. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  79. data/lib/capybara/selector/definition/option.rb +27 -0
  80. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  81. data/lib/capybara/selector/definition/select.rb +81 -0
  82. data/lib/capybara/selector/definition/table.rb +109 -0
  83. data/lib/capybara/selector/definition/table_row.rb +21 -0
  84. data/lib/capybara/selector/definition/xpath.rb +5 -0
  85. data/lib/capybara/selector/definition.rb +279 -0
  86. data/lib/capybara/selector/filter.rb +2 -17
  87. data/lib/capybara/selector/filter_set.rb +81 -33
  88. data/lib/capybara/selector/filters/base.rb +50 -6
  89. data/lib/capybara/selector/filters/expression_filter.rb +8 -26
  90. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/lib/capybara/selector/filters/node_filter.rb +16 -12
  92. data/lib/capybara/selector/regexp_disassembler.rb +214 -0
  93. data/lib/capybara/selector/selector.rb +89 -210
  94. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  95. data/lib/capybara/selector.rb +227 -526
  96. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  97. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  98. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  99. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  100. data/lib/capybara/selenium/driver.rb +343 -276
  101. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  102. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +124 -0
  103. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +89 -0
  104. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  105. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  106. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  107. data/lib/capybara/selenium/extensions/find.rb +110 -0
  108. data/lib/capybara/selenium/extensions/html5_drag.rb +228 -0
  109. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  110. data/lib/capybara/selenium/extensions/scroll.rb +76 -0
  111. data/lib/capybara/selenium/logger_suppressor.rb +40 -0
  112. data/lib/capybara/selenium/node.rb +508 -124
  113. data/lib/capybara/selenium/nodes/chrome_node.rb +137 -0
  114. data/lib/capybara/selenium/nodes/edge_node.rb +104 -0
  115. data/lib/capybara/selenium/nodes/firefox_node.rb +136 -0
  116. data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
  117. data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
  118. data/lib/capybara/selenium/patches/action_pauser.rb +26 -0
  119. data/lib/capybara/selenium/patches/atoms.rb +18 -0
  120. data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
  121. data/lib/capybara/selenium/patches/logs.rb +45 -0
  122. data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
  123. data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
  124. data/lib/capybara/server/animation_disabler.rb +69 -0
  125. data/lib/capybara/server/checker.rb +44 -0
  126. data/lib/capybara/server/middleware.rb +71 -0
  127. data/lib/capybara/server.rb +59 -67
  128. data/lib/capybara/session/config.rb +79 -59
  129. data/lib/capybara/session/matchers.rb +41 -25
  130. data/lib/capybara/session.rb +371 -357
  131. data/lib/capybara/spec/public/jquery.js +5 -5
  132. data/lib/capybara/spec/public/offset.js +6 -0
  133. data/lib/capybara/spec/public/test.js +159 -13
  134. data/lib/capybara/spec/session/accept_alert_spec.rb +12 -11
  135. data/lib/capybara/spec/session/accept_confirm_spec.rb +6 -5
  136. data/lib/capybara/spec/session/accept_prompt_spec.rb +34 -6
  137. data/lib/capybara/spec/session/active_element_spec.rb +31 -0
  138. data/lib/capybara/spec/session/all_spec.rb +161 -55
  139. data/lib/capybara/spec/session/ancestor_spec.rb +27 -24
  140. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +68 -38
  141. data/lib/capybara/spec/session/assert_current_path_spec.rb +75 -0
  142. data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  143. data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  144. data/lib/capybara/spec/session/{assert_text.rb → assert_text_spec.rb} +91 -59
  145. data/lib/capybara/spec/session/{assert_title.rb → assert_title_spec.rb} +22 -12
  146. data/lib/capybara/spec/session/attach_file_spec.rb +138 -69
  147. data/lib/capybara/spec/session/body_spec.rb +12 -13
  148. data/lib/capybara/spec/session/check_spec.rb +116 -55
  149. data/lib/capybara/spec/session/choose_spec.rb +64 -31
  150. data/lib/capybara/spec/session/click_button_spec.rb +231 -173
  151. data/lib/capybara/spec/session/click_link_or_button_spec.rb +55 -35
  152. data/lib/capybara/spec/session/click_link_spec.rb +82 -58
  153. data/lib/capybara/spec/session/current_scope_spec.rb +11 -10
  154. data/lib/capybara/spec/session/current_url_spec.rb +57 -39
  155. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +4 -4
  156. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +3 -2
  157. data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +11 -9
  158. data/lib/capybara/spec/session/element/match_css_spec.rb +18 -10
  159. data/lib/capybara/spec/session/element/match_xpath_spec.rb +9 -7
  160. data/lib/capybara/spec/session/element/matches_selector_spec.rb +71 -57
  161. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
  162. data/lib/capybara/spec/session/evaluate_script_spec.rb +30 -9
  163. data/lib/capybara/spec/session/execute_script_spec.rb +10 -8
  164. data/lib/capybara/spec/session/fill_in_spec.rb +128 -43
  165. data/lib/capybara/spec/session/find_button_spec.rb +25 -24
  166. data/lib/capybara/spec/session/find_by_id_spec.rb +10 -9
  167. data/lib/capybara/spec/session/find_field_spec.rb +37 -41
  168. data/lib/capybara/spec/session/find_link_spec.rb +36 -17
  169. data/lib/capybara/spec/session/find_spec.rb +245 -144
  170. data/lib/capybara/spec/session/first_spec.rb +79 -51
  171. data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
  172. data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
  173. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +33 -20
  174. data/lib/capybara/spec/session/frame/within_frame_spec.rb +50 -32
  175. data/lib/capybara/spec/session/go_back_spec.rb +2 -1
  176. data/lib/capybara/spec/session/go_forward_spec.rb +2 -1
  177. data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
  178. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  179. data/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
  180. data/lib/capybara/spec/session/has_button_spec.rb +94 -13
  181. data/lib/capybara/spec/session/has_css_spec.rb +272 -137
  182. data/lib/capybara/spec/session/has_current_path_spec.rb +87 -45
  183. data/lib/capybara/spec/session/has_field_spec.rb +139 -59
  184. data/lib/capybara/spec/session/has_link_spec.rb +34 -9
  185. data/lib/capybara/spec/session/has_none_selectors_spec.rb +78 -0
  186. data/lib/capybara/spec/session/has_select_spec.rb +103 -74
  187. data/lib/capybara/spec/session/has_selector_spec.rb +105 -71
  188. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  189. data/lib/capybara/spec/session/has_table_spec.rb +172 -5
  190. data/lib/capybara/spec/session/has_text_spec.rb +113 -61
  191. data/lib/capybara/spec/session/has_title_spec.rb +20 -14
  192. data/lib/capybara/spec/session/has_xpath_spec.rb +57 -38
  193. data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +3 -2
  194. data/lib/capybara/spec/session/html_spec.rb +14 -6
  195. data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
  196. data/lib/capybara/spec/session/node_spec.rb +950 -152
  197. data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
  198. data/lib/capybara/spec/session/refresh_spec.rb +12 -6
  199. data/lib/capybara/spec/session/reset_session_spec.rb +69 -35
  200. data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +2 -1
  201. data/lib/capybara/spec/session/save_and_open_page_spec.rb +3 -2
  202. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +8 -12
  203. data/lib/capybara/spec/session/save_page_spec.rb +42 -55
  204. data/lib/capybara/spec/session/save_screenshot_spec.rb +16 -14
  205. data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
  206. data/lib/capybara/spec/session/scroll_spec.rb +117 -0
  207. data/lib/capybara/spec/session/select_spec.rb +107 -80
  208. data/lib/capybara/spec/session/selectors_spec.rb +52 -19
  209. data/lib/capybara/spec/session/sibling_spec.rb +10 -10
  210. data/lib/capybara/spec/session/text_spec.rb +37 -21
  211. data/lib/capybara/spec/session/title_spec.rb +17 -5
  212. data/lib/capybara/spec/session/uncheck_spec.rb +42 -22
  213. data/lib/capybara/spec/session/unselect_spec.rb +39 -38
  214. data/lib/capybara/spec/session/visit_spec.rb +99 -32
  215. data/lib/capybara/spec/session/window/become_closed_spec.rb +24 -20
  216. data/lib/capybara/spec/session/window/current_window_spec.rb +5 -3
  217. data/lib/capybara/spec/session/window/open_new_window_spec.rb +5 -3
  218. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +27 -22
  219. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +12 -6
  220. data/lib/capybara/spec/session/window/window_spec.rb +97 -63
  221. data/lib/capybara/spec/session/window/windows_spec.rb +12 -10
  222. data/lib/capybara/spec/session/window/within_window_spec.rb +31 -86
  223. data/lib/capybara/spec/session/within_spec.rb +70 -44
  224. data/lib/capybara/spec/spec_helper.rb +49 -43
  225. data/lib/capybara/spec/test_app.rb +89 -42
  226. data/lib/capybara/spec/views/animated.erb +49 -0
  227. data/lib/capybara/spec/views/form.erb +141 -42
  228. data/lib/capybara/spec/views/frame_child.erb +4 -3
  229. data/lib/capybara/spec/views/frame_one.erb +2 -1
  230. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  231. data/lib/capybara/spec/views/frame_two.erb +1 -1
  232. data/lib/capybara/spec/views/initial_alert.erb +11 -0
  233. data/lib/capybara/spec/views/layout.erb +10 -0
  234. data/lib/capybara/spec/views/obscured.erb +47 -0
  235. data/lib/capybara/spec/views/offset.erb +33 -0
  236. data/lib/capybara/spec/views/path.erb +2 -2
  237. data/lib/capybara/spec/views/popup_one.erb +1 -1
  238. data/lib/capybara/spec/views/popup_two.erb +1 -1
  239. data/lib/capybara/spec/views/react.erb +45 -0
  240. data/lib/capybara/spec/views/scroll.erb +21 -0
  241. data/lib/capybara/spec/views/spatial.erb +31 -0
  242. data/lib/capybara/spec/views/tables.erb +68 -1
  243. data/lib/capybara/spec/views/with_animation.erb +81 -0
  244. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  245. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  246. data/lib/capybara/spec/views/with_fixed_header_footer.erb +18 -0
  247. data/lib/capybara/spec/views/with_hover.erb +8 -2
  248. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  249. data/lib/capybara/spec/views/with_html.erb +70 -11
  250. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  251. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  252. data/lib/capybara/spec/views/with_js.erb +39 -3
  253. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  254. data/lib/capybara/spec/views/with_namespace.erb +21 -0
  255. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  256. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  257. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  258. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  259. data/lib/capybara/spec/views/with_windows.erb +1 -1
  260. data/lib/capybara/spec/views/within_frames.erb +5 -2
  261. data/lib/capybara/version.rb +2 -1
  262. data/lib/capybara/window.rb +35 -33
  263. data/lib/capybara.rb +126 -103
  264. data/spec/basic_node_spec.rb +60 -34
  265. data/spec/capybara_spec.rb +53 -104
  266. data/spec/css_builder_spec.rb +101 -0
  267. data/spec/css_splitter_spec.rb +38 -0
  268. data/spec/dsl_spec.rb +81 -62
  269. data/spec/filter_set_spec.rb +27 -9
  270. data/spec/fixtures/certificate.pem +25 -0
  271. data/spec/fixtures/key.pem +27 -0
  272. data/spec/fixtures/selenium_driver_rspec_failure.rb +5 -4
  273. data/spec/fixtures/selenium_driver_rspec_success.rb +5 -4
  274. data/spec/minitest_spec.rb +49 -7
  275. data/spec/minitest_spec_spec.rb +94 -59
  276. data/spec/per_session_config_spec.rb +14 -13
  277. data/spec/rack_test_spec.rb +180 -125
  278. data/spec/regexp_dissassembler_spec.rb +250 -0
  279. data/spec/result_spec.rb +99 -45
  280. data/spec/rspec/features_spec.rb +37 -31
  281. data/spec/rspec/scenarios_spec.rb +9 -7
  282. data/spec/rspec/shared_spec_matchers.rb +448 -421
  283. data/spec/rspec/views_spec.rb +5 -3
  284. data/spec/rspec_matchers_spec.rb +27 -11
  285. data/spec/rspec_spec.rb +109 -89
  286. data/spec/sauce_spec_chrome.rb +43 -0
  287. data/spec/selector_spec.rb +396 -67
  288. data/spec/selenium_spec_chrome.rb +183 -35
  289. data/spec/selenium_spec_chrome_remote.rb +101 -0
  290. data/spec/selenium_spec_edge.rb +47 -0
  291. data/spec/selenium_spec_firefox.rb +184 -41
  292. data/spec/selenium_spec_firefox_remote.rb +80 -0
  293. data/spec/selenium_spec_ie.rb +147 -0
  294. data/spec/selenium_spec_safari.rb +156 -0
  295. data/spec/server_spec.rb +198 -99
  296. data/spec/session_spec.rb +53 -16
  297. data/spec/shared_selenium_node.rb +79 -0
  298. data/spec/shared_selenium_session.rb +489 -97
  299. data/spec/spec_helper.rb +93 -7
  300. data/spec/xpath_builder_spec.rb +93 -0
  301. metadata +365 -70
  302. data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
  303. data/.yard/templates_custom/default/class/html/setup.rb +0 -17
  304. data/.yard/yard_extensions.rb +0 -78
  305. data/lib/capybara/query.rb +0 -7
  306. data/lib/capybara/rspec/compound.rb +0 -95
  307. data/lib/capybara/spec/session/assert_current_path.rb +0 -72
  308. data/lib/capybara/spec/session/assert_selector.rb +0 -148
  309. data/lib/capybara/spec/session/source_spec.rb +0 -0
  310. data/lib/capybara/spec/views/with_title.erb +0 -5
  311. data/spec/selenium_spec_marionette.rb +0 -117
@@ -0,0 +1,11 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <body>
4
+ <div>
5
+ Initial alert page
6
+ </div>
7
+ <script>
8
+ window.alert("Initial alert");
9
+ </script>
10
+ </body>
11
+ </html>
@@ -0,0 +1,10 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
5
+ </head>
6
+
7
+ <body>
8
+ <%= yield %>
9
+ </body>
10
+ </html>
@@ -0,0 +1,47 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
5
+ <title>Obscured</title>
6
+ <style>
7
+ div {
8
+ width: 200px;
9
+ height: 200px;
10
+ }
11
+ #cover, #offscreen, #offscreen_wrapper {
12
+ position: absolute;
13
+ }
14
+ #obscured {
15
+ z-index: 1;
16
+ background-color: red;
17
+ }
18
+ #cover {
19
+ top: 0px;
20
+ z-index: 2;
21
+ background-color: blue;
22
+ }
23
+ #offscreen {
24
+ top: 2000px;
25
+ left: 2000px;
26
+ background-color: green;
27
+ }
28
+ #offscreen_wrapper {
29
+ top: 2000px;
30
+ left: 2000px;
31
+ overflow-x: scroll;
32
+ background-color: yellow;
33
+ }
34
+ </style>
35
+ </head>
36
+ <body>
37
+ <div id="obscured">
38
+ <input id="obscured_input"/>
39
+ </div>
40
+ <div id="cover"></div>
41
+ <iframe id="frameOne" height="10px" src="/frame_one"></iframe>
42
+ <iframe id="nestedFrames" src="/frame_parent"></iframe>
43
+ <div id="offscreen_wrapper">
44
+ <div id="offscreen"></div>
45
+ </div>
46
+ </body>
47
+ </html>
@@ -0,0 +1,33 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
5
+ <title>Offset</title>
6
+ <style>
7
+ body {
8
+ margin: 0px;
9
+ }
10
+ #wrapper {
11
+ width: 300px;
12
+ height: 300px;
13
+ margin: 0px;
14
+ }
15
+ #clicker {
16
+ position: relative;
17
+ width: 100px;
18
+ height: 100px;
19
+ top: 100px;
20
+ left: 100px;
21
+ background-color: red;
22
+ margin: 0px;
23
+ }
24
+ </style>
25
+ <script src="/jquery.js" type="text/javascript" charset="utf-8"></script>
26
+ <script src="/offset.js" type="text/javascript" charset="utf-8"></script>
27
+ </head>
28
+ <body>
29
+ <div id="wrapper">
30
+ <div id="clicker"></div>
31
+ </div>
32
+ </body>
33
+ </html>
@@ -1,5 +1,5 @@
1
-
2
- <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
3
  <body>
4
4
  <div>
5
5
  <a href="#">First Link</a>
@@ -1,4 +1,4 @@
1
-
1
+ <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
4
  <title>Title of the first popup</title>
@@ -1,4 +1,4 @@
1
-
1
+ <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
4
  <title>Title of popup two</title>
@@ -0,0 +1,45 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <script src="https://unpkg.com/react/umd/react.development.js"></script>
5
+ <script src="https://unpkg.com/react-dom/umd/react-dom.development.js"></script>
6
+ </head>
7
+ <body>
8
+ <div id="root"></div>
9
+ <script>
10
+ // https://codepen.io/gaearon/pen/VmmPgp?editors=0010
11
+ class NameForm extends React.Component {
12
+ constructor(props) {
13
+ super(props);
14
+ this.state = { value: '' };
15
+
16
+ this.handleChange = this.handleChange.bind(this);
17
+ this.handleSubmit = this.handleSubmit.bind(this);
18
+ }
19
+
20
+ handleChange(event) {
21
+ this.setState({ value: event.target.value });
22
+ }
23
+
24
+ handleSubmit(event) {
25
+ alert('A name was submitted: ' + this.state.value);
26
+ event.preventDefault();
27
+ }
28
+
29
+ render() {
30
+ return (
31
+ React.createElement("form", { onSubmit: this.handleSubmit },
32
+ React.createElement("label", null, "Name:",
33
+
34
+ React.createElement("input", { type: "text", value: this.state.value, onChange: this.handleChange })),
35
+
36
+ React.createElement("input", { type: "submit", value: "Submit" })));
37
+ }}
38
+
39
+
40
+ ReactDOM.render(
41
+ React.createElement(NameForm, null),
42
+ document.getElementById('root'));
43
+ </script>
44
+ </body>
45
+ </html>
@@ -0,0 +1,21 @@
1
+ <!DOCTYPE html>
2
+ <html style="height: 250%; width: 150%">
3
+ <head>
4
+ <style>
5
+ * { padding: 0; }
6
+ div { position: absolute; }
7
+ #scroll { top: 125%; }
8
+ #scrollable { top: 150%; overflow-y: scroll; overflow-x: scroll; height: 50px; width: 50px; position: relative; border: 1px solid black;}
9
+ #inner { top: 50%; }
10
+ </style>
11
+ </head>
12
+ <body style="height: 100%; width: 100%">
13
+ <div id="scroll" style = "top: 125%">scroll</div>
14
+ <div id="scrollable">
15
+ <div style="height: 200px; width: 200px; poistion: relative">
16
+ <div id="inner">inner</div>
17
+ </div>
18
+ </div>
19
+ </div>
20
+ </body>
21
+ </html>
@@ -0,0 +1,31 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
5
+ <title>spatial</title>
6
+ <style>
7
+ #spatial {
8
+ display: grid;
9
+ grid-template-columns: repeat(3, 1fr);
10
+ grid-gap: 10px;
11
+ grid-auto-rows: minmax(100px, auto);
12
+ }
13
+ .footer {
14
+ grid-column: 1 / 4;
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body id="spatial">
20
+ <div class="corner">1</div>
21
+ <div class="distance">2</div>
22
+ <div class="corner">3</div>
23
+ <div>4</div>
24
+ <div class="center">5</div>
25
+ <div>6</div>
26
+ <div class="corner">7</div>
27
+ <div>8</div>
28
+ <div class="corner">9</div>
29
+ <div class="footer distance">10</div>
30
+ </body>
31
+ </html>
@@ -3,7 +3,7 @@
3
3
  <table id="agent_table">
4
4
  <caption>Agent</caption>
5
5
 
6
- <tr>
6
+ <tr onclick="this.querySelector('td label').innerHTML = 'Clicked'">
7
7
  <td>
8
8
  <label for="form_agent_name">Name</label>
9
9
  </td>
@@ -61,3 +61,70 @@
61
61
  </tr>
62
62
  </table>
63
63
  </form>
64
+
65
+ <table>
66
+ <caption>Horizontal Headers</caption>
67
+ <thead>
68
+ <tr>
69
+ <th>First Name</th>
70
+ <th>Last Name</th>
71
+ <th>City</th>
72
+ </tr>
73
+ </thead>
74
+ <tbody>
75
+ <tr>
76
+ <td>Thomas</td>
77
+ <td>Walpole</td>
78
+ <td>Oceanside</td>
79
+ </tr>
80
+ <tr>
81
+ <td>Danilo</td>
82
+ <td>Wilkinson</td>
83
+ <td>Johnsonville</td>
84
+ </tr>
85
+ <tr>
86
+ <td>Vern</td>
87
+ <td>Konopelski</td>
88
+ <td>Everette</td>
89
+ </tr>
90
+ <tr>
91
+ <td>Ratke</td>
92
+ <td>Lawrence</td>
93
+ <td>East Sorayashire</td>
94
+ </tr>
95
+ <tr>
96
+ <td>Palmer</td>
97
+ <td>Sawayn</td>
98
+ <td>West Trinidad</td>
99
+ </tr>
100
+ </tbody>
101
+ </table>
102
+
103
+ <table>
104
+ <caption>Vertical Headers</caption>
105
+ <tr>
106
+ <th>First Name</th>
107
+ <td>Thomas</td>
108
+ <td>Danilo</td>
109
+ <td>Vern</td>
110
+ <td>Ratke</td>
111
+ <td>Palmer</td>
112
+ </tr>
113
+ <tr>
114
+ <th>Last Name</th>
115
+ <td>Walpole</td>
116
+ <td>Wilkinson</td>
117
+ <td>Konopelski</td>
118
+ <td>Lawrence</td>
119
+ <td>Sawayn</td>
120
+ </tr>
121
+ <tr>
122
+ <th>City</th>
123
+ <td>Oceanside</td>
124
+ <td>Johnsonville</td>
125
+ <td>Everette</td>
126
+ <td>East Sorayashire</td>
127
+ <td>West Trinidad</td>
128
+ </tr>
129
+ </table>
130
+
@@ -0,0 +1,81 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
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 src="/jquery-ui.js" type="text/javascript" charset="utf-8"></script>
8
+ <script src="/test.js" type="text/javascript" charset="utf-8"></script>
9
+ <script type="text/javascript">
10
+ $(document).on('transitionend', function(){
11
+ $(document.body).append('<div>Transition Ended</div>')
12
+ });
13
+ $(document).on('animationend', function(){
14
+ $(document.body).append('<div>Animation Ended</div>')
15
+ });
16
+ $(document).on('contextmenu', function(e){
17
+ e.preventDefault();
18
+ });
19
+ </script>
20
+ <style>
21
+ html {
22
+ scroll-behavior: smooth;
23
+ }
24
+
25
+ body {
26
+ min-height: 2000px;
27
+ }
28
+
29
+ .transition.away {
30
+ width: 0%;
31
+ }
32
+
33
+ a {
34
+ display: inline-block;
35
+ width: 100%;
36
+ overflow: hidden;
37
+ }
38
+
39
+ a::after {
40
+ content: "";
41
+ width: 0px;
42
+ height: 0px;
43
+ background-color: blue;
44
+ }
45
+
46
+ a:not(.away) {
47
+ height: 20px;
48
+ }
49
+
50
+ a.transition {
51
+ transition: all 3s ease-in-out;
52
+ }
53
+
54
+ @keyframes animation {
55
+ 0% {height: 20px; width: 100%;}
56
+ 100% {height: 0px; width: 0%;}
57
+ }
58
+
59
+ a.animation.away {
60
+ animation-name: animation;
61
+ animation-duration: 3s;
62
+ animation-fill-mode: forwards;
63
+ }
64
+
65
+ @keyframes pseudo_grow {
66
+ 100% { height: 100px, width: 100px };
67
+ }
68
+
69
+ a.animation.pseudo::after {
70
+ animation: pseudo_grow 3s forwards;
71
+ }
72
+ </style>
73
+ </head>
74
+
75
+ <body id="with_animation">
76
+ <a href='#' class='transition' onclick='this.classList.add("away")'>transition me away</a>
77
+ <a href='#' class='animation' onclick='this.classList.add("away")' oncontextmenu='this.classList.add("pseudo")'>
78
+ animate me away
79
+ </a>
80
+ </body>
81
+ </html>
@@ -1,5 +1,5 @@
1
-
2
- <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
3
  <head>
4
4
  <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
5
5
  <base href="http://example2.com" />
@@ -0,0 +1,24 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
5
+ <title>with_dragula</title>
6
+
7
+ </head>
8
+
9
+ <body id="with_dragula">
10
+ <div id="sortable">
11
+ <div class="item1">Item 1</div>
12
+ <div class="item2">Item 2</div>
13
+ <div class="item3">Item 3</div>
14
+ <div class="item4">Item 4</div>
15
+ <div class="item5">Item 5</div>
16
+ </div>
17
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/dragula/3.7.2/dragula.js" type="text/javascript"></script>
18
+ <script>
19
+ let container = document.getElementById("sortable");
20
+ dragula([container]);
21
+ container.className = "ready"
22
+ </script>
23
+ </body>
24
+ </html>
@@ -0,0 +1,18 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <style>
5
+ header { height: 45px; position: fixed; top: 0; background-color: red; width: 100%;}
6
+ footer { height: 45px; position: fixed; bottom: 0; background-color: red; width: 100%;}
7
+ #main { margin: 45px;}
8
+ #tall { display: block; height: 2000px;}
9
+ </style>
10
+ </head>
11
+ <body>
12
+ <header>My headers</header>
13
+ <div id="main">
14
+ <div id="tall">A tall block</div>
15
+ <a href="/">Go to root</a>
16
+ </div>
17
+ <footer>My footer</footer>
18
+ </body>
@@ -1,5 +1,5 @@
1
-
2
- <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
3
  <head>
4
4
  <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
5
5
  <title>with_hover</title>
@@ -10,9 +10,15 @@
10
10
  .hidden_until_hover {display: none;}
11
11
  .wrapper:hover .hidden_until_hover { display: block }
12
12
  </style>
13
+ <a href='with_hover1'>Other hover page</a>
13
14
  <div class="wrapper">
14
15
  Some text here so the wrapper has size
15
16
  <div class="hidden_until_hover">Here I am</div>
16
17
  </div>
18
+ <div style="display: block; height: 1000px; width: 100%"></div>
19
+ <div class="wrapper scroll_needed" >
20
+ Some text here so the wrapper has size
21
+ <div class="hidden_until_hover">Here I am</div>
22
+ </div>
17
23
  </body>
18
24
  </html>
@@ -0,0 +1,10 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
5
+ </head>
6
+
7
+ <body>
8
+ <a href="with_hover">Go back</a>
9
+ </body>
10
+ </html>
@@ -1,4 +1,8 @@
1
1
 
2
+ <style>
3
+ p { display: block; }
4
+ </style>
5
+
2
6
  <div id="referrer"><%= referrer %></div>
3
7
  <h1>This is a test</h1>
4
8
 
@@ -6,23 +10,23 @@
6
10
  <h2 class="no text"></h2>
7
11
  <h2 class="head" id="h2one">Header Class Test One</h2>
8
12
  <h2 class="head" id="h2two">Header Class Test Two</h2>
9
- <h2 class="head">Header Class Test Three</h2>
13
+ <h2 class="head" id="h2_">Header Class Test Three</h2>
10
14
  <h2 class="head">Header Class Test Four</h2>
11
- <h2 class="head">Header Class Test Five</h2>
15
+ <h2 class="head">Header Class <span style="display: none">Random</span>Test Five</h2>
12
16
 
13
17
  <span class="number">42</span>
14
18
  <span>Other span</span>
15
19
 
16
- <p class="para" id="first" data-random="abc\def">
20
+ <p class="para" id="first" data-random="abc\def" style="line-height: 25px;">
17
21
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
18
- tempor incididunt ut <a href="/with_simple_html" title="awesome title" class="simple">labore</a>
22
+ tempor incididunt ut <a href="/with_simple_html" title="awesome title" class="simple" tabindex="1">labore</a>
19
23
  et dolore magna aliqua. Ut enim ad minim veniam,
20
- quis nostrud exercitation <a href="/foo" id="foo">ullamco</a> laboris nisi
24
+ quis nostrud exercitation <a href="/foo" id="foo" data-test-id="test-foo">ullamco</a> laboris nisi
21
25
  ut aliquip ex ea commodo consequat.
22
- <a href="/with_simple_html" aria-label="Go to simple"><img id="first_image" width="20" height="20" alt="awesome image" /></a>
26
+ <a href="/with_simple_html" aria-label="Go to simple" data-test-id="test-simple"><img id="first_image" width="20" height="20" alt="awesome image" src="data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs="/></a>
23
27
  </p>
24
28
 
25
- <p class="para" id="second">
29
+ <p class="para" id="second" style="display: inline;">
26
30
  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum
27
31
  dolore eu fugiat <a href="/redirect" id="red">Redirect</a> pariatur. Excepteur sint occaecat cupidatat non proident,
28
32
  sunt in culpa qui officia
@@ -32,9 +36,9 @@
32
36
  </p>
33
37
 
34
38
  <p>
35
- <input type="text" id="test_field" value="monkey"/>
36
- <input type="text" readonly="readonly" value="should not change" />
37
- <textarea id="normal">
39
+ <input type="text" id="test_field" spellcheck="TRUE" data-test-id="test_id" value="monkey"/>
40
+ <input type="text" readonly="readonly" spellcheck="FALSE" value="should not change" />
41
+ <textarea id="normal" data-other-test-id="test_id">
38
42
  banana</textarea>
39
43
  <textarea id="additional_newline">
40
44
 
@@ -122,6 +126,10 @@ banana</textarea>
122
126
  <a id="link_blank_href" href="">Blank href</a>
123
127
  </div>
124
128
 
129
+ <div id="uppercase" style="text-transform: uppercase;">
130
+ text here
131
+ </div>
132
+
125
133
  <div id="ancestor3">
126
134
  Ancestor
127
135
  <div id="ancestor2">
@@ -130,6 +138,9 @@ banana</textarea>
130
138
  Ancestor
131
139
  <div id="child">Child</div>
132
140
  </div>
141
+ <div id="ancestor1_sibiling">
142
+ ASibling
143
+ </div>
133
144
  </div>
134
145
  <button id="ancestor_button" type="submit" disabled>
135
146
  <img id="button_img" width="20" height="20" alt="button img"/>
@@ -146,4 +157,52 @@ banana</textarea>
146
157
  <div data-pre=true>Pre Sibling</div>
147
158
  <div data-post=true>Post Sibling</div>
148
159
  </div>
149
- </div>
160
+ </div>
161
+
162
+ <div id='1escape.me' class="2escape">needs escaping</div>
163
+
164
+ <div id="normalized">
165
+ Some text<div>More text</div>
166
+ <div> And more text</div>
167
+ Even more &nbsp;&nbsp; text
168
+
169
+ on multiple lines
170
+ </div>
171
+
172
+ <div id="non_visible_normalized" style="display: none">
173
+ Some text<div>More text</div>
174
+ <div> And more text</div>
175
+ Even more &nbsp;&nbsp; text
176
+
177
+ on multiple lines
178
+ </div>
179
+
180
+ <div id="ws">
181
+ &#x20;&#x1680;&#x2000;&#x2001;&#x2002; &#x2003;&#x2004;&nbsp;&#x2005; &#x2006;&#x2007;&#x2008;&#x2009;&#x200A;&#x202F;&#x205F;&#x3000;
182
+ </div>
183
+
184
+ <details id="closed_details">
185
+ <summary>
186
+ <h6>Something</h6>
187
+ </summary>
188
+ <ul>
189
+ <li>Random</li>
190
+ <li>Things</li>
191
+ </ul>
192
+ </details>
193
+
194
+ <details id="open_details" open>
195
+ <summary>
196
+ <h6>Summary</h6>
197
+ </summary>
198
+ <div>
199
+ Contents
200
+ </div>
201
+ </details>
202
+
203
+ <template id="template">
204
+ <input />
205
+ </template>
206
+
207
+ <a href="/download.csv" download>Download Me</a>
208
+ <a href="/download.csv" download="other.csv">Download Other</a>
@@ -0,0 +1,20 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Namespace</title>
5
+ </head>
6
+ <body id="body">
7
+ <div>
8
+ <svg viewBox="0 0 100 100" preserveAspectRatio="xMidYMid slice"
9
+ style="width:100%; height:100%; position:absolute; top:0; left:0; z-index:-1;">
10
+ <linearGradient id="gradient">
11
+ <stop class="begin" offset="0%"/>
12
+ <stop class="end" offset="100%"/>
13
+ </linearGradient>
14
+ <rect x="0" y="0" width="100" height="100" style="fill:url(#gradient)" />
15
+ <rect x="150" y="150" width="25" height="25" style="fill:url(#gradient)" />
16
+ <circle cx="50" cy="50" r="30" style="fill:url(#gradient)" />
17
+ </svg>
18
+ <div>
19
+ </body>
20
+ </html>
@@ -0,0 +1,24 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
5
+ <title>with_jquery_animation</title>
6
+ <style>
7
+ body {
8
+ height: 2000px;
9
+ }
10
+ </style>
11
+ </head>
12
+
13
+ <body id="with_animation">
14
+ <a href="#" id='scroll'>scroll top 500</a>
15
+
16
+ <script src="/jquery.js" type="text/javascript" charset="utf-8"></script>
17
+ <script type='text/javascript'>
18
+ $('#scroll').click(function(e){
19
+ e.preventDefault();
20
+ $('html, body').animate({ scrollTop: 500 }, 'slow');
21
+ });
22
+ </script>
23
+ </body>
24
+ </html>