diff --git a/.circleci/config.yml b/.circleci/config.yml index cf64462b..7025e6ed 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -9,7 +9,6 @@ orbs: browser-tools: circleci/browser-tools@1.2.4 node: circleci/node@5.0.0 - commands: bootstrap: description: Install dependencies and bootstrap packages @@ -22,7 +21,7 @@ commands: - run: rake bootstrap # bootstrap packages jobs: - test: + test: <<: *defaults steps: - bootstrap @@ -80,11 +79,22 @@ jobs: chmod +x ./ruby-github-release.sh ./ruby-github-release.sh + check_license: + <<: *defaults + steps: + - checkout + - node/install: + node-version: '16.13' + - bootstrap + - run: bash .circleci/print_license.sh + workflows: version: 2 build: jobs: - test + - check_license: + context: html-tools - canary_release: requires: - test diff --git a/.circleci/print_license.sh b/.circleci/print_license.sh new file mode 100644 index 00000000..19e52282 --- /dev/null +++ b/.circleci/print_license.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +for dir in packages/*; do + cd "$dir" + + echo "" + echo "" + echo "" + echo "" + echo "Printing dependencies for $dir" + + bundle exec ruby > licenses <> - -Closes issue: #<< ticket number >> diff --git a/.github/workflows/semantic-pr-title.yml b/.github/workflows/semantic-pr-title.yml new file mode 100644 index 00000000..181cd239 --- /dev/null +++ b/.github/workflows/semantic-pr-title.yml @@ -0,0 +1,15 @@ +name: Semantic PR title + +on: + pull_request: + types: + - opened + - reopened + - edited + - synchronize + +jobs: + semantic-pr-title: + runs-on: ubuntu-latest + steps: + - uses: dequelabs/semantic-pr-title@v1 diff --git a/.github/workflows/update-axe-core.yml b/.github/workflows/update-axe-core.yml new file mode 100644 index 00000000..6f89a483 --- /dev/null +++ b/.github/workflows/update-axe-core.yml @@ -0,0 +1,38 @@ +name: Update axe-core + +on: + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 16 + - id: update + uses: dequelabs/update-axe-core@v1 + - id: type + run: | + CommitType="" + if [ "${{ steps.update.outputs.patch_version_updated }}" == "true" ]; then + CommitType="fix" + elif [ "${{ steps.update.outputs.minor_version_updated }}" == "true" ]; then + CommitType="feat" + elif [ "${{ steps.update.outputs.major_version_updated }}" == "true" ]; then + CommitType="feat" + fi + echo "type=$CommitType" >>"$GITHUB_OUTPUT" + - name: Open PR + uses: peter-evans/create-pull-request@v4 + with: + token: ${{ secrets.PAT }} + commit-message: '${{ steps.type.outputs.type }}: Update axe-core to v${{ steps.update.outputs.version }}' + branch: auto-update-axe-core + base: develop + title: '${{ steps.type.outputs.type }}: Update axe-core to v${{ steps.update.outputs.version }}' + body: | + This patch updates version of [`axe-core`](https://npmjs.org/axe-core) to v${{ steps.update.outputs.version }}. + + This PR was opened by a robot :robot: :tada:. diff --git a/CHANGELOG.md b/CHANGELOG.md index b412a990..3d96d50c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,15 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +## [4.6.0](https://github.com/dequelabs/axe-core-gems/compare/v4.5.1...v4.6.0) (2023-01-19) + + +### Features + +* Update axe-core to v4.6.0 ([#283](https://github.com/dequelabs/axe-core-gems/issues/283)) + ([e6f7e3f](https://github.com/dequelabs/axe-core-gems/commit/e6f7e3fb0eaa0bc35b5c6d27b05f71705252ecee)) + ### [4.5.1](https://github.com/dequelabs/axe-core-gems/compare/v4.4.1...v4.5.1) (2022-11-21) @@ -128,24 +137,24 @@ All notable changes to this project will be documented in this file. See [standa ### Features -- feat: rename `BeAccessible` to `BeAxeClean` (#138) [b702a53](https://github.com/dequelabs/axe-core-gems/commit/b702a53ba770c73f8a3e35cf2633697e46f0e4be) -- feat: `axe-core-api` gem (#113) [d8acb9d](https://github.com/dequelabs/axe-core-gems/commit/d8acb9d662e6a6748c67019cb0b5708543eff34c) -- feat: `axe-core-cucumber` gem (#105) [a0f5d77](https://github.com/dequelabs/axe-core-gems/commit/a0f5d7794c990af13e96e882b1cd5ea593e2a002) -- feat: `axe-core-rspec` gem (#104) [6acf37c](https://github.com/dequelabs/axe-core-gems/commit/6acf37c185fb739c03a407b737dd6fc8a2fc4b69) -- feat: `axe-core-capybara` gem (#103) [aad434d](https://github.com/dequelabs/axe-core-gems/commit/aad434d691878c6a5696fb02606ffbb98b51ea26) -- feat: `axe-core-watir` gem (#102) [4831ab1](https://github.com/dequelabs/axe-core-gems/commit/4831ab1ff773938e8433c5aecd0842c710a515be) -- feat: `axe-core-selenium` gem (#101) [f1f203c](https://github.com/dequelabs/axe-core-gems/commit/f1f203cde4790f6290d71f1309c247139f954f73) +- feat: rename `BeAccessible` to `BeAxeClean` (#138) [b702a53](https://github.com/dequelabs/axe-core-gems/commit/b702a53ba770c73f8a3e35cf2633697e46f0e4be) +- feat: `axe-core-api` gem (#113) [d8acb9d](https://github.com/dequelabs/axe-core-gems/commit/d8acb9d662e6a6748c67019cb0b5708543eff34c) +- feat: `axe-core-cucumber` gem (#105) [a0f5d77](https://github.com/dequelabs/axe-core-gems/commit/a0f5d7794c990af13e96e882b1cd5ea593e2a002) +- feat: `axe-core-rspec` gem (#104) [6acf37c](https://github.com/dequelabs/axe-core-gems/commit/6acf37c185fb739c03a407b737dd6fc8a2fc4b69) +- feat: `axe-core-capybara` gem (#103) [aad434d](https://github.com/dequelabs/axe-core-gems/commit/aad434d691878c6a5696fb02606ffbb98b51ea26) +- feat: `axe-core-watir` gem (#102) [4831ab1](https://github.com/dequelabs/axe-core-gems/commit/4831ab1ff773938e8433c5aecd0842c710a515be) +- feat: `axe-core-selenium` gem (#101) [f1f203c](https://github.com/dequelabs/axe-core-gems/commit/f1f203cde4790f6290d71f1309c247139f954f73) ### Bug Fixes -- fix: use `axe-core-api` gem in `axe-core-watir` gem (#118) [16ab9cd](https://github.com/dequelabs/axe-core-gems/commit/16ab9cdc1b28db226f441c8b609523f68ad0bc37) -- fix: use `axe-core-api` gem in `axe-core-selenium` gem (#117) [9c1c93c](https://github.com/dequelabs/axe-core-gems/commit/9c1c93cbf31b984b976da5219b66019018e3f62c) -- fix: use `axe-core-api` gem in `axe-core-rspec` gem (#116) [6144aa9](https://github.com/dequelabs/axe-core-gems/commit/6144aa963a4808165f4606a95d6b60c4f9068456) -- fix: use `axe-core-api` gem in `axe-core-cucumber` gem (#115) [39fd531](https://github.com/dequelabs/axe-core-gems/commit/39fd5319f914cc01b2924bd38ceca886411b5366) -- fix: use `axe-core-api` gem in `axe-core-capybara` gem (#114) [c5f466a](https://github.com/dequelabs/axe-core-gems/commit/c5f466a5ce700303ff8f21043195fa833d20e853) -- fix(axe-core-gems): add e2e tests and set up rake tasks (#110) [a8ac475](https://github.com/dequelabs/axe-core-gems/commit/a8ac475959a87b91f49de6e916834dcd456c84ee) -- fix: allow to configure browser as a Symbol argument for webdrivers (#109) [9e116d7](https://github.com/dequelabs/axe-core-gems/commit/9e116d7b38fef5a77efbc503be8bc69c8ac0d9ff) +- fix: use `axe-core-api` gem in `axe-core-watir` gem (#118) [16ab9cd](https://github.com/dequelabs/axe-core-gems/commit/16ab9cdc1b28db226f441c8b609523f68ad0bc37) +- fix: use `axe-core-api` gem in `axe-core-selenium` gem (#117) [9c1c93c](https://github.com/dequelabs/axe-core-gems/commit/9c1c93cbf31b984b976da5219b66019018e3f62c) +- fix: use `axe-core-api` gem in `axe-core-rspec` gem (#116) [6144aa9](https://github.com/dequelabs/axe-core-gems/commit/6144aa963a4808165f4606a95d6b60c4f9068456) +- fix: use `axe-core-api` gem in `axe-core-cucumber` gem (#115) [39fd531](https://github.com/dequelabs/axe-core-gems/commit/39fd5319f914cc01b2924bd38ceca886411b5366) +- fix: use `axe-core-api` gem in `axe-core-capybara` gem (#114) [c5f466a](https://github.com/dequelabs/axe-core-gems/commit/c5f466a5ce700303ff8f21043195fa833d20e853) +- fix(axe-core-gems): add e2e tests and set up rake tasks (#110) [a8ac475](https://github.com/dequelabs/axe-core-gems/commit/a8ac475959a87b91f49de6e916834dcd456c84ee) +- fix: allow to configure browser as a Symbol argument for webdrivers (#109) [9e116d7](https://github.com/dequelabs/axe-core-gems/commit/9e116d7b38fef5a77efbc503be8bc69c8ac0d9ff) ### BREAKING CHANGES diff --git a/package.json b/package.json index e94414c6..70a08807 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "axe-core-gems", - "version": "4.5.1", + "version": "4.6.0", "license": "MPL-2.0", "private": true, "repository": { 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 c48887e6..848a7c4c 100644 --- a/packages/axe-core-api/e2e/selenium/spec/api_spec.rb +++ b/packages/axe-core-api/e2e/selenium/spec/api_spec.rb @@ -8,8 +8,10 @@ options.add_argument('--headless') $driver = Selenium::WebDriver.for :firefox, options: options -def run_axe - Axe::Core.new($driver).call Axe::API::Run.new +Run = Axe::API::Run + +def run_axe(run = Run.new) + Axe::Core.new($driver).call run end $fixture_root = File.join __dir__, "..", "..", "..", "..", "..", "node_modules", "axe-test-fixtures", "fixtures" @@ -270,7 +272,7 @@ def recursive_compact(thing) describe "run vs runPartial" do - it "should return the same results", :oldaxe => true do + it "should return the same results" do $driver.get fixture "/nested-iframes.html" legacy_res = with_js($axe_post_43x + $force_legacy_js) { run_axe } expect(legacy_res.results.testEngine["name"]).to eq "axe-legacy" @@ -285,7 +287,107 @@ def recursive_compact(thing) end end -describe "legacy_mode", :newt => true do +describe "4.6 selectors" do + def flat_targets(rules) + targets = [] + rules.each do |rule| + rule.nodes.each do |node| + node["target"].each do |target| + if target.is_a? Array + targets.concat target + else + targets.append target + end + end + end + end + + targets + end + + it "with labelled frame", :newt => true do + $driver.get fixture "/context-include-exclude.html" + + run = Run.new + .within({ "fromFrames" => ["#ifr-inc-excl", "html"] }) + .excluding({ "fromFrames" => ["#ifr-inc-excl", "#foo-bar"] }) + .within({ "fromFrames" => ["#ifr-inc-excl", "#foo-baz", "html"] }) + .excluding({ "fromFrames" => ["#ifr-inc-excl", "#foo-baz", "input"] }) + res = run_axe run + + label_result = res.results.violations.find {|rule| rule.id == :label} + + targets = flat_targets res.results.passes + expect(targets).not_to include "#foo-bar" + expect(targets).not_to include "input" + expect(label_result).to be_nil + end + + it "with include shadow DOM" do + $driver.get fixture "/shadow-dom.html" + + run = Run.new + .within([["#shadow-root-1", "#shadow-button-1"]]) + .within([["#shadow-root-2", "#shadow-button-2"]]) + res = run_axe run + + targets = flat_targets res.results.passes + expect(targets).to include "#shadow-button-1" + expect(targets).to include "#shadow-button-2" + expect(targets).not_to include "#button" + end + + it "with exclude shadow DOM" do + $driver.get fixture "/shadow-dom.html" + + run = Run.new + .excluding([["#shadow-root-1", "#shadow-button-1"]]) + .excluding([["#shadow-root-2", "#shadow-button-2"]]) + res = run_axe run + + targets = flat_targets res.results.passes + expect(targets).not_to include "#shadow-button-1" + expect(targets).not_to include "#shadow-button-2" + expect(targets).to include "#button" + end + + it "with labelled shadow DOM" do + $driver.get fixture "/shadow-dom.html" + + run = Run.new + .within({ "fromShadowDom" => ["#shadow-root-1", "#shadow-button-1"] }) + .excluding({ "fromShadowDom" => ["#shadow-root-2", "#shadow-button-2"] }) + res = run_axe run + + targets = flat_targets res.results.passes + expect(targets).to include "#shadow-button-1" + expect(targets).not_to include "#shadow-button-2" + end + + it "with labelled iframe and shadow DOM" do + $driver.get fixture "/shadow-frames.html" + + run = Run.new + .with_options({ "runOnly" => "label"}) + .excluding({ + "fromFrames" => [{ + "fromShadowDom" => ["#shadow-root", "#shadow-frame"] + }, + "input" + ] + }) + res = run_axe run + + expect(res.results.violations[0].id).to eq :label + expect(res.results.violations[0].nodes.length).to eq 2 + + nodes = res.results.violations[0].nodes + expect(nodes[0].target).to eq ["#light-frame", "input"] + expect(nodes[1].target).to eq ["#slotted-frame", "input"] + end +end + +describe "legacy_mode" do run_partial_throws = ";axe.runPartial = () => { throw new Error('No runPartial')}" it "runs legacy mode when used" do diff --git a/packages/axe-core-api/lib/axe/api/context.rb b/packages/axe-core-api/lib/axe/api/context.rb index 2f2bde36..597497b7 100644 --- a/packages/axe-core-api/lib/axe/api/context.rb +++ b/packages/axe-core-api/lib/axe/api/context.rb @@ -9,11 +9,11 @@ def initialize end def within(*selectors) - @inclusion.concat selectors.map { |s| Array(Selector.new s) } + @inclusion.concat selectors.map { |s| Selector::normalize s } end def excluding(*selectors) - @exclusion.concat selectors.map { |s| Array(Selector.new s) } + @exclusion.concat selectors.map { |s| Selector::normalize s } end def to_h diff --git a/packages/axe-core-api/lib/axe/api/selector.rb b/packages/axe-core-api/lib/axe/api/selector.rb index 6c9a1d14..9fe608b2 100644 --- a/packages/axe-core-api/lib/axe/api/selector.rb +++ b/packages/axe-core-api/lib/axe/api/selector.rb @@ -1,6 +1,18 @@ module Axe module API class Selector + def self.normalize(s) + if s.is_a? Hash + if s.key? :iframe and s.key? :selector + Array(Selector.new s) + else + s + end + else + Array(Selector.new s) + end + end + def initialize(s) @selector = case s when Array then s diff --git a/packages/axe-core-api/package-lock.json b/packages/axe-core-api/package-lock.json index 1c7b5b61..5a1d1081 100644 --- a/packages/axe-core-api/package-lock.json +++ b/packages/axe-core-api/package-lock.json @@ -7,13 +7,13 @@ "name": "axe-core-api", "license": "MPL-2.0", "dependencies": { - "axe-core": "^4.5.2" + "axe-core": "^4.6.0" } }, "node_modules/axe-core": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.5.2.tgz", - "integrity": "sha512-u2MVsXfew5HBvjsczCv+xlwdNnB1oQR9HlAcsejZttNjKKSkeDNVwB1vMThIUIFI9GoT57Vtk8iQLwqOfAkboA==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.0.tgz", + "integrity": "sha512-L3ZNbXPTxMrl0+qTXAzn9FBRvk5XdO56K8CvcCKtlxv44Aw2w2NCclGuvCWxHPw1Riiq3ncP/sxFYj2nUqdoTw==", "engines": { "node": ">=4" } @@ -21,9 +21,9 @@ }, "dependencies": { "axe-core": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.5.2.tgz", - "integrity": "sha512-u2MVsXfew5HBvjsczCv+xlwdNnB1oQR9HlAcsejZttNjKKSkeDNVwB1vMThIUIFI9GoT57Vtk8iQLwqOfAkboA==" + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.0.tgz", + "integrity": "sha512-L3ZNbXPTxMrl0+qTXAzn9FBRvk5XdO56K8CvcCKtlxv44Aw2w2NCclGuvCWxHPw1Riiq3ncP/sxFYj2nUqdoTw==" } } } diff --git a/packages/axe-core-api/package.json b/packages/axe-core-api/package.json index 70296aed..36c94b65 100644 --- a/packages/axe-core-api/package.json +++ b/packages/axe-core-api/package.json @@ -2,6 +2,6 @@ "name": "axe-core-api", "license": "MPL-2.0", "dependencies": { - "axe-core": "^4.5.2" + "axe-core": "^4.6.0" } } diff --git a/version.rb b/version.rb index 2469a136..a4e4afb2 100644 --- a/version.rb +++ b/version.rb @@ -1,5 +1,5 @@ # this version is used by all the packages module AxeCoreGems - VERSION = "4.5.1" + VERSION = "4.6.0" end