axe-core-api 4.2.0.pre.4575cbd → 4.2.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: 63ae938fa9b0c8bdf71e552a7ceb3c0d4ee92618725ed44c0092786f452212fc
4
- data.tar.gz: 2210a9a032d3bab1a7c8791499725025fb108ca23339b02560b0286596c80ee3
3
+ metadata.gz: 8361ef42d11b51e5c441e0f3d876744702bdff28e205d54d53431ab017381143
4
+ data.tar.gz: dd4e4aa2b104ae60c5f1d8c10eb36fded46e7748734cbfad36ca82ab5a3a71f2
5
5
  SHA512:
6
- metadata.gz: 4e94415243f47672e0c32803e9364be14e54c2e3337986d0d4565ec657a7766067c990459df8023f0ba50f3d163d8fd25f453091e544e6688f0602fa79bda735
7
- data.tar.gz: 54b8e2d0a840c6d43426a28414d42dde39b5444083508c0f44a62e84b6b6a0bf9a665539091d7c126be2db303af2d5fb8bb0823a734265f7f4ada752b1739fae
6
+ metadata.gz: e0b656db925bbc4162c100ab18be01d8cc2adef9108ab0e38c40a91d99d392a9e036714632facf27ea356f5c1ce972ffbef4f3c87c1767316c90d5d2c15f8bc6
7
+ data.tar.gz: 240e7562d8a7b322a76abb87ceab1055cb580a378a8841ed1e18c5f33ab8ac79b7113a9017089ceeb45b6807f3d43e84db97c5cc21948e8ef45dc41435b7c920
@@ -16,19 +16,13 @@ module Axe
16
16
  @exclusion.concat selectors.map { |s| Array(Selector.new s) }
17
17
  end
18
18
 
19
- def to_h
20
- to_hash
21
- end
22
19
  def to_hash
23
- return { exclude: @exclusion } if @inclusion.empty?
24
- h = {}
25
- h["include"] = @inclusion unless @inclusion.empty?
26
- h["exclude"] = @exclusion unless @exclusion.empty?
27
- h
20
+ { include: @inclusion, exclude: @exclusion }
21
+ .reject { |k, v| v.empty? }
28
22
  end
29
23
 
30
- def to_json(options = nil)
31
- to_hash.to_json options
24
+ def to_json
25
+ to_hash.to_json
32
26
  end
33
27
 
34
28
  def empty?
@@ -14,16 +14,12 @@ module Axe
14
14
  @custom = {}
15
15
  end
16
16
 
17
- def to_h
18
- to_hash
19
- end
20
-
21
17
  def to_hash
22
18
  @rules.to_hash.merge(@custom)
23
19
  end
24
20
 
25
- def to_json(options = nil)
26
- to_hash.to_json options
21
+ def to_json
22
+ to_hash.to_json
27
23
  end
28
24
 
29
25
  def empty?
@@ -10,10 +10,6 @@ module Axe
10
10
  attribute :incomplete, ::Array[Rule]
11
11
  attribute :passes, ::Array[Rule]
12
12
  attribute :timestamp
13
- attribute :testEngine
14
- attribute :testEnvironment
15
- attribute :testRunner
16
- attribute :toolOptions
17
13
  attribute :url, ::String
18
14
  attribute :violations, ::Array[Rule]
19
15
  end
@@ -32,18 +28,12 @@ module Axe
32
28
  inapplicable: inapplicable.map(&:to_h),
33
29
  incomplete: incomplete.map(&:to_h),
34
30
  passes: passes.map(&:to_h),
35
- testEngine: testEngine,
36
31
  timestamp: timestamp,
37
32
  url: url,
38
33
  violations: violations.map(&:to_h),
39
34
  }
40
35
  end
41
36
 
42
- def timestamp=(ts)
43
- timestamp = ts
44
- end
45
-
46
-
47
37
  private
48
38
 
49
39
  def violation_count_message
data/lib/axe/api/run.rb CHANGED
@@ -27,182 +27,21 @@ module Axe
27
27
  end
28
28
 
29
29
  def call(page)
30
- results = audit page
31
- Audit.new to_js, Results.new(results)
32
- end
33
-
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/error-handling.md`"
44
- end
45
- }
46
- Audit.new to_js, Results.new(results)
30
+ audit page do |results|
31
+ Audit.new to_js, Results.new(results)
32
+ end
47
33
  end
48
34
 
49
35
  private
50
36
 
51
37
  def audit(page)
52
- script = <<-JS
53
- var callback = arguments[arguments.length - 1];
54
- var context = arguments[0] || document;
55
- var options = arguments[1] || {};
56
- #{METHOD_NAME}(context, options).then(callback);
57
- JS
58
- page.execute_async_script_fixed script, *js_args
59
- end
60
-
61
- def switch_to_frame_by_handle(page, handle)
62
- page = get_selenium page
63
- page.switch_to.frame handle
64
- end
65
-
66
- def switch_to_parent_frame(page)
67
- page = get_selenium page
68
- page.switch_to.parent_frame
69
- end
70
-
71
- def within_about_blank_context(page)
72
- driver = get_selenium page
73
-
74
- num_handles = page.window_handles.length
75
- begin
76
- driver.execute_script("window.open('about:blank'), '_blank'")
77
- if num_handles == page.window_handles.length
78
- raise StandardError.new "Could not open new window. Please make sure that you have popup blockers disabled."
79
- end
80
- driver.switch_to.window page.window_handles[-1]
81
- rescue
82
- raise StandardError.new "switchToWindow failed. Are you using updated browser drivers?"
83
- end
84
- driver.get "about:blank"
85
-
86
- ret = yield page
87
-
88
- driver.switch_to.window page.window_handles[-1]
89
- driver.close
90
- driver.switch_to.window @original_window
91
-
92
- ret
93
- end
94
- def window_handle(page)
95
- page = get_selenium page
96
-
97
- return page.window_handle if page.respond_to?("window_handle")
98
- page.current_window_handle
99
- end
100
-
101
- def run_partial_recursive(page, context, lib, top_level = false)
102
- begin
103
- if not top_level
104
- begin
105
- Common::Loader.new(page, lib).load_top_level Axe::Configuration.instance.jslib
106
- rescue
107
- return [nil]
108
- end
109
-
110
- end
111
-
112
- frame_contexts = get_frame_context_script page
113
- if frame_contexts.respond_to?("key?") and frame_contexts.key?("errorMessage")
114
- throw frame_contexts if top_level
115
- return [nil]
116
- end
117
-
118
- res = axe_run_partial page, context
119
- if res.key?("errorMessage")
120
- throw res if top_level
121
- return [nil]
122
- else
123
- results = [res]
124
- end
125
-
126
- 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
133
- end
134
-
135
- ensure
136
- switch_to_parent_frame page if not top_level
137
- end
138
- return results
139
- end
140
-
141
- def axe_finish_run(page, partial_results)
142
- script = <<-JS
143
- const partialResults = arguments[0];
144
- return axe.finishRun(partialResults);
145
- JS
146
- page.execute_script_fixed script, partial_results
147
- end
148
-
149
- def axe_shadow_select(page, frame_selector)
150
- script = <<-JS
151
- const frameSelector = arguments[0];
152
- return axe.utils.shadowSelect(frameSelector);
153
- JS
154
- page.execute_script_fixed script, frame_selector
155
- end
156
-
157
- def axe_run_partial(page, context)
158
- script = <<-JS
159
- const context = arguments[0];
160
- const options = arguments[1];
161
- const cb = arguments[arguments.length - 1];
162
- try {
163
- const ret = window.axe.runPartial(context, options);
164
- cb(ret);
165
- } catch (err) {
166
- const ret = {
167
- violations: [],
168
- passes: [],
169
- url: '',
170
- timestamp: new Date().toString(),
171
- errorMessage: err.message
172
- };
173
- cb(ret);
174
- }
175
- JS
176
- page.execute_async_script_fixed script, context, @options
177
- end
178
-
179
- def get_frame_context_script(page)
180
- script = <<-JS
181
- const context = arguments[0];
182
- try {
183
- return window.axe.utils.getFrameContexts(context);
184
- } catch (err) {
185
- return {
186
- violations: [],
187
- passes: [],
188
- url: '',
189
- timestamp: new Date().toString(),
190
- errorMessage: err.message
191
- };
192
- }
193
- JS
194
- page.execute_script_fixed script, @context
195
- end
196
-
197
- def get_selenium(page)
198
- page = page.driver if page.respond_to?("driver")
199
- page = page.browser if page.respond_to?("browser") and not page.browser.is_a?(::Symbol)
200
- page
38
+ yield page.execute_async_script "#{METHOD_NAME}.apply(#{Core::JS_NAME}, arguments)", *js_args
201
39
  end
202
40
 
203
41
  def js_args
204
42
  [@context, @options]
205
- .map(&:to_h)
43
+ .reject(&:empty?)
44
+ .map(&:to_json)
206
45
  end
207
46
 
208
47
  def to_js
@@ -14,8 +14,7 @@ module Axe
14
14
  attr_writer :jslib
15
15
  attr_accessor :page,
16
16
  :jslib_path,
17
- :skip_iframes,
18
- :legacy_mode
17
+ :skip_iframes
19
18
  def_delegators ::WebDriverScriptAdapter,
20
19
  :async_results_identifier,
21
20
  :async_results_identifier=,
data/lib/axe/core.rb CHANGED
@@ -14,36 +14,13 @@ module Axe
14
14
  end
15
15
 
16
16
  def call(callable)
17
- if use_run_partial
18
- callable.analyze_post_43x @page, self
19
- else
20
- callable.call @page
21
- end
22
- end
23
-
24
- def call_verbatim(callable)
25
- callable.call @page
17
+ callable.call(@page)
26
18
  end
27
19
 
28
20
  private
29
21
 
30
- def use_run_partial
31
- has_run_partial? and not Axe::Configuration.instance.legacy_mode
32
- end
33
-
34
22
  def load_axe_core(source)
35
- return if already_loaded?
36
- loader = Common::Loader.new(@page, self)
37
- loader.load_top_level source
38
- return if use_run_partial
39
-
40
- loader.call source
41
- end
42
-
43
- def has_run_partial?
44
- @page.evaluate_script <<-JS
45
- typeof window.axe.runPartial === 'function'
46
- JS
23
+ Common::Loader.new(@page, self).call(source) unless already_loaded?
47
24
  end
48
25
 
49
26
  def already_loaded?
data/lib/loader.rb CHANGED
@@ -6,33 +6,20 @@ module Common
6
6
  def initialize(page, lib)
7
7
  @page = page
8
8
  @lib = lib
9
- @loaded_top_level = false
10
9
  end
11
10
 
12
- def load_top_level(source)
11
+ def call(source)
13
12
  @page.execute_script source
14
- @loaded_top_level = true
15
- Common::Hooks.run_after_load @lib
16
- end
17
-
18
- def call(source, is_top_level = true)
19
- @page.execute_script source unless (@loaded_top_level and is_top_level)
20
- set_allowed_origins
13
+ @page.execute_script "axe.configure({ allowedOrigins: ['<unsafe_all_origins>'] });"
21
14
  Common::Hooks.run_after_load @lib
22
15
  load_into_iframes(source) unless Axe::Configuration.instance.skip_iframes
23
16
  end
24
17
 
25
18
  private
26
19
 
27
- def set_allowed_origins
28
- allowed_origins = "<unsafe_all_origins>"
29
- allowed_origins = "<same_origin>" if Axe::Configuration.instance.legacy_mode
30
- @page.execute_script "axe.configure({ allowedOrigins: ['#{allowed_origins}'] });"
31
- end
32
-
33
20
  def load_into_iframes(source)
34
21
  @page.find_frames.each do |iframe|
35
- @page.within_frame(iframe) { call source, false }
22
+ @page.within_frame(iframe) { call source }
36
23
  end
37
24
  end
38
25
  end
@@ -8,7 +8,7 @@ module WebDriverScriptAdapter
8
8
  def self.wrap(driver)
9
9
  raise WebDriverError, "WebDriver must respond to #execute_script" unless driver.respond_to? :execute_script
10
10
 
11
- driver.respond_to?(:evaluate_script) ? ExecEvalScriptAdapter2.new(driver) : new(driver)
11
+ driver.respond_to?(:evaluate_script) ? driver : new(driver)
12
12
  end
13
13
 
14
14
  # executes script without returning result
@@ -21,19 +21,6 @@ module WebDriverScriptAdapter
21
21
  def evaluate_script(script)
22
22
  __getobj__.execute_script "return #{script}"
23
23
  end
24
-
25
- def execute_script_fixed(script, *args)
26
- page = __getobj__
27
- page.execute_script(script, *args)
28
- end
29
- end
30
- class ExecEvalScriptAdapter2 < ::DumbDelegator
31
- def execute_script_fixed(script, *args)
32
- page = __getobj__
33
- page = page.driver if page.respond_to?("driver")
34
- page = page.browser if page.respond_to?("browser") and not page.browser.is_a?(::Symbol)
35
- page.execute_script(script, *args)
36
- end
37
24
  end
38
25
 
39
26
  class WebDriverError < TypeError; end
@@ -3,11 +3,6 @@ require "securerandom"
3
3
  require "timeout"
4
4
  require_relative "./exec_eval_script_adapter"
5
5
 
6
- def get_selenium(page)
7
- page = page.driver if page.respond_to?("driver")
8
- page = page.browser if page.respond_to?("browser") and not page.browser.is_a?(Symbol)
9
- page
10
- end
11
6
  module WebDriverScriptAdapter
12
7
  class << self
13
8
  attr_accessor :async_results_identifier,
@@ -81,7 +76,7 @@ module WebDriverScriptAdapter
81
76
 
82
77
  class ExecuteAsyncScriptAdapter < ::DumbDelegator
83
78
  def self.wrap(driver)
84
- new driver
79
+ new ExecEvalScriptAdapter.wrap driver
85
80
  end
86
81
 
87
82
  def execute_async_script(script, *args)
@@ -89,13 +84,6 @@ module WebDriverScriptAdapter
89
84
  execute_script ScriptWriter.async_wrapper(script, *args, ScriptWriter.callback(results))
90
85
  Patiently.wait_until { evaluate_script results }
91
86
  end
92
-
93
- def execute_async_script_fixed(script, *args)
94
- page = __getobj__
95
- page = page.driver if page.respond_to?("driver")
96
- page = page.browser if page.respond_to?("browser") and not page.browser.is_a?(::Symbol)
97
- page.execute_async_script(script, *args)
98
- end
99
87
  end
100
88
 
101
89
  configure do |c|