axe-core-api 4.14.0.pre.9ba7f37 → 4.14.0.pre.743b3a1

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: a4d5c0c478c6c22523ed47912bf8810927ee516d055cd1017ff84540323b7da3
4
- data.tar.gz: 6faa06747660ee8247ec713b311dc8a3ea18cc472b7f9e23c69db8e4ca6dee40
3
+ metadata.gz: a9806ad369e72d353d7c736f92c537a038127e567fd44180f875da9d0f9d63c6
4
+ data.tar.gz: b6b13dddb4b637ce49e6bc67cff6af19b0f2076a085096c9aa550f58d25ccbf6
5
5
  SHA512:
6
- metadata.gz: 4eb80c3a671c123c1006e97177733830ddf751448aa4776fe101da0f5fa41a269ab8ce7adbaf1547b92d96eb68e2547327fcecd691515fcfda02f071a49fd9f8
7
- data.tar.gz: 030a5a914b24f6334dc5763ac9ce949aa78b16d867e93b882ad9177f84eec12f536bbfc7c210c28cd565716d8f98ff3b830d025523e8fe48a730377144e7cfe3
6
+ metadata.gz: 4d0dfa7e192f33b96f35f212775b8009afa62199bc726b366c1ace3ee4d6ab134a61573111667d1c52fc2ff79f07816aa15cc5fb1c2fa35b5ca40fe8797af8b2
7
+ data.tar.gz: eb561fe2e9a3d17a2d7dc35f4f29288b8491d45314dc1366fe446eb0461ac46522a1031d609bbdaf79e7b0e9db878f47a980dd02b5e9d6723a9e0f1a5de97111
data/lib/axe/api/run.rb CHANGED
@@ -31,6 +31,10 @@ module Axe
31
31
  Audit.new to_js, Results.new(results)
32
32
  end
33
33
 
34
+ def iframes?
35
+ JSON.parse(@options.to_json)["iframes"] != false
36
+ end
37
+
34
38
  def analyze_post_43x(page, lib)
35
39
  user_page_load = (get_selenium page).manage.timeouts.page_load
36
40
  (get_selenium page).manage.timeouts.page_load = 1
@@ -220,8 +224,9 @@ module Axe
220
224
  def get_frame_context_script(page)
221
225
  script = <<-JS
222
226
  const context = arguments[0];
227
+ const options = arguments[1];
223
228
  try {
224
- return window.axe.utils.getFrameContexts(context);
229
+ return window.axe.utils.getFrameContexts(context, options);
225
230
  } catch (err) {
226
231
  return {
227
232
  violations: [],
@@ -232,7 +237,7 @@ module Axe
232
237
  };
233
238
  }
234
239
  JS
235
- page.execute_script_fixed script, @context
240
+ page.execute_script_fixed script, @context, @options
236
241
  end
237
242
 
238
243
  def get_selenium(page)
data/lib/axe/core.rb CHANGED
@@ -18,6 +18,7 @@ module Axe
18
18
  if use_run_partial
19
19
  callable.analyze_post_43x @page, self
20
20
  else
21
+ load_legacy callable
21
22
  callable.call @page
22
23
  end
23
24
  end
@@ -39,12 +40,29 @@ module Axe
39
40
  end
40
41
 
41
42
  def load_axe_core(source)
42
- return if already_loaded?
43
- loader = Common::Loader.new(@page, self)
44
- loader.load_top_level source
45
- return if use_run_partial
43
+ @source = source
44
+ loaded = already_loaded?
45
+ @loader = Common::Loader.new(@page, self, loaded_top_level: loaded)
46
+ return if loaded
46
47
 
47
- loader.call source
48
+ begin
49
+ @loading_frames = true
50
+ @loader.load_top_level source
51
+ ensure
52
+ @loading_frames = false
53
+ end
54
+ end
55
+
56
+ def load_legacy(callable)
57
+ return if @frames_loaded || @loading_frames
58
+
59
+ iframes = !callable.respond_to?(:iframes?) || callable.iframes?
60
+ begin
61
+ @loading_frames = true
62
+ @frames_loaded = @loader.call @source, iframes: iframes
63
+ ensure
64
+ @loading_frames = false
65
+ end
48
66
  end
49
67
 
50
68
  def already_loaded?
data/lib/loader.rb CHANGED
@@ -4,27 +4,63 @@ require_relative "./hooks"
4
4
 
5
5
  module Common
6
6
  class Loader
7
- def initialize(page, lib)
7
+ INJECTED = "axeCoreGemsInjected".freeze
8
+
9
+ # a frame that blocks scripts skips event listeners and never fires timers, so axe.runPartial would hang in it
10
+ ASSERT_SCRIPTS_RUN = <<-JS
11
+ (function () {
12
+ var ran = false;
13
+ try {
14
+ var target = document.createElement('div');
15
+ target.addEventListener('axe', function () { ran = true; });
16
+ var event = document.createEvent('Event');
17
+ event.initEvent('axe', false, false);
18
+ target.dispatchEvent(event);
19
+ } catch (e) {
20
+ return;
21
+ }
22
+ if (!ran) {
23
+ throw new Error('Frame cannot run scripts');
24
+ }
25
+ })();
26
+ JS
27
+
28
+ def initialize(page, lib, loaded_top_level: false)
8
29
  @page = page
9
30
  @lib = lib
10
- @loaded_top_level = false
31
+ @loaded_top_level = loaded_top_level
11
32
  end
12
33
 
13
34
  def load_top_level(source)
14
- @page.execute_script source
35
+ @page.execute_script ASSERT_SCRIPTS_RUN + source
15
36
  @loaded_top_level = true
16
37
  Common::Hooks.run_after_load @lib
17
38
  end
18
39
 
19
- def call(source, is_top_level = true)
20
- @page.execute_script source unless (@loaded_top_level and is_top_level)
21
- set_allowed_origins
22
- Common::Hooks.run_after_load @lib
23
- load_into_iframes(source) unless Axe::Configuration.instance.skip_iframes
40
+ def call(source, is_top_level = true, iframes: true)
41
+ if is_top_level || !injected?
42
+ unless @loaded_top_level and is_top_level
43
+ @page.execute_script source
44
+ mark_injected unless is_top_level
45
+ end
46
+ set_allowed_origins
47
+ Common::Hooks.run_after_load @lib
48
+ end
49
+ load_frames = iframes && !Axe::Configuration.instance.skip_iframes
50
+ load_into_iframes(source) if load_frames
51
+ load_frames
24
52
  end
25
53
 
26
54
  private
27
55
 
56
+ def injected?
57
+ @page.evaluate_script "window.#{INJECTED} !== undefined && window.#{INJECTED} === window.#{Axe::Core::JS_NAME}"
58
+ end
59
+
60
+ def mark_injected
61
+ @page.execute_script "window.#{INJECTED} = window.#{Axe::Core::JS_NAME};"
62
+ end
63
+
28
64
  def set_allowed_origins
29
65
  allowed_origins = "<same_origin>"
30
66
  allowed_origins = "<unsafe_all_origins>" if !Axe::Configuration.instance.legacy_mode && !Axe::Core::has_run_partial?(@page)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: axe-core-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.14.0.pre.9ba7f37
4
+ version: 4.14.0.pre.743b3a1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Deque Systems
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-10-06 00:00:00.000000000 Z
11
+ date: 2026-10-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dumb_delegator