axe-core-api 4.6.0 → 4.8.0

Sign up to get free protection for your applications and to get access to all the features.
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