axe-core-api 4.6.0 → 4.8.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: 3aab520a9802aec04f5a6b25c1659562aa524cea8d90433013d113db11cabef9
4
- data.tar.gz: d34fc0d83f208585ee5d6fa586639ac83027f3bf85ec79817fc00074772ec482
3
+ metadata.gz: e8a9609d176573b5dd5d0a34f86c681270c3d5158bf2a97cd67b30ac09dc5e57
4
+ data.tar.gz: 507ec294987d4d381e533a63b5155adf815e479ace681fc89550205f7e4a27fb
5
5
  SHA512:
6
- metadata.gz: 9a5f3fce4857eaf9e4855bb3f84553077737c4c9f37371c96b1d2945795170a3dbecf743ff5fd666e060dbccd72ba46c6b450331150144f52c2ae05c668787b3
7
- data.tar.gz: f7c0d32661a74860100f0cf080f93c4bb03c62f4c6b26ff6c7acb96c76ced119dddf66bcdc32a4fedaeb94787cbe3d409ef8940d03ae562178688c3a193ba828
6
+ metadata.gz: e7e497a040efdeb4afc7450f85b592efe5e201f49d8109da9af49e2f58a20f04f9689c6f1435571cd60b2ff21c47efa2d3242c5199038483560b3df4a3eafaed
7
+ data.tar.gz: af69008fab0c4bd26f45b6d2d756f6009d1eca8a9011995f6403e20c13225e9a5e166ab74cfc0688953526897e9d9b235687515eeb2e125d2a9f7bb708251109
@@ -40,7 +40,7 @@ module Axe
40
40
  end
41
41
 
42
42
  def timestamp=(ts)
43
- timestamp = ts
43
+ @timestamp = ts
44
44
  end
45
45
 
46
46
 
data/lib/axe/api/run.rb CHANGED
@@ -32,17 +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
- Common::Loader.new(page, lib).load_top_level Axe::Configuration.instance.jslib
40
- begin
41
- axe_finish_run page, partial_results
42
- rescue
43
- raise StandardError.new "axe.finishRun failed. Please check out https://github.com/dequelabs/axe-core-gems/blob/develop/error-handling.md"
44
- end
45
- }
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
46
63
  Audit.new to_js, Results.new(results)
47
64
  end
48
65
 
@@ -98,15 +115,15 @@ module Axe
98
115
  page.current_window_handle
99
116
  end
100
117
 
101
- def run_partial_recursive(page, context, lib, top_level = false)
118
+ def run_partial_recursive(page, context, lib, top_level = false, frame_stack = [])
102
119
  begin
120
+ current_window_handle = window_handle page
103
121
  if not top_level
104
122
  begin
105
123
  Common::Loader.new(page, lib).load_top_level Axe::Configuration.instance.jslib
106
124
  rescue
107
125
  return [nil]
108
126
  end
109
-
110
127
  end
111
128
 
112
129
  frame_contexts = get_frame_context_script page
@@ -116,20 +133,30 @@ module Axe
116
133
  end
117
134
 
118
135
  res = axe_run_partial page, context
119
- if res.key?("errorMessage")
120
- throw res if top_level
136
+ if res.nil? || res.key?("errorMessage")
137
+ if top_level
138
+ throw res unless res.nil?
139
+ throw "axe.runPartial returned null"
140
+ end
121
141
  return [nil]
122
142
  else
123
143
  results = [res]
124
144
  end
125
145
 
126
146
  for frame_context in frame_contexts
127
- frame_selector = frame_context["frameSelector"]
128
- frame_context = frame_context["frameContext"]
129
- frame = axe_shadow_select page, frame_selector
130
- switch_to_frame_by_handle page, frame
131
- res = run_partial_recursive page, frame_context, lib
132
- results += res
147
+ begin
148
+ frame_selector = frame_context["frameSelector"]
149
+ frame_context = frame_context["frameContext"]
150
+ frame = axe_shadow_select page, frame_selector
151
+ switch_to_frame_by_handle page, frame
152
+ res = run_partial_recursive page, frame_context, lib, false, [*frame_stack, frame]
153
+ results += res
154
+ rescue Selenium::WebDriver::Error::TimeoutError
155
+ page = get_selenium page
156
+ page.switch_to.window current_window_handle
157
+ frame_stack.each {|frame| page.switch_to.frame frame }
158
+ results.push nil
159
+ end
133
160
  end
134
161
 
135
162
  ensure
@@ -138,12 +165,20 @@ module Axe
138
165
  return results
139
166
  end
140
167
 
141
- def axe_finish_run(page, partial_results)
168
+ def store_chunk(page, chunk)
169
+ script = <<-JS
170
+ const chunk = arguments[0];
171
+ window.partialResults ??= '';
172
+ window.partialResults += chunk;
173
+ JS
174
+ page.execute_script_fixed script, chunk
175
+ end
176
+ def axe_finish_run(page)
142
177
  script = <<-JS
143
- const partialResults = arguments[0];
178
+ const partialResults = JSON.parse(window.partialResults || '[]');
144
179
  return axe.finishRun(partialResults);
145
180
  JS
146
- page.execute_script_fixed script, partial_results
181
+ page.execute_script_fixed script
147
182
  end
148
183
 
149
184
  def axe_shadow_select(page, frame_selector)
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
@@ -37,8 +38,22 @@ module Axe
37
38
  Core.has_run_partial?(@page) and not Axe::Configuration.instance.legacy_mode
38
39
  end
39
40
 
41
+ def assert_frame_ready
42
+ begin
43
+ ready = Timeout.timeout(10) {
44
+ @page.evaluate_script <<-JS
45
+ document.readyState === 'complete'
46
+ JS
47
+ }
48
+ rescue Timeout::Error
49
+ ready = false
50
+ end
51
+ raise Exception.new "Page/frame not ready" if not ready
52
+ end
53
+
40
54
  def load_axe_core(source)
41
55
  return if already_loaded?
56
+ assert_frame_ready
42
57
  loader = Common::Loader.new(@page, self)
43
58
  loader.load_top_level source
44
59
  return if use_run_partial