axe-core-api 4.7.0 → 4.11.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 175a4db67c7f727a73321be7d3e31e7dbf7002b1ebe134a21b072a0b2c14fd27
4
- data.tar.gz: 8678aa9c23634486b2c02fb91537b21e60610b84e45672d881bc3db1d5bc4402
3
+ metadata.gz: 635c67b1defbdccd86a32394df3afad0d014cb873fa495dd2c854a6755ee09f1
4
+ data.tar.gz: 9f0bbcb4bf6ec1dfae600a111f50b8f0737ced0c8aa4510d507477c53c5066ec
5
5
  SHA512:
6
- metadata.gz: d244ea40f73c3fab3cab9d6919b2017c7f7a4c6a934737ce5c2f89a48a5c5bb31c408a769418b2f39bd2a40824727f9d3c2b9a8e9e02f9992e642ff9b0b04a7a
7
- data.tar.gz: c4695b7c8f54e16a55cd22f792bd55dbfab3422277e5ce8a3a836deea67c7240ad9a31dd118cd496e7c098bfaee430534b68e7123c27e4c74c623c142c5ff44a
6
+ metadata.gz: e2c90b6f2f51ca81b512c6943ae36f6ba2222df50c60a5bdfda4c7c728772826d4d10962680ad81ffb39fac6e4477b760363ed1c8a76abdd2423d6255e0741bd
7
+ data.tar.gz: 2f5eb900d7b7d049c1617e8e7d9e9e393e659342b38f565c2d115c68f69ee5267814310fd1be6507990c156520274f4d16d17a4950eb8282abbfa2e7881fb498
data/lib/axe/api/run.rb CHANGED
@@ -32,27 +32,34 @@ module Axe
32
32
  end
33
33
 
34
34
  def analyze_post_43x(page, lib)
35
- @original_window = window_handle page
36
- partial_results = run_partial_recursive(page, @context, lib, true)
37
- throw partial_results if partial_results.respond_to?("key?") and partial_results.key?("errorMessage")
38
- results = within_about_blank_context(page) { |page|
39
- partial_res_str = partial_results.to_json
40
- size_limit = 20_000_000
41
- while not partial_res_str.empty? do
42
- chunk_size = size_limit
43
- chunk_size = partial_res_str.length if chunk_size > partial_res_str.length
44
- chunk = partial_res_str[0..chunk_size-1]
45
- partial_res_str = partial_res_str[chunk_size..-1]
46
- store_chunk page, chunk
47
- end
48
-
49
- Common::Loader.new(page, lib).load_top_level Axe::Configuration.instance.jslib
50
- begin
51
- axe_finish_run page
52
- rescue
53
- raise StandardError.new "axe.finishRun failed. Please check out https://github.com/dequelabs/axe-core-gems/blob/develop/error-handling.md"
54
- end
55
- }
35
+ user_page_load = (get_selenium page).manage.timeouts.page_load
36
+ (get_selenium page).manage.timeouts.page_load = 1
37
+ begin
38
+ @original_window = window_handle page
39
+ partial_results = run_partial_recursive(page, @context, lib, true)
40
+ throw partial_results if partial_results.respond_to?("key?") and partial_results.key?("errorMessage")
41
+ results = within_about_blank_context(page) { |page|
42
+ partial_res_str = partial_results.to_json
43
+ size_limit = 10_000_000
44
+ while not partial_res_str.empty? do
45
+ chunk_size = size_limit
46
+ chunk_size = partial_res_str.length if chunk_size > partial_res_str.length
47
+ chunk = partial_res_str[0..chunk_size-1]
48
+ partial_res_str = partial_res_str[chunk_size..-1]
49
+ store_chunk page, chunk
50
+ end
51
+
52
+ Common::Loader.new(page, lib).load_top_level Axe::Configuration.instance.jslib
53
+ begin
54
+ axe_finish_run page
55
+ rescue
56
+ raise StandardError.new "axe.finishRun failed. Please check out https://github.com/dequelabs/axe-core-gems/blob/develop/error-handling.md"
57
+ end
58
+
59
+ }
60
+ ensure
61
+ (get_selenium page).manage.timeouts.page_load = user_page_load
62
+ end
56
63
  Audit.new to_js, Results.new(results)
57
64
  end
58
65
 
@@ -80,22 +87,28 @@ module Axe
80
87
 
81
88
  def within_about_blank_context(page)
82
89
  driver = get_selenium page
90
+ # This is a workaround to maintain Selenium 3 support
91
+ # Likely driver.switch_to.new_window(:tab) should be used instead, should we drop support, as per
92
+ # https://github.com/dequelabs/axe-core-gems/issues/352
83
93
 
84
- num_handles = page.window_handles.length
94
+ before_handles = page.window_handles
85
95
  begin
86
96
  driver.execute_script("window.open('about:blank'), '_blank'")
87
- if num_handles == page.window_handles.length
88
- raise StandardError.new "Could not open new window. Please make sure that you have popup blockers disabled."
89
- end
90
- driver.switch_to.window page.window_handles[-1]
91
97
  rescue
92
- raise StandardError.new "switchToWindow failed. Are you using updated browser drivers? Please check out https://github.com/dequelabs/axe-core-gems/blob/develop/error-handling.md"
98
+ raise StandardError.new "switchToWindow failed. Are you using updated browser drivers? Please check out https://github.com/dequelabs/axe-core-gems/blob/develop/error-handling.md"
99
+ end
100
+ after_handles = page.window_handles
101
+ new_handles = after_handles.difference(before_handles)
102
+ if new_handles.length != 1
103
+ raise StandardError.new "Unable to determine window handle"
93
104
  end
105
+ new_handle = new_handles[0]
106
+ driver.switch_to.window new_handle
94
107
  driver.get "about:blank"
95
108
 
96
109
  ret = yield page
97
110
 
98
- driver.switch_to.window page.window_handles[-1]
111
+ driver.switch_to.window new_handle
99
112
  driver.close
100
113
  driver.switch_to.window @original_window
101
114
 
@@ -108,15 +121,15 @@ module Axe
108
121
  page.current_window_handle
109
122
  end
110
123
 
111
- def run_partial_recursive(page, context, lib, top_level = false)
124
+ def run_partial_recursive(page, context, lib, top_level = false, frame_stack = [])
112
125
  begin
126
+ current_window_handle = window_handle page
113
127
  if not top_level
114
128
  begin
115
129
  Common::Loader.new(page, lib).load_top_level Axe::Configuration.instance.jslib
116
130
  rescue
117
131
  return [nil]
118
132
  end
119
-
120
133
  end
121
134
 
122
135
  frame_contexts = get_frame_context_script page
@@ -126,20 +139,30 @@ module Axe
126
139
  end
127
140
 
128
141
  res = axe_run_partial page, context
129
- if res.key?("errorMessage")
130
- throw res if top_level
142
+ if res.nil? || res.key?("errorMessage")
143
+ if top_level
144
+ throw res unless res.nil?
145
+ throw "axe.runPartial returned null"
146
+ end
131
147
  return [nil]
132
148
  else
133
149
  results = [res]
134
150
  end
135
151
 
136
152
  for frame_context in frame_contexts
137
- frame_selector = frame_context["frameSelector"]
138
- frame_context = frame_context["frameContext"]
139
- frame = axe_shadow_select page, frame_selector
140
- switch_to_frame_by_handle page, frame
141
- res = run_partial_recursive page, frame_context, lib
142
- results += res
153
+ begin
154
+ frame_selector = frame_context["frameSelector"]
155
+ frame_context = frame_context["frameContext"]
156
+ frame = axe_shadow_select page, frame_selector
157
+ switch_to_frame_by_handle page, frame
158
+ res = run_partial_recursive page, frame_context, lib, false, [*frame_stack, frame]
159
+ results += res
160
+ rescue Selenium::WebDriver::Error::TimeoutError
161
+ page = get_selenium page
162
+ page.switch_to.window current_window_handle
163
+ frame_stack.each {|frame| page.switch_to.frame frame }
164
+ results.push nil
165
+ end
143
166
  end
144
167
 
145
168
  ensure
data/lib/axe/api.rb ADDED
@@ -0,0 +1,5 @@
1
+ module Axe
2
+ module API
3
+ autoload :Run, "axe/api/run"
4
+ end
5
+ end
data/lib/axe/core.rb CHANGED
@@ -3,6 +3,7 @@ require_relative "../webdriver_script_adapter/frame_adapter"
3
3
  require_relative "../webdriver_script_adapter/query_selector_adapter"
4
4
  require_relative "../loader"
5
5
  require_relative "./configuration"
6
+ require 'timeout'
6
7
 
7
8
  module Axe
8
9
  class Core
@@ -2,7 +2,7 @@ require "forwardable"
2
2
 
3
3
  require_relative "../../chain_mail/chainable"
4
4
  require_relative "../core"
5
- require_relative "../api/run"
5
+ require_relative "../api"
6
6
 
7
7
  module Axe
8
8
  module Matchers