From 82bbdbb9fb87e45c40950aedf51316d60a503bdd Mon Sep 17 00:00:00 2001 From: AdnoC Date: Wed, 15 Mar 2023 15:21:44 -0500 Subject: [PATCH 1/7] fix: work with extremely large results --- .../e2e/selenium/spec/api_spec.rb | 2 +- packages/axe-core-api/lib/axe/api/run.rb | 20 ++++++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/packages/axe-core-api/e2e/selenium/spec/api_spec.rb b/packages/axe-core-api/e2e/selenium/spec/api_spec.rb index 848a7c4c..526fa657 100644 --- a/packages/axe-core-api/e2e/selenium/spec/api_spec.rb +++ b/packages/axe-core-api/e2e/selenium/spec/api_spec.rb @@ -92,7 +92,7 @@ def recursive_compact(thing) end describe "frame tests" do - it "injects into nested iframes" do + it "injects into nested iframes", :fo => true do $driver.get fixture "/nested-iframes.html" res = run_axe expect(res.results.violations).not_to be_empty diff --git a/packages/axe-core-api/lib/axe/api/run.rb b/packages/axe-core-api/lib/axe/api/run.rb index e7bc5451..b59dec42 100644 --- a/packages/axe-core-api/lib/axe/api/run.rb +++ b/packages/axe-core-api/lib/axe/api/run.rb @@ -36,6 +36,16 @@ def analyze_post_43x(page, lib) partial_results = run_partial_recursive(page, @context, lib, true) throw partial_results if partial_results.respond_to?("key?") and partial_results.key?("errorMessage") results = within_about_blank_context(page) { |page| + partial_res_str = partial_results.to_json + size_limit = 15_000_000 + while not partial_res_str.empty? do + chunk_size = size_limit + chunk_size = partial_res_str.length if chunk_size > partial_res_str.length + chunk = partial_res_str[0..chunk_size-1] + partial_res_str = partial_res_str[chunk_size..-1] + store_chunk page, chunk + end + Common::Loader.new(page, lib).load_top_level Axe::Configuration.instance.jslib begin axe_finish_run page, partial_results @@ -138,9 +148,17 @@ def run_partial_recursive(page, context, lib, top_level = false) return results end + def store_chunk(page, chunk) + script = <<-JS + const chunk = arguments[0]; + window.partialResults ??= ''; + window.partialResults += chunk; + JS + page.execute_script_fixed script, chunk + end def axe_finish_run(page, partial_results) script = <<-JS - const partialResults = arguments[0]; + const partialResults = JSON.parse(window.partialResults || '[]'); return axe.finishRun(partialResults); JS page.execute_script_fixed script, partial_results From 5f7609ddd1c33568a8b56da02989da69e3214527 Mon Sep 17 00:00:00 2001 From: AdnoC Date: Mon, 20 Mar 2023 08:20:50 -0400 Subject: [PATCH 2/7] add test --- .../axe-core-api/e2e/selenium/spec/api_spec.rb | 16 ++++++++++++++-- packages/axe-core-api/lib/axe/api/run.rb | 6 +++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/axe-core-api/e2e/selenium/spec/api_spec.rb b/packages/axe-core-api/e2e/selenium/spec/api_spec.rb index 526fa657..eb1d9aa6 100644 --- a/packages/axe-core-api/e2e/selenium/spec/api_spec.rb +++ b/packages/axe-core-api/e2e/selenium/spec/api_spec.rb @@ -4,9 +4,11 @@ require "axe/core" require "axe/api/run" -options = Selenium::WebDriver::Firefox::Options.new +options = Selenium::WebDriver::Chrome::Options.new options.add_argument('--headless') -$driver = Selenium::WebDriver.for :firefox, options: options +$driver = Selenium::WebDriver.for :chrome, options: options +$driver.manage.timeouts.implicit_wait = 300 +$driver.manage.timeouts.script_timeout = 300 Run = Axe::API::Run @@ -20,6 +22,7 @@ def run_axe(run = Run.new) $axe_post_43x = Axe::Configuration.instance.jslib $crasher_js = File.read File.join($fixture_root, "axe-crasher.js") $force_legacy_js = File.read File.join($fixture_root, "axe-force-legacy.js") +$large_partial_js = File.read File.join($fixture_root, "axe-large-partial.js") def fixture(filename) "http://localhost:8000" + filename @@ -268,6 +271,15 @@ def recursive_compact(thing) expect { run_axe }.to raise_error /finishRun failed/ } end + + it "works with large results", :nt => true do + $driver.get fixture "/index.html" + res = with_js($axe_post_43x + $large_partial_js) { run_axe } + + + expect(res.results.passes.length).to eq 1 + expect(res.results.passes[0].id).to eq :'duplicate-id' + end end diff --git a/packages/axe-core-api/lib/axe/api/run.rb b/packages/axe-core-api/lib/axe/api/run.rb index b59dec42..3c150841 100644 --- a/packages/axe-core-api/lib/axe/api/run.rb +++ b/packages/axe-core-api/lib/axe/api/run.rb @@ -48,7 +48,7 @@ def analyze_post_43x(page, lib) Common::Loader.new(page, lib).load_top_level Axe::Configuration.instance.jslib begin - axe_finish_run page, partial_results + axe_finish_run page rescue raise StandardError.new "axe.finishRun failed. Please check out https://github.com/dequelabs/axe-core-gems/blob/develop/error-handling.md" end @@ -156,12 +156,12 @@ def store_chunk(page, chunk) JS page.execute_script_fixed script, chunk end - def axe_finish_run(page, partial_results) + def axe_finish_run(page) script = <<-JS const partialResults = JSON.parse(window.partialResults || '[]'); return axe.finishRun(partialResults); JS - page.execute_script_fixed script, partial_results + page.execute_script_fixed script end def axe_shadow_select(page, frame_selector) From c2108c519e98adc0aa15ea430f8ebb9bf2ddd9c1 Mon Sep 17 00:00:00 2001 From: AdnoC Date: Mon, 20 Mar 2023 09:15:23 -0400 Subject: [PATCH 3/7] back to ff? --- packages/axe-core-api/e2e/selenium/spec/api_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/axe-core-api/e2e/selenium/spec/api_spec.rb b/packages/axe-core-api/e2e/selenium/spec/api_spec.rb index eb1d9aa6..2f096c81 100644 --- a/packages/axe-core-api/e2e/selenium/spec/api_spec.rb +++ b/packages/axe-core-api/e2e/selenium/spec/api_spec.rb @@ -4,9 +4,9 @@ require "axe/core" require "axe/api/run" -options = Selenium::WebDriver::Chrome::Options.new +options = Selenium::WebDriver::Firefox::Options.new options.add_argument('--headless') -$driver = Selenium::WebDriver.for :chrome, options: options +$driver = Selenium::WebDriver.for :firefox, options: options $driver.manage.timeouts.implicit_wait = 300 $driver.manage.timeouts.script_timeout = 300 From d19583ac2ae5e612562712d231f97d55b0bb8f62 Mon Sep 17 00:00:00 2001 From: AdnoC Date: Mon, 20 Mar 2023 09:50:05 -0400 Subject: [PATCH 4/7] test pls --- packages/axe-core-api/e2e/selenium/spec/api_spec.rb | 9 --------- 1 file changed, 9 deletions(-) diff --git a/packages/axe-core-api/e2e/selenium/spec/api_spec.rb b/packages/axe-core-api/e2e/selenium/spec/api_spec.rb index 2f096c81..d60b547b 100644 --- a/packages/axe-core-api/e2e/selenium/spec/api_spec.rb +++ b/packages/axe-core-api/e2e/selenium/spec/api_spec.rb @@ -271,15 +271,6 @@ def recursive_compact(thing) expect { run_axe }.to raise_error /finishRun failed/ } end - - it "works with large results", :nt => true do - $driver.get fixture "/index.html" - res = with_js($axe_post_43x + $large_partial_js) { run_axe } - - - expect(res.results.passes.length).to eq 1 - expect(res.results.passes[0].id).to eq :'duplicate-id' - end end From c7e3b4a438eb62dfdeabd2c061b05f245c8eecf6 Mon Sep 17 00:00:00 2001 From: AdnoC Date: Mon, 20 Mar 2023 10:37:41 -0400 Subject: [PATCH 5/7] waits? --- packages/axe-core-api/e2e/selenium/spec/api_spec.rb | 11 +++++++++-- packages/axe-core-api/lib/axe/api/run.rb | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/axe-core-api/e2e/selenium/spec/api_spec.rb b/packages/axe-core-api/e2e/selenium/spec/api_spec.rb index d60b547b..e5393782 100644 --- a/packages/axe-core-api/e2e/selenium/spec/api_spec.rb +++ b/packages/axe-core-api/e2e/selenium/spec/api_spec.rb @@ -7,8 +7,6 @@ options = Selenium::WebDriver::Firefox::Options.new options.add_argument('--headless') $driver = Selenium::WebDriver.for :firefox, options: options -$driver.manage.timeouts.implicit_wait = 300 -$driver.manage.timeouts.script_timeout = 300 Run = Axe::API::Run @@ -271,6 +269,15 @@ def recursive_compact(thing) expect { run_axe }.to raise_error /finishRun failed/ } end + + it "works with large results" do + $driver.get fixture "/index.html" + res = with_js($axe_post_43x + $large_partial_js) { run_axe } + + + expect(res.results.passes.length).to eq 1 + expect(res.results.passes[0].id).to eq :'duplicate-id' + end end diff --git a/packages/axe-core-api/lib/axe/api/run.rb b/packages/axe-core-api/lib/axe/api/run.rb index 3c150841..8c21ea09 100644 --- a/packages/axe-core-api/lib/axe/api/run.rb +++ b/packages/axe-core-api/lib/axe/api/run.rb @@ -37,7 +37,7 @@ def analyze_post_43x(page, lib) throw partial_results if partial_results.respond_to?("key?") and partial_results.key?("errorMessage") results = within_about_blank_context(page) { |page| partial_res_str = partial_results.to_json - size_limit = 15_000_000 + size_limit = 60_000_000 while not partial_res_str.empty? do chunk_size = size_limit chunk_size = partial_res_str.length if chunk_size > partial_res_str.length From ad6a086331d279de57f0e38d8b337c4cb55570bf Mon Sep 17 00:00:00 2001 From: AdnoC Date: Mon, 20 Mar 2023 11:06:01 -0400 Subject: [PATCH 6/7] 60M is too large --- packages/axe-core-api/e2e/selenium/spec/api_spec.rb | 8 ++++---- packages/axe-core-api/lib/axe/api/run.rb | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/axe-core-api/e2e/selenium/spec/api_spec.rb b/packages/axe-core-api/e2e/selenium/spec/api_spec.rb index e5393782..c62ba7a2 100644 --- a/packages/axe-core-api/e2e/selenium/spec/api_spec.rb +++ b/packages/axe-core-api/e2e/selenium/spec/api_spec.rb @@ -4,9 +4,9 @@ require "axe/core" require "axe/api/run" -options = Selenium::WebDriver::Firefox::Options.new -options.add_argument('--headless') -$driver = Selenium::WebDriver.for :firefox, options: options +options = Selenium::WebDriver::Chrome::Options.new +# options.add_argument('--headless') +$driver = Selenium::WebDriver.for :chrome, options: options Run = Axe::API::Run @@ -270,7 +270,7 @@ def recursive_compact(thing) } end - it "works with large results" do + it "works with large results", :nt => true do $driver.get fixture "/index.html" res = with_js($axe_post_43x + $large_partial_js) { run_axe } diff --git a/packages/axe-core-api/lib/axe/api/run.rb b/packages/axe-core-api/lib/axe/api/run.rb index 8c21ea09..6949f306 100644 --- a/packages/axe-core-api/lib/axe/api/run.rb +++ b/packages/axe-core-api/lib/axe/api/run.rb @@ -37,7 +37,7 @@ def analyze_post_43x(page, lib) throw partial_results if partial_results.respond_to?("key?") and partial_results.key?("errorMessage") results = within_about_blank_context(page) { |page| partial_res_str = partial_results.to_json - size_limit = 60_000_000 + size_limit = 20_000_000 while not partial_res_str.empty? do chunk_size = size_limit chunk_size = partial_res_str.length if chunk_size > partial_res_str.length From ddea5349d1ac3ada53e32bffe911479ff7b5219d Mon Sep 17 00:00:00 2001 From: AdnoC Date: Mon, 20 Mar 2023 11:33:59 -0400 Subject: [PATCH 7/7] stop comparing html. selenium adds attributes --- packages/axe-core-api/e2e/selenium/spec/api_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/axe-core-api/e2e/selenium/spec/api_spec.rb b/packages/axe-core-api/e2e/selenium/spec/api_spec.rb index c62ba7a2..c2cb7ce7 100644 --- a/packages/axe-core-api/e2e/selenium/spec/api_spec.rb +++ b/packages/axe-core-api/e2e/selenium/spec/api_spec.rb @@ -57,7 +57,7 @@ def recursive_compact(thing) elsif thing.is_a?(Hash) thing.each_with_object({}) do |(k,v), h| v = recursive_compact(v) - h[k] = v unless [nil, [], {}].include?(v) + h[k] = v unless ([nil, [], {}].include?(v) or k == :html) end else thing