diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..dfe077042 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore index 1e810c884..411f11d6b 100644 --- a/.gitignore +++ b/.gitignore @@ -5,10 +5,7 @@ examples/wysiwyg/editors/aloha/* examples/wysiwyg/editors/tinymce/* examples/wysiwyg/editors/ckeditor/* examples/wysiwyg/editors/ckeditor4/* -_site node_modules/* -utilities/printTable.php - -utilities/guidelineFinder.php - -utilities/tests.json +.grunt/* +bower_components/* +lib/* \ No newline at end of file diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 000000000..922bb3fde --- /dev/null +++ b/.jshintrc @@ -0,0 +1,18 @@ +{ + "curly": true, + "eqeqeq": true, + "immed": true, + "latedef": true, + "newcap": true, + "noarg": true, + "sub": true, + "undef": true, + "boss": true, + "eqnull": true, + "browser": true, + "jquery": true, + "globals": { + "quail": true, + "process": true + } +} \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index b6825861a..a2b03117b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,14 @@ language: node_js node_js: - 0.8 +env: + global: + - secure: "chVihuGb0n35Lvu3H87JUCmVTg8UpIPLqRhtNHRQc/6a1bXH8Q0KMCIIhIO1lhSJXkIy/x9OwqXOve4Do8liXrwgJMuy673e9lGFxK4XFujTlvyEAwHhlMOhGpo/UYyt3wn3aFB0GY1lKn1+HtecJYSOqyVQ3unhY1lO1cCkkig=" + - secure: "BWWoZltjRxfbKF4AlrPq9aSumY63n/xDnSvmuHXAEmbfJoWpOXXB0me5H6515I0zH1hjpHyusmQ0UXfRQAie26kvpPyGIdjs12mfGT0hLrkdO2ua/OlosufatnZAb4F0eg9Z6AR2w+94BK5vNfc+gSbHWWI8SLjMa29Oz+WLdL0=" + install: - npm install grunt-cli -g - npm install + +after_success: + - grunt saucelabs --verbose \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 40aa11af1..086c69f78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,28 @@ QUAIL Changelog =============== +2.1 +--- +- Changed license to MIT +- Quail is now split into various components and custom callbacks that are build using `grunt build` +- Configuration is now in YAML format +- Tests are explicitly aligned with WCAG techniques or success criteria. +- Tests can have translatable titles and default descriptions. +- Tests now support different configurations based on guideline alignment. + +2.0.4 +----- +- Moved source files to different files in `/src`, `/dist` is now built versions of quail. +- Renamed all test files to match their accessibility tests. +- Updated most test files to HTML5 doctype. +- Got rid of dependencies for pxtoem and hasEvent libraries. +- Made strings build into JS instead of needing ajax calls. + +2.0.3 +----- +- Added tags to tests so that they could be categorized by implementations. +- Cleaned up some Grunt linting. + 2.0.2 ----- - Added filtering as an extra option. diff --git a/Gruntfile.js b/Gruntfile.js index 0fb57b8b2..cd239a496 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -2,70 +2,187 @@ /*global module:false*/ module.exports = function(grunt) { + var buildId = (typeof process.env.TRAVIS_BUILD_ID !== 'undefined') ? process.env.TRAVIS_BUILD_ID : Date.now(); // Project configuration. grunt.initConfig({ pkg: grunt.file.readJSON('quail.json'), + convert: { + yml2json: { + files: [ + { + expand: true, + cwd: 'src/resources/guidelines', + src: ['*.yml'], + dest: 'dist/guidelines/', + ext: '.json' + }, + { + expand: true, + cwd: 'src/resources', + src: ['*.yml'], + dest: 'dist/', + ext: '.json' + } + ] + } + }, + shell: { + hooks: { + command: 'cp git-hooks/pre-commit .git/hooks/' + } + }, concat: { options: { - banner: '/*! QUAIL quailjs.org | quailjs.org/license */', + banner: '<%= pkg.options.banner %>' + "\n" + ';(function($) {' + "\n", + footer: "\n" + '})(jQuery);', stripBanners: true - }, + }, dist: { - src: ['src/<%= pkg.name %>.js'] + src: ['src/js/core.js', 'src/js/components/*.js', 'src/js/strings/*.js', 'src/js/custom/*.js'], + dest: 'dist/quail.jquery.js' } }, uglify: { - options: { - banner: '<%= concat.options.banner %>' - }, dist: { - files : { - 'src/quail.min.js' : 'src/quail.js' + files: { + 'dist/quail.jquery.min.js': 'dist/quail.jquery.js' } + }, + options: { + banner: '<%= pkg.options.banner %>' } }, qunit: { files: ['test/quail.html'] }, - watch: { - files: '<%= jshint.files %>', - tasks: 'test' - }, jshint: { options: { - curly: true, - eqeqeq: true, - immed: true, - latedef: true, - newcap: true, - noarg: true, - sub: true, - undef: true, - boss: true, - eqnull: true, - browser: true, - globals: { - jQuery: true + jshintrc: '.jshintrc' + }, + files: ['Gruntfile.js', 'src/**/*.js'] + }, + watch: { + scripts: { + files: ['src/**/*.js', 'src/**/*.yml'], + tasks: ['convert', 'concat', 'jshint', 'buildGuideline', 'uglify'], + options: { + spawn: false } + } + }, + buildGuideline: { + dist: { + files: [ + { guideline: '508', src: 'dist/tests.json', dest: 'dist/guidelines/508.tests.json' }, + { guideline: 'wcag', src: 'dist/tests.json', dest: 'dist/guidelines/wcag.tests.json' } + ] + } + }, + compressTestsJson: { + dist: { + files: [ + { src: 'dist/tests.json', dest: 'dist/tests.min.json' } + ] + } + }, + 'gh-pages': { + options: { + base: '', + add: true }, - files: ['Gruntfile.js', 'src/quail.js', 'src/resources/**/*.json'] + src: ['dist/**'] + }, + connect: { + server: { + options: { + port: 9999 + } + } + }, + 'saucelabs-qunit': { + all: { + options: { + urls: ['http://127.0.0.1:9999/test/quail.html'], + tunnelTimeout: 10, + testTimeout: 900000000, + concurrency: 3, + detailedError: true, + build: buildId, + testname: buildId, + tags: [ + process.env.TRAVIS_BRANCH, + process.env.TRAVIS_COMMIT + ], + browsers: [ + { + browserName: 'chrome', + platform: 'OS X 10.9' + }, + { + browserName: 'chrome', + platform: 'Windows 8' + }, + { + browserName: 'firefox', + platform: 'OS X 10.9' + }, + { + browserName: 'firefox', + platform: 'Windows 8' + }, + { + browserName: 'opera' + }, + { + browserName: 'internet explorer', + version: '10' + }, + { + browserName: 'internet explorer', + version: '11', + platform: 'Windows 8.1' + }, + { + browserName: 'iphone' + } + ] + } + } + }, + bower: { + install: { } + }, + supressSaucelabsOutput: { + all: { } } }); - + grunt.loadTasks('tasks'); grunt.loadNpmTasks('grunt-contrib-qunit'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-watch'); - - // Linting, mostly to test JSON. - grunt.registerTask('lint', ['jshint']); + grunt.loadNpmTasks('grunt-contrib-concat'); + grunt.loadNpmTasks('grunt-convert'); + grunt.loadNpmTasks('grunt-shell'); + grunt.loadNpmTasks('grunt-gh-pages'); + grunt.loadNpmTasks('grunt-bower-task'); + grunt.loadNpmTasks('grunt-saucelabs'); + grunt.loadNpmTasks('grunt-contrib-connect'); // By default, just run tests - grunt.registerTask('default', ['test']); + grunt.registerTask('default', ['bower:install', 'convert', 'concat', 'jshint', 'buildGuideline', 'compressTestsJson', 'qunit']); + + // Build task. + grunt.registerTask('build', ['bower:install', 'convert', 'concat', 'jshint', 'buildGuideline', 'compressTestsJson', 'uglify']); // Release task. - grunt.registerTask('release', ['jshint', 'qunit', 'uglify']); + grunt.registerTask('release', ['bower:install', 'convert', 'concat', 'jshint', 'qunit', 'buildGuideline', 'compressTestsJson', 'uglify', 'gh-pages']); // Test task. - grunt.registerTask('test', ['jshint', 'qunit']); + grunt.registerTask('test', ['bower:install', 'convert', 'concat', 'jshint', 'buildGuideline', 'compressTestsJson', 'qunit']); + + // Saucelabs task (need to add your own environment variables) + grunt.registerTask('saucelabs', ['bower:install', 'convert', 'concat', 'jshint', 'buildGuideline', 'compressTestsJson', 'connect', 'supressSaucelabsOutput', 'saucelabs-qunit']); + + grunt.registerTask('publish', ['gh-pages']); }; diff --git a/LICENSE-GPL b/LICENSE-GPL deleted file mode 100644 index 07addd422..000000000 --- a/LICENSE-GPL +++ /dev/null @@ -1,280 +0,0 @@ -QUAIL is copyright (c) 2012 Kevin Miller - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. diff --git a/LICENSE-MIT b/LICENSE-MIT new file mode 100644 index 000000000..6ebc84f96 --- /dev/null +++ b/LICENSE-MIT @@ -0,0 +1,21 @@ +Copyright 2013 Kevin Miller and other contributors +http://quailjs.org + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md index 131398d95..bfdfd2c23 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -[![Build Status](https://secure.travis-ci.org/kevee/quail.png?branch=master)](http://travis-ci.org/kevee/quail) +[![Build Status](https://secure.travis-ci.org/kevee/quail.png?branch=master)](http://travis-ci.org/kevee/quail) [![Selenium Test Status](https://saucelabs.com/browser-matrix/quailjs.svg)](https://saucelabs.com/u/quailjs) -QUAIL: Accessibility Information Library +Quail: Accessibility Information Library ======================================== A jQuery plugin that lets you easily check HTML for adherence to accessibility standards. It comes with over 200 tests which implement Open Accessibility Tests and comes with WCAG 1.0, WCAG 2.0, and Section 508 guidelines. @@ -9,6 +9,20 @@ Developers can build their own guidelines, or easily build a custom guideline th **The project website is [quailjs.org](http://quailjs.org/).** +Building Quail +-------------- +If you are not familiar with using grunt or just want to download a pre-built version of quail, [visit the releases page for the project](https://github.com/kevee/quail/releases). + +If you are checking out quail from a repository, you will notice there is no `/dist` directory, quail must be built using [Grunt](http://gruntjs.com/). Use the following steps to get started (this is assuming you already have [Node](http://nodejs.org/) installed on your machine): + +``` +cd quail +npm install +grunt build +``` + +This does two things: it downloads libraries (like qunit and jQuery) into the `/lib` directory, and builds quail (both a development version and a minified, production version) into the `/dist` directory. + Documentation ------------- @@ -21,11 +35,12 @@ Pull requests should be made against the **dev** branch, as master is only for t Credits ------- -- QUAIL is maintained by [Kevin Miller](http://twitter.com/kevinmiyar) -- Part of QUAIL development is supported by [Cal State Monterey Bay](http://csumb.edu) -- Thanks to the hosts of [Chez JJ](http://chezjj.com/), who housed Kevin for a week while he worked on QUAIL 2. +- Quail is maintained by [Kevin Miller](http://twitter.com/kevinmiyar) +- Part of Quail development is supported by [Cal State Monterey Bay](http://csumb.edu) +- Many thanks to [Jesse Renée Beach](https://twitter.com/jessebeach) for promoting Quail and the many commits. +- Thanks to the hosts of [Chez JJ](http://chezjj.com/), who housed Kevin for a week while he worked on Quail 2. Legal ----- -QUAIL is covered under the GPL Version 2, and is copyright (c) 2012 by Kevin Miller. Current license is at http://quailjs.org/license. \ No newline at end of file +QUAIL is covered under the MIT License, and is copyright (c) 2013 by Kevin Miller. Current license is at http://quailjs.org/license. \ No newline at end of file diff --git a/bower.json b/bower.json new file mode 100644 index 000000000..7dd664074 --- /dev/null +++ b/bower.json @@ -0,0 +1,16 @@ +{ + "name": "quail", + "version": "2.1.0", + "main": "dist/quail.jquery.js", + "ignore": [ + ".jshintrc", + "**/*.txt" + ], + "dependencies": { + "jquery": "~2.0.3" + }, + "devDependencies": { + "qunit": "~1.12.0", + "qunit-composite": "https://github.com/jquery/qunit-composite.git" + } +} diff --git a/dist/guidelines/508.json b/dist/guidelines/508.json new file mode 100644 index 000000000..d90414c8c --- /dev/null +++ b/dist/guidelines/508.json @@ -0,0 +1,52 @@ +{ + "guidelines": { + "a": { + "title": "A text equivalent for every non-text element shall be provided (e.g., via 'alt', 'longdesc', or in element content)." + }, + "b": { + "title": "Equivalent alternatives for any multimedia presentation shall be synchronized with the presentation." + }, + "c": { + "title": "Web pages shall be designed so that all information conveyed with color is also available without color, for example from context or markup." + }, + "d": { + "title": "Documents shall be organized so they are readable without requiring an associated style sheet." + }, + "e": { + "title": "Redundant text links shall be provided for each active region of a server-side image map." + }, + "f": { + "title": "Client-side image maps shall be provided instead of server-side image maps except where the regions cannot be defined with an available geometric shape." + }, + "g": { + "title": "Row and column headers shall be identified for data tables." + }, + "h": { + "title": "Markup shall be used to associate data cells and header cells for data tables that have two or more logical levels of row or column headers." + }, + "i": { + "title": "Frames shall be titled with text that facilitates frame identification and navigation." + }, + "j": { + "title": "Pages shall be designed to avoid causing the screen to flicker with a frequency greater than 2 Hz and lower than 55 Hz." + }, + "k": { + "title": "A text-only page, with equivalent information or functionality, shall be provided to make a web site comply with the provisions of this part, when compliance cannot be accomplished in any other way. The content of the text-only page shall be updated whenever the primary page changes." + }, + "l": { + "title": "When pages utilize scripting languages to display content, or to create interface elements, the information provided by the script shall be identified with functional text that can be read by assistive technology." + }, + "m": { + "title": "When a web page requires that an applet, plug-in or other application be present on the client system to interpret page content, the page must provide a link to a plug-in or applet that complies with §1194.21(a) through (l)." + }, + "n": { + "title": "When electronic forms are designed to be completed on-line, the form shall allow people using assistive technology to access the information, field elements, and functionality required for completion and submission of the form, including all directions and cues." + }, + "o": { + "title": "A method shall be provided that permits users to skip repetitive navigation links." + }, + "p": { + "title": "When a timed response is required, the user shall be alerted and given sufficient time to indicate more time is required." + } + } +} \ No newline at end of file diff --git a/dist/guidelines/508.tests.json b/dist/guidelines/508.tests.json new file mode 100644 index 000000000..d3e3e6b87 --- /dev/null +++ b/dist/guidelines/508.tests.json @@ -0,0 +1 @@ +["aLinksToMultiMediaRequireTranscript","aLinksToSoundFilesNeedTranscripts","appletContainsTextEquivalent","appletContainsTextEquivalentInAlt","appletTextEquivalentsGetUpdated","appletUIMustBeAccessible","appletsDoNotFlicker","appletsDoneUseColorAlone","checkboxHasLabel","documentContentReadableWithoutStylesheets","fileHasLabel","imgAltIsDifferent","imgAltIsSameInText","imgAltIsTooLong","imgAltNotEmptyInAnchor","imgAltNotPlaceHolder","imgGifNoFlicker","imgHasAlt","imgMapAreasHaveDuplicateLink","imgNonDecorativeHasAlt","imgNotReferredToByColorAlone","imgWithMapHasUseMap","inputDoesNotUseColorAlone","inputImageAltIsNotFileName","inputImageAltIsNotPlaceholder","inputImageAltIsShort","inputImageHasAlt","objectDoesNotFlicker","objectDoesNotUseColorAlone","objectTextUpdatesWhenObjectChanges","passwordHasLabel","radioHasLabel","scriptInBodyMustHaveNoscript","scriptOnclickRequiresOnKeypress","scriptOndblclickRequiresOnKeypress","scriptOnmousedownRequiresOnKeypress","scriptOnmousemove","scriptOnmouseoutHasOnmouseblur","scriptOnmouseoverHasOnfocus","scriptOnmouseupHasOnkeyup","scriptUIMustBeAccessible","scriptsDoNotFlicker","scriptsDoNotUseColorAlone","skipToContentLinkProvided","tableDataShouldHaveTh","tableWithBothHeadersUseScope","videoProvidesCaptions"] \ No newline at end of file diff --git a/dist/guidelines/wcag.json b/dist/guidelines/wcag.json new file mode 100644 index 000000000..ab5d6e238 --- /dev/null +++ b/dist/guidelines/wcag.json @@ -0,0 +1,2323 @@ +{ + "guidelines": { + "1.1.1": { + "id": "text-equiv-all", + "title": "Non-text Content", + "description": "All non-text content that is presented to the user has a text alternative that serves the equivalent purpose, except for the situations listed below.", + "uri": "http://www.w3.org/TR/WCAG20/#text-equiv-all", + "techniques": [ + "C9", + "C18", + "F3", + "F13", + "F20", + "F30", + "F38", + "F39", + "F65", + "F67", + "F71", + "F72", + "FLASH1", + "FLASH2", + "FLASH3", + "FLASH5", + "FLASH6", + "FLASH11", + "FLASH25", + "FLASH27", + "FLASH28", + "FLASH29", + "FLASH30", + "FLASH32", + "G68", + "G73", + "G74", + "G82", + "G92", + "G94", + "G95", + "G100", + "G143", + "G144", + "G196", + "H2", + "H24", + "H27", + "H30", + "H35", + "H36", + "H37", + "H44", + "H45", + "H46", + "H53", + "H65", + "H67", + "H86", + "SL5", + "SL8", + "SL18", + "SL19", + "SL26", + "SL30" + ] + }, + "1.2.1": { + "id": "media-equiv-av-only-alt", + "title": "Audio-only and Video-only (Prerecorded)", + "description": "For prerecorded audio-only and prerecorded video-only media, the following are true, except when the audio or video is a media alternative for text and is clearly labeled as such:", + "uri": "http://www.w3.org/TR/WCAG20/#media-equiv-av-only-alt", + "techniques": [ + "F30", + "F67", + "G158", + "G159", + "G166", + "SL17" + ] + }, + "1.2.2": { + "id": "media-equiv-captions", + "title": "Captions (Prerecorded)", + "description": "Captions are provided for all prerecorded audio content in synchronized media, except when the media is a media alternative for text and is clearly labeled as such.", + "uri": "http://www.w3.org/TR/WCAG20/#media-equiv-captions", + "techniques": [ + "F8", + "F74", + "F75", + "FLASH9", + "G87", + "G93", + "SL16", + "SL28", + "SM11", + "SM12" + ] + }, + "1.2.3": { + "id": "media-equiv-audio-desc", + "title": "Audio Description or Media Alternative (Prerecorded)", + "description": "An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media, except when the media is a media alternative for text and is clearly labeled as such.", + "uri": "http://www.w3.org/TR/WCAG20/#media-equiv-audio-desc", + "techniques": [ + "FLASH26", + "G8", + "G58", + "G69", + "G78", + "G173", + "G203", + "H53", + "SL1", + "SL17", + "SM1", + "SM2", + "SM6", + "SM7" + ] + }, + "1.2.4": { + "id": "media-equiv-real-time-captions", + "title": "Captions (Live)", + "description": "Captions are provided for all live audio content in synchronized media.", + "uri": "http://www.w3.org/TR/WCAG20/#media-equiv-real-time-captions", + "techniques": [ + "G9", + "G87", + "G93", + "SM11", + "SM12" + ] + }, + "1.2.5": { + "id": "media-equiv-audio-desc-only", + "title": "Audio Description (Prerecorded)", + "description": "Audio description is provided for all prerecorded video content in synchronized media.", + "uri": "http://www.w3.org/TR/WCAG20/#media-equiv-audio-desc-only", + "techniques": [ + "FLASH26", + "G8", + "G78", + "G173", + "G203", + "SL1", + "SM1", + "SM2", + "SM6", + "SM7" + ] + }, + "1.2.6": { + "id": "media-equiv-sign", + "title": "Sign Language (Prerecorded)", + "description": "Sign language interpretation is provided for all prerecorded audio content in synchronized media.", + "uri": "http://www.w3.org/TR/WCAG20/#media-equiv-sign", + "techniques": [ + "G54", + "G81", + "SM13", + "SM14" + ] + }, + "1.2.7": { + "id": "media-equiv-extended-ad", + "title": "Extended Audio Description (Prerecorded)", + "description": "Where pauses in foreground audio are insufficient to allow audio descriptions to convey the sense of the video, extended audio description is provided for all prerecorded video content in synchronized media.", + "uri": "http://www.w3.org/TR/WCAG20/#media-equiv-extended-ad", + "techniques": [ + "G8", + "SM1", + "SM2" + ] + }, + "1.2.8": { + "id": "media-equiv-text-doc", + "title": "Media Alternative (Prerecorded)", + "description": "An alternative for time-based media is provided for all prerecorded synchronized media and for all prerecorded video-only media.", + "uri": "http://www.w3.org/TR/WCAG20/#media-equiv-text-doc", + "techniques": [ + "F74", + "G58", + "G69", + "G159", + "H46", + "H53", + "SL17" + ] + }, + "1.2.9": { + "id": "media-equiv-live-audio-only", + "title": "Audio-only (Live)", + "description": "An alternative for time-based media that presents equivalent information for live audio-only content is provided.", + "uri": "http://www.w3.org/TR/WCAG20/#media-equiv-live-audio-only", + "techniques": [ + "G150", + "G151", + "G157" + ] + }, + "1.3.1": { + "id": "content-structure-separation-programmatic", + "title": "Info and Relationships", + "description": "Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.", + "uri": "http://www.w3.org/TR/WCAG20/#content-structure-separation-programmatic", + "techniques": [ + "ARIA1", + "ARIA2", + "C22", + "F2", + "F17", + "F33", + "F34", + "F42", + "F43", + "F46", + "F48", + "F62", + "F68", + "F87", + "F90", + "F91", + "FLASH8", + "FLASH21", + "FLASH23", + "FLASH25", + "FLASH29", + "FLASH31", + "FLASH32", + "G115", + "G117", + "G138", + "G140", + "G141", + "G162", + "H39", + "H42", + "H43", + "H44", + "H48", + "H49", + "H51", + "H63", + "H65", + "H71", + "H73", + "H85", + "T1", + "T2", + "T3", + "SCR21", + "SL20", + "SL26" + ] + }, + "1.3.2": { + "id": "content-structure-separation-sequence", + "title": "Meaningful Sequence", + "description": "When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.", + "uri": "http://www.w3.org/TR/WCAG20/#content-structure-separation-sequence", + "techniques": [ + "C6", + "C8", + "C27", + "F1", + "F32", + "F33", + "F34", + "F49", + "FLASH15", + "G57", + "H34", + "H56", + "SL34" + ] + }, + "1.3.3": { + "id": "content-structure-separation-understanding", + "title": "Sensory Characteristics", + "description": "Instructions provided for understandingand operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.", + "uri": "http://www.w3.org/TR/WCAG20/#content-structure-separation-understanding", + "techniques": [ + "F14", + "F26", + "G96" + ] + }, + "1.4.1": { + "id": "visual-audio-contrast-without-color", + "title": "Use of Color", + "description": "Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.", + "uri": "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-without-color", + "techniques": [ + "C15", + "F13", + "F73", + "F81", + "G14", + "G111", + "G182", + "G183", + "H92" + ] + }, + "1.4.2": { + "id": "visual-audio-contrast-dis-audio", + "title": "Audio Control", + "description": "If any audio on a Web page plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.", + "uri": "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-dis-audio", + "techniques": [ + "F23", + "FLASH18", + "FLASH34", + "G60", + "G170", + "G171", + "SL3", + "SL24" + ] + }, + "1.4.3": { + "id": "visual-audio-contrast-contrast", + "title": "Contrast (Minimum)", + "description": "The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, except for the following:", + "uri": "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast", + "techniques": [ + "F24", + "F83", + "G18", + "G145", + "G148", + "G156", + "G174", + "SL13" + ] + }, + "1.4.4": { + "id": "visual-audio-contrast-scale", + "title": "Resize text", + "description": "Except for captions and images of text, text can be resized without assistive technology up to 200 percent without loss of content or functionality.", + "uri": "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-scale", + "techniques": [ + "C12", + "C13", + "C14", + "C17", + "C20", + "C22", + "C28", + "F69", + "F80", + "G142", + "G146", + "G178", + "G179", + "SCR34", + "SL22", + "SL23" + ] + }, + "1.4.5": { + "id": "visual-audio-contrast-text-presentation", + "title": "Images of Text", + "description": "If the technologies being used can achieve the visual presentation, text is used to convey information rather than images of text except for the following:", + "uri": "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-text-presentation", + "techniques": [ + "C6", + "C8", + "C12", + "C13", + "C14", + "C22", + "C30", + "G140", + "SL31" + ] + }, + "1.4.6": { + "id": "visual-audio-contrast7", + "title": "Contrast (Enhanced)", + "description": "The visual presentation of text and images of text has a contrast ratio of at least 7:1, except for the following:", + "uri": "http://www.w3.org/TR/WCAG20/#visual-audio-contrast7", + "techniques": [ + "F24", + "F83", + "G17", + "G18", + "G148", + "G156", + "G174", + "SL13" + ] + }, + "1.4.7": { + "id": "visual-audio-contrast-noaudio", + "title": "Low or No Background Audio", + "description": "For prerecorded audio-only content that (1) contains primarily speech in the foreground, (2) is not an audio CAPTCHA or audio logo, and (3) is not vocalization intended to be primarily musical expression such as singing or rapping, at least one of the following is true:", + "uri": "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-noaudio", + "techniques": [ + "G56" + ] + }, + "1.4.8": { + "id": "visual-audio-contrast-visual-presentation", + "title": "Visual Presentation", + "description": "For the visual presentation of blocks of text, a mechanism is available to achieve the following:", + "uri": "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-visual-presentation", + "techniques": [ + "C12", + "C13", + "C14", + "C19", + "C20", + "C21", + "C23", + "C24", + "C25", + "C26", + "F24", + "F88", + "FLASH33", + "G146", + "G148", + "G156", + "G169", + "G172", + "G175", + "G188", + "H87", + "SCR34" + ] + }, + "1.4.9": { + "id": "visual-audio-contrast-text-images", + "title": "Images of Text (No Exception)", + "description": "Images of text are only used for pure decoration or where a particular presentation of text is essential to the information being conveyed.", + "uri": "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-text-images", + "techniques": [ + "C6", + "C8", + "C12", + "C13", + "C14", + "C22", + "C30", + "G140", + "SL31" + ] + }, + "2.1.1": { + "id": "keyboard-operation-keyboard-operable", + "title": "Keyboard", + "description": "All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes, except where the underlying function requires input that depends on the path of the user's movement and not just the endpoints.", + "uri": "http://www.w3.org/TR/WCAG20/#keyboard-operation-keyboard-operable", + "techniques": [ + "F42", + "F54", + "F55", + "FLASH14", + "FLASH16", + "FLASH17", + "FLASH22", + "G90", + "G202", + "H91", + "SCR2", + "SCR20", + "SCR29", + "SCR35", + "SL9", + "SL14", + "SL15" + ] + }, + "2.1.2": { + "id": "keyboard-operation-trapping", + "title": "No Keyboard Trap", + "description": "If keyboard focus can be moved to a component of the page using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.", + "uri": "http://www.w3.org/TR/WCAG20/#keyboard-operation-trapping", + "techniques": [ + "F10", + "FLASH17", + "G21" + ] + }, + "2.1.3": { + "id": "keyboard-operation-all-funcs", + "title": "Keyboard (No Exception)", + "description": "All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.", + "uri": "http://www.w3.org/TR/WCAG20/#keyboard-operation-all-funcs", + "techniques": [ + "F42", + "F54", + "F55", + "FLASH14", + "FLASH16", + "FLASH17", + "FLASH22", + "G90", + "G202", + "H91", + "SCR2", + "SCR20", + "SCR29", + "SCR35", + "SL9", + "SL14", + "SL15" + ] + }, + "2.2.1": { + "id": "time-limits-required-behaviors", + "title": "Timing Adjustable", + "description": "For each time limit that is set by the content, at least one of the following is true:", + "uri": "http://www.w3.org/TR/WCAG20/#time-limits-required-behaviors", + "techniques": [ + "F40", + "F41", + "F58", + "FLASH19", + "FLASH24", + "G4", + "G133", + "G180", + "G198", + "SCR1", + "SCR16", + "SCR33", + "SCR36", + "SL21" + ] + }, + "2.2.2": { + "id": "time-limits-pause", + "title": "Pause, Stop, Hide", + "description": "For moving, blinking, scrolling, or auto-updating information, all of the following are true:", + "uri": "http://www.w3.org/TR/WCAG20/#time-limits-pause", + "techniques": [ + "F4", + "F7", + "F16", + "F47", + "F50", + "FLASH35", + "FLASH36", + "G4", + "G11", + "G152", + "G186", + "G187", + "G191", + "SCR22", + "SCR33", + "SL11", + "SL12", + "SL24" + ] + }, + "2.2.3": { + "id": "time-limits-no-exceptions", + "title": "No Timing", + "description": "Timing is not an essential part of the event or activity presented by the content, except for non-interactive synchronized media and real-time events.", + "uri": "http://www.w3.org/TR/WCAG20/#time-limits-no-exceptions", + "techniques": [ + "G5" + ] + }, + "2.2.4": { + "id": "time-limits-postponed", + "title": "Interruptions", + "description": "Interruptions can be postponed or suppressed by the user, except interruptions involving an emergency.", + "uri": "http://www.w3.org/TR/WCAG20/#time-limits-postponed", + "techniques": [ + "F40", + "F41", + "G75", + "G76", + "SCR14" + ] + }, + "2.2.5": { + "id": "time-limits-server-timeout", + "title": "Re-authenticating", + "description": "When an authenticated session expires, the user can continue the activity without loss of data after re-authenticating.", + "uri": "http://www.w3.org/TR/WCAG20/#time-limits-server-timeout", + "techniques": [ + "F12", + "G105", + "G181" + ] + }, + "2.3.1": { + "id": "seizure-does-not-violate", + "title": "Three Flashes or Below Threshold", + "description": "Web pages do not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.", + "uri": "http://www.w3.org/TR/WCAG20/#seizure-does-not-violate", + "techniques": [ + "G15", + "G19", + "G176" + ] + }, + "2.3.2": { + "id": "seizure-three-times", + "title": "Three Flashes", + "description": "Web pages do not contain anything that flashes more than three times in any one second period.", + "uri": "http://www.w3.org/TR/WCAG20/#seizure-three-times", + "techniques": [ + "G19" + ] + }, + "2.4.1": { + "id": "navigation-mechanisms-skip", + "title": "Bypass Blocks", + "description": "A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.", + "uri": "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-skip", + "techniques": [ + "C6", + "G1", + "G123", + "G124", + "H64", + "H69", + "H70", + "SCR28", + "SL25", + "SL29" + ] + }, + "2.4.2": { + "id": "navigation-mechanisms-title", + "title": "Page Titled", + "description": "Web pages have titles that describe topic or purpose.", + "uri": "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-title", + "techniques": [ + "ARIA1", + "F25", + "G88", + "G127", + "H25" + ] + }, + "2.4.3": { + "id": "navigation-mechanisms-focus-order", + "title": "Focus Order", + "description": "If a Web page can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.", + "uri": "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-focus-order", + "techniques": [ + "C27", + "F44", + "F85", + "FLASH15", + "G59", + "H4", + "SCR26", + "SCR27", + "SCR37", + "SL34" + ] + }, + "2.4.4": { + "id": "navigation-mechanisms-refs", + "title": "Link Purpose (In Context)", + "description": "The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link context, except where the purpose of the link would be ambiguous to users in general.", + "uri": "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-refs", + "techniques": [ + "ARIA1", + "C7", + "F63", + "F89", + "FLASH5", + "FLASH7", + "FLASH27", + "G53", + "G91", + "G189", + "H2", + "H24", + "H30", + "H33", + "H77", + "H78", + "H79", + "H80", + "H81", + "SCR30", + "SL18" + ] + }, + "2.4.5": { + "id": "navigation-mechanisms-mult-loc", + "title": "Multiple Ways", + "description": "More than one way is available to locate a Web page within a set of Web pages except where the Web Page is the result of, or a step in, a process.", + "uri": "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-mult-loc", + "techniques": [ + "G63", + "G64", + "G125", + "G126", + "G161", + "G185", + "H59" + ] + }, + "2.4.6": { + "id": "navigation-mechanisms-descriptive", + "title": "Headings and Labels", + "description": "Headings and labels describe topic or purpose.", + "uri": "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-descriptive", + "techniques": [ + "G130", + "G131" + ] + }, + "2.4.7": { + "id": "navigation-mechanisms-focus-visible", + "title": "Focus Visible", + "description": "Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.", + "uri": "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-focus-visible", + "techniques": [ + "C15", + "F55", + "F78", + "FLASH20", + "G149", + "G165", + "G195", + "SCR31", + "SL2", + "SL7" + ] + }, + "2.4.8": { + "id": "navigation-mechanisms-location", + "title": "Location", + "description": "Information about the user's location within a set of Web pages is available.", + "uri": "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-location", + "techniques": [ + "G63", + "G65", + "G127", + "G128", + "H59" + ] + }, + "2.4.9": { + "id": "navigation-mechanisms-link", + "title": "Link Purpose (Link Only)", + "description": "A mechanism is available to allow the purpose of each link to be identified from link text alone, except where the purpose of the link would be ambiguous to users in general.", + "uri": "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-link", + "techniques": [ + "C7", + "F84", + "F89", + "FLASH5", + "FLASH7", + "FLASH27", + "G91", + "G189", + "H2", + "H24", + "H30", + "H33", + "SCR30", + "SL18" + ] + }, + "2.4.10": { + "id": "navigation-mechanisms-headings", + "title": "Section Headings", + "description": "Section headings are used to organize the content.", + "uri": "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-headings", + "techniques": [ + "G141" + ] + }, + "3.1.1": { + "id": "meaning-doc-lang-id", + "title": "Language of Page", + "description": "The default human language of each Web page can be programmatically determined.", + "uri": "http://www.w3.org/TR/WCAG20/#meaning-doc-lang-id", + "techniques": [ + "FLASH13", + "H57", + "SVR5" + ] + }, + "3.1.2": { + "id": "meaning-other-lang-id", + "title": "Language of Parts", + "description": "The human language of each passage or phrase in the content can be programmatically determined except for proper names, technical terms, words of indeterminate language, and words or phrases that have become part of the vernacular of the immediately surrounding text.", + "uri": "http://www.w3.org/TR/WCAG20/#meaning-other-lang-id", + "techniques": [ + "FLASH13", + "H58", + "SL4", + "SL27" + ] + }, + "3.1.3": { + "id": "meaning-idioms", + "title": "Unusual Words", + "description": "A mechanism is available for identifying specific definitions of words or phrases used in an unusual or restricted way, including idioms and jargon.", + "uri": "http://www.w3.org/TR/WCAG20/#meaning-idioms", + "techniques": [ + "G55", + "G62", + "G70", + "G101", + "G112", + "H40", + "H54", + "H60" + ] + }, + "3.1.4": { + "id": "meaning-located", + "title": "Abbreviations", + "description": "A mechanism for identifying the expanded form or meaning of abbreviations is available.", + "uri": "http://www.w3.org/TR/WCAG20/#meaning-located", + "techniques": [ + "G55", + "G62", + "G70", + "G97", + "G102", + "H28", + "H60" + ] + }, + "3.1.5": { + "id": "meaning-supplements", + "title": "Reading Level", + "description": "When text requires reading ability more advanced than the lower secondary education level after removal of proper names and titles, supplemental content, or a version that does not require reading ability more advanced than the lower secondary education level, is available.", + "uri": "http://www.w3.org/TR/WCAG20/#meaning-supplements", + "techniques": [ + "G79", + "G86", + "G103", + "G153", + "G160" + ] + }, + "3.1.6": { + "id": "meaning-pronunciation", + "title": "Pronunciation", + "description": "A mechanism is available for identifying specific pronunciation of words where meaning of the words, in context, is ambiguous without knowing the pronunciation.", + "uri": "http://www.w3.org/TR/WCAG20/#meaning-pronunciation", + "techniques": [ + "G62", + "G120", + "G121", + "G163", + "H62" + ] + }, + "3.2.1": { + "id": "consistent-behavior-receive-focus", + "title": "On Focus", + "description": "When any user interface component receives focus, it does not initiate a change of context.", + "uri": "http://www.w3.org/TR/WCAG20/#consistent-behavior-receive-focus", + "techniques": [ + "F52", + "F55", + "G107", + "G200", + "G201" + ] + }, + "3.2.2": { + "id": "consistent-behavior-unpredictable-change", + "title": "On Input", + "description": "Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.", + "uri": "http://www.w3.org/TR/WCAG20/#consistent-behavior-unpredictable-change", + "techniques": [ + "F36", + "F37", + "F76", + "FLASH4", + "G13", + "G80", + "G201", + "H32", + "H84", + "SCR19", + "SL10" + ] + }, + "3.2.3": { + "id": "consistent-behavior-consistent-locations", + "title": "Consistent Navigation", + "description": "Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.", + "uri": "http://www.w3.org/TR/WCAG20/#consistent-behavior-consistent-locations", + "techniques": [ + "F66", + "G61" + ] + }, + "3.2.4": { + "id": "consistent-behavior-consistent-functionality", + "title": "Consistent Identification", + "description": "Components that have the same functionality within a set of Web pages are identified consistently.", + "uri": "http://www.w3.org/TR/WCAG20/#consistent-behavior-consistent-functionality", + "techniques": [ + "F31", + "G197" + ] + }, + "3.2.5": { + "id": "consistent-behavior-no-extreme-changes-context", + "title": "Change on Request", + "description": "Changes of context are initiated only by user request or a mechanism is available to turn off such changes.", + "uri": "http://www.w3.org/TR/WCAG20/#consistent-behavior-no-extreme-changes-context", + "techniques": [ + "F9", + "F22", + "F41", + "F52", + "F60", + "F61", + "G76", + "G110", + "G200", + "H76", + "H83", + "SCR19", + "SCR24", + "SVR1" + ] + }, + "3.3.1": { + "id": "minimize-error-identified", + "title": "Error Identification", + "description": "If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.", + "uri": "http://www.w3.org/TR/WCAG20/#minimize-error-identified", + "techniques": [ + "FLASH12", + "G83", + "G84", + "G85", + "G139", + "G199", + "SCR18", + "SCR32", + "SL35" + ] + }, + "3.3.2": { + "id": "minimize-error-cues", + "title": "Labels or Instructions", + "description": "Labels or instructions are provided when content requires user input.", + "uri": "http://www.w3.org/TR/WCAG20/#minimize-error-cues", + "techniques": [ + "ARIA1", + "ARIA2", + "F82", + "FLASH8", + "FLASH10", + "FLASH25", + "FLASH29", + "FLASH32", + "G13", + "G83", + "G89", + "G131", + "G162", + "G167", + "G184", + "H44", + "H65", + "H71", + "H90", + "SL8", + "SL19", + "SL26" + ] + }, + "3.3.3": { + "id": "minimize-error-suggestions", + "title": "Error Suggestion", + "description": "If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.", + "uri": "http://www.w3.org/TR/WCAG20/#minimize-error-suggestions", + "techniques": [ + "ARIA2", + "ARIA3", + "FLASH12", + "G83", + "G84", + "G85", + "G139", + "G177", + "G199", + "SCR18", + "SCR32", + "SL35" + ] + }, + "3.3.4": { + "id": "minimize-error-reversible", + "title": "Error Prevention (Legal, Financial, Data)", + "description": "For Web pages that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, at least one of the following is true:", + "uri": "http://www.w3.org/TR/WCAG20/#minimize-error-reversible", + "techniques": [ + "G98", + "G99", + "G155", + "G164", + "G168", + "G199", + "SCR18", + "SL35" + ] + }, + "3.3.5": { + "id": "minimize-error-context-help", + "title": "Help", + "description": "Context-sensitive help is available.", + "uri": "http://www.w3.org/TR/WCAG20/#minimize-error-context-help", + "techniques": [ + "G71", + "G89", + "G184", + "G193", + "G194", + "H89" + ] + }, + "3.3.6": { + "id": "minimize-error-reversible-all", + "title": "Error Prevention (All)", + "description": "For Web pages that require the user to submit information, at least one of the following is true:", + "uri": "http://www.w3.org/TR/WCAG20/#minimize-error-reversible-all", + "techniques": [ + "G98", + "G99", + "G155", + "G164", + "G168", + "G199" + ] + }, + "4.1.1": { + "id": "ensure-compat-parses", + "title": "Parsing", + "description": "In content implemented using markup languages, elements have complete start and end tags, elements are nested according to their specifications, elements do not contain duplicate attributes, and any IDs are unique, except where the specifications allow these features.", + "uri": "http://www.w3.org/TR/WCAG20/#ensure-compat-parses", + "techniques": [ + "F17", + "F62", + "F70", + "F77", + "G134", + "G192", + "H74", + "H75", + "H88", + "H93", + "H94", + "SL33" + ] + }, + "4.1.2": { + "id": "ensure-compat-rsv", + "title": "Name, Role, Value", + "description": "For all user interface components (including but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.", + "uri": "http://www.w3.org/TR/WCAG20/#ensure-compat-rsv", + "techniques": [ + "F15", + "F20", + "F59", + "F68", + "F79", + "F86", + "F89", + "FLASH29", + "FLASH30", + "FLASH32", + "G10", + "G108", + "G135", + "H44", + "H64", + "H65", + "H88", + "H91", + "SL6", + "SL18", + "SL20", + "SL26", + "SL30", + "SL32" + ] + } + }, + "techniques": { + "ARIA1": { + "description": "Using the aria-describedby property to provide a descriptive label for input controls" + }, + "ARIA2": { + "description": "Identifying required fields with the aria-required property" + }, + "ARIA3": { + "description": "Identifying valid range information with the aria-valuemin and aria-valuemax properties" + }, + "C6": { + "description": "Positioning content based on structural markup" + }, + "C7": { + "description": "Using CSS to hide a portion of the link text" + }, + "C8": { + "description": "Using CSS letter-spacing to control spacing within a word" + }, + "C9": { + "description": "Using CSS to include decorative images" + }, + "C12": { + "description": "Using percent for font sizes" + }, + "C13": { + "description": "Using named font sizes" + }, + "C14": { + "description": "Using em units for font sizes" + }, + "C15": { + "description": "Using CSS to change the presentation of a user interface component when it receives focus" + }, + "C17": { + "description": "Scaling form elements which contain text" + }, + "C18": { + "description": "Using CSS margin and padding rules instead of spacer images for layout design" + }, + "C19": { + "description": "Specifying alignment either to the left OR right in CSS" + }, + "C20": { + "description": "Using relative measurements to set column widths so that lines can average 80 characters or less when the browser is resized" + }, + "C21": { + "description": "Specifying line spacing in CSS" + }, + "C22": { + "description": "Using CSS to control visual presentation of text" + }, + "C23": { + "description": "Specifying text and background colors of secondary content such as banners, features and navigation in CSS while not specifying text and background colors of the main content" + }, + "C24": { + "description": "Using percentage values in CSS for container sizes" + }, + "C25": { + "description": "Specifying borders and layout in CSS to delineate areas of a Web page while not specifying text and text-background colors" + }, + "C26": { + "description": "Providing options within the content to switch to a layout that does not require the user to scroll horizontally to read a line of text" + }, + "C27": { + "description": "Making the DOM order match the visual order" + }, + "C28": { + "description": "Specifying the size of text containers using em units" + }, + "C30": { + "description": "Using CSS to replace text with images of text and providing user interface controls to switch" + }, + "F1": { + "description": "Failure of Success Criterion 1.3.2 due to changing the meaning of content by positioning information with CSS" + }, + "F2": { + "description": "Failure of Success Criterion 1.3.1 due to using changes in text presentation to convey information without using the appropriate markup or text" + }, + "F3": { + "description": "Failure of Success Criterion 1.1.1 due to using CSS to include images that convey important information" + }, + "F4": { + "description": "Failure of Success Criterion 2.2.2 due to using text-decoration:blink without a mechanism to stop it in less than five seconds" + }, + "F7": { + "description": "Failure of Success Criterion 2.2.2 due to an object or applet, such as Java or Flash, that has blinking content without a mechanism to pause the content that blinks for more than five seconds" + }, + "F8": { + "description": "Failure of Success Criterion 1.2.2 due to captions omitting some dialogue or important sound effects" + }, + "F9": { + "description": "Failure of Success Criterion 3.2.5 due to changing the context when the user removes focus from a form element" + }, + "F10": { + "description": "Failure of Success Criterion 2.1.2 and Conformance Requirement 5 due to combining multiple content formats in a way that traps users inside one format type" + }, + "F12": { + "description": "Failure of Success Criterion 2.2.5 due to having a session time limit without a mechanism for saving user's input and re-establishing that information upon re-authentication" + }, + "F13": { + "description": "Failure of Success Criterion 1.1.1 and 1.4.1 due to having a text alternative that does not include information that is conveyed by color differences in the image" + }, + "F14": { + "description": "Failure of Success Criterion 1.3.3 due to identifying content only by its shape or location" + }, + "F15": { + "description": "Failure of Success Criterion 4.1.2 due to implementing custom controls that do not use an accessibility API for the technology, or do so incompletely" + }, + "F16": { + "description": "Failure of Success Criterion 2.2.2 due to including scrolling content where movement is not essential to the activity without also including a mechanism to pause and restart the content" + }, + "F17": { + "description": "Failure of Success Criterion 1.3.1 and 4.1.1 due to insufficient information in DOM to determine one-to-one relationships (e.g., between labels with same id) in HTML" + }, + "F20": { + "description": "Failure of Success Criterion 1.1.1 and 4.1.2 due to not updating text alternatives when changes to non-text content occur" + }, + "F22": { + "description": "Failure of Success Criterion 3.2.5 due to opening windows that are not requested by the user" + }, + "F23": { + "description": "Failure of 1.4.2 due to playing a sound longer than 3 seconds where there is no mechanism to turn it off" + }, + "F24": { + "description": "Failure of Success Criterion 1.4.3, 1.4.6 and 1.4.8 due to specifying foreground colors without specifying background colors or vice versa" + }, + "F25": { + "description": "Failure of Success Criterion 2.4.2 due to the title of a Web page not identifying the contents" + }, + "F26": { + "description": "Failure of Success Criterion 1.3.3 due to using a graphical symbol alone to convey information" + }, + "F30": { + "description": "Failure of Success Criterion 1.1.1 and 1.2.1 due to using text alternatives that are not alternatives (e.g., filenames or placeholder text)" + }, + "F31": { + "description": "Failure of Success Criterion 3.2.4 due to using two different labels for the same function on different Web pages within a set of Web pages" + }, + "F32": { + "description": "Failure of Success Criterion 1.3.2 due to using white space characters to control spacing within a word" + }, + "F33": { + "description": "Failure of Success Criterion 1.3.1 and 1.3.2 due to using white space characters to create multiple columns in plain text content" + }, + "F34": { + "description": "Failure of Success Criterion 1.3.1 and 1.3.2 due to using white space characters to format tables in plain text content" + }, + "F36": { + "description": "Failure of Success Criterion 3.2.2 due to automatically submitting a form and presenting new content without prior warning when the last field in the form is given a value" + }, + "F37": { + "description": "Failure of Success Criterion 3.2.2 due to launching a new window without prior warning when the status of a radio button, check box or select list is changed" + }, + "F38": { + "description": "Failure of Success Criterion 1.1.1 due to omitting the alt-attribute for non-text content used for decorative purposes only in HTML" + }, + "F39": { + "description": "Failure of Success Criterion 1.1.1 due to providing a text alternative that is not null (e.g., alt='spacer' or alt='image') for images that should be ignored by assistive technology" + }, + "F40": { + "description": "Failure of Success Criterion 2.2.1 and 2.2.4 due to using meta redirect with a time limit" + }, + "F41": { + "description": "Failure of Success Criterion 2.2.1, 2.2.4, and 3.2.5 due to using meta refresh with a time-out" + }, + "F42": { + "description": "Failure of Success Criterion 1.3.1 and 2.1.1 due to using scripting events to emulate links in a way that is not programmatically determinable" + }, + "F43": { + "description": "Failure of Success Criterion 1.3.1 due to using structural markup in a way that does not represent relationships in the content" + }, + "F44": { + "description": "Failure of Success Criterion 2.4.3 due to using tabindex to create a tab order that does not preserve meaning and operability" + }, + "F46": { + "description": "Failure of Success Criterion 1.3.1 due to using th elements, caption elements, or non-empty summary attributes in layout tables" + }, + "F47": { + "description": "Failure of Success Criterion 2.2.2 due to using the blink element" + }, + "F48": { + "description": "Failure of Success Criterion 1.3.1 due to using the pre element to markup tabular information" + }, + "F49": { + "description": "Failure of Success Criterion 1.3.2 due to using an HTML layout table that does not make sense when linearized " + }, + "F50": { + "description": "Failure of Success Criterion 2.2.2 due to a script that causes a blink effect without a mechanism to stop the blinking at 5 seconds or less" + }, + "F52": { + "description": "Failure of Success Criterion 3.2.1 and 3.2.5 due to opening a new window as soon as a new page is loaded" + }, + "F54": { + "description": "Failure of Success Criterion 2.1.1 due to using only pointing-device-specific event handlers (including gesture) for a function" + }, + "F55": { + "description": "Failure of Success Criteria 2.1.1, 2.4.7, and 3.2.1 due to using script to remove focus when focus is received" + }, + "F58": { + "description": "Failure of Success Criterion 2.2.1 due to using server-side techniques to automatically redirect pages after a time-out" + }, + "F59": { + "description": "Failure of Success Criterion 4.1.2 due to using script to make div or span a user interface control in HTML" + }, + "F60": { + "description": "Failure of Success Criterion 3.2.5 due to launching a new window when a user enters text into an input field" + }, + "F61": { + "description": "Failure of Success Criterion 3.2.5 due to complete change of main content through an automatic update that the user cannot disable from within the content" + }, + "F62": { + "description": "Failure of Success Criterion 1.3.1 and 4.1.1 due to insufficient information in DOM to determine specific relationships in XML" + }, + "F63": { + "description": "Failure of Success Criterion 2.4.4 due to providing link context only in content that is not related to the link" + }, + "F65": { + "description": "Failure of Success Criterion 1.1.1 due to omitting the alt attribute on img elements, area elements, and input elements of type 'image'" + }, + "F66": { + "description": "Failure of Success Criterion 3.2.3 due to presenting navigation links in a different relative order on different pages" + }, + "F67": { + "description": "Failure of Success Criterion 1.1.1 and 1.2.1 due to providing long descriptions for non-text content that does not serve the same purpose or does not present the same information" + }, + "F68": { + "description": "Failure of Success Criterion 1.3.1 and 4.1.2 due to the association of label and user interface controls not being programmatically determinable" + }, + "F69": { + "description": "Failure of Success Criterion 1.4.4 when resizing visually rendered text up to 200 percent causes the text, image or controls to be clipped, truncated or obscured" + }, + "F70": { + "description": "Failure of Success Criterion 4.1.1 due to incorrect use of start and end tags or attribute markup" + }, + "F71": { + "description": "Failure of Success Criterion 1.1.1 due to using text look-alikes to represent text without providing a text alternative" + }, + "F72": { + "description": "Failure of Success Criterion 1.1.1 due to using ASCII art without providing a text alternative" + }, + "F73": { + "description": "Failure of Success Criterion 1.4.1 due to creating links that are not visually evident without color vision" + }, + "F74": { + "description": "Failure of Success Criterion 1.2.2 and 1.2.8 due to not labeling a synchronized media alternative to text as an alternative" + }, + "F75": { + "description": "Failure of Success Criterion 1.2.2 by providing synchronized media without captions when the synchronized media presents more information than is presented on the page" + }, + "F76": { + "description": "Failure of Success Criterion 3.2.2 due to providing instruction material about the change of context by change of setting in a user interface element at a location that users may bypass" + }, + "F77": { + "description": "Failure of Success Criterion 4.1.1 due to duplicate values of type ID" + }, + "F78": { + "description": "Failure of Success Criterion 2.4.7 due to styling element outlines and borders in a way that removes or renders non-visible the visual focus indicator" + }, + "F79": { + "description": "Failure of Success Criterion 4.1.2 due to the focus state of a user interface component not being programmatically determinable or no notification of change of focus state available" + }, + "F80": { + "description": "Failure of Success Criterion 1.4.4 when text-based form controls do not resize when visually rendered text is resized up to 200%" + }, + "F81": { + "description": "Failure of Success Criterion 1.4.1 due to identifying required or error fields using color differences only" + }, + "F82": { + "description": "Failure of Success Criterion 3.3.2 by visually formatting a set of phone number fields but not including a text label" + }, + "F83": { + "description": "Failure of Success Criterion 1.4.3 and 1.4.6 due to using background images that do not provide sufficient contrast with foreground text (or images of text)" + }, + "F84": { + "description": "Failure of Success Criterion 2.4.9 due to using a non-specific link such as 'click here' or 'more' without a mechanism to change the link text to specific text." + }, + "F85": { + "description": "Failure of Success Criterion 2.4.3 due to using dialogs or menus that are not adjacent to their trigger control in the sequential navigation order" + }, + "F86": { + "description": "Failure of Success Criterion 4.1.2 due to not providing names for each part of a multi-part form field, such as a US telephone number" + }, + "F87": { + "description": "Failure of Success Criterion 1.3.1 due to inserting non-decorative content by using :before and :after pseudo-elements and the 'content' property in CSS" + }, + "F88": { + "description": "Failure of Success Criterion 1.4.8 due to using text that is justified (aligned to both the left and the right margins)" + }, + "F89": { + "description": "Failure of Success Criteria 2.4.4, 2.4.9 and 4.1.2 due to using null alt on an image where the image is the only content in a link" + }, + "F90": { + "description": "Failure of Success Criterion 1.3.1 for incorrectly associating table headers and content via the headers and id attributes" + }, + "F91": { + "description": "Failure of Success Criterion 1.3.1 for not correctly marking up table headers" + }, + "FLASH1": { + "description": "Setting the name property for a non-text object" + }, + "FLASH2": { + "description": "Setting the description property for a non-text object in Flash" + }, + "FLASH3": { + "description": "Marking objects in Flash so that they can be ignored by AT" + }, + "FLASH4": { + "description": "Providing submit buttons in Flash" + }, + "FLASH5": { + "description": "Combining adjacent image and text buttons for the same resource" + }, + "FLASH6": { + "description": "Creating accessible hotspots using invisible buttons" + }, + "FLASH7": { + "description": "Using scripting to change control labels" + }, + "FLASH8": { + "description": "Adding a group name to the accessible name of a form control" + }, + "FLASH9": { + "description": "Applying captions to prerecorded synchronized media" + }, + "FLASH10": { + "description": "Indicating required form controls in Flash" + }, + "FLASH11": { + "description": "Providing a longer text description of an object" + }, + "FLASH12": { + "description": "Providing client-side validation and adding error text via the accessible description" + }, + "FLASH13": { + "description": "Using HTML language attributes to specify language in Flash content" + }, + "FLASH14": { + "description": "Using redundant keyboard and mouse event handlers in Flash" + }, + "FLASH15": { + "description": "Using the tabIndex property to specify a logical reading order and a logical tab order in Flash" + }, + "FLASH16": { + "description": "Making actions keyboard accessible by using the click event on standard components" + }, + "FLASH17": { + "description": "Providing keyboard access to a Flash object and avoiding a keyboard trap" + }, + "FLASH18": { + "description": "Providing a control to turn off sounds that play automatically in Flash" + }, + "FLASH19": { + "description": "Providing a script that warns the user a time limit is about to expire and provides a way to extend it" + }, + "FLASH20": { + "description": "Reskinning Flash components to provide highly visible focus indication" + }, + "FLASH21": { + "description": "Using the DataGrid component to associate column headers with cells" + }, + "FLASH22": { + "description": "Adding keyboard-accessible actions to static elements" + }, + "FLASH23": { + "description": "Adding summary information to a DataGrid" + }, + "FLASH24": { + "description": "Allowing the user to extend the default time limit" + }, + "FLASH25": { + "description": "Labeling a form control by setting its accessible name" + }, + "FLASH26": { + "description": "Applying audio descriptions to Flash video" + }, + "FLASH27": { + "description": "Providing button labels that describe the purpose of a button" + }, + "FLASH28": { + "description": "Providing text alternatives for ASCII art, emoticons, and leetspeak in Flash" + }, + "FLASH29": { + "description": "Setting the label property for form components" + }, + "FLASH30": { + "description": "Specifying accessible names for image buttons" + }, + "FLASH31": { + "description": "Specifying caption text for a DataGrid" + }, + "FLASH32": { + "description": "Using auto labeling to associate text labels with form controls" + }, + "FLASH33": { + "description": "Using relative values for Flash object dimensions" + }, + "FLASH34": { + "description": "Turning off sounds that play automatically when an assistive technology is detected" + }, + "FLASH35": { + "description": "Using script to scroll Flash content, and providing a mechanism to pause it" + }, + "FLASH36": { + "description": "Using scripts to control blinking and stop it in five seconds or less" + }, + "G1": { + "description": "Adding a link at the top of each page that goes directly to the main content area" + }, + "G4": { + "description": "Allowing the content to be paused and restarted from where it was paused" + }, + "G5": { + "description": "Allowing users to complete an activity without any time limit" + }, + "G8": { + "description": "Providing a movie with extended audio descriptions" + }, + "G9": { + "description": "Creating captions for live synchronized media" + }, + "G10": { + "description": "Creating components using a technology that supports the accessibilityAPI features of the platforms on which the user agents will be run to expose thenames and roles, allow user-settable properties to be directly set, and providenotification of changes" + }, + "G11": { + "description": "Creating content that blinks for less than 5 seconds" + }, + "G13": { + "description": "Describing what will happen before a change to a form control that causes a change of context to occur is made" + }, + "G14": { + "description": "Ensuring that information conveyed by color differences is also available in text" + }, + "G15": { + "description": "Using a tool to ensure that content does not violate the general flash threshold or red flash threshold" + }, + "G17": { + "description": "Ensuring that a contrast ratio of at least 7:1 exists between text (and images of text)and background behind the text" + }, + "G18": { + "description": "Ensuring that a contrast ratio of at least 4.5:1 exists between text (and images of text) and background behind the text" + }, + "G19": { + "description": "Ensuring that no component of the content flashes more than three times in any 1-second period" + }, + "G21": { + "description": "Ensuring that users are not trapped in content" + }, + "G53": { + "description": "Identifying the purpose of a link using link text combined with the text of the enclosing sentence" + }, + "G54": { + "description": "Including a sign language interpreter in the video stream" + }, + "G55": { + "description": "Linking to definitions" + }, + "G56": { + "description": "Mixing audio files so that non-speech sounds are at least 20 decibelslower than the speech audio content" + }, + "G57": { + "description": "Ordering the content in a meaningful sequence" + }, + "G58": { + "description": "Placing a link to the alternative for time-based media immediately next to the non-text content" + }, + "G59": { + "description": "Placing the interactive elements in an order that follows sequences and relationships within the content" + }, + "G60": { + "description": "Playing a sound that turns off automatically within three seconds" + }, + "G61": { + "description": "Presenting repeated components in the same relative order each time they appear" + }, + "G62": { + "description": "Providing a glossary" + }, + "G63": { + "description": "Providing a site map" + }, + "G64": { + "description": "Providing a Table of Contents" + }, + "G65": { + "description": "Providing a breadcrumb trail" + }, + "G68": { + "description": "Providing a short text alternative that describes the purpose of liveaudio-only and live video-only content" + }, + "G69": { + "description": "Providing an alternative for time based media" + }, + "G70": { + "description": "Providing a function to search an online dictionary" + }, + "G71": { + "description": "Providing a help link on every Web page" + }, + "G73": { + "description": "Providing a long description in another location with a link to it thatis immediately adjacent to the non-text content" + }, + "G74": { + "description": "Providing a long description in text near the non-text content, with areference to the location of the long description in the short description" + }, + "G75": { + "description": "Providing a mechanism to postpone any updating of content" + }, + "G76": { + "description": "Providing a mechanism to request an update of the content instead ofupdating automatically" + }, + "G78": { + "description": "Providing a second, user-selectable, audio track that includes audio descriptions" + }, + "G79": { + "description": "Providing a spoken version of the text" + }, + "G80": { + "description": "Providing a submit button to initiate a change of context" + }, + "G81": { + "description": "Providing a synchronized video of the sign language interpreter that canbe displayed in a different viewport or overlaid on the image by the player" + }, + "G82": { + "description": "Providing a text alternative that identifies the purpose of the non-text content" + }, + "G83": { + "description": "Providing text descriptions to identify required fields that were not completed" + }, + "G84": { + "description": "Providing a text description when the user provides information that is not in the list of allowed values" + }, + "G85": { + "description": "Providing a text description when user input falls outside the required format or values" + }, + "G86": { + "description": "Providing a text summary that requires reading ability less advanced than the upper secondary education level" + }, + "G87": { + "description": "Providing closed captions" + }, + "G88": { + "description": "Providing descriptive titles for Web pages" + }, + "G89": { + "description": "Providing expected data format and example" + }, + "G90": { + "description": "Providing keyboard-triggered event handlers" + }, + "G91": { + "description": "Providing link text that describes the purpose of a link" + }, + "G92": { + "description": "Providing long description for non-text content that serves the samepurpose and presents the same information" + }, + "G93": { + "description": "Providing open (always visible) captions" + }, + "G94": { + "description": "Providing short text alternative for non-text content that serves the same purpose and presents the same information as the non-text content" + }, + "G95": { + "description": "Providing short text alternatives that provide a brief description ofthe non-text content" + }, + "G96": { + "description": "Providing textual identification of items that otherwise rely only on sensory information to be understood" + }, + "G97": { + "description": "Providing the first use of an abbreviation immediately before or after the expanded form" + }, + "G98": { + "description": "Providing the ability for the user to review and correct answers before submitting" + }, + "G99": { + "description": "Providing the ability to recover deleted information" + }, + "G100": { + "description": "Providing a short text alternative which is the accepted name or a descriptive name of the non-text content" + }, + "G101": { + "description": "Providing the definition of a word or phrase used in an unusual or restricted way" + }, + "G102": { + "description": "Providing the expansion or explanation of an abbreviation" + }, + "G103": { + "description": "Providing visual illustrations, pictures, and symbols to help explain ideas, events, and processes" + }, + "G105": { + "description": "Saving data so that it can be used after a user re-authenticates" + }, + "G107": { + "description": "Using 'activate' rather than 'focus' as a trigger for changes of context" + }, + "G108": { + "description": "Using markup features to expose the name and role, allow user-settable properties to be directly set, and provide notification of changes" + }, + "G110": { + "description": "Using an instant client-side redirect" + }, + "G111": { + "description": "Using color and pattern" + }, + "G112": { + "description": "Using inline definitions" + }, + "G115": { + "description": "Using semantic elements to mark up structure" + }, + "G117": { + "description": "Using text to convey information that is conveyed by variations in presentation of text" + }, + "G120": { + "description": "Providing the pronunciation immediately following the word" + }, + "G121": { + "description": "Linking to pronunciations" + }, + "G123": { + "description": "Adding a link at the beginning of a block of repeated content to go to the end of the block" + }, + "G124": { + "description": "Adding links at the top of the page to each area of the content" + }, + "G125": { + "description": "Providing links to navigate to related Web pages" + }, + "G126": { + "description": "Providing a list of links to all other Web pages" + }, + "G127": { + "description": "Identifying a Web page's relationship to a larger collection of Web pages" + }, + "G128": { + "description": "Indicating current location within navigation bars" + }, + "G130": { + "description": "Providing descriptive headings" + }, + "G131": { + "description": "Providing descriptive labels" + }, + "G133": { + "description": "Providing a checkbox on the first page of a multipart form that allows users to ask for longer session time limit or no session time limit" + }, + "G134": { + "description": "Validating Web pages" + }, + "G135": { + "description": "Using the accessibility API features of a technology to expose names androles, to allow user-settable properties to be directly set, and to providenotification of changes" + }, + "G138": { + "description": "Using semantic markup whenever color cues are used" + }, + "G139": { + "description": "Creating a mechanism that allows users to jump to errors" + }, + "G140": { + "description": "Separating information and structure from presentation to enable different presentations" + }, + "G141": { + "description": "Organizing a page using headings" + }, + "G142": { + "description": "Using a technology that has commonly-available user agents that support zoom" + }, + "G143": { + "description": "Providing a text alternative that describes the purpose of the CAPTCHA" + }, + "G144": { + "description": "Ensuring that the Web Page contains another CAPTCHA serving the same purpose using a different modality" + }, + "G145": { + "description": "Ensuring that a contrast ratio of at least 3:1 exists between text (and images of text) and background behind the text" + }, + "G146": { + "description": "Using liquid layout" + }, + "G148": { + "description": "Not specifying background color, not specifying text color, and not using technology features that change those defaults" + }, + "G149": { + "description": "Using user interface components that are highlighted by the user agent when they receive focus" + }, + "G150": { + "description": "Providing text based alternatives for live audio-only content" + }, + "G151": { + "description": "Providing a link to a text transcript of a prepared statement or script if the script is followed" + }, + "G152": { + "description": "Setting animated gif images to stop blinking after n cycles (within 5 seconds)" + }, + "G153": { + "description": "Making the text easier to read" + }, + "G155": { + "description": "Providing a checkbox in addition to a submit button" + }, + "G156": { + "description": "Using a technology that has commonly-available user agents that can change the foreground and background of blocks of text" + }, + "G157": { + "description": "Incorporating a live audio captioning service into a Web page" + }, + "G158": { + "description": "Providing an alternative for time-based media for audio-only content" + }, + "G159": { + "description": "Providing an alternative for time-based media for video-only content" + }, + "G160": { + "description": "Providing sign language versions of information, ideas, and processes that must be understood in order to use the content" + }, + "G161": { + "description": "Providing a search function to help users find content" + }, + "G162": { + "description": "Positioning labels to maximize predictability of relationships" + }, + "G163": { + "description": "Using standard diacritical marks that can be turned off" + }, + "G164": { + "description": "Providing a stated time within which an online request (or transaction) may be amended or canceled by the user after making the request" + }, + "G165": { + "description": "Using the default focus indicator for the platform so that high visibility default focus indicators will carry over" + }, + "G166": { + "description": "Providing audio that describes the important video content and describing it as such" + }, + "G167": { + "description": "Using an adjacent button to label the purpose of a field" + }, + "G168": { + "description": "Requesting confirmation to continue with selected action" + }, + "G169": { + "description": "Aligning text on only one side" + }, + "G170": { + "description": "Providing a control near the beginning of the Web page that turns off sounds that play automatically" + }, + "G171": { + "description": "Playing sounds only on user request" + }, + "G172": { + "description": "Providing a mechanism to remove full justification of text" + }, + "G173": { + "description": "Providing a version of a movie with audio descriptions" + }, + "G174": { + "description": "Providing a control with a sufficient contrast ratio that allows users to switch to a presentation that uses sufficient contrast" + }, + "G175": { + "description": "Providing a multi color selection tool on the page for foreground and background colors" + }, + "G176": { + "description": "Keeping the flashing area small enough" + }, + "G177": { + "description": "Providing suggested correction text" + }, + "G178": { + "description": "Providing controls on the Web page that allow users to incrementally change the size of all text on the page up to 200 percent" + }, + "G179": { + "description": "Ensuring that there is no loss of content or functionality when the text resizes and text containers do not change their width" + }, + "G180": { + "description": "Providing the user with a means to set the time limit to 10 times the default time limit" + }, + "G181": { + "description": "Encoding user data as hidden or encrypted data in a re-authorization page" + }, + "G182": { + "description": "Ensuring that additional visual cues are available when text color differences are used to convey information" + }, + "G183": { + "description": "Using a contrast ratio of 3:1 with surrounding text and providing additional visual cues on focus for links or controls where color alone is used to identify them" + }, + "G184": { + "description": "Providing text instructions at the beginning of a form or set of fields that describes the necessary input" + }, + "G185": { + "description": "Linking to all of the pages on the site from the home page" + }, + "G186": { + "description": "Using a control in the Web page that stops moving, blinking, or auto-updating content" + }, + "G187": { + "description": "Using a technology to include blinking content that can be turned off via the user agent" + }, + "G188": { + "description": "Providing a button on the page to increase line spaces and paragraph spaces" + }, + "G189": { + "description": "Providing a control near the beginning of the Web page that changes the link text" + }, + "G191": { + "description": "Providing a link, button, or other mechanism that reloads the page without any blinking content" + }, + "G192": { + "description": "Fully conforming to specifications" + }, + "G193": { + "description": "Providing help by an assistant in the Web page" + }, + "G194": { + "description": "Providing spell checking and suggestions for text input" + }, + "G195": { + "description": "Using an author-supplied, highly visible focus indicator" + }, + "G196": { + "description": "Using a text alternative on one item within a group of images that describes all items in the group" + }, + "G197": { + "description": "Using labels, names, and text alternatives consistently for content that has the same functionality" + }, + "G198": { + "description": "Providing a way for the user to turn the time limit off" + }, + "G199": { + "description": "Providing success feedback when data is submitted successfully" + }, + "G200": { + "description": "Opening new windows and tabs from a link only when necessary" + }, + "G201": { + "description": "Giving users advanced warning when opening a new window" + }, + "G202": { + "description": "Ensuring keyboard control for all functionality" + }, + "G203": { + "description": "Using a static text alternative to describe a talking head video" + }, + "H2": { + "description": "Combining adjacent image and text links for the same resource" + }, + "H4": { + "description": "Creating a logical tab order through links, form controls, and objects" + }, + "H24": { + "description": "Providing text alternatives for the area elements of image maps " + }, + "H25": { + "description": "Providing a title using the title element" + }, + "H27": { + "description": "Providing text and non-text alternatives for object" + }, + "H28": { + "description": "Providing definitions for abbreviations by using the abbr and acronym elements" + }, + "H30": { + "description": "Providing link text that describes the purpose of a link for anchor elements" + }, + "H32": { + "description": "Providing submit buttons" + }, + "H33": { + "description": "Supplementing link text with the title attribute" + }, + "H34": { + "description": "Using a Unicode right-to-left mark (RLM) or left-to-right mark (LRM) to mix textdirection inline" + }, + "H35": { + "description": "Providing text alternatives on applet elements" + }, + "H36": { + "description": "Using alt attributes on images used as submit buttons" + }, + "H37": { + "description": "Using alt attributes on img elements" + }, + "H39": { + "description": "Using caption elements to associate data table captions with data tables" + }, + "H40": { + "description": "Using definition lists" + }, + "H42": { + "description": "Using h1-h6 to identify headings" + }, + "H43": { + "description": "Using id and headers attributes to associate data cells with header cells indata tables" + }, + "H44": { + "description": "Using label elements to associate text labels with form controls" + }, + "H45": { + "description": "Using longdesc" + }, + "H46": { + "description": "Using noembed with embed" + }, + "H48": { + "description": "Using ol, ul and dl for lists or groups of links" + }, + "H49": { + "description": "Using semantic markup to mark emphasized or special text" + }, + "H51": { + "description": "Using table markup to present tabular information" + }, + "H53": { + "description": "Using the body of the object element" + }, + "H54": { + "description": "Using the dfn element to identify the defining instance of a word" + }, + "H56": { + "description": "Using the dir attribute on an inline element to resolve problems with nested directional runs" + }, + "H57": { + "description": "Using language attributes on the html element " + }, + "H58": { + "description": "Using language attributes to identify changes in the human language " + }, + "H59": { + "description": "Using the link element and navigation tools" + }, + "H60": { + "description": "Using the link element to link to a glossary" + }, + "H62": { + "description": "Using the ruby element" + }, + "H63": { + "description": "Using the scope attribute to associate header cells and data cells in datatables" + }, + "H64": { + "description": "Using the title attribute of the frame and iframe elements" + }, + "H65": { + "description": "Using the title attribute to identify form controls when the label element cannot be used" + }, + "H67": { + "description": "Using null alt text and no title attribute on img elements for images that ATshould ignore" + }, + "H69": { + "description": "Providing heading elements at the beginning of each section of content" + }, + "H70": { + "description": "Using frame elements to group blocks of repeated material" + }, + "H71": { + "description": "Providing a description for groups of form controls using fieldset and legendelements" + }, + "H73": { + "description": "Using the summary attribute of the table element to give an overview of datatables" + }, + "H74": { + "description": "Ensuring that opening and closing tags are used according to specification" + }, + "H75": { + "description": "Ensuring that Web pages are well-formed" + }, + "H76": { + "description": "Using meta refresh to create an instant client-side redirect" + }, + "H77": { + "description": "Identifying the purpose of a link using link text combined with its enclosing list item" + }, + "H78": { + "description": "Identifying the purpose of a link using link text combined with its enclosing paragraph" + }, + "H79": { + "description": "Identifying the purpose of a link using link text combined with its enclosing table cell and associated table headings" + }, + "H80": { + "description": "Identifying the purpose of a link using link text combined with the preceding heading element" + }, + "H81": { + "description": "Identifying the purpose of a link in a nested list using link text combined with the parent list item under which the list is nested" + }, + "H83": { + "description": "Using the target attribute to open a new window on user request and indicating this in link text" + }, + "H84": { + "description": "Using a button with a select element to perform an action" + }, + "H85": { + "description": "Using OPTGROUP to group OPTION elements inside a SELECT" + }, + "H86": { + "description": "Providing text alternatives for ASCII art, emoticons, and leetspeak" + }, + "H87": { + "description": "Not interfering with the user agent's reflow of text as the viewing window is narrowed" + }, + "H88": { + "description": "Using HTML according to spec" + }, + "H89": { + "description": "Using the title attribute to provide context-sensitive help" + }, + "H90": { + "description": "Indicating required form controls using label or legend" + }, + "H91": { + "description": "Using HTML form controls and links" + }, + "H92": { + "description": "Including a text cue for colored form control labels" + }, + "H93": { + "description": "Ensuring that id attributes are unique on a Web page" + }, + "H94": { + "description": "Ensuring that elements do not contain duplicate attributes" + }, + "T1": { + "description": "Using standard text formatting conventions for paragraphs" + }, + "T2": { + "description": "Using standard text formatting conventions for lists" + }, + "T3": { + "description": "Using standard text formatting conventions for headings" + }, + "SCR1": { + "description": "Allowing the user to extend the default time limit" + }, + "SCR2": { + "description": "Using redundant keyboard and mouse event handlers" + }, + "SCR14": { + "description": "Using scripts to make nonessential alerts optional" + }, + "SCR16": { + "description": "Providing a script that warns the user a time limit is about to expire" + }, + "SCR18": { + "description": "Providing client-side validation and alert" + }, + "SCR19": { + "description": "Using an onchange event on a select element without causing a change of context" + }, + "SCR20": { + "description": "Using both keyboard and other device-specific functions" + }, + "SCR21": { + "description": "Using functions of the Document Object Model (DOM) to add content to a page" + }, + "SCR22": { + "description": "Using scripts to control blinking and stop it in five seconds or less" + }, + "SCR24": { + "description": "Using progressive enhancement to open new windows on user request" + }, + "SCR26": { + "description": "Inserting dynamic content into the Document Object Model immediately following its trigger element" + }, + "SCR27": { + "description": "Reordering page sections using the Document Object Model" + }, + "SCR28": { + "description": "Using an expandable and collapsible menu to bypass block of content" + }, + "SCR29": { + "description": "Adding keyboard-accessible actions to static HTML elements" + }, + "SCR30": { + "description": "Using scripts to change the link text" + }, + "SCR31": { + "description": "Using script to change the background color or border of the element with focus" + }, + "SCR32": { + "description": "Providing client-side validation and adding error text via the DOM" + }, + "SCR33": { + "description": "Using script to scroll content, and providing a mechanism to pause it" + }, + "SCR34": { + "description": "Calculating size and position in a way that scales with text size" + }, + "SCR35": { + "description": "Making actions keyboard accessible by using the onclick event of anchors and buttons" + }, + "SCR36": { + "description": "Providing a mechanism to allow users to display moving, scrolling, or auto-updating text in a static window or area" + }, + "SCR37": { + "description": "Creating Custom Dialogs in a Device Independent Way" + }, + "SVR1": { + "description": "Implementing automatic redirects on the server side instead of on the client side" + }, + "SVR5": { + "description": "Specifying the default language in the HTTP header" + }, + "SL1": { + "description": "Accessing Alternate Audio Tracks in Silverlight Media" + }, + "SL2": { + "description": "Changing The Visual Focus Indicator in Silverlight" + }, + "SL3": { + "description": "Controlling Silverlight MediaElement Audio Volume" + }, + "SL4": { + "description": "Declaring Discrete Silverlight Objects to Specify Language Parts in the HTML DOM" + }, + "SL5": { + "description": "Defining a Focusable Image Class for Silverlight" + }, + "SL6": { + "description": "Defining a UI Automation Peer for a Custom Silverlight Control" + }, + "SL7": { + "description": "Designing a Focused Visual State for Custom Silverlight Controls" + }, + "SL8": { + "description": "Displaying HelpText in Silverlight User Interfaces" + }, + "SL9": { + "description": "Handling Key Events to Enable Keyboard Functionality in Silverlight" + }, + "SL10": { + "description": "Implementing a Submit-Form Pattern in Silverlight" + }, + "SL11": { + "description": "Pausing or Stopping A Decorative Silverlight Animation" + }, + "SL12": { + "description": "Pausing, Stopping, or Playing Media in Silverlight MediaElements" + }, + "SL13": { + "description": "Providing A Style Switcher To Switch To High Contrast" + }, + "SL14": { + "description": "Providing Custom Control Key Handling for Keyboard Functionality in Silverlight" + }, + "SL15": { + "description": "Providing Keyboard Shortcuts that Work Across the Entire Silverlight Application" + }, + "SL16": { + "description": "Providing Script-Embedded Text Captions for MediaElement Content" + }, + "SL17": { + "description": "Providing Static Alternative Content for Silverlight Media Playing in a MediaElement" + }, + "SL18": { + "description": "Providing Text Equivalent for Nontext Silverlight Controls With AutomationProperties.Name" + }, + "SL19": { + "description": "Providing User Instructions With AutomationProperties.HelpText in Silverlight" + }, + "SL20": { + "description": "Relying on Silverlight AutomationPeer Behavior to Set AutomationProperties.Name" + }, + "SL21": { + "description": "Replacing A Silverlight Timed Animation With a Nonanimated Element" + }, + "SL22": { + "description": "Supporting Browser Zoom in Silverlight" + }, + "SL23": { + "description": "Using A Style Switcher to Increase Font Size of Silverlight Text Elements" + }, + "SL24": { + "description": "Using AutoPlay to Keep Silverlight Media from Playing Automatically" + }, + "SL25": { + "description": "Using Controls and Programmatic Focus to Bypass Blocks of Content in Silverlight" + }, + "SL26": { + "description": "Using LabeledBy to Associate Labels and Targets in Silverlight" + }, + "SL27": { + "description": "Using Language/Culture Properties as Exposed by Silverlight Applications and Assistive Technologies" + }, + "SL28": { + "description": "Using Separate Text-Format Text Captions for MediaElement Content" + }, + "SL29": { + "description": "Using Silverlight 'List' Controls to Define Blocks that can be Bypassed" + }, + "SL30": { + "description": "Using Silverlight Control Compositing and AutomationProperties.Name" + }, + "SL31": { + "description": "Using Silverlight Font Properties to Control Text Presentation" + }, + "SL32": { + "description": "Using Silverlight Text Elements for Appropriate Accessibility Role" + }, + "SL33": { + "description": "Using Well-Formed XAML to Define a Silverlight User Interface" + }, + "SL34": { + "description": "Using the Silverlight Default Tab Sequence and Altering Tab Sequences With Properties" + }, + "SL35": { + "description": "Using the Validation and ValidationSummary APIs to Implement Client Side Forms Validation in Silverlight" + }, + "SM1": { + "description": "Adding extended audio description in SMIL 1.0" + }, + "SM2": { + "description": "Adding extended audio description in SMIL 2.0" + }, + "SM6": { + "description": "Providing audio description in SMIL 1.0" + }, + "SM7": { + "description": "Providing audio description in SMIL 2.0" + }, + "SM11": { + "description": "Providing captions through synchronized text streams in SMIL 1.0" + }, + "SM12": { + "description": "Providing captions through synchronized text streams in SMIL 2.0" + }, + "SM13": { + "description": "Providing sign language interpretation through synchronized video streams in SMIL 1.0" + }, + "SM14": { + "description": "Providing sign language interpretation through synchronized video streams in SMIL 2.0" + } + } +} \ No newline at end of file diff --git a/dist/guidelines/wcag.tests.json b/dist/guidelines/wcag.tests.json new file mode 100644 index 000000000..5fa6681d2 --- /dev/null +++ b/dist/guidelines/wcag.tests.json @@ -0,0 +1 @@ +["aAdjacentWithSameResourceShouldBeCombined","aImgAltNotRepetative","aLinkTextDoesNotBeginWithRedundantWord","aLinksDontOpenNewWindow","aLinksToMultiMediaRequireTranscript","aLinksToSoundFilesNeedTranscripts","aMustContainText","aSuspiciousLinkText","aTitleDescribesDestination","appletContainsTextEquivalent","appletContainsTextEquivalentInAlt","appletTextEquivalentsGetUpdated","appletUIMustBeAccessible","appletsDoNotFlicker","areaAltIdentifiesDestination","areaHasAltValue","areaLinksToSoundFile","blinkIsNotUsed","blockquoteNotUsedForIndentation","blockquoteUseForQuotations","checkboxHasLabel","cssDocumentMakesSenseStyleTurnedOff","cssTextHasContrast","documentAbbrIsUsed","documentAcronymsHaveElement","documentContentReadableWithoutStylesheets","documentHasTitleElement","documentIDsMustBeUnique","documentIsWrittenClearly","documentLangIsISO639Standard","documentMetaNotUsedWithTimeout","documentReadingDirection","documentTitleDescribesDocument","documentTitleIsNotPlaceholder","documentTitleNotEmpty","documentValidatesToDocType","documentVisualListsAreMarkedUp","documentWordsNotInLanguageAreMarked","embedHasAssociatedNoEmbed","embedProvidesMechanismToReturnToParent","emoticonsExcessiveUse","emoticonsMissingAbbr","fileHasLabel","formWithRequiredLabel","frameTitlesDescribeFunction","frameTitlesNotEmpty","frameTitlesNotPlaceholder","framesHaveATitle","headerH1","headerH1Format","headerH2","headerH2Format","headerH3","headerH3Format","headerH4","headerH4Format","headerH5","headerH5Format","headerH6Format","headersHaveText","headersUseToMarkSections","imgAltEmptyForDecorativeImages","imgAltIsDifferent","imgAltIsSameInText","imgAltIsTooLong","imgAltNotEmptyInAnchor","imgAltNotPlaceHolder","imgGifNoFlicker","imgHasAlt","imgHasLongDesc","imgNonDecorativeHasAlt","imgNotReferredToByColorAlone","inputCheckboxRequiresFieldset","inputImageAltIdentifiesPurpose","inputImageAltIsNotFileName","inputImageAltIsNotPlaceholder","inputImageAltIsShort","inputImageAltNotRedundant","inputImageHasAlt","inputImageNotDecorative","inputTextHasLabel","labelMustBeUnique","labelMustNotBeEmpty","legendDescribesListOfChoices","legendTextNotEmpty","legendTextNotPlaceholder","listNotUsedForFormatting","objectDoesNotFlicker","objectMustContainText","objectMustHaveTitle","pNotUsedAsHeader","paragarphIsWrittenClearly","passwordHasLabel","preShouldNotBeUsedForTabularLayout","radioHasLabel","radioMarkedWithFieldgroupAndLegend","scriptOnclickRequiresOnKeypress","scriptOndblclickRequiresOnKeypress","scriptOnmousedownRequiresOnKeypress","scriptOnmousemove","scriptOnmouseoutHasOnmouseblur","scriptOnmouseoverHasOnfocus","scriptOnmouseupHasOnkeyup","scriptsDoNotFlicker","selectHasAssociatedLabel","selectJumpMenu","selectWithOptionsHasOptgroup","siteMap","skipToContentLinkProvided","svgContainsTitle","tabIndexFollowsLogicalOrder","tableCaptionIdentifiesTable","tableComplexHasSummary","tableDataShouldHaveTh","tableLayoutDataShouldNotHaveTh","tableLayoutHasNoCaption","tableLayoutHasNoSummary","tableNotUsedForLayout","tableUsesCaption","tableUsesScopeForRow","tableWithBothHeadersUseScope","tabularDataIsInTable","textareaHasAssociatedLabel","videoProvidesCaptions","videosEmbeddedOrLinkedNeedCaptions"] \ No newline at end of file diff --git a/dist/quail.jquery.js b/dist/quail.jquery.js new file mode 100644 index 000000000..898bb65ba --- /dev/null +++ b/dist/quail.jquery.js @@ -0,0 +1,1748 @@ +/*! QUAIL quailjs.org | quailjs.org/license */ +;(function($) { +$.fn.quail = function(options) { + if (!this.length) { + return this; + } + quail.options = options; + + quail.html = this; + quail.run(); + + return this; +}; + +$.expr[':'].quailCss = function(obj, index, meta, stack) { + var args = meta[3].split(/\s*=\s*/); + return $(obj).css(args[0]).search(args[1]) > -1; +}; + +var quail = { + + options : { }, + + components : { }, + + testabilityTranslation : { + 0 : 'suggestion', + 0.5 : 'moderate', + 1 : 'severe' + }, + + html : { }, + + strings : { }, + + accessibilityResults : { }, + + accessibilityTests : { }, + + /** + * A list of HTML elements that can contain actual text. + */ + textSelector : 'p, h1, h2, h3, h4, h5, h6, div, pre, blockquote, aside, article, details, summary, figcaption, footer, header, hgroup, nav, section, strong, em, del, i, b', + + /** + * Suspect tags that would indicate a paragraph is being used as a header. + * I know, font tag, I know. Don't get me started. + */ + suspectPHeaderTags : ['strong', 'b', 'em', 'i', 'u', 'font'], + + /** + * Suspect CSS styles that might indicate a paragarph tag is being used as a header. + */ + suspectPCSSStyles : ['color', 'font-weight', 'font-size', 'font-family'], + + /** + * Main run function for quail. It bundles up some accessibility tests, + * and if tests are not passed, it instead fetches them using getJSON. + */ + run : function() { + if(quail.options.reset) { + quail.accessibilityResults = { }; + } + if(typeof quail.options.accessibilityTests !== 'undefined') { + quail.accessibilityTests = quail.options.accessibilityTests; + } + else { + $.ajax({ url : quail.options.jsonPath + '/tests.json', + async : false, + dataType : 'json', + success : function(data) { + if(typeof data === 'object') { + quail.accessibilityTests = data; + } + }}); + } + if(typeof quail.options.customTests !== 'undefined') { + for (var testName in quail.options.customTests) { + quail.accessibilityTests[testName] = quail.options.customTests[testName]; + } + } + if(typeof quail.options.guideline === 'string') { + $.ajax({ url : quail.options.jsonPath + '/guidelines/' + quail.options.guideline +'.tests.json', + async : false, + dataType : 'json', + success : function(data) { + quail.options.guideline = data; + }}); + } + if(typeof quail.options.guideline === 'undefined') { + quail.options.guideline = [ ]; + for (var guidelineTestName in quail.accessibilityTests) { + quail.options.guideline.push(guidelineTestName); + } + } + + quail.runTests(); + if(typeof quail.options.complete !== 'undefined') { + var results = {totals : {severe : 0, moderate : 0, suggestion : 0 }, + results : quail.accessibilityResults }; + $.each(results.results, function(testName, result) { + results.totals[quail.testabilityTranslation[quail.accessibilityTests[testName].testability]] += result.length; + }); + quail.options.complete(results); + } + }, + + getConfiguration : function(testName) { + if(typeof this.options.guidelineName === 'undefined' || + typeof this.accessibilityTests[testName].guidelines === 'undefined' || + typeof this.accessibilityTests[testName].guidelines[this.options.guidelineName] === 'undefined' || + typeof this.accessibilityTests[testName].guidelines[this.options.guidelineName].configuration === 'undefined') { + return false; + } + return this.accessibilityTests[testName].guidelines[this.options.guidelineName].configuration; + }, + + /** + * Utility function called whenever a test fails. + * If there is a callback for testFailed, then it + * packages the object and calls it. + */ + testFails : function(testName, $element, options) { + options = options || {}; + + if(typeof quail.options.preFilter !== 'undefined') { + if(quail.options.preFilter(testName, $element, options) === false) { + return; + } + } + + quail.accessibilityResults[testName].push($element); + if(typeof quail.options.testFailed !== 'undefined') { + var testability = (typeof quail.accessibilityTests[testName].testability !== 'undefined') ? + quail.accessibilityTests[testName].testability : + 'unknown'; + var severity = + quail.options.testFailed({element : $element, + testName : testName, + testability : testability, + severity : quail.testabilityTranslation[testability], + options : options + }); + } + }, + + /** + * Iterates over all the tests in the provided guideline and + * figures out which function or object will handle it. + * Custom callbacks are included directly, others might be part of a category + * of tests. + */ + runTests : function() { + $.each(quail.options.guideline, function(index, testName) { + if(typeof quail.accessibilityTests[testName] === 'undefined') { + return; + } + var testType = quail.accessibilityTests[testName].type; + if(typeof quail.accessibilityResults[testName] === 'undefined') { + quail.accessibilityResults[testName] = [ ]; + } + if(testType === 'selector') { + quail.html.find(quail.accessibilityTests[testName].selector).each(function() { + quail.testFails(testName, $(this)); + }); + } + if(testType === 'custom') { + if(typeof quail.accessibilityTests[testName].callback === 'object' || + typeof quail.accessibilityTests[testName].callback === 'function') { + quail.accessibilityTests[testName].callback(quail); + } + else { + if(typeof quail[quail.accessibilityTests[testName].callback] !== 'undefined') { + quail[quail.accessibilityTests[testName].callback](); + } + } + } + if(typeof quail.components[testType] !== 'undefined') { + quail.components[testType](testName, quail.accessibilityTests[testName]); + } + }); + }, + + /** + * Helper function to determine if a string of text is even readable. + * @todo - This will be added to in the future... we should also include + * phonetic tests. + */ + isUnreadable : function(text) { + if(typeof text !== 'string') { + return true; + } + return (text.trim().length) ? false : true; + }, + + /** + * Read more about this function here: https://github.com/kevee/quail/wiki/Layout-versus-data-tables + */ + isDataTable : function(table) { + //If there are less than three rows, why do a table? + if(table.find('tr').length < 3) { + return false; + } + //If you are scoping a table, it's probably not being used for layout + if(table.find('th[scope]').length) { + return true; + } + var numberRows = table.find('tr:has(td)').length; + //Check for odd cell spanning + var spanCells = table.find('td[rowspan], td[colspan]'); + var isDataTable = true; + if(spanCells.length) { + var spanIndex = {}; + spanCells.each(function() { + if(typeof spanIndex[$(this).index()] === 'undefined') { + spanIndex[$(this).index()] = 0; + } + spanIndex[$(this).index()]++; + }); + $.each(spanIndex, function(index, count) { + if(count < numberRows) { + isDataTable = false; + } + }); + } + //If there are sub tables, but not in the same column row after row, this is a layout table + var subTables = table.find('table'); + if(subTables.length) { + var subTablesIndexes = {}; + subTables.each(function() { + var parentIndex = $(this).parent('td').index(); + if(parentIndex !== false && typeof subTablesIndexes[parentIndex] === 'undefined') { + subTablesIndexes[parentIndex] = 0; + } + subTablesIndexes[parentIndex]++; + }); + $.each(subTablesIndexes, function(index, count) { + if(count < numberRows) { + isDataTable = false; + } + }); + } + return isDataTable; + }, + + /** + * Helper function to determine if a given URL is even valid. + */ + validURL : function(url) { + return (url.search(' ') === -1) ? true : false; + }, + + cleanString : function(string) { + return string.toLowerCase().replace(/^\s\s*/, ''); + }, + + containsReadableText : function(element, children) { + element = element.clone(); + element.find('option').remove(); + if(!quail.isUnreadable(element.text())) { + return true; + } + if(!quail.isUnreadable(element.attr('alt'))) { + return true; + } + if(children) { + var readable = false; + element.find('*').each(function() { + if(quail.containsReadableText($(this), true)) { + readable = true; + } + }); + if(readable) { + return true; + } + } + return false; + } +}; + +quail.components.acronym = function(testName, acronymTag) { + var predefined = { }; + var alreadyReported = { }; + quail.html.find('acronym[title], abbr[title]').each(function() { + predefined[$(this).text().toUpperCase()] = $(this).attr('title'); + }); + quail.html.find('p, div, h1, h2, h3, h4, h5').each(function(){ + var $el = $(this); + var words = $(this).text().split(' '); + if(words.length > 1 && $(this).text().toUpperCase() !== $(this).text()) { + $.each(words, function(index, word) { + word = word.replace(/[^a-zA-Zs]/, ''); + if(word.toUpperCase() === word && + word.length > 1 && + typeof predefined[word.toUpperCase()] === 'undefined') { + if(typeof alreadyReported[word.toUpperCase()] === 'undefined') { + quail.testFails(testName, $el, {acronym : word.toUpperCase()}); + } + alreadyReported[word.toUpperCase()] = word; + } + }); + } + }); +}; +quail.components.color = function(testName, options) { + if(options.bodyForegroundAttribute && options.bodyBackgroundAttribute) { + var $body = quail.html.find('body').clone(false, false); + var foreground = $body.attr(options.bodyForegroundAttribute); + var background = $body.attr(options.bodyBackgroundAttribute); + if(typeof foreground === 'undefined') { + foreground = 'rgb(0,0,0)'; + } + if(typeof background === 'undefined') { + foreground = 'rgb(255,255,255)'; + } + $body.css('color', foreground); + $body.css('background-color', background); + if((options.algorithm === 'wcag' && !quail.colors.passesWCAG($body)) || + (options.algorithm === 'wai' && !quail.colors.passesWAI($body))) { + quail.testFails(testName, $body); + } + } + quail.html.find(options.selector).filter(quail.textSelector).each(function() { + if(!quail.isUnreadable($(this).text()) && + (options.algorithm === 'wcag' && !quail.colors.passesWCAG($(this))) || + (options.algorithm === 'wai' && !quail.colors.passesWAI($(this)))) { + quail.testFails(testName, $(this)); + } + }); +}; + +/** + * Utility object to test for color contrast. + */ +quail.colors = { + + getLuminosity : function(foreground, background) { + foreground = this.cleanup(foreground); + background = this.cleanup(background); + + var RsRGB = foreground.r/255; + var GsRGB = foreground.g/255; + var BsRGB = foreground.b/255; + var R = (RsRGB <= 0.03928) ? RsRGB/12.92 : Math.pow((RsRGB+0.055)/1.055, 2.4); + var G = (GsRGB <= 0.03928) ? GsRGB/12.92 : Math.pow((GsRGB+0.055)/1.055, 2.4); + var B = (BsRGB <= 0.03928) ? BsRGB/12.92 : Math.pow((BsRGB+0.055)/1.055, 2.4); + + var RsRGB2 = background.r/255; + var GsRGB2 = background.g/255; + var BsRGB2 = background.b/255; + var R2 = (RsRGB2 <= 0.03928) ? RsRGB2/12.92 : Math.pow((RsRGB2+0.055)/1.055, 2.4); + var G2 = (GsRGB2 <= 0.03928) ? GsRGB2/12.92 : Math.pow((GsRGB2+0.055)/1.055, 2.4); + var B2 = (BsRGB2 <= 0.03928) ? BsRGB2/12.92 : Math.pow((BsRGB2+0.055)/1.055, 2.4); + var l1, l2; + l1 = (0.2126 * R + 0.7152 * G + 0.0722 * B); + l2 = (0.2126 * R2 + 0.7152 * G2 + 0.0722 * B2); + + return Math.round((Math.max(l1, l2) + 0.05)/(Math.min(l1, l2) + 0.05)*10)/10; + }, + + fetchImageColor : function(){ + var img = new Image(); + var src = $(this).css('background-image').replace('url(', '').replace(/'/, '').replace(')', ''); + img.src = src; + var can = document.createElement('canvas'); + var context = can.getContext('2d'); + context.drawImage(img, 0, 0); + var data = context.getImageData(0, 0, 1, 1).data; + return 'rgb(' + data[0] + ',' + data[1] + ',' + data[2] + ')'; + }, + + passesWCAG : function(element) { + return (quail.colors.getLuminosity(quail.colors.getColor(element, 'foreground'), quail.colors.getColor(element, 'background')) > 5); + }, + + passesWAI : function(element) { + var foreground = quail.colors.cleanup(quail.colors.getColor(element, 'foreground')); + var background = quail.colors.cleanup(quail.colors.getColor(element, 'background')); + return (quail.colors.getWAIErtContrast(foreground, background) > 500 && + quail.colors.getWAIErtBrightness(foreground, background) > 125); + }, + + getWAIErtContrast : function(foreground, background) { + var diffs = quail.colors.getWAIDiffs(foreground, background); + return diffs.red + diffs.green + diffs.blue; + }, + + getWAIErtBrightness : function(foreground, background) { + var diffs = quail.colors.getWAIDiffs(foreground, background); + return ((diffs.red * 299) + (diffs.green * 587) + (diffs.blue * 114)) / 1000; + + }, + + getWAIDiffs : function(foreground, background) { + var diff = { }; + diff.red = Math.abs(foreground.r - background.r); + diff.green = Math.abs(foreground.g - background.g); + diff.blue = Math.abs(foreground.b - background.b); + return diff; + }, + + getColor : function(element, type) { + if(type === 'foreground') { + return (element.css('color')) ? element.css('color') : 'rgb(255,255,255)'; + } + //return (element.css('background-color')) ? element.css('background-color') : 'rgb(0,0,0)'; + if((element.css('background-color') !== 'rgba(0, 0, 0, 0)' && + element.css('background-color') !== 'transparent') || + element.get(0).tagName === 'body') { + return (element.css('background-color')) ? element.css('background-color') : 'rgb(0,0,0)'; + } + var color = 'rgb(0,0,0)'; + element.parents().each(function(){ + if ($(this).css('background-color') !== 'rgba(0, 0, 0, 0)' && + $(this).css('background-color') !== 'transparent') { + color = $(this).css('background-color'); + return false; + } + }); + return color; + }, + + cleanup : function(color) { + color = color.replace('rgb(', '').replace('rgba(', '').replace(')', '').split(','); + return { r : color[0], + g : color[1], + b : color[2], + a : ((typeof color[3] === 'undefined') ? false : color[3]) + }; + } + +}; +quail.components.convertToPx = function(unit) { + var $test = $('
 
').appendTo(quail.html); + var height = $test.height(); + $test.remove(); + return height; +}; + +quail.components.event = function(testName, options) { + var $items = (typeof options.selector === 'undefined') ? + quail.html.find('*') : + quail.html.find(options.selector); + $items.each(function() { + if(quail.components.hasEventListener($(this), options.searchEvent.replace('on', '')) && + (typeof options.correspondingEvent === 'undefined' || + !quail.components.hasEventListener($(this), options.correspondingEvent.replace('on', '')))) { + quail.testFails(testName, $(this)); + } + }); +}; +quail.components.hasEventListener = function(element, event) { + if(typeof $(element).attr('on' + event) !== 'undefined') { + return true; + } + return typeof $(element).get(0)[event] !== 'undefined'; +}; +quail.components.header = function(testName, options) { + var current = parseInt(options.selector.substr(-1, 1), 10); + var nextHeading = false; + quail.html.find('h1, h2, h3, h4, h5, h6').each(function() { + var number = parseInt($(this).get(0).tagName.substr(-1, 1), 10); + if(nextHeading && (number - 1 > current || number + 1 < current)) { + quail.testFails(testName, $(this)); + } + if(number === current) { + nextHeading = $(this); + } + if(nextHeading && number !== current) { + nextHeading = false; + } + }); +}; +quail.components.label = function(testName, options) { + quail.html.find(options.selector).each(function() { + if((!$(this).parent('label').length || + !quail.containsReadableText($(this).parent('label'))) && + (!quail.html.find('label[for=' + $(this).attr('id') + ']').length || + !quail.containsReadableText(quail.html.find('label[for=' + $(this).attr('id') + ']')))) { + quail.testFails(testName, $(this)); + } + }); +}; +quail.components.labelProximity = function(testName, options) { + quail.html.find(options.selector).each(function() { + var $label = quail.html.find('label[for=' + $(this).attr('id') + ']').first(); + if(!$label.length) { + quail.testFails(testName, $(this)); + } + if(!$(this).parent().is($label.parent())) { + quail.testFails(testName, $(this)); + } + }); +}; +quail.components.placeholder = function(testName, options) { + quail.html.find(options.selector).each(function() { + var text; + if(typeof options.attribute !== 'undefined') { + if(typeof $(this).attr(options.attribute) === 'undefined' || + (options.attribute === 'tabindex' && + $(this).attr(options.attribute) <= 0 + ) + ) { + quail.testFails(testName, $(this)); + return; + } + text = $(this).attr(options.attribute); + } + else { + text = $(this).text(); + $(this).find('img[alt]').each(function() { + text += $(this).attr('alt'); + }); + } + if(typeof text === 'string') { + text = quail.cleanString(text); + var regex = /^([0-9]*)(k|kb|mb|k bytes|k byte)$/g; + var regexResults = regex.exec(text.toLowerCase()); + if(regexResults && regexResults[0].length) { + quail.testFails(testName, $(this)); + } + else { + if(options.empty && quail.isUnreadable(text)) { + quail.testFails(testName, $(this)); + } + else { + if(quail.strings.placeholders.indexOf(text) > -1 ) { + quail.testFails(testName, $(this)); + } + } + } + } + else { + if(options.empty && typeof text !== 'number') { + quail.testFails(testName, $(this)); + } + } + }); +}; +quail.statistics = { + + setDecimal : function( num, numOfDec ){ + var pow10s = Math.pow( 10, numOfDec || 0 ); + return ( numOfDec ) ? Math.round( pow10s * num ) / pow10s : num; + }, + + average : function( numArr, numOfDec ){ + var i = numArr.length, + sum = 0; + while( i-- ){ + sum += numArr[ i ]; + } + return quail.statistics.setDecimal( (sum / numArr.length ), numOfDec ); + }, + + variance : function( numArr, numOfDec ){ + var avg = quail.statistics.average( numArr, numOfDec ), + i = numArr.length, + v = 0; + + while( i-- ){ + v += Math.pow( (numArr[ i ] - avg), 2 ); + } + v /= numArr.length; + return quail.statistics.setDecimal( v, numOfDec ); + }, + + standardDeviation : function( numArr, numOfDec ){ + var stdDev = Math.sqrt( quail.statistics.variance( numArr, numOfDec ) ); + return quail.statistics.setDecimal( stdDev, numOfDec ); + } +}; + +quail.components.textStatistics = { + + cleanText : function(text) { + return text.replace(/[,:;()\-]/, ' ') + .replace(/[\.!?]/, '.') + .replace(/[ ]*(\n|\r\n|\r)[ ]*/, ' ') + .replace(/([\.])[\. ]+/, '$1') + .replace(/[ ]*([\.])/, '$1') + .replace(/[ ]+/, ' ') + .toLowerCase(); + + }, + + sentenceCount : function(text) { + var copy = text; + return copy.split('.').length + 1; + }, + + wordCount : function(text) { + var copy = text; + return copy.split(' ').length + 1; + }, + + averageWordsPerSentence : function(text) { + return this.wordCount(text) / this.sentenceCount(text); + }, + + averageSyllablesPerWord : function(text) { + var that = this; + var count = 0; + var wordCount = that.wordCount(text); + if(!wordCount) { + return 0; + } + $.each(text.split(' '), function(index, word) { + count += that.syllableCount(word); + }); + return count / wordCount; + }, + + syllableCount : function(word) { + var matchedWord = word.replace(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/, '') + .match(/[aeiouy]{1,2}/g); + if(!matchedWord || matchedWord.length === 0) { + return 1; + } + return matchedWord.length; + } +}; +quail.components.video = { + + youTube : { + + videoID : '', + + apiUrl : 'http://gdata.youtube.com/feeds/api/videos/?q=%video&caption&v=2&alt=json', + + isVideo : function(url) { + var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; + var match = url.match(regExp); + if (match && match[7].length === 11) { + this.videoID = match[7]; + return true; + } + return false; + }, + + hasCaptions : function(callback) { + $.ajax({url : this.apiUrl.replace('%video', this.videoID), + async : false, + dataType : 'json', + success : function(data) { + callback((data.feed.openSearch$totalResults.$t > 0) ? true : false); + } + }); + } + } +}; +quail.strings.colors = { + "aliceblue": "f0f8ff", + "antiquewhite": "faebd7", + "aqua": "00ffff", + "aquamarine": "7fffd4", + "azure": "f0ffff", + "beige": "f5f5dc", + "bisque": "ffe4c4", + "black": "000000", + "blanchedalmond": "ffebcd", + "blue": "0000ff", + "blueviolet": "8a2be2", + "brown": "a52a2a", + "burlywood": "deb887", + "cadetblue": "5f9ea0", + "chartreuse": "7fff00", + "chocolate": "d2691e", + "coral": "ff7f50", + "cornflowerblue": "6495ed", + "cornsilk": "fff8dc", + "crimson": "dc143c", + "cyan": "00ffff", + "darkblue": "00008b", + "darkcyan": "008b8b", + "darkgoldenrod": "b8860b", + "darkgray": "a9a9a9", + "darkgreen": "006400", + "darkkhaki": "bdb76b", + "darkmagenta": "8b008b", + "darkolivegreen": "556b2f", + "darkorange": "ff8c00", + "darkorchid": "9932cc", + "darkred": "8b0000", + "darksalmon": "e9967a", + "darkseagreen": "8fbc8f", + "darkslateblue": "483d8b", + "darkslategray": "2f4f4f", + "darkturquoise": "00ced1", + "darkviolet": "9400d3", + "deeppink": "ff1493", + "deepskyblue": "00bfff", + "dimgray": "696969", + "dodgerblue": "1e90ff", + "firebrick": "b22222", + "floralwhite": "fffaf0", + "forestgreen": "228b22", + "fuchsia": "ff00ff", + "gainsboro": "dcdcdc", + "ghostwhite": "f8f8ff", + "gold": "ffd700", + "goldenrod": "daa520", + "gray": "808080", + "green": "008000", + "greenyellow": "adff2f", + "honeydew": "f0fff0", + "hotpink": "ff69b4", + "indianred": "cd5c5c", + "indigo": "4b0082", + "ivory": "fffff0", + "khaki": "f0e68c", + "lavender": "e6e6fa", + "lavenderblush": "fff0f5", + "lawngreen": "7cfc00", + "lemonchiffon": "fffacd", + "lightblue": "add8e6", + "lightcoral": "f08080", + "lightcyan": "e0ffff", + "lightgoldenrodyellow": "fafad2", + "lightgrey": "d3d3d3", + "lightgreen": "90ee90", + "lightpink": "ffb6c1", + "lightsalmon": "ffa07a", + "lightseagreen": "20b2aa", + "lightskyblue": "87cefa", + "lightslategray": "778899", + "lightsteelblue": "b0c4de", + "lightyellow": "ffffe0", + "lime": "00ff00", + "limegreen": "32cd32", + "linen": "faf0e6", + "magenta": "ff00ff", + "maroon": "800000", + "mediumaquamarine": "66cdaa", + "mediumblue": "0000cd", + "mediumorchid": "ba55d3", + "mediumpurple": "9370d8", + "mediumseagreen": "3cb371", + "mediumslateblue": "7b68ee", + "mediumspringgreen": "00fa9a", + "mediumturquoise": "48d1cc", + "mediumvioletred": "c71585", + "midnightblue": "191970", + "mintcream": "f5fffa", + "mistyrose": "ffe4e1", + "moccasin": "ffe4b5", + "navajowhite": "ffdead", + "navy": "000080", + "oldlace": "fdf5e6", + "olive": "808000", + "olivedrab": "6b8e23", + "orange": "ffa500", + "orangered": "ff4500", + "orchid": "da70d6", + "palegoldenrod": "eee8aa", + "palegreen": "98fb98", + "paleturquoise": "afeeee", + "palevioletred": "d87093", + "papayawhip": "ffefd5", + "peachpuff": "ffdab9", + "peru": "cd853f", + "pink": "ffc0cb", + "plum": "dda0dd", + "powderblue": "b0e0e6", + "purple": "800080", + "red": "ff0000", + "rosybrown": "bc8f8f", + "royalblue": "4169e1", + "saddlebrown": "8b4513", + "salmon": "fa8072", + "sandybrown": "f4a460", + "seagreen": "2e8b57", + "seashell": "fff5ee", + "sienna": "a0522d", + "silver": "c0c0c0", + "skyblue": "87ceeb", + "slateblue": "6a5acd", + "slategray": "708090", + "snow": "fffafa", + "springgreen": "00ff7f", + "steelblue": "4682b4", + "tan": "d2b48c", + "teal": "008080", + "thistle": "d8bfd8", + "tomato": "ff6347", + "turquoise": "40e0d0", + "violet": "ee82ee", + "wheat": "f5deb3", + "white": "ffffff", + "whitesmoke": "f5f5f5", + "yellow": "ffff00", + "yellowgreen": "9acd32" +}; +quail.strings.emoticons = [ + ":)", + ";)", + ":-)", + ":^)", + "=)", + "B)", + "8)", + "c8", + "cB", + "=]", + ":]", + "x]", + ":-)", + ":)", + ":o)", + "=]", + ":-D", + ":D", + "=D", + ":-(", + ":(", + "=(", + ":/", + ":P", + ":o" +]; + +quail.strings.languageCodes = [ + "bh", + "bi", + "nb", + "bs", + "br", + "bg", + "my", + "es", + "ca", + "km", + "ch", + "ce", + "ny", + "ny", + "zh", + "za", + "cu", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "nl", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kl", + "kn", + "kr", + "ks", + "kk", + "ki", + "rw", + "ky", + "kv", + "kg", + "ko", + "kj", + "ku", + "kj", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "li", + "li", + "ln", + "lt", + "lu", + "lb", + "mk", + "mg", + "ms", + "ml", + "dv", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "ro", + "mn", + "na", + "nv", + "nv", + "nd", + "nr", + "ng", + "ne", + "nd", + "se", + "no", + "nb", + "nn", + "ii", + "ny", + "nn", + "ie", + "oc", + "oj", + "cu", + "cu", + "cu", + "or", + "om", + "os", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "pa", + "ps", + "qu", + "ro", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "gd", + "sr", + "sn", + "ii", + "sd", + "si", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "ug", + "uz", + "ca", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" +]; +quail.strings.placeholders = [ +"title", +"untitled", +"untitled document", +"this is the title", +"the title", +"content", +" ", +"new page", +"new", +"nbsp", +" ", +"spacer", +"image", +"img", +"photo", +"frame", +"frame title", +"iframe", +"iframe title", +"legend" +]; +quail.strings.redundant = { + "inputImage":[ + "submit", + "button" + ], + "link":[ + "link to", + "link", + "go to", + "click here", + "link", + "click", + "more" + ], + "required":[ + "*" + ] +}; +quail.strings.siteMap = [ + "site map", + "map", + "sitemap" +]; +quail.strings.suspiciousLinks = [ +"click here", +"click", +"more", +"here", +"read more", +"download", +"add", +"delete", +"clone", +"order", +"view", +"read", +"clic aquí", +"clic", +"haga clic", +"más", +"aquí", +"image" +]; +quail.strings.symbols = [ + "|", + "*", + /\*/g, + "
*", + '•', + '•' +]; + +quail.aAdjacentWithSameResourceShouldBeCombined = function() { + quail.html.find('a').each(function() { + if($(this).next('a').attr('href') === $(this).attr('href')) { + quail.testFails('aAdjacentWithSameResourceShouldBeCombined', $(this)); + } + }); +}; + +quail.aImgAltNotRepetative = function() { + quail.html.find('a img[alt]').each(function() { + if(quail.cleanString($(this).attr('alt')) === quail.cleanString($(this).parent('a').text())) { + quail.testFails('aImgAltNotRepetative', $(this).parent('a')); + } + }); +}; + +quail.aLinkTextDoesNotBeginWithRedundantWord = function() { + quail.html.find('a').each(function() { + var $link = $(this); + var text = ''; + if($(this).find('img[alt]').length) { + text = text + $(this).find('img[alt]:first').attr('alt'); + } + text = text + $(this).text(); + text = text.toLowerCase(); + $.each(quail.strings.redundant.link, function(index, phrase) { + if(text.search(phrase) > -1) { + quail.testFails('aLinkTextDoesNotBeginWithRedundantWord', $link); + } + }); + }); +}; + +quail.aLinksAreSeperatedByPrintableCharacters = function() { + quail.html.find('a').each(function() { + if($(this).next('a').length && quail.isUnreadable($(this).get(0).nextSibling.wholeText)) { + quail.testFails('aLinksAreSeperatedByPrintableCharacters', $(this)); + } + }); +}; + +quail.aLinksNotSeparatedBySymbols = function() { + quail.html.find('a').each(function() { + if($(this).next('a').length && + quail.strings.symbols.indexOf($(this).get(0).nextSibling.wholeText.toLowerCase().trim()) !== -1 ) { + quail.testFails('aLinksNotSeparatedBySymbols', $(this)); + } + }); +}; + +quail.aMustContainText = function() { + quail.html.find('a').each(function() { + if(!quail.containsReadableText($(this), true) && + !(($(this).attr('name') || $(this).attr('id')) && !$(this).attr('href'))) { + quail.testFails('aMustContainText', $(this)); + } + }); +}; + +quail.aSuspiciousLinkText = function() { + quail.html.find('a').each(function() { + var text = $(this).text(); + $(this).find('img[alt]').each(function() { + text = text + $(this).attr('alt'); + }); + if(quail.strings.suspiciousLinks.indexOf(quail.cleanString(text)) > -1) { + quail.testFails('aSuspiciousLinkText', $(this)); + } + }); +}; + +quail.appletContainsTextEquivalent = function() { + quail.html.find('applet[alt=], applet:not(applet[alt])').each(function() { + if(quail.isUnreadable($(this).text())) { + quail.testFails('appletContainsTextEquivalent', $(this)); + } + }); +}; + +quail.blockquoteUseForQuotations = function() { + quail.html.find('p').each(function() { + if($(this).text().substr(0, 1).search(/[\'\"]/) > -1 && + $(this).text().substr(-1, 1).search(/[\'\"]/) > -1) { + quail.testFails('blockquoteUseForQuotations', $(this)); + } + }); +}; + +quail.doctypeProvided = function() { + if($(quail.html.get(0).doctype).length === 0) { + quail.testFails('doctypeProvided', quail.html.find('html')); + } +}; + +quail.documentAbbrIsUsed = function() { + quail.components.acronym('documentAbbrIsUsed', 'abbr'); +}; + +quail.documentAcronymsHaveElement = function() { + quail.components.acronym('documentAcronymsHaveElement', 'acronym'); +}; + +quail.documentIDsMustBeUnique = function() { + var ids = []; + quail.html.find('*[id]').each(function() { + if(ids.indexOf($(this).attr('id')) >= 0) { + quail.testFails('documentIDsMustBeUnique', $(this)); + } + ids.push($(this).attr('id')); + }); +}; + +quail.documentIsWrittenClearly = function() { + quail.html.find(quail.textSelector).each(function() { + var text = quail.components.textStatistics.cleanText($(this).text()); + if(Math.round((206.835 - (1.015 * quail.components.textStatistics.averageWordsPerSentence(text)) - (84.6 * quail.components.textStatistics.averageSyllablesPerWord(text)))) < 60) { + quail.testFails('documentIsWrittenClearly', $(this)); + } + }); +}; + +quail.documentLangIsISO639Standard = function() { + var language = quail.html.find('html').attr('lang'); + if(!language) { + return; + } + if(quail.strings.languageCodes.indexOf(language) === -1) { + quail.testFails('documentLangIsISO639Standard', quail.html.find('html')); + } +}; + +quail.documentStrictDocType = function() { + if(!$(quail.html.get(0).doctype).length || + quail.html.get(0).doctype.systemId.indexOf('strict') === -1) { + quail.testFails('documentStrictDocType', quail.html.find('html')); + } +}; + +quail.documentTitleIsShort = function() { + if(quail.html.find('head title:first').text().length > 150) { + quail.testFails('documentTitleIsShort', quail.html.find('head title:first')); + } +}; + +quail.documentValidatesToDocType = function() { + if(typeof document.doctype === 'undefined') { + return; + } +}; + +quail.documentVisualListsAreMarkedUp = function() { + quail.html.find('p, div, h1, h2, h3, h4, h5, h6').each(function() { + var $element = $(this); + $.each(quail.strings.symbols, function(index, item) { + if($element.text().split(item).length > 2) { + quail.testFails('documentVisualListsAreMarkedUp', $element); + } + }); + }); +}; + +quail.embedHasAssociatedNoEmbed = function() { + if(quail.html.find('noembed').length) { + return; + } + quail.html.find('embed').each(function() { + quail.testFails('embedHasAssociatedNoEmbed', $(this)); + }); +}; + +quail.emoticonsExcessiveUse = function() { + var count = 0; + quail.html.find('p, div, h1, h2, h3, h4, h5, h6').each(function() { + var $element = $(this); + $.each($element.text().split(' '), function(index, word) { + if(quail.strings.emoticons.indexOf(word) > -1) { + count++; + } + if(count > 4) { + return; + } + }); + if(count > 4) { + quail.testFails('emoticonsExcessiveUse', $element); + } + }); +}; + +quail.emoticonsMissingAbbr = function() { + quail.html.find('p, div, h1, h2, h3, h4, h5, h6').each(function() { + var $element = $(this); + var $clone = $element.clone(); + $clone.find('abbr, acronym').each(function() { + $(this).remove(); + }); + $.each($clone.text().split(' '), function(index, word) { + if(quail.strings.emoticons.indexOf(word) > -1) { + quail.testFails('emoticonsMissingAbbr', $element); + } + }); + }); +}; + +quail.formWithRequiredLabel = function() { + var redundant = quail.strings.redundant; + var lastStyle, currentStyle = false; + redundant.required[redundant.required.indexOf('*')] = /\*/g; + quail.html.find('label').each(function() { + var text = $(this).text().toLowerCase(); + var $label = $(this); + $.each(redundant.required, function(index, word) { + if(text.search(word) >= 0 && !quail.html.find('#' + $label.attr('for')).attr('aria-required')) { + quail.testFails('formWithRequiredLabel', $label); + } + }); + currentStyle = $label.css('color') + $label.css('font-weight') + $label.css('background-color'); + if(lastStyle && currentStyle !== lastStyle) { + quail.testFails('formWithRequiredLabel', $label); + } + lastStyle = currentStyle; + }); +}; + +quail.headersUseToMarkSections = function() { + quail.html.find('p').each(function() { + var $paragraph = $(this); + $paragraph.find('strong:first, em:first, i:first, b:first').each(function() { + if($paragraph.text() === $(this).text()) { + quail.testFails('headersUseToMarkSections', $paragraph); + } + }); + }); +}; + +quail.imgAltIsDifferent = function() { + quail.html.find('img[alt][src]').each(function() { + if($(this).attr('src') === $(this).attr('alt') || $(this).attr('src').split('/').pop() === $(this).attr('alt')) { + quail.testFails('imgAltIsDifferent', $(this)); + } + }); +}; + +quail.imgAltIsTooLong = function() { + quail.html.find('img[alt]').each(function() { + if($(this).attr('alt').length > 100) { + quail.testFails('imgAltIsTooLong', $(this)); + } + }); +}; + +quail.imgAltNotEmptyInAnchor = function() { + quail.html.find('a img').each(function() { + if(quail.isUnreadable($(this).attr('alt')) && + quail.isUnreadable($(this).parent('a:first').text())) { + quail.testFails('imgAltNotEmptyInAnchor', $(this)); + } + }); +}; + +quail.imgAltTextNotRedundant = function() { + var altText = {}; + quail.html.find('img[alt]').each(function() { + if(typeof altText[$(this).attr('alt')] === 'undefined') { + altText[$(this).attr('alt')] = $(this).attr('src'); + } + else { + if(altText[$(this).attr('alt')] !== $(this).attr('src')) { + quail.testFails('imgAltTextNotRedundant', $(this)); + } + } + }); +}; + +quail.imgGifNoFlicker = function() { + quail.html.find('img[src$=".gif"]').each(function() { + var $image = $(this); + $.ajax({url : $image.attr('src'), + async : false, + dataType : 'text', + success : function(data) { + if(data.search('NETSCAPE2.0') !== -1) { + quail.testFails('imgGifNoFlicker', $image); + } + }}); + }); +}; + +quail.imgHasLongDesc = function() { + quail.html.find('img[longdesc]').each(function() { + if($(this).attr('longdesc') === $(this).attr('alt') || + !quail.validURL($(this).attr('longdesc'))) { + quail.testFails('imgHasLongDesc', $(this)); + } + }); +}; + +quail.imgImportantNoSpacerAlt = function() { + quail.html.find('img[alt]').each(function() { + var width = ($(this).width()) ? $(this).width() : parseInt($(this).attr('width'), 10); + var height = ($(this).height()) ? $(this).height() : parseInt($(this).attr('height'), 10); + if(quail.isUnreadable($(this).attr('alt').trim()) && + $(this).attr('alt').length > 0 && + width > 50 && + height > 50) { + quail.testFails('imgImportantNoSpacerAlt', $(this)); + } + }); +}; + +quail.imgMapAreasHaveDuplicateLink = function() { + var links = { }; + quail.html.find('a').each(function() { + links[$(this).attr('href')] = $(this).attr('href'); + }); + quail.html.find('img[usemap]').each(function() { + var $image = $(this); + var $map = quail.html.find($image.attr('usemap')); + if(!$map.length) { + $map = quail.html.find('map[name="' + $image.attr('usemap').replace('#', '') + '"]'); + } + if($map.length) { + $map.find('area').each(function() { + if(typeof links[$(this).attr('href')] === 'undefined') { + quail.testFails('imgMapAreasHaveDuplicateLink', $image); + } + }); + } + }); +}; + +quail.imgNonDecorativeHasAlt = function() { + quail.html.find('img[alt]').each(function() { + if(quail.isUnreadable($(this).attr('alt')) && + ($(this).width() > 100 || $(this).height() > 100)) { + quail.testFails('imgNonDecorativeHasAlt', $(this)); + } + }); +}; + +quail.imgWithMathShouldHaveMathEquivalent = function() { + quail.html.find('img:not(img:has(math), img:has(tagName))').each(function() { + if(!$(this).parent().find('math').length) { + quail.testFails('imgWithMathShouldHaveMathEquivalent', $(this)); + } + }); +}; + +quail.inputCheckboxRequiresFieldset = function() { + quail.html.find(':checkbox').each(function() { + if(!$(this).parents('fieldset').length) { + quail.testFails('inputCheckboxRequiresFieldset', $(this)); + } + }); +}; + +quail.inputImageAltIsNotFileName = function() { + quail.html.find('input[type=image][alt]').each(function() { + if($(this).attr('src') === $(this).attr('alt')) { + quail.testFails('inputImageAltIsNotFileName', $(this)); + } + }); +}; + +quail.inputImageAltIsShort = function() { + quail.html.find('input[type=image]').each(function() { + if($(this).attr('alt').length > 100) { + quail.testFails('inputImageAltIsShort', $(this)); + } + }); +}; + +quail.inputImageAltNotRedundant = function() { + quail.html.find('input[type=image][alt]').each(function() { + if(quail.strings.redundant.inputImage.indexOf(quail.cleanString($(this).attr('alt'))) > -1) { + quail.testFails('inputImageAltNotRedundant', $(this)); + } + }); +}; + +quail.labelMustBeUnique = function() { + var labels = { }; + quail.html.find('label[for]').each(function() { + if(typeof labels[$(this).attr('for')] !== 'undefined') { + quail.testFails('labelMustBeUnique', $(this)); + } + labels[$(this).attr('for')] = $(this).attr('for'); + }); +}; + +quail.labelsAreAssignedToAnInput = function() { + quail.html.find('label').each(function() { + if(!$(this).attr('for')) { + quail.testFails('labelsAreAssignedToAnInput', $(this)); + } + else { + if(!quail.html.find('#' + $(this).attr('for')).length || + !quail.html.find('#' + $(this).attr('for')).is('input, select, textarea')) { + quail.testFails('labelsAreAssignedToAnInput', $(this)); + } + } + }); +}; + +quail.listNotUsedForFormatting = function() { + quail.html.find('ol, ul').each(function() { + if($(this).find('li').length < 2) { + quail.testFails('listNotUsedForFormatting', $(this)); + } + }); +}; + +quail.pNotUsedAsHeader = function() { + var priorStyle = { }; + quail.html.find('p').each(function() { + if($(this).text().search('.') < 1) { + var $paragraph = $(this); + $.each(quail.suspectPHeaderTags, function(index, tag) { + if($paragraph.find(tag).length) { + $paragraph.find(tag).each(function() { + if($(this).text().trim() === $paragraph.text().trim()) { + quail.testFails('pNotUsedAsHeader', $paragraph); + } + }); + } + }); + $.each(quail.suspectPCSSStyles, function(index, style) { + if(typeof priorStyle[style] !== 'undefined' && + priorStyle[style] !== $paragraph.css(style)) { + quail.testFails('pNotUsedAsHeader', $paragraph); + } + priorStyle[style] = $paragraph.css(style); + }); + if($paragraph.css('font-weight') === 'bold') { + quail.testFails('pNotUsedAsHeader', $paragraph); + } + } + }); +}; + +quail.paragarphIsWrittenClearly = function() { + quail.html.find('p').each(function() { + var text = quail.components.textStatistics.cleanText($(this).text()); + if(Math.round((206.835 - (1.015 * quail.components.textStatistics.averageWordsPerSentence(text)) - (84.6 * quail.components.textStatistics.averageSyllablesPerWord(text)))) < 60) { + quail.testFails('paragarphIsWrittenClearly', $(this)); + } + }); +}; + +quail.preShouldNotBeUsedForTabularLayout = function() { + quail.html.find('pre').each(function() { + var rows = $(this).text().split(/[\n\r]+/); + if(rows.length > 1 && $(this).text().search(/\t/) > -1) { + quail.testFails('preShouldNotBeUsedForTabularLayout', $(this)); + } + }); +}; + +quail.selectJumpMenu = function() { + if(quail.html.find('select').length === 0) { + return; + } + + quail.html.find('select').each(function() { + if($(this).parent('form').find(':submit').length === 0 && + quail.components.hasEventListener($(this), 'change')) { + quail.testFails('selectJumpMenu', $(this)); + } + }); +}; + +quail.siteMap = function() { + var set = true; + quail.html.find('a').each(function() { + var text = $(this).text().toLowerCase(); + $.each(quail.strings.siteMap, function(index, string) { + if(text.search(string) > -1) { + set = false; + return; + } + }); + if(set === false) { + return; + } + }); + if(set) { + quail.testFails('siteMap', quail.html.find('body')); + } +}; + +quail.tabIndexFollowsLogicalOrder = function() { + var index = 0; + quail.html.find('[tabindex]').each(function() { + if(parseInt($(this).attr('tabindex'), 10) >= 0 && + parseInt($(this).attr('tabindex'), 10) !== index + 1) { + quail.testFails('tabIndexFollowsLogicalOrder', $(this)); + } + index++; + }); +}; + +quail.tableHeaderLabelMustBeTerse = function() { + quail.html.find('th, table tr:first td').each(function() { + if($(this).text().length > 20 && + (!$(this).attr('abbr') || $(this).attr('abbr').length > 20)) { + quail.testFails('tableHeaderLabelMustBeTerse', $(this)); + } + }); +}; + +quail.tableLayoutDataShouldNotHaveTh = function() { + quail.html.find('table:has(th)').each(function() { + if(!quail.isDataTable($(this))) { + quail.testFails('tableLayoutDataShouldNotHaveTh', $(this)); + } + }); +}; + +quail.tableLayoutHasNoCaption = function() { + quail.html.find('table:has(caption)').each(function() { + if(!quail.isDataTable($(this))) { + quail.testFails('tableLayoutHasNoCaption', $(this)); + } + }); +}; + +quail.tableLayoutHasNoSummary = function() { + quail.html.find('table[summary]').each(function() { + if(!quail.isDataTable($(this)) && !quail.isUnreadable($(this).attr('summary'))) { + quail.testFails('tableLayoutHasNoSummary', $(this)); + } + }); +}; + +quail.tableLayoutMakesSenseLinearized = function() { + quail.html.find('table').each(function() { + if(!quail.isDataTable($(this))) { + quail.testFails('tableLayoutMakesSenseLinearized', $(this)); + } + }); +}; + +quail.tableNotUsedForLayout = function() { + quail.html.find('table').each(function() { + if(!quail.isDataTable($(this))) { + quail.testFails('tableNotUsedForLayout', $(this)); + } + }); +}; + +quail.tableSummaryDoesNotDuplicateCaption = function() { + quail.html.find('table[summary]:has(caption)').each(function() { + if(quail.cleanString($(this).attr('summary')) === quail.cleanString($(this).find('caption:first').text())) { + quail.testFails('tableSummaryDoesNotDuplicateCaption', $(this)); + } + }); +}; + +quail.tableSummaryIsNotTooLong = function() { + quail.html.find('table[summary]').each(function() { + if($(this).attr('summary').trim().length > 100) { + quail.testFails('tableSummaryIsNotTooLong', $(this)); + } + }); +}; + +quail.tableUseColGroup = function() { + quail.html.find('table').each(function() { + if(quail.isDataTable($(this)) && !$(this).find('colgroup').length) { + quail.testFails('tableUseColGroup', $(this)); + } + }); +}; + +quail.tableUsesAbbreviationForHeader = function() { + quail.html.find('th:not(th[abbr])').each(function() { + if($(this).text().length > 20) { + quail.testFails('tableUsesAbbreviationForHeader', $(this)); + } + }); +}; + +quail.tableUsesScopeForRow = function() { + quail.html.find('table').each(function() { + $(this).find('td:first-child').each(function() { + var $next = $(this).next('td'); + if(($(this).css('font-weight') === 'bold' && $next.css('font-weight') !== 'bold') || + ($(this).find('strong').length && !$next.find('strong').length)) { + quail.testFails('tableUsesScopeForRow', $(this)); + } + }); + $(this).find('td:last-child').each(function() { + var $prev = $(this).prev('td'); + if(($(this).css('font-weight') === 'bold' && $prev.css('font-weight') !== 'bold') || + ($(this).find('strong').length && !$prev.find('strong').length)) { + quail.testFails('tableUsesScopeForRow', $(this)); + } + }); + }); +}; +quail.tableWithMoreHeadersUseID = function() { + quail.html.find('table:has(th)').each(function() { + var $table = $(this); + var rows = 0; + $table.find('tr').each(function() { + if($(this).find('th').length) { + rows++; + } + if(rows > 1 && !$(this).find('th[id]').length) { + quail.testFails('tableWithMoreHeadersUseID', $table); + } + }); + }); +}; + +quail.tabularDataIsInTable = function() { + quail.html.find('pre').each(function() { + if($(this).html().search('\t') >= 0) { + quail.testFails('tabularDataIsInTable', $(this)); + } + }); +}; + +quail.textIsNotSmall = function() { + quail.html.find(quail.textSelector).each(function() { + var fontSize = $(this).css('font-size'); + if(fontSize.search('em') > 0) { + fontSize = quail.components.convertToPx(fontSize); + } + fontSize = parseInt(fontSize.replace('px', ''), 10); + if(fontSize < 10) { + quail.testFails('textIsNotSmall', $(this)); + } + }); +}; + +quail.videosEmbeddedOrLinkedNeedCaptions = function() { + quail.html.find('a').each(function() { + var $link = $(this); + $.each(quail.components.video, function(type, callback) { + if(callback.isVideo($link.attr('href'))) { + callback.hasCaptions(function(hasCaptions) { + if(!hasCaptions) { + quail.testFails('videosEmbeddedOrLinkedNeedCaptions', $link); + } + }); + } + }); + }); +}; + +})(jQuery); \ No newline at end of file diff --git a/dist/quail.jquery.min.js b/dist/quail.jquery.min.js new file mode 100644 index 000000000..f9e5dd05b --- /dev/null +++ b/dist/quail.jquery.min.js @@ -0,0 +1 @@ +/*! QUAIL quailjs.org | quailjs.org/license */!function(a){a.fn.quail=function(a){return this.length?(b.options=a,b.html=this,b.run(),this):this},a.expr[":"].quailCss=function(b,c,d){var e=d[3].split(/\s*=\s*/);return a(b).css(e[0]).search(e[1])>-1};var b={options:{},components:{},testabilityTranslation:{0:"suggestion",.5:"moderate",1:"severe"},html:{},strings:{},accessibilityResults:{},accessibilityTests:{},textSelector:"p, h1, h2, h3, h4, h5, h6, div, pre, blockquote, aside, article, details, summary, figcaption, footer, header, hgroup, nav, section, strong, em, del, i, b",suspectPHeaderTags:["strong","b","em","i","u","font"],suspectPCSSStyles:["color","font-weight","font-size","font-family"],run:function(){if(b.options.reset&&(b.accessibilityResults={}),"undefined"!=typeof b.options.accessibilityTests?b.accessibilityTests=b.options.accessibilityTests:a.ajax({url:b.options.jsonPath+"/tests.json",async:!1,dataType:"json",success:function(a){"object"==typeof a&&(b.accessibilityTests=a)}}),"undefined"!=typeof b.options.customTests)for(var c in b.options.customTests)b.accessibilityTests[c]=b.options.customTests[c];if("string"==typeof b.options.guideline&&a.ajax({url:b.options.jsonPath+"/guidelines/"+b.options.guideline+".tests.json",async:!1,dataType:"json",success:function(a){b.options.guideline=a}}),"undefined"==typeof b.options.guideline){b.options.guideline=[];for(var d in b.accessibilityTests)b.options.guideline.push(d)}if(b.runTests(),"undefined"!=typeof b.options.complete){var e={totals:{severe:0,moderate:0,suggestion:0},results:b.accessibilityResults};a.each(e.results,function(a,c){e.totals[b.testabilityTranslation[b.accessibilityTests[a].testability]]+=c.length}),b.options.complete(e)}},getConfiguration:function(a){return"undefined"==typeof this.options.guidelineName||"undefined"==typeof this.accessibilityTests[a].guidelines||"undefined"==typeof this.accessibilityTests[a].guidelines[this.options.guidelineName]||"undefined"==typeof this.accessibilityTests[a].guidelines[this.options.guidelineName].configuration?!1:this.accessibilityTests[a].guidelines[this.options.guidelineName].configuration},testFails:function(a,c,d){if(d=d||{},("undefined"==typeof b.options.preFilter||b.options.preFilter(a,c,d)!==!1)&&(b.accessibilityResults[a].push(c),"undefined"!=typeof b.options.testFailed)){var e="undefined"!=typeof b.accessibilityTests[a].testability?b.accessibilityTests[a].testability:"unknown";b.options.testFailed({element:c,testName:a,testability:e,severity:b.testabilityTranslation[e],options:d})}},runTests:function(){a.each(b.options.guideline,function(c,d){if("undefined"!=typeof b.accessibilityTests[d]){var e=b.accessibilityTests[d].type;"undefined"==typeof b.accessibilityResults[d]&&(b.accessibilityResults[d]=[]),"selector"===e&&b.html.find(b.accessibilityTests[d].selector).each(function(){b.testFails(d,a(this))}),"custom"===e&&("object"==typeof b.accessibilityTests[d].callback||"function"==typeof b.accessibilityTests[d].callback?b.accessibilityTests[d].callback(b):"undefined"!=typeof b[b.accessibilityTests[d].callback]&&b[b.accessibilityTests[d].callback]()),"undefined"!=typeof b.components[e]&&b.components[e](d,b.accessibilityTests[d])}})},isUnreadable:function(a){return"string"!=typeof a?!0:a.trim().length?!1:!0},isDataTable:function(b){if(b.find("tr").length<3)return!1;if(b.find("th[scope]").length)return!0;var c=b.find("tr:has(td)").length,d=b.find("td[rowspan], td[colspan]"),e=!0;if(d.length){var f={};d.each(function(){"undefined"==typeof f[a(this).index()]&&(f[a(this).index()]=0),f[a(this).index()]++}),a.each(f,function(a,b){c>b&&(e=!1)})}var g=b.find("table");if(g.length){var h={};g.each(function(){var b=a(this).parent("td").index();b!==!1&&"undefined"==typeof h[b]&&(h[b]=0),h[b]++}),a.each(h,function(a,b){c>b&&(e=!1)})}return e},validURL:function(a){return-1===a.search(" ")?!0:!1},cleanString:function(a){return a.toLowerCase().replace(/^\s\s*/,"")},containsReadableText:function(c,d){if(c=c.clone(),c.find("option").remove(),!b.isUnreadable(c.text()))return!0;if(!b.isUnreadable(c.attr("alt")))return!0;if(d){var e=!1;if(c.find("*").each(function(){b.containsReadableText(a(this),!0)&&(e=!0)}),e)return!0}return!1}};b.components.acronym=function(c){var d={},e={};b.html.find("acronym[title], abbr[title]").each(function(){d[a(this).text().toUpperCase()]=a(this).attr("title")}),b.html.find("p, div, h1, h2, h3, h4, h5").each(function(){var f=a(this),g=a(this).text().split(" ");g.length>1&&a(this).text().toUpperCase()!==a(this).text()&&a.each(g,function(a,g){g=g.replace(/[^a-zA-Zs]/,""),g.toUpperCase()===g&&g.length>1&&"undefined"==typeof d[g.toUpperCase()]&&("undefined"==typeof e[g.toUpperCase()]&&b.testFails(c,f,{acronym:g.toUpperCase()}),e[g.toUpperCase()]=g)})})},b.components.color=function(c,d){if(d.bodyForegroundAttribute&&d.bodyBackgroundAttribute){var e=b.html.find("body").clone(!1,!1),f=e.attr(d.bodyForegroundAttribute),g=e.attr(d.bodyBackgroundAttribute);"undefined"==typeof f&&(f="rgb(0,0,0)"),"undefined"==typeof g&&(f="rgb(255,255,255)"),e.css("color",f),e.css("background-color",g),("wcag"===d.algorithm&&!b.colors.passesWCAG(e)||"wai"===d.algorithm&&!b.colors.passesWAI(e))&&b.testFails(c,e)}b.html.find(d.selector).filter(b.textSelector).each(function(){(!b.isUnreadable(a(this).text())&&"wcag"===d.algorithm&&!b.colors.passesWCAG(a(this))||"wai"===d.algorithm&&!b.colors.passesWAI(a(this)))&&b.testFails(c,a(this))})},b.colors={getLuminosity:function(a,b){a=this.cleanup(a),b=this.cleanup(b);var c,d,e=a.r/255,f=a.g/255,g=a.b/255,h=.03928>=e?e/12.92:Math.pow((e+.055)/1.055,2.4),i=.03928>=f?f/12.92:Math.pow((f+.055)/1.055,2.4),j=.03928>=g?g/12.92:Math.pow((g+.055)/1.055,2.4),k=b.r/255,l=b.g/255,m=b.b/255,n=.03928>=k?k/12.92:Math.pow((k+.055)/1.055,2.4),o=.03928>=l?l/12.92:Math.pow((l+.055)/1.055,2.4),p=.03928>=m?m/12.92:Math.pow((m+.055)/1.055,2.4);return c=.2126*h+.7152*i+.0722*j,d=.2126*n+.7152*o+.0722*p,Math.round((Math.max(c,d)+.05)/(Math.min(c,d)+.05)*10)/10},fetchImageColor:function(){var b=new Image,c=a(this).css("background-image").replace("url(","").replace(/'/,"").replace(")","");b.src=c;var d=document.createElement("canvas"),e=d.getContext("2d");e.drawImage(b,0,0);var f=e.getImageData(0,0,1,1).data;return"rgb("+f[0]+","+f[1]+","+f[2]+")"},passesWCAG:function(a){return b.colors.getLuminosity(b.colors.getColor(a,"foreground"),b.colors.getColor(a,"background"))>5},passesWAI:function(a){var c=b.colors.cleanup(b.colors.getColor(a,"foreground")),d=b.colors.cleanup(b.colors.getColor(a,"background"));return b.colors.getWAIErtContrast(c,d)>500&&b.colors.getWAIErtBrightness(c,d)>125},getWAIErtContrast:function(a,c){var d=b.colors.getWAIDiffs(a,c);return d.red+d.green+d.blue},getWAIErtBrightness:function(a,c){var d=b.colors.getWAIDiffs(a,c);return(299*d.red+587*d.green+114*d.blue)/1e3},getWAIDiffs:function(a,b){var c={};return c.red=Math.abs(a.r-b.r),c.green=Math.abs(a.g-b.g),c.blue=Math.abs(a.b-b.b),c},getColor:function(b,c){if("foreground"===c)return b.css("color")?b.css("color"):"rgb(255,255,255)";if("rgba(0, 0, 0, 0)"!==b.css("background-color")&&"transparent"!==b.css("background-color")||"body"===b.get(0).tagName)return b.css("background-color")?b.css("background-color"):"rgb(0,0,0)";var d="rgb(0,0,0)";return b.parents().each(function(){return"rgba(0, 0, 0, 0)"!==a(this).css("background-color")&&"transparent"!==a(this).css("background-color")?(d=a(this).css("background-color"),!1):void 0}),d},cleanup:function(a){return a=a.replace("rgb(","").replace("rgba(","").replace(")","").split(","),{r:a[0],g:a[1],b:a[2],a:"undefined"==typeof a[3]?!1:a[3]}}},b.components.convertToPx=function(c){var d=a('
 
').appendTo(b.html),e=d.height();return d.remove(),e},b.components.event=function(c,d){var e="undefined"==typeof d.selector?b.html.find("*"):b.html.find(d.selector);e.each(function(){!b.components.hasEventListener(a(this),d.searchEvent.replace("on",""))||"undefined"!=typeof d.correspondingEvent&&b.components.hasEventListener(a(this),d.correspondingEvent.replace("on",""))||b.testFails(c,a(this))})},b.components.hasEventListener=function(b,c){return"undefined"!=typeof a(b).attr("on"+c)?!0:"undefined"!=typeof a(b).get(0)[c]},b.components.header=function(c,d){var e=parseInt(d.selector.substr(-1,1),10),f=!1;b.html.find("h1, h2, h3, h4, h5, h6").each(function(){var d=parseInt(a(this).get(0).tagName.substr(-1,1),10);f&&(d-1>e||e>d+1)&&b.testFails(c,a(this)),d===e&&(f=a(this)),f&&d!==e&&(f=!1)})},b.components.label=function(c,d){b.html.find(d.selector).each(function(){a(this).parent("label").length&&b.containsReadableText(a(this).parent("label"))||b.html.find("label[for="+a(this).attr("id")+"]").length&&b.containsReadableText(b.html.find("label[for="+a(this).attr("id")+"]"))||b.testFails(c,a(this))})},b.components.labelProximity=function(c,d){b.html.find(d.selector).each(function(){var d=b.html.find("label[for="+a(this).attr("id")+"]").first();d.length||b.testFails(c,a(this)),a(this).parent().is(d.parent())||b.testFails(c,a(this))})},b.components.placeholder=function(c,d){b.html.find(d.selector).each(function(){var e;if("undefined"!=typeof d.attribute){if("undefined"==typeof a(this).attr(d.attribute)||"tabindex"===d.attribute&&a(this).attr(d.attribute)<=0)return b.testFails(c,a(this)),void 0;e=a(this).attr(d.attribute)}else e=a(this).text(),a(this).find("img[alt]").each(function(){e+=a(this).attr("alt")});if("string"==typeof e){e=b.cleanString(e);var f=/^([0-9]*)(k|kb|mb|k bytes|k byte)$/g,g=f.exec(e.toLowerCase());g&&g[0].length?b.testFails(c,a(this)):d.empty&&b.isUnreadable(e)?b.testFails(c,a(this)):b.strings.placeholders.indexOf(e)>-1&&b.testFails(c,a(this))}else d.empty&&"number"!=typeof e&&b.testFails(c,a(this))})},b.statistics={setDecimal:function(a,b){var c=Math.pow(10,b||0);return b?Math.round(c*a)/c:a},average:function(a,c){for(var d=a.length,e=0;d--;)e+=a[d];return b.statistics.setDecimal(e/a.length,c)},variance:function(a,c){for(var d=b.statistics.average(a,c),e=a.length,f=0;e--;)f+=Math.pow(a[e]-d,2);return f/=a.length,b.statistics.setDecimal(f,c)},standardDeviation:function(a,c){var d=Math.sqrt(b.statistics.variance(a,c));return b.statistics.setDecimal(d,c)}},b.components.textStatistics={cleanText:function(a){return a.replace(/[,:;()\-]/," ").replace(/[\.!?]/,".").replace(/[ ]*(\n|\r\n|\r)[ ]*/," ").replace(/([\.])[\. ]+/,"$1").replace(/[ ]*([\.])/,"$1").replace(/[ ]+/," ").toLowerCase()},sentenceCount:function(a){var b=a;return b.split(".").length+1},wordCount:function(a){var b=a;return b.split(" ").length+1},averageWordsPerSentence:function(a){return this.wordCount(a)/this.sentenceCount(a)},averageSyllablesPerWord:function(b){var c=this,d=0,e=c.wordCount(b);return e?(a.each(b.split(" "),function(a,b){d+=c.syllableCount(b)}),d/e):0},syllableCount:function(a){var b=a.replace(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/,"").match(/[aeiouy]{1,2}/g);return b&&0!==b.length?b.length:1}},b.components.video={youTube:{videoID:"",apiUrl:"http://gdata.youtube.com/feeds/api/videos/?q=%video&caption&v=2&alt=json",isVideo:function(a){var b=/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/,c=a.match(b);return c&&11===c[7].length?(this.videoID=c[7],!0):!1},hasCaptions:function(b){a.ajax({url:this.apiUrl.replace("%video",this.videoID),async:!1,dataType:"json",success:function(a){b(a.feed.openSearch$totalResults.$t>0?!0:!1)}})}}},b.strings.colors={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370d8",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"d87093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",red:"ff0000",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32"},b.strings.emoticons=[":)",";)",":-)",":^)","=)","B)","8)","c8","cB","=]",":]","x]",":-)",":)",":o)","=]",":-D",":D","=D",":-(",":(","=(",":/",":P",":o"],b.strings.languageCodes=["bh","bi","nb","bs","br","bg","my","es","ca","km","ch","ce","ny","ny","zh","za","cu","cu","cv","kw","co","cr","hr","cs","da","dv","dv","nl","dz","en","eo","et","ee","fo","fj","fi","nl","fr","ff","gd","gl","lg","ka","de","ki","el","kl","gn","gu","ht","ht","ha","he","hz","hi","ho","hu","is","io","ig","id","ia","ie","iu","ik","ga","it","ja","jv","kl","kn","kr","ks","kk","ki","rw","ky","kv","kg","ko","kj","ku","kj","ky","lo","la","lv","lb","li","li","li","ln","lt","lu","lb","mk","mg","ms","ml","dv","mt","gv","mi","mr","mh","ro","ro","mn","na","nv","nv","nd","nr","ng","ne","nd","se","no","nb","nn","ii","ny","nn","ie","oc","oj","cu","cu","cu","or","om","os","os","pi","pa","ps","fa","pl","pt","pa","ps","qu","ro","rm","rn","ru","sm","sg","sa","sc","gd","sr","sn","ii","sd","si","si","sk","sl","so","st","nr","es","su","sw","ss","sv","tl","ty","tg","ta","tt","te","th","bo","ti","to","ts","tn","tr","tk","tw","ug","uk","ur","ug","uz","ca","ve","vi","vo","wa","cy","fy","wo","xh","yi","yo","za","zu"],b.strings.placeholders=["title","untitled","untitled document","this is the title","the title","content"," ","new page","new","nbsp"," ","spacer","image","img","photo","frame","frame title","iframe","iframe title","legend"],b.strings.redundant={inputImage:["submit","button"],link:["link to","link","go to","click here","link","click","more"],required:["*"]},b.strings.siteMap=["site map","map","sitemap"],b.strings.suspiciousLinks=["click here","click","more","here","read more","download","add","delete","clone","order","view","read","clic aquí","clic","haga clic","más","aquí","image"],b.strings.symbols=["|","*",/\*/g,"
*","•","•"],b.aAdjacentWithSameResourceShouldBeCombined=function(){b.html.find("a").each(function(){a(this).next("a").attr("href")===a(this).attr("href")&&b.testFails("aAdjacentWithSameResourceShouldBeCombined",a(this))})},b.aImgAltNotRepetative=function(){b.html.find("a img[alt]").each(function(){b.cleanString(a(this).attr("alt"))===b.cleanString(a(this).parent("a").text())&&b.testFails("aImgAltNotRepetative",a(this).parent("a"))})},b.aLinkTextDoesNotBeginWithRedundantWord=function(){b.html.find("a").each(function(){var c=a(this),d="";a(this).find("img[alt]").length&&(d+=a(this).find("img[alt]:first").attr("alt")),d+=a(this).text(),d=d.toLowerCase(),a.each(b.strings.redundant.link,function(a,e){d.search(e)>-1&&b.testFails("aLinkTextDoesNotBeginWithRedundantWord",c)})})},b.aLinksAreSeperatedByPrintableCharacters=function(){b.html.find("a").each(function(){a(this).next("a").length&&b.isUnreadable(a(this).get(0).nextSibling.wholeText)&&b.testFails("aLinksAreSeperatedByPrintableCharacters",a(this))})},b.aLinksNotSeparatedBySymbols=function(){b.html.find("a").each(function(){a(this).next("a").length&&-1!==b.strings.symbols.indexOf(a(this).get(0).nextSibling.wholeText.toLowerCase().trim())&&b.testFails("aLinksNotSeparatedBySymbols",a(this))})},b.aMustContainText=function(){b.html.find("a").each(function(){b.containsReadableText(a(this),!0)||(a(this).attr("name")||a(this).attr("id"))&&!a(this).attr("href")||b.testFails("aMustContainText",a(this))})},b.aSuspiciousLinkText=function(){b.html.find("a").each(function(){var c=a(this).text();a(this).find("img[alt]").each(function(){c+=a(this).attr("alt")}),b.strings.suspiciousLinks.indexOf(b.cleanString(c))>-1&&b.testFails("aSuspiciousLinkText",a(this))})},b.appletContainsTextEquivalent=function(){b.html.find("applet[alt=], applet:not(applet[alt])").each(function(){b.isUnreadable(a(this).text())&&b.testFails("appletContainsTextEquivalent",a(this))})},b.blockquoteUseForQuotations=function(){b.html.find("p").each(function(){a(this).text().substr(0,1).search(/[\'\"]/)>-1&&a(this).text().substr(-1,1).search(/[\'\"]/)>-1&&b.testFails("blockquoteUseForQuotations",a(this))})},b.doctypeProvided=function(){0===a(b.html.get(0).doctype).length&&b.testFails("doctypeProvided",b.html.find("html"))},b.documentAbbrIsUsed=function(){b.components.acronym("documentAbbrIsUsed","abbr")},b.documentAcronymsHaveElement=function(){b.components.acronym("documentAcronymsHaveElement","acronym")},b.documentIDsMustBeUnique=function(){var c=[];b.html.find("*[id]").each(function(){c.indexOf(a(this).attr("id"))>=0&&b.testFails("documentIDsMustBeUnique",a(this)),c.push(a(this).attr("id"))})},b.documentIsWrittenClearly=function(){b.html.find(b.textSelector).each(function(){var c=b.components.textStatistics.cleanText(a(this).text());Math.round(206.835-1.015*b.components.textStatistics.averageWordsPerSentence(c)-84.6*b.components.textStatistics.averageSyllablesPerWord(c))<60&&b.testFails("documentIsWrittenClearly",a(this))})},b.documentLangIsISO639Standard=function(){var a=b.html.find("html").attr("lang");a&&-1===b.strings.languageCodes.indexOf(a)&&b.testFails("documentLangIsISO639Standard",b.html.find("html"))},b.documentStrictDocType=function(){a(b.html.get(0).doctype).length&&-1!==b.html.get(0).doctype.systemId.indexOf("strict")||b.testFails("documentStrictDocType",b.html.find("html"))},b.documentTitleIsShort=function(){b.html.find("head title:first").text().length>150&&b.testFails("documentTitleIsShort",b.html.find("head title:first"))},b.documentValidatesToDocType=function(){"undefined"==typeof document.doctype},b.documentVisualListsAreMarkedUp=function(){b.html.find("p, div, h1, h2, h3, h4, h5, h6").each(function(){var c=a(this);a.each(b.strings.symbols,function(a,d){c.text().split(d).length>2&&b.testFails("documentVisualListsAreMarkedUp",c)})})},b.embedHasAssociatedNoEmbed=function(){b.html.find("noembed").length||b.html.find("embed").each(function(){b.testFails("embedHasAssociatedNoEmbed",a(this))})},b.emoticonsExcessiveUse=function(){var c=0;b.html.find("p, div, h1, h2, h3, h4, h5, h6").each(function(){var d=a(this);a.each(d.text().split(" "),function(a,d){b.strings.emoticons.indexOf(d)>-1&&c++,c>4}),c>4&&b.testFails("emoticonsExcessiveUse",d)})},b.emoticonsMissingAbbr=function(){b.html.find("p, div, h1, h2, h3, h4, h5, h6").each(function(){var c=a(this),d=c.clone();d.find("abbr, acronym").each(function(){a(this).remove()}),a.each(d.text().split(" "),function(a,d){b.strings.emoticons.indexOf(d)>-1&&b.testFails("emoticonsMissingAbbr",c)})})},b.formWithRequiredLabel=function(){var c,d=b.strings.redundant,e=!1;d.required[d.required.indexOf("*")]=/\*/g,b.html.find("label").each(function(){var f=a(this).text().toLowerCase(),g=a(this);a.each(d.required,function(a,c){f.search(c)>=0&&!b.html.find("#"+g.attr("for")).attr("aria-required")&&b.testFails("formWithRequiredLabel",g)}),e=g.css("color")+g.css("font-weight")+g.css("background-color"),c&&e!==c&&b.testFails("formWithRequiredLabel",g),c=e})},b.headersUseToMarkSections=function(){b.html.find("p").each(function(){var c=a(this);c.find("strong:first, em:first, i:first, b:first").each(function(){c.text()===a(this).text()&&b.testFails("headersUseToMarkSections",c)})})},b.imgAltIsDifferent=function(){b.html.find("img[alt][src]").each(function(){(a(this).attr("src")===a(this).attr("alt")||a(this).attr("src").split("/").pop()===a(this).attr("alt"))&&b.testFails("imgAltIsDifferent",a(this))})},b.imgAltIsTooLong=function(){b.html.find("img[alt]").each(function(){a(this).attr("alt").length>100&&b.testFails("imgAltIsTooLong",a(this))})},b.imgAltNotEmptyInAnchor=function(){b.html.find("a img").each(function(){b.isUnreadable(a(this).attr("alt"))&&b.isUnreadable(a(this).parent("a:first").text())&&b.testFails("imgAltNotEmptyInAnchor",a(this))})},b.imgAltTextNotRedundant=function(){var c={};b.html.find("img[alt]").each(function(){"undefined"==typeof c[a(this).attr("alt")]?c[a(this).attr("alt")]=a(this).attr("src"):c[a(this).attr("alt")]!==a(this).attr("src")&&b.testFails("imgAltTextNotRedundant",a(this))})},b.imgGifNoFlicker=function(){b.html.find('img[src$=".gif"]').each(function(){var c=a(this);a.ajax({url:c.attr("src"),async:!1,dataType:"text",success:function(a){-1!==a.search("NETSCAPE2.0")&&b.testFails("imgGifNoFlicker",c)}})})},b.imgHasLongDesc=function(){b.html.find("img[longdesc]").each(function(){a(this).attr("longdesc")!==a(this).attr("alt")&&b.validURL(a(this).attr("longdesc"))||b.testFails("imgHasLongDesc",a(this))})},b.imgImportantNoSpacerAlt=function(){b.html.find("img[alt]").each(function(){var c=a(this).width()?a(this).width():parseInt(a(this).attr("width"),10),d=a(this).height()?a(this).height():parseInt(a(this).attr("height"),10);b.isUnreadable(a(this).attr("alt").trim())&&a(this).attr("alt").length>0&&c>50&&d>50&&b.testFails("imgImportantNoSpacerAlt",a(this))})},b.imgMapAreasHaveDuplicateLink=function(){var c={};b.html.find("a").each(function(){c[a(this).attr("href")]=a(this).attr("href")}),b.html.find("img[usemap]").each(function(){var d=a(this),e=b.html.find(d.attr("usemap"));e.length||(e=b.html.find('map[name="'+d.attr("usemap").replace("#","")+'"]')),e.length&&e.find("area").each(function(){"undefined"==typeof c[a(this).attr("href")]&&b.testFails("imgMapAreasHaveDuplicateLink",d)})})},b.imgNonDecorativeHasAlt=function(){b.html.find("img[alt]").each(function(){b.isUnreadable(a(this).attr("alt"))&&(a(this).width()>100||a(this).height()>100)&&b.testFails("imgNonDecorativeHasAlt",a(this))})},b.imgWithMathShouldHaveMathEquivalent=function(){b.html.find("img:not(img:has(math), img:has(tagName))").each(function(){a(this).parent().find("math").length||b.testFails("imgWithMathShouldHaveMathEquivalent",a(this))})},b.inputCheckboxRequiresFieldset=function(){b.html.find(":checkbox").each(function(){a(this).parents("fieldset").length||b.testFails("inputCheckboxRequiresFieldset",a(this))})},b.inputImageAltIsNotFileName=function(){b.html.find("input[type=image][alt]").each(function(){a(this).attr("src")===a(this).attr("alt")&&b.testFails("inputImageAltIsNotFileName",a(this))})},b.inputImageAltIsShort=function(){b.html.find("input[type=image]").each(function(){a(this).attr("alt").length>100&&b.testFails("inputImageAltIsShort",a(this))})},b.inputImageAltNotRedundant=function(){b.html.find("input[type=image][alt]").each(function(){b.strings.redundant.inputImage.indexOf(b.cleanString(a(this).attr("alt")))>-1&&b.testFails("inputImageAltNotRedundant",a(this))})},b.labelMustBeUnique=function(){var c={};b.html.find("label[for]").each(function(){"undefined"!=typeof c[a(this).attr("for")]&&b.testFails("labelMustBeUnique",a(this)),c[a(this).attr("for")]=a(this).attr("for")})},b.labelsAreAssignedToAnInput=function(){b.html.find("label").each(function(){a(this).attr("for")?b.html.find("#"+a(this).attr("for")).length&&b.html.find("#"+a(this).attr("for")).is("input, select, textarea")||b.testFails("labelsAreAssignedToAnInput",a(this)):b.testFails("labelsAreAssignedToAnInput",a(this))})},b.listNotUsedForFormatting=function(){b.html.find("ol, ul").each(function(){a(this).find("li").length<2&&b.testFails("listNotUsedForFormatting",a(this))})},b.pNotUsedAsHeader=function(){var c={};b.html.find("p").each(function(){if(a(this).text().search(".")<1){var d=a(this);a.each(b.suspectPHeaderTags,function(c,e){d.find(e).length&&d.find(e).each(function(){a(this).text().trim()===d.text().trim()&&b.testFails("pNotUsedAsHeader",d)})}),a.each(b.suspectPCSSStyles,function(a,e){"undefined"!=typeof c[e]&&c[e]!==d.css(e)&&b.testFails("pNotUsedAsHeader",d),c[e]=d.css(e)}),"bold"===d.css("font-weight")&&b.testFails("pNotUsedAsHeader",d)}})},b.paragarphIsWrittenClearly=function(){b.html.find("p").each(function(){var c=b.components.textStatistics.cleanText(a(this).text());Math.round(206.835-1.015*b.components.textStatistics.averageWordsPerSentence(c)-84.6*b.components.textStatistics.averageSyllablesPerWord(c))<60&&b.testFails("paragarphIsWrittenClearly",a(this))})},b.preShouldNotBeUsedForTabularLayout=function(){b.html.find("pre").each(function(){var c=a(this).text().split(/[\n\r]+/);c.length>1&&a(this).text().search(/\t/)>-1&&b.testFails("preShouldNotBeUsedForTabularLayout",a(this))})},b.selectJumpMenu=function(){0!==b.html.find("select").length&&b.html.find("select").each(function(){0===a(this).parent("form").find(":submit").length&&b.components.hasEventListener(a(this),"change")&&b.testFails("selectJumpMenu",a(this))})},b.siteMap=function(){var c=!0;b.html.find("a").each(function(){var d=a(this).text().toLowerCase();a.each(b.strings.siteMap,function(a,b){return d.search(b)>-1?(c=!1,void 0):void 0}),c===!1}),c&&b.testFails("siteMap",b.html.find("body"))},b.tabIndexFollowsLogicalOrder=function(){var c=0;b.html.find("[tabindex]").each(function(){parseInt(a(this).attr("tabindex"),10)>=0&&parseInt(a(this).attr("tabindex"),10)!==c+1&&b.testFails("tabIndexFollowsLogicalOrder",a(this)),c++})},b.tableHeaderLabelMustBeTerse=function(){b.html.find("th, table tr:first td").each(function(){a(this).text().length>20&&(!a(this).attr("abbr")||a(this).attr("abbr").length>20)&&b.testFails("tableHeaderLabelMustBeTerse",a(this))})},b.tableLayoutDataShouldNotHaveTh=function(){b.html.find("table:has(th)").each(function(){b.isDataTable(a(this))||b.testFails("tableLayoutDataShouldNotHaveTh",a(this))})},b.tableLayoutHasNoCaption=function(){b.html.find("table:has(caption)").each(function(){b.isDataTable(a(this))||b.testFails("tableLayoutHasNoCaption",a(this))})},b.tableLayoutHasNoSummary=function(){b.html.find("table[summary]").each(function(){b.isDataTable(a(this))||b.isUnreadable(a(this).attr("summary"))||b.testFails("tableLayoutHasNoSummary",a(this))})},b.tableLayoutMakesSenseLinearized=function(){b.html.find("table").each(function(){b.isDataTable(a(this))||b.testFails("tableLayoutMakesSenseLinearized",a(this))})},b.tableNotUsedForLayout=function(){b.html.find("table").each(function(){b.isDataTable(a(this))||b.testFails("tableNotUsedForLayout",a(this))})},b.tableSummaryDoesNotDuplicateCaption=function(){b.html.find("table[summary]:has(caption)").each(function(){b.cleanString(a(this).attr("summary"))===b.cleanString(a(this).find("caption:first").text())&&b.testFails("tableSummaryDoesNotDuplicateCaption",a(this))})},b.tableSummaryIsNotTooLong=function(){b.html.find("table[summary]").each(function(){a(this).attr("summary").trim().length>100&&b.testFails("tableSummaryIsNotTooLong",a(this))})},b.tableUseColGroup=function(){b.html.find("table").each(function(){b.isDataTable(a(this))&&!a(this).find("colgroup").length&&b.testFails("tableUseColGroup",a(this))})},b.tableUsesAbbreviationForHeader=function(){b.html.find("th:not(th[abbr])").each(function(){a(this).text().length>20&&b.testFails("tableUsesAbbreviationForHeader",a(this))})},b.tableUsesScopeForRow=function(){b.html.find("table").each(function(){a(this).find("td:first-child").each(function(){var c=a(this).next("td");("bold"===a(this).css("font-weight")&&"bold"!==c.css("font-weight")||a(this).find("strong").length&&!c.find("strong").length)&&b.testFails("tableUsesScopeForRow",a(this))}),a(this).find("td:last-child").each(function(){var c=a(this).prev("td");("bold"===a(this).css("font-weight")&&"bold"!==c.css("font-weight")||a(this).find("strong").length&&!c.find("strong").length)&&b.testFails("tableUsesScopeForRow",a(this))})})},b.tableWithMoreHeadersUseID=function(){b.html.find("table:has(th)").each(function(){var c=a(this),d=0;c.find("tr").each(function(){a(this).find("th").length&&d++,d>1&&!a(this).find("th[id]").length&&b.testFails("tableWithMoreHeadersUseID",c)})})},b.tabularDataIsInTable=function(){b.html.find("pre").each(function(){a(this).html().search(" ")>=0&&b.testFails("tabularDataIsInTable",a(this))})},b.textIsNotSmall=function(){b.html.find(b.textSelector).each(function(){var c=a(this).css("font-size");c.search("em")>0&&(c=b.components.convertToPx(c)),c=parseInt(c.replace("px",""),10),10>c&&b.testFails("textIsNotSmall",a(this))})},b.videosEmbeddedOrLinkedNeedCaptions=function(){b.html.find("a").each(function(){var c=a(this);a.each(b.components.video,function(a,d){d.isVideo(c.attr("href"))&&d.hasCaptions(function(a){a||b.testFails("videosEmbeddedOrLinkedNeedCaptions",c)})})})}}(jQuery); \ No newline at end of file diff --git a/dist/tests.json b/dist/tests.json new file mode 100644 index 000000000..b10e2faf1 --- /dev/null +++ b/dist/tests.json @@ -0,0 +1,5405 @@ +{ + "aAdjacentWithSameResourceShouldBeCombined": { + "callback": "aAdjacentWithSameResourceShouldBeCombined", + "tags": [ + "link", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "wcag": { + "2.4.4": { + "techniques": [ + "H2" + ] + } + } + }, + "title": { + "en": "Adjacent links that point to the same location should be merged" + }, + "description": { + "en": "Because many users of screen-readers use links to navigate the page, providing two links right next to eachother that points to the same location can be confusing. Try combining the links." + } + }, + "aImgAltNotRepetative": { + "callback": "aImgAltNotRepetative", + "tags": [ + "link", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "wcag": { + "1.1.1": { + "techniques": [ + "H30" + ] + }, + "2.4.4": { + "techniques": [ + "H30" + ] + }, + "2.4.9": { + "techniques": [ + "H30" + ] + } + } + }, + "title": { + "en": "When an image is in a link, its \"alt\" attribute should not repeat other text in the link" + }, + "description": { + "en": "Images within a link should not have an alt attribute that simply repeats the text found in the link. This will cause screen readers to simply repeat the text twice." + } + }, + "aLinkTextDoesNotBeginWithRedundantWord": { + "callback": "aLinkTextDoesNotBeginWithRedundantWord", + "strings": "redundant.link", + "tags": [ + "link", + "content" + ], + "testability": 0, + "type": "custom", + "guidelines": { + "wcag": { + "2.4.9": { + "techniques": [ + "F84" + ] + } + } + }, + "title": { + "en": "Link text should not begin with redundant text" + }, + "description": { + "en": "Link text should not begin with redundant words or phrases like \"link\"" + } + }, + "aLinksAreSeperatedByPrintableCharacters": { + "callback": "aLinksAreSeperatedByPrintableCharacters", + "tags": [ + "link", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": [], + "title": { + "en": "Lists of links should be seperated by printable characters" + }, + "description": { + "en": "If a list of links is provided within the same element, those links should be seperated by a non-linked, printable character. Structures like lists are not included in this." + } + }, + "aLinksDontOpenNewWindow": { + "selector": "a[target=_new], a[target=_blank], a[target=_blank]", + "tags": [ + "link", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": { + "wcag": { + "3.2.5": { + "techniques": [ + "H83" + ] + } + } + }, + "title": { + "en": "Links should not open a new window without warning" + }, + "description": { + "en": "Links which open a new window using the \"target\" attribute should warn users." + } + }, + "aLinksNotSeparatedBySymbols": { + "callback": "aLinksNotSeparatedBySymbols", + "tags": [ + "link", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": [] + }, + "aLinksToMultiMediaRequireTranscript": { + "selector": "a[href$='.wmv'], a[href$='.mpg'], a[href$='.mov'], a[href$='.ram'], a[href$='.aif']", + "tags": [ + "link", + "media", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "508": [ + "c" + ], + "wcag": { + "1.1.1": { + "techniques": [ + "G74" + ] + } + } + }, + "title": { + "en": "Any links to a multimedia file should also include a link to a transcript" + }, + "description": { + "en": "Links to a multimedia file should be followed by a link to a transcript of the file." + } + }, + "aLinksToSoundFilesNeedTranscripts": { + "selector": "a[href$='.wav'], a[href$='.snd'], a[href$='.mp3'], a[href$='.iff'], a[href$='.svx'], a[href$='.sam'], a[href$='.smp'], a[href$='.vce'], a[href$='.vox'], a[href$='.pcm'], a[href$='.aif']", + "tags": [ + "link", + "media", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "508": [ + "c" + ], + "wcag": { + "1.1.1": { + "techniques": [ + "G74" + ] + } + } + }, + "title": { + "en": "Any links to a sound file should also include a link to a transcript" + }, + "description": { + "en": "Links to a sound file should be followed by a link to a transcript of the file." + } + }, + "aMultimediaTextAlternative": { + "selector": "a[href$='.wmv'], a[href$='.wav'], a[href$='.mpg'], a[href$='.mov'], a[href$='.ram'], a[href$='.aif']", + "tags": [ + "link", + "media", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": [] + }, + "aMustContainText": { + "callback": "aMustContainText", + "tags": [ + "link", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "wcag": { + "1.1.1": { + "techniques": [ + "H30" + ] + }, + "2.4.4": { + "techniques": [ + "H30" + ] + }, + "2.4.9": { + "techniques": [ + "H30" + ] + } + } + }, + "title": { + "en": "Links should contain text" + }, + "description": { + "en": "Because many users of screen-readers use links to navigate the page, providing links with no text (or with images that have empty \"alt\" attributes and no other readable text) hinders these users." + } + }, + "aMustHaveTitle": { + "selector": "a:not(a[title])", + "tags": [ + "link", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "All links must have a \"title\" attribute" + }, + "description": { + "en": "Every link must have a \"title\" attribute." + } + }, + "aMustNotHaveJavascriptHref": { + "selector": "a[href^='javascript:']", + "tags": [ + "link", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "Links should not use \"javascript\" in their location" + }, + "description": { + "en": "Anchor (a. elements may not use the \"javascript\" protocol in their \"href\" attributes." + } + }, + "aSuspiciousLinkText": { + "callback": "aSuspiciousLinkText", + "strings": "suspiciousLinks", + "tags": [ + "link", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "wcag": { + "1.1.1": { + "techniques": [ + "H30" + ] + }, + "2.4.4": { + "techniques": [ + "H30" + ] + }, + "2.4.9": { + "techniques": [ + "H30" + ] + } + } + }, + "title": { + "en": "Link text should be useful" + }, + "description": { + "en": "Because many users of screen-readers use links to navigate the page, providing links with text that simply read \"click here\" gives no hint of the function of the link" + } + }, + "aTitleDescribesDestination": { + "selector": "a[title]", + "tags": [ + "link", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "wcag": { + "2.4.9": { + "techniques": [ + "H33", + "H25" + ] + } + } + }, + "title": { + "en": "The title attribute of all source a (anchor) elements describes the link destination." + }, + "description": { + "en": "Every link must have a \"title\" attribute which describes the purpose or destination of the link." + } + }, + "addressForAuthor": { + "selector": "body:not(body:has(address))", + "tags": [ + "document" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "The document should contain an address for the author" + }, + "description": { + "en": "Documents should provide a valid email address within an address element." + } + }, + "addressForAuthorMustBeValid": { + "selector": "address", + "tags": [ + "document" + ], + "testability": 0.5, + "type": "selector", + "guidelines": [], + "title": { + "en": "The document should contain a valid email address for the author" + }, + "description": { + "en": "Documents should provide a valid email address within an address element." + } + }, + "appletContainsTextEquivalent": { + "callback": "appletContainsTextEquivalent", + "tags": [ + "objects", + "applet", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "508": [ + "m" + ], + "wcag": { + "1.1.1": { + "techniques": [ + "G74", + "H35" + ] + } + } + }, + "title": { + "en": "All applets should contain the same content within the body of the applet" + }, + "description": { + "en": "Applets should contain their text equivalents or description within the applet tag itself." + } + }, + "appletContainsTextEquivalentInAlt": { + "attribute": "alt", + "components": [ + "placeholder" + ], + "empty": true, + "selector": "applet", + "tags": [ + "objects", + "applet", + "content" + ], + "testability": 0.5, + "type": "placeholder", + "guidelines": { + "508": [ + "m" + ], + "wcag": { + "1.1.1": { + "techniques": [ + "G74", + "H35" + ] + } + } + }, + "title": { + "en": "All applets should contain a text equivalent in the \"alt\" attribute" + }, + "description": { + "en": "Applets should contain their text equivalents or description in an \"alt\" attribute." + } + }, + "appletProvidesMechanismToReturnToParent": { + "selector": "applet", + "tags": [ + "objects", + "applet", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": [], + "title": { + "en": "All applets should provide a way for keyboard users to escape" + }, + "description": { + "en": "Ensure that a user who has only a keyboard as an input device can escape an applet element. This requires manual confirmation." + } + }, + "appletTextEquivalentsGetUpdated": { + "selector": "applet", + "tags": [ + "objects", + "applet", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "508": [ + "m" + ], + "wcag": { + "1.1.1": { + "techniques": [ + "G74", + "H35" + ] + } + } + } + }, + "appletUIMustBeAccessible": { + "selector": "applet", + "tags": [ + "objects", + "applet", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "508": [ + "m" + ], + "wcag": { + "1.1.1": { + "techniques": [ + "G74", + "H35" + ] + } + } + }, + "title": { + "en": "Any user interface in an applet must be accessible" + }, + "description": { + "en": "Applet content should be assessed for accessibility." + } + }, + "appletsDoNotFlicker": { + "selector": "applet", + "tags": [ + "objects", + "applet", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "508": [ + "j" + ], + "wcag": { + "2.2.2": { + "techniques": [ + "F7" + ] + } + } + }, + "title": { + "en": "All applets do not flicker" + }, + "description": { + "en": "Applets should not flicker." + } + }, + "appletsDoneUseColorAlone": { + "selector": "applet", + "tags": [ + "objects", + "applet", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "508": [ + "c" + ] + }, + "title": { + "en": "Applets should not use color alone to communicate content" + }, + "description": { + "en": "Applets should contain content that makes sense without color and is accessible to users who are color blind." + } + }, + "areaAltIdentifiesDestination": { + "selector": "area[alt]", + "tags": [ + "objects", + "applet", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "wcag": { + "1.1.1": { + "techniques": [ + "G74" + ] + } + } + }, + "title": { + "en": "All \"area\" elements must have an \"alt\" attribute which describes the link destination" + }, + "description": { + "en": "All area elements within a map must have an \"alt\" attribute" + } + }, + "areaAltRefersToText": { + "selector": "area", + "tags": [ + "imagemap", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": [], + "title": { + "en": "Alt text for \"area\" elements should replicate the text found in the image" + }, + "description": { + "en": "If an image is being used as a map, and an area encompasses text within the image, then the \"alt\" attribute of that area element should be the same as the text found in the image." + } + }, + "areaDontOpenNewWindow": { + "selector": "area[target='new window'], area[target=_new], area[target=_blank], area[target=_blank]", + "tags": [ + "imagemap", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "No \"area\" elements should open a new window without warning" + }, + "description": { + "en": "No area elements should open a new window without warning." + } + }, + "areaHasAltValue": { + "selector": "area:not(area[alt])", + "tags": [ + "imagemap", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": { + "wcag": { + "1.1.1": { + "techniques": [ + "F65", + "G74", + "H24" + ] + }, + "1.4.3": { + "techniques": [ + "G145" + ] + } + } + }, + "title": { + "en": "All \"area\" elements must have an \"alt\" attribute" + }, + "description": { + "en": "All area elements within a map must have an \"alt\" attribute." + } + }, + "areaLinksToSoundFile": { + "selector": "area[href$=wav], area[href$=snd], area[href$=mp3], area[href$=iff], area[href$=svx], area[href$=sam], area[href$=smp], area[href$=vce], area[href$=vox], area[href$=pcm], area[href$=aif]", + "tags": [ + "imagemap", + "media", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": { + "wcag": { + "1.1.1": { + "techniques": [ + "G74" + ] + } + } + }, + "title": { + "en": "All \"area\" elements which link to a sound file should also provide a link to a transcript" + }, + "description": { + "en": "All area elements which link to a sound file should have a text transcript" + } + }, + "ariaOrphanedContent": { + "selector": "body *:not(*[role] *, *[role], script, meta, link)", + "tags": [ + "aria", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "Pages using ARIA roles should not have orphaned content" + }, + "description": { + "en": "If a page makes use of ARIA roles, then there should not be any content on the page which is not within an element that exposes a role, as it could cause that content to be rendreed inaccessible to users with screen readers." + } + }, + "basefontIsNotUsed": { + "selector": "basefont", + "tags": [ + "document", + "deprecated" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "Basefont should not be used" + }, + "description": { + "en": "The basefont tag is deprecated and should not be used. Investigate using stylesheets instead." + } + }, + "blinkIsNotUsed": { + "selector": "blink", + "tags": [ + "deprecated", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": { + "wcag": { + "2.2.2": { + "techniques": [ + "F47" + ] + } + } + }, + "title": { + "en": "The \"blink\" tag should not be used" + }, + "description": { + "en": "The blink tag should not be used. Ever." + } + }, + "blockquoteNotUsedForIndentation": { + "selector": "blockquote:not(blockquote[cite])", + "tags": [ + "blockquote", + "content" + ], + "testability": 0.5, + "type": "selector", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "H49" + ] + } + } + }, + "title": { + "en": "The \"blockquote\" tag should not be used just for indentation" + }, + "description": { + "en": ".. code-block:: html" + } + }, + "blockquoteUseForQuotations": { + "callback": "blockquoteUseForQuotations", + "tags": [ + "blockquote", + "content" + ], + "testability": 0.5, + "type": "custom", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "H49" + ] + } + } + }, + "title": { + "en": "If long quotes are in the document, use the \"blockquote\" element to mark them" + }, + "description": { + "en": ".. code-block:: html" + } + }, + "bodyActiveLinkColorContrast": { + "algorithm": "wcag", + "bodyBackgroundAttribute": "bgcolor", + "bodyForegroundAttribute": "alink", + "components": [ + "color" + ], + "selector": "a:active", + "tags": [ + "document", + "color" + ], + "testability": 1, + "type": "color", + "guidelines": [], + "title": { + "en": "Contrast between active link text and background should be 5:1" + }, + "description": { + "en": "The contrast ratio of active link text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it." + } + }, + "bodyColorContrast": { + "algorithm": "wcag", + "bodyBackgroundAttribute": "bgcolor", + "bodyForegroundAttribute": "text", + "components": [ + "color" + ], + "selector": "body", + "tags": [ + "document", + "color" + ], + "testability": 1, + "type": "color", + "guidelines": [], + "title": { + "en": "Contrast between text and background should be 5:1" + }, + "description": { + "en": "The contrast ratio of text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it." + } + }, + "bodyLinkColorContrast": { + "algorithm": "wcag", + "bodyBackgroundAttribute": "bgcolor", + "bodyForegroundAttribute": "link", + "components": [ + "color" + ], + "selector": "a", + "tags": [ + "document", + "color" + ], + "testability": 1, + "type": "color", + "guidelines": [], + "title": { + "en": "Contrast between link text and background should be 5:1" + }, + "description": { + "en": "The contrast ratio of link text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it." + } + }, + "bodyMustNotHaveBackground": { + "selector": "body[background]", + "tags": [ + "document", + "color" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "Body elements do not use a background image" + }, + "description": { + "en": "The body element for the page may not have a \"background\" attribute." + } + }, + "bodyVisitedLinkColorContrast": { + "algorithm": "wcag", + "bodyBackgroundAttribute": "bgcolor", + "bodyForegroundAttribute": "vlink", + "components": [ + "color" + ], + "selector": "a:visited", + "tags": [ + "link", + "color" + ], + "testability": 1, + "type": "color", + "guidelines": [], + "title": { + "en": "Contrast between visited link text and background should be 5:1" + }, + "description": { + "en": "The contrast ratio of visited link text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it." + } + }, + "boldIsNotUsed": { + "selector": "bold", + "tags": [ + "semantics", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "The \"b\" (bold) element is not used" + }, + "description": { + "en": "The b (bold) element provides no emphasis for non-sighted readers. Use the strong tag instead." + } + }, + "checkboxHasLabel": { + "components": [ + "label" + ], + "selector": "input[type=checkbox]", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "label", + "guidelines": { + "508": [ + "c" + ], + "wcag": { + "1.1.1": { + "techniques": [ + "H44" + ] + }, + "1.3.1": { + "techniques": [ + "H44", + "F68" + ] + }, + "3.3.2": { + "techniques": [ + "H44" + ] + }, + "4.1.2": { + "techniques": [ + "H44" + ] + } + } + }, + "title": { + "en": "All checkboxes must have a corresponding label" + }, + "description": { + "en": "All input elements with a type of \"checkbox\" should have a corresponding label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user" + } + }, + "checkboxLabelIsNearby": { + "components": [ + "labelProximity" + ], + "selector": "input[type=checkbox]", + "tags": [ + "form", + "content" + ], + "testability": 0.5, + "type": "labelProximity", + "guidelines": [], + "title": { + "en": "All \"checkbox\" input elements have a label that is close" + }, + "description": { + "en": "All input elements of type \"checkbox\" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away." + } + }, + "cssDocumentMakesSenseStyleTurnedOff": { + "selector": "link[rel=stylesheet], stylesheet, *[style]", + "tags": [ + "color" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "G140" + ] + }, + "1.4.5": { + "techniques": [ + "G140" + ] + }, + "1.4.9": { + "techniques": [ + "G140" + ] + } + } + }, + "title": { + "en": "The document must be readable with styles turned off" + }, + "description": { + "en": "With all the styles for a page turned off, the content of the page should still make sense. Try to turn styles off in the browser and see if the page content is readable and clear." + } + }, + "cssTextHasContrast": { + "algorithm": "wcag", + "bodyBackgroundAttribute": "color", + "bodyForegroundAttribute": "background", + "components": [ + "color" + ], + "selector": "*", + "tags": [ + "color" + ], + "testability": 1, + "type": "color", + "guidelines": { + "wcag": { + "1.4.3": { + "techniques": [ + "G18" + ] + } + } + }, + "title": { + "en": "All elements should have appropriate color contrast" + }, + "description": { + "en": "For users who have color blindness, all text or other elements should have a color contrast of 5:1." + } + }, + "doctypeProvided": { + "callback": "doctypeProvided", + "tags": [ + "doctype" + ], + "testability": 1, + "type": "custom", + "guidelines": [], + "title": { + "en": "The document should contain a valid \"doctype\" declaration" + }, + "description": { + "en": "Each document must contain a valid doctype declaration.." + } + }, + "documentAbbrIsUsed": { + "callback": "documentAbbrIsUsed", + "components": [ + "acronym" + ], + "tags": [ + "acronym", + "content" + ], + "testability": 0.5, + "type": "custom", + "guidelines": { + "wcag": { + "3.1.4": { + "techniques": [ + "H28" + ] + } + } + }, + "title": { + "en": "Abbreviations must be marked with an \"abbr\" element" + }, + "description": { + "en": "Abbreviations should be marked with an abbr element, at least once on the page for each abbreviation." + } + }, + "documentAcronymsHaveElement": { + "callback": "documentAcronymsHaveElement", + "components": [ + "acronym" + ], + "tags": [ + "acronym", + "content" + ], + "testability": 0.5, + "type": "custom", + "guidelines": { + "wcag": { + "3.1.4": { + "techniques": [ + "H28" + ] + } + } + }, + "title": { + "en": "Acronyms must be marked with an \"acronym\" element" + }, + "description": { + "en": "Abbreviations should be marked with an acronym element, at least once on the page for each abbreviation." + } + }, + "documentAllColorsAreSet": { + "selector": "body:not(body[text][bgcolor][link][alink][vlink], body:not(body[text], body[bgcolor], body[link], body[alink], body[vlink]))", + "tags": [ + "deprecated", + "color" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "All the document colors must be set" + }, + "description": { + "en": "If any colors for text or the background are set in the body element, then all colors must be set." + } + }, + "documentAutoRedirectNotUsed": { + "selector": "meta[http-equiv=refresh]", + "tags": [ + "document" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "Auto-redirect with \"meta\" elements must not be used" + }, + "description": { + "en": "Because different users have different speeds and abilities when it comes to parsing the content of a page, a \"meta-refresh\" method to redirect users can prevent users from fully understanding the document before being redirected. If a pure redirect is needed" + } + }, + "documentColorWaiActiveLinkAlgorithm": { + "algorithm": "wai", + "bodyBackgroundAttribute": "bgcolor", + "bodyForegroundAttribute": "alink", + "components": [ + "color" + ], + "selector": "a:active", + "tags": [ + "document", + "color" + ], + "testability": 1, + "type": "color", + "guidelines": [] + }, + "documentColorWaiAlgorithm": { + "algorithm": "wai", + "bodyBackgroundAttribute": "bgcolor", + "bodyForegroundAttribute": "text", + "components": [ + "color" + ], + "selector": "body", + "tags": [ + "document", + "color" + ], + "testability": 1, + "type": "color", + "guidelines": [] + }, + "documentColorWaiLinkAlgorithm": { + "algorithm": "wai", + "bodyBackgroundAttribute": "bgcolor", + "bodyForegroundAttribute": "link", + "components": [ + "color" + ], + "selector": "a", + "tags": [ + "document", + "color" + ], + "testability": 1, + "type": "color", + "guidelines": [] + }, + "documentColorWaiVisitedLinkAlgorithm": { + "algorithm": "wai", + "bodyBackgroundAttribute": "bgcolor", + "bodyForegroundAttribute": "vlink", + "components": [ + "color" + ], + "selector": "a:visited", + "tags": [ + "document", + "color" + ], + "testability": 1, + "type": "color", + "guidelines": [] + }, + "documentContentReadableWithoutStylesheets": { + "selector": "html:has(link[rel=stylesheet], style) body, body:has(*[style])", + "tags": [ + "document", + "color" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "508": [ + "d" + ], + "wcag": { + "1.3.1": { + "techniques": [ + "G140" + ] + }, + "1.4.5": { + "techniques": [ + "G140" + ] + }, + "1.4.9": { + "techniques": [ + "G140" + ] + } + } + }, + "title": { + "en": "Content should be readable without style sheets" + }, + "description": { + "en": "With all the styles for a page turned off, the content of the page should still make sense. Try to turn styles off in the browser and see if the page content is readable and clear." + } + }, + "documentHasTitleElement": { + "selector": "html:not(html:has(title))", + "tags": [ + "document", + "head" + ], + "testability": 1, + "type": "selector", + "guidelines": { + "wcag": { + "2.4.2": { + "techniques": [ + "H25" + ] + } + } + }, + "title": { + "en": "The document should have a title element" + }, + "description": { + "en": "The document should have a title element." + } + }, + "documentIDsMustBeUnique": { + "callback": "documentIDsMustBeUnique", + "tags": [ + "document", + "semantics" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "wcag": { + "4.1.1": { + "techniques": [ + "F77" + ] + } + } + }, + "title": { + "en": "All element \"id\" attributes must be unique" + }, + "description": { + "en": "Element \"id\" attributes must be unique." + } + }, + "documentIsWrittenClearly": { + "callback": "documentIsWrittenClearly", + "components": [ + "textStatistics" + ], + "tags": [ + "language", + "content" + ], + "testability": 0.5, + "type": "custom", + "guidelines": { + "wcag": { + "3.1.5": { + "techniques": [ + "G86" + ] + } + } + }, + "title": { + "en": "The document should be written to the target audience and read clearly" + }, + "description": { + "en": "If a document is beyond a 10th grade level, then a summary or other guide should also be provided to guide the user through the content." + } + }, + "documentLangIsISO639Standard": { + "callback": "documentLangIsISO639Standard", + "strings": "languageCodes", + "tags": [ + "document", + "language" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "wcag": { + "3.1.1": { + "techniques": [ + "H57" + ] + } + } + }, + "title": { + "en": "The document's language attribute should be a standard code" + }, + "description": { + "en": "The document should have a default langauge, and that language should use the valid 2 or 3 letter language code according to ISO specification 639." + } + }, + "documentLangNotIdentified": { + "selector": "html:not(html[lang])", + "tags": [ + "document", + "language" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "The document must have a \"lang\" attribute" + }, + "description": { + "en": "The document should have a default langauge, by setting the \"lang\" attribute in the html element." + } + }, + "documentMetaNotUsedWithTimeout": { + "selector": "meta[http-equiv=refresh]", + "tags": [ + "document" + ], + "testability": 1, + "type": "selector", + "guidelines": { + "wcag": { + "2.2.1": { + "techniques": [ + "F40", + "F41" + ] + }, + "2.2.4": { + "techniques": [ + "F40", + "F41" + ] + }, + "3.2.5": { + "techniques": [ + "F41" + ] + } + } + }, + "title": { + "en": "Meta elements must not be used to refresh the content of a page" + }, + "description": { + "en": "Because different users have different speeds and abilities when it comes to parsing the content of a page, a \"meta-refresh\" method to reload the content of the page can prevent users from having full access to the content. Try to use a \"refresh this\" link instead.." + } + }, + "documentReadingDirection": { + "selector": "*[lang=he]:not(*[dir=rtl]), *[lang=ar]:not(*[dir=rtl])", + "tags": [ + "document", + "language" + ], + "testability": 0.5, + "type": "selector", + "guidelines": { + "wcag": { + "1.3.2": { + "techniques": [ + "H34" + ] + } + } + }, + "title": { + "en": "Reading direction of text is correctly marked" + }, + "description": { + "en": "Where required, the reading direction of the document (for language that read in different directions), or portions of the text, must be declared." + } + }, + "documentStrictDocType": { + "callback": "documentStrictDocType", + "tags": [ + "document", + "doctype" + ], + "testability": 1, + "type": "custom", + "guidelines": [], + "title": { + "en": "The page uses a strict doctype" + }, + "description": { + "en": "The doctype of the page or document should be either an HTML or XHTML strict doctype." + } + }, + "documentTitleDescribesDocument": { + "selector": "head title:first", + "tags": [ + "document", + "head" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "wcag": { + "2.4.2": { + "techniques": [ + "F25", + "G88" + ] + } + } + }, + "title": { + "en": "The title describes the document" + }, + "description": { + "en": "The document title should actually describe the page. Often, screen readers use the title to navigate from one window to another." + } + }, + "documentTitleIsNotPlaceholder": { + "components": [ + "placeholder" + ], + "content": true, + "selector": "head title:first", + "tags": [ + "document", + "head" + ], + "testability": 1, + "type": "placeholder", + "guidelines": { + "wcag": { + "2.4.2": { + "techniques": [ + "F25", + "G88" + ] + } + } + }, + "title": { + "en": "The document title should not be placeholder text" + }, + "description": { + "en": "The document title should not be wasted placeholder text which does not describe the page." + } + }, + "documentTitleIsShort": { + "callback": "documentTitleIsShort", + "tags": [ + "document", + "head" + ], + "testability": 0.5, + "type": "custom", + "guidelines": [], + "title": { + "en": "The document title should be short" + }, + "description": { + "en": "The document title should be short and succinct. This test fails at 150 characters, but authors should consider this to be a suggestion." + } + }, + "documentTitleNotEmpty": { + "components": [ + "placeholder" + ], + "content": true, + "empty": true, + "selector": "head title", + "tags": [ + "document", + "head" + ], + "testability": 1, + "type": "placeholder", + "guidelines": { + "wcag": { + "2.4.2": { + "techniques": [ + "F25", + "H25" + ] + } + } + }, + "title": { + "en": "The document should not have an empty title" + }, + "description": { + "en": "The document should have a title element that is not white space" + } + }, + "documentValidatesToDocType": { + "callback": "documentValidatesToDocType", + "tags": [ + "document", + "doctype" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "wcag": { + "4.1.1": { + "techniques": [ + "G134" + ] + } + } + }, + "title": { + "en": "Document must validate to the doctype" + }, + "description": { + "en": "The document must validate to the declared doctype." + } + }, + "documentVisualListsAreMarkedUp": { + "callback": "documentVisualListsAreMarkedUp", + "tags": [ + "list", + "semantics", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "H28", + "T2" + ] + } + } + }, + "title": { + "en": "Visual lists of items are marked using ordered or unordered lists" + }, + "description": { + "en": "Use the ordered (ol. or unordered (ul. elements for lists of items, instead of just using new lines which start with numbers or characters to create a visual list." + } + }, + "documentWordsNotInLanguageAreMarked": { + "selector": "body", + "tags": [ + "language" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "wcag": { + "3.1.2": { + "techniques": [ + "H58" + ] + } + } + }, + "title": { + "en": "Any words or phrases which are not the document's primary language should be marked" + }, + "description": { + "en": "If a document has words or phrases which are not in the document's primary language, those words or phrases should be properly marked. This helps indicate which language or voice a screen-reader should use to read the text." + } + }, + "embedHasAssociatedNoEmbed": { + "callback": "embedHasAssociatedNoEmbed", + "tags": [ + "object", + "embed", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "wcag": { + "1.1.1": { + "techniques": [ + "H46" + ] + } + } + }, + "title": { + "en": "All \"embed\" elements have an associated \"noembed\" element" + }, + "description": { + "en": "Because some users cannot use the embed element, provide alternative content in a noembed element." + } + }, + "embedMustHaveAltAttribute": { + "selector": "embed:not(embed[alt])", + "tags": [ + "object", + "embed", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "Embed\" elements must have an \"alt\" attribute" + }, + "description": { + "en": "All embed elements must have an \"alt\" attribute." + } + }, + "embedMustNotHaveEmptyAlt": { + "selector": "embed[alt=]", + "tags": [ + "object", + "embed", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "Embed\" elements cannot have an empty \"alt\" attribute" + }, + "description": { + "en": "All embed elements must have an \"alt\" attribute that is not empty." + } + }, + "embedProvidesMechanismToReturnToParent": { + "selector": "embed", + "tags": [ + "object", + "embed", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "wcag": { + "2.1.2": { + "techniques": [ + "G21" + ] + } + } + }, + "title": { + "en": "All embed elements should provide a way for keyboard users to escape" + }, + "description": { + "en": "Ensure that a user who has only a keyboard as an input device can escape an embed element. This requires manual confirmation." + } + }, + "emoticonsExcessiveUse": { + "callback": "emoticonsExcessiveUse", + "strings": "emoticons", + "tags": [ + "language", + "emoticons", + "content" + ], + "testability": 0.5, + "type": "custom", + "guidelines": { + "wcag": { + "1.1.1": { + "techniques": [ + "H86" + ] + } + } + }, + "title": { + "en": "Emoticons should not be used excessively" + }, + "description": { + "en": "Emoticons should not be used excessively to communicate feelings or content. Try to rewrite the document to have more textual meaning, or wrapping the emoticons in an abbr element as outlined below. Emoticons are not read by screen-readers, and are often used to communicate feelings or other things which are relevant to the content of the document." + } + }, + "emoticonsMissingAbbr": { + "callback": "emoticonsMissingAbbr", + "strings": "emoticons", + "tags": [ + "language", + "emoticons", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "wcag": { + "1.1.1": { + "techniques": [ + "H86" + ] + } + } + }, + "title": { + "en": "Emoticons should have abbreviations" + }, + "description": { + "en": "Emoticons are not read by screen-readers, and are often used to communicate feelings or other things which are relevant to the content of the document. If this emoticon is important content, mark it up with an \"abbr\" or \"acronym\" tag." + } + }, + "fileHasLabel": { + "components": [ + "label" + ], + "selector": "input[type=file]", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "label", + "guidelines": { + "508": [ + "n" + ], + "wcag": { + "1.1.1": { + "techniques": [ + "H44" + ] + }, + "1.3.1": { + "techniques": [ + "H44", + "F68" + ] + }, + "3.3.2": { + "techniques": [ + "H44" + ] + }, + "4.1.2": { + "techniques": [ + "H44" + ] + } + } + }, + "title": { + "en": "All \"file\" input elements have a corresponding label" + }, + "description": { + "en": "All input elements of type \"file\" should have a corresponding label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user" + } + }, + "fileLabelIsNearby": { + "components": [ + "labelProximity" + ], + "selector": "input[type=file]", + "tags": [ + "form", + "content" + ], + "testability": 0.5, + "type": "labelProximity", + "guidelines": [], + "title": { + "en": "All \"file\" input elements have a label that is close" + }, + "description": { + "en": "All input elements of type \"file\" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away." + } + }, + "fontIsNotUsed": { + "selector": "font", + "tags": [ + "deprecated", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "Font elements should not be used" + }, + "description": { + "en": "The basefont tag is deprecated and should not be used. Investigate using stylesheets instead." + } + }, + "formAllowsCheckIfIrreversable": { + "selector": "form", + "tags": [ + "form", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": [] + }, + "formDeleteIsReversable": { + "selector": "form", + "tags": [ + "form", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": [], + "title": { + "en": "Deleting items using a form should be reversable" + }, + "description": { + "en": "Check that, if a form has the option to delete an item, that the user has a chance to either reverse the delete process, or is asked for confirmation before the item is deleted. This is not something that can be checked through automated testing and requires manual confirmation." + } + }, + "formErrorMessageHelpsUser": { + "selector": "form", + "tags": [ + "form", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": [], + "title": { + "en": "Forms offer the user a way to check the results of their form before performing an irrevokable action" + }, + "description": { + "en": "If the form allows users to perform some irrevokable action, like ordreing a product, ensure that users have the ability to review the contents of the form they submitted first. This is not something that can be checked through automated testing and requires manual confirmation." + } + }, + "formHasGoodErrorMessage": { + "selector": "form", + "tags": [ + "form", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": [], + "title": { + "en": "Form error messages should assist in solving errors" + }, + "description": { + "en": "If the form has some required fields or other ways in which the user can commit an error, check that the reply is accessible. Use the words \"required\" or \"error\" within the label element of input items where the errors happened" + } + }, + "formWithRequiredLabel": { + "callback": "formWithRequiredLabel", + "tags": [ + "form", + "content" + ], + "testability": 0, + "type": "custom", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "ARIA2" + ] + }, + "1.4.1": { + "techniques": [ + "F81" + ] + }, + "3.3.2": { + "techniques": [ + "ARIA2", + "H90" + ] + }, + "3.3.3": { + "techniques": [ + "ARIA2" + ] + } + } + }, + "title": { + "en": "Input items which are required are marked as so in the label element" + }, + "description": { + "en": "If a form element is required, it should marked as so. This should not be a mere red asterisk, but instead either a 'required' image with alt text of \"required\" or the actual text \"required.\" The indicator that an item is required should be included in the input element's label element." + } + }, + "frameIsNotUsed": { + "selector": "frame", + "tags": [ + "deprecated", + "frame" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "Frames are not used" + }, + "description": { + "en": ".. code-block:: html" + } + }, + "frameRelationshipsMustBeDescribed": { + "selector": "frameset:not(frameset[longdesc])", + "tags": [ + "deprecated", + "frame" + ], + "testability": 0.5, + "type": "selector", + "guidelines": [], + "title": { + "en": "Complex framesets should contain a \"longdesc\" attribute" + }, + "description": { + "en": "If a frameset contains three or more frames, use a \"longdesc\" attribute to help describe the purpose of the frames." + } + }, + "frameSrcIsAccessible": { + "selector": "frame", + "tags": [ + "deprecated", + "frame" + ], + "testability": 0, + "type": "selector", + "guidelines": [], + "title": { + "en": "The source for each frame is accessible content." + }, + "description": { + "en": "Each frame should contain accessible content, and contain content accessible to screen readers, like HTML as opposed to an image." + } + }, + "frameTitlesDescribeFunction": { + "attribute": "title", + "components": [ + "placeholder" + ], + "empty": true, + "selector": "frame[title]", + "tags": [ + "deprecated", + "frame" + ], + "testability": 0, + "type": "placeholder", + "guidelines": { + "wcag": { + "2.4.1": { + "techniques": [ + "H64" + ] + } + } + }, + "title": { + "en": "All \"frame\" elemetns should have a \"title\" attribute that describes the purpose of the frame" + }, + "description": { + "en": "Each frame elements should have a \"title\" attribute which describes the purpose or function of the frame." + } + }, + "frameTitlesNotEmpty": { + "selector": "frame:not(frame[title]), frame[title=], iframe:not(iframe[title]), iframe[title=]", + "tags": [ + "deprecated", + "frame" + ], + "testability": 1, + "type": "selector", + "guidelines": { + "wcag": { + "2.4.1": { + "techniques": [ + "H64" + ] + }, + "4.1.2": { + "techniques": [ + "H64" + ] + } + } + }, + "title": { + "en": "Frames cannot have empty \"title\" attributes" + }, + "description": { + "en": "All frame elements must have a valid \"title\" attribute." + } + }, + "frameTitlesNotPlaceholder": { + "attribute": "title", + "components": [ + "placeholder" + ], + "selector": "frame, iframe", + "tags": [ + "deprecated", + "frame" + ], + "testability": 1, + "type": "placeholder", + "guidelines": { + "wcag": { + "2.4.1": { + "techniques": [ + "H64" + ] + }, + "4.1.2": { + "techniques": [ + "H64" + ] + } + } + }, + "title": { + "en": "Frames cannot have \"title\" attributes that are just placeholder text" + }, + "description": { + "en": "Frame \"title\" attributes should not be simple placeholder text like \"frame" + } + }, + "framesHaveATitle": { + "selector": "frame:not(frame[title]), iframe:not(iframe[title])", + "tags": [ + "deprecated", + "frame" + ], + "testability": 1, + "type": "selector", + "guidelines": { + "wcag": { + "2.4.1": { + "techniques": [ + "H64" + ] + }, + "4.1.2": { + "techniques": [ + "H64" + ] + } + } + }, + "title": { + "en": "All \"frame\" elements should have a \"title\" attribute" + }, + "description": { + "en": "Each frame elements should have a \"title\" attribute." + } + }, + "framesetIsNotUsed": { + "selector": "frameset", + "tags": [ + "deprecated", + "frame" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "The \"frameset\" element should not be used" + }, + "description": { + "en": ".. code-block:: html" + } + }, + "framesetMustHaveNoFramesSection": { + "selector": "frameset:not(frameset:has(noframes))", + "tags": [ + "deprecated", + "frame" + ], + "testability": 0.5, + "type": "selector", + "guidelines": [], + "title": { + "en": "All framesets should contain a noframes section" + }, + "description": { + "en": "If a frameset contains three or more frames, use a \"longdesc\" attribute to help describe the purpose of the frames." + } + }, + "headerH1": { + "components": [ + "header" + ], + "selector": "h1", + "tags": [ + "header", + "content" + ], + "testability": 0, + "type": "header", + "guidelines": { + "wcag": { + "2.4.6": { + "techniques": [ + "G130" + ] + } + } + }, + "title": { + "en": "The header following an h1 is h1 or h2" + }, + "description": { + "en": "The header following an h1 element should either be an h2 or another h1. " + } + }, + "headerH1Format": { + "components": [ + "header" + ], + "selector": "h1", + "tags": [ + "header", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "T3" + ] + } + } + }, + "title": { + "en": "All h1 elements are not used for formatting" + }, + "description": { + "en": "An h1 element may not be used purely for formatting." + } + }, + "headerH2": { + "components": [ + "header" + ], + "selector": "h2", + "tags": [ + "header", + "content" + ], + "testability": 0, + "type": "header", + "guidelines": { + "wcag": { + "2.4.6": { + "techniques": [ + "G130" + ] + } + } + }, + "title": { + "en": "The header following an h2 is h1, h2 or h3" + }, + "description": { + "en": "The header following an h2 element should either be an h3, h1 or another h2. " + } + }, + "headerH2Format": { + "components": [ + "header" + ], + "selector": "h2", + "tags": [ + "header", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "T3" + ] + } + } + }, + "title": { + "en": "All h2 elements are not used for formatting" + }, + "description": { + "en": "An h2 element may not be used purely for formatting." + } + }, + "headerH3": { + "components": [ + "header" + ], + "selector": "h3", + "tags": [ + "header", + "content" + ], + "testability": 0, + "type": "header", + "guidelines": { + "wcag": { + "2.4.6": { + "techniques": [ + "G130" + ] + } + } + }, + "title": { + "en": "The header following an h3 is h1, h2, h3 or h4" + }, + "description": { + "en": "The header following an h3 element should either be an h4, h2, h1 or another h3. " + } + }, + "headerH3Format": { + "components": [ + "header" + ], + "selector": "h3", + "tags": [ + "header", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "T3" + ] + } + } + }, + "title": { + "en": "All h3 elements are not used for formatting" + }, + "description": { + "en": "An h3 element may not be used purely for formatting." + } + }, + "headerH4": { + "components": [ + "header" + ], + "selector": "h4", + "tags": [ + "header", + "content" + ], + "testability": 0, + "type": "header", + "guidelines": { + "wcag": { + "2.4.6": { + "techniques": [ + "G130" + ] + } + } + }, + "title": { + "en": "The header following an h4 is h1, h2, h3, h4 or h5" + }, + "description": { + "en": "The header following an h4 element should either be an h5, h3, h2, h1, or another h4. " + } + }, + "headerH4Format": { + "components": [ + "header" + ], + "selector": "h4", + "tags": [ + "header", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "T3" + ] + } + } + }, + "title": { + "en": "All h4 elements are not used for formatting" + }, + "description": { + "en": "An h4 element may not be used purely for formatting." + } + }, + "headerH5": { + "components": [ + "header" + ], + "selector": "h5", + "tags": [ + "header", + "content" + ], + "testability": 0, + "type": "header", + "guidelines": { + "wcag": { + "2.4.6": { + "techniques": [ + "G130" + ] + } + } + }, + "title": { + "en": "The header following an h5 is h6 or any header less than h6" + }, + "description": { + "en": "The header following an h5 element should either be an h6, h3, h2, h1, or another h5. " + } + }, + "headerH5Format": { + "selector": "h5", + "tags": [ + "header", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "T3" + ] + } + } + }, + "title": { + "en": "All h5 elements are not used for formatting" + }, + "description": { + "en": "An h5 element may not be used purely for formatting." + } + }, + "headerH6Format": { + "selector": "h6", + "tags": [ + "header", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "T3" + ] + } + } + }, + "title": { + "en": "All h6 elements are not used for formatting" + }, + "description": { + "en": "An h6 element may not be used purely for formatting." + } + }, + "headersHaveText": { + "components": [ + "placeholder" + ], + "content": true, + "empty": true, + "selector": "h1, h2, h3, h4, h5, h6", + "tags": [ + "header", + "content" + ], + "testability": 1, + "type": "placeholder", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "G141" + ] + }, + "2.4.10": { + "techniques": [ + "G141" + ] + } + } + }, + "title": { + "en": "All headers should contain readable text" + }, + "description": { + "en": "Users with screen readers use headings like the tabs h1 to navigate the structure of a page. All headings should contain either text, or images with appropriate alt attributes." + } + }, + "headersUseToMarkSections": { + "callback": "headersUseToMarkSections", + "tags": [ + "header", + "content" + ], + "testability": 0.5, + "type": "custom", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "G141" + ] + }, + "2.4.10": { + "techniques": [ + "G141" + ] + } + } + }, + "title": { + "en": "Use headers to mark the beginning of each section" + }, + "description": { + "en": "Check that each logical section of the page is broken or introduced with a header (. h1-h6>) element." + } + }, + "iIsNotUsed": { + "selector": "i", + "tags": [ + "deprecated", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "The \"i\" (italic) element is not used" + }, + "description": { + "en": "The i (italic) element provides no emphasis for non-sighted readers. Use the em tag instead." + } + }, + "iframeMustNotHaveLongdesc": { + "selector": "iframe[longdesc]", + "tags": [ + "objects", + "iframe", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "Inline frames (\"iframes\") should not have a \"longdesc\" attribute" + }, + "description": { + "en": ".. code-block:: html" + } + }, + "imageMapServerSide": { + "selector": "img[ismap]", + "tags": [ + "objects", + "iframe", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "All links in a server-side map should have duplicate links available in the document" + }, + "description": { + "en": "Any image with an \"usemap\" attribute for a server-side image map should have the available links duplicated elsewhere." + } + }, + "imgAltEmptyForDecorativeImages": { + "selector": "img[alt]", + "tags": [ + "image", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "wcag": { + "1.3.3": { + "techniques": [ + "F26" + ] + } + } + }, + "title": { + "en": "If an image is purely decorative, the \"alt\" text must be empty" + }, + "description": { + "en": "Any image that is only decorative (serves no function or adds to the purpose of the page content) should have an \"alt\" attribute" + } + }, + "imgAltIdentifiesLinkDestination": { + "selector": "a img[alt]:first", + "tags": [ + "image", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": [], + "title": { + "en": "Any image within a link must have \"alt\" text the describes the link destination" + }, + "description": { + "en": "Any image that is within a link should have an \"alt\" attribute which identifies the destination or purpose of the link." + } + }, + "imgAltIsDifferent": { + "callback": "imgAltIsDifferent", + "tags": [ + "image", + "content" + ], + "testability": 0.5, + "type": "custom", + "guidelines": { + "508": [ + "a" + ], + "wcag": { + "1.1.1": { + "techniques": [ + "H37" + ] + } + } + }, + "title": { + "en": "Image \"alt\" attributes should not be the same as the filename" + }, + "description": { + "en": "All img elements should have an \"alt\" attribute that is not just the name of the file" + } + }, + "imgAltIsSameInText": { + "selector": "img", + "tags": [ + "image", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "508": [ + "a" + ], + "wcag": { + "1.1.1": { + "techniques": [ + "G74", + "H37" + ] + } + } + }, + "title": { + "en": "Check that any text within an image is also in the \"alt\" attribute" + }, + "description": { + "en": "If an image has text within it, that text should be repeated in the \"alt\" attribute" + } + }, + "imgAltIsTooLong": { + "callback": "imgAltIsTooLong", + "tags": [ + "image", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "508": [ + "a" + ], + "wcag": { + "1.1.1": { + "techniques": [ + "H37" + ] + } + } + }, + "title": { + "en": "Image Alt text is short" + }, + "description": { + "en": "All \"alt\" attributes for img elements should be clear and concise. \"Alt\" attributes over 100 characters long should be reviewed to see if they are too long." + } + }, + "imgAltNotEmptyInAnchor": { + "callback": "imgAltNotEmptyInAnchor", + "tags": [ + "image", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "508": [ + "a" + ], + "wcag": { + "2.4.4": { + "techniques": [ + "H30" + ] + } + } + }, + "title": { + "en": "An image within a link cannot have an empty \"alt\" attribute if there is no other text within the link" + }, + "description": { + "en": "Any image that is within a link (an a element) that has no other text cannot have an empty or missing \"alt\" attribute." + } + }, + "imgAltNotPlaceHolder": { + "attribute": "alt", + "components": [ + "placeholder" + ], + "selector": "img", + "tags": [ + "image", + "content" + ], + "testability": 1, + "type": "placeholder", + "guidelines": { + "508": [ + "a" + ], + "wcag": { + "1.1.1": { + "techniques": [ + "F30", + "F39" + ] + }, + "1.2.1": { + "techniques": [ + "F30" + ] + } + } + }, + "title": { + "en": "Images should not have a simple placeholder text as an \"alt\" attribute" + }, + "description": { + "en": "Any image that is not used decorativey or which is purely for layout purposes cannot have an \"alt\" attribute that consists solely of placeholders." + } + }, + "imgAltTextNotRedundant": { + "callback": "imgAltTextNotRedundant", + "tags": [ + "image", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": [], + "title": { + "en": "Unless the image files are the same, no image should contain redundant alt text" + }, + "description": { + "en": "Every distinct image on a page should have it's own alt text which is different than all the others on the page to avoid redundancy and confusion." + } + }, + "imgGifNoFlicker": { + "callback": "imgGifNoFlicker", + "tags": [ + "image", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "508": [ + "j" + ], + "wcag": { + "2.2.2": { + "techniques": [ + "G152" + ] + } + } + }, + "title": { + "en": "Any animated GIF should not flicker" + }, + "description": { + "en": "Animated GIF files should not flicker with a frequency over 2 Hz and lower than 55 Hz. You can check the flicker rate of this GIF using an online tool." + } + }, + "imgHasAlt": { + "selector": "img:not(img[alt])", + "tags": [ + "image", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": { + "508": [ + "a" + ], + "wcag": { + "1.1.1": { + "techniques": [ + "F65", + "H37" + ] + } + } + }, + "title": { + "en": "Image elements must have an \"alt\" attribute" + }, + "description": { + "en": "All img elements must have an alt attribute" + } + }, + "imgHasLongDesc": { + "callback": "imgHasLongDesc", + "tags": [ + "image", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "wcag": { + "2.4.4": { + "techniques": [ + "G91" + ] + }, + "2.4.9": { + "techniques": [ + "G91" + ] + } + } + }, + "title": { + "en": "A \"longdesc\" attribute is required for any image where additional information not in the \"alt\" attribute is required" + }, + "description": { + "en": "Any image that has an \"alt\" attribute that does not fully convey the meaning of the image must have a \"longdesc\" attribute." + } + }, + "imgImportantNoSpacerAlt": { + "callback": "imgImportantNoSpacerAlt", + "tags": [ + "image", + "content" + ], + "testability": 0.5, + "type": "custom", + "guidelines": [], + "title": { + "en": "Images that are important should not have a purely white-space \"alt\" attribute" + }, + "description": { + "en": "Any image that is not used decorativey or which is purely for layout purposes cannot have an \"alt\" attribute that consists solely of white space (i.e. a space" + } + }, + "imgMapAreasHaveDuplicateLink": { + "callback": "imgMapAreasHaveDuplicateLink", + "tags": [ + "image", + "imagemap" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "508": [ + "ef", + "ef" + ] + }, + "title": { + "en": "All links within a client-side image are duplicated elsewhere in the document" + }, + "description": { + "en": "Any image that has a \"usemap\" attribute must have links replicated somewhere else in the document." + } + }, + "imgNonDecorativeHasAlt": { + "callback": "imgNonDecorativeHasAlt", + "tags": [ + "image", + "content" + ], + "testability": 0.5, + "type": "custom", + "guidelines": { + "508": [ + "a" + ], + "wcag": { + "1.1.1": { + "techniques": [ + "F38" + ] + } + } + }, + "title": { + "en": "Any non-decorative images should have a non-empty \"alt\" attribute" + }, + "description": { + "en": "Any image that is not used decorativey or which is purely for layout purposes cannot have an empty \"alt\" attribute." + } + }, + "imgNotReferredToByColorAlone": { + "selector": "img", + "tags": [ + "image", + "color", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "508": [ + "c" + ], + "wcag": { + "1.1.1": { + "techniques": [ + "F13" + ] + }, + "1.4.1": { + "techniques": [ + "F13" + ] + } + } + }, + "title": { + "en": "For any image, the \"alt\" text cannot refer to color alone" + }, + "description": { + "en": "The \"alt\" text or content text for any image should not refer to the image by color alone. This is often fixed by changing the \"alt\" text to the meaning of the image" + } + }, + "imgServerSideMapNotUsed": { + "selector": "img[ismap]", + "tags": [ + "image", + "imagemap", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "Server-side image maps should not be used" + }, + "description": { + "en": "Server-side image maps should not be used." + } + }, + "imgShouldNotHaveTitle": { + "selector": "img[title]", + "tags": [ + "image", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "Images should not have a \"title\" attribute" + }, + "description": { + "en": "Images should not contain a \"title\" attribute." + } + }, + "imgWithMapHasUseMap": { + "selector": "img[ismap]:not(img[usemap])", + "tags": [ + "image", + "imagemap", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": { + "508": [ + "ef", + "ef" + ] + }, + "title": { + "en": "Any image with an \"ismap\" attribute have a valid \"usemap\" attribute" + }, + "description": { + "en": "If an image has an \"ismap\" attribute" + } + }, + "imgWithMathShouldHaveMathEquivalent": { + "callback": "imgWithMathShouldHaveMathEquivalent", + "tags": [ + "image", + "content" + ], + "testability": 0, + "type": "custom", + "guidelines": [], + "title": { + "en": "Images which contain math equations should provide equivalent MathML" + }, + "description": { + "en": "Images which contain math equations should be accompanied or link to a document with the equivalent equation marked up with MathML." + } + }, + "inputCheckboxHasTabIndex": { + "attribute": "tabindex", + "components": [ + "placeholder" + ], + "empty": true, + "selector": "input[type=checkbox]", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "placeholder", + "guidelines": [], + "title": { + "en": "All \"checkbox\" input elements require a valid \"tabindex\" attribute" + }, + "description": { + "en": "All input elements of type \"checkbox\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone." + } + }, + "inputCheckboxRequiresFieldset": { + "callback": "inputCheckboxRequiresFieldset", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "wcag": { + "3.3.2": { + "techniques": [ + "H71" + ] + } + } + }, + "title": { + "en": "Logical groups of check boxes should be grouped with a \"fieldset" + }, + "description": { + "en": "Related \"checkbox\" input fields should be grouped together using a fieldset." + } + }, + "inputDoesNotUseColorAlone": { + "selector": "input:not(input[type=hidden])", + "tags": [ + "form", + "color", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "508": [ + "c" + ] + }, + "title": { + "en": "An \"input\" element should not use color alone" + }, + "description": { + "en": "All input elements should not refer to content by color alone." + } + }, + "inputElementsDontHaveAlt": { + "selector": "input[type!=image][alt]", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "Input elements which are not images should not have an \"alt\" attribute" + }, + "description": { + "en": "Because of inconsistencies in how user agents use the \"alt\" attribute" + } + }, + "inputFileHasTabIndex": { + "attribute": "tabindex", + "components": [ + "placeholder" + ], + "empty": true, + "selector": "input[type=file]", + "tags": [ + "form", + "tabindex" + ], + "testability": 1, + "type": "placeholder", + "guidelines": [], + "title": { + "en": "All \"file\" input elements require a valid \"tabindex\" attribute" + }, + "description": { + "en": "All input elements of type \"file\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone." + } + }, + "inputImageAltIdentifiesPurpose": { + "selector": "input[type=image][alt]", + "tags": [ + "form", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "wcag": { + "1.1.1": { + "techniques": [ + "H36" + ] + } + } + }, + "title": { + "en": "All \"input\" elements with a type of \"image\" must have an \"alt\" attribute that describes the function of the input" + }, + "description": { + "en": "All input elements with a type of \"image\" should have an \"alt\" attribute" + } + }, + "inputImageAltIsNotFileName": { + "callback": "inputImageAltIsNotFileName", + "tags": [ + "form", + "image", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "508": [ + "a" + ], + "wcag": { + "1.1.1": { + "techniques": [ + "H36" + ] + } + } + }, + "title": { + "en": "All \"input\" elements with a type of \"image\" must have an \"alt\" attribute which is not the same as the filename" + }, + "description": { + "en": "All input elements with a type of \"image\" should have an \"alt\" attribute" + } + }, + "inputImageAltIsNotPlaceholder": { + "attribute": "alt", + "components": [ + "placeholder" + ], + "selector": "input[type=image]", + "tags": [ + "form", + "image", + "content" + ], + "testability": 1, + "type": "placeholder", + "guidelines": { + "508": [ + "a" + ], + "wcag": { + "1.1.1": { + "techniques": [ + "H36" + ] + } + } + }, + "title": { + "en": "All \"input\" elements with a type of \"image\" must have an \"alt\" attribute which is not placeholder text" + }, + "description": { + "en": "All input elements with a type of \"image\" should have an \"alt\" attribute" + } + }, + "inputImageAltIsShort": { + "callback": "inputImageAltIsShort", + "tags": [ + "form", + "image", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "508": [ + "a" + ], + "wcag": { + "1.1.1": { + "techniques": [ + "H36" + ] + } + } + }, + "title": { + "en": "All \"input\" elements with a type of \"image\" must have an \"alt\" attribute which is as short as possible" + }, + "description": { + "en": "All input elements with a type of \"image\" should have an \"alt\" attribute" + } + }, + "inputImageAltNotRedundant": { + "callback": "inputImageAltNotRedundant", + "strings": "redundant.inputImage", + "tags": [ + "form", + "image", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "wcag": { + "1.1.1": { + "techniques": [ + "H36" + ] + } + } + }, + "title": { + "en": "The \"alt\" text for input \"image\" submit buttons must not be filler text" + }, + "description": { + "en": "Every form image button should not simply use filler text like \"button\" or \"submit\" as the \"alt\" text." + } + }, + "inputImageHasAlt": { + "selector": "input[type=image]:not(input[type=image][alt])", + "tags": [ + "form", + "image", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": { + "508": [ + "a" + ], + "wcag": { + "1.1.1": { + "techniques": [ + "F65", + "G94", + "H36" + ] + } + } + }, + "title": { + "en": "All \"input\" elements with a type of \"image\" must have an \"alt\" attribute" + }, + "description": { + "en": "All input elements with a type of \"image\" should have an \"alt\" attribute." + } + }, + "inputImageNotDecorative": { + "selector": "input[type=image]", + "tags": [ + "form", + "image", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "wcag": { + "1.1.1": { + "techniques": [ + "H36" + ] + } + } + }, + "title": { + "en": "The \"alt\" text for input \"image\" buttons must be the same as text inside the image" + }, + "description": { + "en": "Every form image button which has text within the image (say, a picture of the word \"Search\" in a special font)" + } + }, + "inputPasswordHasTabIndex": { + "attribute": "tabindex", + "components": [ + "placeholder" + ], + "empty": true, + "selector": "input[type=password]", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "placeholder", + "guidelines": [], + "title": { + "en": "All \"password\" input elements require a valid \"tabindex\" attribute" + }, + "description": { + "en": "All input elements of type \"password\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone." + } + }, + "inputRadioHasTabIndex": { + "attribute": "tabindex", + "components": [ + "placeholder" + ], + "empty": true, + "selector": "input[type=radio]", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "placeholder", + "guidelines": [], + "title": { + "en": "All \"radio\" input elements require a valid \"tabindex\" attribute" + }, + "description": { + "en": "All input elements of type \"radio\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone." + } + }, + "inputSubmitHasTabIndex": { + "attribute": "tabindex", + "components": [ + "placeholder" + ], + "empty": true, + "selector": "input[type=submit]", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "placeholder", + "guidelines": [], + "title": { + "en": "All input elements, type of \"submit\" have a valid tab index." + }, + "description": { + "en": "" + } + }, + "inputTextHasLabel": { + "selector": "input[type=text]", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "label", + "guidelines": { + "wcag": { + "1.1.1": { + "techniques": [ + "H44" + ] + }, + "1.3.1": { + "techniques": [ + "H44", + "F68" + ] + }, + "3.3.2": { + "techniques": [ + "H44" + ] + }, + "4.1.2": { + "techniques": [ + "H44" + ] + } + } + }, + "title": { + "en": "All \"input\" elements should have a corresponding \"label" + }, + "description": { + "en": "All input elements should have a corresponding label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user" + } + }, + "inputTextHasTabIndex": { + "attribute": "tabindex", + "components": [ + "placeholder" + ], + "empty": true, + "selector": "input[type=text]", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "placeholder", + "guidelines": [], + "title": { + "en": "All \"text\" input elements require a valid \"tabindex\" attribute" + }, + "description": { + "en": "All input elements of type \"text\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone." + } + }, + "inputTextHasValue": { + "attribute": "value", + "components": [ + "placeholder" + ], + "empty": true, + "selector": "input[type=text]", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "placeholder", + "guidelines": [], + "title": { + "en": "All \"input\" elements of type \"text\" must have a default text" + }, + "description": { + "en": "All input elements with a type of \"text\" should have a default text." + } + }, + "inputTextValueNotEmpty": { + "attribute": "value", + "components": [ + "placeholder" + ], + "empty": true, + "selector": "input[type=text]", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "placeholder", + "guidelines": [], + "title": { + "en": "Text\" input elements require a non-whitespace default text" + }, + "description": { + "en": "All input elements with a type of \"text\" should have a default text which is not empty." + } + }, + "labelDoesNotContainInput": { + "selector": "label:has(input)", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "Label elements should not contain an input element" + }, + "description": { + "en": ".. code-block:: html" + } + }, + "labelMustBeUnique": { + "callback": "labelMustBeUnique", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "F17" + ] + }, + "4.1.1": { + "techniques": [ + "F17" + ] + } + } + }, + "title": { + "en": "Every form input must have only one label" + }, + "description": { + "en": "Each form input should have only one label element." + } + }, + "labelMustNotBeEmpty": { + "components": [ + "placeholder" + ], + "content": true, + "empty": true, + "selector": "label", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "placeholder", + "guidelines": { + "wcag": { + "1.1.1": { + "techniques": [ + "H44" + ] + }, + "1.3.1": { + "techniques": [ + "H44", + "F68" + ] + }, + "3.3.2": { + "techniques": [ + "H44" + ] + }, + "4.1.2": { + "techniques": [ + "H44" + ] + } + } + }, + "title": { + "en": "Labels must contain text" + }, + "description": { + "en": ".. code-block:: html" + } + }, + "labelsAreAssignedToAnInput": { + "callback": "labelsAreAssignedToAnInput", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": [], + "title": { + "en": "All labels should be associated with an input" + }, + "description": { + "en": "All label elements should be assigned to an input item, and should have a for attribute which equals the id attribute of a form element." + } + }, + "legendDescribesListOfChoices": { + "selector": "legend", + "tags": [ + "form", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "wcag": { + "2.4.6": { + "techniques": [ + "G131" + ] + } + } + }, + "title": { + "en": "All \"legend\" elements must describe the group of choices" + }, + "description": { + "en": "If a legend element is used in a fieldset, the legend content must describe the group of choices." + } + }, + "legendTextNotEmpty": { + "selector": "legend:empty", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "H71" + ] + }, + "2.4.6": { + "techniques": [ + "G131" + ] + }, + "3.3.2": { + "techniques": [ + "H71" + ] + } + } + }, + "title": { + "en": "Legend text must not contain just whitespace" + }, + "description": { + "en": "If a legend element is used in a fieldset, the legend should not contain empty text." + } + }, + "legendTextNotPlaceholder": { + "components": [ + "placeholder" + ], + "content": true, + "emtpy": true, + "selector": "legend", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "placeholder", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "H71" + ] + }, + "2.4.6": { + "techniques": [ + "G131" + ] + }, + "3.3.2": { + "techniques": [ + "H71" + ] + } + } + }, + "title": { + "en": "Legend\" text must not contain placeholder text like \"form\" or \"field" + }, + "description": { + "en": "If a legend element is used in a fieldset, the legend should not contain useless placeholder text." + } + }, + "liDontUseImageForBullet": { + "selector": "li:has(img)", + "tags": [ + "list", + "content" + ], + "testability": 0.5, + "type": "selector", + "guidelines": [] + }, + "linkUsedForAlternateContent": { + "selector": "html:not(html:has(link[rel=alternate])) body", + "tags": [ + "document" + ], + "testability": 0, + "type": "selector", + "guidelines": [], + "title": { + "en": "Use a \"link\" element for alternate content" + }, + "description": { + "en": "Documents which contain things like videos, sound, or other forms of media that are not accessible, should provide a link element with a \"rel\" attribute of \"alternate\" in the document header." + } + }, + "linkUsedToDescribeNavigation": { + "selector": "html:not(html:has(link[rel=index]))", + "tags": [ + "document" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "Document uses link element to describe navigation if it is within a collection." + }, + "description": { + "en": "The link element can provide metadata about the position of an HTML page within a set of Web units or can assist in locating content with a set of Web units." + } + }, + "listNotUsedForFormatting": { + "callback": "listNotUsedForFormatting", + "tags": [ + "list", + "content" + ], + "testability": 0, + "type": "custom", + "guidelines": { + "wcag": { + "1.3.2": { + "techniques": [ + "F1" + ] + } + } + }, + "title": { + "en": "Lists should not be used for formatting" + }, + "description": { + "en": "Lists like ul and ol are to provide a structured list, and should not be used to format text. This test views any list with just one item as suspicious, but should be manually reviewed." + } + }, + "marqueeIsNotUsed": { + "selector": "marquee", + "tags": [ + "deprecated", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "The \"marquee\" tag should not be used" + }, + "description": { + "en": "The marquee element is difficult for users to read and is not a standard HTML element. Try to find another way to convey the importance of this text." + } + }, + "menuNotUsedToFormatText": { + "selector": "menu:not(menu li:parent(menu))", + "tags": [ + "list", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": [], + "title": { + "en": "Menu elements should not be used for formattin" + }, + "description": { + "en": "Menu is a deprecated tag, but is still honored in a transitional DTD. Menu tags are to provide structure for a document and should not be used for formatting. If a menu tag is to be used, it should only contain an ordered or unordered list of links." + } + }, + "noembedHasEquivalentContent": { + "selector": "noembed", + "tags": [ + "objects", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": [], + "title": { + "en": "Noembed elements must be the same content as their \"embed\" element" + }, + "description": { + "en": "All noembed elements must contain or link to an accessible version of their embed counterparts." + } + }, + "noframesSectionMustHaveTextEquivalent": { + "selector": "frameset:not(frameset:has(noframes))", + "tags": [ + "deprecated", + "frame" + ], + "testability": 0.5, + "type": "selector", + "guidelines": [], + "title": { + "en": "All \"noframes\" elements should contain the text content from all frames" + }, + "description": { + "en": "The noframes content should either replicate or link to the content visible within the frames." + } + }, + "objectContentUsableWhenDisabled": { + "selector": "object", + "tags": [ + "objects", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": [], + "title": { + "en": "When objects are disabled, content should still be available" + }, + "description": { + "en": "The content within objects should still be available, even if the object is disabled. To do this, place a link to the direct object source within the object tag." + } + }, + "objectDoesNotFlicker": { + "selector": "object", + "tags": [ + "objects", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "508": [ + "j" + ], + "wcag": { + "2.2.2": { + "techniques": [ + "F7" + ] + } + } + }, + "title": { + "en": "Objects do not flicker" + }, + "description": { + "en": "The content within an object tag must not flicker." + } + }, + "objectDoesNotUseColorAlone": { + "selector": "object", + "tags": [ + "objects", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "508": [ + "c" + ] + }, + "title": { + "en": "Objects must not use color to communicate alone" + }, + "description": { + "en": "Objects should contain content that makes sense without color and is accessible to users who are color blind." + } + }, + "objectInterfaceIsAccessible": { + "selector": "object", + "tags": [ + "objects", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": [], + "title": { + "en": "Interfaces within objects must be accessible" + }, + "description": { + "en": "Object content should be assessed for accessibility." + } + }, + "objectLinkToMultimediaHasTextTranscript": { + "selector": "object", + "tags": [ + "objects", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": [], + "title": { + "en": "Objects which reference multimedia files should also provide a link to a transcript" + }, + "description": { + "en": "If an object contains a video, a link to the transcript should be provided near the object." + } + }, + "objectMustContainText": { + "components": [ + "placeholder" + ], + "content": true, + "empty": true, + "selector": "object", + "tags": [ + "objects", + "content" + ], + "testability": 1, + "type": "placeholder", + "guidelines": { + "wcag": { + "1.1.1": { + "techniques": [ + "FLASH1", + "H27" + ] + } + } + }, + "title": { + "en": "Objects must contain their text equivalents" + }, + "description": { + "en": "All object elements should contain a text equivalent if the object cannot be rendered." + } + }, + "objectMustHaveEmbed": { + "selector": "object:not(object:has(embed))", + "tags": [ + "objects", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "Every object should contain an \"embed\" element" + }, + "description": { + "en": "Every object element must also contain an embed element." + } + }, + "objectMustHaveTitle": { + "selector": "object:not(object[title])", + "tags": [ + "objects", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": { + "wcag": { + "1.1.1": { + "techniques": [ + "H27" + ] + } + } + }, + "title": { + "en": "Objects should have a title attribute" + }, + "description": { + "en": "All object elements should contain a \"title\" attribute." + } + }, + "objectMustHaveValidTitle": { + "attribute": "title", + "components": [ + "placeholder" + ], + "empty": true, + "selector": "object", + "tags": [ + "objects", + "content" + ], + "testability": 1, + "type": "placeholder", + "guidelines": [], + "title": { + "en": "Objects must not have an empty title attribute" + }, + "description": { + "en": "All object elements should have a \"title\" attribute which is not empty." + } + }, + "objectProvidesMechanismToReturnToParent": { + "selector": "object", + "tags": [ + "objects", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": [], + "title": { + "en": "All objects should provide a way for keyboard users to escape" + }, + "description": { + "en": "Ensure that a user who has only a keyboard as an input device can escape a object element. This requires manual confirmation." + } + }, + "objectShouldHaveLongDescription": { + "selector": "object", + "tags": [ + "objects", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": [], + "title": { + "en": "An object might require a long description" + }, + "description": { + "en": "Objects might require a long description, especially if their content is complicated." + } + }, + "objectTextUpdatesWhenObjectChanges": { + "selector": "object", + "tags": [ + "objects", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "508": [ + "a" + ] + }, + "title": { + "en": "The text equivalents of an object should update if the object changes" + }, + "description": { + "en": "If an object changes, the text equivalent of that object should also change." + } + }, + "objectUIMustBeAccessible": { + "selector": "object", + "tags": [ + "objects", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": [], + "title": { + "en": "Content within an \"object\" element should be usable with objects disabled" + }, + "description": { + "en": "Objects who's content changes using java, ActiveX, or other similar technologies, should have their default text change when the object's content changes." + } + }, + "objectWithClassIDHasNoText": { + "selector": "object[classid]:not(object[classid]:empty)", + "tags": [ + "objects", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": [], + "title": { + "en": "Objects with \"classid\" attributes should change their text if the content of the object changes" + }, + "description": { + "en": "Objects who's content changes using java, ActiveX, or other similar technologies, should have their default text change when the object's content changes." + } + }, + "pNotUsedAsHeader": { + "callback": "pNotUsedAsHeader", + "tags": [ + "header", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "G141", + "H42" + ] + }, + "2.4.10": { + "techniques": [ + "G141" + ] + } + } + }, + "title": { + "en": "Paragraphs must not be used for headers" + }, + "description": { + "en": "Headers like h1. h6 are extremely useful for non-sighted users to navigate the structure of the page, and formatting a paragraph to just be big or bold, while it might visually look like a header, does not make it one." + } + }, + "paragarphIsWrittenClearly": { + "callback": "paragarphIsWrittenClearly", + "components": [ + "textStatistics" + ], + "tags": [ + "language", + "content" + ], + "testability": 0.5, + "type": "custom", + "guidelines": { + "wcag": { + "3.1.5": { + "techniques": [ + "G86" + ] + } + } + } + }, + "passwordHasLabel": { + "components": [ + "label" + ], + "selector": "input[type=password]", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "label", + "guidelines": { + "508": [ + "n" + ], + "wcag": { + "1.1.1": { + "techniques": [ + "H44" + ] + }, + "1.3.1": { + "techniques": [ + "H44", + "F68" + ] + }, + "3.3.2": { + "techniques": [ + "H44" + ] + }, + "4.1.2": { + "techniques": [ + "H44" + ] + } + } + }, + "title": { + "en": "All password input elements should have a corresponding label" + }, + "description": { + "en": "All input elements with a type of \"password\"should have a corresponding label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user" + } + }, + "passwordLabelIsNearby": { + "components": [ + "labelProximity" + ], + "selector": "input[type=password]", + "tags": [ + "form", + "content" + ], + "testability": 0.5, + "type": "labelProximity", + "guidelines": [], + "title": { + "en": "All \"password\" input elements have a label that is close" + }, + "description": { + "en": "All input elements of type \"password\" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away." + } + }, + "preShouldNotBeUsedForTabularLayout": { + "callback": "preShouldNotBeUsedForTabularLayout", + "tags": [ + "table", + "content" + ], + "testability": 0, + "type": "custom", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "F33", + "F34", + "F48" + ] + }, + "1.3.2": { + "techniques": [ + "F33", + "F34" + ] + } + } + }, + "title": { + "en": "Pre\" elements should not be used for tabular data" + }, + "description": { + "en": "If a pre element is used for tabular data, change the data to use a well-formed table." + } + }, + "radioHasLabel": { + "components": [ + "label" + ], + "selector": "input[type=radio]", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "label", + "guidelines": { + "508": [ + "n" + ], + "wcag": { + "1.1.1": { + "techniques": [ + "H44" + ] + }, + "1.3.1": { + "techniques": [ + "H44", + "F68" + ] + }, + "3.3.2": { + "techniques": [ + "H44" + ] + }, + "4.1.2": { + "techniques": [ + "H44" + ] + } + } + }, + "title": { + "en": "All \"radio\" input elements have a corresponding label" + }, + "description": { + "en": "All input elements of type \"radio\" should have a corresponding label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user" + } + }, + "radioLabelIsNearby": { + "components": [ + "labelProximity" + ], + "selector": "input[type=radio]", + "tags": [ + "form", + "content" + ], + "testability": 0.5, + "type": "labelProximity", + "guidelines": [], + "title": { + "en": "All \"radio\" input elements have a label that is close" + }, + "description": { + "en": "All input elements of type \"radio\" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away." + } + }, + "radioMarkedWithFieldgroupAndLegend": { + "selector": "input[type=radio]:not(fieldset input[type=radio])", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "H71" + ] + }, + "3.3.2": { + "techniques": [ + "H71" + ] + } + } + }, + "title": { + "en": "All radio button groups are marked using fieldset and legend elements." + }, + "description": { + "en": "form element content must contain both fieldset and legend elements if there are related radio buttons." + } + }, + "scriptContentAccessibleWithScriptsTurnedOff": { + "selector": "script", + "tags": [ + "javascript" + ], + "testability": 0, + "type": "selector", + "guidelines": [], + "title": { + "en": "Content on the page should still be available if scripts are disabled" + }, + "description": { + "en": "All scripts should be assessed to see if, when the user is browing with scrips turned off, the page content is still available." + } + }, + "scriptInBodyMustHaveNoscript": { + "selector": "html:not(html:has(noscript)):has(script) body", + "tags": [ + "javascript" + ], + "testability": 0.5, + "type": "selector", + "guidelines": { + "508": [ + "l" + ] + }, + "title": { + "en": "Scripts should have a corresponding \"noscript\" element" + }, + "description": { + "en": "Scripts should be followed by a noscripts element to guide the user to content in an alternative way." + } + }, + "scriptOnclickRequiresOnKeypress": { + "components": [ + "event", + "hasEventListener" + ], + "correspondingEvent": "onkeypress", + "searchEvent": "onclick", + "tags": [ + "javascript" + ], + "testability": 1, + "type": "event", + "guidelines": { + "508": [ + "l" + ], + "wcag": { + "2.1.1": { + "techniques": [ + "G90", + "SCR2" + ] + }, + "2.1.3": { + "techniques": [ + "G90" + ] + } + } + }, + "title": { + "en": "If an element has an \"onclick\" attribute" + }, + "description": { + "en": "it should also have an \"onkeypress\" attribute" + } + }, + "scriptOndblclickRequiresOnKeypress": { + "components": [ + "event", + "hasEventListener" + ], + "correspondingEvent": "onkeypress", + "searchEvent": "ondblclick", + "tags": [ + "javascript" + ], + "testability": 1, + "type": "event", + "guidelines": { + "508": [ + "l" + ], + "wcag": { + "2.1.1": { + "techniques": [ + "G90", + "SCR2" + ] + }, + "2.1.3": { + "techniques": [ + "G90" + ] + } + } + }, + "title": { + "en": "Any element with an \"ondblclick\" attribute shoul have a keyboard-related action as well" + }, + "description": { + "en": "If an element has an \"ondblclick\" attribute" + } + }, + "scriptOnmousedownRequiresOnKeypress": { + "components": [ + "event", + "hasEventListener" + ], + "correspondingEvent": "onkeydown", + "searchEvent": "onmousedown", + "tags": [ + "javascript" + ], + "testability": 1, + "type": "event", + "guidelines": { + "508": [ + "l" + ], + "wcag": { + "2.1.1": { + "techniques": [ + "G90", + "SCR2" + ] + }, + "2.1.3": { + "techniques": [ + "G90" + ] + } + } + }, + "title": { + "en": "If an element has a \"mousedown\" attribute" + }, + "description": { + "en": "it should also have an \"onkeydown\" attribute" + } + }, + "scriptOnmousemove": { + "components": [ + "event", + "hasEventListener" + ], + "correspondingEvent": "onkeypress", + "searchEvent": "onmousemove", + "tags": [ + "javascript" + ], + "testability": 1, + "type": "event", + "guidelines": { + "508": [ + "l" + ], + "wcag": { + "2.1.1": { + "techniques": [ + "SCR2" + ] + } + } + }, + "title": { + "en": "Any element with an \"onmousemove\" attribute shoul have a keyboard-related action as well" + }, + "description": { + "en": "If an element has an \"onmousemove\" attribute" + } + }, + "scriptOnmouseoutHasOnmouseblur": { + "components": [ + "event", + "hasEventListener" + ], + "correspondingEvent": "onblur", + "searchEvent": "onmouseout", + "tags": [ + "javascript" + ], + "testability": 1, + "type": "event", + "guidelines": { + "508": [ + "l" + ], + "wcag": { + "2.1.1": { + "techniques": [ + "SCR2" + ] + } + } + }, + "title": { + "en": "If an element has a \"onmouseout\" attribute" + }, + "description": { + "en": "it should also have an \"onblur\" attribute" + } + }, + "scriptOnmouseoverHasOnfocus": { + "components": [ + "event", + "hasEventListener" + ], + "correspondingEvent": "onfocus", + "searchEvent": "onmouseover", + "tags": [ + "javascript" + ], + "testability": 1, + "type": "event", + "guidelines": { + "508": [ + "l" + ], + "wcag": { + "2.1.1": { + "techniques": [ + "SCR2" + ] + } + } + }, + "title": { + "en": "If an element has an \"onmouseover\" attribute" + }, + "description": { + "en": "it should also have an \"onfocus\" attribute" + } + }, + "scriptOnmouseupHasOnkeyup": { + "components": [ + "event", + "hasEventListener" + ], + "correspondingEvent": "onkeyup", + "searchEvent": "onmouseup", + "tags": [ + "javascript" + ], + "testability": 1, + "type": "event", + "guidelines": { + "508": [ + "l" + ], + "wcag": { + "2.1.1": { + "techniques": [ + "G90" + ] + }, + "2.1.3": { + "techniques": [ + "G90" + ] + } + } + }, + "title": { + "en": "If an element has an \"onmouseup\" attribute" + }, + "description": { + "en": "it should also have an \"onkeyup\" attribute" + } + }, + "scriptUIMustBeAccessible": { + "selector": "script", + "tags": [ + "javascript" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "508": [ + "l" + ] + }, + "title": { + "en": "The user interface for scripts should be accessible" + }, + "description": { + "en": "All scripts should be assessed to see if their interface is accessible." + } + }, + "scriptsDoNotFlicker": { + "selector": "script", + "tags": [ + "javascript" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "508": [ + "j" + ], + "wcag": { + "2.2.2": { + "techniques": [ + "F7" + ] + } + } + }, + "title": { + "en": "Scripts should not cause the screen to flicker" + }, + "description": { + "en": "All scripts should be assessed to see if their interface does not flicker." + } + }, + "scriptsDoNotUseColorAlone": { + "selector": "script", + "tags": [ + "javascript", + "color" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "508": [ + "c" + ] + }, + "title": { + "en": "The interface in scripts should not use color alone" + }, + "description": { + "en": "All scripts should be assessed to see if their interface does not have an interface which requires distinguishing beteween colors alone." + } + }, + "selectDoesNotChangeContext": { + "components": [ + "event", + "hasEventListener" + ], + "searchEvent": "onchange", + "selector": "select", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "event", + "guidelines": [], + "title": { + "en": "Select\" elemetns must not contain an \"onchange\" attribute" + }, + "description": { + "en": "Actions like \"onchange\" can take control away from users who are trying to navigate the page. Using an \"onchange\" attribute for things like select-list menus should instead be replaced with a drop-down and a button which initiates the action." + } + }, + "selectHasAssociatedLabel": { + "components": [ + "label" + ], + "selector": "select", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "label", + "guidelines": { + "wcag": { + "1.1.1": { + "techniques": [ + "H44" + ] + }, + "1.3.1": { + "techniques": [ + "H44", + "F68" + ] + }, + "3.3.2": { + "techniques": [ + "H44" + ] + }, + "4.1.2": { + "techniques": [ + "H44" + ] + } + } + }, + "title": { + "en": "All select elements have an explicitly associated label." + }, + "description": { + "en": "All select elements should have a corresponding label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user" + } + }, + "selectJumpMenu": { + "callback": "selectJumpMenu", + "components": [ + "hasEventListener" + ], + "tags": [ + "form", + "content" + ], + "testability": 0.5, + "type": "custom", + "guidelines": { + "wcag": { + "3.2.2": { + "techniques": [ + "F37" + ] + }, + "3.2.5": { + "techniques": [ + "F9" + ] + } + } + }, + "title": { + "en": "Select jump menus should jump on button press, not on state change" + }, + "description": { + "en": "If you wish to use a 'Jump' menu with a select item that then redirects users to another page, the jump should occur on the user pressing a button, rather than on the change event of that select eleemnt." + } + }, + "selectWithOptionsHasOptgroup": { + "selector": "select:not(select:has(optgroup)) option:nth-child(5)", + "tags": [ + "form", + "content" + ], + "testability": 0.5, + "type": "selector", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "H85" + ] + } + } + }, + "title": { + "en": "Form select elements should use optgroups for long selections" + }, + "description": { + "en": ".. code-block:: html" + } + }, + "siteMap": { + "callback": "siteMap", + "strings": "siteMap", + "tags": [ + "document" + ], + "testability": 0, + "type": "custom", + "guidelines": { + "wcag": { + "2.4.5": { + "techniques": [ + "G63" + ] + }, + "2.4.8": { + "techniques": [ + "G63" + ] + } + } + }, + "title": { + "en": "Websites must have a site map" + }, + "description": { + "en": "Every web site should have a page which provides a site map or another method to navigate most of the site from a single page to save time for users of assistive devices." + } + }, + "skipToContentLinkProvided": { + "selector": "body:not(body:has(a:first[href^=#]))", + "tags": [ + "document" + ], + "testability": 0.5, + "type": "selector", + "guidelines": { + "508": [ + "o" + ], + "wcag": { + "2.4.1": { + "techniques": [ + "G1" + ] + } + } + }, + "title": { + "en": "A \"skip to content\" link should exist as one of the first links on the page" + }, + "description": { + "en": "A link reading \"skip to content" + } + }, + "svgContainsTitle": { + "selector": "svg:not(svg:has(title))", + "tags": [ + "image", + "svg", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": { + "wcag": { + "1.1.1": { + "techniques": [ + "F65" + ] + } + } + }, + "title": { + "en": "Inline SVG should use Title elements" + }, + "description": { + "en": "Any inline SVG image should have an embedded title element" + } + }, + "tabIndexFollowsLogicalOrder": { + "callback": "tabIndexFollowsLogicalOrder", + "tags": [ + "document" + ], + "testability": 0.5, + "type": "custom", + "guidelines": { + "wcag": { + "2.4.3": { + "techniques": [ + "H4" + ] + } + } + }, + "title": { + "en": "The tab order of a document is logical" + }, + "description": { + "en": "Check that the tab-order of a page is logical." + } + }, + "tableCaptionIdentifiesTable": { + "selector": "caption", + "tags": [ + "table", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "H39" + ] + } + } + }, + "title": { + "en": "Captions should identify their table" + }, + "description": { + "en": "Check to make sure that a table's caption identifies the table with a name, figure number, etc." + } + }, + "tableComplexHasSummary": { + "selector": "table:not(table[summary], table:has(caption))", + "tags": [ + "table", + "content" + ], + "testability": 0.5, + "type": "selector", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "H39" + ] + } + } + }, + "title": { + "en": "Complex tables should have a summary" + }, + "description": { + "en": "If a table is complex (for example, has some cells with \"colspan\" attributes" + } + }, + "tableDataShouldHaveTh": { + "selector": "table:not(table:has(th))", + "tags": [ + "table", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": { + "508": [ + "g" + ], + "wcag": { + "1.3.1": { + "techniques": [ + "F91" + ] + } + } + }, + "title": { + "en": "Data tables should contain \"th\" elements" + }, + "description": { + "en": "Tables which contain data (as opposed to layout tables) should contain th elements to mark headers for screen readers and enhance the structure of the document." + } + }, + "tableHeaderLabelMustBeTerse": { + "callback": "tableHeaderLabelMustBeTerse", + "tags": [ + "table", + "content" + ], + "testability": 0.5, + "type": "custom", + "guidelines": [], + "title": { + "en": "Table header lables must be terse" + }, + "description": { + "en": "The \"abbr\" attribute for table headers must be terse (less than 20 characters long)." + } + }, + "tableIsGrouped": { + "selector": "table:not(table:has(thead), table:has(tfoot))", + "tags": [ + "table", + "content" + ], + "testability": 0.5, + "type": "selector", + "guidelines": [], + "title": { + "en": "Mark up the areas of tables using thead and tbody" + }, + "description": { + "en": "" + } + }, + "tableLayoutDataShouldNotHaveTh": { + "callback": "tableLayoutDataShouldNotHaveTh", + "tags": [ + "table", + "layout", + "content" + ], + "testability": 0, + "type": "custom", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "F46" + ] + } + } + }, + "title": { + "en": "Layout tables should not contain \"th\" elements" + }, + "description": { + "en": "Tables which are used purely for layout (as opposed to data tables), should not contain th elements, which would make the table appear to be a data table." + } + }, + "tableLayoutHasNoCaption": { + "callback": "tableLayoutHasNoCaption", + "tags": [ + "table", + "layout", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "F46" + ] + } + } + }, + "title": { + "en": "All tables used for layout have no \"caption\" element" + }, + "description": { + "en": "If a table contains no data, and is used simply for layout, then it should not contain a caption element." + } + }, + "tableLayoutHasNoSummary": { + "callback": "tableLayoutHasNoSummary", + "tags": [ + "table", + "layout", + "content" + ], + "testability": 0.5, + "type": "custom", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "F46" + ] + } + } + }, + "title": { + "en": "All tables used for layout have no summary or an empty summary" + }, + "description": { + "en": "If a table contains no data, and is used simply for layout, then it should not have a \"summary\" attribute" + } + }, + "tableLayoutMakesSenseLinearized": { + "callback": "tableLayoutMakesSenseLinearized", + "tags": [ + "table", + "layout", + "content" + ], + "testability": 0, + "type": "custom", + "guidelines": [], + "title": { + "en": "All tables used for layout should make sense when removed" + }, + "description": { + "en": "If a table element is used for layout purposes only, then the content of the table should make sense if the table is linearized." + } + }, + "tableNotUsedForLayout": { + "callback": "tableNotUsedForLayout", + "tags": [ + "table", + "layout" + ], + "testability": 0.5, + "type": "custom", + "guidelines": { + "wcag": { + "1.3.2": { + "techniques": [ + "F49" + ] + } + } + } + }, + "tableSummaryDescribesTable": { + "selector": "table[summary]", + "tags": [ + "table", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": [], + "title": { + "en": "Table summaries should describe the navigation and structure of the table" + }, + "description": { + "en": "Table summary elements should describe the navigation tools and structure of the table, as well as provide an overview of what the table describes." + } + }, + "tableSummaryDoesNotDuplicateCaption": { + "callback": "tableSummaryDoesNotDuplicateCaption", + "tags": [ + "table", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": [], + "title": { + "en": "Table \"summary\" elements should not duplicate the \"caption\" element" + }, + "description": { + "en": "The summary and the caption must be different, as both provide different information. A caption. /code element identifies the table., while the \"summary\" attribute describes the table contents." + } + }, + "tableSummaryIsEmpty": { + "attribute": "summary", + "components": [ + "placeholder" + ], + "empty": true, + "selector": "table[summary]", + "tags": [ + "table", + "content" + ], + "testability": 0.5, + "type": "placeholder", + "guidelines": [], + "title": { + "en": "All data tables should have a summary" + }, + "description": { + "en": "If a table contains data, it should have a \"summary\" attribute." + } + }, + "tableSummaryIsNotTooLong": { + "callback": "tableSummaryIsNotTooLong", + "tags": [ + "table", + "content" + ], + "testability": 0, + "type": "custom", + "guidelines": [] + }, + "tableSummaryIsSufficient": { + "selector": "table[summary]", + "tags": [ + "table", + "content" + ], + "testability": 0, + "type": "selector", + "guidelines": [], + "title": { + "en": "All data tables should have an adequate summary" + }, + "description": { + "en": "If a table contains data, it should have a \"summary\" attribute that completely communicates the function and use of the table." + } + }, + "tableUseColGroup": { + "callback": "tableUseColGroup", + "tags": [ + "table", + "content" + ], + "testability": 0, + "type": "custom", + "guidelines": [], + "title": { + "en": "Group columns using \"colgroup\" or \"col\" elements" + }, + "description": { + "en": "To help complex table headers make sense, use colgroup or col to group them together." + } + }, + "tableUsesAbbreviationForHeader": { + "callback": "tableUsesAbbreviationForHeader", + "tags": [ + "table", + "content" + ], + "testability": 0, + "type": "custom", + "guidelines": [], + "title": { + "en": "Table headers over 20 characters should provide an \"abbr\" attribute" + }, + "description": { + "en": "For long table headers, use an \"abbr\" attribute that is less than short (less than 20 characters long)." + } + }, + "tableUsesCaption": { + "selector": "table:not(table:has(caption))", + "tags": [ + "table", + "content" + ], + "testability": 1, + "type": "selector", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "H39" + ] + } + } + }, + "title": { + "en": "Data tables should contain a \"caption\" element if not described elsewhere" + }, + "description": { + "en": "Unless otherwise described in the document, tables should contain caption elements to describe the purpose of the table." + } + }, + "tableUsesScopeForRow": { + "callback": "tableUsesScopeForRow", + "tags": [ + "table", + "content" + ], + "testability": 0.5, + "type": "custom", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "H63" + ] + } + } + }, + "title": { + "en": "Data tables should use scoped headers for rows with headers" + }, + "description": { + "en": "Where there are table headers for both rows and columns, use the \"scope\" attribute to help relate those headers with their appropriate cells. This test looks for the first and last cells in each row and sees if they differ in layout or font weight." + } + }, + "tableWithBothHeadersUseScope": { + "selector": "table:has(tr:not(table tr:first) th:not(th[scope]))", + "tags": [ + "table", + "content" + ], + "testability": 0.5, + "type": "selector", + "guidelines": { + "508": [ + "h" + ], + "wcag": { + "1.3.1": { + "techniques": [ + "F91" + ] + } + } + }, + "title": { + "en": "Data tables with multiple headers should use the \"scope\" attribute" + }, + "description": { + "en": "Where there are table headers for both rows and columns, use the \"scope\" attribute to help relate those headers with their appropriate cells." + } + }, + "tableWithMoreHeadersUseID": { + "callback": "tableWithMoreHeadersUseID", + "tags": [ + "table", + "content" + ], + "testability": 0.5, + "type": "custom", + "guidelines": [], + "title": { + "en": "Complex data tables should provide \"id\" attributes to headers" + }, + "description": { + "en": "and \"headers\" attributes for data cells" + } + }, + "tabularDataIsInTable": { + "callback": "tabularDataIsInTable", + "tags": [ + "table", + "content" + ], + "testability": 0.5, + "type": "custom", + "guidelines": { + "wcag": { + "1.3.1": { + "techniques": [ + "F33", + "F34", + "F48" + ] + }, + "1.3.2": { + "techniques": [ + "F33", + "F34" + ] + } + } + }, + "title": { + "en": "All tabular information should use a table" + }, + "description": { + "en": "Tables should be used when displaying tabular information." + } + }, + "textIsNotSmall": { + "callback": "textIsNotSmall", + "components": [ + "convertToPx" + ], + "tags": [ + "textsize", + "content" + ], + "testability": 0.5, + "type": "custom", + "guidelines": [], + "title": { + "en": "The text size is not less than 9 pixels high" + }, + "description": { + "en": "To help users with difficulty reading small text, ensure text size is no less than 9 pixels high." + } + }, + "textareaHasAssociatedLabel": { + "components": [ + "label" + ], + "selector": "textarea", + "tags": [ + "form", + "content" + ], + "testability": 1, + "type": "label", + "guidelines": { + "wcag": { + "1.1.1": { + "techniques": [ + "H44" + ] + }, + "1.3.1": { + "techniques": [ + "H44", + "F68" + ] + }, + "3.3.2": { + "techniques": [ + "H44" + ] + }, + "4.1.2": { + "techniques": [ + "H44" + ] + } + } + }, + "title": { + "en": "All textareas should have a corresponding label" + }, + "description": { + "en": "All textarea elements should have a corresponding label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user" + } + }, + "textareaLabelPositionedClose": { + "components": [ + "labelProximity" + ], + "selector": "textarea", + "tags": [ + "form", + "content" + ], + "testability": 0.5, + "type": "labelProximity", + "guidelines": [], + "title": { + "en": "All textareas should have a label that is close to it" + }, + "description": { + "en": "All textarea elements should have a corresponding label element that is close in proximity.." + } + }, + "videoProvidesCaptions": { + "selector": "video", + "tags": [ + "media", + "content" + ], + "testability": 0.5, + "type": "selector", + "guidelines": { + "508": [ + "b", + "b" + ], + "wcag": { + "1.2.2": { + "techniques": [ + "G87" + ] + }, + "1.2.4": { + "techniques": [ + "G87" + ] + } + } + }, + "title": { + "en": "All video tags must provide captions" + }, + "description": { + "en": "All HTML5 video tags must provide captions." + } + }, + "videosEmbeddedOrLinkedNeedCaptions": { + "callback": "videosEmbeddedOrLinkedNeedCaptions", + "components": [ + "video" + ], + "tags": [ + "media", + "content" + ], + "testability": 1, + "type": "custom", + "guidelines": { + "wcag": { + "1.2.2": { + "techniques": [ + "G87" + ] + }, + "1.2.4": { + "techniques": [ + "G87" + ] + } + } + }, + "title": { + "en": "All linked or embedded videos need captions" + }, + "description": { + "en": "Any video hosted or otherwise which is linked or embedded must have a caption." + } + } +} \ No newline at end of file diff --git a/dist/tests.min.json b/dist/tests.min.json new file mode 100644 index 000000000..7fe28e303 --- /dev/null +++ b/dist/tests.min.json @@ -0,0 +1 @@ +{"aAdjacentWithSameResourceShouldBeCombined":{"callback":"aAdjacentWithSameResourceShouldBeCombined","tags":["link","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"2.4.4":{"techniques":["H2"]}}},"title":{"en":"Adjacent links that point to the same location should be merged"},"description":{"en":"Because many users of screen-readers use links to navigate the page, providing two links right next to eachother that points to the same location can be confusing. Try combining the links."}},"aImgAltNotRepetative":{"callback":"aImgAltNotRepetative","tags":["link","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"1.1.1":{"techniques":["H30"]},"2.4.4":{"techniques":["H30"]},"2.4.9":{"techniques":["H30"]}}},"title":{"en":"When an image is in a link, its \"alt\" attribute should not repeat other text in the link"},"description":{"en":"Images within a link should not have an alt attribute that simply repeats the text found in the link. This will cause screen readers to simply repeat the text twice."}},"aLinkTextDoesNotBeginWithRedundantWord":{"callback":"aLinkTextDoesNotBeginWithRedundantWord","strings":"redundant.link","tags":["link","content"],"testability":0,"type":"custom","guidelines":{"wcag":{"2.4.9":{"techniques":["F84"]}}},"title":{"en":"Link text should not begin with redundant text"},"description":{"en":"Link text should not begin with redundant words or phrases like \"link\""}},"aLinksAreSeperatedByPrintableCharacters":{"callback":"aLinksAreSeperatedByPrintableCharacters","tags":["link","content"],"testability":1,"type":"custom","guidelines":[],"title":{"en":"Lists of links should be seperated by printable characters"},"description":{"en":"If a list of links is provided within the same element, those links should be seperated by a non-linked, printable character. Structures like lists are not included in this."}},"aLinksDontOpenNewWindow":{"selector":"a[target=_new], a[target=_blank], a[target=_blank]","tags":["link","content"],"testability":1,"type":"selector","guidelines":{"wcag":{"3.2.5":{"techniques":["H83"]}}},"title":{"en":"Links should not open a new window without warning"},"description":{"en":"Links which open a new window using the \"target\" attribute should warn users."}},"aLinksNotSeparatedBySymbols":{"callback":"aLinksNotSeparatedBySymbols","tags":["link","content"],"testability":1,"type":"custom","guidelines":[]},"aLinksToMultiMediaRequireTranscript":{"selector":"a[href$='.wmv'], a[href$='.mpg'], a[href$='.mov'], a[href$='.ram'], a[href$='.aif']","tags":["link","media","content"],"testability":0,"type":"selector","guidelines":{"508":["c"],"wcag":{"1.1.1":{"techniques":["G74"]}}},"title":{"en":"Any links to a multimedia file should also include a link to a transcript"},"description":{"en":"Links to a multimedia file should be followed by a link to a transcript of the file."}},"aLinksToSoundFilesNeedTranscripts":{"selector":"a[href$='.wav'], a[href$='.snd'], a[href$='.mp3'], a[href$='.iff'], a[href$='.svx'], a[href$='.sam'], a[href$='.smp'], a[href$='.vce'], a[href$='.vox'], a[href$='.pcm'], a[href$='.aif']","tags":["link","media","content"],"testability":0,"type":"selector","guidelines":{"508":["c"],"wcag":{"1.1.1":{"techniques":["G74"]}}},"title":{"en":"Any links to a sound file should also include a link to a transcript"},"description":{"en":"Links to a sound file should be followed by a link to a transcript of the file."}},"aMultimediaTextAlternative":{"selector":"a[href$='.wmv'], a[href$='.wav'], a[href$='.mpg'], a[href$='.mov'], a[href$='.ram'], a[href$='.aif']","tags":["link","media","content"],"testability":0,"type":"selector","guidelines":[]},"aMustContainText":{"callback":"aMustContainText","tags":["link","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"1.1.1":{"techniques":["H30"]},"2.4.4":{"techniques":["H30"]},"2.4.9":{"techniques":["H30"]}}},"title":{"en":"Links should contain text"},"description":{"en":"Because many users of screen-readers use links to navigate the page, providing links with no text (or with images that have empty \"alt\" attributes and no other readable text) hinders these users."}},"aMustHaveTitle":{"selector":"a:not(a[title])","tags":["link","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"All links must have a \"title\" attribute"},"description":{"en":"Every link must have a \"title\" attribute."}},"aMustNotHaveJavascriptHref":{"selector":"a[href^='javascript:']","tags":["link","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Links should not use \"javascript\" in their location"},"description":{"en":"Anchor (a. elements may not use the \"javascript\" protocol in their \"href\" attributes."}},"aSuspiciousLinkText":{"callback":"aSuspiciousLinkText","strings":"suspiciousLinks","tags":["link","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"1.1.1":{"techniques":["H30"]},"2.4.4":{"techniques":["H30"]},"2.4.9":{"techniques":["H30"]}}},"title":{"en":"Link text should be useful"},"description":{"en":"Because many users of screen-readers use links to navigate the page, providing links with text that simply read \"click here\" gives no hint of the function of the link"}},"aTitleDescribesDestination":{"selector":"a[title]","tags":["link","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"2.4.9":{"techniques":["H33","H25"]}}},"title":{"en":"The title attribute of all source a (anchor) elements describes the link destination."},"description":{"en":"Every link must have a \"title\" attribute which describes the purpose or destination of the link."}},"addressForAuthor":{"selector":"body:not(body:has(address))","tags":["document"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"The document should contain an address for the author"},"description":{"en":"Documents should provide a valid email address within an address element."}},"addressForAuthorMustBeValid":{"selector":"address","tags":["document"],"testability":0.5,"type":"selector","guidelines":[],"title":{"en":"The document should contain a valid email address for the author"},"description":{"en":"Documents should provide a valid email address within an address element."}},"appletContainsTextEquivalent":{"callback":"appletContainsTextEquivalent","tags":["objects","applet","content"],"testability":1,"type":"custom","guidelines":{"508":["m"],"wcag":{"1.1.1":{"techniques":["G74","H35"]}}},"title":{"en":"All applets should contain the same content within the body of the applet"},"description":{"en":"Applets should contain their text equivalents or description within the applet tag itself."}},"appletContainsTextEquivalentInAlt":{"attribute":"alt","components":["placeholder"],"empty":true,"selector":"applet","tags":["objects","applet","content"],"testability":0.5,"type":"placeholder","guidelines":{"508":["m"],"wcag":{"1.1.1":{"techniques":["G74","H35"]}}},"title":{"en":"All applets should contain a text equivalent in the \"alt\" attribute"},"description":{"en":"Applets should contain their text equivalents or description in an \"alt\" attribute."}},"appletProvidesMechanismToReturnToParent":{"selector":"applet","tags":["objects","applet","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"All applets should provide a way for keyboard users to escape"},"description":{"en":"Ensure that a user who has only a keyboard as an input device can escape an applet element. This requires manual confirmation."}},"appletTextEquivalentsGetUpdated":{"selector":"applet","tags":["objects","applet","content"],"testability":0,"type":"selector","guidelines":{"508":["m"],"wcag":{"1.1.1":{"techniques":["G74","H35"]}}}},"appletUIMustBeAccessible":{"selector":"applet","tags":["objects","applet","content"],"testability":0,"type":"selector","guidelines":{"508":["m"],"wcag":{"1.1.1":{"techniques":["G74","H35"]}}},"title":{"en":"Any user interface in an applet must be accessible"},"description":{"en":"Applet content should be assessed for accessibility."}},"appletsDoNotFlicker":{"selector":"applet","tags":["objects","applet","content"],"testability":0,"type":"selector","guidelines":{"508":["j"],"wcag":{"2.2.2":{"techniques":["F7"]}}},"title":{"en":"All applets do not flicker"},"description":{"en":"Applets should not flicker."}},"appletsDoneUseColorAlone":{"selector":"applet","tags":["objects","applet","content"],"testability":0,"type":"selector","guidelines":{"508":["c"]},"title":{"en":"Applets should not use color alone to communicate content"},"description":{"en":"Applets should contain content that makes sense without color and is accessible to users who are color blind."}},"areaAltIdentifiesDestination":{"selector":"area[alt]","tags":["objects","applet","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.1.1":{"techniques":["G74"]}}},"title":{"en":"All \"area\" elements must have an \"alt\" attribute which describes the link destination"},"description":{"en":"All area elements within a map must have an \"alt\" attribute"}},"areaAltRefersToText":{"selector":"area","tags":["imagemap","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Alt text for \"area\" elements should replicate the text found in the image"},"description":{"en":"If an image is being used as a map, and an area encompasses text within the image, then the \"alt\" attribute of that area element should be the same as the text found in the image."}},"areaDontOpenNewWindow":{"selector":"area[target='new window'], area[target=_new], area[target=_blank], area[target=_blank]","tags":["imagemap","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"No \"area\" elements should open a new window without warning"},"description":{"en":"No area elements should open a new window without warning."}},"areaHasAltValue":{"selector":"area:not(area[alt])","tags":["imagemap","content"],"testability":1,"type":"selector","guidelines":{"wcag":{"1.1.1":{"techniques":["F65","G74","H24"]},"1.4.3":{"techniques":["G145"]}}},"title":{"en":"All \"area\" elements must have an \"alt\" attribute"},"description":{"en":"All area elements within a map must have an \"alt\" attribute."}},"areaLinksToSoundFile":{"selector":"area[href$=wav], area[href$=snd], area[href$=mp3], area[href$=iff], area[href$=svx], area[href$=sam], area[href$=smp], area[href$=vce], area[href$=vox], area[href$=pcm], area[href$=aif]","tags":["imagemap","media","content"],"testability":1,"type":"selector","guidelines":{"wcag":{"1.1.1":{"techniques":["G74"]}}},"title":{"en":"All \"area\" elements which link to a sound file should also provide a link to a transcript"},"description":{"en":"All area elements which link to a sound file should have a text transcript"}},"ariaOrphanedContent":{"selector":"body *:not(*[role] *, *[role], script, meta, link)","tags":["aria","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Pages using ARIA roles should not have orphaned content"},"description":{"en":"If a page makes use of ARIA roles, then there should not be any content on the page which is not within an element that exposes a role, as it could cause that content to be rendreed inaccessible to users with screen readers."}},"basefontIsNotUsed":{"selector":"basefont","tags":["document","deprecated"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Basefont should not be used"},"description":{"en":"The basefont tag is deprecated and should not be used. Investigate using stylesheets instead."}},"blinkIsNotUsed":{"selector":"blink","tags":["deprecated","content"],"testability":1,"type":"selector","guidelines":{"wcag":{"2.2.2":{"techniques":["F47"]}}},"title":{"en":"The \"blink\" tag should not be used"},"description":{"en":"The blink tag should not be used. Ever."}},"blockquoteNotUsedForIndentation":{"selector":"blockquote:not(blockquote[cite])","tags":["blockquote","content"],"testability":0.5,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["H49"]}}},"title":{"en":"The \"blockquote\" tag should not be used just for indentation"},"description":{"en":".. code-block:: html"}},"blockquoteUseForQuotations":{"callback":"blockquoteUseForQuotations","tags":["blockquote","content"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["H49"]}}},"title":{"en":"If long quotes are in the document, use the \"blockquote\" element to mark them"},"description":{"en":".. code-block:: html"}},"bodyActiveLinkColorContrast":{"algorithm":"wcag","bodyBackgroundAttribute":"bgcolor","bodyForegroundAttribute":"alink","components":["color"],"selector":"a:active","tags":["document","color"],"testability":1,"type":"color","guidelines":[],"title":{"en":"Contrast between active link text and background should be 5:1"},"description":{"en":"The contrast ratio of active link text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it."}},"bodyColorContrast":{"algorithm":"wcag","bodyBackgroundAttribute":"bgcolor","bodyForegroundAttribute":"text","components":["color"],"selector":"body","tags":["document","color"],"testability":1,"type":"color","guidelines":[],"title":{"en":"Contrast between text and background should be 5:1"},"description":{"en":"The contrast ratio of text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it."}},"bodyLinkColorContrast":{"algorithm":"wcag","bodyBackgroundAttribute":"bgcolor","bodyForegroundAttribute":"link","components":["color"],"selector":"a","tags":["document","color"],"testability":1,"type":"color","guidelines":[],"title":{"en":"Contrast between link text and background should be 5:1"},"description":{"en":"The contrast ratio of link text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it."}},"bodyMustNotHaveBackground":{"selector":"body[background]","tags":["document","color"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Body elements do not use a background image"},"description":{"en":"The body element for the page may not have a \"background\" attribute."}},"bodyVisitedLinkColorContrast":{"algorithm":"wcag","bodyBackgroundAttribute":"bgcolor","bodyForegroundAttribute":"vlink","components":["color"],"selector":"a:visited","tags":["link","color"],"testability":1,"type":"color","guidelines":[],"title":{"en":"Contrast between visited link text and background should be 5:1"},"description":{"en":"The contrast ratio of visited link text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it."}},"boldIsNotUsed":{"selector":"bold","tags":["semantics","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"The \"b\" (bold) element is not used"},"description":{"en":"The b (bold) element provides no emphasis for non-sighted readers. Use the strong tag instead."}},"checkboxHasLabel":{"components":["label"],"selector":"input[type=checkbox]","tags":["form","content"],"testability":1,"type":"label","guidelines":{"508":["c"],"wcag":{"1.1.1":{"techniques":["H44"]},"1.3.1":{"techniques":["H44","F68"]},"3.3.2":{"techniques":["H44"]},"4.1.2":{"techniques":["H44"]}}},"title":{"en":"All checkboxes must have a corresponding label"},"description":{"en":"All input elements with a type of \"checkbox\" should have a corresponding label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user"}},"checkboxLabelIsNearby":{"components":["labelProximity"],"selector":"input[type=checkbox]","tags":["form","content"],"testability":0.5,"type":"labelProximity","guidelines":[],"title":{"en":"All \"checkbox\" input elements have a label that is close"},"description":{"en":"All input elements of type \"checkbox\" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away."}},"cssDocumentMakesSenseStyleTurnedOff":{"selector":"link[rel=stylesheet], stylesheet, *[style]","tags":["color"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["G140"]},"1.4.5":{"techniques":["G140"]},"1.4.9":{"techniques":["G140"]}}},"title":{"en":"The document must be readable with styles turned off"},"description":{"en":"With all the styles for a page turned off, the content of the page should still make sense. Try to turn styles off in the browser and see if the page content is readable and clear."}},"cssTextHasContrast":{"algorithm":"wcag","bodyBackgroundAttribute":"color","bodyForegroundAttribute":"background","components":["color"],"selector":"*","tags":["color"],"testability":1,"type":"color","guidelines":{"wcag":{"1.4.3":{"techniques":["G18"]}}},"title":{"en":"All elements should have appropriate color contrast"},"description":{"en":"For users who have color blindness, all text or other elements should have a color contrast of 5:1."}},"doctypeProvided":{"callback":"doctypeProvided","tags":["doctype"],"testability":1,"type":"custom","guidelines":[],"title":{"en":"The document should contain a valid \"doctype\" declaration"},"description":{"en":"Each document must contain a valid doctype declaration.."}},"documentAbbrIsUsed":{"callback":"documentAbbrIsUsed","components":["acronym"],"tags":["acronym","content"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"3.1.4":{"techniques":["H28"]}}},"title":{"en":"Abbreviations must be marked with an \"abbr\" element"},"description":{"en":"Abbreviations should be marked with an abbr element, at least once on the page for each abbreviation."}},"documentAcronymsHaveElement":{"callback":"documentAcronymsHaveElement","components":["acronym"],"tags":["acronym","content"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"3.1.4":{"techniques":["H28"]}}},"title":{"en":"Acronyms must be marked with an \"acronym\" element"},"description":{"en":"Abbreviations should be marked with an acronym element, at least once on the page for each abbreviation."}},"documentAllColorsAreSet":{"selector":"body:not(body[text][bgcolor][link][alink][vlink], body:not(body[text], body[bgcolor], body[link], body[alink], body[vlink]))","tags":["deprecated","color"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"All the document colors must be set"},"description":{"en":"If any colors for text or the background are set in the body element, then all colors must be set."}},"documentAutoRedirectNotUsed":{"selector":"meta[http-equiv=refresh]","tags":["document"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Auto-redirect with \"meta\" elements must not be used"},"description":{"en":"Because different users have different speeds and abilities when it comes to parsing the content of a page, a \"meta-refresh\" method to redirect users can prevent users from fully understanding the document before being redirected. If a pure redirect is needed"}},"documentColorWaiActiveLinkAlgorithm":{"algorithm":"wai","bodyBackgroundAttribute":"bgcolor","bodyForegroundAttribute":"alink","components":["color"],"selector":"a:active","tags":["document","color"],"testability":1,"type":"color","guidelines":[]},"documentColorWaiAlgorithm":{"algorithm":"wai","bodyBackgroundAttribute":"bgcolor","bodyForegroundAttribute":"text","components":["color"],"selector":"body","tags":["document","color"],"testability":1,"type":"color","guidelines":[]},"documentColorWaiLinkAlgorithm":{"algorithm":"wai","bodyBackgroundAttribute":"bgcolor","bodyForegroundAttribute":"link","components":["color"],"selector":"a","tags":["document","color"],"testability":1,"type":"color","guidelines":[]},"documentColorWaiVisitedLinkAlgorithm":{"algorithm":"wai","bodyBackgroundAttribute":"bgcolor","bodyForegroundAttribute":"vlink","components":["color"],"selector":"a:visited","tags":["document","color"],"testability":1,"type":"color","guidelines":[]},"documentContentReadableWithoutStylesheets":{"selector":"html:has(link[rel=stylesheet], style) body, body:has(*[style])","tags":["document","color"],"testability":0,"type":"selector","guidelines":{"508":["d"],"wcag":{"1.3.1":{"techniques":["G140"]},"1.4.5":{"techniques":["G140"]},"1.4.9":{"techniques":["G140"]}}},"title":{"en":"Content should be readable without style sheets"},"description":{"en":"With all the styles for a page turned off, the content of the page should still make sense. Try to turn styles off in the browser and see if the page content is readable and clear."}},"documentHasTitleElement":{"selector":"html:not(html:has(title))","tags":["document","head"],"testability":1,"type":"selector","guidelines":{"wcag":{"2.4.2":{"techniques":["H25"]}}},"title":{"en":"The document should have a title element"},"description":{"en":"The document should have a title element."}},"documentIDsMustBeUnique":{"callback":"documentIDsMustBeUnique","tags":["document","semantics"],"testability":1,"type":"custom","guidelines":{"wcag":{"4.1.1":{"techniques":["F77"]}}},"title":{"en":"All element \"id\" attributes must be unique"},"description":{"en":"Element \"id\" attributes must be unique."}},"documentIsWrittenClearly":{"callback":"documentIsWrittenClearly","components":["textStatistics"],"tags":["language","content"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"3.1.5":{"techniques":["G86"]}}},"title":{"en":"The document should be written to the target audience and read clearly"},"description":{"en":"If a document is beyond a 10th grade level, then a summary or other guide should also be provided to guide the user through the content."}},"documentLangIsISO639Standard":{"callback":"documentLangIsISO639Standard","strings":"languageCodes","tags":["document","language"],"testability":1,"type":"custom","guidelines":{"wcag":{"3.1.1":{"techniques":["H57"]}}},"title":{"en":"The document's language attribute should be a standard code"},"description":{"en":"The document should have a default langauge, and that language should use the valid 2 or 3 letter language code according to ISO specification 639."}},"documentLangNotIdentified":{"selector":"html:not(html[lang])","tags":["document","language"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"The document must have a \"lang\" attribute"},"description":{"en":"The document should have a default langauge, by setting the \"lang\" attribute in the html element."}},"documentMetaNotUsedWithTimeout":{"selector":"meta[http-equiv=refresh]","tags":["document"],"testability":1,"type":"selector","guidelines":{"wcag":{"2.2.1":{"techniques":["F40","F41"]},"2.2.4":{"techniques":["F40","F41"]},"3.2.5":{"techniques":["F41"]}}},"title":{"en":"Meta elements must not be used to refresh the content of a page"},"description":{"en":"Because different users have different speeds and abilities when it comes to parsing the content of a page, a \"meta-refresh\" method to reload the content of the page can prevent users from having full access to the content. Try to use a \"refresh this\" link instead.."}},"documentReadingDirection":{"selector":"*[lang=he]:not(*[dir=rtl]), *[lang=ar]:not(*[dir=rtl])","tags":["document","language"],"testability":0.5,"type":"selector","guidelines":{"wcag":{"1.3.2":{"techniques":["H34"]}}},"title":{"en":"Reading direction of text is correctly marked"},"description":{"en":"Where required, the reading direction of the document (for language that read in different directions), or portions of the text, must be declared."}},"documentStrictDocType":{"callback":"documentStrictDocType","tags":["document","doctype"],"testability":1,"type":"custom","guidelines":[],"title":{"en":"The page uses a strict doctype"},"description":{"en":"The doctype of the page or document should be either an HTML or XHTML strict doctype."}},"documentTitleDescribesDocument":{"selector":"head title:first","tags":["document","head"],"testability":0,"type":"selector","guidelines":{"wcag":{"2.4.2":{"techniques":["F25","G88"]}}},"title":{"en":"The title describes the document"},"description":{"en":"The document title should actually describe the page. Often, screen readers use the title to navigate from one window to another."}},"documentTitleIsNotPlaceholder":{"components":["placeholder"],"content":true,"selector":"head title:first","tags":["document","head"],"testability":1,"type":"placeholder","guidelines":{"wcag":{"2.4.2":{"techniques":["F25","G88"]}}},"title":{"en":"The document title should not be placeholder text"},"description":{"en":"The document title should not be wasted placeholder text which does not describe the page."}},"documentTitleIsShort":{"callback":"documentTitleIsShort","tags":["document","head"],"testability":0.5,"type":"custom","guidelines":[],"title":{"en":"The document title should be short"},"description":{"en":"The document title should be short and succinct. This test fails at 150 characters, but authors should consider this to be a suggestion."}},"documentTitleNotEmpty":{"components":["placeholder"],"content":true,"empty":true,"selector":"head title","tags":["document","head"],"testability":1,"type":"placeholder","guidelines":{"wcag":{"2.4.2":{"techniques":["F25","H25"]}}},"title":{"en":"The document should not have an empty title"},"description":{"en":"The document should have a title element that is not white space"}},"documentValidatesToDocType":{"callback":"documentValidatesToDocType","tags":["document","doctype"],"testability":1,"type":"custom","guidelines":{"wcag":{"4.1.1":{"techniques":["G134"]}}},"title":{"en":"Document must validate to the doctype"},"description":{"en":"The document must validate to the declared doctype."}},"documentVisualListsAreMarkedUp":{"callback":"documentVisualListsAreMarkedUp","tags":["list","semantics","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["H28","T2"]}}},"title":{"en":"Visual lists of items are marked using ordered or unordered lists"},"description":{"en":"Use the ordered (ol. or unordered (ul. elements for lists of items, instead of just using new lines which start with numbers or characters to create a visual list."}},"documentWordsNotInLanguageAreMarked":{"selector":"body","tags":["language"],"testability":0,"type":"selector","guidelines":{"wcag":{"3.1.2":{"techniques":["H58"]}}},"title":{"en":"Any words or phrases which are not the document's primary language should be marked"},"description":{"en":"If a document has words or phrases which are not in the document's primary language, those words or phrases should be properly marked. This helps indicate which language or voice a screen-reader should use to read the text."}},"embedHasAssociatedNoEmbed":{"callback":"embedHasAssociatedNoEmbed","tags":["object","embed","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"1.1.1":{"techniques":["H46"]}}},"title":{"en":"All \"embed\" elements have an associated \"noembed\" element"},"description":{"en":"Because some users cannot use the embed element, provide alternative content in a noembed element."}},"embedMustHaveAltAttribute":{"selector":"embed:not(embed[alt])","tags":["object","embed","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Embed\" elements must have an \"alt\" attribute"},"description":{"en":"All embed elements must have an \"alt\" attribute."}},"embedMustNotHaveEmptyAlt":{"selector":"embed[alt=]","tags":["object","embed","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Embed\" elements cannot have an empty \"alt\" attribute"},"description":{"en":"All embed elements must have an \"alt\" attribute that is not empty."}},"embedProvidesMechanismToReturnToParent":{"selector":"embed","tags":["object","embed","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"2.1.2":{"techniques":["G21"]}}},"title":{"en":"All embed elements should provide a way for keyboard users to escape"},"description":{"en":"Ensure that a user who has only a keyboard as an input device can escape an embed element. This requires manual confirmation."}},"emoticonsExcessiveUse":{"callback":"emoticonsExcessiveUse","strings":"emoticons","tags":["language","emoticons","content"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"1.1.1":{"techniques":["H86"]}}},"title":{"en":"Emoticons should not be used excessively"},"description":{"en":"Emoticons should not be used excessively to communicate feelings or content. Try to rewrite the document to have more textual meaning, or wrapping the emoticons in an abbr element as outlined below. Emoticons are not read by screen-readers, and are often used to communicate feelings or other things which are relevant to the content of the document."}},"emoticonsMissingAbbr":{"callback":"emoticonsMissingAbbr","strings":"emoticons","tags":["language","emoticons","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"1.1.1":{"techniques":["H86"]}}},"title":{"en":"Emoticons should have abbreviations"},"description":{"en":"Emoticons are not read by screen-readers, and are often used to communicate feelings or other things which are relevant to the content of the document. If this emoticon is important content, mark it up with an \"abbr\" or \"acronym\" tag."}},"fileHasLabel":{"components":["label"],"selector":"input[type=file]","tags":["form","content"],"testability":1,"type":"label","guidelines":{"508":["n"],"wcag":{"1.1.1":{"techniques":["H44"]},"1.3.1":{"techniques":["H44","F68"]},"3.3.2":{"techniques":["H44"]},"4.1.2":{"techniques":["H44"]}}},"title":{"en":"All \"file\" input elements have a corresponding label"},"description":{"en":"All input elements of type \"file\" should have a corresponding label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user"}},"fileLabelIsNearby":{"components":["labelProximity"],"selector":"input[type=file]","tags":["form","content"],"testability":0.5,"type":"labelProximity","guidelines":[],"title":{"en":"All \"file\" input elements have a label that is close"},"description":{"en":"All input elements of type \"file\" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away."}},"fontIsNotUsed":{"selector":"font","tags":["deprecated","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Font elements should not be used"},"description":{"en":"The basefont tag is deprecated and should not be used. Investigate using stylesheets instead."}},"formAllowsCheckIfIrreversable":{"selector":"form","tags":["form","content"],"testability":0,"type":"selector","guidelines":[]},"formDeleteIsReversable":{"selector":"form","tags":["form","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Deleting items using a form should be reversable"},"description":{"en":"Check that, if a form has the option to delete an item, that the user has a chance to either reverse the delete process, or is asked for confirmation before the item is deleted. This is not something that can be checked through automated testing and requires manual confirmation."}},"formErrorMessageHelpsUser":{"selector":"form","tags":["form","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Forms offer the user a way to check the results of their form before performing an irrevokable action"},"description":{"en":"If the form allows users to perform some irrevokable action, like ordreing a product, ensure that users have the ability to review the contents of the form they submitted first. This is not something that can be checked through automated testing and requires manual confirmation."}},"formHasGoodErrorMessage":{"selector":"form","tags":["form","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Form error messages should assist in solving errors"},"description":{"en":"If the form has some required fields or other ways in which the user can commit an error, check that the reply is accessible. Use the words \"required\" or \"error\" within the label element of input items where the errors happened"}},"formWithRequiredLabel":{"callback":"formWithRequiredLabel","tags":["form","content"],"testability":0,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["ARIA2"]},"1.4.1":{"techniques":["F81"]},"3.3.2":{"techniques":["ARIA2","H90"]},"3.3.3":{"techniques":["ARIA2"]}}},"title":{"en":"Input items which are required are marked as so in the label element"},"description":{"en":"If a form element is required, it should marked as so. This should not be a mere red asterisk, but instead either a 'required' image with alt text of \"required\" or the actual text \"required.\" The indicator that an item is required should be included in the input element's label element."}},"frameIsNotUsed":{"selector":"frame","tags":["deprecated","frame"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Frames are not used"},"description":{"en":".. code-block:: html"}},"frameRelationshipsMustBeDescribed":{"selector":"frameset:not(frameset[longdesc])","tags":["deprecated","frame"],"testability":0.5,"type":"selector","guidelines":[],"title":{"en":"Complex framesets should contain a \"longdesc\" attribute"},"description":{"en":"If a frameset contains three or more frames, use a \"longdesc\" attribute to help describe the purpose of the frames."}},"frameSrcIsAccessible":{"selector":"frame","tags":["deprecated","frame"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"The source for each frame is accessible content."},"description":{"en":"Each frame should contain accessible content, and contain content accessible to screen readers, like HTML as opposed to an image."}},"frameTitlesDescribeFunction":{"attribute":"title","components":["placeholder"],"empty":true,"selector":"frame[title]","tags":["deprecated","frame"],"testability":0,"type":"placeholder","guidelines":{"wcag":{"2.4.1":{"techniques":["H64"]}}},"title":{"en":"All \"frame\" elemetns should have a \"title\" attribute that describes the purpose of the frame"},"description":{"en":"Each frame elements should have a \"title\" attribute which describes the purpose or function of the frame."}},"frameTitlesNotEmpty":{"selector":"frame:not(frame[title]), frame[title=], iframe:not(iframe[title]), iframe[title=]","tags":["deprecated","frame"],"testability":1,"type":"selector","guidelines":{"wcag":{"2.4.1":{"techniques":["H64"]},"4.1.2":{"techniques":["H64"]}}},"title":{"en":"Frames cannot have empty \"title\" attributes"},"description":{"en":"All frame elements must have a valid \"title\" attribute."}},"frameTitlesNotPlaceholder":{"attribute":"title","components":["placeholder"],"selector":"frame, iframe","tags":["deprecated","frame"],"testability":1,"type":"placeholder","guidelines":{"wcag":{"2.4.1":{"techniques":["H64"]},"4.1.2":{"techniques":["H64"]}}},"title":{"en":"Frames cannot have \"title\" attributes that are just placeholder text"},"description":{"en":"Frame \"title\" attributes should not be simple placeholder text like \"frame"}},"framesHaveATitle":{"selector":"frame:not(frame[title]), iframe:not(iframe[title])","tags":["deprecated","frame"],"testability":1,"type":"selector","guidelines":{"wcag":{"2.4.1":{"techniques":["H64"]},"4.1.2":{"techniques":["H64"]}}},"title":{"en":"All \"frame\" elements should have a \"title\" attribute"},"description":{"en":"Each frame elements should have a \"title\" attribute."}},"framesetIsNotUsed":{"selector":"frameset","tags":["deprecated","frame"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"The \"frameset\" element should not be used"},"description":{"en":".. code-block:: html"}},"framesetMustHaveNoFramesSection":{"selector":"frameset:not(frameset:has(noframes))","tags":["deprecated","frame"],"testability":0.5,"type":"selector","guidelines":[],"title":{"en":"All framesets should contain a noframes section"},"description":{"en":"If a frameset contains three or more frames, use a \"longdesc\" attribute to help describe the purpose of the frames."}},"headerH1":{"components":["header"],"selector":"h1","tags":["header","content"],"testability":0,"type":"header","guidelines":{"wcag":{"2.4.6":{"techniques":["G130"]}}},"title":{"en":"The header following an h1 is h1 or h2"},"description":{"en":"The header following an h1 element should either be an h2 or another h1. "}},"headerH1Format":{"components":["header"],"selector":"h1","tags":["header","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["T3"]}}},"title":{"en":"All h1 elements are not used for formatting"},"description":{"en":"An h1 element may not be used purely for formatting."}},"headerH2":{"components":["header"],"selector":"h2","tags":["header","content"],"testability":0,"type":"header","guidelines":{"wcag":{"2.4.6":{"techniques":["G130"]}}},"title":{"en":"The header following an h2 is h1, h2 or h3"},"description":{"en":"The header following an h2 element should either be an h3, h1 or another h2. "}},"headerH2Format":{"components":["header"],"selector":"h2","tags":["header","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["T3"]}}},"title":{"en":"All h2 elements are not used for formatting"},"description":{"en":"An h2 element may not be used purely for formatting."}},"headerH3":{"components":["header"],"selector":"h3","tags":["header","content"],"testability":0,"type":"header","guidelines":{"wcag":{"2.4.6":{"techniques":["G130"]}}},"title":{"en":"The header following an h3 is h1, h2, h3 or h4"},"description":{"en":"The header following an h3 element should either be an h4, h2, h1 or another h3. "}},"headerH3Format":{"components":["header"],"selector":"h3","tags":["header","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["T3"]}}},"title":{"en":"All h3 elements are not used for formatting"},"description":{"en":"An h3 element may not be used purely for formatting."}},"headerH4":{"components":["header"],"selector":"h4","tags":["header","content"],"testability":0,"type":"header","guidelines":{"wcag":{"2.4.6":{"techniques":["G130"]}}},"title":{"en":"The header following an h4 is h1, h2, h3, h4 or h5"},"description":{"en":"The header following an h4 element should either be an h5, h3, h2, h1, or another h4. "}},"headerH4Format":{"components":["header"],"selector":"h4","tags":["header","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["T3"]}}},"title":{"en":"All h4 elements are not used for formatting"},"description":{"en":"An h4 element may not be used purely for formatting."}},"headerH5":{"components":["header"],"selector":"h5","tags":["header","content"],"testability":0,"type":"header","guidelines":{"wcag":{"2.4.6":{"techniques":["G130"]}}},"title":{"en":"The header following an h5 is h6 or any header less than h6"},"description":{"en":"The header following an h5 element should either be an h6, h3, h2, h1, or another h5. "}},"headerH5Format":{"selector":"h5","tags":["header","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["T3"]}}},"title":{"en":"All h5 elements are not used for formatting"},"description":{"en":"An h5 element may not be used purely for formatting."}},"headerH6Format":{"selector":"h6","tags":["header","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["T3"]}}},"title":{"en":"All h6 elements are not used for formatting"},"description":{"en":"An h6 element may not be used purely for formatting."}},"headersHaveText":{"components":["placeholder"],"content":true,"empty":true,"selector":"h1, h2, h3, h4, h5, h6","tags":["header","content"],"testability":1,"type":"placeholder","guidelines":{"wcag":{"1.3.1":{"techniques":["G141"]},"2.4.10":{"techniques":["G141"]}}},"title":{"en":"All headers should contain readable text"},"description":{"en":"Users with screen readers use headings like the tabs h1 to navigate the structure of a page. All headings should contain either text, or images with appropriate alt attributes."}},"headersUseToMarkSections":{"callback":"headersUseToMarkSections","tags":["header","content"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["G141"]},"2.4.10":{"techniques":["G141"]}}},"title":{"en":"Use headers to mark the beginning of each section"},"description":{"en":"Check that each logical section of the page is broken or introduced with a header (. h1-h6>) element."}},"iIsNotUsed":{"selector":"i","tags":["deprecated","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"The \"i\" (italic) element is not used"},"description":{"en":"The i (italic) element provides no emphasis for non-sighted readers. Use the em tag instead."}},"iframeMustNotHaveLongdesc":{"selector":"iframe[longdesc]","tags":["objects","iframe","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Inline frames (\"iframes\") should not have a \"longdesc\" attribute"},"description":{"en":".. code-block:: html"}},"imageMapServerSide":{"selector":"img[ismap]","tags":["objects","iframe","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"All links in a server-side map should have duplicate links available in the document"},"description":{"en":"Any image with an \"usemap\" attribute for a server-side image map should have the available links duplicated elsewhere."}},"imgAltEmptyForDecorativeImages":{"selector":"img[alt]","tags":["image","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.3.3":{"techniques":["F26"]}}},"title":{"en":"If an image is purely decorative, the \"alt\" text must be empty"},"description":{"en":"Any image that is only decorative (serves no function or adds to the purpose of the page content) should have an \"alt\" attribute"}},"imgAltIdentifiesLinkDestination":{"selector":"a img[alt]:first","tags":["image","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Any image within a link must have \"alt\" text the describes the link destination"},"description":{"en":"Any image that is within a link should have an \"alt\" attribute which identifies the destination or purpose of the link."}},"imgAltIsDifferent":{"callback":"imgAltIsDifferent","tags":["image","content"],"testability":0.5,"type":"custom","guidelines":{"508":["a"],"wcag":{"1.1.1":{"techniques":["H37"]}}},"title":{"en":"Image \"alt\" attributes should not be the same as the filename"},"description":{"en":"All img elements should have an \"alt\" attribute that is not just the name of the file"}},"imgAltIsSameInText":{"selector":"img","tags":["image","content"],"testability":0,"type":"selector","guidelines":{"508":["a"],"wcag":{"1.1.1":{"techniques":["G74","H37"]}}},"title":{"en":"Check that any text within an image is also in the \"alt\" attribute"},"description":{"en":"If an image has text within it, that text should be repeated in the \"alt\" attribute"}},"imgAltIsTooLong":{"callback":"imgAltIsTooLong","tags":["image","content"],"testability":1,"type":"custom","guidelines":{"508":["a"],"wcag":{"1.1.1":{"techniques":["H37"]}}},"title":{"en":"Image Alt text is short"},"description":{"en":"All \"alt\" attributes for img elements should be clear and concise. \"Alt\" attributes over 100 characters long should be reviewed to see if they are too long."}},"imgAltNotEmptyInAnchor":{"callback":"imgAltNotEmptyInAnchor","tags":["image","content"],"testability":1,"type":"custom","guidelines":{"508":["a"],"wcag":{"2.4.4":{"techniques":["H30"]}}},"title":{"en":"An image within a link cannot have an empty \"alt\" attribute if there is no other text within the link"},"description":{"en":"Any image that is within a link (an a element) that has no other text cannot have an empty or missing \"alt\" attribute."}},"imgAltNotPlaceHolder":{"attribute":"alt","components":["placeholder"],"selector":"img","tags":["image","content"],"testability":1,"type":"placeholder","guidelines":{"508":["a"],"wcag":{"1.1.1":{"techniques":["F30","F39"]},"1.2.1":{"techniques":["F30"]}}},"title":{"en":"Images should not have a simple placeholder text as an \"alt\" attribute"},"description":{"en":"Any image that is not used decorativey or which is purely for layout purposes cannot have an \"alt\" attribute that consists solely of placeholders."}},"imgAltTextNotRedundant":{"callback":"imgAltTextNotRedundant","tags":["image","content"],"testability":1,"type":"custom","guidelines":[],"title":{"en":"Unless the image files are the same, no image should contain redundant alt text"},"description":{"en":"Every distinct image on a page should have it's own alt text which is different than all the others on the page to avoid redundancy and confusion."}},"imgGifNoFlicker":{"callback":"imgGifNoFlicker","tags":["image","content"],"testability":1,"type":"custom","guidelines":{"508":["j"],"wcag":{"2.2.2":{"techniques":["G152"]}}},"title":{"en":"Any animated GIF should not flicker"},"description":{"en":"Animated GIF files should not flicker with a frequency over 2 Hz and lower than 55 Hz. You can check the flicker rate of this GIF using an online tool."}},"imgHasAlt":{"selector":"img:not(img[alt])","tags":["image","content"],"testability":1,"type":"selector","guidelines":{"508":["a"],"wcag":{"1.1.1":{"techniques":["F65","H37"]}}},"title":{"en":"Image elements must have an \"alt\" attribute"},"description":{"en":"All img elements must have an alt attribute"}},"imgHasLongDesc":{"callback":"imgHasLongDesc","tags":["image","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"2.4.4":{"techniques":["G91"]},"2.4.9":{"techniques":["G91"]}}},"title":{"en":"A \"longdesc\" attribute is required for any image where additional information not in the \"alt\" attribute is required"},"description":{"en":"Any image that has an \"alt\" attribute that does not fully convey the meaning of the image must have a \"longdesc\" attribute."}},"imgImportantNoSpacerAlt":{"callback":"imgImportantNoSpacerAlt","tags":["image","content"],"testability":0.5,"type":"custom","guidelines":[],"title":{"en":"Images that are important should not have a purely white-space \"alt\" attribute"},"description":{"en":"Any image that is not used decorativey or which is purely for layout purposes cannot have an \"alt\" attribute that consists solely of white space (i.e. a space"}},"imgMapAreasHaveDuplicateLink":{"callback":"imgMapAreasHaveDuplicateLink","tags":["image","imagemap"],"testability":1,"type":"custom","guidelines":{"508":["ef","ef"]},"title":{"en":"All links within a client-side image are duplicated elsewhere in the document"},"description":{"en":"Any image that has a \"usemap\" attribute must have links replicated somewhere else in the document."}},"imgNonDecorativeHasAlt":{"callback":"imgNonDecorativeHasAlt","tags":["image","content"],"testability":0.5,"type":"custom","guidelines":{"508":["a"],"wcag":{"1.1.1":{"techniques":["F38"]}}},"title":{"en":"Any non-decorative images should have a non-empty \"alt\" attribute"},"description":{"en":"Any image that is not used decorativey or which is purely for layout purposes cannot have an empty \"alt\" attribute."}},"imgNotReferredToByColorAlone":{"selector":"img","tags":["image","color","content"],"testability":0,"type":"selector","guidelines":{"508":["c"],"wcag":{"1.1.1":{"techniques":["F13"]},"1.4.1":{"techniques":["F13"]}}},"title":{"en":"For any image, the \"alt\" text cannot refer to color alone"},"description":{"en":"The \"alt\" text or content text for any image should not refer to the image by color alone. This is often fixed by changing the \"alt\" text to the meaning of the image"}},"imgServerSideMapNotUsed":{"selector":"img[ismap]","tags":["image","imagemap","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Server-side image maps should not be used"},"description":{"en":"Server-side image maps should not be used."}},"imgShouldNotHaveTitle":{"selector":"img[title]","tags":["image","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Images should not have a \"title\" attribute"},"description":{"en":"Images should not contain a \"title\" attribute."}},"imgWithMapHasUseMap":{"selector":"img[ismap]:not(img[usemap])","tags":["image","imagemap","content"],"testability":1,"type":"selector","guidelines":{"508":["ef","ef"]},"title":{"en":"Any image with an \"ismap\" attribute have a valid \"usemap\" attribute"},"description":{"en":"If an image has an \"ismap\" attribute"}},"imgWithMathShouldHaveMathEquivalent":{"callback":"imgWithMathShouldHaveMathEquivalent","tags":["image","content"],"testability":0,"type":"custom","guidelines":[],"title":{"en":"Images which contain math equations should provide equivalent MathML"},"description":{"en":"Images which contain math equations should be accompanied or link to a document with the equivalent equation marked up with MathML."}},"inputCheckboxHasTabIndex":{"attribute":"tabindex","components":["placeholder"],"empty":true,"selector":"input[type=checkbox]","tags":["form","content"],"testability":1,"type":"placeholder","guidelines":[],"title":{"en":"All \"checkbox\" input elements require a valid \"tabindex\" attribute"},"description":{"en":"All input elements of type \"checkbox\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone."}},"inputCheckboxRequiresFieldset":{"callback":"inputCheckboxRequiresFieldset","tags":["form","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"3.3.2":{"techniques":["H71"]}}},"title":{"en":"Logical groups of check boxes should be grouped with a \"fieldset"},"description":{"en":"Related \"checkbox\" input fields should be grouped together using a fieldset."}},"inputDoesNotUseColorAlone":{"selector":"input:not(input[type=hidden])","tags":["form","color","content"],"testability":0,"type":"selector","guidelines":{"508":["c"]},"title":{"en":"An \"input\" element should not use color alone"},"description":{"en":"All input elements should not refer to content by color alone."}},"inputElementsDontHaveAlt":{"selector":"input[type!=image][alt]","tags":["form","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Input elements which are not images should not have an \"alt\" attribute"},"description":{"en":"Because of inconsistencies in how user agents use the \"alt\" attribute"}},"inputFileHasTabIndex":{"attribute":"tabindex","components":["placeholder"],"empty":true,"selector":"input[type=file]","tags":["form","tabindex"],"testability":1,"type":"placeholder","guidelines":[],"title":{"en":"All \"file\" input elements require a valid \"tabindex\" attribute"},"description":{"en":"All input elements of type \"file\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone."}},"inputImageAltIdentifiesPurpose":{"selector":"input[type=image][alt]","tags":["form","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.1.1":{"techniques":["H36"]}}},"title":{"en":"All \"input\" elements with a type of \"image\" must have an \"alt\" attribute that describes the function of the input"},"description":{"en":"All input elements with a type of \"image\" should have an \"alt\" attribute"}},"inputImageAltIsNotFileName":{"callback":"inputImageAltIsNotFileName","tags":["form","image","content"],"testability":1,"type":"custom","guidelines":{"508":["a"],"wcag":{"1.1.1":{"techniques":["H36"]}}},"title":{"en":"All \"input\" elements with a type of \"image\" must have an \"alt\" attribute which is not the same as the filename"},"description":{"en":"All input elements with a type of \"image\" should have an \"alt\" attribute"}},"inputImageAltIsNotPlaceholder":{"attribute":"alt","components":["placeholder"],"selector":"input[type=image]","tags":["form","image","content"],"testability":1,"type":"placeholder","guidelines":{"508":["a"],"wcag":{"1.1.1":{"techniques":["H36"]}}},"title":{"en":"All \"input\" elements with a type of \"image\" must have an \"alt\" attribute which is not placeholder text"},"description":{"en":"All input elements with a type of \"image\" should have an \"alt\" attribute"}},"inputImageAltIsShort":{"callback":"inputImageAltIsShort","tags":["form","image","content"],"testability":1,"type":"custom","guidelines":{"508":["a"],"wcag":{"1.1.1":{"techniques":["H36"]}}},"title":{"en":"All \"input\" elements with a type of \"image\" must have an \"alt\" attribute which is as short as possible"},"description":{"en":"All input elements with a type of \"image\" should have an \"alt\" attribute"}},"inputImageAltNotRedundant":{"callback":"inputImageAltNotRedundant","strings":"redundant.inputImage","tags":["form","image","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"1.1.1":{"techniques":["H36"]}}},"title":{"en":"The \"alt\" text for input \"image\" submit buttons must not be filler text"},"description":{"en":"Every form image button should not simply use filler text like \"button\" or \"submit\" as the \"alt\" text."}},"inputImageHasAlt":{"selector":"input[type=image]:not(input[type=image][alt])","tags":["form","image","content"],"testability":1,"type":"selector","guidelines":{"508":["a"],"wcag":{"1.1.1":{"techniques":["F65","G94","H36"]}}},"title":{"en":"All \"input\" elements with a type of \"image\" must have an \"alt\" attribute"},"description":{"en":"All input elements with a type of \"image\" should have an \"alt\" attribute."}},"inputImageNotDecorative":{"selector":"input[type=image]","tags":["form","image","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.1.1":{"techniques":["H36"]}}},"title":{"en":"The \"alt\" text for input \"image\" buttons must be the same as text inside the image"},"description":{"en":"Every form image button which has text within the image (say, a picture of the word \"Search\" in a special font)"}},"inputPasswordHasTabIndex":{"attribute":"tabindex","components":["placeholder"],"empty":true,"selector":"input[type=password]","tags":["form","content"],"testability":1,"type":"placeholder","guidelines":[],"title":{"en":"All \"password\" input elements require a valid \"tabindex\" attribute"},"description":{"en":"All input elements of type \"password\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone."}},"inputRadioHasTabIndex":{"attribute":"tabindex","components":["placeholder"],"empty":true,"selector":"input[type=radio]","tags":["form","content"],"testability":1,"type":"placeholder","guidelines":[],"title":{"en":"All \"radio\" input elements require a valid \"tabindex\" attribute"},"description":{"en":"All input elements of type \"radio\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone."}},"inputSubmitHasTabIndex":{"attribute":"tabindex","components":["placeholder"],"empty":true,"selector":"input[type=submit]","tags":["form","content"],"testability":1,"type":"placeholder","guidelines":[],"title":{"en":"All input elements, type of \"submit\" have a valid tab index."},"description":{"en":""}},"inputTextHasLabel":{"selector":"input[type=text]","tags":["form","content"],"testability":1,"type":"label","guidelines":{"wcag":{"1.1.1":{"techniques":["H44"]},"1.3.1":{"techniques":["H44","F68"]},"3.3.2":{"techniques":["H44"]},"4.1.2":{"techniques":["H44"]}}},"title":{"en":"All \"input\" elements should have a corresponding \"label"},"description":{"en":"All input elements should have a corresponding label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user"}},"inputTextHasTabIndex":{"attribute":"tabindex","components":["placeholder"],"empty":true,"selector":"input[type=text]","tags":["form","content"],"testability":1,"type":"placeholder","guidelines":[],"title":{"en":"All \"text\" input elements require a valid \"tabindex\" attribute"},"description":{"en":"All input elements of type \"text\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone."}},"inputTextHasValue":{"attribute":"value","components":["placeholder"],"empty":true,"selector":"input[type=text]","tags":["form","content"],"testability":1,"type":"placeholder","guidelines":[],"title":{"en":"All \"input\" elements of type \"text\" must have a default text"},"description":{"en":"All input elements with a type of \"text\" should have a default text."}},"inputTextValueNotEmpty":{"attribute":"value","components":["placeholder"],"empty":true,"selector":"input[type=text]","tags":["form","content"],"testability":1,"type":"placeholder","guidelines":[],"title":{"en":"Text\" input elements require a non-whitespace default text"},"description":{"en":"All input elements with a type of \"text\" should have a default text which is not empty."}},"labelDoesNotContainInput":{"selector":"label:has(input)","tags":["form","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Label elements should not contain an input element"},"description":{"en":".. code-block:: html"}},"labelMustBeUnique":{"callback":"labelMustBeUnique","tags":["form","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["F17"]},"4.1.1":{"techniques":["F17"]}}},"title":{"en":"Every form input must have only one label"},"description":{"en":"Each form input should have only one label element."}},"labelMustNotBeEmpty":{"components":["placeholder"],"content":true,"empty":true,"selector":"label","tags":["form","content"],"testability":1,"type":"placeholder","guidelines":{"wcag":{"1.1.1":{"techniques":["H44"]},"1.3.1":{"techniques":["H44","F68"]},"3.3.2":{"techniques":["H44"]},"4.1.2":{"techniques":["H44"]}}},"title":{"en":"Labels must contain text"},"description":{"en":".. code-block:: html"}},"labelsAreAssignedToAnInput":{"callback":"labelsAreAssignedToAnInput","tags":["form","content"],"testability":1,"type":"custom","guidelines":[],"title":{"en":"All labels should be associated with an input"},"description":{"en":"All label elements should be assigned to an input item, and should have a for attribute which equals the id attribute of a form element."}},"legendDescribesListOfChoices":{"selector":"legend","tags":["form","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"2.4.6":{"techniques":["G131"]}}},"title":{"en":"All \"legend\" elements must describe the group of choices"},"description":{"en":"If a legend element is used in a fieldset, the legend content must describe the group of choices."}},"legendTextNotEmpty":{"selector":"legend:empty","tags":["form","content"],"testability":1,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["H71"]},"2.4.6":{"techniques":["G131"]},"3.3.2":{"techniques":["H71"]}}},"title":{"en":"Legend text must not contain just whitespace"},"description":{"en":"If a legend element is used in a fieldset, the legend should not contain empty text."}},"legendTextNotPlaceholder":{"components":["placeholder"],"content":true,"emtpy":true,"selector":"legend","tags":["form","content"],"testability":1,"type":"placeholder","guidelines":{"wcag":{"1.3.1":{"techniques":["H71"]},"2.4.6":{"techniques":["G131"]},"3.3.2":{"techniques":["H71"]}}},"title":{"en":"Legend\" text must not contain placeholder text like \"form\" or \"field"},"description":{"en":"If a legend element is used in a fieldset, the legend should not contain useless placeholder text."}},"liDontUseImageForBullet":{"selector":"li:has(img)","tags":["list","content"],"testability":0.5,"type":"selector","guidelines":[]},"linkUsedForAlternateContent":{"selector":"html:not(html:has(link[rel=alternate])) body","tags":["document"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Use a \"link\" element for alternate content"},"description":{"en":"Documents which contain things like videos, sound, or other forms of media that are not accessible, should provide a link element with a \"rel\" attribute of \"alternate\" in the document header."}},"linkUsedToDescribeNavigation":{"selector":"html:not(html:has(link[rel=index]))","tags":["document"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Document uses link element to describe navigation if it is within a collection."},"description":{"en":"The link element can provide metadata about the position of an HTML page within a set of Web units or can assist in locating content with a set of Web units."}},"listNotUsedForFormatting":{"callback":"listNotUsedForFormatting","tags":["list","content"],"testability":0,"type":"custom","guidelines":{"wcag":{"1.3.2":{"techniques":["F1"]}}},"title":{"en":"Lists should not be used for formatting"},"description":{"en":"Lists like ul and ol are to provide a structured list, and should not be used to format text. This test views any list with just one item as suspicious, but should be manually reviewed."}},"marqueeIsNotUsed":{"selector":"marquee","tags":["deprecated","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"The \"marquee\" tag should not be used"},"description":{"en":"The marquee element is difficult for users to read and is not a standard HTML element. Try to find another way to convey the importance of this text."}},"menuNotUsedToFormatText":{"selector":"menu:not(menu li:parent(menu))","tags":["list","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Menu elements should not be used for formattin"},"description":{"en":"Menu is a deprecated tag, but is still honored in a transitional DTD. Menu tags are to provide structure for a document and should not be used for formatting. If a menu tag is to be used, it should only contain an ordered or unordered list of links."}},"noembedHasEquivalentContent":{"selector":"noembed","tags":["objects","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Noembed elements must be the same content as their \"embed\" element"},"description":{"en":"All noembed elements must contain or link to an accessible version of their embed counterparts."}},"noframesSectionMustHaveTextEquivalent":{"selector":"frameset:not(frameset:has(noframes))","tags":["deprecated","frame"],"testability":0.5,"type":"selector","guidelines":[],"title":{"en":"All \"noframes\" elements should contain the text content from all frames"},"description":{"en":"The noframes content should either replicate or link to the content visible within the frames."}},"objectContentUsableWhenDisabled":{"selector":"object","tags":["objects","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"When objects are disabled, content should still be available"},"description":{"en":"The content within objects should still be available, even if the object is disabled. To do this, place a link to the direct object source within the object tag."}},"objectDoesNotFlicker":{"selector":"object","tags":["objects","content"],"testability":0,"type":"selector","guidelines":{"508":["j"],"wcag":{"2.2.2":{"techniques":["F7"]}}},"title":{"en":"Objects do not flicker"},"description":{"en":"The content within an object tag must not flicker."}},"objectDoesNotUseColorAlone":{"selector":"object","tags":["objects","content"],"testability":0,"type":"selector","guidelines":{"508":["c"]},"title":{"en":"Objects must not use color to communicate alone"},"description":{"en":"Objects should contain content that makes sense without color and is accessible to users who are color blind."}},"objectInterfaceIsAccessible":{"selector":"object","tags":["objects","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Interfaces within objects must be accessible"},"description":{"en":"Object content should be assessed for accessibility."}},"objectLinkToMultimediaHasTextTranscript":{"selector":"object","tags":["objects","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Objects which reference multimedia files should also provide a link to a transcript"},"description":{"en":"If an object contains a video, a link to the transcript should be provided near the object."}},"objectMustContainText":{"components":["placeholder"],"content":true,"empty":true,"selector":"object","tags":["objects","content"],"testability":1,"type":"placeholder","guidelines":{"wcag":{"1.1.1":{"techniques":["FLASH1","H27"]}}},"title":{"en":"Objects must contain their text equivalents"},"description":{"en":"All object elements should contain a text equivalent if the object cannot be rendered."}},"objectMustHaveEmbed":{"selector":"object:not(object:has(embed))","tags":["objects","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Every object should contain an \"embed\" element"},"description":{"en":"Every object element must also contain an embed element."}},"objectMustHaveTitle":{"selector":"object:not(object[title])","tags":["objects","content"],"testability":1,"type":"selector","guidelines":{"wcag":{"1.1.1":{"techniques":["H27"]}}},"title":{"en":"Objects should have a title attribute"},"description":{"en":"All object elements should contain a \"title\" attribute."}},"objectMustHaveValidTitle":{"attribute":"title","components":["placeholder"],"empty":true,"selector":"object","tags":["objects","content"],"testability":1,"type":"placeholder","guidelines":[],"title":{"en":"Objects must not have an empty title attribute"},"description":{"en":"All object elements should have a \"title\" attribute which is not empty."}},"objectProvidesMechanismToReturnToParent":{"selector":"object","tags":["objects","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"All objects should provide a way for keyboard users to escape"},"description":{"en":"Ensure that a user who has only a keyboard as an input device can escape a object element. This requires manual confirmation."}},"objectShouldHaveLongDescription":{"selector":"object","tags":["objects","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"An object might require a long description"},"description":{"en":"Objects might require a long description, especially if their content is complicated."}},"objectTextUpdatesWhenObjectChanges":{"selector":"object","tags":["objects","content"],"testability":0,"type":"selector","guidelines":{"508":["a"]},"title":{"en":"The text equivalents of an object should update if the object changes"},"description":{"en":"If an object changes, the text equivalent of that object should also change."}},"objectUIMustBeAccessible":{"selector":"object","tags":["objects","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Content within an \"object\" element should be usable with objects disabled"},"description":{"en":"Objects who's content changes using java, ActiveX, or other similar technologies, should have their default text change when the object's content changes."}},"objectWithClassIDHasNoText":{"selector":"object[classid]:not(object[classid]:empty)","tags":["objects","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Objects with \"classid\" attributes should change their text if the content of the object changes"},"description":{"en":"Objects who's content changes using java, ActiveX, or other similar technologies, should have their default text change when the object's content changes."}},"pNotUsedAsHeader":{"callback":"pNotUsedAsHeader","tags":["header","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["G141","H42"]},"2.4.10":{"techniques":["G141"]}}},"title":{"en":"Paragraphs must not be used for headers"},"description":{"en":"Headers like h1. h6 are extremely useful for non-sighted users to navigate the structure of the page, and formatting a paragraph to just be big or bold, while it might visually look like a header, does not make it one."}},"paragarphIsWrittenClearly":{"callback":"paragarphIsWrittenClearly","components":["textStatistics"],"tags":["language","content"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"3.1.5":{"techniques":["G86"]}}}},"passwordHasLabel":{"components":["label"],"selector":"input[type=password]","tags":["form","content"],"testability":1,"type":"label","guidelines":{"508":["n"],"wcag":{"1.1.1":{"techniques":["H44"]},"1.3.1":{"techniques":["H44","F68"]},"3.3.2":{"techniques":["H44"]},"4.1.2":{"techniques":["H44"]}}},"title":{"en":"All password input elements should have a corresponding label"},"description":{"en":"All input elements with a type of \"password\"should have a corresponding label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user"}},"passwordLabelIsNearby":{"components":["labelProximity"],"selector":"input[type=password]","tags":["form","content"],"testability":0.5,"type":"labelProximity","guidelines":[],"title":{"en":"All \"password\" input elements have a label that is close"},"description":{"en":"All input elements of type \"password\" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away."}},"preShouldNotBeUsedForTabularLayout":{"callback":"preShouldNotBeUsedForTabularLayout","tags":["table","content"],"testability":0,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["F33","F34","F48"]},"1.3.2":{"techniques":["F33","F34"]}}},"title":{"en":"Pre\" elements should not be used for tabular data"},"description":{"en":"If a pre element is used for tabular data, change the data to use a well-formed table."}},"radioHasLabel":{"components":["label"],"selector":"input[type=radio]","tags":["form","content"],"testability":1,"type":"label","guidelines":{"508":["n"],"wcag":{"1.1.1":{"techniques":["H44"]},"1.3.1":{"techniques":["H44","F68"]},"3.3.2":{"techniques":["H44"]},"4.1.2":{"techniques":["H44"]}}},"title":{"en":"All \"radio\" input elements have a corresponding label"},"description":{"en":"All input elements of type \"radio\" should have a corresponding label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user"}},"radioLabelIsNearby":{"components":["labelProximity"],"selector":"input[type=radio]","tags":["form","content"],"testability":0.5,"type":"labelProximity","guidelines":[],"title":{"en":"All \"radio\" input elements have a label that is close"},"description":{"en":"All input elements of type \"radio\" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away."}},"radioMarkedWithFieldgroupAndLegend":{"selector":"input[type=radio]:not(fieldset input[type=radio])","tags":["form","content"],"testability":1,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["H71"]},"3.3.2":{"techniques":["H71"]}}},"title":{"en":"All radio button groups are marked using fieldset and legend elements."},"description":{"en":"form element content must contain both fieldset and legend elements if there are related radio buttons."}},"scriptContentAccessibleWithScriptsTurnedOff":{"selector":"script","tags":["javascript"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Content on the page should still be available if scripts are disabled"},"description":{"en":"All scripts should be assessed to see if, when the user is browing with scrips turned off, the page content is still available."}},"scriptInBodyMustHaveNoscript":{"selector":"html:not(html:has(noscript)):has(script) body","tags":["javascript"],"testability":0.5,"type":"selector","guidelines":{"508":["l"]},"title":{"en":"Scripts should have a corresponding \"noscript\" element"},"description":{"en":"Scripts should be followed by a noscripts element to guide the user to content in an alternative way."}},"scriptOnclickRequiresOnKeypress":{"components":["event","hasEventListener"],"correspondingEvent":"onkeypress","searchEvent":"onclick","tags":["javascript"],"testability":1,"type":"event","guidelines":{"508":["l"],"wcag":{"2.1.1":{"techniques":["G90","SCR2"]},"2.1.3":{"techniques":["G90"]}}},"title":{"en":"If an element has an \"onclick\" attribute"},"description":{"en":"it should also have an \"onkeypress\" attribute"}},"scriptOndblclickRequiresOnKeypress":{"components":["event","hasEventListener"],"correspondingEvent":"onkeypress","searchEvent":"ondblclick","tags":["javascript"],"testability":1,"type":"event","guidelines":{"508":["l"],"wcag":{"2.1.1":{"techniques":["G90","SCR2"]},"2.1.3":{"techniques":["G90"]}}},"title":{"en":"Any element with an \"ondblclick\" attribute shoul have a keyboard-related action as well"},"description":{"en":"If an element has an \"ondblclick\" attribute"}},"scriptOnmousedownRequiresOnKeypress":{"components":["event","hasEventListener"],"correspondingEvent":"onkeydown","searchEvent":"onmousedown","tags":["javascript"],"testability":1,"type":"event","guidelines":{"508":["l"],"wcag":{"2.1.1":{"techniques":["G90","SCR2"]},"2.1.3":{"techniques":["G90"]}}},"title":{"en":"If an element has a \"mousedown\" attribute"},"description":{"en":"it should also have an \"onkeydown\" attribute"}},"scriptOnmousemove":{"components":["event","hasEventListener"],"correspondingEvent":"onkeypress","searchEvent":"onmousemove","tags":["javascript"],"testability":1,"type":"event","guidelines":{"508":["l"],"wcag":{"2.1.1":{"techniques":["SCR2"]}}},"title":{"en":"Any element with an \"onmousemove\" attribute shoul have a keyboard-related action as well"},"description":{"en":"If an element has an \"onmousemove\" attribute"}},"scriptOnmouseoutHasOnmouseblur":{"components":["event","hasEventListener"],"correspondingEvent":"onblur","searchEvent":"onmouseout","tags":["javascript"],"testability":1,"type":"event","guidelines":{"508":["l"],"wcag":{"2.1.1":{"techniques":["SCR2"]}}},"title":{"en":"If an element has a \"onmouseout\" attribute"},"description":{"en":"it should also have an \"onblur\" attribute"}},"scriptOnmouseoverHasOnfocus":{"components":["event","hasEventListener"],"correspondingEvent":"onfocus","searchEvent":"onmouseover","tags":["javascript"],"testability":1,"type":"event","guidelines":{"508":["l"],"wcag":{"2.1.1":{"techniques":["SCR2"]}}},"title":{"en":"If an element has an \"onmouseover\" attribute"},"description":{"en":"it should also have an \"onfocus\" attribute"}},"scriptOnmouseupHasOnkeyup":{"components":["event","hasEventListener"],"correspondingEvent":"onkeyup","searchEvent":"onmouseup","tags":["javascript"],"testability":1,"type":"event","guidelines":{"508":["l"],"wcag":{"2.1.1":{"techniques":["G90"]},"2.1.3":{"techniques":["G90"]}}},"title":{"en":"If an element has an \"onmouseup\" attribute"},"description":{"en":"it should also have an \"onkeyup\" attribute"}},"scriptUIMustBeAccessible":{"selector":"script","tags":["javascript"],"testability":0,"type":"selector","guidelines":{"508":["l"]},"title":{"en":"The user interface for scripts should be accessible"},"description":{"en":"All scripts should be assessed to see if their interface is accessible."}},"scriptsDoNotFlicker":{"selector":"script","tags":["javascript"],"testability":0,"type":"selector","guidelines":{"508":["j"],"wcag":{"2.2.2":{"techniques":["F7"]}}},"title":{"en":"Scripts should not cause the screen to flicker"},"description":{"en":"All scripts should be assessed to see if their interface does not flicker."}},"scriptsDoNotUseColorAlone":{"selector":"script","tags":["javascript","color"],"testability":0,"type":"selector","guidelines":{"508":["c"]},"title":{"en":"The interface in scripts should not use color alone"},"description":{"en":"All scripts should be assessed to see if their interface does not have an interface which requires distinguishing beteween colors alone."}},"selectDoesNotChangeContext":{"components":["event","hasEventListener"],"searchEvent":"onchange","selector":"select","tags":["form","content"],"testability":1,"type":"event","guidelines":[],"title":{"en":"Select\" elemetns must not contain an \"onchange\" attribute"},"description":{"en":"Actions like \"onchange\" can take control away from users who are trying to navigate the page. Using an \"onchange\" attribute for things like select-list menus should instead be replaced with a drop-down and a button which initiates the action."}},"selectHasAssociatedLabel":{"components":["label"],"selector":"select","tags":["form","content"],"testability":1,"type":"label","guidelines":{"wcag":{"1.1.1":{"techniques":["H44"]},"1.3.1":{"techniques":["H44","F68"]},"3.3.2":{"techniques":["H44"]},"4.1.2":{"techniques":["H44"]}}},"title":{"en":"All select elements have an explicitly associated label."},"description":{"en":"All select elements should have a corresponding label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user"}},"selectJumpMenu":{"callback":"selectJumpMenu","components":["hasEventListener"],"tags":["form","content"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"3.2.2":{"techniques":["F37"]},"3.2.5":{"techniques":["F9"]}}},"title":{"en":"Select jump menus should jump on button press, not on state change"},"description":{"en":"If you wish to use a 'Jump' menu with a select item that then redirects users to another page, the jump should occur on the user pressing a button, rather than on the change event of that select eleemnt."}},"selectWithOptionsHasOptgroup":{"selector":"select:not(select:has(optgroup)) option:nth-child(5)","tags":["form","content"],"testability":0.5,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["H85"]}}},"title":{"en":"Form select elements should use optgroups for long selections"},"description":{"en":".. code-block:: html"}},"siteMap":{"callback":"siteMap","strings":"siteMap","tags":["document"],"testability":0,"type":"custom","guidelines":{"wcag":{"2.4.5":{"techniques":["G63"]},"2.4.8":{"techniques":["G63"]}}},"title":{"en":"Websites must have a site map"},"description":{"en":"Every web site should have a page which provides a site map or another method to navigate most of the site from a single page to save time for users of assistive devices."}},"skipToContentLinkProvided":{"selector":"body:not(body:has(a:first[href^=#]))","tags":["document"],"testability":0.5,"type":"selector","guidelines":{"508":["o"],"wcag":{"2.4.1":{"techniques":["G1"]}}},"title":{"en":"A \"skip to content\" link should exist as one of the first links on the page"},"description":{"en":"A link reading \"skip to content"}},"svgContainsTitle":{"selector":"svg:not(svg:has(title))","tags":["image","svg","content"],"testability":1,"type":"selector","guidelines":{"wcag":{"1.1.1":{"techniques":["F65"]}}},"title":{"en":"Inline SVG should use Title elements"},"description":{"en":"Any inline SVG image should have an embedded title element"}},"tabIndexFollowsLogicalOrder":{"callback":"tabIndexFollowsLogicalOrder","tags":["document"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"2.4.3":{"techniques":["H4"]}}},"title":{"en":"The tab order of a document is logical"},"description":{"en":"Check that the tab-order of a page is logical."}},"tableCaptionIdentifiesTable":{"selector":"caption","tags":["table","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["H39"]}}},"title":{"en":"Captions should identify their table"},"description":{"en":"Check to make sure that a table's caption identifies the table with a name, figure number, etc."}},"tableComplexHasSummary":{"selector":"table:not(table[summary], table:has(caption))","tags":["table","content"],"testability":0.5,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["H39"]}}},"title":{"en":"Complex tables should have a summary"},"description":{"en":"If a table is complex (for example, has some cells with \"colspan\" attributes"}},"tableDataShouldHaveTh":{"selector":"table:not(table:has(th))","tags":["table","content"],"testability":1,"type":"selector","guidelines":{"508":["g"],"wcag":{"1.3.1":{"techniques":["F91"]}}},"title":{"en":"Data tables should contain \"th\" elements"},"description":{"en":"Tables which contain data (as opposed to layout tables) should contain th elements to mark headers for screen readers and enhance the structure of the document."}},"tableHeaderLabelMustBeTerse":{"callback":"tableHeaderLabelMustBeTerse","tags":["table","content"],"testability":0.5,"type":"custom","guidelines":[],"title":{"en":"Table header lables must be terse"},"description":{"en":"The \"abbr\" attribute for table headers must be terse (less than 20 characters long)."}},"tableIsGrouped":{"selector":"table:not(table:has(thead), table:has(tfoot))","tags":["table","content"],"testability":0.5,"type":"selector","guidelines":[],"title":{"en":"Mark up the areas of tables using thead and tbody"},"description":{"en":""}},"tableLayoutDataShouldNotHaveTh":{"callback":"tableLayoutDataShouldNotHaveTh","tags":["table","layout","content"],"testability":0,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["F46"]}}},"title":{"en":"Layout tables should not contain \"th\" elements"},"description":{"en":"Tables which are used purely for layout (as opposed to data tables), should not contain th elements, which would make the table appear to be a data table."}},"tableLayoutHasNoCaption":{"callback":"tableLayoutHasNoCaption","tags":["table","layout","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["F46"]}}},"title":{"en":"All tables used for layout have no \"caption\" element"},"description":{"en":"If a table contains no data, and is used simply for layout, then it should not contain a caption element."}},"tableLayoutHasNoSummary":{"callback":"tableLayoutHasNoSummary","tags":["table","layout","content"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["F46"]}}},"title":{"en":"All tables used for layout have no summary or an empty summary"},"description":{"en":"If a table contains no data, and is used simply for layout, then it should not have a \"summary\" attribute"}},"tableLayoutMakesSenseLinearized":{"callback":"tableLayoutMakesSenseLinearized","tags":["table","layout","content"],"testability":0,"type":"custom","guidelines":[],"title":{"en":"All tables used for layout should make sense when removed"},"description":{"en":"If a table element is used for layout purposes only, then the content of the table should make sense if the table is linearized."}},"tableNotUsedForLayout":{"callback":"tableNotUsedForLayout","tags":["table","layout"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"1.3.2":{"techniques":["F49"]}}}},"tableSummaryDescribesTable":{"selector":"table[summary]","tags":["table","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Table summaries should describe the navigation and structure of the table"},"description":{"en":"Table summary elements should describe the navigation tools and structure of the table, as well as provide an overview of what the table describes."}},"tableSummaryDoesNotDuplicateCaption":{"callback":"tableSummaryDoesNotDuplicateCaption","tags":["table","content"],"testability":1,"type":"custom","guidelines":[],"title":{"en":"Table \"summary\" elements should not duplicate the \"caption\" element"},"description":{"en":"The summary and the caption must be different, as both provide different information. A caption. /code element identifies the table., while the \"summary\" attribute describes the table contents."}},"tableSummaryIsEmpty":{"attribute":"summary","components":["placeholder"],"empty":true,"selector":"table[summary]","tags":["table","content"],"testability":0.5,"type":"placeholder","guidelines":[],"title":{"en":"All data tables should have a summary"},"description":{"en":"If a table contains data, it should have a \"summary\" attribute."}},"tableSummaryIsNotTooLong":{"callback":"tableSummaryIsNotTooLong","tags":["table","content"],"testability":0,"type":"custom","guidelines":[]},"tableSummaryIsSufficient":{"selector":"table[summary]","tags":["table","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"All data tables should have an adequate summary"},"description":{"en":"If a table contains data, it should have a \"summary\" attribute that completely communicates the function and use of the table."}},"tableUseColGroup":{"callback":"tableUseColGroup","tags":["table","content"],"testability":0,"type":"custom","guidelines":[],"title":{"en":"Group columns using \"colgroup\" or \"col\" elements"},"description":{"en":"To help complex table headers make sense, use colgroup or col to group them together."}},"tableUsesAbbreviationForHeader":{"callback":"tableUsesAbbreviationForHeader","tags":["table","content"],"testability":0,"type":"custom","guidelines":[],"title":{"en":"Table headers over 20 characters should provide an \"abbr\" attribute"},"description":{"en":"For long table headers, use an \"abbr\" attribute that is less than short (less than 20 characters long)."}},"tableUsesCaption":{"selector":"table:not(table:has(caption))","tags":["table","content"],"testability":1,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["H39"]}}},"title":{"en":"Data tables should contain a \"caption\" element if not described elsewhere"},"description":{"en":"Unless otherwise described in the document, tables should contain caption elements to describe the purpose of the table."}},"tableUsesScopeForRow":{"callback":"tableUsesScopeForRow","tags":["table","content"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["H63"]}}},"title":{"en":"Data tables should use scoped headers for rows with headers"},"description":{"en":"Where there are table headers for both rows and columns, use the \"scope\" attribute to help relate those headers with their appropriate cells. This test looks for the first and last cells in each row and sees if they differ in layout or font weight."}},"tableWithBothHeadersUseScope":{"selector":"table:has(tr:not(table tr:first) th:not(th[scope]))","tags":["table","content"],"testability":0.5,"type":"selector","guidelines":{"508":["h"],"wcag":{"1.3.1":{"techniques":["F91"]}}},"title":{"en":"Data tables with multiple headers should use the \"scope\" attribute"},"description":{"en":"Where there are table headers for both rows and columns, use the \"scope\" attribute to help relate those headers with their appropriate cells."}},"tableWithMoreHeadersUseID":{"callback":"tableWithMoreHeadersUseID","tags":["table","content"],"testability":0.5,"type":"custom","guidelines":[],"title":{"en":"Complex data tables should provide \"id\" attributes to headers"},"description":{"en":"and \"headers\" attributes for data cells"}},"tabularDataIsInTable":{"callback":"tabularDataIsInTable","tags":["table","content"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["F33","F34","F48"]},"1.3.2":{"techniques":["F33","F34"]}}},"title":{"en":"All tabular information should use a table"},"description":{"en":"Tables should be used when displaying tabular information."}},"textIsNotSmall":{"callback":"textIsNotSmall","components":["convertToPx"],"tags":["textsize","content"],"testability":0.5,"type":"custom","guidelines":[],"title":{"en":"The text size is not less than 9 pixels high"},"description":{"en":"To help users with difficulty reading small text, ensure text size is no less than 9 pixels high."}},"textareaHasAssociatedLabel":{"components":["label"],"selector":"textarea","tags":["form","content"],"testability":1,"type":"label","guidelines":{"wcag":{"1.1.1":{"techniques":["H44"]},"1.3.1":{"techniques":["H44","F68"]},"3.3.2":{"techniques":["H44"]},"4.1.2":{"techniques":["H44"]}}},"title":{"en":"All textareas should have a corresponding label"},"description":{"en":"All textarea elements should have a corresponding label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user"}},"textareaLabelPositionedClose":{"components":["labelProximity"],"selector":"textarea","tags":["form","content"],"testability":0.5,"type":"labelProximity","guidelines":[],"title":{"en":"All textareas should have a label that is close to it"},"description":{"en":"All textarea elements should have a corresponding label element that is close in proximity.."}},"videoProvidesCaptions":{"selector":"video","tags":["media","content"],"testability":0.5,"type":"selector","guidelines":{"508":["b","b"],"wcag":{"1.2.2":{"techniques":["G87"]},"1.2.4":{"techniques":["G87"]}}},"title":{"en":"All video tags must provide captions"},"description":{"en":"All HTML5 video tags must provide captions."}},"videosEmbeddedOrLinkedNeedCaptions":{"callback":"videosEmbeddedOrLinkedNeedCaptions","components":["video"],"tags":["media","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"1.2.2":{"techniques":["G87"]},"1.2.4":{"techniques":["G87"]}}},"title":{"en":"All linked or embedded videos need captions"},"description":{"en":"Any video hosted or otherwise which is linked or embedded must have a caption."}}} \ No newline at end of file diff --git a/docs/building.rst b/docs/building.rst new file mode 100644 index 000000000..360105678 --- /dev/null +++ b/docs/building.rst @@ -0,0 +1,14 @@ +Building QUAIL +============== + +For most purposes, you can simply `download the latest release of Quail `_, which is pre-built. However, if you want to customize your build or use the `dev` branch of the project, you will need to use the following tools to build the project. + +Quail is built using `Grunt `_ and `Bower `_, and hence requires having `Node.js `_ installed on your machine. Once you check out the code, follow the below commands: + +``` +cd quail +npm install +grunt build +``` + +This will install all the developer dependencies and create a new `dist` directory with a pre-built version of quail and all the guideline or test files exported to JSON format. \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index 1e24d3f3e..73daca37f 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,7 +1,4 @@ -.. QUAIL: Accessibility Information Library documentation master file, created by - sphinx-quickstart on Wed Apr 11 20:34:30 2012. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. +.. QUAIL: Accessibility Information Library documentation master file QUAIL: Accessibility Information Library ======================================== @@ -11,23 +8,42 @@ QUAIL is a jQuery and Sizzle-comptable library for checking content against acce Tests ----- -At the core of QUAIL are **tests**. Tests search for a single type of accessibility problem, and they are all defined in the file `src/resources/tests.json`. For example, one of the most common accessibility problems out there is an image missing an `alt` attribute (which allows users with screen readers to hear a description of the image). The test definition in the `tests.json` file looks like this: +At the core of QUAIL are **tests**. Tests search for a single type of accessibility problem, and they are all defined in the file `src/resources/tests.yaml` (a JSON version is available in `dist/tests.json` - `read more about building these files `_). For example, one of the most common accessibility problems out there is an image missing an `alt` attribute (which allows users with screen readers to hear a description of the image). The test definition in the `tests.yaml` file looks like this: .. code-block:: js - "imgHasAlt": { - "type": "selector", - "selector": "img:not(img[alt])", - "severity": "severe" - }, + imgHasAlt: + selector: "img:not(img[alt])" + tags: + - "image" + - "content" + testability: 1 + type: "selector" + guidelines: + 508: + - "a" + wcag: + 1.1.1: + techniques: + - "F65" + - "H37" + title: + en: "Image elements must have an \"alt\" attribute" + description: + en: "All img elements must have an alt attribute" .... The **test name** in this example is "imgHasAlt," which is the unique label for the test. These are used in creating guidelines. There are at least two definitions for each test: - - **Type** - QUAIL has some default test types to simplify the process of writing test definitions. The simplest is a *selector*, which just takes a jQuery/Sizzle-compatable selector and finds all items that match that selector. For *selector* tests, we also must define the selector to use (in this case, `img:not(img[alt])`). - - **Severity** - The default severity level. Severity is a measure of how certain we are a test will not create false positives: - - **Severe** - We are 100% certain that this test is always correct. If an image is missing its `alt` attribute, it's missing its `alt` attribute. - - **Moderate** - We are mostly certain this test is correct. This is usually found for content-related tests, like testing to see if a block of text is written at or below a certain grade level. - - **Suggestion** - We cannot test for this, but can suggest things to manually review. For exmaple, we cannot test that content in a Flash object is accessible, but we can point out that a flash object is there and link to appropriate guidelines on making accessible flash. + - **type** - QUAIL has some default test types to simplify the process of writing test definitions. The simplest is a *selector*, which just takes a jQuery/Sizzle-compatable selector and finds all items that match that selector. For *selector* tests, we also must define the selector to use (in this case, `img:not(img[alt])`). + - **severity** - The default severity level. Severity is a measure of how certain we are a test will not create false positives: + - **severe** - We are 100% certain that this test is always correct. If an image is missing its `alt` attribute, it's missing its `alt` attribute. + - **moderate** - We are mostly certain this test is correct. This is usually found for content-related tests, like testing to see if a block of text is written at or below a certain grade level. + - **suggestion** - We cannot test for this, but can suggest things to manually review. For exmaple, we cannot test that content in a Flash object is accessible, but we can point out that a flash object is there and link to appropriate guidelines on making accessible flash. + - **guidelines** - A list of pre-defined guidelines (right now, either 508 or WCAG 2.0) including: + - **techinques** - The WCAG techniques aligned with this test + - **configuration** - Optional configuration options for this test only specific to this test. + - **title** - The human-readable title of the test, prefixed by language code. + - **description** - The human-readable description of the test, prefixed by language code. Guidelines ---------- diff --git a/examples/common/bootstrap.css b/examples/common/bootstrap.css deleted file mode 100644 index 9fa6f766f..000000000 --- a/examples/common/bootstrap.css +++ /dev/null @@ -1,5774 +0,0 @@ -/*! - * Bootstrap v2.1.1 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} - -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} - -audio:not([controls]) { - display: none; -} - -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -a:hover, -a:active { - outline: 0; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -img { - width: auto\9; - height: auto; - max-width: 100%; - vertical-align: middle; - border: 0; - -ms-interpolation-mode: bicubic; -} - -#map_canvas img { - max-width: none; -} - -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} - -button, -input { - *overflow: visible; - line-height: normal; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} - -button, -input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} - -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} - -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - line-height: 0; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -body { - margin: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 20px; - color: #333333; - background-color: #ffffff; -} - -a { - color: #0088cc; - text-decoration: none; -} - -a:hover { - color: #005580; - text-decoration: underline; -} - -.img-rounded { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.img-polaroid { - padding: 4px; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); -} - -.img-circle { - -webkit-border-radius: 500px; - -moz-border-radius: 500px; - border-radius: 500px; -} - -.row { - margin-left: -20px; - *zoom: 1; -} - -.row:before, -.row:after { - display: table; - line-height: 0; - content: ""; -} - -.row:after { - clear: both; -} - -[class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; -} - -.container, -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.span12 { - width: 940px; -} - -.span11 { - width: 860px; -} - -.span10 { - width: 780px; -} - -.span9 { - width: 700px; -} - -.span8 { - width: 620px; -} - -.span7 { - width: 540px; -} - -.span6 { - width: 460px; -} - -.span5 { - width: 380px; -} - -.span4 { - width: 300px; -} - -.span3 { - width: 220px; -} - -.span2 { - width: 140px; -} - -.span1 { - width: 60px; -} - -.offset12 { - margin-left: 980px; -} - -.offset11 { - margin-left: 900px; -} - -.offset10 { - margin-left: 820px; -} - -.offset9 { - margin-left: 740px; -} - -.offset8 { - margin-left: 660px; -} - -.offset7 { - margin-left: 580px; -} - -.offset6 { - margin-left: 500px; -} - -.offset5 { - margin-left: 420px; -} - -.offset4 { - margin-left: 340px; -} - -.offset3 { - margin-left: 260px; -} - -.offset2 { - margin-left: 180px; -} - -.offset1 { - margin-left: 100px; -} - -.row-fluid { - width: 100%; - *zoom: 1; -} - -.row-fluid:before, -.row-fluid:after { - display: table; - line-height: 0; - content: ""; -} - -.row-fluid:after { - clear: both; -} - -.row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.127659574468085%; - *margin-left: 2.074468085106383%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.row-fluid [class*="span"]:first-child { - margin-left: 0; -} - -.row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; -} - -.row-fluid .span11 { - width: 91.48936170212765%; - *width: 91.43617021276594%; -} - -.row-fluid .span10 { - width: 82.97872340425532%; - *width: 82.92553191489361%; -} - -.row-fluid .span9 { - width: 74.46808510638297%; - *width: 74.41489361702126%; -} - -.row-fluid .span8 { - width: 65.95744680851064%; - *width: 65.90425531914893%; -} - -.row-fluid .span7 { - width: 57.44680851063829%; - *width: 57.39361702127659%; -} - -.row-fluid .span6 { - width: 48.93617021276595%; - *width: 48.88297872340425%; -} - -.row-fluid .span5 { - width: 40.42553191489362%; - *width: 40.37234042553192%; -} - -.row-fluid .span4 { - width: 31.914893617021278%; - *width: 31.861702127659576%; -} - -.row-fluid .span3 { - width: 23.404255319148934%; - *width: 23.351063829787233%; -} - -.row-fluid .span2 { - width: 14.893617021276595%; - *width: 14.840425531914894%; -} - -.row-fluid .span1 { - width: 6.382978723404255%; - *width: 6.329787234042553%; -} - -.row-fluid .offset12 { - margin-left: 104.25531914893617%; - *margin-left: 104.14893617021275%; -} - -.row-fluid .offset12:first-child { - margin-left: 102.12765957446808%; - *margin-left: 102.02127659574467%; -} - -.row-fluid .offset11 { - margin-left: 95.74468085106382%; - *margin-left: 95.6382978723404%; -} - -.row-fluid .offset11:first-child { - margin-left: 93.61702127659574%; - *margin-left: 93.51063829787232%; -} - -.row-fluid .offset10 { - margin-left: 87.23404255319149%; - *margin-left: 87.12765957446807%; -} - -.row-fluid .offset10:first-child { - margin-left: 85.1063829787234%; - *margin-left: 84.99999999999999%; -} - -.row-fluid .offset9 { - margin-left: 78.72340425531914%; - *margin-left: 78.61702127659572%; -} - -.row-fluid .offset9:first-child { - margin-left: 76.59574468085106%; - *margin-left: 76.48936170212764%; -} - -.row-fluid .offset8 { - margin-left: 70.2127659574468%; - *margin-left: 70.10638297872339%; -} - -.row-fluid .offset8:first-child { - margin-left: 68.08510638297872%; - *margin-left: 67.9787234042553%; -} - -.row-fluid .offset7 { - margin-left: 61.70212765957446%; - *margin-left: 61.59574468085106%; -} - -.row-fluid .offset7:first-child { - margin-left: 59.574468085106375%; - *margin-left: 59.46808510638297%; -} - -.row-fluid .offset6 { - margin-left: 53.191489361702125%; - *margin-left: 53.085106382978715%; -} - -.row-fluid .offset6:first-child { - margin-left: 51.063829787234035%; - *margin-left: 50.95744680851063%; -} - -.row-fluid .offset5 { - margin-left: 44.68085106382979%; - *margin-left: 44.57446808510638%; -} - -.row-fluid .offset5:first-child { - margin-left: 42.5531914893617%; - *margin-left: 42.4468085106383%; -} - -.row-fluid .offset4 { - margin-left: 36.170212765957444%; - *margin-left: 36.06382978723405%; -} - -.row-fluid .offset4:first-child { - margin-left: 34.04255319148936%; - *margin-left: 33.93617021276596%; -} - -.row-fluid .offset3 { - margin-left: 27.659574468085104%; - *margin-left: 27.5531914893617%; -} - -.row-fluid .offset3:first-child { - margin-left: 25.53191489361702%; - *margin-left: 25.425531914893618%; -} - -.row-fluid .offset2 { - margin-left: 19.148936170212764%; - *margin-left: 19.04255319148936%; -} - -.row-fluid .offset2:first-child { - margin-left: 17.02127659574468%; - *margin-left: 16.914893617021278%; -} - -.row-fluid .offset1 { - margin-left: 10.638297872340425%; - *margin-left: 10.53191489361702%; -} - -.row-fluid .offset1:first-child { - margin-left: 8.51063829787234%; - *margin-left: 8.404255319148938%; -} - -[class*="span"].hide, -.row-fluid [class*="span"].hide { - display: none; -} - -[class*="span"].pull-right, -.row-fluid [class*="span"].pull-right { - float: right; -} - -.container { - margin-right: auto; - margin-left: auto; - *zoom: 1; -} - -.container:before, -.container:after { - display: table; - line-height: 0; - content: ""; -} - -.container:after { - clear: both; -} - -.container-fluid { - padding-right: 20px; - padding-left: 20px; - *zoom: 1; -} - -.container-fluid:before, -.container-fluid:after { - display: table; - line-height: 0; - content: ""; -} - -.container-fluid:after { - clear: both; -} - -p { - margin: 0 0 10px; -} - -.lead { - margin-bottom: 20px; - font-size: 21px; - font-weight: 200; - line-height: 30px; -} - -small { - font-size: 85%; -} - -strong { - font-weight: bold; -} - -em { - font-style: italic; -} - -cite { - font-style: normal; -} - -.muted { - color: #999999; -} - -.text-warning { - color: #c09853; -} - -.text-error { - color: #b94a48; -} - -.text-info { - color: #3a87ad; -} - -.text-success { - color: #468847; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 10px 0; - font-family: inherit; - font-weight: bold; - line-height: 1; - color: inherit; - text-rendering: optimizelegibility; -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - line-height: 1; - color: #999999; -} - -h1 { - font-size: 36px; - line-height: 40px; -} - -h2 { - font-size: 30px; - line-height: 40px; -} - -h3 { - font-size: 24px; - line-height: 40px; -} - -h4 { - font-size: 18px; - line-height: 20px; -} - -h5 { - font-size: 14px; - line-height: 20px; -} - -h6 { - font-size: 12px; - line-height: 20px; -} - -h1 small { - font-size: 24px; -} - -h2 small { - font-size: 18px; -} - -h3 small { - font-size: 14px; -} - -h4 small { - font-size: 14px; -} - -.page-header { - padding-bottom: 9px; - margin: 20px 0 30px; - border-bottom: 1px solid #eeeeee; -} - -ul, -ol { - padding: 0; - margin: 0 0 10px 25px; -} - -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} - -li { - line-height: 20px; -} - -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} - -dl { - margin-bottom: 20px; -} - -dt, -dd { - line-height: 20px; -} - -dt { - font-weight: bold; -} - -dd { - margin-left: 10px; -} - -.dl-horizontal { - *zoom: 1; -} - -.dl-horizontal:before, -.dl-horizontal:after { - display: table; - line-height: 0; - content: ""; -} - -.dl-horizontal:after { - clear: both; -} - -.dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; -} - -.dl-horizontal dd { - margin-left: 180px; -} - -hr { - margin: 20px 0; - border: 0; - border-top: 1px solid #eeeeee; - border-bottom: 1px solid #ffffff; -} - -abbr[title] { - cursor: help; - border-bottom: 1px dotted #999999; -} - -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} - -blockquote { - padding: 0 0 0 15px; - margin: 0 0 20px; - border-left: 5px solid #eeeeee; -} - -blockquote p { - margin-bottom: 0; - font-size: 16px; - font-weight: 300; - line-height: 25px; -} - -blockquote small { - display: block; - line-height: 20px; - color: #999999; -} - -blockquote small:before { - content: '\2014 \00A0'; -} - -blockquote.pull-right { - float: right; - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; -} - -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} - -blockquote.pull-right small:before { - content: ''; -} - -blockquote.pull-right small:after { - content: '\00A0 \2014'; -} - -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} - -address { - display: block; - margin-bottom: 20px; - font-style: normal; - line-height: 20px; -} - -code, -pre { - padding: 0 3px 2px; - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; - font-size: 12px; - color: #333333; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -code { - padding: 2px 4px; - color: #d14; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; -} - -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 20px; - word-break: break-all; - word-wrap: break-word; - white-space: pre; - white-space: pre-wrap; - background-color: #f5f5f5; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -pre.prettyprint { - margin-bottom: 20px; -} - -pre code { - padding: 0; - color: inherit; - background-color: transparent; - border: 0; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -form { - margin: 0 0 20px; -} - -fieldset { - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: 40px; - color: #333333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} - -legend small { - font-size: 15px; - color: #999999; -} - -label, -input, -button, -select, -textarea { - font-size: 14px; - font-weight: normal; - line-height: 20px; -} - -input, -button, -select, -textarea { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} - -label { - display: block; - margin-bottom: 5px; -} - -select, -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - display: inline-block; - height: 20px; - padding: 4px 6px; - margin-bottom: 9px; - font-size: 14px; - line-height: 20px; - color: #555555; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -input, -textarea, -.uneditable-input { - width: 206px; -} - -textarea { - height: auto; -} - -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - background-color: #ffffff; - border: 1px solid #cccccc; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; -} - -textarea:focus, -input[type="text"]:focus, -input[type="password"]:focus, -input[type="datetime"]:focus, -input[type="datetime-local"]:focus, -input[type="date"]:focus, -input[type="month"]:focus, -input[type="time"]:focus, -input[type="week"]:focus, -input[type="number"]:focus, -input[type="email"]:focus, -input[type="url"]:focus, -input[type="search"]:focus, -input[type="tel"]:focus, -input[type="color"]:focus, -.uneditable-input:focus { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); -} - -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - *margin-top: 0; - line-height: normal; - cursor: pointer; -} - -input[type="file"], -input[type="image"], -input[type="submit"], -input[type="reset"], -input[type="button"], -input[type="radio"], -input[type="checkbox"] { - width: auto; -} - -select, -input[type="file"] { - height: 30px; - /* In IE7, the height of the select element cannot be changed by height, only font-size */ - - *margin-top: 4px; - /* For IE7, add top margin to align select with labels */ - - line-height: 30px; -} - -select { - width: 220px; - background-color: #ffffff; - border: 1px solid #cccccc; -} - -select[multiple], -select[size] { - height: auto; -} - -select:focus, -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.uneditable-input, -.uneditable-textarea { - color: #999999; - cursor: not-allowed; - background-color: #fcfcfc; - border-color: #cccccc; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); -} - -.uneditable-input { - overflow: hidden; - white-space: nowrap; -} - -.uneditable-textarea { - width: auto; - height: auto; -} - -input:-moz-placeholder, -textarea:-moz-placeholder { - color: #999999; -} - -input:-ms-input-placeholder, -textarea:-ms-input-placeholder { - color: #999999; -} - -input::-webkit-input-placeholder, -textarea::-webkit-input-placeholder { - color: #999999; -} - -.radio, -.checkbox { - min-height: 18px; - padding-left: 18px; -} - -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -18px; -} - -.controls > .radio:first-child, -.controls > .checkbox:first-child { - padding-top: 5px; -} - -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} - -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} - -.input-mini { - width: 60px; -} - -.input-small { - width: 90px; -} - -.input-medium { - width: 150px; -} - -.input-large { - width: 210px; -} - -.input-xlarge { - width: 270px; -} - -.input-xxlarge { - width: 530px; -} - -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"] { - float: none; - margin-left: 0; -} - -.input-append input[class*="span"], -.input-append .uneditable-input[class*="span"], -.input-prepend input[class*="span"], -.input-prepend .uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"], -.row-fluid .input-prepend [class*="span"], -.row-fluid .input-append [class*="span"] { - display: inline-block; -} - -input, -textarea, -.uneditable-input { - margin-left: 0; -} - -.controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; -} - -input.span12, -textarea.span12, -.uneditable-input.span12 { - width: 926px; -} - -input.span11, -textarea.span11, -.uneditable-input.span11 { - width: 846px; -} - -input.span10, -textarea.span10, -.uneditable-input.span10 { - width: 766px; -} - -input.span9, -textarea.span9, -.uneditable-input.span9 { - width: 686px; -} - -input.span8, -textarea.span8, -.uneditable-input.span8 { - width: 606px; -} - -input.span7, -textarea.span7, -.uneditable-input.span7 { - width: 526px; -} - -input.span6, -textarea.span6, -.uneditable-input.span6 { - width: 446px; -} - -input.span5, -textarea.span5, -.uneditable-input.span5 { - width: 366px; -} - -input.span4, -textarea.span4, -.uneditable-input.span4 { - width: 286px; -} - -input.span3, -textarea.span3, -.uneditable-input.span3 { - width: 206px; -} - -input.span2, -textarea.span2, -.uneditable-input.span2 { - width: 126px; -} - -input.span1, -textarea.span1, -.uneditable-input.span1 { - width: 46px; -} - -.controls-row { - *zoom: 1; -} - -.controls-row:before, -.controls-row:after { - display: table; - line-height: 0; - content: ""; -} - -.controls-row:after { - clear: both; -} - -.controls-row [class*="span"] { - float: left; -} - -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - cursor: not-allowed; - background-color: #eeeeee; -} - -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"][readonly], -input[type="checkbox"][readonly] { - background-color: transparent; -} - -.control-group.warning > label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #c09853; -} - -.control-group.warning .checkbox, -.control-group.warning .radio, -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - color: #c09853; -} - -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - border-color: #c09853; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; -} - -.control-group.warning .input-prepend .add-on, -.control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} - -.control-group.error > label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #b94a48; -} - -.control-group.error .checkbox, -.control-group.error .radio, -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - color: #b94a48; -} - -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - border-color: #b94a48; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #953b39; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; -} - -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - color: #b94a48; - background-color: #f2dede; - border-color: #b94a48; -} - -.control-group.success > label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #468847; -} - -.control-group.success .checkbox, -.control-group.success .radio, -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - color: #468847; -} - -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - border-color: #468847; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; -} - -.control-group.success .input-prepend .add-on, -.control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} - -.control-group.info > label, -.control-group.info .help-block, -.control-group.info .help-inline { - color: #3a87ad; -} - -.control-group.info .checkbox, -.control-group.info .radio, -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - color: #3a87ad; -} - -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - border-color: #3a87ad; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.info input:focus, -.control-group.info select:focus, -.control-group.info textarea:focus { - border-color: #2d6987; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; -} - -.control-group.info .input-prepend .add-on, -.control-group.info .input-append .add-on { - color: #3a87ad; - background-color: #d9edf7; - border-color: #3a87ad; -} - -input:focus:required:invalid, -textarea:focus:required:invalid, -select:focus:required:invalid { - color: #b94a48; - border-color: #ee5f5b; -} - -input:focus:required:invalid:focus, -textarea:focus:required:invalid:focus, -select:focus:required:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} - -.form-actions { - padding: 19px 20px 20px; - margin-top: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-top: 1px solid #e5e5e5; - *zoom: 1; -} - -.form-actions:before, -.form-actions:after { - display: table; - line-height: 0; - content: ""; -} - -.form-actions:after { - clear: both; -} - -.help-block, -.help-inline { - color: #595959; -} - -.help-block { - display: block; - margin-bottom: 10px; -} - -.help-inline { - display: inline-block; - *display: inline; - padding-left: 5px; - vertical-align: middle; - *zoom: 1; -} - -.input-append, -.input-prepend { - margin-bottom: 5px; - font-size: 0; - white-space: nowrap; -} - -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input { - position: relative; - margin-bottom: 0; - *margin-left: 0; - font-size: 14px; - vertical-align: top; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} - -.input-append input:focus, -.input-prepend input:focus, -.input-append select:focus, -.input-prepend select:focus, -.input-append .uneditable-input:focus, -.input-prepend .uneditable-input:focus { - z-index: 2; -} - -.input-append .add-on, -.input-prepend .add-on { - display: inline-block; - width: auto; - height: 20px; - min-width: 16px; - padding: 4px 5px; - font-size: 14px; - font-weight: normal; - line-height: 20px; - text-align: center; - text-shadow: 0 1px 0 #ffffff; - background-color: #eeeeee; - border: 1px solid #ccc; -} - -.input-append .add-on, -.input-prepend .add-on, -.input-append .btn, -.input-prepend .btn { - vertical-align: top; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-append .active, -.input-prepend .active { - background-color: #a9dba9; - border-color: #46a546; -} - -.input-prepend .add-on, -.input-prepend .btn { - margin-right: -1px; -} - -.input-prepend .add-on:first-child, -.input-prepend .btn:first-child { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} - -.input-append input, -.input-append select, -.input-append .uneditable-input { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} - -.input-append .add-on, -.input-append .btn { - margin-left: -1px; -} - -.input-append .add-on:last-child, -.input-append .btn:last-child { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} - -.input-prepend.input-append input, -.input-prepend.input-append select, -.input-prepend.input-append .uneditable-input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-prepend.input-append .add-on:first-child, -.input-prepend.input-append .btn:first-child { - margin-right: -1px; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} - -.input-prepend.input-append .add-on:last-child, -.input-prepend.input-append .btn:last-child { - margin-left: -1px; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} - -input.search-query { - padding-right: 14px; - padding-right: 4px \9; - padding-left: 14px; - padding-left: 4px \9; - /* IE7-8 doesn't have border-radius, so don't indent the padding */ - - margin-bottom: 0; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -/* Allow for input prepend/append in search forms */ - -.form-search .input-append .search-query, -.form-search .input-prepend .search-query { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.form-search .input-append .search-query { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} - -.form-search .input-append .btn { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} - -.form-search .input-prepend .search-query { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} - -.form-search .input-prepend .btn { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} - -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input, -.form-search .input-prepend, -.form-inline .input-prepend, -.form-horizontal .input-prepend, -.form-search .input-append, -.form-inline .input-append, -.form-horizontal .input-append { - display: inline-block; - *display: inline; - margin-bottom: 0; - vertical-align: middle; - *zoom: 1; -} - -.form-search .hide, -.form-inline .hide, -.form-horizontal .hide { - display: none; -} - -.form-search label, -.form-inline label, -.form-search .btn-group, -.form-inline .btn-group { - display: inline-block; -} - -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - margin-bottom: 0; -} - -.form-search .radio, -.form-search .checkbox, -.form-inline .radio, -.form-inline .checkbox { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} - -.form-search .radio input[type="radio"], -.form-search .checkbox input[type="checkbox"], -.form-inline .radio input[type="radio"], -.form-inline .checkbox input[type="checkbox"] { - float: left; - margin-right: 3px; - margin-left: 0; -} - -.control-group { - margin-bottom: 10px; -} - -legend + .control-group { - margin-top: 20px; - -webkit-margin-top-collapse: separate; -} - -.form-horizontal .control-group { - margin-bottom: 20px; - *zoom: 1; -} - -.form-horizontal .control-group:before, -.form-horizontal .control-group:after { - display: table; - line-height: 0; - content: ""; -} - -.form-horizontal .control-group:after { - clear: both; -} - -.form-horizontal .control-label { - float: left; - width: 160px; - padding-top: 5px; - text-align: right; -} - -.form-horizontal .controls { - *display: inline-block; - *padding-left: 20px; - margin-left: 180px; - *margin-left: 0; -} - -.form-horizontal .controls:first-child { - *padding-left: 180px; -} - -.form-horizontal .help-block { - margin-bottom: 0; -} - -.form-horizontal input + .help-block, -.form-horizontal select + .help-block, -.form-horizontal textarea + .help-block { - margin-top: 10px; -} - -.form-horizontal .form-actions { - padding-left: 180px; -} - -table { - max-width: 100%; - background-color: transparent; - border-collapse: collapse; - border-spacing: 0; -} - -.table { - width: 100%; - margin-bottom: 20px; -} - -.table th, -.table td { - padding: 8px; - line-height: 20px; - text-align: left; - vertical-align: top; - border-top: 1px solid #dddddd; -} - -.table th { - font-weight: bold; -} - -.table thead th { - vertical-align: bottom; -} - -.table caption + thead tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child th, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child th, -.table thead:first-child tr:first-child td { - border-top: 0; -} - -.table tbody + tbody { - border-top: 2px solid #dddddd; -} - -.table-condensed th, -.table-condensed td { - padding: 4px 5px; -} - -.table-bordered { - border: 1px solid #dddddd; - border-collapse: separate; - *border-collapse: collapse; - border-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.table-bordered th, -.table-bordered td { - border-left: 1px solid #dddddd; -} - -.table-bordered caption + thead tr:first-child th, -.table-bordered caption + tbody tr:first-child th, -.table-bordered caption + tbody tr:first-child td, -.table-bordered colgroup + thead tr:first-child th, -.table-bordered colgroup + tbody tr:first-child th, -.table-bordered colgroup + tbody tr:first-child td, -.table-bordered thead:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} - -.table-bordered thead:first-child tr:first-child th:first-child, -.table-bordered tbody:first-child tr:first-child td:first-child { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-bordered thead:first-child tr:first-child th:last-child, -.table-bordered tbody:first-child tr:first-child td:last-child { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; -} - -.table-bordered thead:last-child tr:last-child th:first-child, -.table-bordered tbody:last-child tr:last-child td:first-child, -.table-bordered tfoot:last-child tr:last-child td:first-child { - -webkit-border-radius: 0 0 0 4px; - -moz-border-radius: 0 0 0 4px; - border-radius: 0 0 0 4px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; -} - -.table-bordered thead:last-child tr:last-child th:last-child, -.table-bordered tbody:last-child tr:last-child td:last-child, -.table-bordered tfoot:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; -} - -.table-bordered caption + thead tr:first-child th:first-child, -.table-bordered caption + tbody tr:first-child td:first-child, -.table-bordered colgroup + thead tr:first-child th:first-child, -.table-bordered colgroup + tbody tr:first-child td:first-child { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-bordered caption + thead tr:first-child th:last-child, -.table-bordered caption + tbody tr:first-child td:last-child, -.table-bordered colgroup + thead tr:first-child th:last-child, -.table-bordered colgroup + tbody tr:first-child td:last-child { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-striped tbody tr:nth-child(odd) td, -.table-striped tbody tr:nth-child(odd) th { - background-color: #f9f9f9; -} - -.table-hover tbody tr:hover td, -.table-hover tbody tr:hover th { - background-color: #f5f5f5; -} - -table [class*=span], -.row-fluid table [class*=span] { - display: table-cell; - float: none; - margin-left: 0; -} - -.table .span1 { - float: none; - width: 44px; - margin-left: 0; -} - -.table .span2 { - float: none; - width: 124px; - margin-left: 0; -} - -.table .span3 { - float: none; - width: 204px; - margin-left: 0; -} - -.table .span4 { - float: none; - width: 284px; - margin-left: 0; -} - -.table .span5 { - float: none; - width: 364px; - margin-left: 0; -} - -.table .span6 { - float: none; - width: 444px; - margin-left: 0; -} - -.table .span7 { - float: none; - width: 524px; - margin-left: 0; -} - -.table .span8 { - float: none; - width: 604px; - margin-left: 0; -} - -.table .span9 { - float: none; - width: 684px; - margin-left: 0; -} - -.table .span10 { - float: none; - width: 764px; - margin-left: 0; -} - -.table .span11 { - float: none; - width: 844px; - margin-left: 0; -} - -.table .span12 { - float: none; - width: 924px; - margin-left: 0; -} - -.table .span13 { - float: none; - width: 1004px; - margin-left: 0; -} - -.table .span14 { - float: none; - width: 1084px; - margin-left: 0; -} - -.table .span15 { - float: none; - width: 1164px; - margin-left: 0; -} - -.table .span16 { - float: none; - width: 1244px; - margin-left: 0; -} - -.table .span17 { - float: none; - width: 1324px; - margin-left: 0; -} - -.table .span18 { - float: none; - width: 1404px; - margin-left: 0; -} - -.table .span19 { - float: none; - width: 1484px; - margin-left: 0; -} - -.table .span20 { - float: none; - width: 1564px; - margin-left: 0; -} - -.table .span21 { - float: none; - width: 1644px; - margin-left: 0; -} - -.table .span22 { - float: none; - width: 1724px; - margin-left: 0; -} - -.table .span23 { - float: none; - width: 1804px; - margin-left: 0; -} - -.table .span24 { - float: none; - width: 1884px; - margin-left: 0; -} - -.table tbody tr.success td { - background-color: #dff0d8; -} - -.table tbody tr.error td { - background-color: #f2dede; -} - -.table tbody tr.warning td { - background-color: #fcf8e3; -} - -.table tbody tr.info td { - background-color: #d9edf7; -} - -.table-hover tbody tr.success:hover td { - background-color: #d0e9c6; -} - -.table-hover tbody tr.error:hover td { - background-color: #ebcccc; -} - -.table-hover tbody tr.warning:hover td { - background-color: #faf2cc; -} - -.table-hover tbody tr.info:hover td { - background-color: #c4e3f3; -} - -[class^="icon-"], -[class*=" icon-"] { - display: inline-block; - width: 14px; - height: 14px; - margin-top: 1px; - *margin-right: .3em; - line-height: 14px; - vertical-align: text-top; - background-image: url("../img/glyphicons-halflings.png"); - background-position: 14px 14px; - background-repeat: no-repeat; -} - -/* White icons with optional class, or on hover/active states of certain elements */ - -.icon-white, -.nav-tabs > .active > a > [class^="icon-"], -.nav-tabs > .active > a > [class*=" icon-"], -.nav-pills > .active > a > [class^="icon-"], -.nav-pills > .active > a > [class*=" icon-"], -.nav-list > .active > a > [class^="icon-"], -.nav-list > .active > a > [class*=" icon-"], -.navbar-inverse .nav > .active > a > [class^="icon-"], -.navbar-inverse .nav > .active > a > [class*=" icon-"], -.dropdown-menu > li > a:hover > [class^="icon-"], -.dropdown-menu > li > a:hover > [class*=" icon-"], -.dropdown-menu > .active > a > [class^="icon-"], -.dropdown-menu > .active > a > [class*=" icon-"] { - background-image: url("../img/glyphicons-halflings-white.png"); -} - -.icon-glass { - background-position: 0 0; -} - -.icon-music { - background-position: -24px 0; -} - -.icon-search { - background-position: -48px 0; -} - -.icon-envelope { - background-position: -72px 0; -} - -.icon-heart { - background-position: -96px 0; -} - -.icon-star { - background-position: -120px 0; -} - -.icon-star-empty { - background-position: -144px 0; -} - -.icon-user { - background-position: -168px 0; -} - -.icon-film { - background-position: -192px 0; -} - -.icon-th-large { - background-position: -216px 0; -} - -.icon-th { - background-position: -240px 0; -} - -.icon-th-list { - background-position: -264px 0; -} - -.icon-ok { - background-position: -288px 0; -} - -.icon-remove { - background-position: -312px 0; -} - -.icon-zoom-in { - background-position: -336px 0; -} - -.icon-zoom-out { - background-position: -360px 0; -} - -.icon-off { - background-position: -384px 0; -} - -.icon-signal { - background-position: -408px 0; -} - -.icon-cog { - background-position: -432px 0; -} - -.icon-trash { - background-position: -456px 0; -} - -.icon-home { - background-position: 0 -24px; -} - -.icon-file { - background-position: -24px -24px; -} - -.icon-time { - background-position: -48px -24px; -} - -.icon-road { - background-position: -72px -24px; -} - -.icon-download-alt { - background-position: -96px -24px; -} - -.icon-download { - background-position: -120px -24px; -} - -.icon-upload { - background-position: -144px -24px; -} - -.icon-inbox { - background-position: -168px -24px; -} - -.icon-play-circle { - background-position: -192px -24px; -} - -.icon-repeat { - background-position: -216px -24px; -} - -.icon-refresh { - background-position: -240px -24px; -} - -.icon-list-alt { - background-position: -264px -24px; -} - -.icon-lock { - background-position: -287px -24px; -} - -.icon-flag { - background-position: -312px -24px; -} - -.icon-headphones { - background-position: -336px -24px; -} - -.icon-volume-off { - background-position: -360px -24px; -} - -.icon-volume-down { - background-position: -384px -24px; -} - -.icon-volume-up { - background-position: -408px -24px; -} - -.icon-qrcode { - background-position: -432px -24px; -} - -.icon-barcode { - background-position: -456px -24px; -} - -.icon-tag { - background-position: 0 -48px; -} - -.icon-tags { - background-position: -25px -48px; -} - -.icon-book { - background-position: -48px -48px; -} - -.icon-bookmark { - background-position: -72px -48px; -} - -.icon-print { - background-position: -96px -48px; -} - -.icon-camera { - background-position: -120px -48px; -} - -.icon-font { - background-position: -144px -48px; -} - -.icon-bold { - background-position: -167px -48px; -} - -.icon-italic { - background-position: -192px -48px; -} - -.icon-text-height { - background-position: -216px -48px; -} - -.icon-text-width { - background-position: -240px -48px; -} - -.icon-align-left { - background-position: -264px -48px; -} - -.icon-align-center { - background-position: -288px -48px; -} - -.icon-align-right { - background-position: -312px -48px; -} - -.icon-align-justify { - background-position: -336px -48px; -} - -.icon-list { - background-position: -360px -48px; -} - -.icon-indent-left { - background-position: -384px -48px; -} - -.icon-indent-right { - background-position: -408px -48px; -} - -.icon-facetime-video { - background-position: -432px -48px; -} - -.icon-picture { - background-position: -456px -48px; -} - -.icon-pencil { - background-position: 0 -72px; -} - -.icon-map-marker { - background-position: -24px -72px; -} - -.icon-adjust { - background-position: -48px -72px; -} - -.icon-tint { - background-position: -72px -72px; -} - -.icon-edit { - background-position: -96px -72px; -} - -.icon-share { - background-position: -120px -72px; -} - -.icon-check { - background-position: -144px -72px; -} - -.icon-move { - background-position: -168px -72px; -} - -.icon-step-backward { - background-position: -192px -72px; -} - -.icon-fast-backward { - background-position: -216px -72px; -} - -.icon-backward { - background-position: -240px -72px; -} - -.icon-play { - background-position: -264px -72px; -} - -.icon-pause { - background-position: -288px -72px; -} - -.icon-stop { - background-position: -312px -72px; -} - -.icon-forward { - background-position: -336px -72px; -} - -.icon-fast-forward { - background-position: -360px -72px; -} - -.icon-step-forward { - background-position: -384px -72px; -} - -.icon-eject { - background-position: -408px -72px; -} - -.icon-chevron-left { - background-position: -432px -72px; -} - -.icon-chevron-right { - background-position: -456px -72px; -} - -.icon-plus-sign { - background-position: 0 -96px; -} - -.icon-minus-sign { - background-position: -24px -96px; -} - -.icon-remove-sign { - background-position: -48px -96px; -} - -.icon-ok-sign { - background-position: -72px -96px; -} - -.icon-question-sign { - background-position: -96px -96px; -} - -.icon-info-sign { - background-position: -120px -96px; -} - -.icon-screenshot { - background-position: -144px -96px; -} - -.icon-remove-circle { - background-position: -168px -96px; -} - -.icon-ok-circle { - background-position: -192px -96px; -} - -.icon-ban-circle { - background-position: -216px -96px; -} - -.icon-arrow-left { - background-position: -240px -96px; -} - -.icon-arrow-right { - background-position: -264px -96px; -} - -.icon-arrow-up { - background-position: -289px -96px; -} - -.icon-arrow-down { - background-position: -312px -96px; -} - -.icon-share-alt { - background-position: -336px -96px; -} - -.icon-resize-full { - background-position: -360px -96px; -} - -.icon-resize-small { - background-position: -384px -96px; -} - -.icon-plus { - background-position: -408px -96px; -} - -.icon-minus { - background-position: -433px -96px; -} - -.icon-asterisk { - background-position: -456px -96px; -} - -.icon-exclamation-sign { - background-position: 0 -120px; -} - -.icon-gift { - background-position: -24px -120px; -} - -.icon-leaf { - background-position: -48px -120px; -} - -.icon-fire { - background-position: -72px -120px; -} - -.icon-eye-open { - background-position: -96px -120px; -} - -.icon-eye-close { - background-position: -120px -120px; -} - -.icon-warning-sign { - background-position: -144px -120px; -} - -.icon-plane { - background-position: -168px -120px; -} - -.icon-calendar { - background-position: -192px -120px; -} - -.icon-random { - width: 16px; - background-position: -216px -120px; -} - -.icon-comment { - background-position: -240px -120px; -} - -.icon-magnet { - background-position: -264px -120px; -} - -.icon-chevron-up { - background-position: -288px -120px; -} - -.icon-chevron-down { - background-position: -313px -119px; -} - -.icon-retweet { - background-position: -336px -120px; -} - -.icon-shopping-cart { - background-position: -360px -120px; -} - -.icon-folder-close { - background-position: -384px -120px; -} - -.icon-folder-open { - width: 16px; - background-position: -408px -120px; -} - -.icon-resize-vertical { - background-position: -432px -119px; -} - -.icon-resize-horizontal { - background-position: -456px -118px; -} - -.icon-hdd { - background-position: 0 -144px; -} - -.icon-bullhorn { - background-position: -24px -144px; -} - -.icon-bell { - background-position: -48px -144px; -} - -.icon-certificate { - background-position: -72px -144px; -} - -.icon-thumbs-up { - background-position: -96px -144px; -} - -.icon-thumbs-down { - background-position: -120px -144px; -} - -.icon-hand-right { - background-position: -144px -144px; -} - -.icon-hand-left { - background-position: -168px -144px; -} - -.icon-hand-up { - background-position: -192px -144px; -} - -.icon-hand-down { - background-position: -216px -144px; -} - -.icon-circle-arrow-right { - background-position: -240px -144px; -} - -.icon-circle-arrow-left { - background-position: -264px -144px; -} - -.icon-circle-arrow-up { - background-position: -288px -144px; -} - -.icon-circle-arrow-down { - background-position: -312px -144px; -} - -.icon-globe { - background-position: -336px -144px; -} - -.icon-wrench { - background-position: -360px -144px; -} - -.icon-tasks { - background-position: -384px -144px; -} - -.icon-filter { - background-position: -408px -144px; -} - -.icon-briefcase { - background-position: -432px -144px; -} - -.icon-fullscreen { - background-position: -456px -144px; -} - -.dropup, -.dropdown { - position: relative; -} - -.dropdown-toggle { - *margin-bottom: -3px; -} - -.dropdown-toggle:active, -.open .dropdown-toggle { - outline: 0; -} - -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: top; - border-top: 4px solid #000000; - border-right: 4px solid transparent; - border-left: 4px solid transparent; - content: ""; -} - -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - list-style: none; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - *border-right-width: 2px; - *border-bottom-width: 2px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.dropdown-menu .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.dropdown-menu a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 20px; - color: #333333; - white-space: nowrap; -} - -.dropdown-menu li > a:hover, -.dropdown-menu li > a:focus, -.dropdown-submenu:hover > a { - color: #ffffff; - text-decoration: none; - background-color: #0088cc; - background-color: #0081c2; - background-image: -moz-linear-gradient(top, #0088cc, #0077b3); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); - background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); - background-image: -o-linear-gradient(top, #0088cc, #0077b3); - background-image: linear-gradient(to bottom, #0088cc, #0077b3); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); -} - -.dropdown-menu .active > a, -.dropdown-menu .active > a:hover { - color: #ffffff; - text-decoration: none; - background-color: #0088cc; - background-color: #0081c2; - background-image: linear-gradient(to bottom, #0088cc, #0077b3); - background-image: -moz-linear-gradient(top, #0088cc, #0077b3); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); - background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); - background-image: -o-linear-gradient(top, #0088cc, #0077b3); - background-repeat: repeat-x; - outline: 0; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); -} - -.dropdown-menu .disabled > a, -.dropdown-menu .disabled > a:hover { - color: #999999; -} - -.dropdown-menu .disabled > a:hover { - text-decoration: none; - cursor: default; - background-color: transparent; -} - -.open { - *z-index: 1000; -} - -.open > .dropdown-menu { - display: block; -} - -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} - -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid #000000; - content: ""; -} - -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} - -.dropdown-submenu { - position: relative; -} - -.dropdown-submenu > .dropdown-menu { - top: 0; - left: 100%; - margin-top: -6px; - margin-left: -1px; - -webkit-border-radius: 0 6px 6px 6px; - -moz-border-radius: 0 6px 6px 6px; - border-radius: 0 6px 6px 6px; -} - -.dropdown-submenu:hover > .dropdown-menu { - display: block; -} - -.dropdown-submenu > a:after { - display: block; - float: right; - width: 0; - height: 0; - margin-top: 5px; - margin-right: -10px; - border-color: transparent; - border-left-color: #cccccc; - border-style: solid; - border-width: 5px 0 5px 5px; - content: " "; -} - -.dropdown-submenu:hover > a:after { - border-left-color: #ffffff; -} - -.dropdown .dropdown-menu .nav-header { - padding-right: 20px; - padding-left: 20px; -} - -.typeahead { - margin-top: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} - -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} - -.well-large { - padding: 24px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.well-small { - padding: 9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} - -.fade.in { - opacity: 1; -} - -.collapse { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; -} - -.collapse.in { - height: auto; -} - -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 20px; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} - -.close:hover { - color: #000000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - filter: alpha(opacity=40); -} - -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} - -.btn { - display: inline-block; - *display: inline; - padding: 4px 14px; - margin-bottom: 0; - *margin-left: .3em; - font-size: 14px; - line-height: 20px; - *line-height: 20px; - color: #333333; - text-align: center; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - vertical-align: middle; - cursor: pointer; - background-color: #f5f5f5; - *background-color: #e6e6e6; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); - background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); - background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); - background-repeat: repeat-x; - border: 1px solid #bbbbbb; - *border: 0; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - border-color: #e6e6e6 #e6e6e6 #bfbfbf; - border-bottom-color: #a2a2a2; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn:hover, -.btn:active, -.btn.active, -.btn.disabled, -.btn[disabled] { - color: #333333; - background-color: #e6e6e6; - *background-color: #d9d9d9; -} - -.btn:active, -.btn.active { - background-color: #cccccc \9; -} - -.btn:first-child { - *margin-left: 0; -} - -.btn:hover { - color: #333333; - text-decoration: none; - background-color: #e6e6e6; - *background-color: #d9d9d9; - /* Buttons in IE7 don't get borders, so darken on hover */ - - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} - -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.btn.active, -.btn:active { - background-color: #e6e6e6; - background-color: #d9d9d9 \9; - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn.disabled, -.btn[disabled] { - cursor: default; - background-color: #e6e6e6; - background-image: none; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-large { - padding: 9px 14px; - font-size: 16px; - line-height: normal; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.btn-large [class^="icon-"] { - margin-top: 2px; -} - -.btn-small { - padding: 3px 9px; - font-size: 12px; - line-height: 18px; -} - -.btn-small [class^="icon-"] { - margin-top: 0; -} - -.btn-mini { - padding: 2px 6px; - font-size: 11px; - line-height: 17px; -} - -.btn-block { - display: block; - width: 100%; - padding-right: 0; - padding-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.btn-block + .btn-block { - margin-top: 5px; -} - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} - -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active, -.btn-inverse.active { - color: rgba(255, 255, 255, 0.75); -} - -.btn { - border-color: #c5c5c5; - border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25); -} - -.btn-primary { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #006dcc; - *background-color: #0044cc; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); - background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); - background-image: -o-linear-gradient(top, #0088cc, #0044cc); - background-image: linear-gradient(to bottom, #0088cc, #0044cc); - background-image: -moz-linear-gradient(top, #0088cc, #0044cc); - background-repeat: repeat-x; - border-color: #0044cc #0044cc #002a80; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-primary:hover, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - color: #ffffff; - background-color: #0044cc; - *background-color: #003bb3; -} - -.btn-primary:active, -.btn-primary.active { - background-color: #003399 \9; -} - -.btn-warning { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #faa732; - *background-color: #f89406; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-repeat: repeat-x; - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-warning:hover, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - color: #ffffff; - background-color: #f89406; - *background-color: #df8505; -} - -.btn-warning:active, -.btn-warning.active { - background-color: #c67605 \9; -} - -.btn-danger { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #da4f49; - *background-color: #bd362f; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); - background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); - background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); - background-repeat: repeat-x; - border-color: #bd362f #bd362f #802420; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-danger:hover, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - color: #ffffff; - background-color: #bd362f; - *background-color: #a9302a; -} - -.btn-danger:active, -.btn-danger.active { - background-color: #942a25 \9; -} - -.btn-success { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #5bb75b; - *background-color: #51a351; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); - background-image: -webkit-linear-gradient(top, #62c462, #51a351); - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: linear-gradient(to bottom, #62c462, #51a351); - background-image: -moz-linear-gradient(top, #62c462, #51a351); - background-repeat: repeat-x; - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-success:hover, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - color: #ffffff; - background-color: #51a351; - *background-color: #499249; -} - -.btn-success:active, -.btn-success.active { - background-color: #408140 \9; -} - -.btn-info { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #49afcd; - *background-color: #2f96b4; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); - background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); - background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); - background-repeat: repeat-x; - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-info:hover, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - color: #ffffff; - background-color: #2f96b4; - *background-color: #2a85a0; -} - -.btn-info:active, -.btn-info.active { - background-color: #24748c \9; -} - -.btn-inverse { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #363636; - *background-color: #222222; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); - background-image: -webkit-linear-gradient(top, #444444, #222222); - background-image: -o-linear-gradient(top, #444444, #222222); - background-image: linear-gradient(to bottom, #444444, #222222); - background-image: -moz-linear-gradient(top, #444444, #222222); - background-repeat: repeat-x; - border-color: #222222 #222222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-inverse:hover, -.btn-inverse:active, -.btn-inverse.active, -.btn-inverse.disabled, -.btn-inverse[disabled] { - color: #ffffff; - background-color: #222222; - *background-color: #151515; -} - -.btn-inverse:active, -.btn-inverse.active { - background-color: #080808 \9; -} - -button.btn, -input[type="submit"].btn { - *padding-top: 3px; - *padding-bottom: 3px; -} - -button.btn::-moz-focus-inner, -input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} - -button.btn.btn-large, -input[type="submit"].btn.btn-large { - *padding-top: 7px; - *padding-bottom: 7px; -} - -button.btn.btn-small, -input[type="submit"].btn.btn-small { - *padding-top: 3px; - *padding-bottom: 3px; -} - -button.btn.btn-mini, -input[type="submit"].btn.btn-mini { - *padding-top: 1px; - *padding-bottom: 1px; -} - -.btn-link, -.btn-link:active, -.btn-link[disabled] { - background-color: transparent; - background-image: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-link { - color: #0088cc; - cursor: pointer; - border-color: transparent; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-link:hover { - color: #005580; - text-decoration: underline; - background-color: transparent; -} - -.btn-link[disabled]:hover { - color: #333333; - text-decoration: none; -} - -.btn-group { - position: relative; - *margin-left: .3em; - font-size: 0; - white-space: nowrap; - vertical-align: middle; -} - -.btn-group:first-child { - *margin-left: 0; -} - -.btn-group + .btn-group { - margin-left: 5px; -} - -.btn-toolbar { - margin-top: 10px; - margin-bottom: 10px; - font-size: 0; -} - -.btn-toolbar .btn-group { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; -} - -.btn-toolbar .btn + .btn, -.btn-toolbar .btn-group + .btn, -.btn-toolbar .btn + .btn-group { - margin-left: 5px; -} - -.btn-group > .btn { - position: relative; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group > .btn + .btn { - margin-left: -1px; -} - -.btn-group > .btn, -.btn-group > .dropdown-menu { - font-size: 14px; -} - -.btn-group > .btn-mini { - font-size: 11px; -} - -.btn-group > .btn-small { - font-size: 12px; -} - -.btn-group > .btn-large { - font-size: 16px; -} - -.btn-group > .btn:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-topleft: 4px; -} - -.btn-group > .btn:last-child, -.btn-group > .dropdown-toggle { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-bottomright: 4px; -} - -.btn-group > .btn.large:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 6px; - border-bottom-left-radius: 6px; - -webkit-border-top-left-radius: 6px; - border-top-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topleft: 6px; -} - -.btn-group > .btn.large:last-child, -.btn-group > .large.dropdown-toggle { - -webkit-border-top-right-radius: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - border-bottom-right-radius: 6px; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 6px; -} - -.btn-group > .btn:hover, -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active { - z-index: 2; -} - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - -.btn-group > .btn + .dropdown-toggle { - *padding-top: 5px; - padding-right: 8px; - *padding-bottom: 5px; - padding-left: 8px; - -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group > .btn-mini + .dropdown-toggle { - *padding-top: 2px; - padding-right: 5px; - *padding-bottom: 2px; - padding-left: 5px; -} - -.btn-group > .btn-small + .dropdown-toggle { - *padding-top: 5px; - *padding-bottom: 4px; -} - -.btn-group > .btn-large + .dropdown-toggle { - *padding-top: 7px; - padding-right: 12px; - *padding-bottom: 7px; - padding-left: 12px; -} - -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group.open .btn.dropdown-toggle { - background-color: #e6e6e6; -} - -.btn-group.open .btn-primary.dropdown-toggle { - background-color: #0044cc; -} - -.btn-group.open .btn-warning.dropdown-toggle { - background-color: #f89406; -} - -.btn-group.open .btn-danger.dropdown-toggle { - background-color: #bd362f; -} - -.btn-group.open .btn-success.dropdown-toggle { - background-color: #51a351; -} - -.btn-group.open .btn-info.dropdown-toggle { - background-color: #2f96b4; -} - -.btn-group.open .btn-inverse.dropdown-toggle { - background-color: #222222; -} - -.btn .caret { - margin-top: 8px; - margin-left: 0; -} - -.btn-mini .caret, -.btn-small .caret, -.btn-large .caret { - margin-top: 6px; -} - -.btn-large .caret { - border-top-width: 5px; - border-right-width: 5px; - border-left-width: 5px; -} - -.dropup .btn-large .caret { - border-top: 0; - border-bottom: 5px solid #000000; -} - -.btn-primary .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret, -.btn-inverse .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.btn-group-vertical { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; -} - -.btn-group-vertical .btn { - display: block; - float: none; - width: 100%; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group-vertical .btn + .btn { - margin-top: -1px; - margin-left: 0; -} - -.btn-group-vertical .btn:first-child { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.btn-group-vertical .btn:last-child { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.btn-group-vertical .btn-large:first-child { - -webkit-border-radius: 6px 6px 0 0; - -moz-border-radius: 6px 6px 0 0; - border-radius: 6px 6px 0 0; -} - -.btn-group-vertical .btn-large:last-child { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} - -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 20px; - color: #c09853; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.alert h4 { - margin: 0; -} - -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 20px; -} - -.alert-success { - color: #468847; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.alert-danger, -.alert-error { - color: #b94a48; - background-color: #f2dede; - border-color: #eed3d7; -} - -.alert-info { - color: #3a87ad; - background-color: #d9edf7; - border-color: #bce8f1; -} - -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} - -.alert-block > p, -.alert-block > ul { - margin-bottom: 0; -} - -.alert-block p + p { - margin-top: 5px; -} - -.nav { - margin-bottom: 20px; - margin-left: 0; - list-style: none; -} - -.nav > li > a { - display: block; -} - -.nav > li > a:hover { - text-decoration: none; - background-color: #eeeeee; -} - -.nav > .pull-right { - float: right; -} - -.nav-header { - display: block; - padding: 3px 15px; - font-size: 11px; - font-weight: bold; - line-height: 20px; - color: #999999; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - text-transform: uppercase; -} - -.nav li + .nav-header { - margin-top: 9px; -} - -.nav-list { - padding-right: 15px; - padding-left: 15px; - margin-bottom: 0; -} - -.nav-list > li > a, -.nav-list .nav-header { - margin-right: -15px; - margin-left: -15px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); -} - -.nav-list > li > a { - padding: 3px 15px; -} - -.nav-list > .active > a, -.nav-list > .active > a:hover { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #0088cc; -} - -.nav-list [class^="icon-"] { - margin-right: 2px; -} - -.nav-list .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.nav-tabs, -.nav-pills { - *zoom: 1; -} - -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - line-height: 0; - content: ""; -} - -.nav-tabs:after, -.nav-pills:after { - clear: both; -} - -.nav-tabs > li, -.nav-pills > li { - float: left; -} - -.nav-tabs > li > a, -.nav-pills > li > a { - padding-right: 12px; - padding-left: 12px; - margin-right: 2px; - line-height: 14px; -} - -.nav-tabs { - border-bottom: 1px solid #ddd; -} - -.nav-tabs > li { - margin-bottom: -1px; -} - -.nav-tabs > li > a { - padding-top: 8px; - padding-bottom: 8px; - line-height: 20px; - border: 1px solid transparent; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #dddddd; -} - -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover { - color: #555555; - cursor: default; - background-color: #ffffff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} - -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.nav-pills > .active > a, -.nav-pills > .active > a:hover { - color: #ffffff; - background-color: #0088cc; -} - -.nav-stacked > li { - float: none; -} - -.nav-stacked > li > a { - margin-right: 0; -} - -.nav-tabs.nav-stacked { - border-bottom: 0; -} - -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-topleft: 4px; -} - -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomright: 4px; - -moz-border-radius-bottomleft: 4px; -} - -.nav-tabs.nav-stacked > li > a:hover { - z-index: 2; - border-color: #ddd; -} - -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} - -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} - -.nav-tabs .dropdown-menu { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} - -.nav-pills .dropdown-menu { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.nav .dropdown-toggle .caret { - margin-top: 6px; - border-top-color: #0088cc; - border-bottom-color: #0088cc; -} - -.nav .dropdown-toggle:hover .caret { - border-top-color: #005580; - border-bottom-color: #005580; -} - -/* move down carets for tabs */ - -.nav-tabs .dropdown-toggle .caret { - margin-top: 8px; -} - -.nav .active .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} - -.nav-tabs .active .dropdown-toggle .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.nav > .dropdown.active > a:hover { - cursor: pointer; -} - -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > li.dropdown.open.active > a:hover { - color: #ffffff; - background-color: #999999; - border-color: #999999; -} - -.nav li.dropdown.open .caret, -.nav li.dropdown.open.active .caret, -.nav li.dropdown.open a:hover .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; - opacity: 1; - filter: alpha(opacity=100); -} - -.tabs-stacked .open > a:hover { - border-color: #999999; -} - -.tabbable { - *zoom: 1; -} - -.tabbable:before, -.tabbable:after { - display: table; - line-height: 0; - content: ""; -} - -.tabbable:after { - clear: both; -} - -.tab-content { - overflow: auto; -} - -.tabs-below > .nav-tabs, -.tabs-right > .nav-tabs, -.tabs-left > .nav-tabs { - border-bottom: 0; -} - -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} - -.tab-content > .active, -.pill-content > .active { - display: block; -} - -.tabs-below > .nav-tabs { - border-top: 1px solid #ddd; -} - -.tabs-below > .nav-tabs > li { - margin-top: -1px; - margin-bottom: 0; -} - -.tabs-below > .nav-tabs > li > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.tabs-below > .nav-tabs > li > a:hover { - border-top-color: #ddd; - border-bottom-color: transparent; -} - -.tabs-below > .nav-tabs > .active > a, -.tabs-below > .nav-tabs > .active > a:hover { - border-color: transparent #ddd #ddd #ddd; -} - -.tabs-left > .nav-tabs > li, -.tabs-right > .nav-tabs > li { - float: none; -} - -.tabs-left > .nav-tabs > li > a, -.tabs-right > .nav-tabs > li > a { - min-width: 74px; - margin-right: 0; - margin-bottom: 3px; -} - -.tabs-left > .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} - -.tabs-left > .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.tabs-left > .nav-tabs > li > a:hover { - border-color: #eeeeee #dddddd #eeeeee #eeeeee; -} - -.tabs-left > .nav-tabs .active > a, -.tabs-left > .nav-tabs .active > a:hover { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #ffffff; -} - -.tabs-right > .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} - -.tabs-right > .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.tabs-right > .nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #eeeeee #dddddd; -} - -.tabs-right > .nav-tabs .active > a, -.tabs-right > .nav-tabs .active > a:hover { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #ffffff; -} - -.nav > .disabled > a { - color: #999999; -} - -.nav > .disabled > a:hover { - text-decoration: none; - cursor: default; - background-color: transparent; -} - -.navbar { - *position: relative; - *z-index: 2; - margin-bottom: 20px; - overflow: visible; - color: #777777; -} - -.navbar-inner { - min-height: 40px; - padding-right: 20px; - padding-left: 20px; - background-color: #fafafa; - background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); - background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); - background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); - background-repeat: repeat-x; - border: 1px solid #d4d4d4; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); - *zoom: 1; - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); -} - -.navbar-inner:before, -.navbar-inner:after { - display: table; - line-height: 0; - content: ""; -} - -.navbar-inner:after { - clear: both; -} - -.navbar .container { - width: auto; -} - -.nav-collapse.collapse { - height: auto; -} - -.navbar .brand { - display: block; - float: left; - padding: 10px 20px 10px; - margin-left: -20px; - font-size: 20px; - font-weight: 200; - color: #777777; - text-shadow: 0 1px 0 #ffffff; -} - -.navbar .brand:hover { - text-decoration: none; -} - -.navbar-text { - margin-bottom: 0; - line-height: 40px; -} - -.navbar-link { - color: #777777; -} - -.navbar-link:hover { - color: #333333; -} - -.navbar .divider-vertical { - height: 40px; - margin: 0 9px; - border-right: 1px solid #ffffff; - border-left: 1px solid #f2f2f2; -} - -.navbar .btn, -.navbar .btn-group { - margin-top: 5px; -} - -.navbar .btn-group .btn, -.navbar .input-prepend .btn, -.navbar .input-append .btn { - margin-top: 0; -} - -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} - -.navbar-form:before, -.navbar-form:after { - display: table; - line-height: 0; - content: ""; -} - -.navbar-form:after { - clear: both; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .radio, -.navbar-form .checkbox { - margin-top: 5px; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .btn { - display: inline-block; - margin-bottom: 0; -} - -.navbar-form input[type="image"], -.navbar-form input[type="checkbox"], -.navbar-form input[type="radio"] { - margin-top: 3px; -} - -.navbar-form .input-append, -.navbar-form .input-prepend { - margin-top: 6px; - white-space: nowrap; -} - -.navbar-form .input-append input, -.navbar-form .input-prepend input { - margin-top: 0; -} - -.navbar-search { - position: relative; - float: left; - margin-top: 5px; - margin-bottom: 0; -} - -.navbar-search .search-query { - padding: 4px 14px; - margin-bottom: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 1; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -.navbar-static-top { - position: static; - width: 100%; - margin-bottom: 0; -} - -.navbar-static-top .navbar-inner { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - margin-bottom: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - border-width: 0 0 1px; -} - -.navbar-fixed-bottom .navbar-inner { - border-width: 1px 0 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-fixed-bottom .navbar-inner { - padding-right: 0; - padding-left: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.navbar-fixed-top { - top: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1); -} - -.navbar-fixed-bottom { - bottom: 0; -} - -.navbar-fixed-bottom .navbar-inner { - -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1); -} - -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} - -.navbar .nav.pull-right { - float: right; - margin-right: 0; -} - -.navbar .nav > li { - float: left; -} - -.navbar .nav > li > a { - float: none; - padding: 10px 15px 10px; - color: #777777; - text-decoration: none; - text-shadow: 0 1px 0 #ffffff; -} - -.navbar .nav .dropdown-toggle .caret { - margin-top: 8px; -} - -.navbar .nav > li > a:focus, -.navbar .nav > li > a:hover { - color: #333333; - text-decoration: none; - background-color: transparent; -} - -.navbar .nav > .active > a, -.navbar .nav > .active > a:hover, -.navbar .nav > .active > a:focus { - color: #555555; - text-decoration: none; - background-color: #e5e5e5; - -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); -} - -.navbar .btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-right: 5px; - margin-left: 5px; - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #ededed; - *background-color: #e5e5e5; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); - background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); - background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); - background-repeat: repeat-x; - border-color: #e5e5e5 #e5e5e5 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); -} - -.navbar .btn-navbar:hover, -.navbar .btn-navbar:active, -.navbar .btn-navbar.active, -.navbar .btn-navbar.disabled, -.navbar .btn-navbar[disabled] { - color: #ffffff; - background-color: #e5e5e5; - *background-color: #d9d9d9; -} - -.navbar .btn-navbar:active, -.navbar .btn-navbar.active { - background-color: #cccccc \9; -} - -.navbar .btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} - -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} - -.navbar .nav > li > .dropdown-menu:before { - position: absolute; - top: -7px; - left: 9px; - display: inline-block; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ''; -} - -.navbar .nav > li > .dropdown-menu:after { - position: absolute; - top: -6px; - left: 10px; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - border-left: 6px solid transparent; - content: ''; -} - -.navbar-fixed-bottom .nav > li > .dropdown-menu:before { - top: auto; - bottom: -7px; - border-top: 7px solid #ccc; - border-bottom: 0; - border-top-color: rgba(0, 0, 0, 0.2); -} - -.navbar-fixed-bottom .nav > li > .dropdown-menu:after { - top: auto; - bottom: -6px; - border-top: 6px solid #ffffff; - border-bottom: 0; -} - -.navbar .nav li.dropdown.open > .dropdown-toggle, -.navbar .nav li.dropdown.active > .dropdown-toggle, -.navbar .nav li.dropdown.open.active > .dropdown-toggle { - color: #555555; - background-color: #e5e5e5; -} - -.navbar .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #777777; - border-bottom-color: #777777; -} - -.navbar .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.navbar .pull-right > li > .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu:before, -.navbar .nav > li > .dropdown-menu.pull-right:before { - right: 12px; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu:after, -.navbar .nav > li > .dropdown-menu.pull-right:after { - right: 13px; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { - right: 100%; - left: auto; - margin-right: -1px; - margin-left: 0; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} - -.navbar-inverse { - color: #999999; -} - -.navbar-inverse .navbar-inner { - background-color: #1b1b1b; - background-image: -moz-linear-gradient(top, #222222, #111111); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); - background-image: -webkit-linear-gradient(top, #222222, #111111); - background-image: -o-linear-gradient(top, #222222, #111111); - background-image: linear-gradient(to bottom, #222222, #111111); - background-repeat: repeat-x; - border-color: #252525; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); -} - -.navbar-inverse .brand, -.navbar-inverse .nav > li > a { - color: #999999; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} - -.navbar-inverse .brand:hover, -.navbar-inverse .nav > li > a:hover { - color: #ffffff; -} - -.navbar-inverse .nav > li > a:focus, -.navbar-inverse .nav > li > a:hover { - color: #ffffff; - background-color: transparent; -} - -.navbar-inverse .nav .active > a, -.navbar-inverse .nav .active > a:hover, -.navbar-inverse .nav .active > a:focus { - color: #ffffff; - background-color: #111111; -} - -.navbar-inverse .navbar-link { - color: #999999; -} - -.navbar-inverse .navbar-link:hover { - color: #ffffff; -} - -.navbar-inverse .divider-vertical { - border-right-color: #222222; - border-left-color: #111111; -} - -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { - color: #ffffff; - background-color: #111111; -} - -.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #999999; - border-bottom-color: #999999; -} - -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar-inverse .navbar-search .search-query { - color: #ffffff; - background-color: #515151; - border-color: #111111; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -webkit-transition: none; - -moz-transition: none; - -o-transition: none; - transition: none; -} - -.navbar-inverse .navbar-search .search-query:-moz-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query:focus, -.navbar-inverse .navbar-search .search-query.focused { - padding: 5px 15px; - color: #333333; - text-shadow: 0 1px 0 #ffffff; - background-color: #ffffff; - border: 0; - outline: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); -} - -.navbar-inverse .btn-navbar { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e0e0e; - *background-color: #040404; - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); - background-image: -webkit-linear-gradient(top, #151515, #040404); - background-image: -o-linear-gradient(top, #151515, #040404); - background-image: linear-gradient(to bottom, #151515, #040404); - background-image: -moz-linear-gradient(top, #151515, #040404); - background-repeat: repeat-x; - border-color: #040404 #040404 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.navbar-inverse .btn-navbar:hover, -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active, -.navbar-inverse .btn-navbar.disabled, -.navbar-inverse .btn-navbar[disabled] { - color: #ffffff; - background-color: #040404; - *background-color: #000000; -} - -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active { - background-color: #000000 \9; -} - -.breadcrumb { - padding: 8px 15px; - margin: 0 0 20px; - list-style: none; - background-color: #f5f5f5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.breadcrumb li { - display: inline-block; - *display: inline; - text-shadow: 0 1px 0 #ffffff; - *zoom: 1; -} - -.breadcrumb .divider { - padding: 0 5px; - color: #ccc; -} - -.breadcrumb .active { - color: #999999; -} - -.pagination { - height: 40px; - margin: 20px 0; -} - -.pagination ul { - display: inline-block; - *display: inline; - margin-bottom: 0; - margin-left: 0; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - *zoom: 1; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.pagination ul > li { - display: inline; -} - -.pagination ul > li > a, -.pagination ul > li > span { - float: left; - padding: 0 14px; - line-height: 38px; - text-decoration: none; - background-color: #ffffff; - border: 1px solid #dddddd; - border-left-width: 0; -} - -.pagination ul > li > a:hover, -.pagination ul > .active > a, -.pagination ul > .active > span { - background-color: #f5f5f5; -} - -.pagination ul > .active > a, -.pagination ul > .active > span { - color: #999999; - cursor: default; -} - -.pagination ul > .disabled > span, -.pagination ul > .disabled > a, -.pagination ul > .disabled > a:hover { - color: #999999; - cursor: default; - background-color: transparent; -} - -.pagination ul > li:first-child > a, -.pagination ul > li:first-child > span { - border-left-width: 1px; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} - -.pagination ul > li:last-child > a, -.pagination ul > li:last-child > span { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} - -.pagination-centered { - text-align: center; -} - -.pagination-right { - text-align: right; -} - -.pager { - margin: 20px 0; - text-align: center; - list-style: none; - *zoom: 1; -} - -.pager:before, -.pager:after { - display: table; - line-height: 0; - content: ""; -} - -.pager:after { - clear: both; -} - -.pager li { - display: inline; -} - -.pager a, -.pager span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -.pager a:hover { - text-decoration: none; - background-color: #f5f5f5; -} - -.pager .next a, -.pager .next span { - float: right; -} - -.pager .previous a { - float: left; -} - -.pager .disabled a, -.pager .disabled a:hover, -.pager .disabled span { - color: #999999; - cursor: default; - background-color: #fff; -} - -.modal-open .modal .dropdown-menu { - z-index: 2050; -} - -.modal-open .modal .dropdown.open { - *z-index: 2050; -} - -.modal-open .modal .popover { - z-index: 2060; -} - -.modal-open .modal .tooltip { - z-index: 2080; -} - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000000; -} - -.modal-backdrop.fade { - opacity: 0; -} - -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.modal { - position: fixed; - top: 50%; - left: 50%; - z-index: 1050; - width: 560px; - margin: -250px 0 0 -280px; - overflow: auto; - background-color: #ffffff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} - -.modal.fade { - top: -25%; - -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; - -moz-transition: opacity 0.3s linear, top 0.3s ease-out; - -o-transition: opacity 0.3s linear, top 0.3s ease-out; - transition: opacity 0.3s linear, top 0.3s ease-out; -} - -.modal.fade.in { - top: 50%; -} - -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} - -.modal-header .close { - margin-top: 2px; -} - -.modal-header h3 { - margin: 0; - line-height: 30px; -} - -.modal-body { - max-height: 400px; - padding: 15px; - overflow-y: auto; -} - -.modal-form { - margin-bottom: 0; -} - -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - text-align: right; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - line-height: 0; - content: ""; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} - -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} - -.tooltip { - position: absolute; - z-index: 1030; - display: block; - padding: 5px; - font-size: 11px; - opacity: 0; - filter: alpha(opacity=0); - visibility: visible; -} - -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.tooltip.top { - margin-top: -3px; -} - -.tooltip.right { - margin-left: 3px; -} - -.tooltip.bottom { - margin-top: 3px; -} - -.tooltip.left { - margin-left: -3px; -} - -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-right-color: #000000; - border-width: 5px 5px 5px 0; -} - -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-left-color: #000000; - border-width: 5px 0 5px 5px; -} - -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - width: 236px; - padding: 1px; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.popover.top { - margin-bottom: 10px; -} - -.popover.right { - margin-left: 10px; -} - -.popover.bottom { - margin-top: 10px; -} - -.popover.left { - margin-right: 10px; -} - -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - -webkit-border-radius: 5px 5px 0 0; - -moz-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} - -.popover-content { - padding: 9px 14px; -} - -.popover-content p, -.popover-content ul, -.popover-content ol { - margin-bottom: 0; -} - -.popover .arrow, -.popover .arrow:after { - position: absolute; - display: inline-block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.popover .arrow:after { - z-index: -1; - content: ""; -} - -.popover.top .arrow { - bottom: -10px; - left: 50%; - margin-left: -10px; - border-top-color: #ffffff; - border-width: 10px 10px 0; -} - -.popover.top .arrow:after { - bottom: -1px; - left: -11px; - border-top-color: rgba(0, 0, 0, 0.25); - border-width: 11px 11px 0; -} - -.popover.right .arrow { - top: 50%; - left: -10px; - margin-top: -10px; - border-right-color: #ffffff; - border-width: 10px 10px 10px 0; -} - -.popover.right .arrow:after { - bottom: -11px; - left: -1px; - border-right-color: rgba(0, 0, 0, 0.25); - border-width: 11px 11px 11px 0; -} - -.popover.bottom .arrow { - top: -10px; - left: 50%; - margin-left: -10px; - border-bottom-color: #ffffff; - border-width: 0 10px 10px; -} - -.popover.bottom .arrow:after { - top: -1px; - left: -11px; - border-bottom-color: rgba(0, 0, 0, 0.25); - border-width: 0 11px 11px; -} - -.popover.left .arrow { - top: 50%; - right: -10px; - margin-top: -10px; - border-left-color: #ffffff; - border-width: 10px 0 10px 10px; -} - -.popover.left .arrow:after { - right: -1px; - bottom: -11px; - border-left-color: rgba(0, 0, 0, 0.25); - border-width: 11px 0 11px 11px; -} - -.thumbnails { - margin-left: -20px; - list-style: none; - *zoom: 1; -} - -.thumbnails:before, -.thumbnails:after { - display: table; - line-height: 0; - content: ""; -} - -.thumbnails:after { - clear: both; -} - -.row-fluid .thumbnails { - margin-left: 0; -} - -.thumbnails > li { - float: left; - margin-bottom: 20px; - margin-left: 20px; -} - -.thumbnail { - display: block; - padding: 4px; - line-height: 20px; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -webkit-transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} - -a.thumbnail:hover { - border-color: #0088cc; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -} - -.thumbnail > img { - display: block; - max-width: 100%; - margin-right: auto; - margin-left: auto; -} - -.thumbnail .caption { - padding: 9px; - color: #555555; -} - -.label, -.badge { - font-size: 11.844px; - font-weight: bold; - line-height: 14px; - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - white-space: nowrap; - vertical-align: baseline; - background-color: #999999; -} - -.label { - padding: 1px 4px 2px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.badge { - padding: 1px 9px 2px; - -webkit-border-radius: 9px; - -moz-border-radius: 9px; - border-radius: 9px; -} - -a.label:hover, -a.badge:hover { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -.label-important, -.badge-important { - background-color: #b94a48; -} - -.label-important[href], -.badge-important[href] { - background-color: #953b39; -} - -.label-warning, -.badge-warning { - background-color: #f89406; -} - -.label-warning[href], -.badge-warning[href] { - background-color: #c67605; -} - -.label-success, -.badge-success { - background-color: #468847; -} - -.label-success[href], -.badge-success[href] { - background-color: #356635; -} - -.label-info, -.badge-info { - background-color: #3a87ad; -} - -.label-info[href], -.badge-info[href] { - background-color: #2d6987; -} - -.label-inverse, -.badge-inverse { - background-color: #333333; -} - -.label-inverse[href], -.badge-inverse[href] { - background-color: #1a1a1a; -} - -.btn .label, -.btn .badge { - position: relative; - top: -1px; -} - -.btn-mini .label, -.btn-mini .badge { - top: 0; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-moz-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-ms-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -} - -.progress .bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - color: #ffffff; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(to bottom, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} - -.progress .bar + .bar { - -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); -} - -.progress-striped .bar { - background-color: #149bdf; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} - -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} - -.progress-danger .bar, -.progress .bar-danger { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); -} - -.progress-danger.progress-striped .bar, -.progress-striped .bar-danger { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-success .bar, -.progress .bar-success { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(to bottom, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); -} - -.progress-success.progress-striped .bar, -.progress-striped .bar-success { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-info .bar, -.progress .bar-info { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(to bottom, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); -} - -.progress-info.progress-striped .bar, -.progress-striped .bar-info { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-warning .bar, -.progress .bar-warning { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); -} - -.progress-warning.progress-striped .bar, -.progress-striped .bar-warning { - background-color: #fbb450; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.accordion { - margin-bottom: 20px; -} - -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.accordion-heading { - border-bottom: 0; -} - -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} - -.accordion-toggle { - cursor: pointer; -} - -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} - -.carousel { - position: relative; - margin-bottom: 20px; - line-height: 1; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} - -.carousel .item { - position: relative; - display: none; - -webkit-transition: 0.6s ease-in-out left; - -moz-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} - -.carousel .item > img { - display: block; - line-height: 1; -} - -.carousel .active, -.carousel .next, -.carousel .prev { - display: block; -} - -.carousel .active { - left: 0; -} - -.carousel .next, -.carousel .prev { - position: absolute; - top: 0; - width: 100%; -} - -.carousel .next { - left: 100%; -} - -.carousel .prev { - left: -100%; -} - -.carousel .next.left, -.carousel .prev.right { - left: 0; -} - -.carousel .active.left { - left: -100%; -} - -.carousel .active.right { - left: 100%; -} - -.carousel-control { - position: absolute; - top: 40%; - left: 15px; - width: 40px; - height: 40px; - margin-top: -20px; - font-size: 60px; - font-weight: 100; - line-height: 30px; - color: #ffffff; - text-align: center; - background: #222222; - border: 3px solid #ffffff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; - opacity: 0.5; - filter: alpha(opacity=50); -} - -.carousel-control.right { - right: 15px; - left: auto; -} - -.carousel-control:hover { - color: #ffffff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} - -.carousel-caption { - position: absolute; - right: 0; - bottom: 0; - left: 0; - padding: 15px; - background: #333333; - background: rgba(0, 0, 0, 0.75); -} - -.carousel-caption h4, -.carousel-caption p { - line-height: 20px; - color: #ffffff; -} - -.carousel-caption h4 { - margin: 0 0 5px; -} - -.carousel-caption p { - margin-bottom: 0; -} - -.hero-unit { - padding: 60px; - margin-bottom: 30px; - background-color: #eeeeee; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - letter-spacing: -1px; - color: inherit; -} - -.hero-unit p { - font-size: 18px; - font-weight: 200; - line-height: 30px; - color: inherit; -} - -.pull-right { - float: right; -} - -.pull-left { - float: left; -} - -.hide { - display: none; -} - -.show { - display: block; -} - -.invisible { - visibility: hidden; -} - -.affix { - position: fixed; -} diff --git a/examples/editors/aloha.html b/examples/editors/aloha.html new file mode 100644 index 000000000..583151060 --- /dev/null +++ b/examples/editors/aloha.html @@ -0,0 +1,63 @@ + + + + + Aloha Editor Example + + + + + +
+

Here is a picture of my dog, Kogepan:

+

+ +

+

+ I should really use an ABBR tag in this paragraph because QUAIL is an acronym. +

+
+
+ + + + + + + + + + diff --git a/examples/wysiwyg/ckeditor.html b/examples/editors/ckeditor.html similarity index 80% rename from examples/wysiwyg/ckeditor.html rename to examples/editors/ckeditor.html index 1b3924e14..37f31c4a3 100644 --- a/examples/wysiwyg/ckeditor.html +++ b/examples/editors/ckeditor.html @@ -17,10 +17,10 @@ - - - - + + + + + + + + + + diff --git a/examples/php/data/stats.json b/examples/php/data/stats.json index 69d615a41..0ae77b07d 100644 --- a/examples/php/data/stats.json +++ b/examples/php/data/stats.json @@ -1 +1 @@ -{"severe":"1","moderate":"1","suggestion":"0"} \ No newline at end of file +{"severe":"0","moderate":"0","suggestion":"0"} \ No newline at end of file diff --git a/examples/php/edit.html b/examples/php/edit.html index f29e30447..6552fbaf7 100644 --- a/examples/php/edit.html +++ b/examples/php/edit.html @@ -3,7 +3,7 @@ Sample page | My CMS - + - - -
- - - -
-
-

Element <== Open a JavaScript console and click it !

- - - - diff --git a/libs/jquery.pxToEm/README.md b/libs/jquery.pxToEm/README.md deleted file mode 100755 index 01b7d6bbe..000000000 --- a/libs/jquery.pxToEm/README.md +++ /dev/null @@ -1,7 +0,0 @@ -Using em units in CSS layout allows for page components to scale in unison with a user's font-size preferences. But developing in ems within dynamically updating web apps can be very tricky. Earlier we released a script to quickly convert pixel values to ems (and vice versa) to support page scalability throughout a web site or application. We've rewritten the plugin to better follow jQuery syntax and reduce code weight, and are now releasing an updated version for download. - -## Demos & Documentation: - -[Update: jQuery Plugin for Retaining Scalable Interfaces with Pixel-to-Em Conversion](http://filamentgroup.com/lab/update_jquery_plugin_for_retaining_scalable_interfaces_with_pixel_to_em_con/) - - diff --git a/libs/jquery.pxToEm/demo/arrow.gif b/libs/jquery.pxToEm/demo/arrow.gif deleted file mode 100755 index 2903efa3d..000000000 Binary files a/libs/jquery.pxToEm/demo/arrow.gif and /dev/null differ diff --git a/libs/jquery.pxToEm/demo/index.html b/libs/jquery.pxToEm/demo/index.html deleted file mode 100755 index bb29063b0..000000000 --- a/libs/jquery.pxToEm/demo/index.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - jQuery-Pixel-Em-Converter - - - - - - - - - - -
-
-
-
-
-
-
-
- - - \ No newline at end of file diff --git a/libs/jquery.pxToEm/license.txt b/libs/jquery.pxToEm/license.txt deleted file mode 100755 index 4d867da42..000000000 --- a/libs/jquery.pxToEm/license.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License - -Copyright (c) 2010 Filament Group, Inc - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/libs/jquery.pxToEm/pxem.jQuery.js b/libs/jquery.pxToEm/pxem.jQuery.js deleted file mode 100755 index 2bf8af187..000000000 --- a/libs/jquery.pxToEm/pxem.jQuery.js +++ /dev/null @@ -1,34 +0,0 @@ -/*-------------------------------------------------------------------- - * jQuery pixel/em conversion plugins: toEm() and toPx() - * by Scott Jehl (scott@filamentgroup.com), http://www.filamentgroup.com - * Copyright (c) Filament Group - * Dual licensed under the MIT (filamentgroup.com/examples/mit-license.txt) or GPL (filamentgroup.com/examples/gpl-license.txt) licenses. - * Article: http://www.filamentgroup.com/lab/update_jquery_plugin_for_retaining_scalable_interfaces_with_pixel_to_em_con/ - * Options: - scope: string or jQuery selector for font-size scoping - * Usage Example: $(myPixelValue).toEm(); or $(myEmValue).toPx(); ---------------------------------------------------------------------*/ -(function($) { - $.fn.toEm = function(settings){ - settings = jQuery.extend({ - scope: 'body' - }, settings); - var that = parseInt(this[0],10), - scopeTest = jQuery('
 
').appendTo(settings.scope), - scopeVal = scopeTest.height(); - scopeTest.remove(); - return (that / scopeVal).toFixed(8) + 'em'; - }; - - - $.fn.toPx = function(settings){ - settings = jQuery.extend({ - scope: 'body' - }, settings); - var that = parseFloat(this[0]), - scopeTest = jQuery('
 
').appendTo(settings.scope), - scopeVal = scopeTest.height(); - scopeTest.remove(); - return Math.round(that * scopeVal) + 'px'; - }; -})(jQuery); \ No newline at end of file diff --git a/libs/jquery/jquery.js b/libs/jquery/jquery.js deleted file mode 100644 index 3774ff986..000000000 --- a/libs/jquery/jquery.js +++ /dev/null @@ -1,9404 +0,0 @@ -/*! - * jQuery JavaScript Library v1.7.2 - * http://jquery.com/ - * - * Copyright 2011, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Wed Mar 21 12:46:34 2012 -0700 - */ -(function( window, undefined ) { - -// Use the correct document accordingly with window argument (sandbox) -var document = window.document, - navigator = window.navigator, - location = window.location; -var jQuery = (function() { - -// Define a local copy of jQuery -var jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context, rootjQuery ); - }, - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$, - - // A central reference to the root jQuery(document) - rootjQuery, - - // A simple way to check for HTML strings or ID strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, - - // Check if a string has a non-whitespace character in it - rnotwhite = /\S/, - - // Used for trimming whitespace - trimLeft = /^\s+/, - trimRight = /\s+$/, - - // Match a standalone tag - rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, - - // JSON RegExp - rvalidchars = /^[\],:{}\s]*$/, - rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, - rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, - rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, - - // Useragent RegExp - rwebkit = /(webkit)[ \/]([\w.]+)/, - ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, - rmsie = /(msie) ([\w.]+)/, - rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, - - // Matches dashed string for camelizing - rdashAlpha = /-([a-z]|[0-9])/ig, - rmsPrefix = /^-ms-/, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return ( letter + "" ).toUpperCase(); - }, - - // Keep a UserAgent string for use with jQuery.browser - userAgent = navigator.userAgent, - - // For matching the engine and version of the browser - browserMatch, - - // The deferred used on DOM ready - readyList, - - // The ready event handler - DOMContentLoaded, - - // Save a reference to some core methods - toString = Object.prototype.toString, - hasOwn = Object.prototype.hasOwnProperty, - push = Array.prototype.push, - slice = Array.prototype.slice, - trim = String.prototype.trim, - indexOf = Array.prototype.indexOf, - - // [[Class]] -> type pairs - class2type = {}; - -jQuery.fn = jQuery.prototype = { - constructor: jQuery, - init: function( selector, context, rootjQuery ) { - var match, elem, ret, doc; - - // Handle $(""), $(null), or $(undefined) - if ( !selector ) { - return this; - } - - // Handle $(DOMElement) - if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - } - - // The body element only exists once, optimize finding it - if ( selector === "body" && !context && document.body ) { - this.context = document; - this[0] = document.body; - this.selector = selector; - this.length = 1; - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - // Are we dealing with HTML string or an ID? - if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = quickExpr.exec( selector ); - } - - // Verify a match, and that no context was specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - doc = ( context ? context.ownerDocument || context : document ); - - // If a single string is passed in and it's a single tag - // just do a createElement and skip the rest - ret = rsingleTag.exec( selector ); - - if ( ret ) { - if ( jQuery.isPlainObject( context ) ) { - selector = [ document.createElement( ret[1] ) ]; - jQuery.fn.attr.call( selector, context, true ); - - } else { - selector = [ doc.createElement( ret[1] ) ]; - } - - } else { - ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); - selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; - } - - return jQuery.merge( this, selector ); - - // HANDLE: $("#id") - } else { - elem = document.getElementById( match[2] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id !== match[2] ) { - return rootjQuery.find( selector ); - } - - // Otherwise, we inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || rootjQuery ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return rootjQuery.ready( selector ); - } - - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }, - - // Start with an empty selector - selector: "", - - // The current version of jQuery being used - jquery: "1.7.2", - - // The default length of a jQuery object is 0 - length: 0, - - // The number of elements contained in the matched element set - size: function() { - return this.length; - }, - - toArray: function() { - return slice.call( this, 0 ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num == null ? - - // Return a 'clean' array - this.toArray() : - - // Return just the object - ( num < 0 ? this[ this.length + num ] : this[ num ] ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems, name, selector ) { - // Build a new jQuery matched element set - var ret = this.constructor(); - - if ( jQuery.isArray( elems ) ) { - push.apply( ret, elems ); - - } else { - jQuery.merge( ret, elems ); - } - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - ret.context = this.context; - - if ( name === "find" ) { - ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; - } else if ( name ) { - ret.selector = this.selector + "." + name + "(" + selector + ")"; - } - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - ready: function( fn ) { - // Attach the listeners - jQuery.bindReady(); - - // Add the callback - readyList.add( fn ); - - return this; - }, - - eq: function( i ) { - i = +i; - return i === -1 ? - this.slice( i ) : - this.slice( i, i + 1 ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ), - "slice", slice.call(arguments).join(",") ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { - return callback.call( elem, i, elem ); - })); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: [].sort, - splice: [].splice -}; - -// Give the init function the jQuery prototype for later instantiation -jQuery.fn.init.prototype = jQuery.fn; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if ( length === i ) { - target = this; - --i; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend({ - noConflict: function( deep ) { - if ( window.$ === jQuery ) { - window.$ = _$; - } - - if ( deep && window.jQuery === jQuery ) { - window.jQuery = _jQuery; - } - - return jQuery; - }, - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - // Either a released hold or an DOMready/load event and not yet ready - if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( !document.body ) { - return setTimeout( jQuery.ready, 1 ); - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.fireWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.trigger ) { - jQuery( document ).trigger( "ready" ).off( "ready" ); - } - } - }, - - bindReady: function() { - if ( readyList ) { - return; - } - - readyList = jQuery.Callbacks( "once memory" ); - - // Catch cases where $(document).ready() is called after the - // browser event has already occurred. - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - return setTimeout( jQuery.ready, 1 ); - } - - // Mozilla, Opera and webkit nightlies currently support this event - if ( document.addEventListener ) { - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", jQuery.ready, false ); - - // If IE event model is used - } else if ( document.attachEvent ) { - // ensure firing before onload, - // maybe late but safe also for iframes - document.attachEvent( "onreadystatechange", DOMContentLoaded ); - - // A fallback to window.onload, that will always work - window.attachEvent( "onload", jQuery.ready ); - - // If IE and not a frame - // continually check to see if the document is ready - var toplevel = false; - - try { - toplevel = window.frameElement == null; - } catch(e) {} - - if ( document.documentElement.doScroll && toplevel ) { - doScrollCheck(); - } - } - }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray || function( obj ) { - return jQuery.type(obj) === "array"; - }, - - isWindow: function( obj ) { - return obj != null && obj == obj.window; - }, - - isNumeric: function( obj ) { - return !isNaN( parseFloat(obj) ) && isFinite( obj ); - }, - - type: function( obj ) { - return obj == null ? - String( obj ) : - class2type[ toString.call(obj) ] || "object"; - }, - - isPlainObject: function( obj ) { - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - try { - // Not own constructor property must be Object - if ( obj.constructor && - !hasOwn.call(obj, "constructor") && - !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { - return false; - } - } catch ( e ) { - // IE8,9 Will throw exceptions on certain host objects #9897 - return false; - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - - var key; - for ( key in obj ) {} - - return key === undefined || hasOwn.call( obj, key ); - }, - - isEmptyObject: function( obj ) { - for ( var name in obj ) { - return false; - } - return true; - }, - - error: function( msg ) { - throw new Error( msg ); - }, - - parseJSON: function( data ) { - if ( typeof data !== "string" || !data ) { - return null; - } - - // Make sure leading/trailing whitespace is removed (IE can't handle it) - data = jQuery.trim( data ); - - // Attempt to parse using the native JSON parser first - if ( window.JSON && window.JSON.parse ) { - return window.JSON.parse( data ); - } - - // Make sure the incoming data is actual JSON - // Logic borrowed from http://json.org/json2.js - if ( rvalidchars.test( data.replace( rvalidescape, "@" ) - .replace( rvalidtokens, "]" ) - .replace( rvalidbraces, "")) ) { - - return ( new Function( "return " + data ) )(); - - } - jQuery.error( "Invalid JSON: " + data ); - }, - - // Cross-browser xml parsing - parseXML: function( data ) { - if ( typeof data !== "string" || !data ) { - return null; - } - var xml, tmp; - try { - if ( window.DOMParser ) { // Standard - tmp = new DOMParser(); - xml = tmp.parseFromString( data , "text/xml" ); - } else { // IE - xml = new ActiveXObject( "Microsoft.XMLDOM" ); - xml.async = "false"; - xml.loadXML( data ); - } - } catch( e ) { - xml = undefined; - } - if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; - }, - - noop: function() {}, - - // Evaluates a script in a global context - // Workarounds based on findings by Jim Driscoll - // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context - globalEval: function( data ) { - if ( data && rnotwhite.test( data ) ) { - // We use execScript on Internet Explorer - // We use an anonymous function so that context is window - // rather than jQuery in Firefox - ( window.execScript || function( data ) { - window[ "eval" ].call( window, data ); - } )( data ); - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); - }, - - // args is for internal usage only - each: function( object, callback, args ) { - var name, i = 0, - length = object.length, - isObj = length === undefined || jQuery.isFunction( object ); - - if ( args ) { - if ( isObj ) { - for ( name in object ) { - if ( callback.apply( object[ name ], args ) === false ) { - break; - } - } - } else { - for ( ; i < length; ) { - if ( callback.apply( object[ i++ ], args ) === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isObj ) { - for ( name in object ) { - if ( callback.call( object[ name ], name, object[ name ] ) === false ) { - break; - } - } - } else { - for ( ; i < length; ) { - if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { - break; - } - } - } - } - - return object; - }, - - // Use native String.trim function wherever possible - trim: trim ? - function( text ) { - return text == null ? - "" : - trim.call( text ); - } : - - // Otherwise use our own trimming functionality - function( text ) { - return text == null ? - "" : - text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); - }, - - // results is for internal usage only - makeArray: function( array, results ) { - var ret = results || []; - - if ( array != null ) { - // The window, strings (and functions) also have 'length' - // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 - var type = jQuery.type( array ); - - if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { - push.call( ret, array ); - } else { - jQuery.merge( ret, array ); - } - } - - return ret; - }, - - inArray: function( elem, array, i ) { - var len; - - if ( array ) { - if ( indexOf ) { - return indexOf.call( array, elem, i ); - } - - len = array.length; - i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; - - for ( ; i < len; i++ ) { - // Skip accessing in sparse arrays - if ( i in array && array[ i ] === elem ) { - return i; - } - } - } - - return -1; - }, - - merge: function( first, second ) { - var i = first.length, - j = 0; - - if ( typeof second.length === "number" ) { - for ( var l = second.length; j < l; j++ ) { - first[ i++ ] = second[ j ]; - } - - } else { - while ( second[j] !== undefined ) { - first[ i++ ] = second[ j++ ]; - } - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, inv ) { - var ret = [], retVal; - inv = !!inv; - - // Go through the array, only saving the items - // that pass the validator function - for ( var i = 0, length = elems.length; i < length; i++ ) { - retVal = !!callback( elems[ i ], i ); - if ( inv !== retVal ) { - ret.push( elems[ i ] ); - } - } - - return ret; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, key, ret = [], - i = 0, - length = elems.length, - // jquery objects are treated as arrays - isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; - - // Go through the array, translating each of the items to their - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - - // Go through every key on the object, - } else { - for ( key in elems ) { - value = callback( elems[ key ], key, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - } - - // Flatten any nested arrays - return ret.concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - if ( typeof context === "string" ) { - var tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - var args = slice.call( arguments, 2 ), - proxy = function() { - return fn.apply( context, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; - - return proxy; - }, - - // Mutifunctional method to get and set values to a collection - // The value/s can optionally be executed if it's a function - access: function( elems, fn, key, value, chainable, emptyGet, pass ) { - var exec, - bulk = key == null, - i = 0, - length = elems.length; - - // Sets many values - if ( key && typeof key === "object" ) { - for ( i in key ) { - jQuery.access( elems, fn, i, key[i], 1, emptyGet, value ); - } - chainable = 1; - - // Sets one value - } else if ( value !== undefined ) { - // Optionally, function values get executed if exec is true - exec = pass === undefined && jQuery.isFunction( value ); - - if ( bulk ) { - // Bulk operations only iterate when executing function values - if ( exec ) { - exec = fn; - fn = function( elem, key, value ) { - return exec.call( jQuery( elem ), value ); - }; - - // Otherwise they run against the entire set - } else { - fn.call( elems, value ); - fn = null; - } - } - - if ( fn ) { - for (; i < length; i++ ) { - fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); - } - } - - chainable = 1; - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call( elems ) : - length ? fn( elems[0], key ) : emptyGet; - }, - - now: function() { - return ( new Date() ).getTime(); - }, - - // Use of jQuery.browser is frowned upon. - // More details: http://docs.jquery.com/Utilities/jQuery.browser - uaMatch: function( ua ) { - ua = ua.toLowerCase(); - - var match = rwebkit.exec( ua ) || - ropera.exec( ua ) || - rmsie.exec( ua ) || - ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || - []; - - return { browser: match[1] || "", version: match[2] || "0" }; - }, - - sub: function() { - function jQuerySub( selector, context ) { - return new jQuerySub.fn.init( selector, context ); - } - jQuery.extend( true, jQuerySub, this ); - jQuerySub.superclass = this; - jQuerySub.fn = jQuerySub.prototype = this(); - jQuerySub.fn.constructor = jQuerySub; - jQuerySub.sub = this.sub; - jQuerySub.fn.init = function init( selector, context ) { - if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { - context = jQuerySub( context ); - } - - return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); - }; - jQuerySub.fn.init.prototype = jQuerySub.fn; - var rootjQuerySub = jQuerySub(document); - return jQuerySub; - }, - - browser: {} -}); - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -browserMatch = jQuery.uaMatch( userAgent ); -if ( browserMatch.browser ) { - jQuery.browser[ browserMatch.browser ] = true; - jQuery.browser.version = browserMatch.version; -} - -// Deprecated, use jQuery.browser.webkit instead -if ( jQuery.browser.webkit ) { - jQuery.browser.safari = true; -} - -// IE doesn't match non-breaking spaces with \s -if ( rnotwhite.test( "\xA0" ) ) { - trimLeft = /^[\s\xA0]+/; - trimRight = /[\s\xA0]+$/; -} - -// All jQuery objects should point back to these -rootjQuery = jQuery(document); - -// Cleanup functions for the document ready method -if ( document.addEventListener ) { - DOMContentLoaded = function() { - document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - jQuery.ready(); - }; - -} else if ( document.attachEvent ) { - DOMContentLoaded = function() { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( document.readyState === "complete" ) { - document.detachEvent( "onreadystatechange", DOMContentLoaded ); - jQuery.ready(); - } - }; -} - -// The DOM ready check for Internet Explorer -function doScrollCheck() { - if ( jQuery.isReady ) { - return; - } - - try { - // If IE is used, use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - document.documentElement.doScroll("left"); - } catch(e) { - setTimeout( doScrollCheck, 1 ); - return; - } - - // and execute any waiting functions - jQuery.ready(); -} - -return jQuery; - -})(); - - -// String to Object flags format cache -var flagsCache = {}; - -// Convert String-formatted flags into Object-formatted ones and store in cache -function createFlags( flags ) { - var object = flagsCache[ flags ] = {}, - i, length; - flags = flags.split( /\s+/ ); - for ( i = 0, length = flags.length; i < length; i++ ) { - object[ flags[i] ] = true; - } - return object; -} - -/* - * Create a callback list using the following parameters: - * - * flags: an optional list of space-separated flags that will change how - * the callback list behaves - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible flags: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( flags ) { - - // Convert flags from String-formatted to Object-formatted - // (we check in cache first) - flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; - - var // Actual callback list - list = [], - // Stack of fire calls for repeatable lists - stack = [], - // Last fire value (for non-forgettable lists) - memory, - // Flag to know if list was already fired - fired, - // Flag to know if list is currently firing - firing, - // First callback to fire (used internally by add and fireWith) - firingStart, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, - // Add one or several callbacks to the list - add = function( args ) { - var i, - length, - elem, - type, - actual; - for ( i = 0, length = args.length; i < length; i++ ) { - elem = args[ i ]; - type = jQuery.type( elem ); - if ( type === "array" ) { - // Inspect recursively - add( elem ); - } else if ( type === "function" ) { - // Add if not in unique mode and callback is not in - if ( !flags.unique || !self.has( elem ) ) { - list.push( elem ); - } - } - } - }, - // Fire callbacks - fire = function( context, args ) { - args = args || []; - memory = !flags.memory || [ context, args ]; - fired = true; - firing = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - for ( ; list && firingIndex < firingLength; firingIndex++ ) { - if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { - memory = true; // Mark as halted - break; - } - } - firing = false; - if ( list ) { - if ( !flags.once ) { - if ( stack && stack.length ) { - memory = stack.shift(); - self.fireWith( memory[ 0 ], memory[ 1 ] ); - } - } else if ( memory === true ) { - self.disable(); - } else { - list = []; - } - } - }, - // Actual Callbacks object - self = { - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - var length = list.length; - add( arguments ); - // Do we need to add the callbacks to the - // current firing batch? - if ( firing ) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away, unless previous - // firing was halted (stopOnFalse) - } else if ( memory && memory !== true ) { - firingStart = length; - fire( memory[ 0 ], memory[ 1 ] ); - } - } - return this; - }, - // Remove a callback from the list - remove: function() { - if ( list ) { - var args = arguments, - argIndex = 0, - argLength = args.length; - for ( ; argIndex < argLength ; argIndex++ ) { - for ( var i = 0; i < list.length; i++ ) { - if ( args[ argIndex ] === list[ i ] ) { - // Handle firingIndex and firingLength - if ( firing ) { - if ( i <= firingLength ) { - firingLength--; - if ( i <= firingIndex ) { - firingIndex--; - } - } - } - // Remove the element - list.splice( i--, 1 ); - // If we have some unicity property then - // we only need to do this once - if ( flags.unique ) { - break; - } - } - } - } - } - return this; - }, - // Control if a given callback is in the list - has: function( fn ) { - if ( list ) { - var i = 0, - length = list.length; - for ( ; i < length; i++ ) { - if ( fn === list[ i ] ) { - return true; - } - } - } - return false; - }, - // Remove all callbacks from the list - empty: function() { - list = []; - return this; - }, - // Have the list do nothing anymore - disable: function() { - list = stack = memory = undefined; - return this; - }, - // Is it disabled? - disabled: function() { - return !list; - }, - // Lock the list in its current state - lock: function() { - stack = undefined; - if ( !memory || memory === true ) { - self.disable(); - } - return this; - }, - // Is it locked? - locked: function() { - return !stack; - }, - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( stack ) { - if ( firing ) { - if ( !flags.once ) { - stack.push( [ context, args ] ); - } - } else if ( !( flags.once && memory ) ) { - fire( context, args ); - } - } - return this; - }, - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - - - -var // Static reference to slice - sliceDeferred = [].slice; - -jQuery.extend({ - - Deferred: function( func ) { - var doneList = jQuery.Callbacks( "once memory" ), - failList = jQuery.Callbacks( "once memory" ), - progressList = jQuery.Callbacks( "memory" ), - state = "pending", - lists = { - resolve: doneList, - reject: failList, - notify: progressList - }, - promise = { - done: doneList.add, - fail: failList.add, - progress: progressList.add, - - state: function() { - return state; - }, - - // Deprecated - isResolved: doneList.fired, - isRejected: failList.fired, - - then: function( doneCallbacks, failCallbacks, progressCallbacks ) { - deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); - return this; - }, - always: function() { - deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); - return this; - }, - pipe: function( fnDone, fnFail, fnProgress ) { - return jQuery.Deferred(function( newDefer ) { - jQuery.each( { - done: [ fnDone, "resolve" ], - fail: [ fnFail, "reject" ], - progress: [ fnProgress, "notify" ] - }, function( handler, data ) { - var fn = data[ 0 ], - action = data[ 1 ], - returned; - if ( jQuery.isFunction( fn ) ) { - deferred[ handler ](function() { - returned = fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); - } else { - newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); - } - }); - } else { - deferred[ handler ]( newDefer[ action ] ); - } - }); - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - if ( obj == null ) { - obj = promise; - } else { - for ( var key in promise ) { - obj[ key ] = promise[ key ]; - } - } - return obj; - } - }, - deferred = promise.promise({}), - key; - - for ( key in lists ) { - deferred[ key ] = lists[ key ].fire; - deferred[ key + "With" ] = lists[ key ].fireWith; - } - - // Handle state - deferred.done( function() { - state = "resolved"; - }, failList.disable, progressList.lock ).fail( function() { - state = "rejected"; - }, doneList.disable, progressList.lock ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( firstParam ) { - var args = sliceDeferred.call( arguments, 0 ), - i = 0, - length = args.length, - pValues = new Array( length ), - count = length, - pCount = length, - deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? - firstParam : - jQuery.Deferred(), - promise = deferred.promise(); - function resolveFunc( i ) { - return function( value ) { - args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; - if ( !( --count ) ) { - deferred.resolveWith( deferred, args ); - } - }; - } - function progressFunc( i ) { - return function( value ) { - pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; - deferred.notifyWith( promise, pValues ); - }; - } - if ( length > 1 ) { - for ( ; i < length; i++ ) { - if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { - args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); - } else { - --count; - } - } - if ( !count ) { - deferred.resolveWith( deferred, args ); - } - } else if ( deferred !== firstParam ) { - deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); - } - return promise; - } -}); - - - - -jQuery.support = (function() { - - var support, - all, - a, - select, - opt, - input, - fragment, - tds, - events, - eventName, - i, - isSupported, - div = document.createElement( "div" ), - documentElement = document.documentElement; - - // Preliminary tests - div.setAttribute("className", "t"); - div.innerHTML = "
a"; - - all = div.getElementsByTagName( "*" ); - a = div.getElementsByTagName( "a" )[ 0 ]; - - // Can't get basic test support - if ( !all || !all.length || !a ) { - return {}; - } - - // First batch of supports tests - select = document.createElement( "select" ); - opt = select.appendChild( document.createElement("option") ); - input = div.getElementsByTagName( "input" )[ 0 ]; - - support = { - // IE strips leading whitespace when .innerHTML is used - leadingWhitespace: ( div.firstChild.nodeType === 3 ), - - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - tbody: !div.getElementsByTagName("tbody").length, - - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - htmlSerialize: !!div.getElementsByTagName("link").length, - - // Get the style information from getAttribute - // (IE uses .cssText instead) - style: /top/.test( a.getAttribute("style") ), - - // Make sure that URLs aren't manipulated - // (IE normalizes it by default) - hrefNormalized: ( a.getAttribute("href") === "/a" ), - - // Make sure that element opacity exists - // (IE uses filter instead) - // Use a regex to work around a WebKit issue. See #5145 - opacity: /^0.55/.test( a.style.opacity ), - - // Verify style float existence - // (IE uses styleFloat instead of cssFloat) - cssFloat: !!a.style.cssFloat, - - // Make sure that if no value is specified for a checkbox - // that it defaults to "on". - // (WebKit defaults to "" instead) - checkOn: ( input.value === "on" ), - - // Make sure that a selected-by-default option has a working selected property. - // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) - optSelected: opt.selected, - - // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) - getSetAttribute: div.className !== "t", - - // Tests for enctype support on a form(#6743) - enctype: !!document.createElement("form").enctype, - - // Makes sure cloning an html5 element does not cause problems - // Where outerHTML is undefined, this still works - html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", - - // Will be defined later - submitBubbles: true, - changeBubbles: true, - focusinBubbles: false, - deleteExpando: true, - noCloneEvent: true, - inlineBlockNeedsLayout: false, - shrinkWrapBlocks: false, - reliableMarginRight: true, - pixelMargin: true - }; - - // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead - jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat"); - - // Make sure checked status is properly cloned - input.checked = true; - support.noCloneChecked = input.cloneNode( true ).checked; - - // Make sure that the options inside disabled selects aren't marked as disabled - // (WebKit marks them as disabled) - select.disabled = true; - support.optDisabled = !opt.disabled; - - // Test to see if it's possible to delete an expando from an element - // Fails in Internet Explorer - try { - delete div.test; - } catch( e ) { - support.deleteExpando = false; - } - - if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { - div.attachEvent( "onclick", function() { - // Cloning a node shouldn't copy over any - // bound event handlers (IE does this) - support.noCloneEvent = false; - }); - div.cloneNode( true ).fireEvent( "onclick" ); - } - - // Check if a radio maintains its value - // after being appended to the DOM - input = document.createElement("input"); - input.value = "t"; - input.setAttribute("type", "radio"); - support.radioValue = input.value === "t"; - - input.setAttribute("checked", "checked"); - - // #11217 - WebKit loses check when the name is after the checked attribute - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - fragment = document.createDocumentFragment(); - fragment.appendChild( div.lastChild ); - - // WebKit doesn't clone checked state correctly in fragments - support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Check if a disconnected checkbox will retain its checked - // value of true after appended to the DOM (IE6/7) - support.appendChecked = input.checked; - - fragment.removeChild( input ); - fragment.appendChild( div ); - - // Technique from Juriy Zaytsev - // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ - // We only care about the case where non-standard event systems - // are used, namely in IE. Short-circuiting here helps us to - // avoid an eval call (in setAttribute) which can cause CSP - // to go haywire. See: https://developer.mozilla.org/en/Security/CSP - if ( div.attachEvent ) { - for ( i in { - submit: 1, - change: 1, - focusin: 1 - }) { - eventName = "on" + i; - isSupported = ( eventName in div ); - if ( !isSupported ) { - div.setAttribute( eventName, "return;" ); - isSupported = ( typeof div[ eventName ] === "function" ); - } - support[ i + "Bubbles" ] = isSupported; - } - } - - fragment.removeChild( div ); - - // Null elements to avoid leaks in IE - fragment = select = opt = div = input = null; - - // Run tests that need a body at doc ready - jQuery(function() { - var container, outer, inner, table, td, offsetSupport, - marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight, - paddingMarginBorderVisibility, paddingMarginBorder, - body = document.getElementsByTagName("body")[0]; - - if ( !body ) { - // Return for frameset docs that don't have a body - return; - } - - conMarginTop = 1; - paddingMarginBorder = "padding:0;margin:0;border:"; - positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;"; - paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;"; - style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;"; - html = "
" + - "" + - "
"; - - container = document.createElement("div"); - container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; - body.insertBefore( container, body.firstChild ); - - // Construct the test element - div = document.createElement("div"); - container.appendChild( div ); - - // Check if table cells still have offsetWidth/Height when they are set - // to display:none and there are still other visible table cells in a - // table row; if so, offsetWidth/Height are not reliable for use when - // determining if an element has been hidden directly using - // display:none (it is still safe to use offsets if a parent element is - // hidden; don safety goggles and see bug #4512 for more information). - // (only IE 8 fails this test) - div.innerHTML = "
t
"; - tds = div.getElementsByTagName( "td" ); - isSupported = ( tds[ 0 ].offsetHeight === 0 ); - - tds[ 0 ].style.display = ""; - tds[ 1 ].style.display = "none"; - - // Check if empty table cells still have offsetWidth/Height - // (IE <= 8 fail this test) - support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); - - // Check if div with explicit width and no margin-right incorrectly - // gets computed margin-right based on width of container. For more - // info see bug #3333 - // Fails in WebKit before Feb 2011 nightlies - // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right - if ( window.getComputedStyle ) { - div.innerHTML = ""; - marginDiv = document.createElement( "div" ); - marginDiv.style.width = "0"; - marginDiv.style.marginRight = "0"; - div.style.width = "2px"; - div.appendChild( marginDiv ); - support.reliableMarginRight = - ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; - } - - if ( typeof div.style.zoom !== "undefined" ) { - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - // (IE < 8 does this) - div.innerHTML = ""; - div.style.width = div.style.padding = "1px"; - div.style.border = 0; - div.style.overflow = "hidden"; - div.style.display = "inline"; - div.style.zoom = 1; - support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); - - // Check if elements with layout shrink-wrap their children - // (IE 6 does this) - div.style.display = "block"; - div.style.overflow = "visible"; - div.innerHTML = "
"; - support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); - } - - div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility; - div.innerHTML = html; - - outer = div.firstChild; - inner = outer.firstChild; - td = outer.nextSibling.firstChild.firstChild; - - offsetSupport = { - doesNotAddBorder: ( inner.offsetTop !== 5 ), - doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) - }; - - inner.style.position = "fixed"; - inner.style.top = "20px"; - - // safari subtracts parent border width here which is 5px - offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); - inner.style.position = inner.style.top = ""; - - outer.style.overflow = "hidden"; - outer.style.position = "relative"; - - offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); - offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); - - if ( window.getComputedStyle ) { - div.style.marginTop = "1%"; - support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%"; - } - - if ( typeof container.style.zoom !== "undefined" ) { - container.style.zoom = 1; - } - - body.removeChild( container ); - marginDiv = div = container = null; - - jQuery.extend( support, offsetSupport ); - }); - - return support; -})(); - - - - -var rbrace = /^(?:\{.*\}|\[.*\])$/, - rmultiDash = /([A-Z])/g; - -jQuery.extend({ - cache: {}, - - // Please use with caution - uuid: 0, - - // Unique for each copy of jQuery on the page - // Non-digits removed to match rinlinejQuery - expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), - - // The following elements throw uncatchable exceptions if you - // attempt to add expando properties to them. - noData: { - "embed": true, - // Ban all objects except for Flash (which handle expandos) - "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", - "applet": true - }, - - hasData: function( elem ) { - elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; - return !!elem && !isEmptyDataObject( elem ); - }, - - data: function( elem, name, data, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var privateCache, thisCache, ret, - internalKey = jQuery.expando, - getByName = typeof name === "string", - - // We have to handle DOM nodes and JS objects differently because IE6-7 - // can't GC object references properly across the DOM-JS boundary - isNode = elem.nodeType, - - // Only DOM nodes need the global jQuery cache; JS object data is - // attached directly to the object so GC can occur automatically - cache = isNode ? jQuery.cache : elem, - - // Only defining an ID for JS objects if its cache already exists allows - // the code to shortcut on the same path as a DOM node with no cache - id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, - isEvents = name === "events"; - - // Avoid doing any more work than we need to when trying to get data on an - // object that has no data at all - if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { - return; - } - - if ( !id ) { - // Only DOM nodes need a new unique ID for each element since their data - // ends up in the global cache - if ( isNode ) { - elem[ internalKey ] = id = ++jQuery.uuid; - } else { - id = internalKey; - } - } - - if ( !cache[ id ] ) { - cache[ id ] = {}; - - // Avoids exposing jQuery metadata on plain JS objects when the object - // is serialized using JSON.stringify - if ( !isNode ) { - cache[ id ].toJSON = jQuery.noop; - } - } - - // An object can be passed to jQuery.data instead of a key/value pair; this gets - // shallow copied over onto the existing cache - if ( typeof name === "object" || typeof name === "function" ) { - if ( pvt ) { - cache[ id ] = jQuery.extend( cache[ id ], name ); - } else { - cache[ id ].data = jQuery.extend( cache[ id ].data, name ); - } - } - - privateCache = thisCache = cache[ id ]; - - // jQuery data() is stored in a separate object inside the object's internal data - // cache in order to avoid key collisions between internal data and user-defined - // data. - if ( !pvt ) { - if ( !thisCache.data ) { - thisCache.data = {}; - } - - thisCache = thisCache.data; - } - - if ( data !== undefined ) { - thisCache[ jQuery.camelCase( name ) ] = data; - } - - // Users should not attempt to inspect the internal events object using jQuery.data, - // it is undocumented and subject to change. But does anyone listen? No. - if ( isEvents && !thisCache[ name ] ) { - return privateCache.events; - } - - // Check for both converted-to-camel and non-converted data property names - // If a data property was specified - if ( getByName ) { - - // First Try to find as-is property data - ret = thisCache[ name ]; - - // Test for null|undefined property data - if ( ret == null ) { - - // Try to find the camelCased property - ret = thisCache[ jQuery.camelCase( name ) ]; - } - } else { - ret = thisCache; - } - - return ret; - }, - - removeData: function( elem, name, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var thisCache, i, l, - - // Reference to internal data cache key - internalKey = jQuery.expando, - - isNode = elem.nodeType, - - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, - - // See jQuery.data for more information - id = isNode ? elem[ internalKey ] : internalKey; - - // If there is already no cache entry for this object, there is no - // purpose in continuing - if ( !cache[ id ] ) { - return; - } - - if ( name ) { - - thisCache = pvt ? cache[ id ] : cache[ id ].data; - - if ( thisCache ) { - - // Support array or space separated string names for data keys - if ( !jQuery.isArray( name ) ) { - - // try the string as a key before any manipulation - if ( name in thisCache ) { - name = [ name ]; - } else { - - // split the camel cased version by spaces unless a key with the spaces exists - name = jQuery.camelCase( name ); - if ( name in thisCache ) { - name = [ name ]; - } else { - name = name.split( " " ); - } - } - } - - for ( i = 0, l = name.length; i < l; i++ ) { - delete thisCache[ name[i] ]; - } - - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { - return; - } - } - } - - // See jQuery.data for more information - if ( !pvt ) { - delete cache[ id ].data; - - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if ( !isEmptyDataObject(cache[ id ]) ) { - return; - } - } - - // Browsers that fail expando deletion also refuse to delete expandos on - // the window, but it will allow it on all other JS objects; other browsers - // don't care - // Ensure that `cache` is not a window object #10080 - if ( jQuery.support.deleteExpando || !cache.setInterval ) { - delete cache[ id ]; - } else { - cache[ id ] = null; - } - - // We destroyed the cache and need to eliminate the expando on the node to avoid - // false lookups in the cache for entries that no longer exist - if ( isNode ) { - // IE does not allow us to delete expando properties from nodes, - // nor does it have a removeAttribute function on Document nodes; - // we must handle all of these cases - if ( jQuery.support.deleteExpando ) { - delete elem[ internalKey ]; - } else if ( elem.removeAttribute ) { - elem.removeAttribute( internalKey ); - } else { - elem[ internalKey ] = null; - } - } - }, - - // For internal use only. - _data: function( elem, name, data ) { - return jQuery.data( elem, name, data, true ); - }, - - // A method for determining if a DOM node can handle the data expando - acceptData: function( elem ) { - if ( elem.nodeName ) { - var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; - - if ( match ) { - return !(match === true || elem.getAttribute("classid") !== match); - } - } - - return true; - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var parts, part, attr, name, l, - elem = this[0], - i = 0, - data = null; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = jQuery.data( elem ); - - if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { - attr = elem.attributes; - for ( l = attr.length; i < l; i++ ) { - name = attr[i].name; - - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.substring(5) ); - - dataAttr( elem, name, data[ name ] ); - } - } - jQuery._data( elem, "parsedAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each(function() { - jQuery.data( this, key ); - }); - } - - parts = key.split( ".", 2 ); - parts[1] = parts[1] ? "." + parts[1] : ""; - part = parts[1] + "!"; - - return jQuery.access( this, function( value ) { - - if ( value === undefined ) { - data = this.triggerHandler( "getData" + part, [ parts[0] ] ); - - // Try to fetch any internally stored data first - if ( data === undefined && elem ) { - data = jQuery.data( elem, key ); - data = dataAttr( elem, key, data ); - } - - return data === undefined && parts[1] ? - this.data( parts[0] ) : - data; - } - - parts[1] = value; - this.each(function() { - var self = jQuery( this ); - - self.triggerHandler( "setData" + part, parts ); - jQuery.data( this, key, value ); - self.triggerHandler( "changeData" + part, parts ); - }); - }, null, value, arguments.length > 1, null, false ); - }, - - removeData: function( key ) { - return this.each(function() { - jQuery.removeData( this, key ); - }); - } -}); - -function dataAttr( elem, key, data ) { - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - - var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - jQuery.isNumeric( data ) ? +data : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - jQuery.data( elem, key, data ); - - } else { - data = undefined; - } - } - - return data; -} - -// checks a cache object for emptiness -function isEmptyDataObject( obj ) { - for ( var name in obj ) { - - // if the public data object is empty, the private is still empty - if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { - continue; - } - if ( name !== "toJSON" ) { - return false; - } - } - - return true; -} - - - - -function handleQueueMarkDefer( elem, type, src ) { - var deferDataKey = type + "defer", - queueDataKey = type + "queue", - markDataKey = type + "mark", - defer = jQuery._data( elem, deferDataKey ); - if ( defer && - ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && - ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { - // Give room for hard-coded callbacks to fire first - // and eventually mark/queue something else on the element - setTimeout( function() { - if ( !jQuery._data( elem, queueDataKey ) && - !jQuery._data( elem, markDataKey ) ) { - jQuery.removeData( elem, deferDataKey, true ); - defer.fire(); - } - }, 0 ); - } -} - -jQuery.extend({ - - _mark: function( elem, type ) { - if ( elem ) { - type = ( type || "fx" ) + "mark"; - jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); - } - }, - - _unmark: function( force, elem, type ) { - if ( force !== true ) { - type = elem; - elem = force; - force = false; - } - if ( elem ) { - type = type || "fx"; - var key = type + "mark", - count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); - if ( count ) { - jQuery._data( elem, key, count ); - } else { - jQuery.removeData( elem, key, true ); - handleQueueMarkDefer( elem, type, "mark" ); - } - } - }, - - queue: function( elem, type, data ) { - var q; - if ( elem ) { - type = ( type || "fx" ) + "queue"; - q = jQuery._data( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !q || jQuery.isArray(data) ) { - q = jQuery._data( elem, type, jQuery.makeArray(data) ); - } else { - q.push( data ); - } - } - return q || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - fn = queue.shift(), - hooks = {}; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - } - - if ( fn ) { - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - jQuery._data( elem, type + ".run", hooks ); - fn.call( elem, function() { - jQuery.dequeue( elem, type ); - }, hooks ); - } - - if ( !queue.length ) { - jQuery.removeData( elem, type + "queue " + type + ".run", true ); - handleQueueMarkDefer( elem, type, "queue" ); - } - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[0], type ); - } - - return data === undefined ? - this : - this.each(function() { - var queue = jQuery.queue( this, type, data ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - // Based off of the plugin by Clint Helfers, with permission. - // http://blindsignals.com/index.php/2009/07/jquery-delay/ - delay: function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = setTimeout( next, time ); - hooks.stop = function() { - clearTimeout( timeout ); - }; - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, object ) { - if ( typeof type !== "string" ) { - object = type; - type = undefined; - } - type = type || "fx"; - var defer = jQuery.Deferred(), - elements = this, - i = elements.length, - count = 1, - deferDataKey = type + "defer", - queueDataKey = type + "queue", - markDataKey = type + "mark", - tmp; - function resolve() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - } - while( i-- ) { - if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || - ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || - jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && - jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { - count++; - tmp.add( resolve ); - } - } - resolve(); - return defer.promise( object ); - } -}); - - - - -var rclass = /[\n\t\r]/g, - rspace = /\s+/, - rreturn = /\r/g, - rtype = /^(?:button|input)$/i, - rfocusable = /^(?:button|input|object|select|textarea)$/i, - rclickable = /^a(?:rea)?$/i, - rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, - getSetAttribute = jQuery.support.getSetAttribute, - nodeHook, boolHook, fixSpecified; - -jQuery.fn.extend({ - attr: function( name, value ) { - return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each(function() { - jQuery.removeAttr( this, name ); - }); - }, - - prop: function( name, value ) { - return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - name = jQuery.propFix[ name ] || name; - return this.each(function() { - // try/catch handles cases where IE balks (such as removing a property on window) - try { - this[ name ] = undefined; - delete this[ name ]; - } catch( e ) {} - }); - }, - - addClass: function( value ) { - var classNames, i, l, elem, - setClass, c, cl; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).addClass( value.call(this, j, this.className) ); - }); - } - - if ( value && typeof value === "string" ) { - classNames = value.split( rspace ); - - for ( i = 0, l = this.length; i < l; i++ ) { - elem = this[ i ]; - - if ( elem.nodeType === 1 ) { - if ( !elem.className && classNames.length === 1 ) { - elem.className = value; - - } else { - setClass = " " + elem.className + " "; - - for ( c = 0, cl = classNames.length; c < cl; c++ ) { - if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { - setClass += classNames[ c ] + " "; - } - } - elem.className = jQuery.trim( setClass ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classNames, i, l, elem, className, c, cl; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).removeClass( value.call(this, j, this.className) ); - }); - } - - if ( (value && typeof value === "string") || value === undefined ) { - classNames = ( value || "" ).split( rspace ); - - for ( i = 0, l = this.length; i < l; i++ ) { - elem = this[ i ]; - - if ( elem.nodeType === 1 && elem.className ) { - if ( value ) { - className = (" " + elem.className + " ").replace( rclass, " " ); - for ( c = 0, cl = classNames.length; c < cl; c++ ) { - className = className.replace(" " + classNames[ c ] + " ", " "); - } - elem.className = jQuery.trim( className ); - - } else { - elem.className = ""; - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isBool = typeof stateVal === "boolean"; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( i ) { - jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); - }); - } - - return this.each(function() { - if ( type === "string" ) { - // toggle individual class names - var className, - i = 0, - self = jQuery( this ), - state = stateVal, - classNames = value.split( rspace ); - - while ( (className = classNames[ i++ ]) ) { - // check each className given, space seperated list - state = isBool ? state : !self.hasClass( className ); - self[ state ? "addClass" : "removeClass" ]( className ); - } - - } else if ( type === "undefined" || type === "boolean" ) { - if ( this.className ) { - // store className if set - jQuery._data( this, "__className__", this.className ); - } - - // toggle whole className - this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; - } - }); - }, - - hasClass: function( selector ) { - var className = " " + selector + " ", - i = 0, - l = this.length; - for ( ; i < l; i++ ) { - if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { - return true; - } - } - - return false; - }, - - val: function( value ) { - var hooks, ret, isFunction, - elem = this[0]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { - return ret; - } - - ret = elem.value; - - return typeof ret === "string" ? - // handle most common string cases - ret.replace(rreturn, "") : - // handle cases where value is null/undef or number - ret == null ? "" : ret; - } - - return; - } - - isFunction = jQuery.isFunction( value ); - - return this.each(function( i ) { - var self = jQuery(this), val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, self.val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - } else if ( typeof val === "number" ) { - val += ""; - } else if ( jQuery.isArray( val ) ) { - val = jQuery.map(val, function ( value ) { - return value == null ? "" : value + ""; - }); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - }); - } -}); - -jQuery.extend({ - valHooks: { - option: { - get: function( elem ) { - // attributes.value is undefined in Blackberry 4.7 but - // uses .value. See #6932 - var val = elem.attributes.value; - return !val || val.specified ? elem.value : elem.text; - } - }, - select: { - get: function( elem ) { - var value, i, max, option, - index = elem.selectedIndex, - values = [], - options = elem.options, - one = elem.type === "select-one"; - - // Nothing was selected - if ( index < 0 ) { - return null; - } - - // Loop through all the selected options - i = one ? index : 0; - max = one ? index + 1 : options.length; - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Don't return options that are disabled or in a disabled optgroup - if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && - (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - // Fixes Bug #2551 -- select.val() broken in IE after form.reset() - if ( one && !values.length && options.length ) { - return jQuery( options[ index ] ).val(); - } - - return values; - }, - - set: function( elem, value ) { - var values = jQuery.makeArray( value ); - - jQuery(elem).find("option").each(function() { - this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; - }); - - if ( !values.length ) { - elem.selectedIndex = -1; - } - return values; - } - } - }, - - attrFn: { - val: true, - css: true, - html: true, - text: true, - data: true, - width: true, - height: true, - offset: true - }, - - attr: function( elem, name, value, pass ) { - var ret, hooks, notxml, - nType = elem.nodeType; - - // don't get/set attributes on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( pass && name in jQuery.attrFn ) { - return jQuery( elem )[ name ]( value ); - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - // All attributes are lowercase - // Grab necessary hook if one is defined - if ( notxml ) { - name = name.toLowerCase(); - hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); - } - - if ( value !== undefined ) { - - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - - } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - elem.setAttribute( name, "" + value ); - return value; - } - - } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - - ret = elem.getAttribute( name ); - - // Non-existent attributes return null, we normalize to undefined - return ret === null ? - undefined : - ret; - } - }, - - removeAttr: function( elem, value ) { - var propName, attrNames, name, l, isBool, - i = 0; - - if ( value && elem.nodeType === 1 ) { - attrNames = value.toLowerCase().split( rspace ); - l = attrNames.length; - - for ( ; i < l; i++ ) { - name = attrNames[ i ]; - - if ( name ) { - propName = jQuery.propFix[ name ] || name; - isBool = rboolean.test( name ); - - // See #9699 for explanation of this approach (setting first, then removal) - // Do not do this for boolean attributes (see #10870) - if ( !isBool ) { - jQuery.attr( elem, name, "" ); - } - elem.removeAttribute( getSetAttribute ? name : propName ); - - // Set corresponding property to false for boolean attributes - if ( isBool && propName in elem ) { - elem[ propName ] = false; - } - } - } - } - }, - - attrHooks: { - type: { - set: function( elem, value ) { - // We can't allow the type property to be changed (since it causes problems in IE) - if ( rtype.test( elem.nodeName ) && elem.parentNode ) { - jQuery.error( "type property can't be changed" ); - } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { - // Setting the type on a radio button after the value resets the value in IE6-9 - // Reset value to it's default in case type is set after value - // This is for element creation - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - }, - // Use the value property for back compat - // Use the nodeHook for button elements in IE6/7 (#1954) - value: { - get: function( elem, name ) { - if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { - return nodeHook.get( elem, name ); - } - return name in elem ? - elem.value : - null; - }, - set: function( elem, value, name ) { - if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { - return nodeHook.set( elem, value, name ); - } - // Does not return so that setAttribute is also used - elem.value = value; - } - } - }, - - propFix: { - tabindex: "tabIndex", - readonly: "readOnly", - "for": "htmlFor", - "class": "className", - maxlength: "maxLength", - cellspacing: "cellSpacing", - cellpadding: "cellPadding", - rowspan: "rowSpan", - colspan: "colSpan", - usemap: "useMap", - frameborder: "frameBorder", - contenteditable: "contentEditable" - }, - - prop: function( elem, name, value ) { - var ret, hooks, notxml, - nType = elem.nodeType; - - // don't get/set properties on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - if ( notxml ) { - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - return ( elem[ name ] = value ); - } - - } else { - if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - return elem[ name ]; - } - } - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set - // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - var attributeNode = elem.getAttributeNode("tabindex"); - - return attributeNode && attributeNode.specified ? - parseInt( attributeNode.value, 10 ) : - rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? - 0 : - undefined; - } - } - } -}); - -// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) -jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; - -// Hook for boolean attributes -boolHook = { - get: function( elem, name ) { - // Align boolean attributes with corresponding properties - // Fall back to attribute presence where some booleans are not supported - var attrNode, - property = jQuery.prop( elem, name ); - return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? - name.toLowerCase() : - undefined; - }, - set: function( elem, value, name ) { - var propName; - if ( value === false ) { - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - // value is true since we know at this point it's type boolean and not false - // Set boolean attributes to the same name and set the DOM property - propName = jQuery.propFix[ name ] || name; - if ( propName in elem ) { - // Only set the IDL specifically if it already exists on the element - elem[ propName ] = true; - } - - elem.setAttribute( name, name.toLowerCase() ); - } - return name; - } -}; - -// IE6/7 do not support getting/setting some attributes with get/setAttribute -if ( !getSetAttribute ) { - - fixSpecified = { - name: true, - id: true, - coords: true - }; - - // Use this for any attribute in IE6/7 - // This fixes almost every IE6/7 issue - nodeHook = jQuery.valHooks.button = { - get: function( elem, name ) { - var ret; - ret = elem.getAttributeNode( name ); - return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? - ret.nodeValue : - undefined; - }, - set: function( elem, value, name ) { - // Set the existing or create a new attribute node - var ret = elem.getAttributeNode( name ); - if ( !ret ) { - ret = document.createAttribute( name ); - elem.setAttributeNode( ret ); - } - return ( ret.nodeValue = value + "" ); - } - }; - - // Apply the nodeHook to tabindex - jQuery.attrHooks.tabindex.set = nodeHook.set; - - // Set width and height to auto instead of 0 on empty string( Bug #8150 ) - // This is for removals - jQuery.each([ "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { - set: function( elem, value ) { - if ( value === "" ) { - elem.setAttribute( name, "auto" ); - return value; - } - } - }); - }); - - // Set contenteditable to false on removals(#10429) - // Setting to empty string throws an error as an invalid value - jQuery.attrHooks.contenteditable = { - get: nodeHook.get, - set: function( elem, value, name ) { - if ( value === "" ) { - value = "false"; - } - nodeHook.set( elem, value, name ); - } - }; -} - - -// Some attributes require a special call on IE -if ( !jQuery.support.hrefNormalized ) { - jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { - get: function( elem ) { - var ret = elem.getAttribute( name, 2 ); - return ret === null ? undefined : ret; - } - }); - }); -} - -if ( !jQuery.support.style ) { - jQuery.attrHooks.style = { - get: function( elem ) { - // Return undefined in the case of empty string - // Normalize to lowercase since IE uppercases css property names - return elem.style.cssText.toLowerCase() || undefined; - }, - set: function( elem, value ) { - return ( elem.style.cssText = "" + value ); - } - }; -} - -// Safari mis-reports the default selected property of an option -// Accessing the parent's selectedIndex property fixes it -if ( !jQuery.support.optSelected ) { - jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { - get: function( elem ) { - var parent = elem.parentNode; - - if ( parent ) { - parent.selectedIndex; - - // Make sure that it also works with optgroups, see #5701 - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - return null; - } - }); -} - -// IE6/7 call enctype encoding -if ( !jQuery.support.enctype ) { - jQuery.propFix.enctype = "encoding"; -} - -// Radios and checkboxes getter/setter -if ( !jQuery.support.checkOn ) { - jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - get: function( elem ) { - // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified - return elem.getAttribute("value") === null ? "on" : elem.value; - } - }; - }); -} -jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { - set: function( elem, value ) { - if ( jQuery.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); - } - } - }); -}); - - - - -var rformElems = /^(?:textarea|input|select)$/i, - rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, - rhoverHack = /(?:^|\s)hover(\.\S+)?\b/, - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, - quickParse = function( selector ) { - var quick = rquickIs.exec( selector ); - if ( quick ) { - // 0 1 2 3 - // [ _, tag, id, class ] - quick[1] = ( quick[1] || "" ).toLowerCase(); - quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); - } - return quick; - }, - quickIs = function( elem, m ) { - var attrs = elem.attributes || {}; - return ( - (!m[1] || elem.nodeName.toLowerCase() === m[1]) && - (!m[2] || (attrs.id || {}).value === m[2]) && - (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) - ); - }, - hoverHack = function( events ) { - return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); - }; - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - add: function( elem, types, handler, data, selector ) { - - var elemData, eventHandle, events, - t, tns, type, namespaces, handleObj, - handleObjIn, quick, handlers, special; - - // Don't attach events to noData or text/comment nodes (allow plain objects tho) - if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - events = elemData.events; - if ( !events ) { - elemData.events = events = {}; - } - eventHandle = elemData.handle; - if ( !eventHandle ) { - elemData.handle = eventHandle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : - undefined; - }; - // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events - eventHandle.elem = elem; - } - - // Handle multiple events separated by a space - // jQuery(...).bind("mouseover mouseout", fn); - types = jQuery.trim( hoverHack(types) ).split( " " ); - for ( t = 0; t < types.length; t++ ) { - - tns = rtypenamespace.exec( types[t] ) || []; - type = tns[1]; - namespaces = ( tns[2] || "" ).split( "." ).sort(); - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend({ - type: type, - origType: tns[1], - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - quick: selector && quickParse( selector ), - namespace: namespaces.join(".") - }, handleObjIn ); - - // Init the event handler queue if we're the first - handlers = events[ type ]; - if ( !handlers ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener/attachEvent if the special events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - // Bind the global event handler to the element - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - global: {}, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), - t, tns, type, origType, namespaces, origCount, - j, events, special, handle, eventType, handleObj; - - if ( !elemData || !(events = elemData.events) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = jQuery.trim( hoverHack( types || "" ) ).split(" "); - for ( t = 0; t < types.length; t++ ) { - tns = rtypenamespace.exec( types[t] ) || []; - type = origType = tns[1]; - namespaces = tns[2]; - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector? special.delegateType : special.bindType ) || type; - eventType = events[ type ] || []; - origCount = eventType.length; - namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; - - // Remove matching events - for ( j = 0; j < eventType.length; j++ ) { - handleObj = eventType[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !namespaces || namespaces.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { - eventType.splice( j--, 1 ); - - if ( handleObj.selector ) { - eventType.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( eventType.length === 0 && origCount !== eventType.length ) { - if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - handle = elemData.handle; - if ( handle ) { - handle.elem = null; - } - - // removeData also checks for emptiness and clears the expando if empty - // so use it instead of delete - jQuery.removeData( elem, [ "events", "handle" ], true ); - } - }, - - // Events that are safe to short-circuit if no handlers are attached. - // Native DOM events should not be added, they may have inline handlers. - customEvent: { - "getData": true, - "setData": true, - "changeData": true - }, - - trigger: function( event, data, elem, onlyHandlers ) { - // Don't do events on text and comment nodes - if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { - return; - } - - // Event object or event type - var type = event.type || event, - namespaces = [], - cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "!" ) >= 0 ) { - // Exclusive events trigger only for the exact event (no namespaces) - type = type.slice(0, -1); - exclusive = true; - } - - if ( type.indexOf( "." ) >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - - if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { - // No jQuery handlers for this event type, and it can't have inline handlers - return; - } - - // Caller can pass in an Event, Object, or just an event type string - event = typeof event === "object" ? - // jQuery.Event object - event[ jQuery.expando ] ? event : - // Object literal - new jQuery.Event( type, event ) : - // Just the event type (string) - new jQuery.Event( type ); - - event.type = type; - event.isTrigger = true; - event.exclusive = exclusive; - event.namespace = namespaces.join( "." ); - event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; - ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; - - // Handle a global trigger - if ( !elem ) { - - // TODO: Stop taunting the data cache; remove global events and always attach to document - cache = jQuery.cache; - for ( i in cache ) { - if ( cache[ i ].events && cache[ i ].events[ type ] ) { - jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); - } - } - return; - } - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data != null ? jQuery.makeArray( data ) : []; - data.unshift( event ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - eventPath = [[ elem, special.bindType || type ]]; - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; - old = null; - for ( ; cur; cur = cur.parentNode ) { - eventPath.push([ cur, bubbleType ]); - old = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( old && old === elem.ownerDocument ) { - eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); - } - } - - // Fire handlers on the event path - for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { - - cur = eventPath[i][0]; - event.type = eventPath[i][1]; - - handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - // Note that this is a bare JS function and not a jQuery handler - handle = ontype && cur[ ontype ]; - if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { - event.preventDefault(); - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && - !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Can't use an .isFunction() check here because IE6/7 fails that test. - // Don't do default actions on window, that's where global variables be (#6170) - // IE<9 dies on focus/blur to hidden element (#1486) - if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - old = elem[ ontype ]; - - if ( old ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( old ) { - elem[ ontype ] = old; - } - } - } - } - - return event.result; - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event || window.event ); - - var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), - delegateCount = handlers.delegateCount, - args = [].slice.call( arguments, 0 ), - run_all = !event.exclusive && !event.namespace, - special = jQuery.event.special[ event.type ] || {}, - handlerQueue = [], - i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers that should run if there are delegated events - // Avoid non-left-click bubbling in Firefox (#3861) - if ( delegateCount && !(event.button && event.type === "click") ) { - - // Pregenerate a single jQuery object for reuse with .is() - jqcur = jQuery(this); - jqcur.context = this.ownerDocument || this; - - for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { - - // Don't process events on disabled elements (#6911, #8165) - if ( cur.disabled !== true ) { - selMatch = {}; - matches = []; - jqcur[0] = cur; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - sel = handleObj.selector; - - if ( selMatch[ sel ] === undefined ) { - selMatch[ sel ] = ( - handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) - ); - } - if ( selMatch[ sel ] ) { - matches.push( handleObj ); - } - } - if ( matches.length ) { - handlerQueue.push({ elem: cur, matches: matches }); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if ( handlers.length > delegateCount ) { - handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); - } - - // Run delegates first; they may want to stop propagation beneath us - for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { - matched = handlerQueue[ i ]; - event.currentTarget = matched.elem; - - for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { - handleObj = matched.matches[ j ]; - - // Triggered event must either 1) be non-exclusive and have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). - if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { - - event.data = handleObj.data; - event.handleObj = handleObj; - - ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) - .apply( matched.elem, args ); - - if ( ret !== undefined ) { - event.result = ret; - if ( ret === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** - props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split(" "), - filter: function( event, original ) { - - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function( event, original ) { - var eventDoc, doc, body, - button = original.button, - fromElement = original.fromElement; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add relatedTarget, if necessary - if ( !event.relatedTarget && fromElement ) { - event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } - }, - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, - originalEvent = event, - fixHook = jQuery.event.fixHooks[ event.type ] || {}, - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = jQuery.Event( originalEvent ); - - for ( i = copy.length; i; ) { - prop = copy[ --i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) - if ( !event.target ) { - event.target = originalEvent.srcElement || document; - } - - // Target should not be a text node (#504, Safari) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) - if ( event.metaKey === undefined ) { - event.metaKey = event.ctrlKey; - } - - return fixHook.filter? fixHook.filter( event, originalEvent ) : event; - }, - - special: { - ready: { - // Make sure the ready event is setup - setup: jQuery.bindReady - }, - - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - - focus: { - delegateType: "focusin" - }, - blur: { - delegateType: "focusout" - }, - - beforeunload: { - setup: function( data, namespaces, eventHandle ) { - // We only want to do this special case on windows - if ( jQuery.isWindow( this ) ) { - this.onbeforeunload = eventHandle; - } - }, - - teardown: function( namespaces, eventHandle ) { - if ( this.onbeforeunload === eventHandle ) { - this.onbeforeunload = null; - } - } - } - }, - - simulate: function( type, elem, event, bubble ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, - { type: type, - isSimulated: true, - originalEvent: {} - } - ); - if ( bubble ) { - jQuery.event.trigger( e, null, elem ); - } else { - jQuery.event.dispatch.call( elem, e ); - } - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } - } -}; - -// Some plugins are using, but it's undocumented/deprecated and will be removed. -// The 1.7 special event interface should provide all the hooks needed now. -jQuery.event.handle = jQuery.event.dispatch; - -jQuery.removeEvent = document.removeEventListener ? - function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } - } : - function( elem, type, handle ) { - if ( elem.detachEvent ) { - elem.detachEvent( "on" + type, handle ); - } - }; - -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !(this instanceof jQuery.Event) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || - src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -function returnFalse() { - return false; -} -function returnTrue() { - return true; -} - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - preventDefault: function() { - this.isDefaultPrevented = returnTrue; - - var e = this.originalEvent; - if ( !e ) { - return; - } - - // if preventDefault exists run it on the original event - if ( e.preventDefault ) { - e.preventDefault(); - - // otherwise set the returnValue property of the original event to false (IE) - } else { - e.returnValue = false; - } - }, - stopPropagation: function() { - this.isPropagationStopped = returnTrue; - - var e = this.originalEvent; - if ( !e ) { - return; - } - // if stopPropagation exists run it on the original event - if ( e.stopPropagation ) { - e.stopPropagation(); - } - // otherwise set the cancelBubble property of the original event to true (IE) - e.cancelBubble = true; - }, - stopImmediatePropagation: function() { - this.isImmediatePropagationStopped = returnTrue; - this.stopPropagation(); - }, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse -}; - -// Create mouseenter/leave events using mouseover/out and event-time checks -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var target = this, - related = event.relatedTarget, - handleObj = event.handleObj, - selector = handleObj.selector, - ret; - - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || (related !== target && !jQuery.contains( target, related )) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -}); - -// IE submit delegation -if ( !jQuery.support.submitBubbles ) { - - jQuery.event.special.submit = { - setup: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Lazy-add a submit handler when a descendant form may potentially be submitted - jQuery.event.add( this, "click._submit keypress._submit", function( e ) { - // Node name check avoids a VML-related crash in IE (#9807) - var elem = e.target, - form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; - if ( form && !form._submit_attached ) { - jQuery.event.add( form, "submit._submit", function( event ) { - event._submit_bubble = true; - }); - form._submit_attached = true; - } - }); - // return undefined since we don't need an event listener - }, - - postDispatch: function( event ) { - // If form was submitted by the user, bubble the event up the tree - if ( event._submit_bubble ) { - delete event._submit_bubble; - if ( this.parentNode && !event.isTrigger ) { - jQuery.event.simulate( "submit", this.parentNode, event, true ); - } - } - }, - - teardown: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Remove delegated handlers; cleanData eventually reaps submit handlers attached above - jQuery.event.remove( this, "._submit" ); - } - }; -} - -// IE change delegation and checkbox/radio fix -if ( !jQuery.support.changeBubbles ) { - - jQuery.event.special.change = { - - setup: function() { - - if ( rformElems.test( this.nodeName ) ) { - // IE doesn't fire change on a check/radio until blur; trigger it on click - // after a propertychange. Eat the blur-change in special.change.handle. - // This still fires onchange a second time for check/radio after blur. - if ( this.type === "checkbox" || this.type === "radio" ) { - jQuery.event.add( this, "propertychange._change", function( event ) { - if ( event.originalEvent.propertyName === "checked" ) { - this._just_changed = true; - } - }); - jQuery.event.add( this, "click._change", function( event ) { - if ( this._just_changed && !event.isTrigger ) { - this._just_changed = false; - jQuery.event.simulate( "change", this, event, true ); - } - }); - } - return false; - } - // Delegated event; lazy-add a change handler on descendant inputs - jQuery.event.add( this, "beforeactivate._change", function( e ) { - var elem = e.target; - - if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { - jQuery.event.add( elem, "change._change", function( event ) { - if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { - jQuery.event.simulate( "change", this.parentNode, event, true ); - } - }); - elem._change_attached = true; - } - }); - }, - - handle: function( event ) { - var elem = event.target; - - // Swallow native change events from checkbox/radio, we already triggered them above - if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { - return event.handleObj.handler.apply( this, arguments ); - } - }, - - teardown: function() { - jQuery.event.remove( this, "._change" ); - - return rformElems.test( this.nodeName ); - } - }; -} - -// Create "bubbling" focus and blur events -if ( !jQuery.support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler while someone wants focusin/focusout - var attaches = 0, - handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - if ( attaches++ === 0 ) { - document.addEventListener( orig, handler, true ); - } - }, - teardown: function() { - if ( --attaches === 0 ) { - document.removeEventListener( orig, handler, true ); - } - } - }; - }); -} - -jQuery.fn.extend({ - - on: function( types, selector, data, fn, /*INTERNAL*/ one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { // && selector != null - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - this.on( type, selector, data, types[ type ], one ); - } - return this; - } - - if ( data == null && fn == null ) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return this; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return this.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - }); - }, - one: function( types, selector, data, fn ) { - return this.on( types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - if ( types && types.preventDefault && types.handleObj ) { - // ( event ) dispatched jQuery.Event - var handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - // ( types-object [, selector] ) - for ( var type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each(function() { - jQuery.event.remove( this, types, fn, selector ); - }); - }, - - bind: function( types, data, fn ) { - return this.on( types, null, data, fn ); - }, - unbind: function( types, fn ) { - return this.off( types, null, fn ); - }, - - live: function( types, data, fn ) { - jQuery( this.context ).on( types, this.selector, data, fn ); - return this; - }, - die: function( types, fn ) { - jQuery( this.context ).off( types, this.selector || "**", fn ); - return this; - }, - - delegate: function( selector, types, data, fn ) { - return this.on( types, selector, data, fn ); - }, - undelegate: function( selector, types, fn ) { - // ( namespace ) or ( selector, types [, fn] ) - return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - triggerHandler: function( type, data ) { - if ( this[0] ) { - return jQuery.event.trigger( type, data, this[0], true ); - } - }, - - toggle: function( fn ) { - // Save reference to arguments for access in closure - var args = arguments, - guid = fn.guid || jQuery.guid++, - i = 0, - toggler = function( event ) { - // Figure out which function to execute - var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; - jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); - - // Make sure that clicks stop - event.preventDefault(); - - // and execute the function - return args[ lastToggle ].apply( this, arguments ) || false; - }; - - // link all the functions, so any of them can unbind this click handler - toggler.guid = guid; - while ( i < args.length ) { - args[ i++ ].guid = guid; - } - - return this.click( toggler ); - }, - - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } -}); - -jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - if ( fn == null ) { - fn = data; - data = null; - } - - return arguments.length > 0 ? - this.on( name, null, data, fn ) : - this.trigger( name ); - }; - - if ( jQuery.attrFn ) { - jQuery.attrFn[ name ] = true; - } - - if ( rkeyEvent.test( name ) ) { - jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; - } - - if ( rmouseEvent.test( name ) ) { - jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; - } -}); - - - -/*! - * Sizzle CSS Selector Engine - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * More information: http://sizzlejs.com/ - */ -(function(){ - -var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, - expando = "sizcache" + (Math.random() + '').replace('.', ''), - done = 0, - toString = Object.prototype.toString, - hasDuplicate = false, - baseHasDuplicate = true, - rBackslash = /\\/g, - rReturn = /\r\n/g, - rNonWord = /\W/; - -// Here we check if the JavaScript engine is using some sort of -// optimization where it does not always call our comparision -// function. If that is the case, discard the hasDuplicate value. -// Thus far that includes Google Chrome. -[0, 0].sort(function() { - baseHasDuplicate = false; - return 0; -}); - -var Sizzle = function( selector, context, results, seed ) { - results = results || []; - context = context || document; - - var origContext = context; - - if ( context.nodeType !== 1 && context.nodeType !== 9 ) { - return []; - } - - if ( !selector || typeof selector !== "string" ) { - return results; - } - - var m, set, checkSet, extra, ret, cur, pop, i, - prune = true, - contextXML = Sizzle.isXML( context ), - parts = [], - soFar = selector; - - // Reset the position of the chunker regexp (start from head) - do { - chunker.exec( "" ); - m = chunker.exec( soFar ); - - if ( m ) { - soFar = m[3]; - - parts.push( m[1] ); - - if ( m[2] ) { - extra = m[3]; - break; - } - } - } while ( m ); - - if ( parts.length > 1 && origPOS.exec( selector ) ) { - - if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { - set = posProcess( parts[0] + parts[1], context, seed ); - - } else { - set = Expr.relative[ parts[0] ] ? - [ context ] : - Sizzle( parts.shift(), context ); - - while ( parts.length ) { - selector = parts.shift(); - - if ( Expr.relative[ selector ] ) { - selector += parts.shift(); - } - - set = posProcess( selector, set, seed ); - } - } - - } else { - // Take a shortcut and set the context if the root selector is an ID - // (but not if it'll be faster if the inner selector is an ID) - if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && - Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { - - ret = Sizzle.find( parts.shift(), context, contextXML ); - context = ret.expr ? - Sizzle.filter( ret.expr, ret.set )[0] : - ret.set[0]; - } - - if ( context ) { - ret = seed ? - { expr: parts.pop(), set: makeArray(seed) } : - Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); - - set = ret.expr ? - Sizzle.filter( ret.expr, ret.set ) : - ret.set; - - if ( parts.length > 0 ) { - checkSet = makeArray( set ); - - } else { - prune = false; - } - - while ( parts.length ) { - cur = parts.pop(); - pop = cur; - - if ( !Expr.relative[ cur ] ) { - cur = ""; - } else { - pop = parts.pop(); - } - - if ( pop == null ) { - pop = context; - } - - Expr.relative[ cur ]( checkSet, pop, contextXML ); - } - - } else { - checkSet = parts = []; - } - } - - if ( !checkSet ) { - checkSet = set; - } - - if ( !checkSet ) { - Sizzle.error( cur || selector ); - } - - if ( toString.call(checkSet) === "[object Array]" ) { - if ( !prune ) { - results.push.apply( results, checkSet ); - - } else if ( context && context.nodeType === 1 ) { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { - results.push( set[i] ); - } - } - - } else { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && checkSet[i].nodeType === 1 ) { - results.push( set[i] ); - } - } - } - - } else { - makeArray( checkSet, results ); - } - - if ( extra ) { - Sizzle( extra, origContext, results, seed ); - Sizzle.uniqueSort( results ); - } - - return results; -}; - -Sizzle.uniqueSort = function( results ) { - if ( sortOrder ) { - hasDuplicate = baseHasDuplicate; - results.sort( sortOrder ); - - if ( hasDuplicate ) { - for ( var i = 1; i < results.length; i++ ) { - if ( results[i] === results[ i - 1 ] ) { - results.splice( i--, 1 ); - } - } - } - } - - return results; -}; - -Sizzle.matches = function( expr, set ) { - return Sizzle( expr, null, null, set ); -}; - -Sizzle.matchesSelector = function( node, expr ) { - return Sizzle( expr, null, null, [node] ).length > 0; -}; - -Sizzle.find = function( expr, context, isXML ) { - var set, i, len, match, type, left; - - if ( !expr ) { - return []; - } - - for ( i = 0, len = Expr.order.length; i < len; i++ ) { - type = Expr.order[i]; - - if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { - left = match[1]; - match.splice( 1, 1 ); - - if ( left.substr( left.length - 1 ) !== "\\" ) { - match[1] = (match[1] || "").replace( rBackslash, "" ); - set = Expr.find[ type ]( match, context, isXML ); - - if ( set != null ) { - expr = expr.replace( Expr.match[ type ], "" ); - break; - } - } - } - } - - if ( !set ) { - set = typeof context.getElementsByTagName !== "undefined" ? - context.getElementsByTagName( "*" ) : - []; - } - - return { set: set, expr: expr }; -}; - -Sizzle.filter = function( expr, set, inplace, not ) { - var match, anyFound, - type, found, item, filter, left, - i, pass, - old = expr, - result = [], - curLoop = set, - isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); - - while ( expr && set.length ) { - for ( type in Expr.filter ) { - if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { - filter = Expr.filter[ type ]; - left = match[1]; - - anyFound = false; - - match.splice(1,1); - - if ( left.substr( left.length - 1 ) === "\\" ) { - continue; - } - - if ( curLoop === result ) { - result = []; - } - - if ( Expr.preFilter[ type ] ) { - match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); - - if ( !match ) { - anyFound = found = true; - - } else if ( match === true ) { - continue; - } - } - - if ( match ) { - for ( i = 0; (item = curLoop[i]) != null; i++ ) { - if ( item ) { - found = filter( item, match, i, curLoop ); - pass = not ^ found; - - if ( inplace && found != null ) { - if ( pass ) { - anyFound = true; - - } else { - curLoop[i] = false; - } - - } else if ( pass ) { - result.push( item ); - anyFound = true; - } - } - } - } - - if ( found !== undefined ) { - if ( !inplace ) { - curLoop = result; - } - - expr = expr.replace( Expr.match[ type ], "" ); - - if ( !anyFound ) { - return []; - } - - break; - } - } - } - - // Improper expression - if ( expr === old ) { - if ( anyFound == null ) { - Sizzle.error( expr ); - - } else { - break; - } - } - - old = expr; - } - - return curLoop; -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Utility function for retreiving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -var getText = Sizzle.getText = function( elem ) { - var i, node, - nodeType = elem.nodeType, - ret = ""; - - if ( nodeType ) { - if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent || innerText for elements - if ( typeof elem.textContent === 'string' ) { - return elem.textContent; - } else if ( typeof elem.innerText === 'string' ) { - // Replace IE's carriage returns - return elem.innerText.replace( rReturn, '' ); - } else { - // Traverse it's children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - } else { - - // If no nodeType, this is expected to be an array - for ( i = 0; (node = elem[i]); i++ ) { - // Do not traverse comment nodes - if ( node.nodeType !== 8 ) { - ret += getText( node ); - } - } - } - return ret; -}; - -var Expr = Sizzle.selectors = { - order: [ "ID", "NAME", "TAG" ], - - match: { - ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, - ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, - TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, - CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, - POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, - PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ - }, - - leftMatch: {}, - - attrMap: { - "class": "className", - "for": "htmlFor" - }, - - attrHandle: { - href: function( elem ) { - return elem.getAttribute( "href" ); - }, - type: function( elem ) { - return elem.getAttribute( "type" ); - } - }, - - relative: { - "+": function(checkSet, part){ - var isPartStr = typeof part === "string", - isTag = isPartStr && !rNonWord.test( part ), - isPartStrNotTag = isPartStr && !isTag; - - if ( isTag ) { - part = part.toLowerCase(); - } - - for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { - if ( (elem = checkSet[i]) ) { - while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} - - checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? - elem || false : - elem === part; - } - } - - if ( isPartStrNotTag ) { - Sizzle.filter( part, checkSet, true ); - } - }, - - ">": function( checkSet, part ) { - var elem, - isPartStr = typeof part === "string", - i = 0, - l = checkSet.length; - - if ( isPartStr && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - - for ( ; i < l; i++ ) { - elem = checkSet[i]; - - if ( elem ) { - var parent = elem.parentNode; - checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; - } - } - - } else { - for ( ; i < l; i++ ) { - elem = checkSet[i]; - - if ( elem ) { - checkSet[i] = isPartStr ? - elem.parentNode : - elem.parentNode === part; - } - } - - if ( isPartStr ) { - Sizzle.filter( part, checkSet, true ); - } - } - }, - - "": function(checkSet, part, isXML){ - var nodeCheck, - doneName = done++, - checkFn = dirCheck; - - if ( typeof part === "string" && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); - }, - - "~": function( checkSet, part, isXML ) { - var nodeCheck, - doneName = done++, - checkFn = dirCheck; - - if ( typeof part === "string" && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); - } - }, - - find: { - ID: function( match, context, isXML ) { - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - }, - - NAME: function( match, context ) { - if ( typeof context.getElementsByName !== "undefined" ) { - var ret = [], - results = context.getElementsByName( match[1] ); - - for ( var i = 0, l = results.length; i < l; i++ ) { - if ( results[i].getAttribute("name") === match[1] ) { - ret.push( results[i] ); - } - } - - return ret.length === 0 ? null : ret; - } - }, - - TAG: function( match, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( match[1] ); - } - } - }, - preFilter: { - CLASS: function( match, curLoop, inplace, result, not, isXML ) { - match = " " + match[1].replace( rBackslash, "" ) + " "; - - if ( isXML ) { - return match; - } - - for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { - if ( elem ) { - if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { - if ( !inplace ) { - result.push( elem ); - } - - } else if ( inplace ) { - curLoop[i] = false; - } - } - } - - return false; - }, - - ID: function( match ) { - return match[1].replace( rBackslash, "" ); - }, - - TAG: function( match, curLoop ) { - return match[1].replace( rBackslash, "" ).toLowerCase(); - }, - - CHILD: function( match ) { - if ( match[1] === "nth" ) { - if ( !match[2] ) { - Sizzle.error( match[0] ); - } - - match[2] = match[2].replace(/^\+|\s*/g, ''); - - // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' - var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( - match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || - !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); - - // calculate the numbers (first)n+(last) including if they are negative - match[2] = (test[1] + (test[2] || 1)) - 0; - match[3] = test[3] - 0; - } - else if ( match[2] ) { - Sizzle.error( match[0] ); - } - - // TODO: Move to normal caching system - match[0] = done++; - - return match; - }, - - ATTR: function( match, curLoop, inplace, result, not, isXML ) { - var name = match[1] = match[1].replace( rBackslash, "" ); - - if ( !isXML && Expr.attrMap[name] ) { - match[1] = Expr.attrMap[name]; - } - - // Handle if an un-quoted value was used - match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); - - if ( match[2] === "~=" ) { - match[4] = " " + match[4] + " "; - } - - return match; - }, - - PSEUDO: function( match, curLoop, inplace, result, not ) { - if ( match[1] === "not" ) { - // If we're dealing with a complex expression, or a simple one - if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { - match[3] = Sizzle(match[3], null, null, curLoop); - - } else { - var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); - - if ( !inplace ) { - result.push.apply( result, ret ); - } - - return false; - } - - } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { - return true; - } - - return match; - }, - - POS: function( match ) { - match.unshift( true ); - - return match; - } - }, - - filters: { - enabled: function( elem ) { - return elem.disabled === false && elem.type !== "hidden"; - }, - - disabled: function( elem ) { - return elem.disabled === true; - }, - - checked: function( elem ) { - return elem.checked === true; - }, - - selected: function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - parent: function( elem ) { - return !!elem.firstChild; - }, - - empty: function( elem ) { - return !elem.firstChild; - }, - - has: function( elem, i, match ) { - return !!Sizzle( match[3], elem ).length; - }, - - header: function( elem ) { - return (/h\d/i).test( elem.nodeName ); - }, - - text: function( elem ) { - var attr = elem.getAttribute( "type" ), type = elem.type; - // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) - // use getAttribute instead to test this case - return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); - }, - - radio: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; - }, - - checkbox: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; - }, - - file: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; - }, - - password: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; - }, - - submit: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && "submit" === elem.type; - }, - - image: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; - }, - - reset: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && "reset" === elem.type; - }, - - button: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && "button" === elem.type || name === "button"; - }, - - input: function( elem ) { - return (/input|select|textarea|button/i).test( elem.nodeName ); - }, - - focus: function( elem ) { - return elem === elem.ownerDocument.activeElement; - } - }, - setFilters: { - first: function( elem, i ) { - return i === 0; - }, - - last: function( elem, i, match, array ) { - return i === array.length - 1; - }, - - even: function( elem, i ) { - return i % 2 === 0; - }, - - odd: function( elem, i ) { - return i % 2 === 1; - }, - - lt: function( elem, i, match ) { - return i < match[3] - 0; - }, - - gt: function( elem, i, match ) { - return i > match[3] - 0; - }, - - nth: function( elem, i, match ) { - return match[3] - 0 === i; - }, - - eq: function( elem, i, match ) { - return match[3] - 0 === i; - } - }, - filter: { - PSEUDO: function( elem, match, i, array ) { - var name = match[1], - filter = Expr.filters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - - } else if ( name === "contains" ) { - return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; - - } else if ( name === "not" ) { - var not = match[3]; - - for ( var j = 0, l = not.length; j < l; j++ ) { - if ( not[j] === elem ) { - return false; - } - } - - return true; - - } else { - Sizzle.error( name ); - } - }, - - CHILD: function( elem, match ) { - var first, last, - doneName, parent, cache, - count, diff, - type = match[1], - node = elem; - - switch ( type ) { - case "only": - case "first": - while ( (node = node.previousSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - - if ( type === "first" ) { - return true; - } - - node = elem; - - /* falls through */ - case "last": - while ( (node = node.nextSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - - return true; - - case "nth": - first = match[2]; - last = match[3]; - - if ( first === 1 && last === 0 ) { - return true; - } - - doneName = match[0]; - parent = elem.parentNode; - - if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { - count = 0; - - for ( node = parent.firstChild; node; node = node.nextSibling ) { - if ( node.nodeType === 1 ) { - node.nodeIndex = ++count; - } - } - - parent[ expando ] = doneName; - } - - diff = elem.nodeIndex - last; - - if ( first === 0 ) { - return diff === 0; - - } else { - return ( diff % first === 0 && diff / first >= 0 ); - } - } - }, - - ID: function( elem, match ) { - return elem.nodeType === 1 && elem.getAttribute("id") === match; - }, - - TAG: function( elem, match ) { - return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; - }, - - CLASS: function( elem, match ) { - return (" " + (elem.className || elem.getAttribute("class")) + " ") - .indexOf( match ) > -1; - }, - - ATTR: function( elem, match ) { - var name = match[1], - result = Sizzle.attr ? - Sizzle.attr( elem, name ) : - Expr.attrHandle[ name ] ? - Expr.attrHandle[ name ]( elem ) : - elem[ name ] != null ? - elem[ name ] : - elem.getAttribute( name ), - value = result + "", - type = match[2], - check = match[4]; - - return result == null ? - type === "!=" : - !type && Sizzle.attr ? - result != null : - type === "=" ? - value === check : - type === "*=" ? - value.indexOf(check) >= 0 : - type === "~=" ? - (" " + value + " ").indexOf(check) >= 0 : - !check ? - value && result !== false : - type === "!=" ? - value !== check : - type === "^=" ? - value.indexOf(check) === 0 : - type === "$=" ? - value.substr(value.length - check.length) === check : - type === "|=" ? - value === check || value.substr(0, check.length + 1) === check + "-" : - false; - }, - - POS: function( elem, match, i, array ) { - var name = match[2], - filter = Expr.setFilters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - } - } - } -}; - -var origPOS = Expr.match.POS, - fescape = function(all, num){ - return "\\" + (num - 0 + 1); - }; - -for ( var type in Expr.match ) { - Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); - Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); -} -// Expose origPOS -// "global" as in regardless of relation to brackets/parens -Expr.match.globalPOS = origPOS; - -var makeArray = function( array, results ) { - array = Array.prototype.slice.call( array, 0 ); - - if ( results ) { - results.push.apply( results, array ); - return results; - } - - return array; -}; - -// Perform a simple check to determine if the browser is capable of -// converting a NodeList to an array using builtin methods. -// Also verifies that the returned array holds DOM nodes -// (which is not the case in the Blackberry browser) -try { - Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; - -// Provide a fallback method if it does not work -} catch( e ) { - makeArray = function( array, results ) { - var i = 0, - ret = results || []; - - if ( toString.call(array) === "[object Array]" ) { - Array.prototype.push.apply( ret, array ); - - } else { - if ( typeof array.length === "number" ) { - for ( var l = array.length; i < l; i++ ) { - ret.push( array[i] ); - } - - } else { - for ( ; array[i]; i++ ) { - ret.push( array[i] ); - } - } - } - - return ret; - }; -} - -var sortOrder, siblingCheck; - -if ( document.documentElement.compareDocumentPosition ) { - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { - return a.compareDocumentPosition ? -1 : 1; - } - - return a.compareDocumentPosition(b) & 4 ? -1 : 1; - }; - -} else { - sortOrder = function( a, b ) { - // The nodes are identical, we can exit early - if ( a === b ) { - hasDuplicate = true; - return 0; - - // Fallback to using sourceIndex (in IE) if it's available on both nodes - } else if ( a.sourceIndex && b.sourceIndex ) { - return a.sourceIndex - b.sourceIndex; - } - - var al, bl, - ap = [], - bp = [], - aup = a.parentNode, - bup = b.parentNode, - cur = aup; - - // If the nodes are siblings (or identical) we can do a quick check - if ( aup === bup ) { - return siblingCheck( a, b ); - - // If no parents were found then the nodes are disconnected - } else if ( !aup ) { - return -1; - - } else if ( !bup ) { - return 1; - } - - // Otherwise they're somewhere else in the tree so we need - // to build up a full list of the parentNodes for comparison - while ( cur ) { - ap.unshift( cur ); - cur = cur.parentNode; - } - - cur = bup; - - while ( cur ) { - bp.unshift( cur ); - cur = cur.parentNode; - } - - al = ap.length; - bl = bp.length; - - // Start walking down the tree looking for a discrepancy - for ( var i = 0; i < al && i < bl; i++ ) { - if ( ap[i] !== bp[i] ) { - return siblingCheck( ap[i], bp[i] ); - } - } - - // We ended someplace up the tree so do a sibling check - return i === al ? - siblingCheck( a, bp[i], -1 ) : - siblingCheck( ap[i], b, 1 ); - }; - - siblingCheck = function( a, b, ret ) { - if ( a === b ) { - return ret; - } - - var cur = a.nextSibling; - - while ( cur ) { - if ( cur === b ) { - return -1; - } - - cur = cur.nextSibling; - } - - return 1; - }; -} - -// Check to see if the browser returns elements by name when -// querying by getElementById (and provide a workaround) -(function(){ - // We're going to inject a fake input element with a specified name - var form = document.createElement("div"), - id = "script" + (new Date()).getTime(), - root = document.documentElement; - - form.innerHTML = ""; - - // Inject it into the root element, check its status, and remove it quickly - root.insertBefore( form, root.firstChild ); - - // The workaround has to do additional checks after a getElementById - // Which slows things down for other browsers (hence the branching) - if ( document.getElementById( id ) ) { - Expr.find.ID = function( match, context, isXML ) { - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - - return m ? - m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? - [m] : - undefined : - []; - } - }; - - Expr.filter.ID = function( elem, match ) { - var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); - - return elem.nodeType === 1 && node && node.nodeValue === match; - }; - } - - root.removeChild( form ); - - // release memory in IE - root = form = null; -})(); - -(function(){ - // Check to see if the browser returns only elements - // when doing getElementsByTagName("*") - - // Create a fake element - var div = document.createElement("div"); - div.appendChild( document.createComment("") ); - - // Make sure no comments are found - if ( div.getElementsByTagName("*").length > 0 ) { - Expr.find.TAG = function( match, context ) { - var results = context.getElementsByTagName( match[1] ); - - // Filter out possible comments - if ( match[1] === "*" ) { - var tmp = []; - - for ( var i = 0; results[i]; i++ ) { - if ( results[i].nodeType === 1 ) { - tmp.push( results[i] ); - } - } - - results = tmp; - } - - return results; - }; - } - - // Check to see if an attribute returns normalized href attributes - div.innerHTML = ""; - - if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && - div.firstChild.getAttribute("href") !== "#" ) { - - Expr.attrHandle.href = function( elem ) { - return elem.getAttribute( "href", 2 ); - }; - } - - // release memory in IE - div = null; -})(); - -if ( document.querySelectorAll ) { - (function(){ - var oldSizzle = Sizzle, - div = document.createElement("div"), - id = "__sizzle__"; - - div.innerHTML = "

"; - - // Safari can't handle uppercase or unicode characters when - // in quirks mode. - if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { - return; - } - - Sizzle = function( query, context, extra, seed ) { - context = context || document; - - // Only use querySelectorAll on non-XML documents - // (ID selectors don't work in non-HTML documents) - if ( !seed && !Sizzle.isXML(context) ) { - // See if we find a selector to speed up - var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); - - if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { - // Speed-up: Sizzle("TAG") - if ( match[1] ) { - return makeArray( context.getElementsByTagName( query ), extra ); - - // Speed-up: Sizzle(".CLASS") - } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { - return makeArray( context.getElementsByClassName( match[2] ), extra ); - } - } - - if ( context.nodeType === 9 ) { - // Speed-up: Sizzle("body") - // The body element only exists once, optimize finding it - if ( query === "body" && context.body ) { - return makeArray( [ context.body ], extra ); - - // Speed-up: Sizzle("#ID") - } else if ( match && match[3] ) { - var elem = context.getElementById( match[3] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id === match[3] ) { - return makeArray( [ elem ], extra ); - } - - } else { - return makeArray( [], extra ); - } - } - - try { - return makeArray( context.querySelectorAll(query), extra ); - } catch(qsaError) {} - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - var oldContext = context, - old = context.getAttribute( "id" ), - nid = old || id, - hasParent = context.parentNode, - relativeHierarchySelector = /^\s*[+~]/.test( query ); - - if ( !old ) { - context.setAttribute( "id", nid ); - } else { - nid = nid.replace( /'/g, "\\$&" ); - } - if ( relativeHierarchySelector && hasParent ) { - context = context.parentNode; - } - - try { - if ( !relativeHierarchySelector || hasParent ) { - return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); - } - - } catch(pseudoError) { - } finally { - if ( !old ) { - oldContext.removeAttribute( "id" ); - } - } - } - } - - return oldSizzle(query, context, extra, seed); - }; - - for ( var prop in oldSizzle ) { - Sizzle[ prop ] = oldSizzle[ prop ]; - } - - // release memory in IE - div = null; - })(); -} - -(function(){ - var html = document.documentElement, - matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; - - if ( matches ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9 fails this) - var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), - pseudoWorks = false; - - try { - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( document.documentElement, "[test!='']:sizzle" ); - - } catch( pseudoError ) { - pseudoWorks = true; - } - - Sizzle.matchesSelector = function( node, expr ) { - // Make sure that attribute selectors are quoted - expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); - - if ( !Sizzle.isXML( node ) ) { - try { - if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { - var ret = matches.call( node, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || !disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9, so check for that - node.document && node.document.nodeType !== 11 ) { - return ret; - } - } - } catch(e) {} - } - - return Sizzle(expr, null, null, [node]).length > 0; - }; - } -})(); - -(function(){ - var div = document.createElement("div"); - - div.innerHTML = "
"; - - // Opera can't find a second classname (in 9.6) - // Also, make sure that getElementsByClassName actually exists - if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { - return; - } - - // Safari caches class attributes, doesn't catch changes (in 3.2) - div.lastChild.className = "e"; - - if ( div.getElementsByClassName("e").length === 1 ) { - return; - } - - Expr.order.splice(1, 0, "CLASS"); - Expr.find.CLASS = function( match, context, isXML ) { - if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { - return context.getElementsByClassName(match[1]); - } - }; - - // release memory in IE - div = null; -})(); - -function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; - - if ( elem ) { - var match = false; - - elem = elem[dir]; - - while ( elem ) { - if ( elem[ expando ] === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 && !isXML ){ - elem[ expando ] = doneName; - elem.sizset = i; - } - - if ( elem.nodeName.toLowerCase() === cur ) { - match = elem; - break; - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } -} - -function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; - - if ( elem ) { - var match = false; - - elem = elem[dir]; - - while ( elem ) { - if ( elem[ expando ] === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 ) { - if ( !isXML ) { - elem[ expando ] = doneName; - elem.sizset = i; - } - - if ( typeof cur !== "string" ) { - if ( elem === cur ) { - match = true; - break; - } - - } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { - match = elem; - break; - } - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } -} - -if ( document.documentElement.contains ) { - Sizzle.contains = function( a, b ) { - return a !== b && (a.contains ? a.contains(b) : true); - }; - -} else if ( document.documentElement.compareDocumentPosition ) { - Sizzle.contains = function( a, b ) { - return !!(a.compareDocumentPosition(b) & 16); - }; - -} else { - Sizzle.contains = function() { - return false; - }; -} - -Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; - - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -var posProcess = function( selector, context, seed ) { - var match, - tmpSet = [], - later = "", - root = context.nodeType ? [context] : context; - - // Position selectors must be done after the filter - // And so must :not(positional) so we move all PSEUDOs to the end - while ( (match = Expr.match.PSEUDO.exec( selector )) ) { - later += match[0]; - selector = selector.replace( Expr.match.PSEUDO, "" ); - } - - selector = Expr.relative[selector] ? selector + "*" : selector; - - for ( var i = 0, l = root.length; i < l; i++ ) { - Sizzle( selector, root[i], tmpSet, seed ); - } - - return Sizzle.filter( later, tmpSet ); -}; - -// EXPOSE -// Override sizzle attribute retrieval -Sizzle.attr = jQuery.attr; -Sizzle.selectors.attrMap = {}; -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.filters; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - -})(); - - -var runtil = /Until$/, - rparentsprev = /^(?:parents|prevUntil|prevAll)/, - // Note: This RegExp should be improved, or likely pulled from Sizzle - rmultiselector = /,/, - isSimple = /^.[^:#\[\.,]*$/, - slice = Array.prototype.slice, - POS = jQuery.expr.match.globalPOS, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend({ - find: function( selector ) { - var self = this, - i, l; - - if ( typeof selector !== "string" ) { - return jQuery( selector ).filter(function() { - for ( i = 0, l = self.length; i < l; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - }); - } - - var ret = this.pushStack( "", "find", selector ), - length, n, r; - - for ( i = 0, l = this.length; i < l; i++ ) { - length = ret.length; - jQuery.find( selector, this[i], ret ); - - if ( i > 0 ) { - // Make sure that the results are unique - for ( n = length; n < ret.length; n++ ) { - for ( r = 0; r < length; r++ ) { - if ( ret[r] === ret[n] ) { - ret.splice(n--, 1); - break; - } - } - } - } - } - - return ret; - }, - - has: function( target ) { - var targets = jQuery( target ); - return this.filter(function() { - for ( var i = 0, l = targets.length; i < l; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - not: function( selector ) { - return this.pushStack( winnow(this, selector, false), "not", selector); - }, - - filter: function( selector ) { - return this.pushStack( winnow(this, selector, true), "filter", selector ); - }, - - is: function( selector ) { - return !!selector && ( - typeof selector === "string" ? - // If this is a positional selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - POS.test( selector ) ? - jQuery( selector, this.context ).index( this[0] ) >= 0 : - jQuery.filter( selector, this ).length > 0 : - this.filter( selector ).length > 0 ); - }, - - closest: function( selectors, context ) { - var ret = [], i, l, cur = this[0]; - - // Array (deprecated as of jQuery 1.7) - if ( jQuery.isArray( selectors ) ) { - var level = 1; - - while ( cur && cur.ownerDocument && cur !== context ) { - for ( i = 0; i < selectors.length; i++ ) { - - if ( jQuery( cur ).is( selectors[ i ] ) ) { - ret.push({ selector: selectors[ i ], elem: cur, level: level }); - } - } - - cur = cur.parentNode; - level++; - } - - return ret; - } - - // String - var pos = POS.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( i = 0, l = this.length; i < l; i++ ) { - cur = this[i]; - - while ( cur ) { - if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { - ret.push( cur ); - break; - - } else { - cur = cur.parentNode; - if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { - break; - } - } - } - } - - ret = ret.length > 1 ? jQuery.unique( ret ) : ret; - - return this.pushStack( ret, "closest", selectors ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; - } - - // index in selector - if ( typeof elem === "string" ) { - return jQuery.inArray( this[0], jQuery( elem ) ); - } - - // Locate the position of the desired element - return jQuery.inArray( - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem, this ); - }, - - add: function( selector, context ) { - var set = typeof selector === "string" ? - jQuery( selector, context ) : - jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), - all = jQuery.merge( this.get(), set ); - - return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? - all : - jQuery.unique( all ) ); - }, - - andSelf: function() { - return this.add( this.prevObject ); - } -}); - -// A painfully simple check to see if an element is disconnected -// from a document (should be improved, where feasible). -function isDisconnected( node ) { - return !node || !node.parentNode || node.parentNode.nodeType === 11; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return jQuery.nth( elem, 2, "nextSibling" ); - }, - prev: function( elem ) { - return jQuery.nth( elem, 2, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return jQuery.nodeName( elem, "iframe" ) ? - elem.contentDocument || elem.contentWindow.document : - jQuery.makeArray( elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var ret = jQuery.map( this, fn, until ); - - if ( !runtil.test( name ) ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - ret = jQuery.filter( selector, ret ); - } - - ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; - - if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { - ret = ret.reverse(); - } - - return this.pushStack( ret, name, slice.call( arguments ).join(",") ); - }; -}); - -jQuery.extend({ - filter: function( expr, elems, not ) { - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 ? - jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : - jQuery.find.matches(expr, elems); - }, - - dir: function( elem, dir, until ) { - var matched = [], - cur = elem[ dir ]; - - while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { - if ( cur.nodeType === 1 ) { - matched.push( cur ); - } - cur = cur[dir]; - } - return matched; - }, - - nth: function( cur, result, dir, elem ) { - result = result || 1; - var num = 0; - - for ( ; cur; cur = cur[dir] ) { - if ( cur.nodeType === 1 && ++num === result ) { - break; - } - } - - return cur; - }, - - sibling: function( n, elem ) { - var r = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - r.push( n ); - } - } - - return r; - } -}); - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, keep ) { - - // Can't pass null or undefined to indexOf in Firefox 4 - // Set to 0 to skip string check - qualifier = qualifier || 0; - - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep(elements, function( elem, i ) { - var retVal = !!qualifier.call( elem, i, elem ); - return retVal === keep; - }); - - } else if ( qualifier.nodeType ) { - return jQuery.grep(elements, function( elem, i ) { - return ( elem === qualifier ) === keep; - }); - - } else if ( typeof qualifier === "string" ) { - var filtered = jQuery.grep(elements, function( elem ) { - return elem.nodeType === 1; - }); - - if ( isSimple.test( qualifier ) ) { - return jQuery.filter(qualifier, filtered, !keep); - } else { - qualifier = jQuery.filter( qualifier, filtered ); - } - } - - return jQuery.grep(elements, function( elem, i ) { - return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; - }); -} - - - - -function createSafeFragment( document ) { - var list = nodeNames.split( "|" ), - safeFrag = document.createDocumentFragment(); - - if ( safeFrag.createElement ) { - while ( list.length ) { - safeFrag.createElement( - list.pop() - ); - } - } - return safeFrag; -} - -var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + - "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", - rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, - rleadingWhitespace = /^\s+/, - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, - rtagName = /<([\w:]+)/, - rtbody = /]", "i"), - // checked="checked" or checked - rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, - rscriptType = /\/(java|ecma)script/i, - rcleanScript = /^\s*", "" ], - legend: [ 1, "
", "
" ], - thead: [ 1, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - col: [ 2, "", "
" ], - area: [ 1, "", "" ], - _default: [ 0, "", "" ] - }, - safeFragment = createSafeFragment( document ); - -wrapMap.optgroup = wrapMap.option; -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// IE can't serialize and - - - - - -
-
-
- - diff --git a/libs/qunit/composite/index.html b/libs/qunit/composite/index.html deleted file mode 100755 index b08f5e975..000000000 --- a/libs/qunit/composite/index.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - Composite - - -

Composite

-

A QUnit Addon For Running Multiple Test Files

-

Composite is a QUnit addon that, when handed an array of - files, will open each of those files inside of an iframe, run - the tests and display the results as a single suite of QUnit - tests.

-

Using Composite

-

To use Composite, setup a standard QUnit html page as you - would with other QUnit tests. Remember to include composite.js - and composite.css. Then, inside of either an external js file, - or a script block call the only new method that Composite - exposes, QUnit.testSuites().

QUnit.testSuites() is - passed an array of test files to run as follows:

-
-QUnit.testSuites([
-    "test-file-1.html",
-    "test-file-2.html",
-    "test-file-3.html"
-]);
-		
-

Tests

-

- Composite Demo: A suite which demoes how Composite is bootstrapped and run. -

- - diff --git a/libs/qunit/composite/qunit-composite.css b/libs/qunit/composite/qunit-composite.css deleted file mode 100755 index df47362db..000000000 --- a/libs/qunit/composite/qunit-composite.css +++ /dev/null @@ -1,13 +0,0 @@ -iframe.qunit-subsuite{ - position: fixed; - bottom: 0; - left: 0; - - margin: 0; - padding: 0; - border-width: 1px 0 0; - height: 45%; - width: 100%; - - background: #fff; -} \ No newline at end of file diff --git a/libs/qunit/composite/qunit-composite.js b/libs/qunit/composite/qunit-composite.js deleted file mode 100755 index 89c47eb29..000000000 --- a/libs/qunit/composite/qunit-composite.js +++ /dev/null @@ -1,102 +0,0 @@ -(function( QUnit ) { - -QUnit.extend( QUnit, { - testSuites: function( suites ) { - QUnit.begin(function() { - QUnit.initIframe(); - }); - - for ( var i = 0; i < suites.length; i++ ) { - QUnit.runSuite( suites[i] ); - } - - QUnit.done(function() { - this.iframe.style.display = "none"; - }); - }, - - runSuite: function( suite ) { - asyncTest( suite, function() { - QUnit.iframe.setAttribute( "src", suite ); - }); - }, - - initIframe: function() { - var body = document.body, - iframe = this.iframe = document.createElement( "iframe" ), - iframeWin; - - iframe.className = "qunit-subsuite"; - body.appendChild( iframe ); - - function onIframeLoad() { - var module, test, - count = 0; - - - iframeWin.QUnit.moduleStart(function( data ) { - // capture module name for messages - module = data.name; - }); - - iframeWin.QUnit.testStart(function( data ) { - // capture test name for messages - test = data.name; - }); - iframeWin.QUnit.testDone(function() { - test = null; - }); - - iframeWin.QUnit.log(function( data ) { - if (test === null) { - return; - } - // pass all test details through to the main page - var message = module + ": " + test + ": " + data.message; - expect( ++count ); - QUnit.push( data.result, data.actual, data.expected, message ); - }); - - iframeWin.QUnit.done(function() { - // start the wrapper test from the main page - start(); - }); - } - QUnit.addEvent( iframe, "load", onIframeLoad ); - - iframeWin = iframe.contentWindow; - } -}); - -QUnit.testStart(function( data ) { - // update the test status to show which test suite is running - QUnit.id( "qunit-testresult" ).innerHTML = "Running " + data.name + "...
 "; -}); - -QUnit.testDone(function() { - var i, - current = QUnit.id( this.config.current.id ), - children = current.children, - src = this.iframe.src; - - // undo the auto-expansion of failed tests - for ( i = 0; i < children.length; i++ ) { - if ( children[i].nodeName === "OL" ) { - children[i].style.display = "none"; - } - } - - QUnit.addEvent(current, "dblclick", function( e ) { - var target = e && e.target ? e.target : window.event.srcElement; - if ( target.nodeName.toLowerCase() === "span" || target.nodeName.toLowerCase() === "b" ) { - target = target.parentNode; - } - if ( window.location && target.nodeName.toLowerCase() === "strong" ) { - window.location = src; - } - }); - - current.getElementsByTagName('a')[0].href = src; -}); - -}( QUnit ) ); diff --git a/libs/qunit/qunit.css b/libs/qunit/qunit.css deleted file mode 100644 index 4be7e3643..000000000 --- a/libs/qunit/qunit.css +++ /dev/null @@ -1,232 +0,0 @@ -/** - * QUnit v1.4.0 - A JavaScript Unit Testing Framework - * - * http://docs.jquery.com/QUnit - * - * Copyright (c) 2012 John Resig, Jörn Zaefferer - * Dual licensed under the MIT (MIT-LICENSE.txt) - * or GPL (GPL-LICENSE.txt) licenses. - */ - -/** Font Family and Sizes */ - -#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult { - font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif; -} - -#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; } -#qunit-tests { font-size: smaller; } - - -/** Resets */ - -#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult { - margin: 0; - padding: 0; -} - - -/** Header */ - -#qunit-header { - padding: 0.5em 0 0.5em 1em; - - color: #8699a4; - background-color: #0d3349; - - font-size: 1.5em; - line-height: 1em; - font-weight: normal; - - border-radius: 15px 15px 0 0; - -moz-border-radius: 15px 15px 0 0; - -webkit-border-top-right-radius: 15px; - -webkit-border-top-left-radius: 15px; -} - -#qunit-header a { - text-decoration: none; - color: #c2ccd1; -} - -#qunit-header a:hover, -#qunit-header a:focus { - color: #fff; -} - -#qunit-header label { - display: inline-block; -} - -#qunit-banner { - height: 5px; -} - -#qunit-testrunner-toolbar { - padding: 0.5em 0 0.5em 2em; - color: #5E740B; - background-color: #eee; -} - -#qunit-userAgent { - padding: 0.5em 0 0.5em 2.5em; - background-color: #2b81af; - color: #fff; - text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px; -} - - -/** Tests: Pass/Fail */ - -#qunit-tests { - list-style-position: inside; -} - -#qunit-tests li { - padding: 0.4em 0.5em 0.4em 2.5em; - border-bottom: 1px solid #fff; - list-style-position: inside; -} - -#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running { - display: none; -} - -#qunit-tests li strong { - cursor: pointer; -} - -#qunit-tests li a { - padding: 0.5em; - color: #c2ccd1; - text-decoration: none; -} -#qunit-tests li a:hover, -#qunit-tests li a:focus { - color: #000; -} - -#qunit-tests ol { - margin-top: 0.5em; - padding: 0.5em; - - background-color: #fff; - - border-radius: 15px; - -moz-border-radius: 15px; - -webkit-border-radius: 15px; - - box-shadow: inset 0px 2px 13px #999; - -moz-box-shadow: inset 0px 2px 13px #999; - -webkit-box-shadow: inset 0px 2px 13px #999; -} - -#qunit-tests table { - border-collapse: collapse; - margin-top: .2em; -} - -#qunit-tests th { - text-align: right; - vertical-align: top; - padding: 0 .5em 0 0; -} - -#qunit-tests td { - vertical-align: top; -} - -#qunit-tests pre { - margin: 0; - white-space: pre-wrap; - word-wrap: break-word; -} - -#qunit-tests del { - background-color: #e0f2be; - color: #374e0c; - text-decoration: none; -} - -#qunit-tests ins { - background-color: #ffcaca; - color: #500; - text-decoration: none; -} - -/*** Test Counts */ - -#qunit-tests b.counts { color: black; } -#qunit-tests b.passed { color: #5E740B; } -#qunit-tests b.failed { color: #710909; } - -#qunit-tests li li { - margin: 0.5em; - padding: 0.4em 0.5em 0.4em 0.5em; - background-color: #fff; - border-bottom: none; - list-style-position: inside; -} - -/*** Passing Styles */ - -#qunit-tests li li.pass { - color: #5E740B; - background-color: #fff; - border-left: 26px solid #C6E746; -} - -#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; } -#qunit-tests .pass .test-name { color: #366097; } - -#qunit-tests .pass .test-actual, -#qunit-tests .pass .test-expected { color: #999999; } - -#qunit-banner.qunit-pass { background-color: #C6E746; } - -/*** Failing Styles */ - -#qunit-tests li li.fail { - color: #710909; - background-color: #fff; - border-left: 26px solid #EE5757; - white-space: pre; -} - -#qunit-tests > li:last-child { - border-radius: 0 0 15px 15px; - -moz-border-radius: 0 0 15px 15px; - -webkit-border-bottom-right-radius: 15px; - -webkit-border-bottom-left-radius: 15px; -} - -#qunit-tests .fail { color: #000000; background-color: #EE5757; } -#qunit-tests .fail .test-name, -#qunit-tests .fail .module-name { color: #000000; } - -#qunit-tests .fail .test-actual { color: #EE5757; } -#qunit-tests .fail .test-expected { color: green; } - -#qunit-banner.qunit-fail { background-color: #EE5757; } - - -/** Result */ - -#qunit-testresult { - padding: 0.5em 0.5em 0.5em 2.5em; - - color: #2b81af; - background-color: #D2E0E6; - - border-bottom: 1px solid white; -} - -/** Fixture */ - -#qunit-fixture { - position: absolute; - top: -10000px; - left: -10000px; - width: 1000px; - height: 1000px; -} diff --git a/libs/qunit/qunit.js b/libs/qunit/qunit.js deleted file mode 100644 index f50407ae5..000000000 --- a/libs/qunit/qunit.js +++ /dev/null @@ -1,1659 +0,0 @@ -/** - * QUnit v1.4.0 - A JavaScript Unit Testing Framework - * - * http://docs.jquery.com/QUnit - * - * Copyright (c) 2012 John Resig, Jörn Zaefferer - * Dual licensed under the MIT (MIT-LICENSE.txt) - * or GPL (GPL-LICENSE.txt) licenses. - */ - -(function(window) { - -var defined = { - setTimeout: typeof window.setTimeout !== "undefined", - sessionStorage: (function() { - var x = "qunit-test-string"; - try { - sessionStorage.setItem(x, x); - sessionStorage.removeItem(x); - return true; - } catch(e) { - return false; - } - }()) -}; - -var testId = 0, - toString = Object.prototype.toString, - hasOwn = Object.prototype.hasOwnProperty; - -var Test = function(name, testName, expected, async, callback) { - this.name = name; - this.testName = testName; - this.expected = expected; - this.async = async; - this.callback = callback; - this.assertions = []; -}; -Test.prototype = { - init: function() { - var tests = id("qunit-tests"); - if (tests) { - var b = document.createElement("strong"); - b.innerHTML = "Running " + this.name; - var li = document.createElement("li"); - li.appendChild( b ); - li.className = "running"; - li.id = this.id = "test-output" + testId++; - tests.appendChild( li ); - } - }, - setup: function() { - if (this.module != config.previousModule) { - if ( config.previousModule ) { - runLoggingCallbacks('moduleDone', QUnit, { - name: config.previousModule, - failed: config.moduleStats.bad, - passed: config.moduleStats.all - config.moduleStats.bad, - total: config.moduleStats.all - } ); - } - config.previousModule = this.module; - config.moduleStats = { all: 0, bad: 0 }; - runLoggingCallbacks( 'moduleStart', QUnit, { - name: this.module - } ); - } else if (config.autorun) { - runLoggingCallbacks( 'moduleStart', QUnit, { - name: this.module - } ); - } - - config.current = this; - this.testEnvironment = extend({ - setup: function() {}, - teardown: function() {} - }, this.moduleTestEnvironment); - - runLoggingCallbacks( 'testStart', QUnit, { - name: this.testName, - module: this.module - }); - - // allow utility functions to access the current test environment - // TODO why?? - QUnit.current_testEnvironment = this.testEnvironment; - - if ( !config.pollution ) { - saveGlobal(); - } - if ( config.notrycatch ) { - this.testEnvironment.setup.call(this.testEnvironment); - return; - } - try { - this.testEnvironment.setup.call(this.testEnvironment); - } catch(e) { - QUnit.pushFailure( "Setup failed on " + this.testName + ": " + e.message, extractStacktrace( e, 1 ) ); - } - }, - run: function() { - config.current = this; - if ( this.async ) { - QUnit.stop(); - } - - if ( config.notrycatch ) { - this.callback.call(this.testEnvironment); - return; - } - try { - this.callback.call(this.testEnvironment); - } catch(e) { - QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + ": " + e.message, extractStacktrace( e, 1 ) ); - // else next test will carry the responsibility - saveGlobal(); - - // Restart the tests if they're blocking - if ( config.blocking ) { - QUnit.start(); - } - } - }, - teardown: function() { - config.current = this; - if ( config.notrycatch ) { - this.testEnvironment.teardown.call(this.testEnvironment); - return; - } else { - try { - this.testEnvironment.teardown.call(this.testEnvironment); - } catch(e) { - QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + e.message, extractStacktrace( e, 1 ) ); - } - } - checkPollution(); - }, - finish: function() { - config.current = this; - if ( this.expected != null && this.expected != this.assertions.length ) { - QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run" ); - } else if ( this.expected == null && !this.assertions.length ) { - QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions." ); - } - - var good = 0, bad = 0, - li, i, - tests = id("qunit-tests"); - - config.stats.all += this.assertions.length; - config.moduleStats.all += this.assertions.length; - - if ( tests ) { - var ol = document.createElement("ol"); - - for ( i = 0; i < this.assertions.length; i++ ) { - var assertion = this.assertions[i]; - - li = document.createElement("li"); - li.className = assertion.result ? "pass" : "fail"; - li.innerHTML = assertion.message || (assertion.result ? "okay" : "failed"); - ol.appendChild( li ); - - if ( assertion.result ) { - good++; - } else { - bad++; - config.stats.bad++; - config.moduleStats.bad++; - } - } - - // store result when possible - if ( QUnit.config.reorder && defined.sessionStorage ) { - if (bad) { - sessionStorage.setItem("qunit-test-" + this.module + "-" + this.testName, bad); - } else { - sessionStorage.removeItem("qunit-test-" + this.module + "-" + this.testName); - } - } - - if (bad === 0) { - ol.style.display = "none"; - } - - var b = document.createElement("strong"); - b.innerHTML = this.name + " (" + bad + ", " + good + ", " + this.assertions.length + ")"; - - var a = document.createElement("a"); - a.innerHTML = "Rerun"; - a.href = QUnit.url({ filter: getText([b]).replace(/\([^)]+\)$/, "").replace(/(^\s*|\s*$)/g, "") }); - - addEvent(b, "click", function() { - var next = b.nextSibling.nextSibling, - display = next.style.display; - next.style.display = display === "none" ? "block" : "none"; - }); - - addEvent(b, "dblclick", function(e) { - var target = e && e.target ? e.target : window.event.srcElement; - if ( target.nodeName.toLowerCase() == "span" || target.nodeName.toLowerCase() == "b" ) { - target = target.parentNode; - } - if ( window.location && target.nodeName.toLowerCase() === "strong" ) { - window.location = QUnit.url({ filter: getText([target]).replace(/\([^)]+\)$/, "").replace(/(^\s*|\s*$)/g, "") }); - } - }); - - li = id(this.id); - li.className = bad ? "fail" : "pass"; - li.removeChild( li.firstChild ); - li.appendChild( b ); - li.appendChild( a ); - li.appendChild( ol ); - - } else { - for ( i = 0; i < this.assertions.length; i++ ) { - if ( !this.assertions[i].result ) { - bad++; - config.stats.bad++; - config.moduleStats.bad++; - } - } - } - - QUnit.reset(); - - runLoggingCallbacks( 'testDone', QUnit, { - name: this.testName, - module: this.module, - failed: bad, - passed: this.assertions.length - bad, - total: this.assertions.length - } ); - }, - - queue: function() { - var test = this; - synchronize(function() { - test.init(); - }); - function run() { - // each of these can by async - synchronize(function() { - test.setup(); - }); - synchronize(function() { - test.run(); - }); - synchronize(function() { - test.teardown(); - }); - synchronize(function() { - test.finish(); - }); - } - // defer when previous test run passed, if storage is available - var bad = QUnit.config.reorder && defined.sessionStorage && +sessionStorage.getItem("qunit-test-" + this.module + "-" + this.testName); - if (bad) { - run(); - } else { - synchronize(run, true); - } - } - -}; - -var QUnit = { - - // call on start of module test to prepend name to all tests - module: function(name, testEnvironment) { - config.currentModule = name; - config.currentModuleTestEnviroment = testEnvironment; - }, - - asyncTest: function(testName, expected, callback) { - if ( arguments.length === 2 ) { - callback = expected; - expected = null; - } - - QUnit.test(testName, expected, callback, true); - }, - - test: function(testName, expected, callback, async) { - var name = '' + escapeInnerText(testName) + ''; - - if ( arguments.length === 2 ) { - callback = expected; - expected = null; - } - - if ( config.currentModule ) { - name = '' + config.currentModule + ": " + name; - } - - if ( !validTest(config.currentModule + ": " + testName) ) { - return; - } - - var test = new Test(name, testName, expected, async, callback); - test.module = config.currentModule; - test.moduleTestEnvironment = config.currentModuleTestEnviroment; - test.queue(); - }, - - // Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through. - expect: function(asserts) { - config.current.expected = asserts; - }, - - // Asserts true. - // @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" ); - ok: function(result, msg) { - if (!config.current) { - throw new Error("ok() assertion outside test context, was " + sourceFromStacktrace(2)); - } - result = !!result; - var details = { - result: result, - message: msg - }; - msg = escapeInnerText(msg || (result ? "okay" : "failed")); - if ( !result ) { - var source = sourceFromStacktrace(2); - if (source) { - details.source = source; - msg += '
Source:
' + escapeInnerText(source) + '
'; - } - } - runLoggingCallbacks( 'log', QUnit, details ); - config.current.assertions.push({ - result: result, - message: msg - }); - }, - - // Checks that the first two arguments are equal, with an optional message. Prints out both actual and expected values. - // @example equal( format("Received {0} bytes.", 2), "Received 2 bytes." ); - equal: function(actual, expected, message) { - QUnit.push(expected == actual, actual, expected, message); - }, - - notEqual: function(actual, expected, message) { - QUnit.push(expected != actual, actual, expected, message); - }, - - deepEqual: function(actual, expected, message) { - QUnit.push(QUnit.equiv(actual, expected), actual, expected, message); - }, - - notDeepEqual: function(actual, expected, message) { - QUnit.push(!QUnit.equiv(actual, expected), actual, expected, message); - }, - - strictEqual: function(actual, expected, message) { - QUnit.push(expected === actual, actual, expected, message); - }, - - notStrictEqual: function(actual, expected, message) { - QUnit.push(expected !== actual, actual, expected, message); - }, - - raises: function(block, expected, message) { - var actual, ok = false; - - if (typeof expected === 'string') { - message = expected; - expected = null; - } - - try { - block(); - } catch (e) { - actual = e; - } - - if (actual) { - // we don't want to validate thrown error - if (!expected) { - ok = true; - // expected is a regexp - } else if (QUnit.objectType(expected) === "regexp") { - ok = expected.test(actual); - // expected is a constructor - } else if (actual instanceof expected) { - ok = true; - // expected is a validation function which returns true is validation passed - } else if (expected.call({}, actual) === true) { - ok = true; - } - } - - QUnit.ok(ok, message); - }, - - start: function(count) { - config.semaphore -= count || 1; - if (config.semaphore > 0) { - // don't start until equal number of stop-calls - return; - } - if (config.semaphore < 0) { - // ignore if start is called more often then stop - config.semaphore = 0; - } - // A slight delay, to avoid any current callbacks - if ( defined.setTimeout ) { - window.setTimeout(function() { - if (config.semaphore > 0) { - return; - } - if ( config.timeout ) { - clearTimeout(config.timeout); - } - - config.blocking = false; - process(true); - }, 13); - } else { - config.blocking = false; - process(true); - } - }, - - stop: function(count) { - config.semaphore += count || 1; - config.blocking = true; - - if ( config.testTimeout && defined.setTimeout ) { - clearTimeout(config.timeout); - config.timeout = window.setTimeout(function() { - QUnit.ok( false, "Test timed out" ); - config.semaphore = 1; - QUnit.start(); - }, config.testTimeout); - } - } -}; - -//We want access to the constructor's prototype -(function() { - function F(){} - F.prototype = QUnit; - QUnit = new F(); - //Make F QUnit's constructor so that we can add to the prototype later - QUnit.constructor = F; -}()); - -// deprecated; still export them to window to provide clear error messages -// next step: remove entirely -QUnit.equals = function() { - QUnit.push(false, false, false, "QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead"); -}; -QUnit.same = function() { - QUnit.push(false, false, false, "QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead"); -}; - -// Maintain internal state -var config = { - // The queue of tests to run - queue: [], - - // block until document ready - blocking: true, - - // when enabled, show only failing tests - // gets persisted through sessionStorage and can be changed in UI via checkbox - hidepassed: false, - - // by default, run previously failed tests first - // very useful in combination with "Hide passed tests" checked - reorder: true, - - // by default, modify document.title when suite is done - altertitle: true, - - urlConfig: ['noglobals', 'notrycatch'], - - //logging callback queues - begin: [], - done: [], - log: [], - testStart: [], - testDone: [], - moduleStart: [], - moduleDone: [] -}; - -// Load paramaters -(function() { - var location = window.location || { search: "", protocol: "file:" }, - params = location.search.slice( 1 ).split( "&" ), - length = params.length, - urlParams = {}, - current; - - if ( params[ 0 ] ) { - for ( var i = 0; i < length; i++ ) { - current = params[ i ].split( "=" ); - current[ 0 ] = decodeURIComponent( current[ 0 ] ); - // allow just a key to turn on a flag, e.g., test.html?noglobals - current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true; - urlParams[ current[ 0 ] ] = current[ 1 ]; - } - } - - QUnit.urlParams = urlParams; - config.filter = urlParams.filter; - - // Figure out if we're running the tests from a server or not - QUnit.isLocal = location.protocol === 'file:'; -}()); - -// Expose the API as global variables, unless an 'exports' -// object exists, in that case we assume we're in CommonJS - export everything at the end -if ( typeof exports === "undefined" || typeof require === "undefined" ) { - extend(window, QUnit); - window.QUnit = QUnit; -} - -// define these after exposing globals to keep them in these QUnit namespace only -extend(QUnit, { - config: config, - - // Initialize the configuration options - init: function() { - extend(config, { - stats: { all: 0, bad: 0 }, - moduleStats: { all: 0, bad: 0 }, - started: +new Date(), - updateRate: 1000, - blocking: false, - autostart: true, - autorun: false, - filter: "", - queue: [], - semaphore: 0 - }); - - var qunit = id( "qunit" ); - if ( qunit ) { - qunit.innerHTML = - '

' + escapeInnerText( document.title ) + '

' + - '

' + - '
' + - '

' + - '
    '; - } - - var tests = id( "qunit-tests" ), - banner = id( "qunit-banner" ), - result = id( "qunit-testresult" ); - - if ( tests ) { - tests.innerHTML = ""; - } - - if ( banner ) { - banner.className = ""; - } - - if ( result ) { - result.parentNode.removeChild( result ); - } - - if ( tests ) { - result = document.createElement( "p" ); - result.id = "qunit-testresult"; - result.className = "result"; - tests.parentNode.insertBefore( result, tests ); - result.innerHTML = 'Running...
     '; - } - }, - - // Resets the test setup. Useful for tests that modify the DOM. - // If jQuery is available, uses jQuery's html(), otherwise just innerHTML. - reset: function() { - if ( window.jQuery ) { - jQuery( "#qunit-fixture" ).html( config.fixture ); - } else { - var main = id( 'qunit-fixture' ); - if ( main ) { - main.innerHTML = config.fixture; - } - } - }, - - // Trigger an event on an element. - // @example triggerEvent( document.body, "click" ); - triggerEvent: function( elem, type, event ) { - if ( document.createEvent ) { - event = document.createEvent("MouseEvents"); - event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView, - 0, 0, 0, 0, 0, false, false, false, false, 0, null); - elem.dispatchEvent( event ); - - } else if ( elem.fireEvent ) { - elem.fireEvent("on"+type); - } - }, - - // Safe object type checking - is: function( type, obj ) { - return QUnit.objectType( obj ) == type; - }, - - objectType: function( obj ) { - if (typeof obj === "undefined") { - return "undefined"; - - // consider: typeof null === object - } - if (obj === null) { - return "null"; - } - - var type = toString.call( obj ).match(/^\[object\s(.*)\]$/)[1] || ''; - - switch (type) { - case 'Number': - if (isNaN(obj)) { - return "nan"; - } - return "number"; - case 'String': - case 'Boolean': - case 'Array': - case 'Date': - case 'RegExp': - case 'Function': - return type.toLowerCase(); - } - if (typeof obj === "object") { - return "object"; - } - return undefined; - }, - - push: function(result, actual, expected, message) { - if (!config.current) { - throw new Error("assertion outside test context, was " + sourceFromStacktrace()); - } - var details = { - result: result, - message: message, - actual: actual, - expected: expected - }; - - message = escapeInnerText(message) || (result ? "okay" : "failed"); - message = '' + message + ""; - var output = message; - if (!result) { - expected = escapeInnerText(QUnit.jsDump.parse(expected)); - actual = escapeInnerText(QUnit.jsDump.parse(actual)); - output += ''; - if (actual != expected) { - output += ''; - output += ''; - } - var source = sourceFromStacktrace(); - if (source) { - details.source = source; - output += ''; - } - output += "
    Expected:
    ' + expected + '
    Result:
    ' + actual + '
    Diff:
    ' + QUnit.diff(expected, actual) +'
    Source:
    ' + escapeInnerText(source) + '
    "; - } - - runLoggingCallbacks( 'log', QUnit, details ); - - config.current.assertions.push({ - result: !!result, - message: output - }); - }, - - pushFailure: function(message, source) { - var details = { - result: false, - message: message - }; - var output = escapeInnerText(message); - if (source) { - details.source = source; - output += '
    Source:
    ' + escapeInnerText(source) + '
    '; - } - runLoggingCallbacks( 'log', QUnit, details ); - config.current.assertions.push({ - result: false, - message: output - }); - }, - - url: function( params ) { - params = extend( extend( {}, QUnit.urlParams ), params ); - var querystring = "?", - key; - for ( key in params ) { - if ( !hasOwn.call( params, key ) ) { - continue; - } - querystring += encodeURIComponent( key ) + "=" + - encodeURIComponent( params[ key ] ) + "&"; - } - return window.location.pathname + querystring.slice( 0, -1 ); - }, - - extend: extend, - id: id, - addEvent: addEvent -}); - -//QUnit.constructor is set to the empty F() above so that we can add to it's prototype later -//Doing this allows us to tell if the following methods have been overwritten on the actual -//QUnit object, which is a deprecated way of using the callbacks. -extend(QUnit.constructor.prototype, { - // Logging callbacks; all receive a single argument with the listed properties - // run test/logs.html for any related changes - begin: registerLoggingCallback('begin'), - // done: { failed, passed, total, runtime } - done: registerLoggingCallback('done'), - // log: { result, actual, expected, message } - log: registerLoggingCallback('log'), - // testStart: { name } - testStart: registerLoggingCallback('testStart'), - // testDone: { name, failed, passed, total } - testDone: registerLoggingCallback('testDone'), - // moduleStart: { name } - moduleStart: registerLoggingCallback('moduleStart'), - // moduleDone: { name, failed, passed, total } - moduleDone: registerLoggingCallback('moduleDone') -}); - -if ( typeof document === "undefined" || document.readyState === "complete" ) { - config.autorun = true; -} - -QUnit.load = function() { - runLoggingCallbacks( 'begin', QUnit, {} ); - - // Initialize the config, saving the execution queue - var oldconfig = extend({}, config); - QUnit.init(); - extend(config, oldconfig); - - config.blocking = false; - - var urlConfigHtml = '', len = config.urlConfig.length; - for ( var i = 0, val; i < len; i++ ) { - val = config.urlConfig[i]; - config[val] = QUnit.urlParams[val]; - urlConfigHtml += ''; - } - - var userAgent = id("qunit-userAgent"); - if ( userAgent ) { - userAgent.innerHTML = navigator.userAgent; - } - var banner = id("qunit-header"); - if ( banner ) { - banner.innerHTML = ' ' + banner.innerHTML + ' ' + urlConfigHtml; - addEvent( banner, "change", function( event ) { - var params = {}; - params[ event.target.name ] = event.target.checked ? true : undefined; - window.location = QUnit.url( params ); - }); - } - - var toolbar = id("qunit-testrunner-toolbar"); - if ( toolbar ) { - var filter = document.createElement("input"); - filter.type = "checkbox"; - filter.id = "qunit-filter-pass"; - addEvent( filter, "click", function() { - var ol = document.getElementById("qunit-tests"); - if ( filter.checked ) { - ol.className = ol.className + " hidepass"; - } else { - var tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " "; - ol.className = tmp.replace(/ hidepass /, " "); - } - if ( defined.sessionStorage ) { - if (filter.checked) { - sessionStorage.setItem("qunit-filter-passed-tests", "true"); - } else { - sessionStorage.removeItem("qunit-filter-passed-tests"); - } - } - }); - if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem("qunit-filter-passed-tests") ) { - filter.checked = true; - var ol = document.getElementById("qunit-tests"); - ol.className = ol.className + " hidepass"; - } - toolbar.appendChild( filter ); - - var label = document.createElement("label"); - label.setAttribute("for", "qunit-filter-pass"); - label.innerHTML = "Hide passed tests"; - toolbar.appendChild( label ); - } - - var main = id('qunit-fixture'); - if ( main ) { - config.fixture = main.innerHTML; - } - - if (config.autostart) { - QUnit.start(); - } -}; - -addEvent(window, "load", QUnit.load); - -// addEvent(window, "error") gives us a useless event object -window.onerror = function( message, file, line ) { - if ( QUnit.config.current ) { - QUnit.pushFailure( message, file + ":" + line ); - } else { - QUnit.test( "global failure", function() { - QUnit.pushFailure( message, file + ":" + line ); - }); - } -}; - -function done() { - config.autorun = true; - - // Log the last module results - if ( config.currentModule ) { - runLoggingCallbacks( 'moduleDone', QUnit, { - name: config.currentModule, - failed: config.moduleStats.bad, - passed: config.moduleStats.all - config.moduleStats.bad, - total: config.moduleStats.all - } ); - } - - var banner = id("qunit-banner"), - tests = id("qunit-tests"), - runtime = +new Date() - config.started, - passed = config.stats.all - config.stats.bad, - html = [ - 'Tests completed in ', - runtime, - ' milliseconds.
    ', - '', - passed, - ' tests of ', - config.stats.all, - ' passed, ', - config.stats.bad, - ' failed.' - ].join(''); - - if ( banner ) { - banner.className = (config.stats.bad ? "qunit-fail" : "qunit-pass"); - } - - if ( tests ) { - id( "qunit-testresult" ).innerHTML = html; - } - - if ( config.altertitle && typeof document !== "undefined" && document.title ) { - // show ✖ for good, ✔ for bad suite result in title - // use escape sequences in case file gets loaded with non-utf-8-charset - document.title = [ - (config.stats.bad ? "\u2716" : "\u2714"), - document.title.replace(/^[\u2714\u2716] /i, "") - ].join(" "); - } - - // clear own sessionStorage items if all tests passed - if ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) { - for (var key in sessionStorage) { - if (sessionStorage.hasOwnProperty(key) && key.indexOf("qunit-test-") === 0 ) { - sessionStorage.removeItem(key); - } - } - } - - runLoggingCallbacks( 'done', QUnit, { - failed: config.stats.bad, - passed: passed, - total: config.stats.all, - runtime: runtime - } ); -} - -function validTest( name ) { - var filter = config.filter, - run = false; - - if ( !filter ) { - return true; - } - - var not = filter.charAt( 0 ) === "!"; - if ( not ) { - filter = filter.slice( 1 ); - } - - if ( name.indexOf( filter ) !== -1 ) { - return !not; - } - - if ( not ) { - run = true; - } - - return run; -} - -// so far supports only Firefox, Chrome and Opera (buggy) -// could be extended in the future to use something like https://github.com/csnover/TraceKit -function extractStacktrace( e, offset ) { - offset = offset || 3; - if (e.stacktrace) { - // Opera - return e.stacktrace.split("\n")[offset + 3]; - } else if (e.stack) { - // Firefox, Chrome - var stack = e.stack.split("\n"); - if (/^error$/i.test(stack[0])) { - stack.shift(); - } - return stack[offset]; - } else if (e.sourceURL) { - // Safari, PhantomJS - // hopefully one day Safari provides actual stacktraces - // exclude useless self-reference for generated Error objects - if ( /qunit.js$/.test( e.sourceURL ) ) { - return; - } - // for actual exceptions, this is useful - return e.sourceURL + ":" + e.line; - } -} -function sourceFromStacktrace(offset) { - try { - throw new Error(); - } catch ( e ) { - return extractStacktrace( e, offset ); - } -} - -function escapeInnerText(s) { - if (!s) { - return ""; - } - s = s + ""; - return s.replace(/[\&<>]/g, function(s) { - switch(s) { - case "&": return "&"; - case "<": return "<"; - case ">": return ">"; - default: return s; - } - }); -} - -function synchronize( callback, last ) { - config.queue.push( callback ); - - if ( config.autorun && !config.blocking ) { - process(last); - } -} - -function process( last ) { - function next() { - process( last ); - } - var start = new Date().getTime(); - config.depth = config.depth ? config.depth + 1 : 1; - - while ( config.queue.length && !config.blocking ) { - if ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) { - config.queue.shift()(); - } else { - window.setTimeout( next, 13 ); - break; - } - } - config.depth--; - if ( last && !config.blocking && !config.queue.length && config.depth === 0 ) { - done(); - } -} - -function saveGlobal() { - config.pollution = []; - - if ( config.noglobals ) { - for ( var key in window ) { - if ( !hasOwn.call( window, key ) ) { - continue; - } - config.pollution.push( key ); - } - } -} - -function checkPollution( name ) { - var old = config.pollution; - saveGlobal(); - - var newGlobals = diff( config.pollution, old ); - if ( newGlobals.length > 0 ) { - QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join(", ") ); - } - - var deletedGlobals = diff( old, config.pollution ); - if ( deletedGlobals.length > 0 ) { - QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join(", ") ); - } -} - -// returns a new Array with the elements that are in a but not in b -function diff( a, b ) { - var result = a.slice(); - for ( var i = 0; i < result.length; i++ ) { - for ( var j = 0; j < b.length; j++ ) { - if ( result[i] === b[j] ) { - result.splice(i, 1); - i--; - break; - } - } - } - return result; -} - -function extend(a, b) { - for ( var prop in b ) { - if ( b[prop] === undefined ) { - delete a[prop]; - - // Avoid "Member not found" error in IE8 caused by setting window.constructor - } else if ( prop !== "constructor" || a !== window ) { - a[prop] = b[prop]; - } - } - - return a; -} - -function addEvent(elem, type, fn) { - if ( elem.addEventListener ) { - elem.addEventListener( type, fn, false ); - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, fn ); - } else { - fn(); - } -} - -function id(name) { - return !!(typeof document !== "undefined" && document && document.getElementById) && - document.getElementById( name ); -} - -function registerLoggingCallback(key){ - return function(callback){ - config[key].push( callback ); - }; -} - -// Supports deprecated method of completely overwriting logging callbacks -function runLoggingCallbacks(key, scope, args) { - //debugger; - var callbacks; - if ( QUnit.hasOwnProperty(key) ) { - QUnit[key].call(scope, args); - } else { - callbacks = config[key]; - for( var i = 0; i < callbacks.length; i++ ) { - callbacks[i].call( scope, args ); - } - } -} - -// Test for equality any JavaScript type. -// Author: Philippe Rathé -QUnit.equiv = (function() { - - var innerEquiv; // the real equiv function - var callers = []; // stack to decide between skip/abort functions - var parents = []; // stack to avoiding loops from circular referencing - - // Call the o related callback with the given arguments. - function bindCallbacks(o, callbacks, args) { - var prop = QUnit.objectType(o); - if (prop) { - if (QUnit.objectType(callbacks[prop]) === "function") { - return callbacks[prop].apply(callbacks, args); - } else { - return callbacks[prop]; // or undefined - } - } - } - - var getProto = Object.getPrototypeOf || function (obj) { - return obj.__proto__; - }; - - var callbacks = (function () { - - // for string, boolean, number and null - function useStrictEquality(b, a) { - if (b instanceof a.constructor || a instanceof b.constructor) { - // to catch short annotaion VS 'new' annotation of a - // declaration - // e.g. var i = 1; - // var j = new Number(1); - return a == b; - } else { - return a === b; - } - } - - return { - "string" : useStrictEquality, - "boolean" : useStrictEquality, - "number" : useStrictEquality, - "null" : useStrictEquality, - "undefined" : useStrictEquality, - - "nan" : function(b) { - return isNaN(b); - }, - - "date" : function(b, a) { - return QUnit.objectType(b) === "date" && a.valueOf() === b.valueOf(); - }, - - "regexp" : function(b, a) { - return QUnit.objectType(b) === "regexp" && - // the regex itself - a.source === b.source && - // and its modifers - a.global === b.global && - // (gmi) ... - a.ignoreCase === b.ignoreCase && - a.multiline === b.multiline; - }, - - // - skip when the property is a method of an instance (OOP) - // - abort otherwise, - // initial === would have catch identical references anyway - "function" : function() { - var caller = callers[callers.length - 1]; - return caller !== Object && typeof caller !== "undefined"; - }, - - "array" : function(b, a) { - var i, j, loop; - var len; - - // b could be an object literal here - if (QUnit.objectType(b) !== "array") { - return false; - } - - len = a.length; - if (len !== b.length) { // safe and faster - return false; - } - - // track reference to avoid circular references - parents.push(a); - for (i = 0; i < len; i++) { - loop = false; - for (j = 0; j < parents.length; j++) { - if (parents[j] === a[i]) { - loop = true;// dont rewalk array - } - } - if (!loop && !innerEquiv(a[i], b[i])) { - parents.pop(); - return false; - } - } - parents.pop(); - return true; - }, - - "object" : function(b, a) { - var i, j, loop; - var eq = true; // unless we can proove it - var aProperties = [], bProperties = []; // collection of - // strings - - // comparing constructors is more strict than using - // instanceof - if (a.constructor !== b.constructor) { - // Allow objects with no prototype to be equivalent to - // objects with Object as their constructor. - if (!((getProto(a) === null && getProto(b) === Object.prototype) || - (getProto(b) === null && getProto(a) === Object.prototype))) - { - return false; - } - } - - // stack constructor before traversing properties - callers.push(a.constructor); - // track reference to avoid circular references - parents.push(a); - - for (i in a) { // be strict: don't ensures hasOwnProperty - // and go deep - loop = false; - for (j = 0; j < parents.length; j++) { - if (parents[j] === a[i]) { - // don't go down the same path twice - loop = true; - } - } - aProperties.push(i); // collect a's properties - - if (!loop && !innerEquiv(a[i], b[i])) { - eq = false; - break; - } - } - - callers.pop(); // unstack, we are done - parents.pop(); - - for (i in b) { - bProperties.push(i); // collect b's properties - } - - // Ensures identical properties name - return eq && innerEquiv(aProperties.sort(), bProperties.sort()); - } - }; - }()); - - innerEquiv = function() { // can take multiple arguments - var args = Array.prototype.slice.apply(arguments); - if (args.length < 2) { - return true; // end transition - } - - return (function(a, b) { - if (a === b) { - return true; // catch the most you can - } else if (a === null || b === null || typeof a === "undefined" || - typeof b === "undefined" || - QUnit.objectType(a) !== QUnit.objectType(b)) { - return false; // don't lose time with error prone cases - } else { - return bindCallbacks(a, callbacks, [ b, a ]); - } - - // apply transition with (1..n) arguments - }(args[0], args[1]) && arguments.callee.apply(this, args.splice(1, args.length - 1))); - }; - - return innerEquiv; - -}()); - -/** - * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com | - * http://flesler.blogspot.com Licensed under BSD - * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008 - * - * @projectDescription Advanced and extensible data dumping for Javascript. - * @version 1.0.0 - * @author Ariel Flesler - * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html} - */ -QUnit.jsDump = (function() { - function quote( str ) { - return '"' + str.toString().replace(/"/g, '\\"') + '"'; - } - function literal( o ) { - return o + ''; - } - function join( pre, arr, post ) { - var s = jsDump.separator(), - base = jsDump.indent(), - inner = jsDump.indent(1); - if ( arr.join ) { - arr = arr.join( ',' + s + inner ); - } - if ( !arr ) { - return pre + post; - } - return [ pre, inner + arr, base + post ].join(s); - } - function array( arr, stack ) { - var i = arr.length, ret = new Array(i); - this.up(); - while ( i-- ) { - ret[i] = this.parse( arr[i] , undefined , stack); - } - this.down(); - return join( '[', ret, ']' ); - } - - var reName = /^function (\w+)/; - - var jsDump = { - parse: function( obj, type, stack ) { //type is used mostly internally, you can fix a (custom)type in advance - stack = stack || [ ]; - var parser = this.parsers[ type || this.typeOf(obj) ]; - type = typeof parser; - var inStack = inArray(obj, stack); - if (inStack != -1) { - return 'recursion('+(inStack - stack.length)+')'; - } - //else - if (type == 'function') { - stack.push(obj); - var res = parser.call( this, obj, stack ); - stack.pop(); - return res; - } - // else - return (type == 'string') ? parser : this.parsers.error; - }, - typeOf: function( obj ) { - var type; - if ( obj === null ) { - type = "null"; - } else if (typeof obj === "undefined") { - type = "undefined"; - } else if (QUnit.is("RegExp", obj)) { - type = "regexp"; - } else if (QUnit.is("Date", obj)) { - type = "date"; - } else if (QUnit.is("Function", obj)) { - type = "function"; - } else if (typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined") { - type = "window"; - } else if (obj.nodeType === 9) { - type = "document"; - } else if (obj.nodeType) { - type = "node"; - } else if ( - // native arrays - toString.call( obj ) === "[object Array]" || - // NodeList objects - ( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) ) - ) { - type = "array"; - } else { - type = typeof obj; - } - return type; - }, - separator: function() { - return this.multiline ? this.HTML ? '
    ' : '\n' : this.HTML ? ' ' : ' '; - }, - indent: function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing - if ( !this.multiline ) { - return ''; - } - var chr = this.indentChar; - if ( this.HTML ) { - chr = chr.replace(/\t/g,' ').replace(/ /g,' '); - } - return new Array( this._depth_ + (extra||0) ).join(chr); - }, - up: function( a ) { - this._depth_ += a || 1; - }, - down: function( a ) { - this._depth_ -= a || 1; - }, - setParser: function( name, parser ) { - this.parsers[name] = parser; - }, - // The next 3 are exposed so you can use them - quote: quote, - literal: literal, - join: join, - // - _depth_: 1, - // This is the list of parsers, to modify them, use jsDump.setParser - parsers: { - window: '[Window]', - document: '[Document]', - error: '[ERROR]', //when no parser is found, shouldn't happen - unknown: '[Unknown]', - 'null': 'null', - 'undefined': 'undefined', - 'function': function( fn ) { - var ret = 'function', - name = 'name' in fn ? fn.name : (reName.exec(fn)||[])[1];//functions never have name in IE - if ( name ) { - ret += ' ' + name; - } - ret += '('; - - ret = [ ret, QUnit.jsDump.parse( fn, 'functionArgs' ), '){'].join(''); - return join( ret, QUnit.jsDump.parse(fn,'functionCode'), '}' ); - }, - array: array, - nodelist: array, - 'arguments': array, - object: function( map, stack ) { - var ret = [ ], keys, key, val, i; - QUnit.jsDump.up(); - if (Object.keys) { - keys = Object.keys( map ); - } else { - keys = []; - for (key in map) { keys.push( key ); } - } - keys.sort(); - for (i = 0; i < keys.length; i++) { - key = keys[ i ]; - val = map[ key ]; - ret.push( QUnit.jsDump.parse( key, 'key' ) + ': ' + QUnit.jsDump.parse( val, undefined, stack ) ); - } - QUnit.jsDump.down(); - return join( '{', ret, '}' ); - }, - node: function( node ) { - var open = QUnit.jsDump.HTML ? '<' : '<', - close = QUnit.jsDump.HTML ? '>' : '>'; - - var tag = node.nodeName.toLowerCase(), - ret = open + tag; - - for ( var a in QUnit.jsDump.DOMAttrs ) { - var val = node[QUnit.jsDump.DOMAttrs[a]]; - if ( val ) { - ret += ' ' + a + '=' + QUnit.jsDump.parse( val, 'attribute' ); - } - } - return ret + close + open + '/' + tag + close; - }, - functionArgs: function( fn ) {//function calls it internally, it's the arguments part of the function - var l = fn.length; - if ( !l ) { - return ''; - } - - var args = new Array(l); - while ( l-- ) { - args[l] = String.fromCharCode(97+l);//97 is 'a' - } - return ' ' + args.join(', ') + ' '; - }, - key: quote, //object calls it internally, the key part of an item in a map - functionCode: '[code]', //function calls it internally, it's the content of the function - attribute: quote, //node calls it internally, it's an html attribute value - string: quote, - date: quote, - regexp: literal, //regex - number: literal, - 'boolean': literal - }, - DOMAttrs:{//attributes to dump from nodes, name=>realName - id:'id', - name:'name', - 'class':'className' - }, - HTML:false,//if true, entities are escaped ( <, >, \t, space and \n ) - indentChar:' ',//indentation unit - multiline:true //if true, items in a collection, are separated by a \n, else just a space. - }; - - return jsDump; -}()); - -// from Sizzle.js -function getText( elems ) { - var ret = "", elem; - - for ( var i = 0; elems[i]; i++ ) { - elem = elems[i]; - - // Get the text from text nodes and CDATA nodes - if ( elem.nodeType === 3 || elem.nodeType === 4 ) { - ret += elem.nodeValue; - - // Traverse everything else, except comment nodes - } else if ( elem.nodeType !== 8 ) { - ret += getText( elem.childNodes ); - } - } - - return ret; -} - -//from jquery.js -function inArray( elem, array ) { - if ( array.indexOf ) { - return array.indexOf( elem ); - } - - for ( var i = 0, length = array.length; i < length; i++ ) { - if ( array[ i ] === elem ) { - return i; - } - } - - return -1; -} - -/* - * Javascript Diff Algorithm - * By John Resig (http://ejohn.org/) - * Modified by Chu Alan "sprite" - * - * Released under the MIT license. - * - * More Info: - * http://ejohn.org/projects/javascript-diff-algorithm/ - * - * Usage: QUnit.diff(expected, actual) - * - * QUnit.diff("the quick brown fox jumped over", "the quick fox jumps over") == "the quick brown fox jumped jumps over" - */ -QUnit.diff = (function() { - function diff(o, n) { - var ns = {}; - var os = {}; - var i; - - for (i = 0; i < n.length; i++) { - if (ns[n[i]] == null) { - ns[n[i]] = { - rows: [], - o: null - }; - } - ns[n[i]].rows.push(i); - } - - for (i = 0; i < o.length; i++) { - if (os[o[i]] == null) { - os[o[i]] = { - rows: [], - n: null - }; - } - os[o[i]].rows.push(i); - } - - for (i in ns) { - if ( !hasOwn.call( ns, i ) ) { - continue; - } - if (ns[i].rows.length == 1 && typeof(os[i]) != "undefined" && os[i].rows.length == 1) { - n[ns[i].rows[0]] = { - text: n[ns[i].rows[0]], - row: os[i].rows[0] - }; - o[os[i].rows[0]] = { - text: o[os[i].rows[0]], - row: ns[i].rows[0] - }; - } - } - - for (i = 0; i < n.length - 1; i++) { - if (n[i].text != null && n[i + 1].text == null && n[i].row + 1 < o.length && o[n[i].row + 1].text == null && - n[i + 1] == o[n[i].row + 1]) { - n[i + 1] = { - text: n[i + 1], - row: n[i].row + 1 - }; - o[n[i].row + 1] = { - text: o[n[i].row + 1], - row: i + 1 - }; - } - } - - for (i = n.length - 1; i > 0; i--) { - if (n[i].text != null && n[i - 1].text == null && n[i].row > 0 && o[n[i].row - 1].text == null && - n[i - 1] == o[n[i].row - 1]) { - n[i - 1] = { - text: n[i - 1], - row: n[i].row - 1 - }; - o[n[i].row - 1] = { - text: o[n[i].row - 1], - row: i - 1 - }; - } - } - - return { - o: o, - n: n - }; - } - - return function(o, n) { - o = o.replace(/\s+$/, ''); - n = n.replace(/\s+$/, ''); - var out = diff(o === "" ? [] : o.split(/\s+/), n === "" ? [] : n.split(/\s+/)); - - var str = ""; - var i; - - var oSpace = o.match(/\s+/g); - if (oSpace == null) { - oSpace = [" "]; - } - else { - oSpace.push(" "); - } - var nSpace = n.match(/\s+/g); - if (nSpace == null) { - nSpace = [" "]; - } - else { - nSpace.push(" "); - } - - if (out.n.length === 0) { - for (i = 0; i < out.o.length; i++) { - str += '' + out.o[i] + oSpace[i] + ""; - } - } - else { - if (out.n[0].text == null) { - for (n = 0; n < out.o.length && out.o[n].text == null; n++) { - str += '' + out.o[n] + oSpace[n] + ""; - } - } - - for (i = 0; i < out.n.length; i++) { - if (out.n[i].text == null) { - str += '' + out.n[i] + nSpace[i] + ""; - } - else { - var pre = ""; - - for (n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++) { - pre += '' + out.o[n] + oSpace[n] + ""; - } - str += " " + out.n[i].text + nSpace[i] + pre; - } - } - } - - return str; - }; -}()); - -// for CommonJS enviroments, export everything -if ( typeof exports !== "undefined" || typeof require !== "undefined" ) { - extend(exports, QUnit); -} - -// get at whatever the global object is, like window in browsers -}( (function() {return this;}.call()) )); diff --git a/package.json b/package.json index 7efb89d77..572a1218c 100644 --- a/package.json +++ b/package.json @@ -2,20 +2,31 @@ "name": "quail", "description": "A javascript content accessibility checker.", "homepage": "http://quailjs.org", - "version": "2.0.3", + "version": "2.1.0", "engines": { - "node": ">= 0.6.0" + "node": ">= 0.10.20" + }, + "repository": { + "type": "git", + "url": "git://github.com/kevee/quail.git" }, "scripts": { - "test": "grunt --verbose" + "test": "grunt test --verbose" }, "devDependencies": { + "bower": "~1.2.8", "grunt": "~0.4.1", "grunt-contrib-qunit": "~0.2.0", "grunt-contrib-concat": "~0.3.0", "grunt-contrib-uglify": "~0.2.0", "grunt-contrib-jshint": "~0.4.3", - "grunt-contrib-watch": "~0.3.1" + "grunt-shell": "~0.5.0", + "grunt-convert": "~0.1.5", + "grunt-contrib-watch": "~0.5.3", + "grunt-gh-pages": "~0.8.1", + "grunt-bower-task": "~0.3.4", + "grunt-contrib-connect": "~0.3.0", + "grunt-saucelabs": "~4.1.2" }, "jam": { "dependencies": { diff --git a/quail.jquery.json b/quail.jquery.json index 0860f7e66..88f8824d9 100644 --- a/quail.jquery.json +++ b/quail.jquery.json @@ -1,24 +1,24 @@ { - "name" : "quail", - "title" : "QUAIL", - "description" : "A plugin for checking content against accessibility guidelines. It provides a flexible way to test for certain problems (say, images missing an alt text) and a collection of over 200 tests to get you started. Defining your own tests is easy, and you can pick-and-choose tests to focus on the needs of your own app.", - "keywords" : ["accessibility", "content"], - "homepage" : "http://quailjs.org", - "docs" : "http://quail.readthedocs.org/en/latest/", - "demo" : "http://quailjs.org/examples/", - "version" : "2.0.3", - "author" : { - "name" : "Kevin Miller", - "email" : "kevin@csumb.edu", - "url" : "http://kevee.org" + "name": "quail", + "title": "QUAIL", + "description": "A plugin for checking content against accessibility guidelines. It provides a flexible way to test for certain problems (say, images missing an alt text) and a collection of over 200 tests to get you started. Defining your own tests is easy, and you can pick-and-choose tests to focus on the needs of your own app.", + "keywords": ["accessibility", "content"], + "homepage": "http://quailjs.org", + "docs": "http://quail.readthedocs.org/en/latest/", + "demo": "http://quailjs.org/examples/", + "version": "2.1.0", + "author": { + "name": "Kevin Miller", + "email": "kevin@csumb.edu", + "url": "http://kevee.org" }, - "licenses" : [ - { - "type": "GPLv2", - "url": "http://www.example.com/licenses/gpl.html" - } + "licenses": [ + { + "type": "MIT", + "url": "http://quailjs.org/license" + } ], "dependencies" : { - "jquery" : ">1.4.2" + "jquery": ">1.4.2" } } \ No newline at end of file diff --git a/quail.json b/quail.json index 398f1df6a..f797c8e87 100644 --- a/quail.json +++ b/quail.json @@ -2,7 +2,7 @@ "name": "quail", "title": "Quail", "description": "QUAIL Accessibility Information Library.", - "version": "2.0.3", + "version": "2.1.0", "homepage": "https://github.com/kevee/quail", "author": { "name": "Kevin Miller", @@ -17,12 +17,15 @@ }, "licenses": [ { - "type": "GPL", - "url": "https://github.com/kevee/quail/blob/master/LICENSE-GPL" + "type": "MIT", + "url": "http://quailjs.org/license" } ], "dependencies": { "jquery": ">= 1.7" }, - "keywords": [] + "keywords": [], + "options" : { + "banner" : "/*! QUAIL quailjs.org | quailjs.org/license */" + } } \ No newline at end of file diff --git a/src/js/components/acronym.js b/src/js/components/acronym.js new file mode 100644 index 000000000..cac6b069f --- /dev/null +++ b/src/js/components/acronym.js @@ -0,0 +1,24 @@ +quail.components.acronym = function(testName, acronymTag) { + var predefined = { }; + var alreadyReported = { }; + quail.html.find('acronym[title], abbr[title]').each(function() { + predefined[$(this).text().toUpperCase()] = $(this).attr('title'); + }); + quail.html.find('p, div, h1, h2, h3, h4, h5').each(function(){ + var $el = $(this); + var words = $(this).text().split(' '); + if(words.length > 1 && $(this).text().toUpperCase() !== $(this).text()) { + $.each(words, function(index, word) { + word = word.replace(/[^a-zA-Zs]/, ''); + if(word.toUpperCase() === word && + word.length > 1 && + typeof predefined[word.toUpperCase()] === 'undefined') { + if(typeof alreadyReported[word.toUpperCase()] === 'undefined') { + quail.testFails(testName, $el, {acronym : word.toUpperCase()}); + } + alreadyReported[word.toUpperCase()] = word; + } + }); + } + }); +}; \ No newline at end of file diff --git a/src/js/components/colors.js b/src/js/components/colors.js new file mode 100644 index 000000000..f0000f8e7 --- /dev/null +++ b/src/js/components/colors.js @@ -0,0 +1,132 @@ +/** + * Test callback for color tests. This handles both WAI and WCAG + * color contrast/luminosity. + */ +quail.components.color = function(testName, options) { + if(options.bodyForegroundAttribute && options.bodyBackgroundAttribute) { + var $body = quail.html.find('body').clone(false, false); + var foreground = $body.attr(options.bodyForegroundAttribute); + var background = $body.attr(options.bodyBackgroundAttribute); + if(typeof foreground === 'undefined') { + foreground = 'rgb(0,0,0)'; + } + if(typeof background === 'undefined') { + foreground = 'rgb(255,255,255)'; + } + $body.css('color', foreground); + $body.css('background-color', background); + if((options.algorithm === 'wcag' && !quail.colors.passesWCAG($body)) || + (options.algorithm === 'wai' && !quail.colors.passesWAI($body))) { + quail.testFails(testName, $body); + } + } + quail.html.find(options.selector).filter(quail.textSelector).each(function() { + if(!quail.isUnreadable($(this).text()) && + (options.algorithm === 'wcag' && !quail.colors.passesWCAG($(this))) || + (options.algorithm === 'wai' && !quail.colors.passesWAI($(this)))) { + quail.testFails(testName, $(this)); + } + }); +}; + +/** + * Utility object to test for color contrast. + */ +quail.colors = { + + getLuminosity : function(foreground, background) { + foreground = this.cleanup(foreground); + background = this.cleanup(background); + + var RsRGB = foreground.r/255; + var GsRGB = foreground.g/255; + var BsRGB = foreground.b/255; + var R = (RsRGB <= 0.03928) ? RsRGB/12.92 : Math.pow((RsRGB+0.055)/1.055, 2.4); + var G = (GsRGB <= 0.03928) ? GsRGB/12.92 : Math.pow((GsRGB+0.055)/1.055, 2.4); + var B = (BsRGB <= 0.03928) ? BsRGB/12.92 : Math.pow((BsRGB+0.055)/1.055, 2.4); + + var RsRGB2 = background.r/255; + var GsRGB2 = background.g/255; + var BsRGB2 = background.b/255; + var R2 = (RsRGB2 <= 0.03928) ? RsRGB2/12.92 : Math.pow((RsRGB2+0.055)/1.055, 2.4); + var G2 = (GsRGB2 <= 0.03928) ? GsRGB2/12.92 : Math.pow((GsRGB2+0.055)/1.055, 2.4); + var B2 = (BsRGB2 <= 0.03928) ? BsRGB2/12.92 : Math.pow((BsRGB2+0.055)/1.055, 2.4); + var l1, l2; + l1 = (0.2126 * R + 0.7152 * G + 0.0722 * B); + l2 = (0.2126 * R2 + 0.7152 * G2 + 0.0722 * B2); + + return Math.round((Math.max(l1, l2) + 0.05)/(Math.min(l1, l2) + 0.05)*10)/10; + }, + + fetchImageColor : function(){ + var img = new Image(); + var src = $(this).css('background-image').replace('url(', '').replace(/'/, '').replace(')', ''); + img.src = src; + var can = document.createElement('canvas'); + var context = can.getContext('2d'); + context.drawImage(img, 0, 0); + var data = context.getImageData(0, 0, 1, 1).data; + return 'rgb(' + data[0] + ',' + data[1] + ',' + data[2] + ')'; + }, + + passesWCAG : function(element) { + return (quail.colors.getLuminosity(quail.colors.getColor(element, 'foreground'), quail.colors.getColor(element, 'background')) > 5); + }, + + passesWAI : function(element) { + var foreground = quail.colors.cleanup(quail.colors.getColor(element, 'foreground')); + var background = quail.colors.cleanup(quail.colors.getColor(element, 'background')); + return (quail.colors.getWAIErtContrast(foreground, background) > 500 && + quail.colors.getWAIErtBrightness(foreground, background) > 125); + }, + + getWAIErtContrast : function(foreground, background) { + var diffs = quail.colors.getWAIDiffs(foreground, background); + return diffs.red + diffs.green + diffs.blue; + }, + + getWAIErtBrightness : function(foreground, background) { + var diffs = quail.colors.getWAIDiffs(foreground, background); + return ((diffs.red * 299) + (diffs.green * 587) + (diffs.blue * 114)) / 1000; + + }, + + getWAIDiffs : function(foreground, background) { + var diff = { }; + diff.red = Math.abs(foreground.r - background.r); + diff.green = Math.abs(foreground.g - background.g); + diff.blue = Math.abs(foreground.b - background.b); + return diff; + }, + + getColor : function(element, type) { + if(type === 'foreground') { + return (element.css('color')) ? element.css('color') : 'rgb(255,255,255)'; + } + //return (element.css('background-color')) ? element.css('background-color') : 'rgb(0,0,0)'; + if((element.css('background-color') !== 'rgba(0, 0, 0, 0)' && + element.css('background-color') !== 'transparent') || + element.get(0).tagName === 'body') { + return (element.css('background-color')) ? element.css('background-color') : 'rgb(0,0,0)'; + } + var color = 'rgb(0,0,0)'; + element.parents().each(function(){ + if ($(this).css('background-color') !== 'rgba(0, 0, 0, 0)' && + $(this).css('background-color') !== 'transparent') { + color = $(this).css('background-color'); + return false; + } + }); + return color; + }, + + cleanup : function(color) { + color = color.replace('rgb(', '').replace('rgba(', '').replace(')', '').split(','); + return { r : color[0], + g : color[1], + b : color[2], + a : ((typeof color[3] === 'undefined') ? false : color[3]) + }; + } + +}; \ No newline at end of file diff --git a/src/js/components/convertToPx.js b/src/js/components/convertToPx.js new file mode 100644 index 000000000..566c68ac0 --- /dev/null +++ b/src/js/components/convertToPx.js @@ -0,0 +1,10 @@ +/** + * Converts units to pixels. + */ + +quail.components.convertToPx = function(unit) { + var $test = $('
     
    ').appendTo(quail.html); + var height = $test.height(); + $test.remove(); + return height; +}; diff --git a/src/js/components/event.js b/src/js/components/event.js new file mode 100644 index 000000000..8b56a5326 --- /dev/null +++ b/src/js/components/event.js @@ -0,0 +1,16 @@ +/** + * Test callback for tests that look for script events + * (like a mouse event has a keyboard event as well). + */ +quail.components.event = function(testName, options) { + var $items = (typeof options.selector === 'undefined') ? + quail.html.find('*') : + quail.html.find(options.selector); + $items.each(function() { + if(quail.components.hasEventListener($(this), options.searchEvent.replace('on', '')) && + (typeof options.correspondingEvent === 'undefined' || + !quail.components.hasEventListener($(this), options.correspondingEvent.replace('on', '')))) { + quail.testFails(testName, $(this)); + } + }); +}; \ No newline at end of file diff --git a/src/js/components/hasEventListener.js b/src/js/components/hasEventListener.js new file mode 100644 index 000000000..faf75b862 --- /dev/null +++ b/src/js/components/hasEventListener.js @@ -0,0 +1,9 @@ +/** + * Returns whether an element has an event handler or not. + */ +quail.components.hasEventListener = function(element, event) { + if(typeof $(element).attr('on' + event) !== 'undefined') { + return true; + } + return typeof $(element).get(0)[event] !== 'undefined'; +}; \ No newline at end of file diff --git a/src/js/components/header.js b/src/js/components/header.js new file mode 100644 index 000000000..0640f2800 --- /dev/null +++ b/src/js/components/header.js @@ -0,0 +1,16 @@ +quail.components.header = function(testName, options) { + var current = parseInt(options.selector.substr(-1, 1), 10); + var nextHeading = false; + quail.html.find('h1, h2, h3, h4, h5, h6').each(function() { + var number = parseInt($(this).get(0).tagName.substr(-1, 1), 10); + if(nextHeading && (number - 1 > current || number + 1 < current)) { + quail.testFails(testName, $(this)); + } + if(number === current) { + nextHeading = $(this); + } + if(nextHeading && number !== current) { + nextHeading = false; + } + }); +}; \ No newline at end of file diff --git a/src/js/components/label.js b/src/js/components/label.js new file mode 100644 index 000000000..dcc837baa --- /dev/null +++ b/src/js/components/label.js @@ -0,0 +1,10 @@ +quail.components.label = function(testName, options) { + quail.html.find(options.selector).each(function() { + if((!$(this).parent('label').length || + !quail.containsReadableText($(this).parent('label'))) && + (!quail.html.find('label[for=' + $(this).attr('id') + ']').length || + !quail.containsReadableText(quail.html.find('label[for=' + $(this).attr('id') + ']')))) { + quail.testFails(testName, $(this)); + } + }); +}; \ No newline at end of file diff --git a/src/js/components/labelProximity.js b/src/js/components/labelProximity.js new file mode 100644 index 000000000..f83552261 --- /dev/null +++ b/src/js/components/labelProximity.js @@ -0,0 +1,14 @@ +/** + * Tests that a label element is close (DOM-wise) to it's target form element. + */ +quail.components.labelProximity = function(testName, options) { + quail.html.find(options.selector).each(function() { + var $label = quail.html.find('label[for=' + $(this).attr('id') + ']').first(); + if(!$label.length) { + quail.testFails(testName, $(this)); + } + if(!$(this).parent().is($label.parent())) { + quail.testFails(testName, $(this)); + } + }); +}; \ No newline at end of file diff --git a/src/js/components/placeholder.js b/src/js/components/placeholder.js new file mode 100644 index 000000000..79eab5f10 --- /dev/null +++ b/src/js/components/placeholder.js @@ -0,0 +1,49 @@ +/** + * Placeholder test - checks that an attribute or the content of an + * element itself is not a placeholder (i.e. "click here" for links). + */ +quail.components.placeholder = function(testName, options) { + quail.html.find(options.selector).each(function() { + var text; + if(typeof options.attribute !== 'undefined') { + if(typeof $(this).attr(options.attribute) === 'undefined' || + (options.attribute === 'tabindex' && + $(this).attr(options.attribute) <= 0 + ) + ) { + quail.testFails(testName, $(this)); + return; + } + text = $(this).attr(options.attribute); + } + else { + text = $(this).text(); + $(this).find('img[alt]').each(function() { + text += $(this).attr('alt'); + }); + } + if(typeof text === 'string') { + text = quail.cleanString(text); + var regex = /^([0-9]*)(k|kb|mb|k bytes|k byte)$/g; + var regexResults = regex.exec(text.toLowerCase()); + if(regexResults && regexResults[0].length) { + quail.testFails(testName, $(this)); + } + else { + if(options.empty && quail.isUnreadable(text)) { + quail.testFails(testName, $(this)); + } + else { + if(quail.strings.placeholders.indexOf(text) > -1 ) { + quail.testFails(testName, $(this)); + } + } + } + } + else { + if(options.empty && typeof text !== 'number') { + quail.testFails(testName, $(this)); + } + } + }); +}; \ No newline at end of file diff --git a/src/js/components/statistics.js b/src/js/components/statistics.js new file mode 100644 index 000000000..f00db9fc9 --- /dev/null +++ b/src/js/components/statistics.js @@ -0,0 +1,36 @@ +/** + * Utility object for statistics, like average, variance, etc. + */ +quail.statistics = { + + setDecimal : function( num, numOfDec ){ + var pow10s = Math.pow( 10, numOfDec || 0 ); + return ( numOfDec ) ? Math.round( pow10s * num ) / pow10s : num; + }, + + average : function( numArr, numOfDec ){ + var i = numArr.length, + sum = 0; + while( i-- ){ + sum += numArr[ i ]; + } + return quail.statistics.setDecimal( (sum / numArr.length ), numOfDec ); + }, + + variance : function( numArr, numOfDec ){ + var avg = quail.statistics.average( numArr, numOfDec ), + i = numArr.length, + v = 0; + + while( i-- ){ + v += Math.pow( (numArr[ i ] - avg), 2 ); + } + v /= numArr.length; + return quail.statistics.setDecimal( v, numOfDec ); + }, + + standardDeviation : function( numArr, numOfDec ){ + var stdDev = Math.sqrt( quail.statistics.variance( numArr, numOfDec ) ); + return quail.statistics.setDecimal( stdDev, numOfDec ); + } +}; diff --git a/src/js/components/textStatistics.js b/src/js/components/textStatistics.js new file mode 100644 index 000000000..761e2862d --- /dev/null +++ b/src/js/components/textStatistics.js @@ -0,0 +1,53 @@ +/** + * Utility object that runs text statistics, like sentence count, + * reading level, etc. + */ +quail.components.textStatistics = { + + cleanText : function(text) { + return text.replace(/[,:;()\-]/, ' ') + .replace(/[\.!?]/, '.') + .replace(/[ ]*(\n|\r\n|\r)[ ]*/, ' ') + .replace(/([\.])[\. ]+/, '$1') + .replace(/[ ]*([\.])/, '$1') + .replace(/[ ]+/, ' ') + .toLowerCase(); + + }, + + sentenceCount : function(text) { + var copy = text; + return copy.split('.').length + 1; + }, + + wordCount : function(text) { + var copy = text; + return copy.split(' ').length + 1; + }, + + averageWordsPerSentence : function(text) { + return this.wordCount(text) / this.sentenceCount(text); + }, + + averageSyllablesPerWord : function(text) { + var that = this; + var count = 0; + var wordCount = that.wordCount(text); + if(!wordCount) { + return 0; + } + $.each(text.split(' '), function(index, word) { + count += that.syllableCount(word); + }); + return count / wordCount; + }, + + syllableCount : function(word) { + var matchedWord = word.replace(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/, '') + .match(/[aeiouy]{1,2}/g); + if(!matchedWord || matchedWord.length === 0) { + return 1; + } + return matchedWord.length; + } +}; \ No newline at end of file diff --git a/src/js/components/video.js b/src/js/components/video.js new file mode 100644 index 000000000..d3b8ddca4 --- /dev/null +++ b/src/js/components/video.js @@ -0,0 +1,33 @@ +/** + * Helper object that tests videos. + * @todo - allow this to be exteded more easily. + */ +quail.components.video = { + + youTube : { + + videoID : '', + + apiUrl : 'http://gdata.youtube.com/feeds/api/videos/?q=%video&caption&v=2&alt=json', + + isVideo : function(url) { + var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; + var match = url.match(regExp); + if (match && match[7].length === 11) { + this.videoID = match[7]; + return true; + } + return false; + }, + + hasCaptions : function(callback) { + $.ajax({url : this.apiUrl.replace('%video', this.videoID), + async : false, + dataType : 'json', + success : function(data) { + callback((data.feed.openSearch$totalResults.$t > 0) ? true : false); + } + }); + } + } +}; \ No newline at end of file diff --git a/src/js/core.js b/src/js/core.js new file mode 100644 index 000000000..1c8aede6f --- /dev/null +++ b/src/js/core.js @@ -0,0 +1,277 @@ +$.fn.quail = function(options) { + if (!this.length) { + return this; + } + quail.options = options; + + quail.html = this; + quail.run(); + + return this; +}; + +$.expr[':'].quailCss = function(obj, index, meta, stack) { + var args = meta[3].split(/\s*=\s*/); + return $(obj).css(args[0]).search(args[1]) > -1; +}; + +var quail = { + + options : { }, + + components : { }, + + testabilityTranslation : { + 0 : 'suggestion', + 0.5 : 'moderate', + 1 : 'severe' + }, + + html : { }, + + strings : { }, + + accessibilityResults : { }, + + accessibilityTests : { }, + + /** + * A list of HTML elements that can contain actual text. + */ + textSelector : 'p, h1, h2, h3, h4, h5, h6, div, pre, blockquote, aside, article, details, summary, figcaption, footer, header, hgroup, nav, section, strong, em, del, i, b', + + /** + * Suspect tags that would indicate a paragraph is being used as a header. + * I know, font tag, I know. Don't get me started. + */ + suspectPHeaderTags : ['strong', 'b', 'em', 'i', 'u', 'font'], + + /** + * Suspect CSS styles that might indicate a paragarph tag is being used as a header. + */ + suspectPCSSStyles : ['color', 'font-weight', 'font-size', 'font-family'], + + /** + * Main run function for quail. It bundles up some accessibility tests, + * and if tests are not passed, it instead fetches them using getJSON. + */ + run : function() { + if(quail.options.reset) { + quail.accessibilityResults = { }; + } + if(typeof quail.options.accessibilityTests !== 'undefined') { + quail.accessibilityTests = quail.options.accessibilityTests; + } + else { + $.ajax({ url : quail.options.jsonPath + '/tests.json', + async : false, + dataType : 'json', + success : function(data) { + if(typeof data === 'object') { + quail.accessibilityTests = data; + } + }}); + } + if(typeof quail.options.customTests !== 'undefined') { + for (var testName in quail.options.customTests) { + quail.accessibilityTests[testName] = quail.options.customTests[testName]; + } + } + if(typeof quail.options.guideline === 'string') { + $.ajax({ url : quail.options.jsonPath + '/guidelines/' + quail.options.guideline +'.tests.json', + async : false, + dataType : 'json', + success : function(data) { + quail.options.guideline = data; + }}); + } + if(typeof quail.options.guideline === 'undefined') { + quail.options.guideline = [ ]; + for (var guidelineTestName in quail.accessibilityTests) { + quail.options.guideline.push(guidelineTestName); + } + } + + quail.runTests(); + if(typeof quail.options.complete !== 'undefined') { + var results = {totals : {severe : 0, moderate : 0, suggestion : 0 }, + results : quail.accessibilityResults }; + $.each(results.results, function(testName, result) { + results.totals[quail.testabilityTranslation[quail.accessibilityTests[testName].testability]] += result.length; + }); + quail.options.complete(results); + } + }, + + getConfiguration : function(testName) { + if(typeof this.options.guidelineName === 'undefined' || + typeof this.accessibilityTests[testName].guidelines === 'undefined' || + typeof this.accessibilityTests[testName].guidelines[this.options.guidelineName] === 'undefined' || + typeof this.accessibilityTests[testName].guidelines[this.options.guidelineName].configuration === 'undefined') { + return false; + } + return this.accessibilityTests[testName].guidelines[this.options.guidelineName].configuration; + }, + + /** + * Utility function called whenever a test fails. + * If there is a callback for testFailed, then it + * packages the object and calls it. + */ + testFails : function(testName, $element, options) { + options = options || {}; + + if(typeof quail.options.preFilter !== 'undefined') { + if(quail.options.preFilter(testName, $element, options) === false) { + return; + } + } + + quail.accessibilityResults[testName].push($element); + if(typeof quail.options.testFailed !== 'undefined') { + var testability = (typeof quail.accessibilityTests[testName].testability !== 'undefined') ? + quail.accessibilityTests[testName].testability : + 'unknown'; + var severity = + quail.options.testFailed({element : $element, + testName : testName, + testability : testability, + severity : quail.testabilityTranslation[testability], + options : options + }); + } + }, + + /** + * Iterates over all the tests in the provided guideline and + * figures out which function or object will handle it. + * Custom callbacks are included directly, others might be part of a category + * of tests. + */ + runTests : function() { + $.each(quail.options.guideline, function(index, testName) { + if(typeof quail.accessibilityTests[testName] === 'undefined') { + return; + } + var testType = quail.accessibilityTests[testName].type; + if(typeof quail.accessibilityResults[testName] === 'undefined') { + quail.accessibilityResults[testName] = [ ]; + } + if(testType === 'selector') { + quail.html.find(quail.accessibilityTests[testName].selector).each(function() { + quail.testFails(testName, $(this)); + }); + } + if(testType === 'custom') { + if(typeof quail.accessibilityTests[testName].callback === 'object' || + typeof quail.accessibilityTests[testName].callback === 'function') { + quail.accessibilityTests[testName].callback(quail); + } + else { + if(typeof quail[quail.accessibilityTests[testName].callback] !== 'undefined') { + quail[quail.accessibilityTests[testName].callback](); + } + } + } + if(typeof quail.components[testType] !== 'undefined') { + quail.components[testType](testName, quail.accessibilityTests[testName]); + } + }); + }, + + /** + * Helper function to determine if a string of text is even readable. + * @todo - This will be added to in the future... we should also include + * phonetic tests. + */ + isUnreadable : function(text) { + if(typeof text !== 'string') { + return true; + } + return (text.trim().length) ? false : true; + }, + + /** + * Read more about this function here: https://github.com/kevee/quail/wiki/Layout-versus-data-tables + */ + isDataTable : function(table) { + //If there are less than three rows, why do a table? + if(table.find('tr').length < 3) { + return false; + } + //If you are scoping a table, it's probably not being used for layout + if(table.find('th[scope]').length) { + return true; + } + var numberRows = table.find('tr:has(td)').length; + //Check for odd cell spanning + var spanCells = table.find('td[rowspan], td[colspan]'); + var isDataTable = true; + if(spanCells.length) { + var spanIndex = {}; + spanCells.each(function() { + if(typeof spanIndex[$(this).index()] === 'undefined') { + spanIndex[$(this).index()] = 0; + } + spanIndex[$(this).index()]++; + }); + $.each(spanIndex, function(index, count) { + if(count < numberRows) { + isDataTable = false; + } + }); + } + //If there are sub tables, but not in the same column row after row, this is a layout table + var subTables = table.find('table'); + if(subTables.length) { + var subTablesIndexes = {}; + subTables.each(function() { + var parentIndex = $(this).parent('td').index(); + if(parentIndex !== false && typeof subTablesIndexes[parentIndex] === 'undefined') { + subTablesIndexes[parentIndex] = 0; + } + subTablesIndexes[parentIndex]++; + }); + $.each(subTablesIndexes, function(index, count) { + if(count < numberRows) { + isDataTable = false; + } + }); + } + return isDataTable; + }, + + /** + * Helper function to determine if a given URL is even valid. + */ + validURL : function(url) { + return (url.search(' ') === -1) ? true : false; + }, + + cleanString : function(string) { + return string.toLowerCase().replace(/^\s\s*/, ''); + }, + + containsReadableText : function(element, children) { + element = element.clone(); + element.find('option').remove(); + if(!quail.isUnreadable(element.text())) { + return true; + } + if(!quail.isUnreadable(element.attr('alt'))) { + return true; + } + if(children) { + var readable = false; + element.find('*').each(function() { + if(quail.containsReadableText($(this), true)) { + readable = true; + } + }); + if(readable) { + return true; + } + } + return false; + } +}; diff --git a/src/js/custom/aAdjacentWithSameResourceShouldBeCombined.js b/src/js/custom/aAdjacentWithSameResourceShouldBeCombined.js new file mode 100644 index 000000000..7e8169931 --- /dev/null +++ b/src/js/custom/aAdjacentWithSameResourceShouldBeCombined.js @@ -0,0 +1,7 @@ +quail.aAdjacentWithSameResourceShouldBeCombined = function() { + quail.html.find('a').each(function() { + if($(this).next('a').attr('href') === $(this).attr('href')) { + quail.testFails('aAdjacentWithSameResourceShouldBeCombined', $(this)); + } + }); +}; diff --git a/src/js/custom/aImgAltNotRepetative.js b/src/js/custom/aImgAltNotRepetative.js new file mode 100644 index 000000000..fcac6e944 --- /dev/null +++ b/src/js/custom/aImgAltNotRepetative.js @@ -0,0 +1,7 @@ +quail.aImgAltNotRepetative = function() { + quail.html.find('a img[alt]').each(function() { + if(quail.cleanString($(this).attr('alt')) === quail.cleanString($(this).parent('a').text())) { + quail.testFails('aImgAltNotRepetative', $(this).parent('a')); + } + }); +}; diff --git a/src/js/custom/aLinkTextDoesNotBeginWithRedundantWord.js b/src/js/custom/aLinkTextDoesNotBeginWithRedundantWord.js new file mode 100644 index 000000000..89d78aaf9 --- /dev/null +++ b/src/js/custom/aLinkTextDoesNotBeginWithRedundantWord.js @@ -0,0 +1,16 @@ +quail.aLinkTextDoesNotBeginWithRedundantWord = function() { + quail.html.find('a').each(function() { + var $link = $(this); + var text = ''; + if($(this).find('img[alt]').length) { + text = text + $(this).find('img[alt]:first').attr('alt'); + } + text = text + $(this).text(); + text = text.toLowerCase(); + $.each(quail.strings.redundant.link, function(index, phrase) { + if(text.search(phrase) > -1) { + quail.testFails('aLinkTextDoesNotBeginWithRedundantWord', $link); + } + }); + }); +}; diff --git a/src/js/custom/aLinksAreSeperatedByPrintableCharacters.js b/src/js/custom/aLinksAreSeperatedByPrintableCharacters.js new file mode 100644 index 000000000..13c641348 --- /dev/null +++ b/src/js/custom/aLinksAreSeperatedByPrintableCharacters.js @@ -0,0 +1,7 @@ +quail.aLinksAreSeperatedByPrintableCharacters = function() { + quail.html.find('a').each(function() { + if($(this).next('a').length && quail.isUnreadable($(this).get(0).nextSibling.wholeText)) { + quail.testFails('aLinksAreSeperatedByPrintableCharacters', $(this)); + } + }); +}; diff --git a/src/js/custom/aLinksNotSeparatedBySymbols.js b/src/js/custom/aLinksNotSeparatedBySymbols.js new file mode 100644 index 000000000..446e3a88d --- /dev/null +++ b/src/js/custom/aLinksNotSeparatedBySymbols.js @@ -0,0 +1,8 @@ +quail.aLinksNotSeparatedBySymbols = function() { + quail.html.find('a').each(function() { + if($(this).next('a').length && + quail.strings.symbols.indexOf($(this).get(0).nextSibling.wholeText.toLowerCase().trim()) !== -1 ) { + quail.testFails('aLinksNotSeparatedBySymbols', $(this)); + } + }); +}; diff --git a/src/js/custom/aMustContainText.js b/src/js/custom/aMustContainText.js new file mode 100644 index 000000000..5cbaf2da8 --- /dev/null +++ b/src/js/custom/aMustContainText.js @@ -0,0 +1,8 @@ +quail.aMustContainText = function() { + quail.html.find('a').each(function() { + if(!quail.containsReadableText($(this), true) && + !(($(this).attr('name') || $(this).attr('id')) && !$(this).attr('href'))) { + quail.testFails('aMustContainText', $(this)); + } + }); +}; diff --git a/src/js/custom/aSuspiciousLinkText.js b/src/js/custom/aSuspiciousLinkText.js new file mode 100644 index 000000000..d0140705c --- /dev/null +++ b/src/js/custom/aSuspiciousLinkText.js @@ -0,0 +1,11 @@ +quail.aSuspiciousLinkText = function() { + quail.html.find('a').each(function() { + var text = $(this).text(); + $(this).find('img[alt]').each(function() { + text = text + $(this).attr('alt'); + }); + if(quail.strings.suspiciousLinks.indexOf(quail.cleanString(text)) > -1) { + quail.testFails('aSuspiciousLinkText', $(this)); + } + }); +}; diff --git a/src/js/custom/appletContainsTextEquivalent.js b/src/js/custom/appletContainsTextEquivalent.js new file mode 100644 index 000000000..97cad45ac --- /dev/null +++ b/src/js/custom/appletContainsTextEquivalent.js @@ -0,0 +1,7 @@ +quail.appletContainsTextEquivalent = function() { + quail.html.find('applet[alt=], applet:not(applet[alt])').each(function() { + if(quail.isUnreadable($(this).text())) { + quail.testFails('appletContainsTextEquivalent', $(this)); + } + }); +}; diff --git a/src/js/custom/blockquoteUseForQuotations.js b/src/js/custom/blockquoteUseForQuotations.js new file mode 100644 index 000000000..21410546d --- /dev/null +++ b/src/js/custom/blockquoteUseForQuotations.js @@ -0,0 +1,8 @@ +quail.blockquoteUseForQuotations = function() { + quail.html.find('p').each(function() { + if($(this).text().substr(0, 1).search(/[\'\"]/) > -1 && + $(this).text().substr(-1, 1).search(/[\'\"]/) > -1) { + quail.testFails('blockquoteUseForQuotations', $(this)); + } + }); +}; diff --git a/src/js/custom/doctypeProvided.js b/src/js/custom/doctypeProvided.js new file mode 100644 index 000000000..ce1ef6b45 --- /dev/null +++ b/src/js/custom/doctypeProvided.js @@ -0,0 +1,5 @@ +quail.doctypeProvided = function() { + if($(quail.html.get(0).doctype).length === 0) { + quail.testFails('doctypeProvided', quail.html.find('html')); + } +}; diff --git a/src/js/custom/documentAbbrIsUsed.js b/src/js/custom/documentAbbrIsUsed.js new file mode 100644 index 000000000..2c85a1678 --- /dev/null +++ b/src/js/custom/documentAbbrIsUsed.js @@ -0,0 +1,3 @@ +quail.documentAbbrIsUsed = function() { + quail.components.acronym('documentAbbrIsUsed', 'abbr'); +}; diff --git a/src/js/custom/documentAcronymsHaveElement.js b/src/js/custom/documentAcronymsHaveElement.js new file mode 100644 index 000000000..d1022924f --- /dev/null +++ b/src/js/custom/documentAcronymsHaveElement.js @@ -0,0 +1,3 @@ +quail.documentAcronymsHaveElement = function() { + quail.components.acronym('documentAcronymsHaveElement', 'acronym'); +}; diff --git a/src/js/custom/documentIDsMustBeUnique.js b/src/js/custom/documentIDsMustBeUnique.js new file mode 100644 index 000000000..323f6843d --- /dev/null +++ b/src/js/custom/documentIDsMustBeUnique.js @@ -0,0 +1,9 @@ +quail.documentIDsMustBeUnique = function() { + var ids = []; + quail.html.find('*[id]').each(function() { + if(ids.indexOf($(this).attr('id')) >= 0) { + quail.testFails('documentIDsMustBeUnique', $(this)); + } + ids.push($(this).attr('id')); + }); +}; diff --git a/src/js/custom/documentIsWrittenClearly.js b/src/js/custom/documentIsWrittenClearly.js new file mode 100644 index 000000000..68c22e062 --- /dev/null +++ b/src/js/custom/documentIsWrittenClearly.js @@ -0,0 +1,8 @@ +quail.documentIsWrittenClearly = function() { + quail.html.find(quail.textSelector).each(function() { + var text = quail.components.textStatistics.cleanText($(this).text()); + if(Math.round((206.835 - (1.015 * quail.components.textStatistics.averageWordsPerSentence(text)) - (84.6 * quail.components.textStatistics.averageSyllablesPerWord(text)))) < 60) { + quail.testFails('documentIsWrittenClearly', $(this)); + } + }); +}; diff --git a/src/js/custom/documentLangIsISO639Standard.js b/src/js/custom/documentLangIsISO639Standard.js new file mode 100644 index 000000000..79b857ec5 --- /dev/null +++ b/src/js/custom/documentLangIsISO639Standard.js @@ -0,0 +1,9 @@ +quail.documentLangIsISO639Standard = function() { + var language = quail.html.find('html').attr('lang'); + if(!language) { + return; + } + if(quail.strings.languageCodes.indexOf(language) === -1) { + quail.testFails('documentLangIsISO639Standard', quail.html.find('html')); + } +}; diff --git a/src/js/custom/documentStrictDocType.js b/src/js/custom/documentStrictDocType.js new file mode 100644 index 000000000..ac771f646 --- /dev/null +++ b/src/js/custom/documentStrictDocType.js @@ -0,0 +1,6 @@ +quail.documentStrictDocType = function() { + if(!$(quail.html.get(0).doctype).length || + quail.html.get(0).doctype.systemId.indexOf('strict') === -1) { + quail.testFails('documentStrictDocType', quail.html.find('html')); + } +}; diff --git a/src/js/custom/documentTitleIsShort.js b/src/js/custom/documentTitleIsShort.js new file mode 100644 index 000000000..7d4f86855 --- /dev/null +++ b/src/js/custom/documentTitleIsShort.js @@ -0,0 +1,5 @@ +quail.documentTitleIsShort = function() { + if(quail.html.find('head title:first').text().length > 150) { + quail.testFails('documentTitleIsShort', quail.html.find('head title:first')); + } +}; diff --git a/src/js/custom/documentValidatesToDocType.js b/src/js/custom/documentValidatesToDocType.js new file mode 100644 index 000000000..73d16e6bb --- /dev/null +++ b/src/js/custom/documentValidatesToDocType.js @@ -0,0 +1,5 @@ +quail.documentValidatesToDocType = function() { + if(typeof document.doctype === 'undefined') { + return; + } +}; diff --git a/src/js/custom/documentVisualListsAreMarkedUp.js b/src/js/custom/documentVisualListsAreMarkedUp.js new file mode 100644 index 000000000..1d3af9bd5 --- /dev/null +++ b/src/js/custom/documentVisualListsAreMarkedUp.js @@ -0,0 +1,10 @@ +quail.documentVisualListsAreMarkedUp = function() { + quail.html.find('p, div, h1, h2, h3, h4, h5, h6').each(function() { + var $element = $(this); + $.each(quail.strings.symbols, function(index, item) { + if($element.text().split(item).length > 2) { + quail.testFails('documentVisualListsAreMarkedUp', $element); + } + }); + }); +}; diff --git a/src/js/custom/embedHasAssociatedNoEmbed.js b/src/js/custom/embedHasAssociatedNoEmbed.js new file mode 100644 index 000000000..5e41da74f --- /dev/null +++ b/src/js/custom/embedHasAssociatedNoEmbed.js @@ -0,0 +1,8 @@ +quail.embedHasAssociatedNoEmbed = function() { + if(quail.html.find('noembed').length) { + return; + } + quail.html.find('embed').each(function() { + quail.testFails('embedHasAssociatedNoEmbed', $(this)); + }); +}; diff --git a/src/js/custom/emoticonsExcessiveUse.js b/src/js/custom/emoticonsExcessiveUse.js new file mode 100644 index 000000000..23bbfde50 --- /dev/null +++ b/src/js/custom/emoticonsExcessiveUse.js @@ -0,0 +1,17 @@ +quail.emoticonsExcessiveUse = function() { + var count = 0; + quail.html.find('p, div, h1, h2, h3, h4, h5, h6').each(function() { + var $element = $(this); + $.each($element.text().split(' '), function(index, word) { + if(quail.strings.emoticons.indexOf(word) > -1) { + count++; + } + if(count > 4) { + return; + } + }); + if(count > 4) { + quail.testFails('emoticonsExcessiveUse', $element); + } + }); +}; diff --git a/src/js/custom/emoticonsMissingAbbr.js b/src/js/custom/emoticonsMissingAbbr.js new file mode 100644 index 000000000..2aa031ec9 --- /dev/null +++ b/src/js/custom/emoticonsMissingAbbr.js @@ -0,0 +1,14 @@ +quail.emoticonsMissingAbbr = function() { + quail.html.find('p, div, h1, h2, h3, h4, h5, h6').each(function() { + var $element = $(this); + var $clone = $element.clone(); + $clone.find('abbr, acronym').each(function() { + $(this).remove(); + }); + $.each($clone.text().split(' '), function(index, word) { + if(quail.strings.emoticons.indexOf(word) > -1) { + quail.testFails('emoticonsMissingAbbr', $element); + } + }); + }); +}; diff --git a/src/js/custom/formWithRequiredLabel.js b/src/js/custom/formWithRequiredLabel.js new file mode 100644 index 000000000..b352d78ca --- /dev/null +++ b/src/js/custom/formWithRequiredLabel.js @@ -0,0 +1,19 @@ +quail.formWithRequiredLabel = function() { + var redundant = quail.strings.redundant; + var lastStyle, currentStyle = false; + redundant.required[redundant.required.indexOf('*')] = /\*/g; + quail.html.find('label').each(function() { + var text = $(this).text().toLowerCase(); + var $label = $(this); + $.each(redundant.required, function(index, word) { + if(text.search(word) >= 0 && !quail.html.find('#' + $label.attr('for')).attr('aria-required')) { + quail.testFails('formWithRequiredLabel', $label); + } + }); + currentStyle = $label.css('color') + $label.css('font-weight') + $label.css('background-color'); + if(lastStyle && currentStyle !== lastStyle) { + quail.testFails('formWithRequiredLabel', $label); + } + lastStyle = currentStyle; + }); +}; diff --git a/src/js/custom/headersUseToMarkSections.js b/src/js/custom/headersUseToMarkSections.js new file mode 100644 index 000000000..98977da4c --- /dev/null +++ b/src/js/custom/headersUseToMarkSections.js @@ -0,0 +1,10 @@ +quail.headersUseToMarkSections = function() { + quail.html.find('p').each(function() { + var $paragraph = $(this); + $paragraph.find('strong:first, em:first, i:first, b:first').each(function() { + if($paragraph.text() === $(this).text()) { + quail.testFails('headersUseToMarkSections', $paragraph); + } + }); + }); +}; diff --git a/src/js/custom/imgAltIsDifferent.js b/src/js/custom/imgAltIsDifferent.js new file mode 100644 index 000000000..d437598e0 --- /dev/null +++ b/src/js/custom/imgAltIsDifferent.js @@ -0,0 +1,7 @@ +quail.imgAltIsDifferent = function() { + quail.html.find('img[alt][src]').each(function() { + if($(this).attr('src') === $(this).attr('alt') || $(this).attr('src').split('/').pop() === $(this).attr('alt')) { + quail.testFails('imgAltIsDifferent', $(this)); + } + }); +}; diff --git a/src/js/custom/imgAltIsTooLong.js b/src/js/custom/imgAltIsTooLong.js new file mode 100644 index 000000000..9bbdbca9c --- /dev/null +++ b/src/js/custom/imgAltIsTooLong.js @@ -0,0 +1,7 @@ +quail.imgAltIsTooLong = function() { + quail.html.find('img[alt]').each(function() { + if($(this).attr('alt').length > 100) { + quail.testFails('imgAltIsTooLong', $(this)); + } + }); +}; diff --git a/src/js/custom/imgAltNotEmptyInAnchor.js b/src/js/custom/imgAltNotEmptyInAnchor.js new file mode 100644 index 000000000..953d73ec4 --- /dev/null +++ b/src/js/custom/imgAltNotEmptyInAnchor.js @@ -0,0 +1,8 @@ +quail.imgAltNotEmptyInAnchor = function() { + quail.html.find('a img').each(function() { + if(quail.isUnreadable($(this).attr('alt')) && + quail.isUnreadable($(this).parent('a:first').text())) { + quail.testFails('imgAltNotEmptyInAnchor', $(this)); + } + }); +}; diff --git a/src/js/custom/imgAltTextNotRedundant.js b/src/js/custom/imgAltTextNotRedundant.js new file mode 100644 index 000000000..e49961aca --- /dev/null +++ b/src/js/custom/imgAltTextNotRedundant.js @@ -0,0 +1,13 @@ +quail.imgAltTextNotRedundant = function() { + var altText = {}; + quail.html.find('img[alt]').each(function() { + if(typeof altText[$(this).attr('alt')] === 'undefined') { + altText[$(this).attr('alt')] = $(this).attr('src'); + } + else { + if(altText[$(this).attr('alt')] !== $(this).attr('src')) { + quail.testFails('imgAltTextNotRedundant', $(this)); + } + } + }); +}; diff --git a/src/js/custom/imgGifNoFlicker.js b/src/js/custom/imgGifNoFlicker.js new file mode 100644 index 000000000..fe9503f3e --- /dev/null +++ b/src/js/custom/imgGifNoFlicker.js @@ -0,0 +1,13 @@ +quail.imgGifNoFlicker = function() { + quail.html.find('img[src$=".gif"]').each(function() { + var $image = $(this); + $.ajax({url : $image.attr('src'), + async : false, + dataType : 'text', + success : function(data) { + if(data.search('NETSCAPE2.0') !== -1) { + quail.testFails('imgGifNoFlicker', $image); + } + }}); + }); +}; diff --git a/src/js/custom/imgHasLongDesc.js b/src/js/custom/imgHasLongDesc.js new file mode 100644 index 000000000..9ba4d1486 --- /dev/null +++ b/src/js/custom/imgHasLongDesc.js @@ -0,0 +1,8 @@ +quail.imgHasLongDesc = function() { + quail.html.find('img[longdesc]').each(function() { + if($(this).attr('longdesc') === $(this).attr('alt') || + !quail.validURL($(this).attr('longdesc'))) { + quail.testFails('imgHasLongDesc', $(this)); + } + }); +}; diff --git a/src/js/custom/imgImportantNoSpacerAlt.js b/src/js/custom/imgImportantNoSpacerAlt.js new file mode 100644 index 000000000..af4764bc1 --- /dev/null +++ b/src/js/custom/imgImportantNoSpacerAlt.js @@ -0,0 +1,12 @@ +quail.imgImportantNoSpacerAlt = function() { + quail.html.find('img[alt]').each(function() { + var width = ($(this).width()) ? $(this).width() : parseInt($(this).attr('width'), 10); + var height = ($(this).height()) ? $(this).height() : parseInt($(this).attr('height'), 10); + if(quail.isUnreadable($(this).attr('alt').trim()) && + $(this).attr('alt').length > 0 && + width > 50 && + height > 50) { + quail.testFails('imgImportantNoSpacerAlt', $(this)); + } + }); +}; diff --git a/src/js/custom/imgMapAreasHaveDuplicateLink.js b/src/js/custom/imgMapAreasHaveDuplicateLink.js new file mode 100644 index 000000000..0dc4b1f80 --- /dev/null +++ b/src/js/custom/imgMapAreasHaveDuplicateLink.js @@ -0,0 +1,20 @@ +quail.imgMapAreasHaveDuplicateLink = function() { + var links = { }; + quail.html.find('a').each(function() { + links[$(this).attr('href')] = $(this).attr('href'); + }); + quail.html.find('img[usemap]').each(function() { + var $image = $(this); + var $map = quail.html.find($image.attr('usemap')); + if(!$map.length) { + $map = quail.html.find('map[name="' + $image.attr('usemap').replace('#', '') + '"]'); + } + if($map.length) { + $map.find('area').each(function() { + if(typeof links[$(this).attr('href')] === 'undefined') { + quail.testFails('imgMapAreasHaveDuplicateLink', $image); + } + }); + } + }); +}; diff --git a/src/js/custom/imgNonDecorativeHasAlt.js b/src/js/custom/imgNonDecorativeHasAlt.js new file mode 100644 index 000000000..5af13a4f5 --- /dev/null +++ b/src/js/custom/imgNonDecorativeHasAlt.js @@ -0,0 +1,8 @@ +quail.imgNonDecorativeHasAlt = function() { + quail.html.find('img[alt]').each(function() { + if(quail.isUnreadable($(this).attr('alt')) && + ($(this).width() > 100 || $(this).height() > 100)) { + quail.testFails('imgNonDecorativeHasAlt', $(this)); + } + }); +}; diff --git a/src/js/custom/imgWithMathShouldHaveMathEquivalent.js b/src/js/custom/imgWithMathShouldHaveMathEquivalent.js new file mode 100644 index 000000000..db862935d --- /dev/null +++ b/src/js/custom/imgWithMathShouldHaveMathEquivalent.js @@ -0,0 +1,7 @@ +quail.imgWithMathShouldHaveMathEquivalent = function() { + quail.html.find('img:not(img:has(math), img:has(tagName))').each(function() { + if(!$(this).parent().find('math').length) { + quail.testFails('imgWithMathShouldHaveMathEquivalent', $(this)); + } + }); +}; diff --git a/src/js/custom/inputCheckboxRequiresFieldset.js b/src/js/custom/inputCheckboxRequiresFieldset.js new file mode 100644 index 000000000..c4a15b9e2 --- /dev/null +++ b/src/js/custom/inputCheckboxRequiresFieldset.js @@ -0,0 +1,7 @@ +quail.inputCheckboxRequiresFieldset = function() { + quail.html.find(':checkbox').each(function() { + if(!$(this).parents('fieldset').length) { + quail.testFails('inputCheckboxRequiresFieldset', $(this)); + } + }); +}; diff --git a/src/js/custom/inputImageAltIsNotFileName.js b/src/js/custom/inputImageAltIsNotFileName.js new file mode 100644 index 000000000..d592c6f29 --- /dev/null +++ b/src/js/custom/inputImageAltIsNotFileName.js @@ -0,0 +1,7 @@ +quail.inputImageAltIsNotFileName = function() { + quail.html.find('input[type=image][alt]').each(function() { + if($(this).attr('src') === $(this).attr('alt')) { + quail.testFails('inputImageAltIsNotFileName', $(this)); + } + }); +}; diff --git a/src/js/custom/inputImageAltIsShort.js b/src/js/custom/inputImageAltIsShort.js new file mode 100644 index 000000000..5e954cf98 --- /dev/null +++ b/src/js/custom/inputImageAltIsShort.js @@ -0,0 +1,7 @@ +quail.inputImageAltIsShort = function() { + quail.html.find('input[type=image]').each(function() { + if($(this).attr('alt').length > 100) { + quail.testFails('inputImageAltIsShort', $(this)); + } + }); +}; diff --git a/src/js/custom/inputImageAltNotRedundant.js b/src/js/custom/inputImageAltNotRedundant.js new file mode 100644 index 000000000..99d949373 --- /dev/null +++ b/src/js/custom/inputImageAltNotRedundant.js @@ -0,0 +1,7 @@ +quail.inputImageAltNotRedundant = function() { + quail.html.find('input[type=image][alt]').each(function() { + if(quail.strings.redundant.inputImage.indexOf(quail.cleanString($(this).attr('alt'))) > -1) { + quail.testFails('inputImageAltNotRedundant', $(this)); + } + }); +}; diff --git a/src/js/custom/labelMustBeUnique.js b/src/js/custom/labelMustBeUnique.js new file mode 100644 index 000000000..da7cf2911 --- /dev/null +++ b/src/js/custom/labelMustBeUnique.js @@ -0,0 +1,9 @@ +quail.labelMustBeUnique = function() { + var labels = { }; + quail.html.find('label[for]').each(function() { + if(typeof labels[$(this).attr('for')] !== 'undefined') { + quail.testFails('labelMustBeUnique', $(this)); + } + labels[$(this).attr('for')] = $(this).attr('for'); + }); +}; diff --git a/src/js/custom/labelsAreAssignedToAnInput.js b/src/js/custom/labelsAreAssignedToAnInput.js new file mode 100644 index 000000000..0e75c8845 --- /dev/null +++ b/src/js/custom/labelsAreAssignedToAnInput.js @@ -0,0 +1,13 @@ +quail.labelsAreAssignedToAnInput = function() { + quail.html.find('label').each(function() { + if(!$(this).attr('for')) { + quail.testFails('labelsAreAssignedToAnInput', $(this)); + } + else { + if(!quail.html.find('#' + $(this).attr('for')).length || + !quail.html.find('#' + $(this).attr('for')).is('input, select, textarea')) { + quail.testFails('labelsAreAssignedToAnInput', $(this)); + } + } + }); +}; diff --git a/src/js/custom/listNotUsedForFormatting.js b/src/js/custom/listNotUsedForFormatting.js new file mode 100644 index 000000000..2f104846f --- /dev/null +++ b/src/js/custom/listNotUsedForFormatting.js @@ -0,0 +1,7 @@ +quail.listNotUsedForFormatting = function() { + quail.html.find('ol, ul').each(function() { + if($(this).find('li').length < 2) { + quail.testFails('listNotUsedForFormatting', $(this)); + } + }); +}; diff --git a/src/js/custom/pNotUsedAsHeader.js b/src/js/custom/pNotUsedAsHeader.js new file mode 100644 index 000000000..b8fe07ac1 --- /dev/null +++ b/src/js/custom/pNotUsedAsHeader.js @@ -0,0 +1,27 @@ +quail.pNotUsedAsHeader = function() { + var priorStyle = { }; + quail.html.find('p').each(function() { + if($(this).text().search('.') < 1) { + var $paragraph = $(this); + $.each(quail.suspectPHeaderTags, function(index, tag) { + if($paragraph.find(tag).length) { + $paragraph.find(tag).each(function() { + if($(this).text().trim() === $paragraph.text().trim()) { + quail.testFails('pNotUsedAsHeader', $paragraph); + } + }); + } + }); + $.each(quail.suspectPCSSStyles, function(index, style) { + if(typeof priorStyle[style] !== 'undefined' && + priorStyle[style] !== $paragraph.css(style)) { + quail.testFails('pNotUsedAsHeader', $paragraph); + } + priorStyle[style] = $paragraph.css(style); + }); + if($paragraph.css('font-weight') === 'bold') { + quail.testFails('pNotUsedAsHeader', $paragraph); + } + } + }); +}; diff --git a/src/js/custom/paragarphIsWrittenClearly.js b/src/js/custom/paragarphIsWrittenClearly.js new file mode 100644 index 000000000..3c410d6d2 --- /dev/null +++ b/src/js/custom/paragarphIsWrittenClearly.js @@ -0,0 +1,8 @@ +quail.paragarphIsWrittenClearly = function() { + quail.html.find('p').each(function() { + var text = quail.components.textStatistics.cleanText($(this).text()); + if(Math.round((206.835 - (1.015 * quail.components.textStatistics.averageWordsPerSentence(text)) - (84.6 * quail.components.textStatistics.averageSyllablesPerWord(text)))) < 60) { + quail.testFails('paragarphIsWrittenClearly', $(this)); + } + }); +}; diff --git a/src/js/custom/preShouldNotBeUsedForTabularLayout.js b/src/js/custom/preShouldNotBeUsedForTabularLayout.js new file mode 100644 index 000000000..5c91aa514 --- /dev/null +++ b/src/js/custom/preShouldNotBeUsedForTabularLayout.js @@ -0,0 +1,8 @@ +quail.preShouldNotBeUsedForTabularLayout = function() { + quail.html.find('pre').each(function() { + var rows = $(this).text().split(/[\n\r]+/); + if(rows.length > 1 && $(this).text().search(/\t/) > -1) { + quail.testFails('preShouldNotBeUsedForTabularLayout', $(this)); + } + }); +}; diff --git a/src/js/custom/selectJumpMenu.js b/src/js/custom/selectJumpMenu.js new file mode 100644 index 000000000..930223bd4 --- /dev/null +++ b/src/js/custom/selectJumpMenu.js @@ -0,0 +1,12 @@ +quail.selectJumpMenu = function() { + if(quail.html.find('select').length === 0) { + return; + } + + quail.html.find('select').each(function() { + if($(this).parent('form').find(':submit').length === 0 && + quail.components.hasEventListener($(this), 'change')) { + quail.testFails('selectJumpMenu', $(this)); + } + }); +}; diff --git a/src/js/custom/siteMap.js b/src/js/custom/siteMap.js new file mode 100644 index 000000000..697cfaeb3 --- /dev/null +++ b/src/js/custom/siteMap.js @@ -0,0 +1,18 @@ +quail.siteMap = function() { + var set = true; + quail.html.find('a').each(function() { + var text = $(this).text().toLowerCase(); + $.each(quail.strings.siteMap, function(index, string) { + if(text.search(string) > -1) { + set = false; + return; + } + }); + if(set === false) { + return; + } + }); + if(set) { + quail.testFails('siteMap', quail.html.find('body')); + } +}; diff --git a/src/js/custom/tabIndexFollowsLogicalOrder.js b/src/js/custom/tabIndexFollowsLogicalOrder.js new file mode 100644 index 000000000..106f971b2 --- /dev/null +++ b/src/js/custom/tabIndexFollowsLogicalOrder.js @@ -0,0 +1,10 @@ +quail.tabIndexFollowsLogicalOrder = function() { + var index = 0; + quail.html.find('[tabindex]').each(function() { + if(parseInt($(this).attr('tabindex'), 10) >= 0 && + parseInt($(this).attr('tabindex'), 10) !== index + 1) { + quail.testFails('tabIndexFollowsLogicalOrder', $(this)); + } + index++; + }); +}; diff --git a/src/js/custom/tableHeaderLabelMustBeTerse.js b/src/js/custom/tableHeaderLabelMustBeTerse.js new file mode 100644 index 000000000..0fe0dedac --- /dev/null +++ b/src/js/custom/tableHeaderLabelMustBeTerse.js @@ -0,0 +1,8 @@ +quail.tableHeaderLabelMustBeTerse = function() { + quail.html.find('th, table tr:first td').each(function() { + if($(this).text().length > 20 && + (!$(this).attr('abbr') || $(this).attr('abbr').length > 20)) { + quail.testFails('tableHeaderLabelMustBeTerse', $(this)); + } + }); +}; diff --git a/src/js/custom/tableLayoutDataShouldNotHaveTh.js b/src/js/custom/tableLayoutDataShouldNotHaveTh.js new file mode 100644 index 000000000..78437e9e6 --- /dev/null +++ b/src/js/custom/tableLayoutDataShouldNotHaveTh.js @@ -0,0 +1,7 @@ +quail.tableLayoutDataShouldNotHaveTh = function() { + quail.html.find('table:has(th)').each(function() { + if(!quail.isDataTable($(this))) { + quail.testFails('tableLayoutDataShouldNotHaveTh', $(this)); + } + }); +}; diff --git a/src/js/custom/tableLayoutHasNoCaption.js b/src/js/custom/tableLayoutHasNoCaption.js new file mode 100644 index 000000000..7b6c65caa --- /dev/null +++ b/src/js/custom/tableLayoutHasNoCaption.js @@ -0,0 +1,7 @@ +quail.tableLayoutHasNoCaption = function() { + quail.html.find('table:has(caption)').each(function() { + if(!quail.isDataTable($(this))) { + quail.testFails('tableLayoutHasNoCaption', $(this)); + } + }); +}; diff --git a/src/js/custom/tableLayoutHasNoSummary.js b/src/js/custom/tableLayoutHasNoSummary.js new file mode 100644 index 000000000..66f680020 --- /dev/null +++ b/src/js/custom/tableLayoutHasNoSummary.js @@ -0,0 +1,7 @@ +quail.tableLayoutHasNoSummary = function() { + quail.html.find('table[summary]').each(function() { + if(!quail.isDataTable($(this)) && !quail.isUnreadable($(this).attr('summary'))) { + quail.testFails('tableLayoutHasNoSummary', $(this)); + } + }); +}; diff --git a/src/js/custom/tableLayoutMakesSenseLinearized.js b/src/js/custom/tableLayoutMakesSenseLinearized.js new file mode 100644 index 000000000..0b9fcec3e --- /dev/null +++ b/src/js/custom/tableLayoutMakesSenseLinearized.js @@ -0,0 +1,7 @@ +quail.tableLayoutMakesSenseLinearized = function() { + quail.html.find('table').each(function() { + if(!quail.isDataTable($(this))) { + quail.testFails('tableLayoutMakesSenseLinearized', $(this)); + } + }); +}; diff --git a/src/js/custom/tableNotUsedForLayout.js b/src/js/custom/tableNotUsedForLayout.js new file mode 100644 index 000000000..577b4181b --- /dev/null +++ b/src/js/custom/tableNotUsedForLayout.js @@ -0,0 +1,7 @@ +quail.tableNotUsedForLayout = function() { + quail.html.find('table').each(function() { + if(!quail.isDataTable($(this))) { + quail.testFails('tableNotUsedForLayout', $(this)); + } + }); +}; diff --git a/src/js/custom/tableSummaryDoesNotDuplicateCaption.js b/src/js/custom/tableSummaryDoesNotDuplicateCaption.js new file mode 100644 index 000000000..d640d08cc --- /dev/null +++ b/src/js/custom/tableSummaryDoesNotDuplicateCaption.js @@ -0,0 +1,7 @@ +quail.tableSummaryDoesNotDuplicateCaption = function() { + quail.html.find('table[summary]:has(caption)').each(function() { + if(quail.cleanString($(this).attr('summary')) === quail.cleanString($(this).find('caption:first').text())) { + quail.testFails('tableSummaryDoesNotDuplicateCaption', $(this)); + } + }); +}; diff --git a/src/js/custom/tableSummaryIsNotTooLong.js b/src/js/custom/tableSummaryIsNotTooLong.js new file mode 100644 index 000000000..8705c6edb --- /dev/null +++ b/src/js/custom/tableSummaryIsNotTooLong.js @@ -0,0 +1,7 @@ +quail.tableSummaryIsNotTooLong = function() { + quail.html.find('table[summary]').each(function() { + if($(this).attr('summary').trim().length > 100) { + quail.testFails('tableSummaryIsNotTooLong', $(this)); + } + }); +}; diff --git a/src/js/custom/tableUseColGroup.js b/src/js/custom/tableUseColGroup.js new file mode 100644 index 000000000..49f8b3a0d --- /dev/null +++ b/src/js/custom/tableUseColGroup.js @@ -0,0 +1,7 @@ +quail.tableUseColGroup = function() { + quail.html.find('table').each(function() { + if(quail.isDataTable($(this)) && !$(this).find('colgroup').length) { + quail.testFails('tableUseColGroup', $(this)); + } + }); +}; diff --git a/src/js/custom/tableUsesAbbreviationForHeader.js b/src/js/custom/tableUsesAbbreviationForHeader.js new file mode 100644 index 000000000..18ccfc34f --- /dev/null +++ b/src/js/custom/tableUsesAbbreviationForHeader.js @@ -0,0 +1,7 @@ +quail.tableUsesAbbreviationForHeader = function() { + quail.html.find('th:not(th[abbr])').each(function() { + if($(this).text().length > 20) { + quail.testFails('tableUsesAbbreviationForHeader', $(this)); + } + }); +}; diff --git a/src/js/custom/tableUsesScopeForRow.js b/src/js/custom/tableUsesScopeForRow.js new file mode 100644 index 000000000..44744fda8 --- /dev/null +++ b/src/js/custom/tableUsesScopeForRow.js @@ -0,0 +1,18 @@ +quail.tableUsesScopeForRow = function() { + quail.html.find('table').each(function() { + $(this).find('td:first-child').each(function() { + var $next = $(this).next('td'); + if(($(this).css('font-weight') === 'bold' && $next.css('font-weight') !== 'bold') || + ($(this).find('strong').length && !$next.find('strong').length)) { + quail.testFails('tableUsesScopeForRow', $(this)); + } + }); + $(this).find('td:last-child').each(function() { + var $prev = $(this).prev('td'); + if(($(this).css('font-weight') === 'bold' && $prev.css('font-weight') !== 'bold') || + ($(this).find('strong').length && !$prev.find('strong').length)) { + quail.testFails('tableUsesScopeForRow', $(this)); + } + }); + }); +}; \ No newline at end of file diff --git a/src/js/custom/tableWithMoreHeadersUseID.js b/src/js/custom/tableWithMoreHeadersUseID.js new file mode 100644 index 000000000..850b7335a --- /dev/null +++ b/src/js/custom/tableWithMoreHeadersUseID.js @@ -0,0 +1,14 @@ +quail.tableWithMoreHeadersUseID = function() { + quail.html.find('table:has(th)').each(function() { + var $table = $(this); + var rows = 0; + $table.find('tr').each(function() { + if($(this).find('th').length) { + rows++; + } + if(rows > 1 && !$(this).find('th[id]').length) { + quail.testFails('tableWithMoreHeadersUseID', $table); + } + }); + }); +}; diff --git a/src/js/custom/tabularDataIsInTable.js b/src/js/custom/tabularDataIsInTable.js new file mode 100644 index 000000000..c28235c22 --- /dev/null +++ b/src/js/custom/tabularDataIsInTable.js @@ -0,0 +1,7 @@ +quail.tabularDataIsInTable = function() { + quail.html.find('pre').each(function() { + if($(this).html().search('\t') >= 0) { + quail.testFails('tabularDataIsInTable', $(this)); + } + }); +}; diff --git a/src/js/custom/textIsNotSmall.js b/src/js/custom/textIsNotSmall.js new file mode 100644 index 000000000..0deaef42b --- /dev/null +++ b/src/js/custom/textIsNotSmall.js @@ -0,0 +1,12 @@ +quail.textIsNotSmall = function() { + quail.html.find(quail.textSelector).each(function() { + var fontSize = $(this).css('font-size'); + if(fontSize.search('em') > 0) { + fontSize = quail.components.convertToPx(fontSize); + } + fontSize = parseInt(fontSize.replace('px', ''), 10); + if(fontSize < 10) { + quail.testFails('textIsNotSmall', $(this)); + } + }); +}; diff --git a/src/js/custom/videosEmbeddedOrLinkedNeedCaptions.js b/src/js/custom/videosEmbeddedOrLinkedNeedCaptions.js new file mode 100644 index 000000000..d175c79cb --- /dev/null +++ b/src/js/custom/videosEmbeddedOrLinkedNeedCaptions.js @@ -0,0 +1,14 @@ +quail.videosEmbeddedOrLinkedNeedCaptions = function() { + quail.html.find('a').each(function() { + var $link = $(this); + $.each(quail.components.video, function(type, callback) { + if(callback.isVideo($link.attr('href'))) { + callback.hasCaptions(function(hasCaptions) { + if(!hasCaptions) { + quail.testFails('videosEmbeddedOrLinkedNeedCaptions', $link); + } + }); + } + }); + }); +}; diff --git a/src/js/strings/colors.js b/src/js/strings/colors.js new file mode 100644 index 000000000..54e2fe4db --- /dev/null +++ b/src/js/strings/colors.js @@ -0,0 +1,142 @@ +quail.strings.colors = { + "aliceblue": "f0f8ff", + "antiquewhite": "faebd7", + "aqua": "00ffff", + "aquamarine": "7fffd4", + "azure": "f0ffff", + "beige": "f5f5dc", + "bisque": "ffe4c4", + "black": "000000", + "blanchedalmond": "ffebcd", + "blue": "0000ff", + "blueviolet": "8a2be2", + "brown": "a52a2a", + "burlywood": "deb887", + "cadetblue": "5f9ea0", + "chartreuse": "7fff00", + "chocolate": "d2691e", + "coral": "ff7f50", + "cornflowerblue": "6495ed", + "cornsilk": "fff8dc", + "crimson": "dc143c", + "cyan": "00ffff", + "darkblue": "00008b", + "darkcyan": "008b8b", + "darkgoldenrod": "b8860b", + "darkgray": "a9a9a9", + "darkgreen": "006400", + "darkkhaki": "bdb76b", + "darkmagenta": "8b008b", + "darkolivegreen": "556b2f", + "darkorange": "ff8c00", + "darkorchid": "9932cc", + "darkred": "8b0000", + "darksalmon": "e9967a", + "darkseagreen": "8fbc8f", + "darkslateblue": "483d8b", + "darkslategray": "2f4f4f", + "darkturquoise": "00ced1", + "darkviolet": "9400d3", + "deeppink": "ff1493", + "deepskyblue": "00bfff", + "dimgray": "696969", + "dodgerblue": "1e90ff", + "firebrick": "b22222", + "floralwhite": "fffaf0", + "forestgreen": "228b22", + "fuchsia": "ff00ff", + "gainsboro": "dcdcdc", + "ghostwhite": "f8f8ff", + "gold": "ffd700", + "goldenrod": "daa520", + "gray": "808080", + "green": "008000", + "greenyellow": "adff2f", + "honeydew": "f0fff0", + "hotpink": "ff69b4", + "indianred": "cd5c5c", + "indigo": "4b0082", + "ivory": "fffff0", + "khaki": "f0e68c", + "lavender": "e6e6fa", + "lavenderblush": "fff0f5", + "lawngreen": "7cfc00", + "lemonchiffon": "fffacd", + "lightblue": "add8e6", + "lightcoral": "f08080", + "lightcyan": "e0ffff", + "lightgoldenrodyellow": "fafad2", + "lightgrey": "d3d3d3", + "lightgreen": "90ee90", + "lightpink": "ffb6c1", + "lightsalmon": "ffa07a", + "lightseagreen": "20b2aa", + "lightskyblue": "87cefa", + "lightslategray": "778899", + "lightsteelblue": "b0c4de", + "lightyellow": "ffffe0", + "lime": "00ff00", + "limegreen": "32cd32", + "linen": "faf0e6", + "magenta": "ff00ff", + "maroon": "800000", + "mediumaquamarine": "66cdaa", + "mediumblue": "0000cd", + "mediumorchid": "ba55d3", + "mediumpurple": "9370d8", + "mediumseagreen": "3cb371", + "mediumslateblue": "7b68ee", + "mediumspringgreen": "00fa9a", + "mediumturquoise": "48d1cc", + "mediumvioletred": "c71585", + "midnightblue": "191970", + "mintcream": "f5fffa", + "mistyrose": "ffe4e1", + "moccasin": "ffe4b5", + "navajowhite": "ffdead", + "navy": "000080", + "oldlace": "fdf5e6", + "olive": "808000", + "olivedrab": "6b8e23", + "orange": "ffa500", + "orangered": "ff4500", + "orchid": "da70d6", + "palegoldenrod": "eee8aa", + "palegreen": "98fb98", + "paleturquoise": "afeeee", + "palevioletred": "d87093", + "papayawhip": "ffefd5", + "peachpuff": "ffdab9", + "peru": "cd853f", + "pink": "ffc0cb", + "plum": "dda0dd", + "powderblue": "b0e0e6", + "purple": "800080", + "red": "ff0000", + "rosybrown": "bc8f8f", + "royalblue": "4169e1", + "saddlebrown": "8b4513", + "salmon": "fa8072", + "sandybrown": "f4a460", + "seagreen": "2e8b57", + "seashell": "fff5ee", + "sienna": "a0522d", + "silver": "c0c0c0", + "skyblue": "87ceeb", + "slateblue": "6a5acd", + "slategray": "708090", + "snow": "fffafa", + "springgreen": "00ff7f", + "steelblue": "4682b4", + "tan": "d2b48c", + "teal": "008080", + "thistle": "d8bfd8", + "tomato": "ff6347", + "turquoise": "40e0d0", + "violet": "ee82ee", + "wheat": "f5deb3", + "white": "ffffff", + "whitesmoke": "f5f5f5", + "yellow": "ffff00", + "yellowgreen": "9acd32" +}; \ No newline at end of file diff --git a/src/js/strings/emoticons.js b/src/js/strings/emoticons.js new file mode 100644 index 000000000..7303f0e70 --- /dev/null +++ b/src/js/strings/emoticons.js @@ -0,0 +1,27 @@ +quail.strings.emoticons = [ + ":)", + ";)", + ":-)", + ":^)", + "=)", + "B)", + "8)", + "c8", + "cB", + "=]", + ":]", + "x]", + ":-)", + ":)", + ":o)", + "=]", + ":-D", + ":D", + "=D", + ":-(", + ":(", + "=(", + ":/", + ":P", + ":o" +]; diff --git a/src/js/strings/languageCodes.js b/src/js/strings/languageCodes.js new file mode 100644 index 000000000..31bb30acd --- /dev/null +++ b/src/js/strings/languageCodes.js @@ -0,0 +1,202 @@ +quail.strings.languageCodes = [ + "bh", + "bi", + "nb", + "bs", + "br", + "bg", + "my", + "es", + "ca", + "km", + "ch", + "ce", + "ny", + "ny", + "zh", + "za", + "cu", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "nl", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kl", + "kn", + "kr", + "ks", + "kk", + "ki", + "rw", + "ky", + "kv", + "kg", + "ko", + "kj", + "ku", + "kj", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "li", + "li", + "ln", + "lt", + "lu", + "lb", + "mk", + "mg", + "ms", + "ml", + "dv", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "ro", + "mn", + "na", + "nv", + "nv", + "nd", + "nr", + "ng", + "ne", + "nd", + "se", + "no", + "nb", + "nn", + "ii", + "ny", + "nn", + "ie", + "oc", + "oj", + "cu", + "cu", + "cu", + "or", + "om", + "os", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "pa", + "ps", + "qu", + "ro", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "gd", + "sr", + "sn", + "ii", + "sd", + "si", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "ug", + "uz", + "ca", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" +]; \ No newline at end of file diff --git a/src/js/strings/placeholders.js b/src/js/strings/placeholders.js new file mode 100644 index 000000000..87fa48acf --- /dev/null +++ b/src/js/strings/placeholders.js @@ -0,0 +1,22 @@ +quail.strings.placeholders = [ +"title", +"untitled", +"untitled document", +"this is the title", +"the title", +"content", +" ", +"new page", +"new", +"nbsp", +" ", +"spacer", +"image", +"img", +"photo", +"frame", +"frame title", +"iframe", +"iframe title", +"legend" +]; \ No newline at end of file diff --git a/src/js/strings/redundant.js b/src/js/strings/redundant.js new file mode 100644 index 000000000..2b020cfc9 --- /dev/null +++ b/src/js/strings/redundant.js @@ -0,0 +1,18 @@ +quail.strings.redundant = { + "inputImage":[ + "submit", + "button" + ], + "link":[ + "link to", + "link", + "go to", + "click here", + "link", + "click", + "more" + ], + "required":[ + "*" + ] +}; \ No newline at end of file diff --git a/src/js/strings/siteMap.js b/src/js/strings/siteMap.js new file mode 100644 index 000000000..a86e77c39 --- /dev/null +++ b/src/js/strings/siteMap.js @@ -0,0 +1,5 @@ +quail.strings.siteMap = [ + "site map", + "map", + "sitemap" +]; \ No newline at end of file diff --git a/src/js/strings/suspiciousLinks.js b/src/js/strings/suspiciousLinks.js new file mode 100644 index 000000000..d28216398 --- /dev/null +++ b/src/js/strings/suspiciousLinks.js @@ -0,0 +1,20 @@ +quail.strings.suspiciousLinks = [ +"click here", +"click", +"more", +"here", +"read more", +"download", +"add", +"delete", +"clone", +"order", +"view", +"read", +"clic aquí", +"clic", +"haga clic", +"más", +"aquí", +"image" +]; \ No newline at end of file diff --git a/src/js/strings/symbols.js b/src/js/strings/symbols.js new file mode 100644 index 000000000..46925c650 --- /dev/null +++ b/src/js/strings/symbols.js @@ -0,0 +1,8 @@ +quail.strings.symbols = [ + "|", + "*", + /\*/g, + "
    *", + '•', + '•' +]; diff --git a/src/quail.js b/src/quail.js deleted file mode 100644 index dc8b9d1ef..000000000 --- a/src/quail.js +++ /dev/null @@ -1,1377 +0,0 @@ -/*! QUAIL quailjs.org | quailjs.org/license */ - -;(function($) { - - $.fn.quail = function(options) { - if (!this.length) { - return this; - } - quail.options = options; - - quail.html = this; - quail.run(); - - return this; - }; - - var quail = { - - options : { }, - - testCallbacks : { - 'placeholder' : 'placeholderTest', - 'label' : 'labelTest', - 'header' : 'headerOrderTest', - 'event' : 'scriptEventTest', - 'labelProximity' : 'labelProximityTest', - 'color' : 'colorTest' - }, - - testabilityTranslation : { - 0 : 'suggestion', - 0.5 : 'moderate', - 1 : 'severe' - }, - - html : { }, - - strings : { }, - - accessibilityResults : { }, - - accessibilityTests : { }, - - /** - * A list of HTML elements that can contain actual text. - */ - textSelector : 'p, h1, h2, h3, h4, h5, h6, div, pre, blockquote, aside, article, details, summary, figcaption, footer, header, hgroup, nav, section, strong, em, del, i, b', - - /** - * Suspect tags that would indicate a paragraph is being used as a header. - * I know, font tag, I know. Don't get me started. - */ - suspectPHeaderTags : ['strong', 'b', 'em', 'i', 'u', 'font'], - - /** - * Suspect CSS styles that might indicate a paragarph tag is being used as a header. - */ - suspectPCSSStyles : ['color', 'font-weight', 'font-size', 'font-family'], - - /** - * Main run function for quail. It bundles up some accessibility tests, - * and if tests are not passed, it instead fetches them using getJSON. - */ - run : function() { - if(quail.options.reset) { - quail.accessibilityResults = { }; - } - if(typeof quail.options.accessibilityTests !== 'undefined') { - quail.accessibilityTests = quail.options.accessibilityTests; - } - else { - $.ajax({ url : quail.options.jsonPath + '/tests.json', - async : false, - dataType : 'json', - success : function(data) { - if(typeof data === 'object') { - quail.accessibilityTests = data; - } - }}); - } - if(typeof quail.options.customTests !== 'undefined') { - for (var testName in quail.options.customTests) { - quail.accessibilityTests[testName] = quail.options.customTests[testName]; - } - } - if(typeof quail.options.guideline === 'string') { - $.ajax({ url : quail.options.jsonPath + '/guidelines/' + quail.options.guideline +'.json', - async : false, - dataType : 'json', - success : function(data) { - quail.options.guideline = data; - }}); - } - if(typeof quail.options.guideline === 'undefined') { - quail.options.guideline = [ ]; - for (var guidelineTestName in quail.accessibilityTests) { - quail.options.guideline.push(guidelineTestName); - } - } - - quail.runTests(); - if(typeof quail.options.complete !== 'undefined') { - var results = {totals : {severe : 0, moderate : 0, suggestion : 0 }, - results : quail.accessibilityResults }; - $.each(results.results, function(testName, result) { - results.totals[quail.testabilityTranslation[quail.accessibilityTests[testName].testability]] += result.length; - }); - quail.options.complete(results); - } - }, - - /** - * Utility function called whenever a test fails. - * If there is a callback for testFailed, then it - * packages the object and calls it. - */ - testFails : function(testName, $element, options) { - options = options || {}; - - if(typeof quail.options.preFilter !== 'undefined') { - if(quail.options.preFilter(testName, $element, options) === false) { - return; - } - } - - quail.accessibilityResults[testName].push($element); - if(typeof quail.options.testFailed !== 'undefined') { - var testability = (typeof quail.accessibilityTests[testName].testability !== 'undefined') ? - quail.accessibilityTests[testName].testability : - 'unknown'; - var severity = - quail.options.testFailed({element : $element, - testName : testName, - testability : testability, - severity : quail.testabilityTranslation[testability], - options : options - }); - } - }, - - /** - * Iterates over all the tests in the provided guideline and - * figures out which function or object will handle it. - * Custom callbacks are included directly, others might be part of a category - * of tests. - */ - runTests : function() { - $.each(quail.options.guideline, function(index, testName) { - if(typeof quail.accessibilityTests[testName] === 'undefined') { - return; - } - var testType = quail.accessibilityTests[testName].type; - if(typeof quail.accessibilityResults[testName] === 'undefined') { - quail.accessibilityResults[testName] = [ ]; - } - if(testType === 'selector') { - quail.html.find(quail.accessibilityTests[testName].selector).each(function() { - quail.testFails(testName, $(this)); - }); - } - if(testType === 'custom') { - if(typeof quail.accessibilityTests[testName].callback === 'object' || - typeof quail.accessibilityTests[testName].callback === 'function') { - quail.accessibilityTests[testName].callback(quail); - } - else { - if(typeof quail[quail.accessibilityTests[testName].callback] !== 'undefined') { - quail[quail.accessibilityTests[testName].callback](); - } - } - } - if(typeof quail[quail.testCallbacks[testType]] !== 'undefined') { - quail[quail.testCallbacks[testType]](testName, quail.accessibilityTests[testName]); - } - }); - }, - - /** - * Helper function to determine if a string of text is even readable. - * @todo - This will be added to in the future... we should also include - * phonetic tests. - */ - isUnreadable : function(text) { - if(typeof text !== 'string') { - return true; - } - return (text.trim().length) ? false : true; - }, - - /** - * Read more about this function here: https://github.com/kevee/quail/wiki/Layout-versus-data-tables - */ - isDataTable : function(table) { - //If there are less than three rows, why do a table? - if(table.find('tr').length < 3) { - return false; - } - //If you are scoping a table, it's probably not being used for layout - if(table.find('th[scope]').length) { - return true; - } - var numberRows = table.find('tr:has(td)').length; - //Check for odd cell spanning - var spanCells = table.find('td[rowspan], td[colspan]'); - var isDataTable = true; - if(spanCells.length) { - var spanIndex = {}; - spanCells.each(function() { - if(typeof spanIndex[$(this).index()] === 'undefined') { - spanIndex[$(this).index()] = 0; - } - spanIndex[$(this).index()]++; - }); - $.each(spanIndex, function(index, count) { - if(count < numberRows) { - isDataTable = false; - } - }); - } - //If there are sub tables, but not in the same column row after row, this is a layout table - var subTables = table.find('table'); - if(subTables.length) { - var subTablesIndexes = {}; - subTables.each(function() { - var parentIndex = $(this).parent('td').index(); - if(parentIndex !== false && typeof subTablesIndexes[parentIndex] === 'undefined') { - subTablesIndexes[parentIndex] = 0; - } - subTablesIndexes[parentIndex]++; - }); - $.each(subTablesIndexes, function(index, count) { - if(count < numberRows) { - isDataTable = false; - } - }); - } - return isDataTable; - }, - - /** - * Helper function to determine if a given URL is even valid. - */ - validURL : function(url) { - return (url.search(' ') === -1) ? true : false; - }, - - /** - * Helper function to load a string from the jsonPath directory. - */ - loadString : function(stringFile) { - if(typeof quail.strings[stringFile] !== 'undefined') { - return quail.strings[stringFile]; - } - $.ajax({ url : quail.options.jsonPath + '/strings/' + stringFile + '.json', - async: false, - dataType : 'json', - success : function(data) { - quail.strings[stringFile] = data; - }}); - return quail.strings[stringFile]; - }, - - cleanString : function(string) { - return string.toLowerCase().replace(/^\s\s*/, ''); - }, - - /** - * If a test uses the hasEventListener plugin, load it. - * @todo - Allow this to be configured, although since we can - * just check if it's there and if so, not load it, people could just - * include the script. - */ - loadHasEventListener : function() { - if(typeof jQuery.hasEventListener !== 'undefined') { - return; - } - $.ajax({url : quail.options.jsonPath + '/../../libs/jquery.hasEventListener/jquery.hasEventListener-2.0.3.min.js', - async : false, - dataType : 'script' - }); - }, - - /** - * Loads the pixToEm jQuery plugin. - */ - loadPixelToEm : function() { - if(typeof jQuery.toPx !== 'undefined') { - return; - } - $.ajax({url : quail.options.jsonPath + '/../../libs/jquery.pxToEm/pxem.jQuery.js', - async : false, - dataType : 'script' - }); - }, - - /** - * Placeholder test - checks that an attribute or the content of an - * element itself is not a placeholder (i.e. "click here" for links). - */ - placeholderTest : function(testName, options) { - quail.loadString('placeholders'); - quail.html.find(options.selector).each(function() { - var text; - if(typeof options.attribute !== 'undefined') { - if(typeof $(this).attr(options.attribute) === 'undefined' || - (options.attribute === 'tabindex' && - !$(this).attr(options.attribute) - ) - ) { - quail.testFails(testName, $(this)); - return; - } - text = $(this).attr(options.attribute); - } - else { - text = $(this).text(); - $(this).find('img[alt]').each(function() { - text += $(this).attr('alt'); - }); - } - if(typeof text === 'string') { - text = quail.cleanString(text); - var regex = /^([0-9]*)(k|kb|mb|k bytes|k byte)$/g; - var regexResults = regex.exec(text.toLowerCase()); - if(regexResults && regexResults[0].length) { - quail.testFails(testName, $(this)); - } - else { - if(options.empty && quail.isUnreadable(text)) { - quail.testFails(testName, $(this)); - } - else { - if(quail.strings.placeholders.indexOf(text) > -1 ) { - quail.testFails(testName, $(this)); - } - } - } - } - else { - if(options.empty && typeof text !== 'number') { - quail.testFails(testName, $(this)); - } - } - }); - }, - - /** - * Tests that a label element is close (DOM-wise) to it's target form element. - */ - labelProximityTest : function(testName, options) { - quail.html.find(options.selector).each(function() { - var $label = quail.html.find('label[for=' + $(this).attr('id') + ']').first(); - if(!$label.length) { - quail.testFails(testName, $(this)); - } - if(!$(this).parent().is($label.parent())) { - quail.testFails(testName, $(this)); - } - }); - }, - - /** - * Test callback for color tests. This handles both WAI and WCAG - * color contrast/luminosity. - */ - colorTest : function(testName, options) { - if(options.bodyForegroundAttribute && options.bodyBackgroundAttribute) { - var $body = quail.html.find('body').clone(false, false); - var foreground = $body.attr(options.bodyForegroundAttribute); - var background = $body.attr(options.bodyBackgroundAttribute); - if(typeof foreground === 'undefined') { - foreground = 'rgb(0,0,0)'; - } - if(typeof background === 'undefined') { - foreground = 'rgb(255,255,255)'; - } - $body.css('color', foreground); - $body.css('background-color', background); - if((options.algorithm === 'wcag' && !quail.colors.passesWCAG($body)) || - (options.algorithm === 'wai' && !quail.colors.passesWAI($body))) { - quail.testFails(testName, $body); - } - } - quail.html.find(options.selector).filter(quail.textSelector).each(function() { - if(!quail.isUnreadable($(this).text()) && - (options.algorithm === 'wcag' && !quail.colors.passesWCAG($(this))) || - (options.algorithm === 'wai' && !quail.colors.passesWAI($(this)))) { - quail.testFails(testName, $(this)); - } - }); - }, - - /** - * Test callback for tests that look for script events - * (like a mouse event has a keyboard event as well). - */ - scriptEventTest : function(testName, options) { - quail.loadHasEventListener(); - var $items = (typeof options.selector === 'undefined') ? - quail.html.find('body').find('*') : - quail.html.find(options.selector); - $items.each(function() { - var $element = $(this).get(0); - if($(this).attr(options.searchEvent)) { - if(typeof options.correspondingEvent === 'undefined' || - !$(this).attr(options.correspondingEvent)) { - quail.testFails(testName, $(this)); - } - } - else { - if($.hasEventListener($element, options.searchEvent.replace('on', '')) && - (typeof options.correspondingEvent === 'undefined' || - !$.hasEventListener($element, options.correspondingEvent.replace('on', '')))) { - quail.testFails(testName, $(this)); - } - } - }); - }, - - labelTest : function(testName, options) { - quail.html.find(options.selector).each(function() { - if((!$(this).parent('label').length || - !quail.containsReadableText($(this).parent('label'))) && - (!quail.html.find('label[for=' + $(this).attr('id') + ']').length || - !quail.containsReadableText(quail.html.find('label[for=' + $(this).attr('id') + ']')))) { - quail.testFails(testName, $(this)); - } - }); - }, - - containsReadableText : function(element, children) { - element = element.clone(); - element.find('option').remove(); - if(!quail.isUnreadable(element.text())) { - return true; - } - if(!quail.isUnreadable(element.attr('alt'))) { - return true; - } - if(children) { - var readable = false; - element.find('*').each(function() { - if(quail.containsReadableText($(this), true)) { - readable = true; - } - }); - if(readable) { - return true; - } - } - return false; - }, - - headerOrderTest : function(testName, options) { - var current = parseInt(options.selector.substr(-1, 1), 10); - var nextHeading = false; - quail.html.find('h1, h2, h3, h4, h5, h6').each(function() { - var number = parseInt($(this).get(0).tagName.substr(-1, 1), 10); - if(nextHeading && (number - 1 > current || number + 1 < current)) { - quail.testFails(testName, $(this)); - } - if(number === current) { - nextHeading = $(this); - } - if(nextHeading && number !== current) { - nextHeading = false; - } - }); - }, - - acronymTest : function(testName, acronymTag) { - var predefined = { }; - var alreadyReported = { }; - quail.html.find(acronymTag + '[title]').each(function() { - predefined[$(this).text().toUpperCase()] = $(this).attr('title'); - }); - quail.html.find('p, div, h1, h2, h3, h4, h5').each(function(){ - var $el = $(this); - var words = $(this).text().split(' '); - if(words.length > 1 && $(this).text().toUpperCase() !== $(this).text()) { - $.each(words, function(index, word) { - word = word.replace(/[^a-zA-Zs]/, ''); - if(word.toUpperCase() === word && - word.length > 1 && - typeof predefined[word.toUpperCase()] === 'undefined') { - if(typeof alreadyReported[word.toUpperCase()] === 'undefined') { - quail.testFails(testName, $el, {acronym : word.toUpperCase()}); - } - alreadyReported[word.toUpperCase()] = word; - } - }); - } - }); - }, - - aAdjacentWithSameResourceShouldBeCombined : function() { - quail.html.find('a').each(function() { - if($(this).next('a').attr('href') === $(this).attr('href')) { - quail.testFails('aAdjacentWithSameResourceShouldBeCombined', $(this)); - } - }); - }, - - aImgAltNotRepetative : function() { - quail.html.find('a img[alt]').each(function() { - if(quail.cleanString($(this).attr('alt')) === quail.cleanString($(this).parent('a').text())) { - quail.testFails('aImgAltNotRepetative', $(this).parent('a')); - } - }); - }, - - aLinksAreSeperatedByPrintableCharacters : function() { - quail.html.find('a').each(function() { - if($(this).next('a').length && quail.isUnreadable($(this).get(0).nextSibling.wholeText)) { - quail.testFails('aLinksAreSeperatedByPrintableCharacters', $(this)); - } - }); - }, - - aLinkTextDoesNotBeginWithRedundantWord : function() { - var redundant = quail.loadString('redundant'); - quail.html.find('a').each(function() { - var $link = $(this); - var text = ''; - if($(this).find('img[alt]').length) { - text = text + $(this).find('img[alt]:first').attr('alt'); - } - text = text + $(this).text(); - text = text.toLowerCase(); - $.each(redundant.link, function(index, phrase) { - if(text.search(phrase) > -1) { - quail.testFails('aLinkTextDoesNotBeginWithRedundantWord', $link); - } - }); - }); - }, - - aMustContainText : function() { - quail.html.find('a').each(function() { - if(!quail.containsReadableText($(this), true) && - !(($(this).attr('name') || $(this).attr('id')) && !$(this).attr('href'))) { - quail.testFails('aMustContainText', $(this)); - } - }); - }, - - aSuspiciousLinkText : function() { - var suspiciousText = quail.loadString('suspicious_links'); - quail.html.find('a').each(function() { - var text = $(this).text(); - $(this).find('img[alt]').each(function() { - text = text + $(this).attr('alt'); - }); - if(suspiciousText.indexOf(quail.cleanString(text)) > -1) { - quail.testFails('aSuspiciousLinkText', $(this)); - } - }); - }, - - blockquoteUseForQuotations : function() { - quail.html.find('p').each(function() { - if($(this).text().substr(0, 1).search(/[\'\"]/) > -1 && - $(this).text().substr(-1, 1).search(/[\'\"]/) > -1) { - quail.testFails('blockquoteUseForQuotations', $(this)); - } - }); - }, - - documentAcronymsHaveElement : function() { - quail.acronymTest('documentAcronymsHaveElement', 'acronym'); - }, - - documentAbbrIsUsed : function() { - quail.acronymTest('documentAbbrIsUsed', 'abbr'); - }, - - documentTitleIsShort : function() { - if(quail.html.find('head title:first').text().length > 150) { - quail.testFails('documentTitleIsShort', quail.html.find('head title:first')); - } - }, - - documentVisualListsAreMarkedUp : function() { - var listQueues = [/\*/g, '
    *', '•', '•']; - quail.html.find('p, div, h1, h2, h3, h4, h5, h6').each(function() { - var $element = $(this); - $.each(listQueues, function(index, item) { - if($element.text().split(item).length > 2) { - quail.testFails('documentVisualListsAreMarkedUp', $element); - } - }); - }); - }, - - documentValidatesToDocType : function() { - if(typeof document.doctype === 'undefined') { - return; - } - }, - - documentIDsMustBeUnique : function() { - var ids = []; - quail.html.find('*[id]').each(function() { - if(ids.indexOf($(this).attr('id')) >= 0) { - quail.testFails('documentIDsMustBeUnique', $(this)); - } - ids.push($(this).attr('id')); - }); - }, - - documentIsWrittenClearly : function() { - quail.html.find(quail.textSelector).each(function() { - var text = quail.textStatistics.cleanText($(this).text()); - if(Math.round((206.835 - (1.015 * quail.textStatistics.averageWordsPerSentence(text)) - (84.6 * quail.textStatistics.averageSyllablesPerWord(text)))) < 60) { - quail.testFails('documentIsWrittenClearly', $(this)); - } - }); - }, - - documentLangIsISO639Standard : function() { - var languages = quail.loadString('language_codes'); - var language = quail.html.find('html').attr('lang'); - if(!language) { - return; - } - if(languages.indexOf(language) === -1) { - quail.testFails('documentLangIsISO639Standard', quail.html.find('html')); - } - }, - - doctypeProvided : function() { - if($(quail.html.get(0).doctype).length === 0) { - quail.testFails('doctypeProvided', quail.html.find('html')); - } - }, - - appletContainsTextEquivalent : function() { - quail.html.find('applet[alt=], applet:not(applet[alt])').each(function() { - if(quail.isUnreadable($(this).text())) { - quail.testFails('appletContainsTextEquivalent', $(this)); - } - }); - }, - - documentStrictDocType : function() { - if(!$(quail.html.get(0).doctype).length || - quail.html.get(0).doctype.systemId.indexOf('strict') === -1) { - quail.testFails('documentStrictDocType', quail.html.find('html')); - } - }, - - embedHasAssociatedNoEmbed : function() { - if(quail.html.find('noembed').length) { - return; - } - quail.html.find('embed').each(function() { - quail.testFails('embedHasAssociatedNoEmbed', $(this)); - }); - }, - - emoticonsExcessiveUse : function() { - var emoticons = quail.loadString('emoticons'); - var count = 0; - quail.html.find('p, div, h1, h2, h3, h4, h5, h6').each(function() { - var $element = $(this); - $.each($element.text().split(' '), function(index, word) { - if(emoticons.indexOf(word) > -1) { - count++; - } - if(count > 4) { - return; - } - }); - if(count > 4) { - quail.testFails('emoticonsExcessiveUse', $element); - } - }); - }, - - emoticonsMissingAbbr : function() { - var emoticons = quail.loadString('emoticons'); - quail.html.find('p, div, h1, h2, h3, h4, h5, h6').each(function() { - var $element = $(this); - var $clone = $element.clone(); - $clone.find('abbr, acronym').each(function() { - $(this).remove(); - }); - $.each($clone.text().split(' '), function(index, word) { - if(emoticons.indexOf(word) > -1) { - quail.testFails('emoticonsMissingAbbr', $element); - } - }); - }); - }, - - formWithRequiredLabel : function() { - var redundant = quail.loadString('redundant'); - var lastStyle, currentStyle = false; - redundant.required[redundant.required.indexOf('*')] = /\*/g; - quail.html.find('label').each(function() { - var text = $(this).text().toLowerCase(); - var $label = $(this); - $.each(redundant.required, function(index, word) { - if(text.search(word) >= 0 && !quail.html.find('#' + $label.attr('for')).attr('aria-required')) { - quail.testFails('formWithRequiredLabel', $label); - } - }); - currentStyle = $label.css('color') + $label.css('font-weight') + $label.css('background-color'); - if(lastStyle && currentStyle !== lastStyle) { - quail.testFails('formWithRequiredLabel', $label); - } - lastStyle = currentStyle; - }); - }, - - headersUseToMarkSections : function() { - quail.html.find('p').each(function() { - var $paragraph = $(this); - $paragraph.find('strong:first, em:first, i:first, b:first').each(function() { - if($paragraph.text() === $(this).text()) { - quail.testFails('headersUseToMarkSections', $paragraph); - } - }); - }); - }, - - imgAltIsDifferent : function() { - quail.html.find('img[alt][src]').each(function() { - if($(this).attr('src') === $(this).attr('alt') || $(this).attr('src').split('/').pop() === $(this).attr('alt')) { - quail.testFails('imgAltIsDifferent', $(this)); - } - }); - }, - - imgAltIsTooLong : function() { - quail.html.find('img[alt]').each(function() { - if($(this).attr('alt').length > 100) { - quail.testFails('imgAltIsTooLong', $(this)); - } - }); - }, - - imgAltTextNotRedundant : function() { - var altText = {}; - quail.html.find('img[alt]').each(function() { - if(typeof altText[$(this).attr('alt')] === 'undefined') { - altText[$(this).attr('alt')] = $(this).attr('src'); - } - else { - if(altText[$(this).attr('alt')] !== $(this).attr('src')) { - quail.testFails('imgAltTextNotRedundant', $(this)); - } - } - }); - }, - - inputCheckboxRequiresFieldset : function() { - quail.html.find(':checkbox').each(function() { - if(!$(this).parents('fieldset').length) { - quail.testFails('inputCheckboxRequiresFieldset', $(this)); - } - }); - }, - - inputImageAltIsNotFileName : function() { - quail.html.find('input[type=image][alt]').each(function() { - if($(this).attr('src') === $(this).attr('alt')) { - quail.testFails('inputImageAltIsNotFileName', $(this)); - } - }); - }, - - inputImageAltIsShort : function() { - quail.html.find('input[type=image]').each(function() { - if($(this).attr('alt').length > 100) { - quail.testFails('inputImageAltIsShort', $(this)); - } - }); - }, - - inputImageAltNotRedundant : function() { - var redundant = quail.loadString('redundant'); - quail.html.find('input[type=image][alt]').each(function() { - if(redundant.inputImage.indexOf(quail.cleanString($(this).attr('alt'))) > -1) { - quail.testFails('inputImageAltNotRedundant', $(this)); - } - }); - }, - - imgImportantNoSpacerAlt : function() { - quail.html.find('img[alt]').each(function() { - var width = ($(this).width()) ? $(this).width() : parseInt($(this).attr('width'), 10); - var height = ($(this).height()) ? $(this).height() : parseInt($(this).attr('height'), 10); - if(quail.isUnreadable($(this).attr('alt').trim()) && - $(this).attr('alt').length > 0 && - width > 50 && - height > 50) { - quail.testFails('imgImportantNoSpacerAlt', $(this)); - } - }); - }, - - imgNonDecorativeHasAlt : function() { - quail.html.find('img[alt]').each(function() { - if(quail.isUnreadable($(this).attr('alt')) && - ($(this).width() > 100 || $(this).height() > 100)) { - quail.testFails('imgNonDecorativeHasAlt', $(this)); - } - }); - }, - - imgAltNotEmptyInAnchor : function() { - quail.html.find('a img').each(function() { - if(quail.isUnreadable($(this).attr('alt')) && - quail.isUnreadable($(this).parent('a:first').text())) { - quail.testFails('imgAltNotEmptyInAnchor', $(this)); - } - }); - }, - - imgHasLongDesc : function() { - quail.html.find('img[longdesc]').each(function() { - if($(this).attr('longdesc') === $(this).attr('alt') || - !quail.validURL($(this).attr('longdesc'))) { - quail.testFails('imgHasLongDesc', $(this)); - } - }); - }, - - imgMapAreasHaveDuplicateLink : function() { - var links = { }; - quail.html.find('a').each(function() { - links[$(this).attr('href')] = $(this).attr('href'); - }); - quail.html.find('img[usemap]').each(function() { - var $image = $(this); - var $map = quail.html.find($image.attr('usemap')); - if(!$map.length) { - $map = quail.html.find('map[name="' + $image.attr('usemap').replace('#', '') + '"]'); - } - if($map.length) { - $map.find('area').each(function() { - if(typeof links[$(this).attr('href')] === 'undefined') { - quail.testFails('imgMapAreasHaveDuplicateLink', $image); - } - }); - } - }); - }, - - imgGifNoFlicker : function() { - quail.html.find('img[src$=".gif"]').each(function() { - var $image = $(this); - $.ajax({url : $image.attr('src'), - async : false, - dataType : 'text', - success : function(data) { - if(data.search('NETSCAPE2.0') !== -1) { - quail.testFails('imgGifNoFlicker', $image); - } - }}); - }); - }, - - imgWithMathShouldHaveMathEquivalent : function() { - quail.html.find('img:not(img:has(math), img:has(tagName))').each(function() { - if(!$(this).parent().find('math').length) { - quail.testFails('imgWithMathShouldHaveMathEquivalent', $(this)); - } - }); - }, - - labelMustBeUnique : function() { - var labels = { }; - quail.html.find('label[for]').each(function() { - if(typeof labels[$(this).attr('for')] !== 'undefined') { - quail.testFails('labelMustBeUnique', $(this)); - } - labels[$(this).attr('for')] = $(this).attr('for'); - }); - }, - - labelsAreAssignedToAnInput : function() { - quail.html.find('label').each(function() { - if(!$(this).attr('for')) { - quail.testFails('labelsAreAssignedToAnInput', $(this)); - } - else { - if(!quail.html.find('#' + $(this).attr('for')).length || - !quail.html.find('#' + $(this).attr('for')).is('input, select, textarea')) { - quail.testFails('labelsAreAssignedToAnInput', $(this)); - } - } - }); - }, - - listNotUsedForFormatting : function() { - quail.html.find('ol, ul').each(function() { - if($(this).find('li').length < 2) { - quail.testFails('listNotUsedForFormatting', $(this)); - } - }); - }, - - paragarphIsWrittenClearly : function() { - quail.html.find('p').each(function() { - var text = quail.textStatistics.cleanText($(this).text()); - if(Math.round((206.835 - (1.015 * quail.textStatistics.averageWordsPerSentence(text)) - (84.6 * quail.textStatistics.averageSyllablesPerWord(text)))) < 60) { - quail.testFails('paragarphIsWrittenClearly', $(this)); - } - }); - }, - - siteMap : function() { - var mapString = quail.loadString('site_map'); - var set = true; - quail.html.find('a').each(function() { - var text = $(this).text().toLowerCase(); - $.each(mapString, function(index, string) { - if(text.search(string) > -1) { - set = false; - return; - } - }); - if(set === false) { - return; - } - }); - if(set) { - quail.testFails('siteMap', quail.html.find('body')); - } - }, - - pNotUsedAsHeader : function() { - var priorStyle = { }; - - quail.html.find('p').each(function() { - if($(this).text().search('.') < 1) { - var $paragraph = $(this); - $.each(quail.suspectPHeaderTags, function(index, tag) { - if($paragraph.find(tag).length) { - $paragraph.find(tag).each(function() { - if($(this).text().trim() === $paragraph.text().trim()) { - quail.testFails('pNotUsedAsHeader', $paragraph); - } - }); - } - }); - $.each(quail.suspectPCSSStyles, function(index, style) { - if(typeof priorStyle[style] !== 'undefined' && - priorStyle[style] !== $paragraph.css(style)) { - quail.testFails('pNotUsedAsHeader', $paragraph); - } - priorStyle[style] = $paragraph.css(style); - }); - if($paragraph.css('font-weight') === 'bold') { - quail.testFails('pNotUsedAsHeader', $paragraph); - } - } - }); - }, - - preShouldNotBeUsedForTabularLayout : function() { - quail.html.find('pre').each(function() { - var rows = $(this).text().split(/[\n\r]+/); - if(rows.length > 1 && $(this).text().search(/\t/) > -1) { - quail.testFails('preShouldNotBeUsedForTabularLayout', $(this)); - } - }); - }, - - selectJumpMenu : function() { - if(quail.html.find('select').length === 0) { - return; - } - quail.loadHasEventListener(); - - quail.html.find('select').each(function() { - if(($(this).parent('form').find(':submit').length === 0 ) && - ($.hasEventListener($(this), 'change') || - $(this).attr('onchange'))) { - quail.testFails('selectJumpMenu', $(this)); - } - }); - }, - - tableHeaderLabelMustBeTerse : function() { - quail.html.find('th, table tr:first td').each(function() { - if($(this).text().length > 20 && - (!$(this).attr('abbr') || $(this).attr('abbr').length > 20)) { - quail.testFails('tableHeaderLabelMustBeTerse', $(this)); - } - }); - }, - - tabIndexFollowsLogicalOrder : function() { - var index = 0; - quail.html.find('[tabindex]').each(function() { - if(parseInt($(this).attr('tabindex'), 10) >= 0 && - parseInt($(this).attr('tabindex'), 10) !== index + 1) { - quail.testFails('tabIndexFollowsLogicalOrder', $(this)); - } - index++; - }); - }, - - tableLayoutDataShouldNotHaveTh : function() { - quail.html.find('table:has(th)').each(function() { - if(!quail.isDataTable($(this))) { - quail.testFails('tableLayoutDataShouldNotHaveTh', $(this)); - } - }); - }, - - tableLayoutHasNoSummary : function() { - quail.html.find('table[summary]').each(function() { - if(!quail.isDataTable($(this)) && !quail.isUnreadable($(this).attr('summary'))) { - quail.testFails('tableLayoutHasNoSummary', $(this)); - } - }); - }, - - tableLayoutHasNoCaption : function() { - quail.html.find('table:has(caption)').each(function() { - if(!quail.isDataTable($(this))) { - quail.testFails('tableLayoutHasNoCaption', $(this)); - } - }); - }, - - tableLayoutMakesSenseLinearized : function() { - quail.html.find('table').each(function() { - if(!quail.isDataTable($(this))) { - quail.testFails('tableLayoutMakesSenseLinearized', $(this)); - } - }); - }, - - tableNotUsedForLayout : function() { - quail.html.find('table').each(function() { - if(!quail.isDataTable($(this))) { - quail.testFails('tableNotUsedForLayout', $(this)); - } - }); - }, - - tableSummaryDoesNotDuplicateCaption : function() { - quail.html.find('table[summary]:has(caption)').each(function() { - if(quail.cleanString($(this).attr('summary')) === quail.cleanString($(this).find('caption:first').text())) { - quail.testFails('tableSummaryDoesNotDuplicateCaption', $(this)); - } - }); - }, - - tableSummaryIsNotTooLong : function() { - quail.html.find('table[summary]').each(function() { - if($(this).attr('summary').trim().length > 100) { - quail.testFails('tableSummaryIsNotTooLong', $(this)); - } - }); - }, - - tableUsesAbbreviationForHeader : function() { - quail.html.find('th:not(th[abbr])').each(function() { - if($(this).text().length > 20) { - quail.testFails('tableUsesAbbreviationForHeader', $(this)); - } - }); - }, - - tableUseColGroup : function() { - quail.html.find('table').each(function() { - if(quail.isDataTable($(this)) && !$(this).find('colgroup').length) { - quail.testFails('tableUseColGroup', $(this)); - } - }); - }, - - tableUsesScopeForRow : function() { - quail.html.find('table').each(function() { - $(this).find('td:first-child').each(function() { - var $next = $(this).next('td'); - if(($(this).css('font-weight') === 'bold' && $next.css('font-weight') !== 'bold') || - ($(this).find('strong').length && !$next.find('strong').length)) { - quail.testFails('tableUsesScopeForRow', $(this)); - } - }); - $(this).find('td:last-child').each(function() { - var $prev = $(this).prev('td'); - if(($(this).css('font-weight') === 'bold' && $prev.css('font-weight') !== 'bold') || - ($(this).find('strong').length && !$prev.find('strong').length)) { - quail.testFails('tableUsesScopeForRow', $(this)); - } - }); - }); - }, - - tableWithMoreHeadersUseID : function() { - quail.html.find('table:has(th)').each(function() { - var $table = $(this); - var rows = 0; - $table.find('tr').each(function() { - if($(this).find('th').length) { - rows++; - } - if(rows > 1 && !$(this).find('th[id]').length) { - quail.testFails('tableWithMoreHeadersUseID', $table); - } - }); - }); - }, - - textIsNotSmall : function() { - quail.loadPixelToEm(); - quail.html.find(quail.textSelector).each(function() { - var fontSize = $(this).css('font-size'); - if(fontSize.search('em') > 0) { - fontSize = $(this).toPx({scope : quail.html}); - } - fontSize = parseInt(fontSize.replace('px', ''), 10); - if(fontSize < 10) { - quail.testFails('textIsNotSmall', $(this)); - } - }); - }, - - videosEmbeddedOrLinkedNeedCaptions : function() { - quail.html.find('a').each(function() { - var $link = $(this); - $.each(quail.videoServices, function(type, callback) { - if(callback.isVideo($link.attr('href'))) { - callback.hasCaptions(function(hasCaptions) { - if(!hasCaptions) { - quail.testFails('videosEmbeddedOrLinkedNeedCaptions', $link); - } - }); - } - }); - }); - }, - - tabularDataIsInTable : function() { - quail.html.find('pre').each(function() { - if($(this).html().search('\t') >= 0) { - quail.testFails('tabularDataIsInTable', $(this)); - } - }); - } - }; - - /** - * Utility object for statistics, like average, variance, etc. - */ - quail.statistics = { - - setDecimal : function( num, numOfDec ){ - var pow10s = Math.pow( 10, numOfDec || 0 ); - return ( numOfDec ) ? Math.round( pow10s * num ) / pow10s : num; - }, - - average : function( numArr, numOfDec ){ - var i = numArr.length, - sum = 0; - while( i-- ){ - sum += numArr[ i ]; - } - return quail.statistics.setDecimal( (sum / numArr.length ), numOfDec ); - }, - - variance : function( numArr, numOfDec ){ - var avg = quail.statistics.average( numArr, numOfDec ), - i = numArr.length, - v = 0; - - while( i-- ){ - v += Math.pow( (numArr[ i ] - avg), 2 ); - } - v /= numArr.length; - return quail.statistics.setDecimal( v, numOfDec ); - }, - - standardDeviation : function( numArr, numOfDec ){ - var stdDev = Math.sqrt( quail.statistics.variance( numArr, numOfDec ) ); - return quail.statistics.setDecimal( stdDev, numOfDec ); - } - }; - - /** - * Utility object to test for color contrast. - */ - quail.colors = { - - getLuminosity : function(foreground, background) { - foreground = this.cleanup(foreground); - background = this.cleanup(background); - - var RsRGB = foreground.r/255; - var GsRGB = foreground.g/255; - var BsRGB = foreground.b/255; - var R = (RsRGB <= 0.03928) ? RsRGB/12.92 : Math.pow((RsRGB+0.055)/1.055, 2.4); - var G = (GsRGB <= 0.03928) ? GsRGB/12.92 : Math.pow((GsRGB+0.055)/1.055, 2.4); - var B = (BsRGB <= 0.03928) ? BsRGB/12.92 : Math.pow((BsRGB+0.055)/1.055, 2.4); - - var RsRGB2 = background.r/255; - var GsRGB2 = background.g/255; - var BsRGB2 = background.b/255; - var R2 = (RsRGB2 <= 0.03928) ? RsRGB2/12.92 : Math.pow((RsRGB2+0.055)/1.055, 2.4); - var G2 = (GsRGB2 <= 0.03928) ? GsRGB2/12.92 : Math.pow((GsRGB2+0.055)/1.055, 2.4); - var B2 = (BsRGB2 <= 0.03928) ? BsRGB2/12.92 : Math.pow((BsRGB2+0.055)/1.055, 2.4); - var l1, l2; - l1 = (0.2126 * R + 0.7152 * G + 0.0722 * B); - l2 = (0.2126 * R2 + 0.7152 * G2 + 0.0722 * B2); - - return Math.round((Math.max(l1, l2) + 0.05)/(Math.min(l1, l2) + 0.05)*10)/10; - }, - - fetchImageColor : function(){ - var img = new Image(); - var src = $(this).css('background-image').replace('url(', '').replace(/'/, '').replace(')', ''); - img.src = src; - var can = document.createElement('canvas'); - var context = can.getContext('2d'); - context.drawImage(img, 0, 0); - var data = context.getImageData(0, 0, 1, 1).data; - return 'rgb(' + data[0] + ',' + data[1] + ',' + data[2] + ')'; - }, - - passesWCAG : function(element) { - return (quail.colors.getLuminosity(quail.colors.getColor(element, 'foreground'), quail.colors.getColor(element, 'background')) > 5); - }, - - passesWAI : function(element) { - var foreground = quail.colors.cleanup(quail.colors.getColor(element, 'foreground')); - var background = quail.colors.cleanup(quail.colors.getColor(element, 'background')); - return (quail.colors.getWAIErtContrast(foreground, background) > 500 && - quail.colors.getWAIErtBrightness(foreground, background) > 125); - }, - - getWAIErtContrast : function(foreground, background) { - var diffs = quail.colors.getWAIDiffs(foreground, background); - return diffs.red + diffs.green + diffs.blue; - }, - - getWAIErtBrightness : function(foreground, background) { - var diffs = quail.colors.getWAIDiffs(foreground, background); - return ((diffs.red * 299) + (diffs.green * 587) + (diffs.blue * 114)) / 1000; - - }, - - getWAIDiffs : function(foreground, background) { - var diff = { }; - diff.red = Math.abs(foreground.r - background.r); - diff.green = Math.abs(foreground.g - background.g); - diff.blue = Math.abs(foreground.b - background.b); - return diff; - }, - - getColor : function(element, type) { - if(type === 'foreground') { - return (element.css('color')) ? element.css('color') : 'rgb(255,255,255)'; - } - //return (element.css('background-color')) ? element.css('background-color') : 'rgb(0,0,0)'; - if((element.css('background-color') !== 'rgba(0, 0, 0, 0)' && - element.css('background-color') !== 'transparent') || - element.get(0).tagName === 'body') { - return (element.css('background-color')) ? element.css('background-color') : 'rgb(0,0,0)'; - } - var color = 'rgb(0,0,0)'; - element.parents().each(function(){ - if ($(this).css('background-color') !== 'rgba(0, 0, 0, 0)' && - $(this).css('background-color') !== 'transparent') { - color = $(this).css('background-color'); - return false; - } - }); - return color; - }, - - cleanup : function(color) { - color = color.replace('rgb(', '').replace('rgba(', '').replace(')', '').split(','); - return { r : color[0], - g : color[1], - b : color[2], - a : ((typeof color[3] === 'undefined') ? false : color[3]) - }; - } - - }; - - /** - * Utility object that runs text statistics, like sentence count, - * reading level, etc. - */ - quail.textStatistics = { - - cleanText : function(text) { - return text.replace(/[,:;()\-]/, ' ') - .replace(/[\.!?]/, '.') - .replace(/[ ]*(\n|\r\n|\r)[ ]*/, ' ') - .replace(/([\.])[\. ]+/, '$1') - .replace(/[ ]*([\.])/, '$1') - .replace(/[ ]+/, ' ') - .toLowerCase(); - - }, - - sentenceCount : function(text) { - var copy = text; - return copy.split('.').length + 1; - }, - - wordCount : function(text) { - var copy = text; - return copy.split(' ').length + 1; - }, - - averageWordsPerSentence : function(text) { - return quail.textStatistics.wordCount(text) / quail.textStatistics.sentenceCount(text); - }, - - averageSyllablesPerWord : function(text) { - var count = 0; - var wordCount = quail.textStatistics.wordCount(text); - if(!wordCount) { - return 0; - } - $.each(text.split(' '), function(index, word) { - count += quail.textStatistics.syllableCount(word); - }); - return count / wordCount; - }, - - syllableCount : function(word) { - var matchedWord = word.replace(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/, '') - .match(/[aeiouy]{1,2}/g); - if(!matchedWord || matchedWord.length === 0) { - return 1; - } - return matchedWord.length; - } - }; - - /** - * Helper object that tests videos. - * @todo - allow this to be exteded more easily. - */ - quail.videoServices = { - - youTube : { - - videoID : '', - - apiUrl : 'http://gdata.youtube.com/feeds/api/videos/?q=%video&caption&v=2&alt=json', - - isVideo : function(url) { - var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; - var match = url.match(regExp); - if (match && match[7].length === 11) { - quail.videoServices.youTube.videoID = match[7]; - return true; - } - return false; - }, - - hasCaptions : function(callback) { - $.ajax({url : this.apiUrl.replace('%video', this.videoID), - async : false, - dataType : 'json', - success : function(data) { - callback((data.feed.openSearch$totalResults.$t > 0) ? true : false); - } - }); - } - } - }; - -}(jQuery)); \ No newline at end of file diff --git a/src/quail.min.js b/src/quail.min.js deleted file mode 100644 index 13b19216b..000000000 --- a/src/quail.min.js +++ /dev/null @@ -1 +0,0 @@ -/*! QUAIL quailjs.org | quailjs.org/license */(function(t){t.fn.quail=function(t){return this.length?(e.options=t,e.html=this,e.run(),this):this};var e={options:{},testCallbacks:{placeholder:"placeholderTest",label:"labelTest",header:"headerOrderTest",event:"scriptEventTest",labelProximity:"labelProximityTest",color:"colorTest"},testabilityTranslation:{0:"suggestion",.5:"moderate",1:"severe"},html:{},strings:{},accessibilityResults:{},accessibilityTests:{},textSelector:"p, h1, h2, h3, h4, h5, h6, div, pre, blockquote, aside, article, details, summary, figcaption, footer, header, hgroup, nav, section, strong, em, del, i, b",suspectPHeaderTags:["strong","b","em","i","u","font"],suspectPCSSStyles:["color","font-weight","font-size","font-family"],run:function(){if(e.options.reset&&(e.accessibilityResults={}),e.options.accessibilityTests!==void 0?e.accessibilityTests=e.options.accessibilityTests:t.ajax({url:e.options.jsonPath+"/tests.json",async:!1,dataType:"json",success:function(t){"object"==typeof t&&(e.accessibilityTests=t)}}),e.options.customTests!==void 0)for(var i in e.options.customTests)e.accessibilityTests[i]=e.options.customTests[i];if("string"==typeof e.options.guideline&&t.ajax({url:e.options.jsonPath+"/guidelines/"+e.options.guideline+".json",async:!1,dataType:"json",success:function(t){e.options.guideline=t}}),e.options.guideline===void 0){e.options.guideline=[];for(var s in e.accessibilityTests)e.options.guideline.push(s)}if(e.runTests(),e.options.complete!==void 0){var a={totals:{severe:0,moderate:0,suggestion:0},results:e.accessibilityResults};t.each(a.results,function(t,i){a.totals[e.testabilityTranslation[e.accessibilityTests[t].testability]]+=i.length}),e.options.complete(a)}},testFails:function(t,i,s){if(s=s||{},(void 0===e.options.preFilter||e.options.preFilter(t,i,s)!==!1)&&(e.accessibilityResults[t].push(i),e.options.testFailed!==void 0)){var a=e.accessibilityTests[t].testability!==void 0?e.accessibilityTests[t].testability:"unknown";e.options.testFailed({element:i,testName:t,testability:a,severity:e.testabilityTranslation[a],options:s})}},runTests:function(){t.each(e.options.guideline,function(i,s){if(void 0!==e.accessibilityTests[s]){var a=e.accessibilityTests[s].type;e.accessibilityResults[s]===void 0&&(e.accessibilityResults[s]=[]),"selector"===a&&e.html.find(e.accessibilityTests[s].selector).each(function(){e.testFails(s,t(this))}),"custom"===a&&("object"==typeof e.accessibilityTests[s].callback||"function"==typeof e.accessibilityTests[s].callback?e.accessibilityTests[s].callback(e):e[e.accessibilityTests[s].callback]!==void 0&&e[e.accessibilityTests[s].callback]()),e[e.testCallbacks[a]]!==void 0&&e[e.testCallbacks[a]](s,e.accessibilityTests[s])}})},isUnreadable:function(t){return"string"!=typeof t?!0:t.trim().length?!1:!0},isDataTable:function(e){if(3>e.find("tr").length)return!1;if(e.find("th[scope]").length)return!0;var i=e.find("tr:has(td)").length,s=e.find("td[rowspan], td[colspan]"),a=!0;if(s.length){var n={};s.each(function(){n[t(this).index()]===void 0&&(n[t(this).index()]=0),n[t(this).index()]++}),t.each(n,function(t,e){i>e&&(a=!1)})}var o=e.find("table");if(o.length){var r={};o.each(function(){var e=t(this).parent("td").index();e!==!1&&r[e]===void 0&&(r[e]=0),r[e]++}),t.each(r,function(t,e){i>e&&(a=!1)})}return a},validURL:function(t){return-1===t.search(" ")?!0:!1},loadString:function(i){return e.strings[i]!==void 0?e.strings[i]:(t.ajax({url:e.options.jsonPath+"/strings/"+i+".json",async:!1,dataType:"json",success:function(t){e.strings[i]=t}}),e.strings[i])},cleanString:function(t){return t.toLowerCase().replace(/^\s\s*/,"")},loadHasEventListener:function(){void 0===jQuery.hasEventListener&&t.ajax({url:e.options.jsonPath+"/../../libs/jquery.hasEventListener/jquery.hasEventListener-2.0.3.min.js",async:!1,dataType:"script"})},loadPixelToEm:function(){void 0===jQuery.toPx&&t.ajax({url:e.options.jsonPath+"/../../libs/jquery.pxToEm/pxem.jQuery.js",async:!1,dataType:"script"})},placeholderTest:function(i,s){e.loadString("placeholders"),e.html.find(s.selector).each(function(){var a;if(s.attribute!==void 0){if(t(this).attr(s.attribute)===void 0||"tabindex"===s.attribute&&!t(this).attr(s.attribute))return e.testFails(i,t(this)),void 0;a=t(this).attr(s.attribute)}else a=t(this).text(),t(this).find("img[alt]").each(function(){a+=t(this).attr("alt")});if("string"==typeof a){a=e.cleanString(a);var n=/^([0-9]*)(k|kb|mb|k bytes|k byte)$/g,o=n.exec(a.toLowerCase());o&&o[0].length?e.testFails(i,t(this)):s.empty&&e.isUnreadable(a)?e.testFails(i,t(this)):e.strings.placeholders.indexOf(a)>-1&&e.testFails(i,t(this))}else s.empty&&"number"!=typeof a&&e.testFails(i,t(this))})},labelProximityTest:function(i,s){e.html.find(s.selector).each(function(){var s=e.html.find("label[for="+t(this).attr("id")+"]").first();s.length||e.testFails(i,t(this)),t(this).parent().is(s.parent())||e.testFails(i,t(this))})},colorTest:function(i,s){if(s.bodyForegroundAttribute&&s.bodyBackgroundAttribute){var a=e.html.find("body").clone(!1,!1),n=a.attr(s.bodyForegroundAttribute),o=a.attr(s.bodyBackgroundAttribute);n===void 0&&(n="rgb(0,0,0)"),o===void 0&&(n="rgb(255,255,255)"),a.css("color",n),a.css("background-color",o),("wcag"===s.algorithm&&!e.colors.passesWCAG(a)||"wai"===s.algorithm&&!e.colors.passesWAI(a))&&e.testFails(i,a)}e.html.find(s.selector).filter(e.textSelector).each(function(){(!e.isUnreadable(t(this).text())&&"wcag"===s.algorithm&&!e.colors.passesWCAG(t(this))||"wai"===s.algorithm&&!e.colors.passesWAI(t(this)))&&e.testFails(i,t(this))})},scriptEventTest:function(i,s){e.loadHasEventListener();var a=s.selector===void 0?e.html.find("body").find("*"):e.html.find(s.selector);a.each(function(){var a=t(this).get(0);t(this).attr(s.searchEvent)?void 0!==s.correspondingEvent&&t(this).attr(s.correspondingEvent)||e.testFails(i,t(this)):!t.hasEventListener(a,s.searchEvent.replace("on",""))||void 0!==s.correspondingEvent&&t.hasEventListener(a,s.correspondingEvent.replace("on",""))||e.testFails(i,t(this))})},labelTest:function(i,s){e.html.find(s.selector).each(function(){t(this).parent("label").length&&e.containsReadableText(t(this).parent("label"))||e.html.find("label[for="+t(this).attr("id")+"]").length&&e.containsReadableText(e.html.find("label[for="+t(this).attr("id")+"]"))||e.testFails(i,t(this))})},containsReadableText:function(i,s){if(i=i.clone(),i.find("option").remove(),!e.isUnreadable(i.text()))return!0;if(!e.isUnreadable(i.attr("alt")))return!0;if(s){var a=!1;if(i.find("*").each(function(){e.containsReadableText(t(this),!0)&&(a=!0)}),a)return!0}return!1},headerOrderTest:function(i,s){var a=parseInt(s.selector.substr(-1,1),10),n=!1;e.html.find("h1, h2, h3, h4, h5, h6").each(function(){var s=parseInt(t(this).get(0).tagName.substr(-1,1),10);n&&(s-1>a||a>s+1)&&e.testFails(i,t(this)),s===a&&(n=t(this)),n&&s!==a&&(n=!1)})},acronymTest:function(i,s){var a={},n={};e.html.find(s+"[title]").each(function(){a[t(this).text().toUpperCase()]=t(this).attr("title")}),e.html.find("p, div, h1, h2, h3, h4, h5").each(function(){var s=t(this),o=t(this).text().split(" ");o.length>1&&t(this).text().toUpperCase()!==t(this).text()&&t.each(o,function(t,o){o=o.replace(/[^a-zA-Zs]/,""),o.toUpperCase()===o&&o.length>1&&a[o.toUpperCase()]===void 0&&(n[o.toUpperCase()]===void 0&&e.testFails(i,s,{acronym:o.toUpperCase()}),n[o.toUpperCase()]=o)})})},aAdjacentWithSameResourceShouldBeCombined:function(){e.html.find("a").each(function(){t(this).next("a").attr("href")===t(this).attr("href")&&e.testFails("aAdjacentWithSameResourceShouldBeCombined",t(this))})},aImgAltNotRepetative:function(){e.html.find("a img[alt]").each(function(){e.cleanString(t(this).attr("alt"))===e.cleanString(t(this).parent("a").text())&&e.testFails("aImgAltNotRepetative",t(this).parent("a"))})},aLinksAreSeperatedByPrintableCharacters:function(){e.html.find("a").each(function(){t(this).next("a").length&&e.isUnreadable(t(this).get(0).nextSibling.wholeText)&&e.testFails("aLinksAreSeperatedByPrintableCharacters",t(this))})},aLinkTextDoesNotBeginWithRedundantWord:function(){var i=e.loadString("redundant");e.html.find("a").each(function(){var s=t(this),a="";t(this).find("img[alt]").length&&(a+=t(this).find("img[alt]:first").attr("alt")),a+=t(this).text(),a=a.toLowerCase(),t.each(i.link,function(t,i){a.search(i)>-1&&e.testFails("aLinkTextDoesNotBeginWithRedundantWord",s)})})},aMustContainText:function(){e.html.find("a").each(function(){e.containsReadableText(t(this),!0)||(t(this).attr("name")||t(this).attr("id"))&&!t(this).attr("href")||e.testFails("aMustContainText",t(this))})},aSuspiciousLinkText:function(){var i=e.loadString("suspicious_links");e.html.find("a").each(function(){var s=t(this).text();t(this).find("img[alt]").each(function(){s+=t(this).attr("alt")}),i.indexOf(e.cleanString(s))>-1&&e.testFails("aSuspiciousLinkText",t(this))})},blockquoteUseForQuotations:function(){e.html.find("p").each(function(){t(this).text().substr(0,1).search(/[\'\"]/)>-1&&t(this).text().substr(-1,1).search(/[\'\"]/)>-1&&e.testFails("blockquoteUseForQuotations",t(this))})},documentAcronymsHaveElement:function(){e.acronymTest("documentAcronymsHaveElement","acronym")},documentAbbrIsUsed:function(){e.acronymTest("documentAbbrIsUsed","abbr")},documentTitleIsShort:function(){e.html.find("head title:first").text().length>150&&e.testFails("documentTitleIsShort",e.html.find("head title:first"))},documentVisualListsAreMarkedUp:function(){var i=[/\*/g,"
    *","•","•"];e.html.find("p, div, h1, h2, h3, h4, h5, h6").each(function(){var s=t(this);t.each(i,function(t,i){s.text().split(i).length>2&&e.testFails("documentVisualListsAreMarkedUp",s)})})},documentValidatesToDocType:function(){document.doctype===void 0},documentIDsMustBeUnique:function(){var i=[];e.html.find("*[id]").each(function(){i.indexOf(t(this).attr("id"))>=0&&e.testFails("documentIDsMustBeUnique",t(this)),i.push(t(this).attr("id"))})},documentIsWrittenClearly:function(){e.html.find(e.textSelector).each(function(){var i=e.textStatistics.cleanText(t(this).text());60>Math.round(206.835-1.015*e.textStatistics.averageWordsPerSentence(i)-84.6*e.textStatistics.averageSyllablesPerWord(i))&&e.testFails("documentIsWrittenClearly",t(this))})},documentLangIsISO639Standard:function(){var t=e.loadString("language_codes"),i=e.html.find("html").attr("lang");i&&-1===t.indexOf(i)&&e.testFails("documentLangIsISO639Standard",e.html.find("html"))},doctypeProvided:function(){0===t(e.html.get(0).doctype).length&&e.testFails("doctypeProvided",e.html.find("html"))},appletContainsTextEquivalent:function(){e.html.find("applet[alt=], applet:not(applet[alt])").each(function(){e.isUnreadable(t(this).text())&&e.testFails("appletContainsTextEquivalent",t(this))})},documentStrictDocType:function(){t(e.html.get(0).doctype).length&&-1!==e.html.get(0).doctype.systemId.indexOf("strict")||e.testFails("documentStrictDocType",e.html.find("html"))},embedHasAssociatedNoEmbed:function(){e.html.find("noembed").length||e.html.find("embed").each(function(){e.testFails("embedHasAssociatedNoEmbed",t(this))})},emoticonsExcessiveUse:function(){var i=e.loadString("emoticons"),s=0;e.html.find("p, div, h1, h2, h3, h4, h5, h6").each(function(){var a=t(this);t.each(a.text().split(" "),function(t,e){i.indexOf(e)>-1&&s++,s>4}),s>4&&e.testFails("emoticonsExcessiveUse",a)})},emoticonsMissingAbbr:function(){var i=e.loadString("emoticons");e.html.find("p, div, h1, h2, h3, h4, h5, h6").each(function(){var s=t(this),a=s.clone();a.find("abbr, acronym").each(function(){t(this).remove()}),t.each(a.text().split(" "),function(t,a){i.indexOf(a)>-1&&e.testFails("emoticonsMissingAbbr",s)})})},formWithRequiredLabel:function(){var i,s=e.loadString("redundant"),a=!1;s.required[s.required.indexOf("*")]=/\*/g,e.html.find("label").each(function(){var n=t(this).text().toLowerCase(),o=t(this);t.each(s.required,function(t,i){n.search(i)>=0&&!e.html.find("#"+o.attr("for")).attr("aria-required")&&e.testFails("formWithRequiredLabel",o)}),a=o.css("color")+o.css("font-weight")+o.css("background-color"),i&&a!==i&&e.testFails("formWithRequiredLabel",o),i=a})},headersUseToMarkSections:function(){e.html.find("p").each(function(){var i=t(this);i.find("strong:first, em:first, i:first, b:first").each(function(){i.text()===t(this).text()&&e.testFails("headersUseToMarkSections",i)})})},imgAltIsDifferent:function(){e.html.find("img[alt][src]").each(function(){(t(this).attr("src")===t(this).attr("alt")||t(this).attr("src").split("/").pop()===t(this).attr("alt"))&&e.testFails("imgAltIsDifferent",t(this))})},imgAltIsTooLong:function(){e.html.find("img[alt]").each(function(){t(this).attr("alt").length>100&&e.testFails("imgAltIsTooLong",t(this))})},imgAltTextNotRedundant:function(){var i={};e.html.find("img[alt]").each(function(){i[t(this).attr("alt")]===void 0?i[t(this).attr("alt")]=t(this).attr("src"):i[t(this).attr("alt")]!==t(this).attr("src")&&e.testFails("imgAltTextNotRedundant",t(this))})},inputCheckboxRequiresFieldset:function(){e.html.find(":checkbox").each(function(){t(this).parents("fieldset").length||e.testFails("inputCheckboxRequiresFieldset",t(this))})},inputImageAltIsNotFileName:function(){e.html.find("input[type=image][alt]").each(function(){t(this).attr("src")===t(this).attr("alt")&&e.testFails("inputImageAltIsNotFileName",t(this))})},inputImageAltIsShort:function(){e.html.find("input[type=image]").each(function(){t(this).attr("alt").length>100&&e.testFails("inputImageAltIsShort",t(this))})},inputImageAltNotRedundant:function(){var i=e.loadString("redundant");e.html.find("input[type=image][alt]").each(function(){i.inputImage.indexOf(e.cleanString(t(this).attr("alt")))>-1&&e.testFails("inputImageAltNotRedundant",t(this))})},imgImportantNoSpacerAlt:function(){e.html.find("img[alt]").each(function(){var i=t(this).width()?t(this).width():parseInt(t(this).attr("width"),10),s=t(this).height()?t(this).height():parseInt(t(this).attr("height"),10);e.isUnreadable(t(this).attr("alt").trim())&&t(this).attr("alt").length>0&&i>50&&s>50&&e.testFails("imgImportantNoSpacerAlt",t(this))})},imgNonDecorativeHasAlt:function(){e.html.find("img[alt]").each(function(){e.isUnreadable(t(this).attr("alt"))&&(t(this).width()>100||t(this).height()>100)&&e.testFails("imgNonDecorativeHasAlt",t(this))})},imgAltNotEmptyInAnchor:function(){e.html.find("a img").each(function(){e.isUnreadable(t(this).attr("alt"))&&e.isUnreadable(t(this).parent("a:first").text())&&e.testFails("imgAltNotEmptyInAnchor",t(this))})},imgHasLongDesc:function(){e.html.find("img[longdesc]").each(function(){t(this).attr("longdesc")!==t(this).attr("alt")&&e.validURL(t(this).attr("longdesc"))||e.testFails("imgHasLongDesc",t(this))})},imgMapAreasHaveDuplicateLink:function(){var i={};e.html.find("a").each(function(){i[t(this).attr("href")]=t(this).attr("href")}),e.html.find("img[usemap]").each(function(){var s=t(this),a=e.html.find(s.attr("usemap"));a.length||(a=e.html.find('map[name="'+s.attr("usemap").replace("#","")+'"]')),a.length&&a.find("area").each(function(){i[t(this).attr("href")]===void 0&&e.testFails("imgMapAreasHaveDuplicateLink",s)})})},imgGifNoFlicker:function(){e.html.find('img[src$=".gif"]').each(function(){var i=t(this);t.ajax({url:i.attr("src"),async:!1,dataType:"text",success:function(t){-1!==t.search("NETSCAPE2.0")&&e.testFails("imgGifNoFlicker",i)}})})},imgWithMathShouldHaveMathEquivalent:function(){e.html.find("img:not(img:has(math), img:has(tagName))").each(function(){t(this).parent().find("math").length||e.testFails("imgWithMathShouldHaveMathEquivalent",t(this))})},labelMustBeUnique:function(){var i={};e.html.find("label[for]").each(function(){i[t(this).attr("for")]!==void 0&&e.testFails("labelMustBeUnique",t(this)),i[t(this).attr("for")]=t(this).attr("for")})},labelsAreAssignedToAnInput:function(){e.html.find("label").each(function(){t(this).attr("for")?e.html.find("#"+t(this).attr("for")).length&&e.html.find("#"+t(this).attr("for")).is("input, select, textarea")||e.testFails("labelsAreAssignedToAnInput",t(this)):e.testFails("labelsAreAssignedToAnInput",t(this))})},listNotUsedForFormatting:function(){e.html.find("ol, ul").each(function(){2>t(this).find("li").length&&e.testFails("listNotUsedForFormatting",t(this))})},paragarphIsWrittenClearly:function(){e.html.find("p").each(function(){var i=e.textStatistics.cleanText(t(this).text());60>Math.round(206.835-1.015*e.textStatistics.averageWordsPerSentence(i)-84.6*e.textStatistics.averageSyllablesPerWord(i))&&e.testFails("paragarphIsWrittenClearly",t(this))})},siteMap:function(){var i=e.loadString("site_map"),s=!0;e.html.find("a").each(function(){var e=t(this).text().toLowerCase();t.each(i,function(t,i){return e.search(i)>-1?(s=!1,void 0):void 0}),s===!1}),s&&e.testFails("siteMap",e.html.find("body"))},pNotUsedAsHeader:function(){var i={};e.html.find("p").each(function(){if(1>t(this).text().search(".")){var s=t(this);t.each(e.suspectPHeaderTags,function(i,a){s.find(a).length&&s.find(a).each(function(){t(this).text().trim()===s.text().trim()&&e.testFails("pNotUsedAsHeader",s)})}),t.each(e.suspectPCSSStyles,function(t,a){i[a]!==void 0&&i[a]!==s.css(a)&&e.testFails("pNotUsedAsHeader",s),i[a]=s.css(a)}),"bold"===s.css("font-weight")&&e.testFails("pNotUsedAsHeader",s)}})},preShouldNotBeUsedForTabularLayout:function(){e.html.find("pre").each(function(){var i=t(this).text().split(/[\n\r]+/);i.length>1&&t(this).text().search(/\t/)>-1&&e.testFails("preShouldNotBeUsedForTabularLayout",t(this))})},selectJumpMenu:function(){0!==e.html.find("select").length&&(e.loadHasEventListener(),e.html.find("select").each(function(){0===t(this).parent("form").find(":submit").length&&(t.hasEventListener(t(this),"change")||t(this).attr("onchange"))&&e.testFails("selectJumpMenu",t(this))}))},tableHeaderLabelMustBeTerse:function(){e.html.find("th, table tr:first td").each(function(){t(this).text().length>20&&(!t(this).attr("abbr")||t(this).attr("abbr").length>20)&&e.testFails("tableHeaderLabelMustBeTerse",t(this))})},tabIndexFollowsLogicalOrder:function(){var i=0;e.html.find("[tabindex]").each(function(){parseInt(t(this).attr("tabindex"),10)>=0&&parseInt(t(this).attr("tabindex"),10)!==i+1&&e.testFails("tabIndexFollowsLogicalOrder",t(this)),i++})},tableLayoutDataShouldNotHaveTh:function(){e.html.find("table:has(th)").each(function(){e.isDataTable(t(this))||e.testFails("tableLayoutDataShouldNotHaveTh",t(this))})},tableLayoutHasNoSummary:function(){e.html.find("table[summary]").each(function(){e.isDataTable(t(this))||e.isUnreadable(t(this).attr("summary"))||e.testFails("tableLayoutHasNoSummary",t(this))})},tableLayoutHasNoCaption:function(){e.html.find("table:has(caption)").each(function(){e.isDataTable(t(this))||e.testFails("tableLayoutHasNoCaption",t(this))})},tableLayoutMakesSenseLinearized:function(){e.html.find("table").each(function(){e.isDataTable(t(this))||e.testFails("tableLayoutMakesSenseLinearized",t(this))})},tableNotUsedForLayout:function(){e.html.find("table").each(function(){e.isDataTable(t(this))||e.testFails("tableNotUsedForLayout",t(this))})},tableSummaryDoesNotDuplicateCaption:function(){e.html.find("table[summary]:has(caption)").each(function(){e.cleanString(t(this).attr("summary"))===e.cleanString(t(this).find("caption:first").text())&&e.testFails("tableSummaryDoesNotDuplicateCaption",t(this))})},tableSummaryIsNotTooLong:function(){e.html.find("table[summary]").each(function(){t(this).attr("summary").trim().length>100&&e.testFails("tableSummaryIsNotTooLong",t(this))})},tableUsesAbbreviationForHeader:function(){e.html.find("th:not(th[abbr])").each(function(){t(this).text().length>20&&e.testFails("tableUsesAbbreviationForHeader",t(this))})},tableUseColGroup:function(){e.html.find("table").each(function(){e.isDataTable(t(this))&&!t(this).find("colgroup").length&&e.testFails("tableUseColGroup",t(this))})},tableUsesScopeForRow:function(){e.html.find("table").each(function(){t(this).find("td:first-child").each(function(){var i=t(this).next("td");("bold"===t(this).css("font-weight")&&"bold"!==i.css("font-weight")||t(this).find("strong").length&&!i.find("strong").length)&&e.testFails("tableUsesScopeForRow",t(this))}),t(this).find("td:last-child").each(function(){var i=t(this).prev("td");("bold"===t(this).css("font-weight")&&"bold"!==i.css("font-weight")||t(this).find("strong").length&&!i.find("strong").length)&&e.testFails("tableUsesScopeForRow",t(this))})})},tableWithMoreHeadersUseID:function(){e.html.find("table:has(th)").each(function(){var i=t(this),s=0;i.find("tr").each(function(){t(this).find("th").length&&s++,s>1&&!t(this).find("th[id]").length&&e.testFails("tableWithMoreHeadersUseID",i)})})},textIsNotSmall:function(){e.loadPixelToEm(),e.html.find(e.textSelector).each(function(){var i=t(this).css("font-size");i.search("em")>0&&(i=t(this).toPx({scope:e.html})),i=parseInt(i.replace("px",""),10),10>i&&e.testFails("textIsNotSmall",t(this))})},videosEmbeddedOrLinkedNeedCaptions:function(){e.html.find("a").each(function(){var i=t(this);t.each(e.videoServices,function(t,s){s.isVideo(i.attr("href"))&&s.hasCaptions(function(t){t||e.testFails("videosEmbeddedOrLinkedNeedCaptions",i)})})})},tabularDataIsInTable:function(){e.html.find("pre").each(function(){t(this).html().search(" ")>=0&&e.testFails("tabularDataIsInTable",t(this))})}};e.statistics={setDecimal:function(t,e){var i=Math.pow(10,e||0);return e?Math.round(i*t)/i:t},average:function(t,i){for(var s=t.length,a=0;s--;)a+=t[s];return e.statistics.setDecimal(a/t.length,i)},variance:function(t,i){for(var s=e.statistics.average(t,i),a=t.length,n=0;a--;)n+=Math.pow(t[a]-s,2);return n/=t.length,e.statistics.setDecimal(n,i)},standardDeviation:function(t,i){var s=Math.sqrt(e.statistics.variance(t,i));return e.statistics.setDecimal(s,i)}},e.colors={getLuminosity:function(t,e){t=this.cleanup(t),e=this.cleanup(e);var i,s,a=t.r/255,n=t.g/255,o=t.b/255,r=.03928>=a?a/12.92:Math.pow((a+.055)/1.055,2.4),l=.03928>=n?n/12.92:Math.pow((n+.055)/1.055,2.4),c=.03928>=o?o/12.92:Math.pow((o+.055)/1.055,2.4),h=e.r/255,u=e.g/255,d=e.b/255,f=.03928>=h?h/12.92:Math.pow((h+.055)/1.055,2.4),m=.03928>=u?u/12.92:Math.pow((u+.055)/1.055,2.4),g=.03928>=d?d/12.92:Math.pow((d+.055)/1.055,2.4);return i=.2126*r+.7152*l+.0722*c,s=.2126*f+.7152*m+.0722*g,Math.round(10*((Math.max(i,s)+.05)/(Math.min(i,s)+.05)))/10},fetchImageColor:function(){var e=new Image,i=t(this).css("background-image").replace("url(","").replace(/'/,"").replace(")","");e.src=i;var s=document.createElement("canvas"),a=s.getContext("2d");a.drawImage(e,0,0);var n=a.getImageData(0,0,1,1).data;return"rgb("+n[0]+","+n[1]+","+n[2]+")"},passesWCAG:function(t){return e.colors.getLuminosity(e.colors.getColor(t,"foreground"),e.colors.getColor(t,"background"))>5},passesWAI:function(t){var i=e.colors.cleanup(e.colors.getColor(t,"foreground")),s=e.colors.cleanup(e.colors.getColor(t,"background"));return e.colors.getWAIErtContrast(i,s)>500&&e.colors.getWAIErtBrightness(i,s)>125},getWAIErtContrast:function(t,i){var s=e.colors.getWAIDiffs(t,i);return s.red+s.green+s.blue},getWAIErtBrightness:function(t,i){var s=e.colors.getWAIDiffs(t,i);return(299*s.red+587*s.green+114*s.blue)/1e3},getWAIDiffs:function(t,e){var i={};return i.red=Math.abs(t.r-e.r),i.green=Math.abs(t.g-e.g),i.blue=Math.abs(t.b-e.b),i},getColor:function(e,i){if("foreground"===i)return e.css("color")?e.css("color"):"rgb(255,255,255)";if("rgba(0, 0, 0, 0)"!==e.css("background-color")&&"transparent"!==e.css("background-color")||"body"===e.get(0).tagName)return e.css("background-color")?e.css("background-color"):"rgb(0,0,0)";var s="rgb(0,0,0)";return e.parents().each(function(){return"rgba(0, 0, 0, 0)"!==t(this).css("background-color")&&"transparent"!==t(this).css("background-color")?(s=t(this).css("background-color"),!1):void 0}),s},cleanup:function(t){return t=t.replace("rgb(","").replace("rgba(","").replace(")","").split(","),{r:t[0],g:t[1],b:t[2],a:t[3]===void 0?!1:t[3]}}},e.textStatistics={cleanText:function(t){return t.replace(/[,:;()\-]/," ").replace(/[\.!?]/,".").replace(/[ ]*(\n|\r\n|\r)[ ]*/," ").replace(/([\.])[\. ]+/,"$1").replace(/[ ]*([\.])/,"$1").replace(/[ ]+/," ").toLowerCase()},sentenceCount:function(t){var e=t;return e.split(".").length+1},wordCount:function(t){var e=t;return e.split(" ").length+1},averageWordsPerSentence:function(t){return e.textStatistics.wordCount(t)/e.textStatistics.sentenceCount(t)},averageSyllablesPerWord:function(i){var s=0,a=e.textStatistics.wordCount(i);return a?(t.each(i.split(" "),function(t,i){s+=e.textStatistics.syllableCount(i)}),s/a):0},syllableCount:function(t){var e=t.replace(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/,"").match(/[aeiouy]{1,2}/g);return e&&0!==e.length?e.length:1}},e.videoServices={youTube:{videoID:"",apiUrl:"http://gdata.youtube.com/feeds/api/videos/?q=%video&caption&v=2&alt=json",isVideo:function(t){var i=/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/,s=t.match(i);return s&&11===s[7].length?(e.videoServices.youTube.videoID=s[7],!0):!1},hasCaptions:function(e){t.ajax({url:this.apiUrl.replace("%video",this.videoID),async:!1,dataType:"json",success:function(t){e(t.feed.openSearch$totalResults.$t>0?!0:!1)}})}}}})(jQuery); \ No newline at end of file diff --git a/src/resources/guidelines/508.json b/src/resources/guidelines/508.json deleted file mode 100644 index 529d17537..000000000 --- a/src/resources/guidelines/508.json +++ /dev/null @@ -1,52 +0,0 @@ -[ - "imgHasAlt", - "imgAltIsDifferent", - "imgAltIsTooLong", - "imgNonDecorativeHasAlt", - "imgImportantNoSpacerAlt", - "imgAltNotPlaceHolder", - "imgAltNotEmptyInAnchor", - "imgAltIsSameInText", - "objectTextUpdatesWhenObjectChanges", - "objectLinkToMultimediaHasTextTranscript", - "objectMustContainText", - "scriptInBodyMustHaveNoscript", - "aLinksToMultiMediaRequireTranscript", - "imgNotReferredToByColorAlone", - "appletsDoneUseColorAlone", - "inputDoesNotUseColorAlone", - "objectDoesNotUseColorAlone", - "scriptsDoNotUseColorAlone", - "imgMapAreasHaveDuplicateLink", - "imgWithMapHasUseMap", - "tableDataShouldHaveTh", - "framesHaveATitle", - "frameTitlesDescribeFunction", - "frameSrcIsAccessible", - "frameRelationshipsMustBeDescribed", - "framesetMustHaveNoFramesSection", - "imgGifNoFlicker", - "appletsDoNotFlicker", - "objectDoesNotFlicker", - "scriptsDoNotFlicker", - "scriptInBodyMustHaveNoscript", - "appletContainsTextEquivalentInAlt", - "appletContainsTextEquivalent", - "appletUIMustBeAccessible", - "inputTextHasLabel", - "inputImageHasAlt", - "inputImageAltIdentifiesPurpose", - "inputImageAltIsShort", - "inputImageAltIsNotFileName", - "inputImageAltIsNotPlaceholder", - "inputTextHasValue", - "selectHasAssociatedLabel", - "passwordHasLabel", - "checkboxHasLabel", - "fileHasLabel", - "radioHasLabel", - "skipToContentLinkProvided", - "documentAutoRedirectNotUsed", - "headersHaveText", - "tableUsesScopeForRow" -] \ No newline at end of file diff --git a/src/resources/guidelines/508.yml b/src/resources/guidelines/508.yml new file mode 100644 index 000000000..c96f7331f --- /dev/null +++ b/src/resources/guidelines/508.yml @@ -0,0 +1,33 @@ +guidelines: + a: + title: "A text equivalent for every non-text element shall be provided (e.g., via 'alt', 'longdesc', or in element content)." + b: + title: "Equivalent alternatives for any multimedia presentation shall be synchronized with the presentation." + c: + title: "Web pages shall be designed so that all information conveyed with color is also available without color, for example from context or markup." + d: + title: "Documents shall be organized so they are readable without requiring an associated style sheet." + e: + title: "Redundant text links shall be provided for each active region of a server-side image map." + f: + title: "Client-side image maps shall be provided instead of server-side image maps except where the regions cannot be defined with an available geometric shape." + g: + title: "Row and column headers shall be identified for data tables." + h: + title: "Markup shall be used to associate data cells and header cells for data tables that have two or more logical levels of row or column headers." + i: + title: "Frames shall be titled with text that facilitates frame identification and navigation." + j: + title: "Pages shall be designed to avoid causing the screen to flicker with a frequency greater than 2 Hz and lower than 55 Hz." + k: + title: "A text-only page, with equivalent information or functionality, shall be provided to make a web site comply with the provisions of this part, when compliance cannot be accomplished in any other way. The content of the text-only page shall be updated whenever the primary page changes." + l: + title: "When pages utilize scripting languages to display content, or to create interface elements, the information provided by the script shall be identified with functional text that can be read by assistive technology." + m: + title: "When a web page requires that an applet, plug-in or other application be present on the client system to interpret page content, the page must provide a link to a plug-in or applet that complies with §1194.21(a) through (l)." + n: + title: "When electronic forms are designed to be completed on-line, the form shall allow people using assistive technology to access the information, field elements, and functionality required for completion and submission of the form, including all directions and cues." + o: + title: "A method shall be provided that permits users to skip repetitive navigation links." + p: + title: "When a timed response is required, the user shall be alerted and given sufficient time to indicate more time is required." diff --git a/src/resources/guidelines/wcag.yml b/src/resources/guidelines/wcag.yml new file mode 100644 index 000000000..d30218701 --- /dev/null +++ b/src/resources/guidelines/wcag.yml @@ -0,0 +1,1788 @@ +guidelines: + 1.1.1: + id: "text-equiv-all" + title: "Non-text Content" + description: "All non-text content that is presented to the user has a text alternative that serves the equivalent purpose, except for the situations listed below." + uri: "http://www.w3.org/TR/WCAG20/#text-equiv-all" + techniques: + - "C9" + - "C18" + - "F3" + - "F13" + - "F20" + - "F30" + - "F38" + - "F39" + - "F65" + - "F67" + - "F71" + - "F72" + - "FLASH1" + - "FLASH2" + - "FLASH3" + - "FLASH5" + - "FLASH6" + - "FLASH11" + - "FLASH25" + - "FLASH27" + - "FLASH28" + - "FLASH29" + - "FLASH30" + - "FLASH32" + - "G68" + - "G73" + - "G74" + - "G82" + - "G92" + - "G94" + - "G95" + - "G100" + - "G143" + - "G144" + - "G196" + - "H2" + - "H24" + - "H27" + - "H30" + - "H35" + - "H36" + - "H37" + - "H44" + - "H45" + - "H46" + - "H53" + - "H65" + - "H67" + - "H86" + - "SL5" + - "SL8" + - "SL18" + - "SL19" + - "SL26" + - "SL30" + 1.2.1: + id: "media-equiv-av-only-alt" + title: "Audio-only and Video-only (Prerecorded)" + description: "For prerecorded audio-only and prerecorded video-only media, the following are true, except when the audio or video is a media alternative for text and is clearly labeled as such:" + uri: "http://www.w3.org/TR/WCAG20/#media-equiv-av-only-alt" + techniques: + - "F30" + - "F67" + - "G158" + - "G159" + - "G166" + - "SL17" + 1.2.2: + id: "media-equiv-captions" + title: "Captions (Prerecorded)" + description: "Captions are provided for all prerecorded audio content in synchronized media, except when the media is a media alternative for text and is clearly labeled as such." + uri: "http://www.w3.org/TR/WCAG20/#media-equiv-captions" + techniques: + - "F8" + - "F74" + - "F75" + - "FLASH9" + - "G87" + - "G93" + - "SL16" + - "SL28" + - "SM11" + - "SM12" + 1.2.3: + id: "media-equiv-audio-desc" + title: "Audio Description or Media Alternative (Prerecorded)" + description: "An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media, except when the media is a media alternative for text and is clearly labeled as such." + uri: "http://www.w3.org/TR/WCAG20/#media-equiv-audio-desc" + techniques: + - "FLASH26" + - "G8" + - "G58" + - "G69" + - "G78" + - "G173" + - "G203" + - "H53" + - "SL1" + - "SL17" + - "SM1" + - "SM2" + - "SM6" + - "SM7" + 1.2.4: + id: "media-equiv-real-time-captions" + title: "Captions (Live)" + description: "Captions are provided for all live audio content in synchronized media." + uri: "http://www.w3.org/TR/WCAG20/#media-equiv-real-time-captions" + techniques: + - "G9" + - "G87" + - "G93" + - "SM11" + - "SM12" + 1.2.5: + id: "media-equiv-audio-desc-only" + title: "Audio Description (Prerecorded)" + description: "Audio description is provided for all prerecorded video content in synchronized media." + uri: "http://www.w3.org/TR/WCAG20/#media-equiv-audio-desc-only" + techniques: + - "FLASH26" + - "G8" + - "G78" + - "G173" + - "G203" + - "SL1" + - "SM1" + - "SM2" + - "SM6" + - "SM7" + 1.2.6: + id: "media-equiv-sign" + title: "Sign Language (Prerecorded)" + description: "Sign language interpretation is provided for all prerecorded audio content in synchronized media." + uri: "http://www.w3.org/TR/WCAG20/#media-equiv-sign" + techniques: + - "G54" + - "G81" + - "SM13" + - "SM14" + 1.2.7: + id: "media-equiv-extended-ad" + title: "Extended Audio Description (Prerecorded)" + description: "Where pauses in foreground audio are insufficient to allow audio descriptions to convey the sense of the video, extended audio description is provided for all prerecorded video content in synchronized media." + uri: "http://www.w3.org/TR/WCAG20/#media-equiv-extended-ad" + techniques: + - "G8" + - "SM1" + - "SM2" + 1.2.8: + id: "media-equiv-text-doc" + title: "Media Alternative (Prerecorded)" + description: "An alternative for time-based media is provided for all prerecorded synchronized media and for all prerecorded video-only media." + uri: "http://www.w3.org/TR/WCAG20/#media-equiv-text-doc" + techniques: + - "F74" + - "G58" + - "G69" + - "G159" + - "H46" + - "H53" + - "SL17" + 1.2.9: + id: "media-equiv-live-audio-only" + title: "Audio-only (Live)" + description: "An alternative for time-based media that presents equivalent information for live audio-only content is provided." + uri: "http://www.w3.org/TR/WCAG20/#media-equiv-live-audio-only" + techniques: + - "G150" + - "G151" + - "G157" + 1.3.1: + id: "content-structure-separation-programmatic" + title: "Info and Relationships" + description: "Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text." + uri: "http://www.w3.org/TR/WCAG20/#content-structure-separation-programmatic" + techniques: + - "ARIA1" + - "ARIA2" + - "C22" + - "F2" + - "F17" + - "F33" + - "F34" + - "F42" + - "F43" + - "F46" + - "F48" + - "F62" + - "F68" + - "F87" + - "F90" + - "F91" + - "FLASH8" + - "FLASH21" + - "FLASH23" + - "FLASH25" + - "FLASH29" + - "FLASH31" + - "FLASH32" + - "G115" + - "G117" + - "G138" + - "G140" + - "G141" + - "G162" + - "H39" + - "H42" + - "H43" + - "H44" + - "H48" + - "H49" + - "H51" + - "H63" + - "H65" + - "H71" + - "H73" + - "H85" + - "T1" + - "T2" + - "T3" + - "SCR21" + - "SL20" + - "SL26" + 1.3.2: + id: "content-structure-separation-sequence" + title: "Meaningful Sequence" + description: "When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined." + uri: "http://www.w3.org/TR/WCAG20/#content-structure-separation-sequence" + techniques: + - "C6" + - "C8" + - "C27" + - "F1" + - "F32" + - "F33" + - "F34" + - "F49" + - "FLASH15" + - "G57" + - "H34" + - "H56" + - "SL34" + 1.3.3: + id: "content-structure-separation-understanding" + title: "Sensory Characteristics" + description: "Instructions provided for understandingand operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound." + uri: "http://www.w3.org/TR/WCAG20/#content-structure-separation-understanding" + techniques: + - "F14" + - "F26" + - "G96" + 1.4.1: + id: "visual-audio-contrast-without-color" + title: "Use of Color" + description: "Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element." + uri: "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-without-color" + techniques: + - "C15" + - "F13" + - "F73" + - "F81" + - "G14" + - "G111" + - "G182" + - "G183" + - "H92" + 1.4.2: + id: "visual-audio-contrast-dis-audio" + title: "Audio Control" + description: "If any audio on a Web page plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level." + uri: "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-dis-audio" + techniques: + - "F23" + - "FLASH18" + - "FLASH34" + - "G60" + - "G170" + - "G171" + - "SL3" + - "SL24" + 1.4.3: + id: "visual-audio-contrast-contrast" + title: "Contrast (Minimum)" + description: "The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, except for the following:" + uri: "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast" + techniques: + - "F24" + - "F83" + - "G18" + - "G145" + - "G148" + - "G156" + - "G174" + - "SL13" + 1.4.4: + id: "visual-audio-contrast-scale" + title: "Resize text" + description: "Except for captions and images of text, text can be resized without assistive technology up to 200 percent without loss of content or functionality." + uri: "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-scale" + techniques: + - "C12" + - "C13" + - "C14" + - "C17" + - "C20" + - "C22" + - "C28" + - "F69" + - "F80" + - "G142" + - "G146" + - "G178" + - "G179" + - "SCR34" + - "SL22" + - "SL23" + 1.4.5: + id: "visual-audio-contrast-text-presentation" + title: "Images of Text" + description: "If the technologies being used can achieve the visual presentation, text is used to convey information rather than images of text except for the following:" + uri: "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-text-presentation" + techniques: + - "C6" + - "C8" + - "C12" + - "C13" + - "C14" + - "C22" + - "C30" + - "G140" + - "SL31" + 1.4.6: + id: "visual-audio-contrast7" + title: "Contrast (Enhanced)" + description: "The visual presentation of text and images of text has a contrast ratio of at least 7:1, except for the following:" + uri: "http://www.w3.org/TR/WCAG20/#visual-audio-contrast7" + techniques: + - "F24" + - "F83" + - "G17" + - "G18" + - "G148" + - "G156" + - "G174" + - "SL13" + 1.4.7: + id: "visual-audio-contrast-noaudio" + title: "Low or No Background Audio" + description: "For prerecorded audio-only content that (1) contains primarily speech in the foreground, (2) is not an audio CAPTCHA or audio logo, and (3) is not vocalization intended to be primarily musical expression such as singing or rapping, at least one of the following is true:" + uri: "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-noaudio" + techniques: + - "G56" + 1.4.8: + id: "visual-audio-contrast-visual-presentation" + title: "Visual Presentation" + description: "For the visual presentation of blocks of text, a mechanism is available to achieve the following:" + uri: "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-visual-presentation" + techniques: + - "C12" + - "C13" + - "C14" + - "C19" + - "C20" + - "C21" + - "C23" + - "C24" + - "C25" + - "C26" + - "F24" + - "F88" + - "FLASH33" + - "G146" + - "G148" + - "G156" + - "G169" + - "G172" + - "G175" + - "G188" + - "H87" + - "SCR34" + 1.4.9: + id: "visual-audio-contrast-text-images" + title: "Images of Text (No Exception)" + description: "Images of text are only used for pure decoration or where a particular presentation of text is essential to the information being conveyed." + uri: "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-text-images" + techniques: + - "C6" + - "C8" + - "C12" + - "C13" + - "C14" + - "C22" + - "C30" + - "G140" + - "SL31" + 2.1.1: + id: "keyboard-operation-keyboard-operable" + title: "Keyboard" + description: "All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes, except where the underlying function requires input that depends on the path of the user's movement and not just the endpoints." + uri: "http://www.w3.org/TR/WCAG20/#keyboard-operation-keyboard-operable" + techniques: + - "F42" + - "F54" + - "F55" + - "FLASH14" + - "FLASH16" + - "FLASH17" + - "FLASH22" + - "G90" + - "G202" + - "H91" + - "SCR2" + - "SCR20" + - "SCR29" + - "SCR35" + - "SL9" + - "SL14" + - "SL15" + 2.1.2: + id: "keyboard-operation-trapping" + title: "No Keyboard Trap" + description: "If keyboard focus can be moved to a component of the page using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away." + uri: "http://www.w3.org/TR/WCAG20/#keyboard-operation-trapping" + techniques: + - "F10" + - "FLASH17" + - "G21" + 2.1.3: + id: "keyboard-operation-all-funcs" + title: "Keyboard (No Exception)" + description: "All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes." + uri: "http://www.w3.org/TR/WCAG20/#keyboard-operation-all-funcs" + techniques: + - "F42" + - "F54" + - "F55" + - "FLASH14" + - "FLASH16" + - "FLASH17" + - "FLASH22" + - "G90" + - "G202" + - "H91" + - "SCR2" + - "SCR20" + - "SCR29" + - "SCR35" + - "SL9" + - "SL14" + - "SL15" + 2.2.1: + id: "time-limits-required-behaviors" + title: "Timing Adjustable" + description: "For each time limit that is set by the content, at least one of the following is true:" + uri: "http://www.w3.org/TR/WCAG20/#time-limits-required-behaviors" + techniques: + - "F40" + - "F41" + - "F58" + - "FLASH19" + - "FLASH24" + - "G4" + - "G133" + - "G180" + - "G198" + - "SCR1" + - "SCR16" + - "SCR33" + - "SCR36" + - "SL21" + 2.2.2: + id: "time-limits-pause" + title: "Pause, Stop, Hide" + description: "For moving, blinking, scrolling, or auto-updating information, all of the following are true:" + uri: "http://www.w3.org/TR/WCAG20/#time-limits-pause" + techniques: + - "F4" + - "F7" + - "F16" + - "F47" + - "F50" + - "FLASH35" + - "FLASH36" + - "G4" + - "G11" + - "G152" + - "G186" + - "G187" + - "G191" + - "SCR22" + - "SCR33" + - "SL11" + - "SL12" + - "SL24" + 2.2.3: + id: "time-limits-no-exceptions" + title: "No Timing" + description: "Timing is not an essential part of the event or activity presented by the content, except for non-interactive synchronized media and real-time events." + uri: "http://www.w3.org/TR/WCAG20/#time-limits-no-exceptions" + techniques: + - "G5" + 2.2.4: + id: "time-limits-postponed" + title: "Interruptions" + description: "Interruptions can be postponed or suppressed by the user, except interruptions involving an emergency." + uri: "http://www.w3.org/TR/WCAG20/#time-limits-postponed" + techniques: + - "F40" + - "F41" + - "G75" + - "G76" + - "SCR14" + 2.2.5: + id: "time-limits-server-timeout" + title: "Re-authenticating" + description: "When an authenticated session expires, the user can continue the activity without loss of data after re-authenticating." + uri: "http://www.w3.org/TR/WCAG20/#time-limits-server-timeout" + techniques: + - "F12" + - "G105" + - "G181" + 2.3.1: + id: "seizure-does-not-violate" + title: "Three Flashes or Below Threshold" + description: "Web pages do not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds." + uri: "http://www.w3.org/TR/WCAG20/#seizure-does-not-violate" + techniques: + - "G15" + - "G19" + - "G176" + 2.3.2: + id: "seizure-three-times" + title: "Three Flashes" + description: "Web pages do not contain anything that flashes more than three times in any one second period." + uri: "http://www.w3.org/TR/WCAG20/#seizure-three-times" + techniques: + - "G19" + 2.4.1: + id: "navigation-mechanisms-skip" + title: "Bypass Blocks" + description: "A mechanism is available to bypass blocks of content that are repeated on multiple Web pages." + uri: "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-skip" + techniques: + - "C6" + - "G1" + - "G123" + - "G124" + - "H64" + - "H69" + - "H70" + - "SCR28" + - "SL25" + - "SL29" + 2.4.2: + id: "navigation-mechanisms-title" + title: "Page Titled" + description: "Web pages have titles that describe topic or purpose." + uri: "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-title" + techniques: + - "ARIA1" + - "F25" + - "G88" + - "G127" + - "H25" + 2.4.3: + id: "navigation-mechanisms-focus-order" + title: "Focus Order" + description: "If a Web page can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability." + uri: "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-focus-order" + techniques: + - "C27" + - "F44" + - "F85" + - "FLASH15" + - "G59" + - "H4" + - "SCR26" + - "SCR27" + - "SCR37" + - "SL34" + 2.4.4: + id: "navigation-mechanisms-refs" + title: "Link Purpose (In Context)" + description: "The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link context, except where the purpose of the link would be ambiguous to users in general." + uri: "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-refs" + techniques: + - "ARIA1" + - "C7" + - "F63" + - "F89" + - "FLASH5" + - "FLASH7" + - "FLASH27" + - "G53" + - "G91" + - "G189" + - "H2" + - "H24" + - "H30" + - "H33" + - "H77" + - "H78" + - "H79" + - "H80" + - "H81" + - "SCR30" + - "SL18" + 2.4.5: + id: "navigation-mechanisms-mult-loc" + title: "Multiple Ways" + description: "More than one way is available to locate a Web page within a set of Web pages except where the Web Page is the result of, or a step in, a process." + uri: "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-mult-loc" + techniques: + - "G63" + - "G64" + - "G125" + - "G126" + - "G161" + - "G185" + - "H59" + 2.4.6: + id: "navigation-mechanisms-descriptive" + title: "Headings and Labels" + description: "Headings and labels describe topic or purpose." + uri: "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-descriptive" + techniques: + - "G130" + - "G131" + 2.4.7: + id: "navigation-mechanisms-focus-visible" + title: "Focus Visible" + description: "Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible." + uri: "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-focus-visible" + techniques: + - "C15" + - "F55" + - "F78" + - "FLASH20" + - "G149" + - "G165" + - "G195" + - "SCR31" + - "SL2" + - "SL7" + 2.4.8: + id: "navigation-mechanisms-location" + title: "Location" + description: "Information about the user's location within a set of Web pages is available." + uri: "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-location" + techniques: + - "G63" + - "G65" + - "G127" + - "G128" + - "H59" + 2.4.9: + id: "navigation-mechanisms-link" + title: "Link Purpose (Link Only)" + description: "A mechanism is available to allow the purpose of each link to be identified from link text alone, except where the purpose of the link would be ambiguous to users in general." + uri: "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-link" + techniques: + - "C7" + - "F84" + - "F89" + - "FLASH5" + - "FLASH7" + - "FLASH27" + - "G91" + - "G189" + - "H2" + - "H24" + - "H30" + - "H33" + - "SCR30" + - "SL18" + 2.4.10: + id: "navigation-mechanisms-headings" + title: "Section Headings" + description: "Section headings are used to organize the content." + uri: "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-headings" + techniques: + - "G141" + 3.1.1: + id: "meaning-doc-lang-id" + title: "Language of Page" + description: "The default human language of each Web page can be programmatically determined." + uri: "http://www.w3.org/TR/WCAG20/#meaning-doc-lang-id" + techniques: + - "FLASH13" + - "H57" + - "SVR5" + 3.1.2: + id: "meaning-other-lang-id" + title: "Language of Parts" + description: "The human language of each passage or phrase in the content can be programmatically determined except for proper names, technical terms, words of indeterminate language, and words or phrases that have become part of the vernacular of the immediately surrounding text." + uri: "http://www.w3.org/TR/WCAG20/#meaning-other-lang-id" + techniques: + - "FLASH13" + - "H58" + - "SL4" + - "SL27" + 3.1.3: + id: "meaning-idioms" + title: "Unusual Words" + description: "A mechanism is available for identifying specific definitions of words or phrases used in an unusual or restricted way, including idioms and jargon." + uri: "http://www.w3.org/TR/WCAG20/#meaning-idioms" + techniques: + - "G55" + - "G62" + - "G70" + - "G101" + - "G112" + - "H40" + - "H54" + - "H60" + 3.1.4: + id: "meaning-located" + title: "Abbreviations" + description: "A mechanism for identifying the expanded form or meaning of abbreviations is available." + uri: "http://www.w3.org/TR/WCAG20/#meaning-located" + techniques: + - "G55" + - "G62" + - "G70" + - "G97" + - "G102" + - "H28" + - "H60" + 3.1.5: + id: "meaning-supplements" + title: "Reading Level" + description: "When text requires reading ability more advanced than the lower secondary education level after removal of proper names and titles, supplemental content, or a version that does not require reading ability more advanced than the lower secondary education level, is available." + uri: "http://www.w3.org/TR/WCAG20/#meaning-supplements" + techniques: + - "G79" + - "G86" + - "G103" + - "G153" + - "G160" + 3.1.6: + id: "meaning-pronunciation" + title: "Pronunciation" + description: "A mechanism is available for identifying specific pronunciation of words where meaning of the words, in context, is ambiguous without knowing the pronunciation." + uri: "http://www.w3.org/TR/WCAG20/#meaning-pronunciation" + techniques: + - "G62" + - "G120" + - "G121" + - "G163" + - "H62" + 3.2.1: + id: "consistent-behavior-receive-focus" + title: "On Focus" + description: "When any user interface component receives focus, it does not initiate a change of context." + uri: "http://www.w3.org/TR/WCAG20/#consistent-behavior-receive-focus" + techniques: + - "F52" + - "F55" + - "G107" + - "G200" + - "G201" + 3.2.2: + id: "consistent-behavior-unpredictable-change" + title: "On Input" + description: "Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component." + uri: "http://www.w3.org/TR/WCAG20/#consistent-behavior-unpredictable-change" + techniques: + - "F36" + - "F37" + - "F76" + - "FLASH4" + - "G13" + - "G80" + - "G201" + - "H32" + - "H84" + - "SCR19" + - "SL10" + 3.2.3: + id: "consistent-behavior-consistent-locations" + title: "Consistent Navigation" + description: "Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user." + uri: "http://www.w3.org/TR/WCAG20/#consistent-behavior-consistent-locations" + techniques: + - "F66" + - "G61" + 3.2.4: + id: "consistent-behavior-consistent-functionality" + title: "Consistent Identification" + description: "Components that have the same functionality within a set of Web pages are identified consistently." + uri: "http://www.w3.org/TR/WCAG20/#consistent-behavior-consistent-functionality" + techniques: + - "F31" + - "G197" + 3.2.5: + id: "consistent-behavior-no-extreme-changes-context" + title: "Change on Request" + description: "Changes of context are initiated only by user request or a mechanism is available to turn off such changes." + uri: "http://www.w3.org/TR/WCAG20/#consistent-behavior-no-extreme-changes-context" + techniques: + - "F9" + - "F22" + - "F41" + - "F52" + - "F60" + - "F61" + - "G76" + - "G110" + - "G200" + - "H76" + - "H83" + - "SCR19" + - "SCR24" + - "SVR1" + 3.3.1: + id: "minimize-error-identified" + title: "Error Identification" + description: "If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text." + uri: "http://www.w3.org/TR/WCAG20/#minimize-error-identified" + techniques: + - "FLASH12" + - "G83" + - "G84" + - "G85" + - "G139" + - "G199" + - "SCR18" + - "SCR32" + - "SL35" + 3.3.2: + id: "minimize-error-cues" + title: "Labels or Instructions" + description: "Labels or instructions are provided when content requires user input." + uri: "http://www.w3.org/TR/WCAG20/#minimize-error-cues" + techniques: + - "ARIA1" + - "ARIA2" + - "F82" + - "FLASH8" + - "FLASH10" + - "FLASH25" + - "FLASH29" + - "FLASH32" + - "G13" + - "G83" + - "G89" + - "G131" + - "G162" + - "G167" + - "G184" + - "H44" + - "H65" + - "H71" + - "H90" + - "SL8" + - "SL19" + - "SL26" + 3.3.3: + id: "minimize-error-suggestions" + title: "Error Suggestion" + description: "If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content." + uri: "http://www.w3.org/TR/WCAG20/#minimize-error-suggestions" + techniques: + - "ARIA2" + - "ARIA3" + - "FLASH12" + - "G83" + - "G84" + - "G85" + - "G139" + - "G177" + - "G199" + - "SCR18" + - "SCR32" + - "SL35" + 3.3.4: + id: "minimize-error-reversible" + title: "Error Prevention (Legal, Financial, Data)" + description: "For Web pages that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, at least one of the following is true:" + uri: "http://www.w3.org/TR/WCAG20/#minimize-error-reversible" + techniques: + - "G98" + - "G99" + - "G155" + - "G164" + - "G168" + - "G199" + - "SCR18" + - "SL35" + 3.3.5: + id: "minimize-error-context-help" + title: "Help" + description: "Context-sensitive help is available." + uri: "http://www.w3.org/TR/WCAG20/#minimize-error-context-help" + techniques: + - "G71" + - "G89" + - "G184" + - "G193" + - "G194" + - "H89" + 3.3.6: + id: "minimize-error-reversible-all" + title: "Error Prevention (All)" + description: "For Web pages that require the user to submit information, at least one of the following is true:" + uri: "http://www.w3.org/TR/WCAG20/#minimize-error-reversible-all" + techniques: + - "G98" + - "G99" + - "G155" + - "G164" + - "G168" + - "G199" + 4.1.1: + id: "ensure-compat-parses" + title: "Parsing" + description: "In content implemented using markup languages, elements have complete start and end tags, elements are nested according to their specifications, elements do not contain duplicate attributes, and any IDs are unique, except where the specifications allow these features." + uri: "http://www.w3.org/TR/WCAG20/#ensure-compat-parses" + techniques: + - "F17" + - "F62" + - "F70" + - "F77" + - "G134" + - "G192" + - "H74" + - "H75" + - "H88" + - "H93" + - "H94" + - "SL33" + 4.1.2: + id: "ensure-compat-rsv" + title: "Name, Role, Value" + description: "For all user interface components (including but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies." + uri: "http://www.w3.org/TR/WCAG20/#ensure-compat-rsv" + techniques: + - "F15" + - "F20" + - "F59" + - "F68" + - "F79" + - "F86" + - "F89" + - "FLASH29" + - "FLASH30" + - "FLASH32" + - "G10" + - "G108" + - "G135" + - "H44" + - "H64" + - "H65" + - "H88" + - "H91" + - "SL6" + - "SL18" + - "SL20" + - "SL26" + - "SL30" + - "SL32" +techniques: + ARIA1: + description: "Using the aria-describedby property to provide a descriptive label for input controls" + ARIA2: + description: "Identifying required fields with the aria-required property" + ARIA3: + description: "Identifying valid range information with the aria-valuemin and aria-valuemax properties" + C6: + description: "Positioning content based on structural markup" + C7: + description: "Using CSS to hide a portion of the link text" + C8: + description: "Using CSS letter-spacing to control spacing within a word" + C9: + description: "Using CSS to include decorative images" + C12: + description: "Using percent for font sizes" + C13: + description: "Using named font sizes" + C14: + description: "Using em units for font sizes" + C15: + description: "Using CSS to change the presentation of a user interface component when it receives focus" + C17: + description: "Scaling form elements which contain text" + C18: + description: "Using CSS margin and padding rules instead of spacer images for layout design" + C19: + description: "Specifying alignment either to the left OR right in CSS" + C20: + description: "Using relative measurements to set column widths so that lines can average 80 characters or less when the browser is resized" + C21: + description: "Specifying line spacing in CSS" + C22: + description: "Using CSS to control visual presentation of text" + C23: + description: "Specifying text and background colors of secondary content such as banners, features and navigation in CSS while not specifying text and background colors of the main content" + C24: + description: "Using percentage values in CSS for container sizes" + C25: + description: "Specifying borders and layout in CSS to delineate areas of a Web page while not specifying text and text-background colors" + C26: + description: "Providing options within the content to switch to a layout that does not require the user to scroll horizontally to read a line of text" + C27: + description: "Making the DOM order match the visual order" + C28: + description: "Specifying the size of text containers using em units" + C30: + description: "Using CSS to replace text with images of text and providing user interface controls to switch" + F1: + description: "Failure of Success Criterion 1.3.2 due to changing the meaning of content by positioning information with CSS" + F2: + description: "Failure of Success Criterion 1.3.1 due to using changes in text presentation to convey information without using the appropriate markup or text" + F3: + description: "Failure of Success Criterion 1.1.1 due to using CSS to include images that convey important information" + F4: + description: "Failure of Success Criterion 2.2.2 due to using text-decoration:blink without a mechanism to stop it in less than five seconds" + F7: + description: "Failure of Success Criterion 2.2.2 due to an object or applet, such as Java or Flash, that has blinking content without a mechanism to pause the content that blinks for more than five seconds" + F8: + description: "Failure of Success Criterion 1.2.2 due to captions omitting some dialogue or important sound effects" + F9: + description: "Failure of Success Criterion 3.2.5 due to changing the context when the user removes focus from a form element" + F10: + description: "Failure of Success Criterion 2.1.2 and Conformance Requirement 5 due to combining multiple content formats in a way that traps users inside one format type" + F12: + description: "Failure of Success Criterion 2.2.5 due to having a session time limit without a mechanism for saving user's input and re-establishing that information upon re-authentication" + F13: + description: "Failure of Success Criterion 1.1.1 and 1.4.1 due to having a text alternative that does not include information that is conveyed by color differences in the image" + F14: + description: "Failure of Success Criterion 1.3.3 due to identifying content only by its shape or location" + F15: + description: "Failure of Success Criterion 4.1.2 due to implementing custom controls that do not use an accessibility API for the technology, or do so incompletely" + F16: + description: "Failure of Success Criterion 2.2.2 due to including scrolling content where movement is not essential to the activity without also including a mechanism to pause and restart the content" + F17: + description: "Failure of Success Criterion 1.3.1 and 4.1.1 due to insufficient information in DOM to determine one-to-one relationships (e.g., between labels with same id) in HTML" + F20: + description: "Failure of Success Criterion 1.1.1 and 4.1.2 due to not updating text alternatives when changes to non-text content occur" + F22: + description: "Failure of Success Criterion 3.2.5 due to opening windows that are not requested by the user" + F23: + description: "Failure of 1.4.2 due to playing a sound longer than 3 seconds where there is no mechanism to turn it off" + F24: + description: "Failure of Success Criterion 1.4.3, 1.4.6 and 1.4.8 due to specifying foreground colors without specifying background colors or vice versa" + F25: + description: "Failure of Success Criterion 2.4.2 due to the title of a Web page not identifying the contents" + F26: + description: "Failure of Success Criterion 1.3.3 due to using a graphical symbol alone to convey information" + F30: + description: "Failure of Success Criterion 1.1.1 and 1.2.1 due to using text alternatives that are not alternatives (e.g., filenames or placeholder text)" + F31: + description: "Failure of Success Criterion 3.2.4 due to using two different labels for the same function on different Web pages within a set of Web pages" + F32: + description: "Failure of Success Criterion 1.3.2 due to using white space characters to control spacing within a word" + F33: + description: "Failure of Success Criterion 1.3.1 and 1.3.2 due to using white space characters to create multiple columns in plain text content" + F34: + description: "Failure of Success Criterion 1.3.1 and 1.3.2 due to using white space characters to format tables in plain text content" + F36: + description: "Failure of Success Criterion 3.2.2 due to automatically submitting a form and presenting new content without prior warning when the last field in the form is given a value" + F37: + description: "Failure of Success Criterion 3.2.2 due to launching a new window without prior warning when the status of a radio button, check box or select list is changed" + F38: + description: "Failure of Success Criterion 1.1.1 due to omitting the alt-attribute for non-text content used for decorative purposes only in HTML" + F39: + description: "Failure of Success Criterion 1.1.1 due to providing a text alternative that is not null (e.g., alt='spacer' or alt='image') for images that should be ignored by assistive technology" + F40: + description: "Failure of Success Criterion 2.2.1 and 2.2.4 due to using meta redirect with a time limit" + F41: + description: "Failure of Success Criterion 2.2.1, 2.2.4, and 3.2.5 due to using meta refresh with a time-out" + F42: + description: "Failure of Success Criterion 1.3.1 and 2.1.1 due to using scripting events to emulate links in a way that is not programmatically determinable" + F43: + description: "Failure of Success Criterion 1.3.1 due to using structural markup in a way that does not represent relationships in the content" + F44: + description: "Failure of Success Criterion 2.4.3 due to using tabindex to create a tab order that does not preserve meaning and operability" + F46: + description: "Failure of Success Criterion 1.3.1 due to using th elements, caption elements, or non-empty summary attributes in layout tables" + F47: + description: "Failure of Success Criterion 2.2.2 due to using the blink element" + F48: + description: "Failure of Success Criterion 1.3.1 due to using the pre element to markup tabular information" + F49: + description: "Failure of Success Criterion 1.3.2 due to using an HTML layout table that does not make sense when linearized " + F50: + description: "Failure of Success Criterion 2.2.2 due to a script that causes a blink effect without a mechanism to stop the blinking at 5 seconds or less" + F52: + description: "Failure of Success Criterion 3.2.1 and 3.2.5 due to opening a new window as soon as a new page is loaded" + F54: + description: "Failure of Success Criterion 2.1.1 due to using only pointing-device-specific event handlers (including gesture) for a function" + F55: + description: "Failure of Success Criteria 2.1.1, 2.4.7, and 3.2.1 due to using script to remove focus when focus is received" + F58: + description: "Failure of Success Criterion 2.2.1 due to using server-side techniques to automatically redirect pages after a time-out" + F59: + description: "Failure of Success Criterion 4.1.2 due to using script to make div or span a user interface control in HTML" + F60: + description: "Failure of Success Criterion 3.2.5 due to launching a new window when a user enters text into an input field" + F61: + description: "Failure of Success Criterion 3.2.5 due to complete change of main content through an automatic update that the user cannot disable from within the content" + F62: + description: "Failure of Success Criterion 1.3.1 and 4.1.1 due to insufficient information in DOM to determine specific relationships in XML" + F63: + description: "Failure of Success Criterion 2.4.4 due to providing link context only in content that is not related to the link" + F65: + description: "Failure of Success Criterion 1.1.1 due to omitting the alt attribute on img elements, area elements, and input elements of type 'image'" + F66: + description: "Failure of Success Criterion 3.2.3 due to presenting navigation links in a different relative order on different pages" + F67: + description: "Failure of Success Criterion 1.1.1 and 1.2.1 due to providing long descriptions for non-text content that does not serve the same purpose or does not present the same information" + F68: + description: "Failure of Success Criterion 1.3.1 and 4.1.2 due to the association of label and user interface controls not being programmatically determinable" + F69: + description: "Failure of Success Criterion 1.4.4 when resizing visually rendered text up to 200 percent causes the text, image or controls to be clipped, truncated or obscured" + F70: + description: "Failure of Success Criterion 4.1.1 due to incorrect use of start and end tags or attribute markup" + F71: + description: "Failure of Success Criterion 1.1.1 due to using text look-alikes to represent text without providing a text alternative" + F72: + description: "Failure of Success Criterion 1.1.1 due to using ASCII art without providing a text alternative" + F73: + description: "Failure of Success Criterion 1.4.1 due to creating links that are not visually evident without color vision" + F74: + description: "Failure of Success Criterion 1.2.2 and 1.2.8 due to not labeling a synchronized media alternative to text as an alternative" + F75: + description: "Failure of Success Criterion 1.2.2 by providing synchronized media without captions when the synchronized media presents more information than is presented on the page" + F76: + description: "Failure of Success Criterion 3.2.2 due to providing instruction material about the change of context by change of setting in a user interface element at a location that users may bypass" + F77: + description: "Failure of Success Criterion 4.1.1 due to duplicate values of type ID" + F78: + description: "Failure of Success Criterion 2.4.7 due to styling element outlines and borders in a way that removes or renders non-visible the visual focus indicator" + F79: + description: "Failure of Success Criterion 4.1.2 due to the focus state of a user interface component not being programmatically determinable or no notification of change of focus state available" + F80: + description: "Failure of Success Criterion 1.4.4 when text-based form controls do not resize when visually rendered text is resized up to 200%" + F81: + description: "Failure of Success Criterion 1.4.1 due to identifying required or error fields using color differences only" + F82: + description: "Failure of Success Criterion 3.3.2 by visually formatting a set of phone number fields but not including a text label" + F83: + description: "Failure of Success Criterion 1.4.3 and 1.4.6 due to using background images that do not provide sufficient contrast with foreground text (or images of text)" + F84: + description: "Failure of Success Criterion 2.4.9 due to using a non-specific link such as 'click here' or 'more' without a mechanism to change the link text to specific text." + F85: + description: "Failure of Success Criterion 2.4.3 due to using dialogs or menus that are not adjacent to their trigger control in the sequential navigation order" + F86: + description: "Failure of Success Criterion 4.1.2 due to not providing names for each part of a multi-part form field, such as a US telephone number" + F87: + description: "Failure of Success Criterion 1.3.1 due to inserting non-decorative content by using :before and :after pseudo-elements and the 'content' property in CSS" + F88: + description: "Failure of Success Criterion 1.4.8 due to using text that is justified (aligned to both the left and the right margins)" + F89: + description: "Failure of Success Criteria 2.4.4, 2.4.9 and 4.1.2 due to using null alt on an image where the image is the only content in a link" + F90: + description: "Failure of Success Criterion 1.3.1 for incorrectly associating table headers and content via the headers and id attributes" + F91: + description: "Failure of Success Criterion 1.3.1 for not correctly marking up table headers" + FLASH1: + description: "Setting the name property for a non-text object" + FLASH2: + description: "Setting the description property for a non-text object in Flash" + FLASH3: + description: "Marking objects in Flash so that they can be ignored by AT" + FLASH4: + description: "Providing submit buttons in Flash" + FLASH5: + description: "Combining adjacent image and text buttons for the same resource" + FLASH6: + description: "Creating accessible hotspots using invisible buttons" + FLASH7: + description: "Using scripting to change control labels" + FLASH8: + description: "Adding a group name to the accessible name of a form control" + FLASH9: + description: "Applying captions to prerecorded synchronized media" + FLASH10: + description: "Indicating required form controls in Flash" + FLASH11: + description: "Providing a longer text description of an object" + FLASH12: + description: "Providing client-side validation and adding error text via the accessible description" + FLASH13: + description: "Using HTML language attributes to specify language in Flash content" + FLASH14: + description: "Using redundant keyboard and mouse event handlers in Flash" + FLASH15: + description: "Using the tabIndex property to specify a logical reading order and a logical tab order in Flash" + FLASH16: + description: "Making actions keyboard accessible by using the click event on standard components" + FLASH17: + description: "Providing keyboard access to a Flash object and avoiding a keyboard trap" + FLASH18: + description: "Providing a control to turn off sounds that play automatically in Flash" + FLASH19: + description: "Providing a script that warns the user a time limit is about to expire and provides a way to extend it" + FLASH20: + description: "Reskinning Flash components to provide highly visible focus indication" + FLASH21: + description: "Using the DataGrid component to associate column headers with cells" + FLASH22: + description: "Adding keyboard-accessible actions to static elements" + FLASH23: + description: "Adding summary information to a DataGrid" + FLASH24: + description: "Allowing the user to extend the default time limit" + FLASH25: + description: "Labeling a form control by setting its accessible name" + FLASH26: + description: "Applying audio descriptions to Flash video" + FLASH27: + description: "Providing button labels that describe the purpose of a button" + FLASH28: + description: "Providing text alternatives for ASCII art, emoticons, and leetspeak in Flash" + FLASH29: + description: "Setting the label property for form components" + FLASH30: + description: "Specifying accessible names for image buttons" + FLASH31: + description: "Specifying caption text for a DataGrid" + FLASH32: + description: "Using auto labeling to associate text labels with form controls" + FLASH33: + description: "Using relative values for Flash object dimensions" + FLASH34: + description: "Turning off sounds that play automatically when an assistive technology is detected" + FLASH35: + description: "Using script to scroll Flash content, and providing a mechanism to pause it" + FLASH36: + description: "Using scripts to control blinking and stop it in five seconds or less" + G1: + description: "Adding a link at the top of each page that goes directly to the main content area" + G4: + description: "Allowing the content to be paused and restarted from where it was paused" + G5: + description: "Allowing users to complete an activity without any time limit" + G8: + description: "Providing a movie with extended audio descriptions" + G9: + description: "Creating captions for live synchronized media" + G10: + description: "Creating components using a technology that supports the accessibilityAPI features of the platforms on which the user agents will be run to expose thenames and roles, allow user-settable properties to be directly set, and providenotification of changes" + G11: + description: "Creating content that blinks for less than 5 seconds" + G13: + description: "Describing what will happen before a change to a form control that causes a change of context to occur is made" + G14: + description: "Ensuring that information conveyed by color differences is also available in text" + G15: + description: "Using a tool to ensure that content does not violate the general flash threshold or red flash threshold" + G17: + description: "Ensuring that a contrast ratio of at least 7:1 exists between text (and images of text)and background behind the text" + G18: + description: "Ensuring that a contrast ratio of at least 4.5:1 exists between text (and images of text) and background behind the text" + G19: + description: "Ensuring that no component of the content flashes more than three times in any 1-second period" + G21: + description: "Ensuring that users are not trapped in content" + G53: + description: "Identifying the purpose of a link using link text combined with the text of the enclosing sentence" + G54: + description: "Including a sign language interpreter in the video stream" + G55: + description: "Linking to definitions" + G56: + description: "Mixing audio files so that non-speech sounds are at least 20 decibelslower than the speech audio content" + G57: + description: "Ordering the content in a meaningful sequence" + G58: + description: "Placing a link to the alternative for time-based media immediately next to the non-text content" + G59: + description: "Placing the interactive elements in an order that follows sequences and relationships within the content" + G60: + description: "Playing a sound that turns off automatically within three seconds" + G61: + description: "Presenting repeated components in the same relative order each time they appear" + G62: + description: "Providing a glossary" + G63: + description: "Providing a site map" + G64: + description: "Providing a Table of Contents" + G65: + description: "Providing a breadcrumb trail" + G68: + description: "Providing a short text alternative that describes the purpose of liveaudio-only and live video-only content" + G69: + description: "Providing an alternative for time based media" + G70: + description: "Providing a function to search an online dictionary" + G71: + description: "Providing a help link on every Web page" + G73: + description: "Providing a long description in another location with a link to it thatis immediately adjacent to the non-text content" + G74: + description: "Providing a long description in text near the non-text content, with areference to the location of the long description in the short description" + G75: + description: "Providing a mechanism to postpone any updating of content" + G76: + description: "Providing a mechanism to request an update of the content instead ofupdating automatically" + G78: + description: "Providing a second, user-selectable, audio track that includes audio descriptions" + G79: + description: "Providing a spoken version of the text" + G80: + description: "Providing a submit button to initiate a change of context" + G81: + description: "Providing a synchronized video of the sign language interpreter that canbe displayed in a different viewport or overlaid on the image by the player" + G82: + description: "Providing a text alternative that identifies the purpose of the non-text content" + G83: + description: "Providing text descriptions to identify required fields that were not completed" + G84: + description: "Providing a text description when the user provides information that is not in the list of allowed values" + G85: + description: "Providing a text description when user input falls outside the required format or values" + G86: + description: "Providing a text summary that requires reading ability less advanced than the upper secondary education level" + G87: + description: "Providing closed captions" + G88: + description: "Providing descriptive titles for Web pages" + G89: + description: "Providing expected data format and example" + G90: + description: "Providing keyboard-triggered event handlers" + G91: + description: "Providing link text that describes the purpose of a link" + G92: + description: "Providing long description for non-text content that serves the samepurpose and presents the same information" + G93: + description: "Providing open (always visible) captions" + G94: + description: "Providing short text alternative for non-text content that serves the same purpose and presents the same information as the non-text content" + G95: + description: "Providing short text alternatives that provide a brief description ofthe non-text content" + G96: + description: "Providing textual identification of items that otherwise rely only on sensory information to be understood" + G97: + description: "Providing the first use of an abbreviation immediately before or after the expanded form" + G98: + description: "Providing the ability for the user to review and correct answers before submitting" + G99: + description: "Providing the ability to recover deleted information" + G100: + description: "Providing a short text alternative which is the accepted name or a descriptive name of the non-text content" + G101: + description: "Providing the definition of a word or phrase used in an unusual or restricted way" + G102: + description: "Providing the expansion or explanation of an abbreviation" + G103: + description: "Providing visual illustrations, pictures, and symbols to help explain ideas, events, and processes" + G105: + description: "Saving data so that it can be used after a user re-authenticates" + G107: + description: "Using 'activate' rather than 'focus' as a trigger for changes of context" + G108: + description: "Using markup features to expose the name and role, allow user-settable properties to be directly set, and provide notification of changes" + G110: + description: "Using an instant client-side redirect" + G111: + description: "Using color and pattern" + G112: + description: "Using inline definitions" + G115: + description: "Using semantic elements to mark up structure" + G117: + description: "Using text to convey information that is conveyed by variations in presentation of text" + G120: + description: "Providing the pronunciation immediately following the word" + G121: + description: "Linking to pronunciations" + G123: + description: "Adding a link at the beginning of a block of repeated content to go to the end of the block" + G124: + description: "Adding links at the top of the page to each area of the content" + G125: + description: "Providing links to navigate to related Web pages" + G126: + description: "Providing a list of links to all other Web pages" + G127: + description: "Identifying a Web page's relationship to a larger collection of Web pages" + G128: + description: "Indicating current location within navigation bars" + G130: + description: "Providing descriptive headings" + G131: + description: "Providing descriptive labels" + G133: + description: "Providing a checkbox on the first page of a multipart form that allows users to ask for longer session time limit or no session time limit" + G134: + description: "Validating Web pages" + G135: + description: "Using the accessibility API features of a technology to expose names androles, to allow user-settable properties to be directly set, and to providenotification of changes" + G138: + description: "Using semantic markup whenever color cues are used" + G139: + description: "Creating a mechanism that allows users to jump to errors" + G140: + description: "Separating information and structure from presentation to enable different presentations" + G141: + description: "Organizing a page using headings" + G142: + description: "Using a technology that has commonly-available user agents that support zoom" + G143: + description: "Providing a text alternative that describes the purpose of the CAPTCHA" + G144: + description: "Ensuring that the Web Page contains another CAPTCHA serving the same purpose using a different modality" + G145: + description: "Ensuring that a contrast ratio of at least 3:1 exists between text (and images of text) and background behind the text" + G146: + description: "Using liquid layout" + G148: + description: "Not specifying background color, not specifying text color, and not using technology features that change those defaults" + G149: + description: "Using user interface components that are highlighted by the user agent when they receive focus" + G150: + description: "Providing text based alternatives for live audio-only content" + G151: + description: "Providing a link to a text transcript of a prepared statement or script if the script is followed" + G152: + description: "Setting animated gif images to stop blinking after n cycles (within 5 seconds)" + G153: + description: "Making the text easier to read" + G155: + description: "Providing a checkbox in addition to a submit button" + G156: + description: "Using a technology that has commonly-available user agents that can change the foreground and background of blocks of text" + G157: + description: "Incorporating a live audio captioning service into a Web page" + G158: + description: "Providing an alternative for time-based media for audio-only content" + G159: + description: "Providing an alternative for time-based media for video-only content" + G160: + description: "Providing sign language versions of information, ideas, and processes that must be understood in order to use the content" + G161: + description: "Providing a search function to help users find content" + G162: + description: "Positioning labels to maximize predictability of relationships" + G163: + description: "Using standard diacritical marks that can be turned off" + G164: + description: "Providing a stated time within which an online request (or transaction) may be amended or canceled by the user after making the request" + G165: + description: "Using the default focus indicator for the platform so that high visibility default focus indicators will carry over" + G166: + description: "Providing audio that describes the important video content and describing it as such" + G167: + description: "Using an adjacent button to label the purpose of a field" + G168: + description: "Requesting confirmation to continue with selected action" + G169: + description: "Aligning text on only one side" + G170: + description: "Providing a control near the beginning of the Web page that turns off sounds that play automatically" + G171: + description: "Playing sounds only on user request" + G172: + description: "Providing a mechanism to remove full justification of text" + G173: + description: "Providing a version of a movie with audio descriptions" + G174: + description: "Providing a control with a sufficient contrast ratio that allows users to switch to a presentation that uses sufficient contrast" + G175: + description: "Providing a multi color selection tool on the page for foreground and background colors" + G176: + description: "Keeping the flashing area small enough" + G177: + description: "Providing suggested correction text" + G178: + description: "Providing controls on the Web page that allow users to incrementally change the size of all text on the page up to 200 percent" + G179: + description: "Ensuring that there is no loss of content or functionality when the text resizes and text containers do not change their width" + G180: + description: "Providing the user with a means to set the time limit to 10 times the default time limit" + G181: + description: "Encoding user data as hidden or encrypted data in a re-authorization page" + G182: + description: "Ensuring that additional visual cues are available when text color differences are used to convey information" + G183: + description: "Using a contrast ratio of 3:1 with surrounding text and providing additional visual cues on focus for links or controls where color alone is used to identify them" + G184: + description: "Providing text instructions at the beginning of a form or set of fields that describes the necessary input" + G185: + description: "Linking to all of the pages on the site from the home page" + G186: + description: "Using a control in the Web page that stops moving, blinking, or auto-updating content" + G187: + description: "Using a technology to include blinking content that can be turned off via the user agent" + G188: + description: "Providing a button on the page to increase line spaces and paragraph spaces" + G189: + description: "Providing a control near the beginning of the Web page that changes the link text" + G191: + description: "Providing a link, button, or other mechanism that reloads the page without any blinking content" + G192: + description: "Fully conforming to specifications" + G193: + description: "Providing help by an assistant in the Web page" + G194: + description: "Providing spell checking and suggestions for text input" + G195: + description: "Using an author-supplied, highly visible focus indicator" + G196: + description: "Using a text alternative on one item within a group of images that describes all items in the group" + G197: + description: "Using labels, names, and text alternatives consistently for content that has the same functionality" + G198: + description: "Providing a way for the user to turn the time limit off" + G199: + description: "Providing success feedback when data is submitted successfully" + G200: + description: "Opening new windows and tabs from a link only when necessary" + G201: + description: "Giving users advanced warning when opening a new window" + G202: + description: "Ensuring keyboard control for all functionality" + G203: + description: "Using a static text alternative to describe a talking head video" + H2: + description: "Combining adjacent image and text links for the same resource" + H4: + description: "Creating a logical tab order through links, form controls, and objects" + H24: + description: "Providing text alternatives for the area elements of image maps " + H25: + description: "Providing a title using the title element" + H27: + description: "Providing text and non-text alternatives for object" + H28: + description: "Providing definitions for abbreviations by using the abbr and acronym elements" + H30: + description: "Providing link text that describes the purpose of a link for anchor elements" + H32: + description: "Providing submit buttons" + H33: + description: "Supplementing link text with the title attribute" + H34: + description: "Using a Unicode right-to-left mark (RLM) or left-to-right mark (LRM) to mix textdirection inline" + H35: + description: "Providing text alternatives on applet elements" + H36: + description: "Using alt attributes on images used as submit buttons" + H37: + description: "Using alt attributes on img elements" + H39: + description: "Using caption elements to associate data table captions with data tables" + H40: + description: "Using definition lists" + H42: + description: "Using h1-h6 to identify headings" + H43: + description: "Using id and headers attributes to associate data cells with header cells indata tables" + H44: + description: "Using label elements to associate text labels with form controls" + H45: + description: "Using longdesc" + H46: + description: "Using noembed with embed" + H48: + description: "Using ol, ul and dl for lists or groups of links" + H49: + description: "Using semantic markup to mark emphasized or special text" + H51: + description: "Using table markup to present tabular information" + H53: + description: "Using the body of the object element" + H54: + description: "Using the dfn element to identify the defining instance of a word" + H56: + description: "Using the dir attribute on an inline element to resolve problems with nested directional runs" + H57: + description: "Using language attributes on the html element " + H58: + description: "Using language attributes to identify changes in the human language " + H59: + description: "Using the link element and navigation tools" + H60: + description: "Using the link element to link to a glossary" + H62: + description: "Using the ruby element" + H63: + description: "Using the scope attribute to associate header cells and data cells in datatables" + H64: + description: "Using the title attribute of the frame and iframe elements" + H65: + description: "Using the title attribute to identify form controls when the label element cannot be used" + H67: + description: "Using null alt text and no title attribute on img elements for images that ATshould ignore" + H69: + description: "Providing heading elements at the beginning of each section of content" + H70: + description: "Using frame elements to group blocks of repeated material" + H71: + description: "Providing a description for groups of form controls using fieldset and legendelements" + H73: + description: "Using the summary attribute of the table element to give an overview of datatables" + H74: + description: "Ensuring that opening and closing tags are used according to specification" + H75: + description: "Ensuring that Web pages are well-formed" + H76: + description: "Using meta refresh to create an instant client-side redirect" + H77: + description: "Identifying the purpose of a link using link text combined with its enclosing list item" + H78: + description: "Identifying the purpose of a link using link text combined with its enclosing paragraph" + H79: + description: "Identifying the purpose of a link using link text combined with its enclosing table cell and associated table headings" + H80: + description: "Identifying the purpose of a link using link text combined with the preceding heading element" + H81: + description: "Identifying the purpose of a link in a nested list using link text combined with the parent list item under which the list is nested" + H83: + description: "Using the target attribute to open a new window on user request and indicating this in link text" + H84: + description: "Using a button with a select element to perform an action" + H85: + description: "Using OPTGROUP to group OPTION elements inside a SELECT" + H86: + description: "Providing text alternatives for ASCII art, emoticons, and leetspeak" + H87: + description: "Not interfering with the user agent's reflow of text as the viewing window is narrowed" + H88: + description: "Using HTML according to spec" + H89: + description: "Using the title attribute to provide context-sensitive help" + H90: + description: "Indicating required form controls using label or legend" + H91: + description: "Using HTML form controls and links" + H92: + description: "Including a text cue for colored form control labels" + H93: + description: "Ensuring that id attributes are unique on a Web page" + H94: + description: "Ensuring that elements do not contain duplicate attributes" + T1: + description: "Using standard text formatting conventions for paragraphs" + T2: + description: "Using standard text formatting conventions for lists" + T3: + description: "Using standard text formatting conventions for headings" + SCR1: + description: "Allowing the user to extend the default time limit" + SCR2: + description: "Using redundant keyboard and mouse event handlers" + SCR14: + description: "Using scripts to make nonessential alerts optional" + SCR16: + description: "Providing a script that warns the user a time limit is about to expire" + SCR18: + description: "Providing client-side validation and alert" + SCR19: + description: "Using an onchange event on a select element without causing a change of context" + SCR20: + description: "Using both keyboard and other device-specific functions" + SCR21: + description: "Using functions of the Document Object Model (DOM) to add content to a page" + SCR22: + description: "Using scripts to control blinking and stop it in five seconds or less" + SCR24: + description: "Using progressive enhancement to open new windows on user request" + SCR26: + description: "Inserting dynamic content into the Document Object Model immediately following its trigger element" + SCR27: + description: "Reordering page sections using the Document Object Model" + SCR28: + description: "Using an expandable and collapsible menu to bypass block of content" + SCR29: + description: "Adding keyboard-accessible actions to static HTML elements" + SCR30: + description: "Using scripts to change the link text" + SCR31: + description: "Using script to change the background color or border of the element with focus" + SCR32: + description: "Providing client-side validation and adding error text via the DOM" + SCR33: + description: "Using script to scroll content, and providing a mechanism to pause it" + SCR34: + description: "Calculating size and position in a way that scales with text size" + SCR35: + description: "Making actions keyboard accessible by using the onclick event of anchors and buttons" + SCR36: + description: "Providing a mechanism to allow users to display moving, scrolling, or auto-updating text in a static window or area" + SCR37: + description: "Creating Custom Dialogs in a Device Independent Way" + SVR1: + description: "Implementing automatic redirects on the server side instead of on the client side" + SVR5: + description: "Specifying the default language in the HTTP header" + SL1: + description: "Accessing Alternate Audio Tracks in Silverlight Media" + SL2: + description: "Changing The Visual Focus Indicator in Silverlight" + SL3: + description: "Controlling Silverlight MediaElement Audio Volume" + SL4: + description: "Declaring Discrete Silverlight Objects to Specify Language Parts in the HTML DOM" + SL5: + description: "Defining a Focusable Image Class for Silverlight" + SL6: + description: "Defining a UI Automation Peer for a Custom Silverlight Control" + SL7: + description: "Designing a Focused Visual State for Custom Silverlight Controls" + SL8: + description: "Displaying HelpText in Silverlight User Interfaces" + SL9: + description: "Handling Key Events to Enable Keyboard Functionality in Silverlight" + SL10: + description: "Implementing a Submit-Form Pattern in Silverlight" + SL11: + description: "Pausing or Stopping A Decorative Silverlight Animation" + SL12: + description: "Pausing, Stopping, or Playing Media in Silverlight MediaElements" + SL13: + description: "Providing A Style Switcher To Switch To High Contrast" + SL14: + description: "Providing Custom Control Key Handling for Keyboard Functionality in Silverlight" + SL15: + description: "Providing Keyboard Shortcuts that Work Across the Entire Silverlight Application" + SL16: + description: "Providing Script-Embedded Text Captions for MediaElement Content" + SL17: + description: "Providing Static Alternative Content for Silverlight Media Playing in a MediaElement" + SL18: + description: "Providing Text Equivalent for Nontext Silverlight Controls With AutomationProperties.Name" + SL19: + description: "Providing User Instructions With AutomationProperties.HelpText in Silverlight" + SL20: + description: "Relying on Silverlight AutomationPeer Behavior to Set AutomationProperties.Name" + SL21: + description: "Replacing A Silverlight Timed Animation With a Nonanimated Element" + SL22: + description: "Supporting Browser Zoom in Silverlight" + SL23: + description: "Using A Style Switcher to Increase Font Size of Silverlight Text Elements" + SL24: + description: "Using AutoPlay to Keep Silverlight Media from Playing Automatically" + SL25: + description: "Using Controls and Programmatic Focus to Bypass Blocks of Content in Silverlight" + SL26: + description: "Using LabeledBy to Associate Labels and Targets in Silverlight" + SL27: + description: "Using Language/Culture Properties as Exposed by Silverlight Applications and Assistive Technologies" + SL28: + description: "Using Separate Text-Format Text Captions for MediaElement Content" + SL29: + description: "Using Silverlight 'List' Controls to Define Blocks that can be Bypassed" + SL30: + description: "Using Silverlight Control Compositing and AutomationProperties.Name" + SL31: + description: "Using Silverlight Font Properties to Control Text Presentation" + SL32: + description: "Using Silverlight Text Elements for Appropriate Accessibility Role" + SL33: + description: "Using Well-Formed XAML to Define a Silverlight User Interface" + SL34: + description: "Using the Silverlight Default Tab Sequence and Altering Tab Sequences With Properties" + SL35: + description: "Using the Validation and ValidationSummary APIs to Implement Client Side Forms Validation in Silverlight" + SM1: + description: "Adding extended audio description in SMIL 1.0" + SM2: + description: "Adding extended audio description in SMIL 2.0" + SM6: + description: "Providing audio description in SMIL 1.0" + SM7: + description: "Providing audio description in SMIL 2.0" + SM11: + description: "Providing captions through synchronized text streams in SMIL 1.0" + SM12: + description: "Providing captions through synchronized text streams in SMIL 2.0" + SM13: + description: "Providing sign language interpretation through synchronized video streams in SMIL 1.0" + SM14: + description: "Providing sign language interpretation through synchronized video streams in SMIL 2.0" diff --git a/src/resources/guidelines/wcag1a.json b/src/resources/guidelines/wcag1a.json deleted file mode 100644 index b478d6041..000000000 --- a/src/resources/guidelines/wcag1a.json +++ /dev/null @@ -1,51 +0,0 @@ -[ - "imgHasAlt", - "imgNonDecorativeHasAlt", - "imgImportantNoSpacerAlt", - "imgHasLongDesc", - "imgAltIsSameInText", - "aLinksToSoundFilesNeedTranscripts", - "aLinksToMultiMediaRequireTranscript", - "appletContainsTextEquivalentInAlt", - "frameRelationshipsMustBeDescribed", - "inputImageHasAlt", - "inputImageAltIdentifiesPurpose", - "areaHasAltValue", - "areaAltIdentifiesDestination", - "areaLinksToSoundFile", - "objectTextUpdatesWhenObjectChanges", - "objectContentUsableWhenDisabled", - "objectLinkToMultimediaHasTextTranscript", - "objectMustHaveTitle", - "objectMustHaveValidTitle", - "objectMustContainText", - "scriptInBodyMustHaveNoscript", - "objectWithClassIDHasNoText", - "imageMapServerSide", - "imgNotReferredToByColorAlone", - "appletsDoneUseColorAlone", - "inputDoesNotUseColorAlone", - "objectDoesNotUseColorAlone", - "scriptsDoNotUseColorAlone", - "documentWordsNotInLanguageAreMarked", - "tableDataShouldHaveTh", - "cssDocumentMakesSenseStyleTurnedOff", - "documentContentReadableWithoutStylesheets", - "objectTextUpdatesWhenObjectChanges", - "objectWithClassIDHasNoText", - "appletContainsTextEquivalent", - "objectContentUsableWhenDisabled", - "objectUIMustBeAccessible", - "imgGifNoFlicker", - "appletsDoNotFlicker", - "objectDoesNotFlicker", - "scriptsDoNotFlicker", - "appletUIMustBeAccessible", - "objectInterfaceIsAccessible", - "scriptUIMustBeAccessible", - "imgWithMapHasUseMap", - "framesHaveATitle", - "frameTitlesDescribeFunction", - "svgContainsTitle", - "headersHaveText" -] \ No newline at end of file diff --git a/src/resources/guidelines/wcag1aa.json b/src/resources/guidelines/wcag1aa.json deleted file mode 100644 index 382d5f660..000000000 --- a/src/resources/guidelines/wcag1aa.json +++ /dev/null @@ -1,95 +0,0 @@ -[ - "imgHasAlt", - "imgNonDecorativeHasAlt", - "imgImportantNoSpacerAlt", - "imgHasLongDesc", - "imgAltIsSameInText", - "aLinksToSoundFilesNeedTranscripts", - "aLinksToMultiMediaRequireTranscript", - "appletContainsTextEquivalentInAlt", - "frameRelationshipsMustBeDescribed", - "inputImageHasAlt", - "inputImageAltIdentifiesPurpose", - "areaHasAltValue", - "areaAltIdentifiesDestination", - "areaLinksToSoundFile", - "objectTextUpdatesWhenObjectChanges", - "objectContentUsableWhenDisabled", - "objectLinkToMultimediaHasTextTranscript", - "objectMustHaveTitle", - "objectMustHaveValidTitle", - "objectMustContainText", - "objectWithClassIDHasNoText", - "imageMapServerSide", - "imgNotReferredToByColorAlone", - "appletsDoneUseColorAlone", - "objectDoesNotUseColorAlone", - "scriptsDoNotUseColorAlone", - "documentWordsNotInLanguageAreMarked", - "tableDataShouldHaveTh", - "cssDocumentMakesSenseStyleTurnedOff", - "documentContentReadableWithoutStylesheets", - "objectTextUpdatesWhenObjectChanges", - "objectWithClassIDHasNoText", - "appletContainsTextEquivalent", - "objectContentUsableWhenDisabled", - "objectUIMustBeAccessible", - "imgGifNoFlicker", - "appletsDoNotFlicker", - "objectDoesNotFlicker", - "scriptsDoNotFlicker", - "appletUIMustBeAccessible", - "objectInterfaceIsAccessible", - "scriptUIMustBeAccessible", - "imgWithMapHasUseMap", - "framesHaveATitle", - "frameTitlesDescribeFunction", - "imgWithMathShouldHaveMathEquivalent", - "documentValidatesToDocType", - "basefontIsNotUsed", - "fontIsNotUsed", - "headerH1", - "headerH2", - "headerH3", - "headerH4", - "headerH1Format", - "headerH2Format", - "headerH3Format", - "headerH4Format", - "headerH5Format", - "headerH6Format", - "menuNotUsedToFormatText", - "listNotUsedForFormatting", - "blockquoteNotUsedForIndentation", - "tableLayoutDataShouldNotHaveTh", - "framesetMustHaveNoFramesSection", - "noframesSectionMustHaveTextEquivalent", - "blinkIsNotUsed", - "marqueeIsNotUsed", - "documentMetaNotUsedWithTimeout", - "documentAutoRedirectNotUsed", - "aLinksDontOpenNewWindow", - "areaDontOpenNewWindow", - "textareaLabelPositionedClose", - "passwordLabelIsNearby", - "checkboxLabelIsNearby", - "fileLabelIsNearby", - "radioLabelIsNearby", - "frameRelationshipsMustBeDescribed", - "inputTextHasLabel", - "selectHasAssociatedLabel", - "textareaHasAssociatedLabel", - "passwordHasLabel", - "checkboxHasLabel", - "radioHasLabel", - "aLinksMakeSenseOutOfContext", - "aSuspiciousLinkText", - "documentHasTitleElement", - "documentTitleNotEmpty", - "documentTitleIsShort", - "documentTitleIsNotPlaceholder", - "documentTitleDescribesDocument", - "svgContainsTitle", - "cssTextHasContrast", - "headersHaveText" -] \ No newline at end of file diff --git a/src/resources/guidelines/wcag1aaa.json b/src/resources/guidelines/wcag1aaa.json deleted file mode 100644 index a5c246fad..000000000 --- a/src/resources/guidelines/wcag1aaa.json +++ /dev/null @@ -1,121 +0,0 @@ -[ - "imgHasAlt", - "imgNonDecorativeHasAlt", - "imgImportantNoSpacerAlt", - "imgHasLongDesc", - "imgAltIsSameInText", - "aLinksToSoundFilesNeedTranscripts", - "aLinksToMultiMediaRequireTranscript", - "appletContainsTextEquivalentInAlt", - "frameRelationshipsMustBeDescribed", - "inputImageHasAlt", - "inputImageAltIdentifiesPurpose", - "areaHasAltValue", - "areaAltIdentifiesDestination", - "areaLinksToSoundFile", - "objectTextUpdatesWhenObjectChanges", - "objectContentUsableWhenDisabled", - "objectLinkToMultimediaHasTextTranscript", - "objectMustHaveTitle", - "objectMustHaveValidTitle", - "objectMustContainText", - "objectWithClassIDHasNoText", - "imgMapAreasHaveDuplicateLink", - "imgNotReferredToByColorAlone", - "appletsDoneUseColorAlone", - "inputDoesNotUseColorAlone", - "objectDoesNotUseColorAlone", - "scriptsDoNotUseColorAlone", - "documentWordsNotInLanguageAreMarked", - "tableDataShouldHaveTh", - "cssDocumentMakesSenseStyleTurnedOff", - "documentContentReadableWithoutStylesheets", - "objectTextUpdatesWhenObjectChanges", - "objectWithClassIDHasNoText", - "appletContainsTextEquivalent", - "objectContentUsableWhenDisabled", - "objectUIMustBeAccessible", - "imgGifNoFlicker", - "appletsDoNotFlicker", - "objectDoesNotFlicker", - "scriptsDoNotFlicker", - "appletUIMustBeAccessible", - "objectInterfaceIsAccessible", - "scriptUIMustBeAccessible", - "imgWithMapHasUseMap", - "framesHaveATitle", - "frameTitlesDescribeFunction", - "imgWithMathShouldHaveMathEquivalent", - "documentValidatesToDocType", - "basefontIsNotUsed", - "fontIsNotUsed", - "headerH1", - "headerH2", - "headerH3", - "headerH4", - "headerH1Format", - "headerH2Format", - "headerH3Format", - "headerH4Format", - "headerH5Format", - "headerH6Format", - "menuNotUsedToFormatText", - "listNotUsedForFormatting", - "blockquoteNotUsedForIndentation", - "tableLayoutDataShouldNotHaveTh", - "scriptOnclickRequiresOnKeypress", - "scriptOndblclickRequiresOnKeypress", - "scriptOnmousedownRequiresOnKeypress", - "scriptOnmousemove", - "scriptOnmouseoutHasOnmouseblur", - "scriptOnmouseoverHasOnfocus", - "scriptOnmouseupHasOnkeyup", - "framesetMustHaveNoFramesSection", - "noframesSectionMustHaveTextEquivalent", - "blinkIsNotUsed", - "marqueeIsNotUsed", - "documentMetaNotUsedWithTimeout", - "documentAutoRedirectNotUsed", - "aLinksDontOpenNewWindow", - "areaDontOpenNewWindow", - "textareaLabelPositionedClose", - "passwordLabelIsNearby", - "checkboxLabelIsNearby", - "fileLabelIsNearby", - "radioLabelIsNearby", - "frameRelationshipsMustBeDescribed", - "inputTextHasLabel", - "selectHasAssociatedLabel", - "textareaHasAssociatedLabel", - "passwordHasLabel", - "checkboxHasLabel", - "radioHasLabel", - "aLinksMakeSenseOutOfContext", - "aSuspiciousLinkText", - "documentHasTitleElement", - "documentTitleNotEmpty", - "documentTitleIsShort", - "documentTitleIsNotPlaceholder", - "documentTitleDescribesDocument", - "addressForAuthor", - "imgMapAreasHaveDuplicateLink", - "documentAbbrIsUsed", - "documentAcronymsHaveElement", - "documentLangNotIdentified", - "documentLangIsISO639Standard", - "tableComplexHasSummary", - "tableSummaryIsEmpty", - "tableSummaryIsSufficient", - "tableLayoutHasNoSummary", - "inputTextHasTabIndex", - "inputRadioHasTabIndex", - "inputPasswordHasTabIndex", - "inputCheckboxHasTabIndex", - "inputFileHasTabIndex", - "aLinksAreSeperatedByPrintableCharacters", - "skipToContentLinkProvided", - "svgContainsTitle", - "cssTextHasContrast", - "headersHaveText", - "tableUsesScopeForRow" -] \ No newline at end of file diff --git a/src/resources/guidelines/wcag2a.json b/src/resources/guidelines/wcag2a.json deleted file mode 100644 index ce7e6ffa2..000000000 --- a/src/resources/guidelines/wcag2a.json +++ /dev/null @@ -1,114 +0,0 @@ -[ - "imgHasAlt", - "imgAltIsDifferent", - "imgAltIsTooLong", - "imgAltNotPlaceHolder", - "imgAltNotEmptyInAnchor", - "imgHasLongDesc", - "imgAltIsSameInText", - "imgAltEmptyForDecorativeImages", - "appletContainsTextEquivalentInAlt", - "appletContainsTextEquivalent", - "inputImageHasAlt", - "inputImageAltIdentifiesPurpose", - "inputImageAltIsShort", - "inputImageAltIsNotPlaceholder", - "areaHasAltValue", - "areaAltIdentifiesDestination", - "areaLinksToSoundFile", - "objectMustContainText", - "embedHasAssociatedNoEmbed", - "inputImageNotDecorative", - "areaAltRefersToText", - "inputElementsDontHaveAlt", - "aLinksToSoundFilesNeedTranscripts", - "aLinksToMultiMediaRequireTranscript", - "objectShouldHaveLongDescription", - "inputTextHasLabel", - "pNotUsedAsHeader", - "selectHasAssociatedLabel", - "textareaHasAssociatedLabel", - "textareaLabelPositionedClose", - "tableComplexHasSummary", - "tableSummaryIsEmpty", - "tableLayoutHasNoSummary", - "tableLayoutHasNoCaption", - "passwordHasLabel", - "checkboxHasLabel", - "fileHasLabel", - "radioHasLabel", - "passwordLabelIsNearby", - "checkboxLabelIsNearby", - "fileLabelIsNearby", - "radioLabelIsNearby", - "tableLayoutMakesSenseLinearized", - "tableLayoutDataShouldNotHaveTh", - "tableUsesCaption", - "preShouldNotBeUsedForTabularLayout", - "radioMarkedWithFieldgroupAndLegend", - "tableSummaryDescribesTable", - "tableIsGrouped", - "tableUseColGroup", - "tabularDataIsInTable", - "tableCaptionIdentifiesTable", - "tableSummaryDoesNotDuplicateCaption", - "tableWithBothHeadersUseScope", - "tableWithMoreHeadersUseID", - "inputCheckboxRequiresFieldset", - "documentVisualListsAreMarkedUp", - "documentReadingDirection", - "tableLayoutMakesSenseLinearized", - "imgNotReferredToByColorAlone", - "appletsDoneUseColorAlone", - "inputDoesNotUseColorAlone", - "objectDoesNotUseColorAlone", - "scriptsDoNotUseColorAlone", - "bodyColorContrast", - "bodyLinkColorContrast", - "bodyActiveLinkColorContrast", - "bodyVisitedLinkColorContrast", - "documentAllColorsAreSet", - "appletUIMustBeAccessible", - "objectInterfaceIsAccessible", - "scriptUIMustBeAccessible", - "scriptOndblclickRequiresOnKeypress", - "scriptOnmousedownRequiresOnKeypress", - "scriptOnmousemove", - "scriptOnmouseoutHasOnmouseblur", - "scriptOnmouseoverHasOnfocus", - "scriptOnmouseupHasOnkeyup", - "appletProvidesMechanismToReturnToParent", - "objectProvidesMechanismToReturnToParent", - "embedProvidesMechanismToReturnToParent", - "documentMetaNotUsedWithTimeout", - "blinkIsNotUsed", - "marqueeIsNotUsed", - "documentAutoRedirectNotUsed", - "imgGifNoFlicker", - "appletsDoNotFlicker", - "objectDoesNotFlicker", - "scriptsDoNotFlicker", - "skipToContentLinkProvided", - "framesHaveATitle", - "frameTitlesDescribeFunction", - "documentHasTitleElement", - "documentTitleNotEmpty", - "documentTitleIsShort", - "documentTitleIsNotPlaceholder", - "documentTitleDescribesDocument", - "aLinksMakeSenseOutOfContext", - "aSuspiciousLinkText", - "aMustContainText", - "documentLangNotIdentified", - "documentLangIsISO639Standard", - "documentWordsNotInLanguageAreMarked", - "areaDontOpenNewWindow", - "selectDoesNotChangeContext", - "labelMustBeUnique", - "labelMustNotBeEmpty", - "formWithRequiredLabel", - "documentIDsMustBeUnique", - "svgContainsTitle", - "headersHaveText", - "tableUsesScopeForRow" -] \ No newline at end of file diff --git a/src/resources/guidelines/wcag2aa.json b/src/resources/guidelines/wcag2aa.json deleted file mode 100644 index b53960bcf..000000000 --- a/src/resources/guidelines/wcag2aa.json +++ /dev/null @@ -1,139 +0,0 @@ -[ - "imgHasAlt", - "imgAltIsDifferent", - "imgAltIsTooLong", - "imgAltNotPlaceHolder", - "imgAltNotEmptyInAnchor", - "imgHasLongDesc", - "imgAltIsSameInText", - "imgAltEmptyForDecorativeImages", - "appletContainsTextEquivalentInAlt", - "appletContainsTextEquivalent", - "inputImageHasAlt", - "inputImageAltIdentifiesPurpose", - "inputImageAltIsShort", - "inputImageAltIsNotPlaceholder", - "areaHasAltValue", - "areaAltIdentifiesDestination", - "areaLinksToSoundFile", - "objectMustContainText", - "embedHasAssociatedNoEmbed", - "inputImageNotDecorative", - "areaAltRefersToText", - "inputElementsDontHaveAlt", - "aLinksToSoundFilesNeedTranscripts", - "aLinksToMultiMediaRequireTranscript", - "inputTextHasLabel", - "pNotUsedAsHeader", - "selectHasAssociatedLabel", - "textareaHasAssociatedLabel", - "textareaLabelPositionedClose", - "tableComplexHasSummary", - "tableSummaryIsEmpty", - "tableLayoutHasNoSummary", - "tableLayoutHasNoCaption", - "passwordHasLabel", - "checkboxHasLabel", - "fileHasLabel", - "radioHasLabel", - "passwordLabelIsNearby", - "checkboxLabelIsNearby", - "fileLabelIsNearby", - "radioLabelIsNearby", - "tableDataShouldHaveTh", - "tableLayoutDataShouldNotHaveTh", - "tableUsesCaption", - "preShouldNotBeUsedForTabularLayout", - "radioMarkedWithFieldgroupAndLegend", - "tableSummaryDescribesTable", - "tableIsGrouped", - "tableUseColGroup", - "tabularDataIsInTable", - "tableCaptionIdentifiesTable", - "tableSummaryDoesNotDuplicateCaption", - "tableWithBothHeadersUseScope", - "tableWithMoreHeadersUseID", - "inputCheckboxRequiresFieldset", - "documentVisualListsAreMarkedUp", - "documentReadingDirection", - "tableLayoutMakesSenseLinearized", - "appletUIMustBeAccessible", - "objectInterfaceIsAccessible", - "scriptUIMustBeAccessible", - "scriptOndblclickRequiresOnKeypress", - "scriptOnmousedownRequiresOnKeypress", - "scriptOnmousemove", - "scriptOnmouseoutHasOnmouseblur", - "scriptOnmouseoverHasOnfocus", - "scriptOnmouseupHasOnkeyup", - "documentMetaNotUsedWithTimeout", - "imgGifNoFlicker", - "appletsDoNotFlicker", - "objectDoesNotFlicker", - "scriptsDoNotFlicker", - "skipToContentLinkProvided", - "framesHaveATitle", - "frameTitlesDescribeFunction", - "documentWordsNotInLanguageAreMarked", - "documentLangNotIdentified", - "documentLangIsISO639Standard", - "areaDontOpenNewWindow", - "selectDoesNotChangeContext", - "documentIDsMustBeUnique", - "objectShouldHaveLongDescription", - "blinkIsNotUsed", - "marqueeIsNotUsed", - "documentAutoRedirectNotUsed", - "documentHasTitleElement", - "documentTitleNotEmpty", - "documentTitleIsShort", - "documentTitleIsNotPlaceholder", - "documentTitleDescribesDocument", - "appletProvidesMechanismToReturnToParent", - "objectProvidesMechanismToReturnToParent", - "embedProvidesMechanismToReturnToParent", - "imgAltIsSameInText", - "boldIsNotUsed", - "iIsNotUsed", - "basefontIsNotUsed", - "fontIsNotUsed", - "bodyColorContrast", - "bodyLinkColorContrast", - "bodyActiveLinkColorContrast", - "bodyVisitedLinkColorContrast", - "imgNotReferredToByColorAlone", - "appletsDoneUseColorAlone", - "inputDoesNotUseColorAlone", - "objectDoesNotUseColorAlone", - "scriptsDoNotUseColorAlone", - "documentAllColorsAreSet", - "aLinksMakeSenseOutOfContext", - "aSuspiciousLinkText", - "aMustContainText", - "siteMap", - "headerH1", - "headerH2", - "headerH3", - "headerH4", - "headerH4", - "headerH1Format", - "headerH2Format", - "headerH3Format", - "headerH4Format", - "headerH5Format", - "headerH6Format", - "tabIndexFollowsLogicalOrder", - "listNotUsedForFormatting", - "blockquoteNotUsedForIndentation", - "blockquoteUseForQuotations", - "labelMustBeUnique", - "labelMustNotBeEmpty", - "formWithRequiredLabel", - "formHasGoodErrorMessage", - "formErrorMessageHelpsUser", - "formDeleteIsReversable", - "svgContainsTitle", - "cssTextHasContrast", - "headersHaveText", - "tableUsesScopeForRow" -] \ No newline at end of file diff --git a/src/resources/guidelines/wcag2aaa.json b/src/resources/guidelines/wcag2aaa.json deleted file mode 100644 index 216b4448c..000000000 --- a/src/resources/guidelines/wcag2aaa.json +++ /dev/null @@ -1,142 +0,0 @@ -[ - "imgHasAlt", - "imgAltIsDifferent", - "imgAltIsTooLong", - "imgAltNotPlaceHolder", - "imgAltNotEmptyInAnchor", - "imgHasLongDesc", - "imgAltIsSameInText", - "imgAltEmptyForDecorativeImages", - "appletContainsTextEquivalentInAlt", - "appletContainsTextEquivalent", - "inputImageHasAlt", - "inputImageAltIdentifiesPurpose", - "inputImageAltIsShort", - "inputImageAltIsNotPlaceholder", - "areaHasAltValue", - "areaAltIdentifiesDestination", - "objectMustContainText", - "embedHasAssociatedNoEmbed", - "inputImageNotDecorative", - "inputElementsDontHaveAlt", - "aLinksToSoundFilesNeedTranscripts", - "aLinksToMultiMediaRequireTranscript", - "objectShouldHaveLongDescription", - "inputTextHasLabel", - "pNotUsedAsHeader", - "selectHasAssociatedLabel", - "textareaHasAssociatedLabel", - "textareaLabelPositionedClose", - "tableComplexHasSummary", - "tableSummaryIsEmpty", - "tableLayoutHasNoSummary", - "tableLayoutHasNoCaption", - "passwordHasLabel", - "checkboxHasLabel", - "fileHasLabel", - "radioHasLabel", - "passwordLabelIsNearby", - "checkboxLabelIsNearby", - "fileLabelIsNearby", - "radioLabelIsNearby", - "tableDataShouldHaveTh", - "tableLayoutDataShouldNotHaveTh", - "tableUsesCaption", - "preShouldNotBeUsedForTabularLayout", - "radioMarkedWithFieldgroupAndLegend", - "tableSummaryDescribesTable", - "tableIsGrouped", - "tableUseColGroup", - "tabularDataIsInTable", - "tableCaptionIdentifiesTable", - "tableSummaryDoesNotDuplicateCaption", - "tableWithBothHeadersUseScope", - "tableWithMoreHeadersUseID", - "inputCheckboxRequiresFieldset", - "documentVisualListsAreMarkedUp", - "documentReadingDirection", - "tableLayoutMakesSenseLinearized", - "boldIsNotUsed", - "iIsNotUsed", - "basefontIsNotUsed", - "fontIsNotUsed", - "inputDoesNotUseColorAlone", - "objectDoesNotUseColorAlone", - "scriptsDoNotUseColorAlone", - "bodyColorContrast", - "bodyLinkColorContrast", - "bodyActiveLinkColorContrast", - "bodyVisitedLinkColorContrast", - "documentAllColorsAreSet", - "bodyColorContrast", - "bodyLinkColorContrast", - "bodyActiveLinkColorContrast", - "bodyVisitedLinkColorContrast", - "objectInterfaceIsAccessible", - "scriptUIMustBeAccessible", - "scriptOndblclickRequiresOnKeypress", - "scriptOnmousedownRequiresOnKeypress", - "scriptOnmousemove", - "scriptOnmouseoutHasOnmouseblur", - "scriptOnmouseoverHasOnfocus", - "scriptOnmouseupHasOnkeyup", - "appletProvidesMechanismToReturnToParent", - "objectProvidesMechanismToReturnToParent", - "embedProvidesMechanismToReturnToParent", - "documentMetaNotUsedWithTimeout", - "blinkIsNotUsed", - "marqueeIsNotUsed", - "documentAutoRedirectNotUsed", - "imgGifNoFlicker", - "appletsDoNotFlicker", - "objectDoesNotFlicker", - "scriptsDoNotFlicker", - "skipToContentLinkProvided", - "framesHaveATitle", - "frameTitlesDescribeFunction", - "documentHasTitleElement", - "documentTitleNotEmpty", - "documentTitleIsShort", - "documentTitleIsNotPlaceholder", - "documentTitleDescribesDocument", - "aMustContainText", - "siteMap", - "headerH1", - "headerH2", - "headerH3", - "headerH4", - "headerH4", - "headerH1Format", - "headerH2Format", - "headerH3Format", - "headerH4Format", - "headerH5Format", - "headerH6Format", - "headersUseToMarkSections", - "documentLangNotIdentified", - "documentLangIsISO639Standard", - "documentWordsNotInLanguageAreMarked", - "selectDoesNotChangeContext", - "tabIndexFollowsLogicalOrder", - "listNotUsedForFormatting", - "blockquoteNotUsedForIndentation", - "blockquoteUseForQuotations", - "aLinksDontOpenNewWindow", - "documentIDsMustBeUnique", - "imgAltIsSameInText", - "documentAbbrIsUsed", - "documentAcronymsHaveElement", - "labelMustBeUnique", - "labelMustNotBeEmpty", - "formWithRequiredLabel", - "formHasGoodErrorMessage", - "formErrorMessageHelpsUser", - "formDeleteIsReversable", - "formErrorMessageHelpsUser", - "formDeleteIsReversable", - "svgContainsTitle", - "documentIsWrittenClearly", - "cssTextHasContrast", - "headersHaveText", - "tableUsesScopeForRow" -] \ No newline at end of file diff --git a/src/resources/strings/colors.json b/src/resources/strings/colors.json deleted file mode 100644 index da49c5dd6..000000000 --- a/src/resources/strings/colors.json +++ /dev/null @@ -1,142 +0,0 @@ -{ - "aliceblue": "f0f8ff", - "antiquewhite": "faebd7", - "aqua": "00ffff", - "aquamarine": "7fffd4", - "azure": "f0ffff", - "beige": "f5f5dc", - "bisque": "ffe4c4", - "black": "000000", - "blanchedalmond": "ffebcd", - "blue": "0000ff", - "blueviolet": "8a2be2", - "brown": "a52a2a", - "burlywood": "deb887", - "cadetblue": "5f9ea0", - "chartreuse": "7fff00", - "chocolate": "d2691e", - "coral": "ff7f50", - "cornflowerblue": "6495ed", - "cornsilk": "fff8dc", - "crimson": "dc143c", - "cyan": "00ffff", - "darkblue": "00008b", - "darkcyan": "008b8b", - "darkgoldenrod": "b8860b", - "darkgray": "a9a9a9", - "darkgreen": "006400", - "darkkhaki": "bdb76b", - "darkmagenta": "8b008b", - "darkolivegreen": "556b2f", - "darkorange": "ff8c00", - "darkorchid": "9932cc", - "darkred": "8b0000", - "darksalmon": "e9967a", - "darkseagreen": "8fbc8f", - "darkslateblue": "483d8b", - "darkslategray": "2f4f4f", - "darkturquoise": "00ced1", - "darkviolet": "9400d3", - "deeppink": "ff1493", - "deepskyblue": "00bfff", - "dimgray": "696969", - "dodgerblue": "1e90ff", - "firebrick": "b22222", - "floralwhite": "fffaf0", - "forestgreen": "228b22", - "fuchsia": "ff00ff", - "gainsboro": "dcdcdc", - "ghostwhite": "f8f8ff", - "gold": "ffd700", - "goldenrod": "daa520", - "gray": "808080", - "green": "008000", - "greenyellow": "adff2f", - "honeydew": "f0fff0", - "hotpink": "ff69b4", - "indianred": "cd5c5c", - "indigo": "4b0082", - "ivory": "fffff0", - "khaki": "f0e68c", - "lavender": "e6e6fa", - "lavenderblush": "fff0f5", - "lawngreen": "7cfc00", - "lemonchiffon": "fffacd", - "lightblue": "add8e6", - "lightcoral": "f08080", - "lightcyan": "e0ffff", - "lightgoldenrodyellow": "fafad2", - "lightgrey": "d3d3d3", - "lightgreen": "90ee90", - "lightpink": "ffb6c1", - "lightsalmon": "ffa07a", - "lightseagreen": "20b2aa", - "lightskyblue": "87cefa", - "lightslategray": "778899", - "lightsteelblue": "b0c4de", - "lightyellow": "ffffe0", - "lime": "00ff00", - "limegreen": "32cd32", - "linen": "faf0e6", - "magenta": "ff00ff", - "maroon": "800000", - "mediumaquamarine": "66cdaa", - "mediumblue": "0000cd", - "mediumorchid": "ba55d3", - "mediumpurple": "9370d8", - "mediumseagreen": "3cb371", - "mediumslateblue": "7b68ee", - "mediumspringgreen": "00fa9a", - "mediumturquoise": "48d1cc", - "mediumvioletred": "c71585", - "midnightblue": "191970", - "mintcream": "f5fffa", - "mistyrose": "ffe4e1", - "moccasin": "ffe4b5", - "navajowhite": "ffdead", - "navy": "000080", - "oldlace": "fdf5e6", - "olive": "808000", - "olivedrab": "6b8e23", - "orange": "ffa500", - "orangered": "ff4500", - "orchid": "da70d6", - "palegoldenrod": "eee8aa", - "palegreen": "98fb98", - "paleturquoise": "afeeee", - "palevioletred": "d87093", - "papayawhip": "ffefd5", - "peachpuff": "ffdab9", - "peru": "cd853f", - "pink": "ffc0cb", - "plum": "dda0dd", - "powderblue": "b0e0e6", - "purple": "800080", - "red": "ff0000", - "rosybrown": "bc8f8f", - "royalblue": "4169e1", - "saddlebrown": "8b4513", - "salmon": "fa8072", - "sandybrown": "f4a460", - "seagreen": "2e8b57", - "seashell": "fff5ee", - "sienna": "a0522d", - "silver": "c0c0c0", - "skyblue": "87ceeb", - "slateblue": "6a5acd", - "slategray": "708090", - "snow": "fffafa", - "springgreen": "00ff7f", - "steelblue": "4682b4", - "tan": "d2b48c", - "teal": "008080", - "thistle": "d8bfd8", - "tomato": "ff6347", - "turquoise": "40e0d0", - "violet": "ee82ee", - "wheat": "f5deb3", - "white": "ffffff", - "whitesmoke": "f5f5f5", - "yellow": "ffff00", - "yellowgreen": "9acd32" -} \ No newline at end of file diff --git a/src/resources/strings/emoticons.json b/src/resources/strings/emoticons.json deleted file mode 100644 index 5b0b239a2..000000000 --- a/src/resources/strings/emoticons.json +++ /dev/null @@ -1,27 +0,0 @@ -[ - ":)", - ";)", - ":-)", - ":^)", - "=)", - "B)", - "8)", - "c8", - "cB", - "=]", - ":]", - "x]", - ":-)", - ":)", - ":o)", - "=]", - ":-D", - ":D", - "=D", - ":-(", - ":(", - "=(", - ":/", - ":P", - ":o" -] \ No newline at end of file diff --git a/src/resources/strings/language_codes.json b/src/resources/strings/language_codes.json deleted file mode 100644 index ec8811bbb..000000000 --- a/src/resources/strings/language_codes.json +++ /dev/null @@ -1,202 +0,0 @@ -[ - "bh", - "bi", - "nb", - "bs", - "br", - "bg", - "my", - "es", - "ca", - "km", - "ch", - "ce", - "ny", - "ny", - "zh", - "za", - "cu", - "cu", - "cv", - "kw", - "co", - "cr", - "hr", - "cs", - "da", - "dv", - "dv", - "nl", - "dz", - "en", - "eo", - "et", - "ee", - "fo", - "fj", - "fi", - "nl", - "fr", - "ff", - "gd", - "gl", - "lg", - "ka", - "de", - "ki", - "el", - "kl", - "gn", - "gu", - "ht", - "ht", - "ha", - "he", - "hz", - "hi", - "ho", - "hu", - "is", - "io", - "ig", - "id", - "ia", - "ie", - "iu", - "ik", - "ga", - "it", - "ja", - "jv", - "kl", - "kn", - "kr", - "ks", - "kk", - "ki", - "rw", - "ky", - "kv", - "kg", - "ko", - "kj", - "ku", - "kj", - "ky", - "lo", - "la", - "lv", - "lb", - "li", - "li", - "li", - "ln", - "lt", - "lu", - "lb", - "mk", - "mg", - "ms", - "ml", - "dv", - "mt", - "gv", - "mi", - "mr", - "mh", - "ro", - "ro", - "mn", - "na", - "nv", - "nv", - "nd", - "nr", - "ng", - "ne", - "nd", - "se", - "no", - "nb", - "nn", - "ii", - "ny", - "nn", - "ie", - "oc", - "oj", - "cu", - "cu", - "cu", - "or", - "om", - "os", - "os", - "pi", - "pa", - "ps", - "fa", - "pl", - "pt", - "pa", - "ps", - "qu", - "ro", - "rm", - "rn", - "ru", - "sm", - "sg", - "sa", - "sc", - "gd", - "sr", - "sn", - "ii", - "sd", - "si", - "si", - "sk", - "sl", - "so", - "st", - "nr", - "es", - "su", - "sw", - "ss", - "sv", - "tl", - "ty", - "tg", - "ta", - "tt", - "te", - "th", - "bo", - "ti", - "to", - "ts", - "tn", - "tr", - "tk", - "tw", - "ug", - "uk", - "ur", - "ug", - "uz", - "ca", - "ve", - "vi", - "vo", - "wa", - "cy", - "fy", - "wo", - "xh", - "yi", - "yo", - "za", - "zu" -] \ No newline at end of file diff --git a/src/resources/strings/placeholders.json b/src/resources/strings/placeholders.json deleted file mode 100644 index 4f12658e8..000000000 --- a/src/resources/strings/placeholders.json +++ /dev/null @@ -1,20 +0,0 @@ -[ -"title", -"untitled", -"untitled document", -"this is the title", -"the title", -"content", -" ", -"new page", -"new", -"nbsp", -" ", -"spacer", -"image", -"img", -"photo", -"frame", -"frame title", -"legend" -] \ No newline at end of file diff --git a/src/resources/strings/redundant.json b/src/resources/strings/redundant.json deleted file mode 100644 index 043d1a780..000000000 --- a/src/resources/strings/redundant.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "inputImage":[ - "submit", - "button" - ], - "link":[ - "link to", - "link", - "go to", - "click here", - "link", - "click" - ], - "required":[ - "*" - ] -} \ No newline at end of file diff --git a/src/resources/strings/site_map.json b/src/resources/strings/site_map.json deleted file mode 100644 index 0d8c12fb2..000000000 --- a/src/resources/strings/site_map.json +++ /dev/null @@ -1,5 +0,0 @@ -[ - "site map", - "map", - "sitemap" -] \ No newline at end of file diff --git a/src/resources/strings/suspicious_links.json b/src/resources/strings/suspicious_links.json deleted file mode 100644 index ffcb7d4cc..000000000 --- a/src/resources/strings/suspicious_links.json +++ /dev/null @@ -1,13 +0,0 @@ -[ -"click here", -"click", -"more", -"here", -"read more", -"clic aquí", -"clic", -"haga clic", -"más", -"aquí", -"image" -] \ No newline at end of file diff --git a/src/resources/tests.json b/src/resources/tests.json deleted file mode 100644 index 51b117aa8..000000000 --- a/src/resources/tests.json +++ /dev/null @@ -1,1443 +0,0 @@ -{ - "aAdjacentWithSameResourceShouldBeCombined": { - "type": "custom", - "callback": "aAdjacentWithSameResourceShouldBeCombined", - "testability": 1, - "tags" : [ "link", "content" ] - }, - "aImgAltNotRepetative": { - "type": "custom", - "callback": "aImgAltNotRepetative", - "testability": 1, - "tags" : [ "link", "content" ] - }, - "aLinkTextDoesNotBeginWithRedundantWord": { - "type": "custom", - "callback": "aLinkTextDoesNotBeginWithRedundantWord", - "testability": 0, - "tags" : [ "link", "content" ] - }, - "aLinksAreSeperatedByPrintableCharacters": { - "type": "custom", - "callback": "aLinksAreSeperatedByPrintableCharacters", - "testability": 1, - "tags" : [ "link", "content" ] - }, - "aLinksDontOpenNewWindow": { - "type": "selector", - "selector": "a[target=_new], a[target=_blank], a[target=_blank]", - "testability": 1, - "tags" : [ "link", "content" ] - }, - "aLinksToMultiMediaRequireTranscript": { - "type": "selector", - "selector": "a[href$='.wmv'], a[href$='.mpg'], a[href$='.mov'], a[href$='.ram'], a[href$='.aif']", - "testability": 0, - "tags" : [ "link", "media", "content" ] - }, - "aLinksToSoundFilesNeedTranscripts": { - "type": "selector", - "selector": "a[href$='.wav'], a[href$='.snd'], a[href$='.mp3'], a[href$='.iff'], a[href$='.svx'], a[href$='.sam'], a[href$='.smp'], a[href$='.vce'], a[href$='.vox'], a[href$='.pcm'], a[href$='.aif']", - "testability": 0, - "tags" : [ "link", "media", "content" ] - }, - "aMultimediaTextAlternative": { - "type": "selector", - "selector": "a[href$='.wmv'], a[href$='.wav'], a[href$='.mpg'], a[href$='.mov'], a[href$='.ram'], a[href$='.aif']", - "testability": 0, - "tags" : [ "link", "media", "content" ] - }, - "aMustContainText": { - "type": "custom", - "callback": "aMustContainText", - "testability": 1, - "tags" : [ "link", "content" ] - }, - "aMustHaveTitle": { - "type": "selector", - "selector": "a:not(a[title])", - "testability": 1, - "tags" : [ "link", "content" ] - }, - "aMustNotHaveJavascriptHref": { - "type": "selector", - "selector": "a[href^='javascript:']", - "testability": 1, - "tags" : [ "link", "content" ] - }, - "aSuspiciousLinkText": { - "type": "custom", - "callback": "aSuspiciousLinkText", - "testability": 1, - "tags" : [ "link", "content" ] - }, - "aTitleDescribesDestination": { - "type": "selector", - "selector": "a[title]", - "testability": 0, - "tags" : [ "link", "content" ] - }, - "addressForAuthor": { - "type": "selector", - "selector": "body:not(body:has(address))", - "testability": 1, - "tags" : [ "document" ] - }, - "addressForAuthorMustBeValid": { - "type": "selector", - "selector": "address", - "testability": 0.5, - "tags" : [ "document" ] - }, - "appletContainsTextEquivalent": { - "type": "custom", - "callback": "appletContainsTextEquivalent", - "testability": 1, - "tags" : [ "objects", "applet", "content" ] - }, - "appletContainsTextEquivalentInAlt": { - "type": "placeholder", - "selector": "applet", - "attribute": "alt", - "empty": true, - "testability": 0.5, - "tags" : [ "objects", "applet", "content" ] - }, - "appletProvidesMechanismToReturnToParent": { - "type": "selector", - "selector": "applet", - "testability": 0, - "tags" : [ "objects", "applet", "content" ] - }, - "appletTextEquivalentsGetUpdated": { - "type": "selector", - "selector": "applet", - "testability": 0, - "tags" : [ "objects", "applet", "content" ] - }, - "appletUIMustBeAccessible": { - "type": "selector", - "selector": "applet", - "testability": 0, - "tags" : [ "objects", "applet", "content" ] - }, - "appletsDoNotFlicker": { - "type": "selector", - "selector": "applet", - "testability": 0, - "tags" : [ "objects", "applet", "content" ] - }, - "appletsDoneUseColorAlone": { - "type": "selector", - "selector": "applet", - "testability": 0, - "tags" : [ "objects", "applet", "content" ] - }, - "areaAltIdentifiesDestination": { - "type": "selector", - "selector": "area[alt]", - "testability": 0, - "tags" : [ "objects", "applet", "content" ] - }, - "areaAltRefersToText": { - "type": "selector", - "selector": "area", - "testability": 0, - "tags" : [ "imagemap", "content" ] - }, - "areaDontOpenNewWindow": { - "type": "selector", - "selector": "area[target='new window'], area[target=_new], area[target=_blank], area[target=_blank]", - "testability": 1, - "tags" : [ "imagemap", "content" ] - }, - "areaHasAltValue": { - "type": "selector", - "selector": "area:not(area[alt])", - "testability": 1, - "tags" : [ "imagemap", "content" ] - }, - "ariaOrphanedContent": { - "type": "selector", - "selector" : "body *:not(*[role] *, *[role], script, meta, link)", - "testability": 1, - "tags" : [ "aria", "content" ] - }, - "areaLinksToSoundFile": { - "type": "selector", - "selector": "area[href$=wav], area[href$=snd], area[href$=mp3], area[href$=iff], area[href$=svx], area[href$=sam], area[href$=smp], area[href$=vce], area[href$=vox], area[href$=pcm], area[href$=aif]", - "testability": 1, - "tags" : [ "imagemap", "media", "content" ] - }, - "basefontIsNotUsed": { - "type": "selector", - "selector": "basefont", - "testability": 1, - "tags" : [ "document", "deprecated" ] - }, - "blinkIsNotUsed": { - "type": "selector", - "selector": "blink", - "testability": 1, - "tags" : [ "deprecated", "content" ] - }, - "blockquoteNotUsedForIndentation": { - "type": "selector", - "selector": "blockquote:not(blockquote[cite])", - "testability": 0.5, - "tags" : [ "blockquote", "content" ] - }, - "blockquoteUseForQuotations": { - "type": "custom", - "callback": "blockquoteUseForQuotations", - "testability": 0.5, - "tags" : [ "blockquote", "content" ] - }, - "bodyActiveLinkColorContrast": { - "type": "color", - "algorithm": "wcag", - "selector": "a:active", - "bodyForegroundAttribute": "alink", - "bodyBackgroundAttribute": "bgcolor", - "testability": 1, - "tags" : [ "document", "color" ] - }, - "bodyColorContrast": { - "type": "color", - "algorithm": "wcag", - "selector": "body", - "bodyForegroundAttribute": "text", - "bodyBackgroundAttribute": "bgcolor", - "testability": 1, - "tags" : [ "document", "color" ] - }, - "bodyLinkColorContrast": { - "type": "color", - "algorithm": "wcag", - "selector": "a", - "bodyForegroundAttribute": "link", - "bodyBackgroundAttribute": "bgcolor", - "testability": 1, - "tags" : [ "document", "color" ] - }, - "bodyMustNotHaveBackground": { - "type": "selector", - "selector": "body[background]", - "testability": 1, - "tags" : [ "document", "color" ] - }, - "bodyVisitedLinkColorContrast": { - "type": "color", - "algorithm": "wcag", - "selector": "a:visited", - "bodyForegroundAttribute": "vlink", - "bodyBackgroundAttribute": "bgcolor", - "testability": 1, - "tags" : [ "link", "color" ] - }, - "boldIsNotUsed": { - "type": "selector", - "selector": "bold", - "testability": 1, - "tags" : [ "semantics", "content" ] - }, - "checkboxHasLabel": { - "type": "label", - "selector": "input[type=checkbox]", - "testability": 1, - "tags" : [ "form", "content" ] - }, - "checkboxLabelIsNearby": { - "type": "labelProximity", - "selector": "input[type=checkbox]", - "testability": 0.5, - "tags" : [ "form", "content" ] - }, - "cssDocumentMakesSenseStyleTurnedOff": { - "type": "selector", - "selector": "link[rel=stylesheet], stylesheet, *[style]", - "testability": 0, - "tags" : [ "color" ] - }, - "cssTextHasContrast": { - "type": "color", - "algorithm": "wcag", - "selector": "*", - "bodyForegroundAttribute": "background", - "bodyBackgroundAttribute": "color", - "testability": 1, - "tags" : [ "color" ] - }, - "doctypeProvided": { - "type": "custom", - "callback": "doctypeProvided", - "testability": 1, - "tags" : [ "doctype" ] - }, - "documentAbbrIsUsed": { - "type": "custom", - "callback": "documentAbbrIsUsed", - "testability": 0.5, - "tags" : [ "acronym", "content" ] - }, - "documentAcronymsHaveElement": { - "type": "custom", - "callback": "documentAcronymsHaveElement", - "testability": 0.5, - "tags" : [ "acronym", "content" ] - }, - "documentAllColorsAreSet": { - "type": "selector", - "selector": "body:not(body[text][bgcolor][link][alink][vlink], body:not(body[text], body[bgcolor], body[link], body[alink], body[vlink]))", - "testability": 1, - "tags" : [ "deprecated", "color" ] - }, - "documentAutoRedirectNotUsed": { - "type": "selector", - "selector": "meta[http-equiv=refresh]", - "testability": 1, - "tags" : [ "document" ] - }, - "documentColorWaiActiveLinkAlgorithm": { - "type": "color", - "algorithm": "wai", - "selector": "a:active", - "bodyForegroundAttribute": "alink", - "bodyBackgroundAttribute": "bgcolor", - "testability": 1, - "tags" : [ "document", "color" ] - }, - "documentColorWaiAlgorithm": { - "type": "color", - "algorithm": "wai", - "bodyForegroundAttribute": "text", - "bodyBackgroundAttribute": "bgcolor", - "selector": "body", - "testability": 1, - "tags" : [ "document", "color" ] - }, - "documentColorWaiLinkAlgorithm": { - "type": "color", - "algorithm": "wai", - "selector": "a", - "bodyForegroundAttribute": "link", - "bodyBackgroundAttribute": "bgcolor", - "testability": 1, - "tags" : [ "document", "color" ] - }, - "documentColorWaiVisitedLinkAlgorithm": { - "type": "color", - "algorithm": "wai", - "selector": "a:visited", - "bodyForegroundAttribute": "vlink", - "bodyBackgroundAttribute": "bgcolor", - "testability": 1, - "tags" : [ "document", "color" ] - }, - "documentContentReadableWithoutStylesheets": { - "type": "selector", - "selector": "html:has(link[rel=stylesheet], style) body, body:has(*[style])", - "testability": 0, - "tags" : [ "document", "color" ] - }, - "documentHasTitleElement": { - "type": "selector", - "selector": "html:not(html:has(title))", - "testability": 1, - "tags" : [ "document", "head" ] - }, - "documentIDsMustBeUnique": { - "type": "custom", - "callback": "documentIDsMustBeUnique", - "testability": 1, - "tags" : [ "document", "sematnics" ] - }, - "documentLangIsISO639Standard": { - "type": "custom", - "callback": "documentLangIsISO639Standard", - "testability": 1, - "tags" : [ "document", "language" ] - }, - "documentLangNotIdentified": { - "type": "selector", - "selector": "html:not(html[lang])", - "testability": 1, - "tags" : [ "document", "language" ] - }, - "documentMetaNotUsedWithTimeout": { - "type": "selector", - "selector": "meta[http-equiv=refresh]", - "testability": 1, - "tags" : [ "document"] - }, - "documentReadingDirection": { - "type": "selector", - "selector": "*[lang=he]:not(*[dir=rtl]), *[lang=ar]:not(*[dir=rtl])", - "testability": 0.5, - "tags" : [ "document", "language" ] - }, - "documentStrictDocType": { - "type": "custom", - "callback": "documentStrictDocType", - "testability": 1, - "tags" : [ "document", "doctype" ] - }, - "documentTitleDescribesDocument": { - "type": "selector", - "selector": "head title:first", - "testability": 0, - "tags" : [ "document", "head" ] - }, - "documentTitleIsNotPlaceholder": { - "type": "placeholder", - "selector": "head title:first", - "content": true, - "testability": 1, - "tags" : [ "document", "head" ] - }, - "documentTitleIsShort": { - "type": "custom", - "callback": "documentTitleIsShort", - "testability": 0.5, - "tags" : [ "document", "head"] - }, - "documentTitleNotEmpty": { - "type": "placeholder", - "selector": "head title", - "empty": true, - "content": true, - "testability": 1, - "tags" : [ "document", "head"] - }, - "documentValidatesToDocType": { - "type": "custom", - "callback": "documentValidatesToDocType", - "testability": 1, - "tags" : [ "document", "doctype" ] - }, - "documentVisualListsAreMarkedUp": { - "type": "custom", - "callback": "documentVisualListsAreMarkedUp", - "testability": 1, - "tags" : [ "list", "semantics", "content" ] - }, - "documentWordsNotInLanguageAreMarked": { - "type": "selector", - "selector": "body", - "testability": 0, - "tags" : [ "language" ] - }, - "documentIsWrittenClearly": { - "type": "custom", - "callback": "documentIsWrittenClearly", - "testability": 0.5, - "tags" : [ "language", "content" ] - }, - "embedHasAssociatedNoEmbed": { - "type": "custom", - "callback": "embedHasAssociatedNoEmbed", - "testability": 1, - "tags" : [ "object", "embed", "content" ] - }, - "embedMustHaveAltAttribute": { - "type": "selector", - "selector": "embed:not(embed[alt])", - "testability": 1, - "tags" : [ "object", "embed", "content" ] - }, - "embedMustNotHaveEmptyAlt": { - "type": "selector", - "selector": "embed[alt=]", - "testability": 1, - "tags" : [ "object", "embed", "content" ] - }, - "embedProvidesMechanismToReturnToParent": { - "type": "selector", - "selector": "embed", - "testability": 0, - "tags" : [ "object", "embed", "content" ] - }, - "emoticonsExcessiveUse": { - "type": "custom", - "callback": "emoticonsExcessiveUse", - "testability": 0.5, - "tags" : [ "language", "emoticons", "content" ] - }, - "emoticonsMissingAbbr": { - "type": "custom", - "callback": "emoticonsMissingAbbr", - "testability": 1, - "tags" : [ "language", "emoticons", "content" ] - }, - "fileHasLabel": { - "type": "label", - "selector": "input[type=file]", - "testability": 1, - "tags" : [ "form", "content" ] - }, - "fileLabelIsNearby": { - "type": "labelProximity", - "selector": "input[type=file]", - "testability": 0.5, - "tags" : [ "form", "content" ] - }, - "fontIsNotUsed": { - "type": "selector", - "selector": "font", - "testability": 1, - "tags" : [ "deprecated", "content" ] - }, - "formDeleteIsReversable": { - "type": "selector", - "selector": "form", - "testability": 0, - "tags" : [ "form", "content" ] - }, - "formAllowsCheckIfIrreversable": { - "type": "selector", - "selector": "form", - "testability": 0, - "tags" : [ "form", "content" ] - }, - "formErrorMessageHelpsUser": { - "type": "selector", - "selector": "form", - "testability": 0, - "tags" : [ "form", "content" ] - }, - "formHasGoodErrorMessage": { - "type": "selector", - "selector": "form", - "testability": 0, - "tags" : [ "form", "content" ] - }, - "formWithRequiredLabel": { - "type": "custom", - "callback": "formWithRequiredLabel", - "testability": 0, - "tags" : [ "form", "content" ] - }, - "frameIsNotUsed": { - "type": "selector", - "selector": "frame", - "testability": 1, - "tags" : [ "deprecated", "frame" ] - }, - "frameRelationshipsMustBeDescribed": { - "type": "selector", - "selector": "frameset:not(frameset[longdesc])", - "testability": 0.5, - "tags" : [ "deprecated", "frame" ] - }, - "frameSrcIsAccessible": { - "type": "selector", - "selector": "frame", - "testability": 0, - "tags" : [ "deprecated", "frame" ] - }, - "framesetIsNotUsed": { - "type": "selector", - "selector": "frameset", - "testability": 1, - "tags" : [ "deprecated", "frame" ] - }, - "frameTitlesDescribeFunction": { - "type": "placeholder", - "selector": "frame[title]", - "attribute": "title", - "empty": true, - "testability": 0, - "tags" : [ "deprecated", "frame" ] - }, - "frameTitlesNotEmpty": { - "type": "selector", - "selector": "frame:not(frame[title]), frame[title=]", - "testability": 1, - "tags" : [ "deprecated", "frame" ] - }, - "frameTitlesNotPlaceholder": { - "type": "placeholder", - "selector": "frame", - "attribute": "title", - "testability": 1, - "tags" : [ "deprecated", "frame"] - }, - "framesHaveATitle": { - "type": "selector", - "selector": "frame:not(frame[title])", - "testability": 1, - "tags" : [ "deprecated", "frame" ] - }, - "framesetMustHaveNoFramesSection": { - "type": "selector", - "selector": "frameset:not(frameset:has(noframes))", - "testability": 0.5, - "tags" : [ "deprecated", "frame" ] - }, - "headerH1": { - "type": "header", - "selector": "h1", - "testability": 0, - "tags" : [ "header", "content" ] - }, - "headerH2": { - "type": "header", - "selector": "h2", - "testability": 0, - "tags" : [ "header", "content" ] - }, - "headerH3": { - "type": "header", - "selector": "h3", - "testability": 0, - "tags" : [ "header", "content" ] - }, - "headerH4": { - "type": "header", - "selector": "h4", - "testability": 0, - "tags" : [ "header", "content" ] - }, - "headerH5": { - "type": "header", - "selector": "h5", - "testability": 0, - "tags" : [ "header", "content" ] - }, - "headerH1Format": { - "type": "selector", - "selector": "h1", - "testability": 0, - "tags" : [ "header", "content" ] - }, - "headerH2Format": { - "type": "selector", - "selector": "h2", - "testability": 0, - "tags" : [ "header", "content" ] - }, - "headerH3Format": { - "type": "selector", - "selector": "h3", - "testability": 0, - "tags" : [ "header", "content" ] - }, - "headerH4Format": { - "type": "selector", - "selector": "h4", - "testability": 0, - "tags" : [ "header", "content" ] - }, - "headerH5Format": { - "type": "selector", - "selector": "h5", - "testability": 0, - "tags" : [ "header", "content" ] - }, - "headerH6Format": { - "type": "selector", - "selector": "h6", - "testability": 0, - "tags" : [ "header", "content" ] - }, - "headersHaveText": { - "type": "placeholder", - "selector": "h1, h2, h3, h4, h5, h6", - "content": true, - "empty": true, - "testability": 1, - "tags" : [ "header", "content" ] - }, - "headersUseToMarkSections": { - "type": "custom", - "callback": "headersUseToMarkSections", - "testability": 0.5, - "tags" : [ "header", "content" ] - }, - "iIsNotUsed": { - "type": "selector", - "selector": "i", - "testability": 1, - "tags" : [ "deprecated", "content" ] - }, - "iframeMustNotHaveLongdesc": { - "type": "selector", - "selector": "iframe[longdesc]", - "testability": 1, - "tags" : [ "objects", "iframe", "content" ] - }, - "imageMapServerSide": { - "type": "selector", - "selector": "img[ismap]", - "testability": 1, - "tags" : [ "objects", "iframe", "content" ] - }, - "imgAltEmptyForDecorativeImages": { - "type": "selector", - "selector": "img[alt]", - "testability": 0, - "tags" : [ "image", "content" ] - }, - "imgAltIdentifiesLinkDestination": { - "type": "selector", - "selector": "a img[alt]:first", - "testability": 0, - "tags" : [ "image", "content" ] - }, - "imgAltIsDifferent": { - "type": "custom", - "callback": "imgAltIsDifferent", - "testability": 0.5, - "tags" : [ "image", "content" ] - }, - "imgAltIsSameInText": { - "type": "selector", - "selector": "img", - "testability": 0, - "tags" : [ "image", "content" ] - }, - "imgAltIsTooLong": { - "type": "custom", - "callback": "imgAltIsTooLong", - "testability": 1, - "tags" : [ "image", "content" ] - }, - "imgAltNotEmptyInAnchor": { - "type": "custom", - "callback": "imgAltNotEmptyInAnchor", - "testability": 1, - "tags" : [ "image", "content" ] - }, - "imgAltNotPlaceHolder": { - "type": "placeholder", - "selector": "img", - "attribute": "alt", - "testability": 1, - "tags" : [ "image", "content" ] - }, - "imgAltTextNotRedundant": { - "type": "custom", - "callback": "imgAltTextNotRedundant", - "testability": 1, - "tags" : [ "image", "content" ] - }, - "imgGifNoFlicker": { - "type": "custom", - "callback": "imgGifNoFlicker", - "testability": 1, - "tags" : [ "image", "content" ] - }, - "imgHasAlt": { - "type": "selector", - "selector": "img:not(img[alt])", - "testability": 1, - "tags" : [ "image", "content" ] - }, - "imgHasLongDesc": { - "type": "custom", - "callback": "imgHasLongDesc", - "testability": 1, - "tags" : [ "image", "content" ] - }, - "imgImportantNoSpacerAlt": { - "type": "custom", - "callback": "imgImportantNoSpacerAlt", - "testability": 0.5, - "tags" : [ "image", "content" ] - }, - "imgMapAreasHaveDuplicateLink": { - "type": "custom", - "callback": "imgMapAreasHaveDuplicateLink", - "testability": 1, - "tags" : [ "image", "imagemap" ] - }, - "imgNonDecorativeHasAlt": { - "type": "custom", - "callback": "imgNonDecorativeHasAlt", - "testability": 0.5, - "tags" : [ "image", "content" ] - }, - "imgNotReferredToByColorAlone": { - "type": "selector", - "selector": "img", - "testability": 0, - "tags" : [ "image", "color", "content" ] - }, - "imgServerSideMapNotUsed": { - "type": "selector", - "selector": "img[ismap]", - "testability": 1, - "tags" : [ "image", "imagemap", "content" ] - }, - "imgShouldNotHaveTitle": { - "type": "selector", - "selector": "img[title]", - "testability": 1, - "tags" : [ "image", "content" ] - }, - "imgWithMapHasUseMap": { - "type": "selector", - "selector": "img[ismap]:not(img[usemap])", - "testability": 1, - "tags" : [ "image", "imagemap", "content" ] - }, - "imgWithMathShouldHaveMathEquivalent": { - "type": "custom", - "callback": "imgWithMathShouldHaveMathEquivalent", - "testability": 0, - "tags" : [ "image", "content" ] - }, - "inputCheckboxHasTabIndex": { - "type": "placeholder", - "selector": "input[type=checkbox]", - "attribute": "tabindex", - "empty": true, - "testability": 1, - "tags" : [ "form", "content" ] - }, - "inputCheckboxRequiresFieldset": { - "type": "custom", - "callback": "inputCheckboxRequiresFieldset", - "testability": 1, - "tags" : [ "form", "content" ] - }, - "inputDoesNotUseColorAlone": { - "type": "selector", - "selector": "input:not(input[type=hidden])", - "testability": 0, - "tags" : [ "form", "color", "content" ] - }, - "inputElementsDontHaveAlt": { - "type": "selector", - "selector": "input[type!=image][alt]", - "testability": 1, - "tags" : [ "form", "content" ] - }, - "inputFileHasTabIndex": { - "type": "placeholder", - "selector": "input[type=file]", - "attribute": "tabindex", - "empty": true, - "testability": 1, - "tags" : [ "form", "tabindex" ] - }, - "inputImageAltIdentifiesPurpose": { - "type": "selector", - "selector": "input[type=image][alt]", - "testability": 0, - "tags" : [ "form", "content" ] - }, - "inputImageAltIsNotFileName": { - "type": "custom", - "callback": "inputImageAltIsNotFileName", - "testability": 1, - "tags" : [ "form", "image", "content" ] - }, - "inputImageAltIsNotPlaceholder": { - "type": "placeholder", - "selector": "input[type=image]", - "attribute": "alt", - "testability": 1, - "tags" : [ "form", "image", "content" ] - }, - "inputImageAltIsShort": { - "type": "custom", - "callback": "inputImageAltIsShort", - "testability": 1, - "tags" : [ "form", "image", "content" ] - }, - "inputImageAltNotRedundant": { - "type": "custom", - "callback": "inputImageAltNotRedundant", - "testability": 1, - "tags" : [ "form", "image", "content" ] - }, - "inputImageHasAlt": { - "type": "selector", - "selector": "input[type=image]:not(input[type=image][alt])", - "testability": 1, - "tags" : [ "form", "image", "content" ] - }, - "inputImageNotDecorative": { - "type": "selector", - "selector": "input[type=image]", - "testability": 0, - "tags" : [ "form", "image", "content" ] - }, - "inputPasswordHasTabIndex": { - "type": "placeholder", - "selector": "input[type=password]", - "attribute": "tabindex", - "empty": true, - "testability": 1, - "tags" : [ "form", "content" ] - }, - "inputRadioHasTabIndex": { - "type": "placeholder", - "selector": "input[type=radio]", - "attribute": "tabindex", - "empty": true, - "testability": 1, - "tags" : [ "form", "content" ] - }, - "inputSubmitHasTabIndex": { - "type": "placeholder", - "selector": "input[type=submit]", - "attribute": "tabindex", - "empty": true, - "testability": 1, - "tags" : [ "form", "content" ] - }, - "inputTextHasLabel": { - "type": "label", - "selector": "input[type=text]", - "testability": 1, - "tags" : [ "form", "content" ] - }, - "inputTextHasTabIndex": { - "type": "placeholder", - "selector": "input[type=text]", - "attribute": "tabindex", - "empty": true, - "testability": 1, - "tags" : [ "form", "content" ] - }, - "inputTextHasValue": { - "type": "placeholder", - "selector": "input[type=text]", - "empty": true, - "attribute": "value", - "testability": 1, - "tags" : [ "form", "content" ] - }, - "inputTextValueNotEmpty": { - "type": "placeholder", - "selector": "input[type=text]", - "attribute": "value", - "empty": true, - "testability": 1, - "tags" : [ "form", "content" ] - }, - "labelDoesNotContainInput": { - "type": "selector", - "selector": "label:has(input)", - "testability": 1, - "tags" : [ "form", "content" ] - }, - "labelMustBeUnique": { - "type": "custom", - "callback": "labelMustBeUnique", - "testability": 1, - "tags" : [ "form", "content" ] - }, - "labelMustNotBeEmpty": { - "type": "placeholder", - "selector": "label", - "content": true, - "empty": true, - "testability": 1, - "tags" : [ "form", "content" ] - }, - "labelsAreAssignedToAnInput": { - "type": "custom", - "callback": "labelsAreAssignedToAnInput", - "testability": 1, - "tags" : [ "form", "content" ] - }, - "legendDescribesListOfChoices": { - "type": "selector", - "selector": "legend", - "testability": 0, - "tags" : [ "form", "content" ] - }, - "legendTextNotEmpty": { - "type": "selector", - "selector": "legend:empty", - "testability": 1, - "tags" : [ "form", "content" ] - }, - "legendTextNotPlaceholder": { - "type": "placeholder", - "selector": "legend", - "content": true, - "emtpy": true, - "testability": 1, - "tags" : [ "form", "content" ] - }, - "liDontUseImageForBullet": { - "type": "selector", - "selector": "li:has(img)", - "testability": 0.5, - "tags" : [ "list", "content" ] - }, - "linkUsedForAlternateContent": { - "type": "selector", - "selector": "html:not(html:has(link[rel=alternate])) body", - "testability": 0, - "tags" : [ "document" ] - }, - "linkUsedToDescribeNavigation": { - "type": "selector", - "selector": "html:not(html:has(link[rel=index]))", - "testability": 1, - "tags" : [ "document" ] - }, - "listNotUsedForFormatting": { - "type": "custom", - "callback": "listNotUsedForFormatting", - "testability": 0, - "tags" : [ "list", "content" ] - }, - "marqueeIsNotUsed": { - "type": "selector", - "selector": "marquee", - "testability": 1, - "tags" : [ "deprecated", "content" ] - }, - "menuNotUsedToFormatText": { - "type": "selector", - "selector": "menu:not(menu li:parent(menu))", - "testability": 0, - "tags" : [ "list", "content" ] - }, - "noembedHasEquivalentContent": { - "type": "selector", - "selector": "noembed", - "testability": 0, - "tags" : [ "objects", "content" ] - }, - "noframesSectionMustHaveTextEquivalent": { - "type": "selector", - "selector": "frameset:not(frameset:has(noframes))", - "testability": 0.5, - "tags" : [ "deprecated" , "frame" ] - }, - "objectContentUsableWhenDisabled": { - "type": "selector", - "selector": "object", - "testability": 0, - "tags" : [ "objects", "content" ] - }, - "objectDoesNotFlicker": { - "type": "selector", - "selector": "object", - "testability": 0, - "tags" : [ "objects", "content" ] - }, - "objectDoesNotUseColorAlone": { - "type": "selector", - "selector": "object", - "testability": 0, - "tags" : [ "objects", "content" ] - }, - "objectInterfaceIsAccessible": { - "type": "selector", - "selector": "object", - "testability": 0, - "tags" : [ "objects", "content" ] - }, - "objectLinkToMultimediaHasTextTranscript": { - "type": "selector", - "selector": "object", - "testability": 0, - "tags" : [ "objects", "content" ] - }, - "objectMustContainText": { - "type": "placeholder", - "selector": "object", - "empty": true, - "content": true, - "testability": 1, - "tags" : [ "objects", "content" ] - }, - "objectMustHaveEmbed": { - "type": "selector", - "selector": "object:not(object:has(embed))", - "testability": 1, - "tags" : [ "objects", "content" ] - }, - "objectMustHaveTitle": { - "type": "selector", - "selector": "object:not(object[title])", - "testability": 1, - "tags" : [ "objects", "content" ] - }, - "objectMustHaveValidTitle": { - "type": "placeholder", - "selector": "object", - "attribute": "title", - "empty": true, - "testability": 1, - "tags" : [ "objects", "content" ] - }, - "objectProvidesMechanismToReturnToParent": { - "type": "selector", - "selector": "object", - "testability": 0, - "tags" : [ "objects", "content" ] - }, - "objectShouldHaveLongDescription": { - "type": "selector", - "selector": "object", - "testability": 0, - "tags" : [ "objects", "content" ] - }, - "objectTextUpdatesWhenObjectChanges": { - "type": "selector", - "selector": "object", - "testability": 0, - "tags" : [ "objects", "content" ] - }, - "objectUIMustBeAccessible": { - "type": "selector", - "selector": "object", - "testability": 0, - "tags" : [ "objects", "content" ] - }, - "objectWithClassIDHasNoText": { - "type": "selector", - "selector": "object[classid]:not(object[classid]:empty)", - "testability": 1, - "tags" : [ "objects", "content" ] - }, - "pNotUsedAsHeader": { - "type": "custom", - "callback": "pNotUsedAsHeader", - "testability": 1, - "tags" : [ "header", "content" ] - }, - "paragarphIsWrittenClearly": { - "type": "custom", - "callback": "paragarphIsWrittenClearly", - "testability": 0.5, - "tags" : [ "language", "content" ] - }, - "passwordHasLabel": { - "type": "label", - "selector": "input[type=password]", - "testability": 1, - "tags" : [ "form", "content" ] - }, - "passwordLabelIsNearby": { - "type": "labelProximity", - "selector": "input[type=password]", - "testability": 0.5, - "tags" : [ "form", "content" ] - }, - "preShouldNotBeUsedForTabularLayout": { - "type": "custom", - "callback": "preShouldNotBeUsedForTabularLayout", - "testability": 0, - "tags" : [ "table", "content" ] - }, - "radioHasLabel": { - "type": "label", - "selector": "input[type=radio]", - "testability": 1, - "tags" : [ "form", "content" ] - }, - "radioLabelIsNearby": { - "type": "labelProximity", - "selector": "input[type=radio]", - "testability": 0.5, - "tags" : [ "form", "content" ] - }, - "radioMarkedWithFieldgroupAndLegend": { - "type": "selector", - "selector": "input[type=radio]:not(fieldset input[type=radio])", - "testability": 1, - "tags" : [ "form", "content" ] - }, - "scriptContentAccessibleWithScriptsTurnedOff": { - "type": "selector", - "selector": "script", - "testability": 0, - "tags" : [ "javascript" ] - }, - "scriptInBodyMustHaveNoscript": { - "type": "selector", - "selector": "html:not(html:has(noscript)):has(script) body", - "testability": 0.5, - "tags" : [ "javascript" ] - }, - "scriptOnclickRequiresOnKeypress": { - "type": "event", - "searchEvent": "onclick", - "correspondingEvent": "onkeypress", - "testability": 1, - "tags" : [ "javascript" ] - }, - "scriptOndblclickRequiresOnKeypress": { - "type": "event", - "searchEvent": "ondblclick", - "correspondingEvent": "onkeypress", - "testability": 1, - "tags" : [ "javascript" ] - }, - "scriptOnmousedownRequiresOnKeypress": { - "type": "event", - "searchEvent": "onmousedown", - "correspondingEvent": "onkeydown", - "testability": 1, - "tags" : [ "javascript" ] - }, - "scriptOnmousemove": { - "type": "event", - "searchEvent": "onmousemove", - "correspondingEvent": "onkeypress", - "testability": 1, - "tags" : [ "javascript" ] - }, - "scriptOnmouseoutHasOnmouseblur": { - "type": "event", - "searchEvent": "onmouseout", - "correspondingEvent": "onblur", - "testability": 1, - "tags" : [ "javascript" ] - }, - "scriptOnmouseoverHasOnfocus": { - "type": "event", - "searchEvent": "onmouseover", - "correspondingEvent": "onfocus", - "testability": 1, - "tags" : [ "javascript" ] - }, - "scriptOnmouseupHasOnkeyup": { - "type": "event", - "searchEvent": "onmouseup", - "correspondingEvent": "onkeyup", - "testability": 1, - "tags" : [ "javascript" ] - }, - "scriptUIMustBeAccessible": { - "type": "selector", - "selector": "script", - "testability": 0, - "tags" : [ "javascript" ] - }, - "scriptsDoNotFlicker": { - "type": "selector", - "selector": "script", - "testability": 0, - "tags" : [ "javascript" ] - }, - "scriptsDoNotUseColorAlone": { - "type": "selector", - "selector": "script", - "testability": 0, - "tags" : [ "javascript", "color" ] - }, - "selectDoesNotChangeContext": { - "type": "event", - "selector": "select", - "searchEvent": "onchange", - "testability": 1, - "tags" : [ "form", "content" ] - }, - "selectHasAssociatedLabel": { - "type": "label", - "selector": "select", - "testability": 1, - "tags" : [ "form", "content" ] - }, - "selectWithOptionsHasOptgroup": { - "type": "selector", - "selector": "select:not(select:has(optgroup)) option:nth-child(5)", - "testability": 0.5, - "tags" : [ "form", "content" ] - }, - "selectJumpMenu": { - "type": "custom", - "callback": "selectJumpMenu", - "testability": 0.5, - "tags" : [ "form", "content" ] - }, - "siteMap": { - "type": "custom", - "callback": "siteMap", - "testability": 0, - "tags" : [ "document" ] - }, - "skipToContentLinkProvided": { - "type": "selector", - "selector": "body:not(body:has(a:first[href^=#]))", - "testability": 0.5, - "tags" : [ "document" ] - }, - "svgContainsTitle": { - "type": "selector", - "selector": "svg:not(svg:has(title))", - "testability": 1, - "tags" : [ "image", "svg", "content" ] - }, - "tabIndexFollowsLogicalOrder": { - "type": "custom", - "callback": "tabIndexFollowsLogicalOrder", - "testability": 0.5, - "tags" : [ "document" ] - }, - "tableCaptionIdentifiesTable": { - "type": "selector", - "selector": "caption", - "testability": 0, - "tags" : [ "table", "content" ] - }, - "tableComplexHasSummary": { - "type": "selector", - "selector": "table:not(table[summary], table:has(caption))", - "testability": 0.5, - "tags" : [ "table", "content" ] - }, - "tableDataShouldHaveTh": { - "type": "selector", - "selector": "table:not(table:has(th))", - "testability": 1, - "tags" : [ "table", "content" ] - }, - "tableHeaderLabelMustBeTerse": { - "type": "custom", - "callback": "tableHeaderLabelMustBeTerse", - "testability": 0.5, - "tags" : [ "table", "content" ] - }, - "tableIsGrouped": { - "type": "selector", - "selector": "table:not(table:has(thead), table:has(tfoot))", - "testability": 0.5, - "tags" : [ "table", "content" ] - }, - "tableLayoutDataShouldNotHaveTh": { - "type": "custom", - "callback": "tableLayoutDataShouldNotHaveTh", - "testability": 0, - "tags" : [ "table", "layout", "content" ] - }, - "tableLayoutHasNoCaption": { - "type": "custom", - "callback": "tableLayoutHasNoCaption", - "testability": 1, - "tags" : [ "table", "layout", "content" ] - }, - "tableLayoutHasNoSummary": { - "type": "custom", - "callback": "tableLayoutHasNoSummary", - "testability": 0.5, - "tags" : [ "table", "layout", "content" ] - }, - "tableLayoutMakesSenseLinearized": { - "type": "custom", - "callback": "tableLayoutMakesSenseLinearized", - "testability": 0, - "tags" : [ "table", "layout", "content" ] - }, - "tableSummaryDescribesTable": { - "type": "selector", - "selector": "table[summary]", - "testability": 0, - "tags" : [ "table", "content" ] - }, - "tableSummaryDoesNotDuplicateCaption": { - "type": "custom", - "callback": "tableSummaryDoesNotDuplicateCaption", - "testability": 1, - "tags" : [ "table", "content" ] - }, - "tableSummaryIsEmpty": { - "type": "placeholder", - "selector": "table[summary]", - "attribute": "summary", - "empty": true, - "testability": 0.5, - "tags" : [ "table", "content" ] - }, - "tableSummaryIsSufficient": { - "type": "selector", - "selector": "table[summary]", - "testability": 0, - "tags" : [ "table", "content" ] - }, - "tableSummaryIsNotTooLong": { - "type": "custom", - "callback": "tableSummaryIsNotTooLong", - "testability": 0, - "tags" : [ "table", "content" ] - }, - "tableNotUsedForLayout": { - "type": "custom", - "callback": "tableNotUsedForLayout", - "testability": 0.5, - "tags" : [ "table", "layout" ] - }, - "tableUseColGroup": { - "type": "custom", - "callback": "tableUseColGroup", - "testability": 0, - "tags" : [ "table", "content" ] - }, - "tableUsesScopeForRow": { - "type": "custom", - "callback": "tableUsesScopeForRow", - "testability": 0.5, - "tags" : [ "table", "content" ] - }, - "tableUsesAbbreviationForHeader": { - "type": "custom", - "callback": "tableUsesAbbreviationForHeader", - "testability": 0, - "tags" : [ "table", "content" ] - }, - "tableUsesCaption": { - "type": "selector", - "selector": "table:not(table:has(caption))", - "testability": 1, - "tags" : [ "table", "content" ] - }, - "tableWithBothHeadersUseScope": { - "type": "selector", - "selector": "table:has(tr:not(table tr:first) th:not(th[scope]))", - "testability": 0.5, - "tags" : [ "table", "content" ] - }, - "tableWithMoreHeadersUseID": { - "type": "custom", - "callback": "tableWithMoreHeadersUseID", - "testability": 0.5, - "tags" : [ "table", "content" ] - }, - "tabularDataIsInTable": { - "type": "custom", - "callback": "tabularDataIsInTable", - "testability": 0.5, - "tags" : [ "table", "content" ] - }, - "textareaHasAssociatedLabel": { - "type": "label", - "selector": "textarea", - "testability": 1, - "tags" : [ "form", "content" ] - }, - "textareaLabelPositionedClose": { - "type": "labelProximity", - "selector": "textarea", - "testability": 0.5, - "tags" : [ "form", "content" ] - }, - "textIsNotSmall": { - "type": "custom", - "callback": "textIsNotSmall", - "testability": 0.5, - "tags" : [ "textsize", "content" ] - }, - "videoProvidesCaptions": { - "type": "selector", - "selector": "video", - "testability": 0.5, - "tags" : [ "media", "content" ] - }, - "videosEmbeddedOrLinkedNeedCaptions": { - "type": "custom", - "callback": "videosEmbeddedOrLinkedNeedCaptions", - "testability": 1, - "tags" : [ "media", "content" ] - } -} \ No newline at end of file diff --git a/src/resources/tests.yml b/src/resources/tests.yml new file mode 100644 index 000000000..675922514 --- /dev/null +++ b/src/resources/tests.yml @@ -0,0 +1,3764 @@ +aAdjacentWithSameResourceShouldBeCombined: + callback: "aAdjacentWithSameResourceShouldBeCombined" + tags: + - "link" + - "content" + testability: 1 + type: "custom" + guidelines: + wcag: + 2.4.4: + techniques: + - "H2" + title: + en: "Adjacent links that point to the same location should be merged" + description: + en: "Because many users of screen-readers use links to navigate the page, providing two links right next to eachother that points to the same location can be confusing. Try combining the links." +aImgAltNotRepetative: + callback: "aImgAltNotRepetative" + tags: + - "link" + - "content" + testability: 1 + type: "custom" + guidelines: + wcag: + 1.1.1: + techniques: + - "H30" + 2.4.4: + techniques: + - "H30" + 2.4.9: + techniques: + - "H30" + title: + en: "When an image is in a link, its \"alt\" attribute should not repeat other text in the link" + description: + en: "Images within a link should not have an alt attribute that simply repeats the text found in the link. This will cause screen readers to simply repeat the text twice." +aLinkTextDoesNotBeginWithRedundantWord: + callback: "aLinkTextDoesNotBeginWithRedundantWord" + strings: "redundant.link" + tags: + - "link" + - "content" + testability: 0 + type: "custom" + guidelines: + wcag: + 2.4.9: + techniques: + - "F84" + title: + en: "Link text should not begin with redundant text" + description: + en: "Link text should not begin with redundant words or phrases like \"link\"" +aLinksAreSeperatedByPrintableCharacters: + callback: "aLinksAreSeperatedByPrintableCharacters" + tags: + - "link" + - "content" + testability: 1 + type: "custom" + guidelines: [] + title: + en: "Lists of links should be seperated by printable characters" + description: + en: "If a list of links is provided within the same element, those links should be seperated by a non-linked, printable character. Structures like lists are not included in this." +aLinksDontOpenNewWindow: + selector: "a[target=_new], a[target=_blank], a[target=_blank]" + tags: + - "link" + - "content" + testability: 1 + type: "selector" + guidelines: + wcag: + 3.2.5: + techniques: + - "H83" + title: + en: "Links should not open a new window without warning" + description: + en: "Links which open a new window using the \"target\" attribute should warn users." +aLinksNotSeparatedBySymbols: + callback: "aLinksNotSeparatedBySymbols" + tags: + - "link" + - "content" + testability: 1 + type: "custom" + guidelines: [] +aLinksToMultiMediaRequireTranscript: + selector: "a[href$='.wmv'], a[href$='.mpg'], a[href$='.mov'], a[href$='.ram'], a[href$='.aif']" + tags: + - "link" + - "media" + - "content" + testability: 0 + type: "selector" + guidelines: + 508: + - "c" + wcag: + 1.1.1: + techniques: + - "G74" + title: + en: "Any links to a multimedia file should also include a link to a transcript" + description: + en: "Links to a multimedia file should be followed by a link to a transcript of the file." +aLinksToSoundFilesNeedTranscripts: + selector: "a[href$='.wav'], a[href$='.snd'], a[href$='.mp3'], a[href$='.iff'], a[href$='.svx'], a[href$='.sam'], a[href$='.smp'], a[href$='.vce'], a[href$='.vox'], a[href$='.pcm'], a[href$='.aif']" + tags: + - "link" + - "media" + - "content" + testability: 0 + type: "selector" + guidelines: + 508: + - "c" + wcag: + 1.1.1: + techniques: + - "G74" + title: + en: "Any links to a sound file should also include a link to a transcript" + description: + en: "Links to a sound file should be followed by a link to a transcript of the file." +aMultimediaTextAlternative: + selector: "a[href$='.wmv'], a[href$='.wav'], a[href$='.mpg'], a[href$='.mov'], a[href$='.ram'], a[href$='.aif']" + tags: + - "link" + - "media" + - "content" + testability: 0 + type: "selector" + guidelines: [] +aMustContainText: + callback: "aMustContainText" + tags: + - "link" + - "content" + testability: 1 + type: "custom" + guidelines: + wcag: + 1.1.1: + techniques: + - "H30" + 2.4.4: + techniques: + - "H30" + 2.4.9: + techniques: + - "H30" + title: + en: "Links should contain text" + description: + en: "Because many users of screen-readers use links to navigate the page, providing links with no text (or with images that have empty \"alt\" attributes and no other readable text) hinders these users." +aMustHaveTitle: + selector: "a:not(a[title])" + tags: + - "link" + - "content" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "All links must have a \"title\" attribute" + description: + en: "Every link must have a \"title\" attribute." +aMustNotHaveJavascriptHref: + selector: "a[href^='javascript:']" + tags: + - "link" + - "content" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "Links should not use \"javascript\" in their location" + description: + en: "Anchor (a. elements may not use the \"javascript\" protocol in their \"href\" attributes." +aSuspiciousLinkText: + callback: "aSuspiciousLinkText" + strings: "suspiciousLinks" + tags: + - "link" + - "content" + testability: 1 + type: "custom" + guidelines: + wcag: + 1.1.1: + techniques: + - "H30" + 2.4.4: + techniques: + - "H30" + 2.4.9: + techniques: + - "H30" + title: + en: "Link text should be useful" + description: + en: "Because many users of screen-readers use links to navigate the page, providing links with text that simply read \"click here\" gives no hint of the function of the link" +aTitleDescribesDestination: + selector: "a[title]" + tags: + - "link" + - "content" + testability: 0 + type: "selector" + guidelines: + wcag: + 2.4.9: + techniques: + - "H33" + - "H25" + title: + en: "The title attribute of all source a (anchor) elements describes the link destination." + description: + en: "Every link must have a \"title\" attribute which describes the purpose or destination of the link." +addressForAuthor: + selector: "body:not(body:has(address))" + tags: + - "document" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "The document should contain an address for the author" + description: + en: "Documents should provide a valid email address within an address element." +addressForAuthorMustBeValid: + selector: "address" + tags: + - "document" + testability: 0.5 + type: "selector" + guidelines: [] + title: + en: "The document should contain a valid email address for the author" + description: + en: "Documents should provide a valid email address within an address element." +appletContainsTextEquivalent: + callback: "appletContainsTextEquivalent" + tags: + - "objects" + - "applet" + - "content" + testability: 1 + type: "custom" + guidelines: + 508: + - "m" + wcag: + 1.1.1: + techniques: + - "G74" + - "H35" + title: + en: "All applets should contain the same content within the body of the applet" + description: + en: "Applets should contain their text equivalents or description within the applet tag itself." +appletContainsTextEquivalentInAlt: + attribute: "alt" + components: + - "placeholder" + empty: true + selector: "applet" + tags: + - "objects" + - "applet" + - "content" + testability: 0.5 + type: "placeholder" + guidelines: + 508: + - "m" + wcag: + 1.1.1: + techniques: + - "G74" + - "H35" + title: + en: "All applets should contain a text equivalent in the \"alt\" attribute" + description: + en: "Applets should contain their text equivalents or description in an \"alt\" attribute." +appletProvidesMechanismToReturnToParent: + selector: "applet" + tags: + - "objects" + - "applet" + - "content" + testability: 0 + type: "selector" + guidelines: [] + title: + en: "All applets should provide a way for keyboard users to escape" + description: + en: "Ensure that a user who has only a keyboard as an input device can escape an applet element. This requires manual confirmation." +appletTextEquivalentsGetUpdated: + selector: "applet" + tags: + - "objects" + - "applet" + - "content" + testability: 0 + type: "selector" + guidelines: + 508: + - "m" + wcag: + 1.1.1: + techniques: + - "G74" + - "H35" +appletUIMustBeAccessible: + selector: "applet" + tags: + - "objects" + - "applet" + - "content" + testability: 0 + type: "selector" + guidelines: + 508: + - "m" + wcag: + 1.1.1: + techniques: + - "G74" + - "H35" + title: + en: "Any user interface in an applet must be accessible" + description: + en: "Applet content should be assessed for accessibility." +appletsDoNotFlicker: + selector: "applet" + tags: + - "objects" + - "applet" + - "content" + testability: 0 + type: "selector" + guidelines: + 508: + - "j" + wcag: + 2.2.2: + techniques: + - "F7" + title: + en: "All applets do not flicker" + description: + en: "Applets should not flicker." +appletsDoneUseColorAlone: + selector: "applet" + tags: + - "objects" + - "applet" + - "content" + testability: 0 + type: "selector" + guidelines: + 508: + - "c" + title: + en: "Applets should not use color alone to communicate content" + description: + en: "Applets should contain content that makes sense without color and is accessible to users who are color blind." +areaAltIdentifiesDestination: + selector: "area[alt]" + tags: + - "objects" + - "applet" + - "content" + testability: 0 + type: "selector" + guidelines: + wcag: + 1.1.1: + techniques: + - "G74" + title: + en: "All \"area\" elements must have an \"alt\" attribute which describes the link destination" + description: + en: "All area elements within a map must have an \"alt\" attribute" +areaAltRefersToText: + selector: "area" + tags: + - "imagemap" + - "content" + testability: 0 + type: "selector" + guidelines: [] + title: + en: "Alt text for \"area\" elements should replicate the text found in the image" + description: + en: "If an image is being used as a map, and an area encompasses text within the image, then the \"alt\" attribute of that area element should be the same as the text found in the image." +areaDontOpenNewWindow: + selector: "area[target='new window'], area[target=_new], area[target=_blank], area[target=_blank]" + tags: + - "imagemap" + - "content" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "No \"area\" elements should open a new window without warning" + description: + en: "No area elements should open a new window without warning." +areaHasAltValue: + selector: "area:not(area[alt])" + tags: + - "imagemap" + - "content" + testability: 1 + type: "selector" + guidelines: + wcag: + 1.1.1: + techniques: + - "F65" + - "G74" + - "H24" + 1.4.3: + techniques: + - "G145" + title: + en: "All \"area\" elements must have an \"alt\" attribute" + description: + en: "All area elements within a map must have an \"alt\" attribute." +areaLinksToSoundFile: + selector: "area[href$=wav], area[href$=snd], area[href$=mp3], area[href$=iff], area[href$=svx], area[href$=sam], area[href$=smp], area[href$=vce], area[href$=vox], area[href$=pcm], area[href$=aif]" + tags: + - "imagemap" + - "media" + - "content" + testability: 1 + type: "selector" + guidelines: + wcag: + 1.1.1: + techniques: + - "G74" + title: + en: "All \"area\" elements which link to a sound file should also provide a link to a transcript" + description: + en: "All area elements which link to a sound file should have a text transcript" +ariaOrphanedContent: + selector: "body *:not(*[role] *, *[role], script, meta, link)" + tags: + - "aria" + - "content" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "Pages using ARIA roles should not have orphaned content" + description: + en: "If a page makes use of ARIA roles, then there should not be any content on the page which is not within an element that exposes a role, as it could cause that content to be rendreed inaccessible to users with screen readers." +basefontIsNotUsed: + selector: "basefont" + tags: + - "document" + - "deprecated" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "Basefont should not be used" + description: + en: "The basefont tag is deprecated and should not be used. Investigate using stylesheets instead." +blinkIsNotUsed: + selector: "blink" + tags: + - "deprecated" + - "content" + testability: 1 + type: "selector" + guidelines: + wcag: + 2.2.2: + techniques: + - "F47" + title: + en: "The \"blink\" tag should not be used" + description: + en: "The blink tag should not be used. Ever." +blockquoteNotUsedForIndentation: + selector: "blockquote:not(blockquote[cite])" + tags: + - "blockquote" + - "content" + testability: 0.5 + type: "selector" + guidelines: + wcag: + 1.3.1: + techniques: + - "H49" + title: + en: "The \"blockquote\" tag should not be used just for indentation" + description: + en: ".. code-block:: html" +blockquoteUseForQuotations: + callback: "blockquoteUseForQuotations" + tags: + - "blockquote" + - "content" + testability: 0.5 + type: "custom" + guidelines: + wcag: + 1.3.1: + techniques: + - "H49" + title: + en: "If long quotes are in the document, use the \"blockquote\" element to mark them" + description: + en: ".. code-block:: html" +bodyActiveLinkColorContrast: + algorithm: "wcag" + bodyBackgroundAttribute: "bgcolor" + bodyForegroundAttribute: "alink" + components: + - "color" + selector: "a:active" + tags: + - "document" + - "color" + testability: 1 + type: "color" + guidelines: [] + title: + en: "Contrast between active link text and background should be 5:1" + description: + en: "The contrast ratio of active link text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it." +bodyColorContrast: + algorithm: "wcag" + bodyBackgroundAttribute: "bgcolor" + bodyForegroundAttribute: "text" + components: + - "color" + selector: "body" + tags: + - "document" + - "color" + testability: 1 + type: "color" + guidelines: [] + title: + en: "Contrast between text and background should be 5:1" + description: + en: "The contrast ratio of text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it." +bodyLinkColorContrast: + algorithm: "wcag" + bodyBackgroundAttribute: "bgcolor" + bodyForegroundAttribute: "link" + components: + - "color" + selector: "a" + tags: + - "document" + - "color" + testability: 1 + type: "color" + guidelines: [] + title: + en: "Contrast between link text and background should be 5:1" + description: + en: "The contrast ratio of link text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it." +bodyMustNotHaveBackground: + selector: "body[background]" + tags: + - "document" + - "color" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "Body elements do not use a background image" + description: + en: "The body element for the page may not have a \"background\" attribute." +bodyVisitedLinkColorContrast: + algorithm: "wcag" + bodyBackgroundAttribute: "bgcolor" + bodyForegroundAttribute: "vlink" + components: + - "color" + selector: "a:visited" + tags: + - "link" + - "color" + testability: 1 + type: "color" + guidelines: [] + title: + en: "Contrast between visited link text and background should be 5:1" + description: + en: "The contrast ratio of visited link text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it." +boldIsNotUsed: + selector: "bold" + tags: + - "semantics" + - "content" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "The \"b\" (bold) element is not used" + description: + en: "The b (bold) element provides no emphasis for non-sighted readers. Use the strong tag instead." +checkboxHasLabel: + components: + - "label" + selector: "input[type=checkbox]" + tags: + - "form" + - "content" + testability: 1 + type: "label" + guidelines: + 508: + - "c" + wcag: + 1.1.1: + techniques: + - "H44" + 1.3.1: + techniques: + - "H44" + - "F68" + 3.3.2: + techniques: + - "H44" + 4.1.2: + techniques: + - "H44" + title: + en: "All checkboxes must have a corresponding label" + description: + en: "All input elements with a type of \"checkbox\" should have a corresponding label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user" +checkboxLabelIsNearby: + components: + - "labelProximity" + selector: "input[type=checkbox]" + tags: + - "form" + - "content" + testability: 0.5 + type: "labelProximity" + guidelines: [] + title: + en: "All \"checkbox\" input elements have a label that is close" + description: + en: "All input elements of type \"checkbox\" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away." +cssDocumentMakesSenseStyleTurnedOff: + selector: "link[rel=stylesheet], stylesheet, *[style]" + tags: + - "color" + testability: 0 + type: "selector" + guidelines: + wcag: + 1.3.1: + techniques: + - "G140" + 1.4.5: + techniques: + - "G140" + 1.4.9: + techniques: + - "G140" + title: + en: "The document must be readable with styles turned off" + description: + en: "With all the styles for a page turned off, the content of the page should still make sense. Try to turn styles off in the browser and see if the page content is readable and clear." +cssTextHasContrast: + algorithm: "wcag" + bodyBackgroundAttribute: "color" + bodyForegroundAttribute: "background" + components: + - "color" + selector: "*" + tags: + - "color" + testability: 1 + type: "color" + guidelines: + wcag: + 1.4.3: + techniques: + - "G18" + title: + en: "All elements should have appropriate color contrast" + description: + en: "For users who have color blindness, all text or other elements should have a color contrast of 5:1." +doctypeProvided: + callback: "doctypeProvided" + tags: + - "doctype" + testability: 1 + type: "custom" + guidelines: [] + title: + en: "The document should contain a valid \"doctype\" declaration" + description: + en: "Each document must contain a valid doctype declaration.." +documentAbbrIsUsed: + callback: "documentAbbrIsUsed" + components: + - "acronym" + tags: + - "acronym" + - "content" + testability: 0.5 + type: "custom" + guidelines: + wcag: + 3.1.4: + techniques: + - "H28" + title: + en: "Abbreviations must be marked with an \"abbr\" element" + description: + en: "Abbreviations should be marked with an abbr element, at least once on the page for each abbreviation." +documentAcronymsHaveElement: + callback: "documentAcronymsHaveElement" + components: + - "acronym" + tags: + - "acronym" + - "content" + testability: 0.5 + type: "custom" + guidelines: + wcag: + 3.1.4: + techniques: + - "H28" + title: + en: "Acronyms must be marked with an \"acronym\" element" + description: + en: "Abbreviations should be marked with an acronym element, at least once on the page for each abbreviation." +documentAllColorsAreSet: + selector: "body:not(body[text][bgcolor][link][alink][vlink], body:not(body[text], body[bgcolor], body[link], body[alink], body[vlink]))" + tags: + - "deprecated" + - "color" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "All the document colors must be set" + description: + en: "If any colors for text or the background are set in the body element, then all colors must be set." +documentAutoRedirectNotUsed: + selector: "meta[http-equiv=refresh]" + tags: + - "document" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "Auto-redirect with \"meta\" elements must not be used" + description: + en: "Because different users have different speeds and abilities when it comes to parsing the content of a page, a \"meta-refresh\" method to redirect users can prevent users from fully understanding the document before being redirected. If a pure redirect is needed" +documentColorWaiActiveLinkAlgorithm: + algorithm: "wai" + bodyBackgroundAttribute: "bgcolor" + bodyForegroundAttribute: "alink" + components: + - "color" + selector: "a:active" + tags: + - "document" + - "color" + testability: 1 + type: "color" + guidelines: [] +documentColorWaiAlgorithm: + algorithm: "wai" + bodyBackgroundAttribute: "bgcolor" + bodyForegroundAttribute: "text" + components: + - "color" + selector: "body" + tags: + - "document" + - "color" + testability: 1 + type: "color" + guidelines: [] +documentColorWaiLinkAlgorithm: + algorithm: "wai" + bodyBackgroundAttribute: "bgcolor" + bodyForegroundAttribute: "link" + components: + - "color" + selector: "a" + tags: + - "document" + - "color" + testability: 1 + type: "color" + guidelines: [] +documentColorWaiVisitedLinkAlgorithm: + algorithm: "wai" + bodyBackgroundAttribute: "bgcolor" + bodyForegroundAttribute: "vlink" + components: + - "color" + selector: "a:visited" + tags: + - "document" + - "color" + testability: 1 + type: "color" + guidelines: [] +documentContentReadableWithoutStylesheets: + selector: "html:has(link[rel=stylesheet], style) body, body:has(*[style])" + tags: + - "document" + - "color" + testability: 0 + type: "selector" + guidelines: + 508: + - "d" + wcag: + 1.3.1: + techniques: + - "G140" + 1.4.5: + techniques: + - "G140" + 1.4.9: + techniques: + - "G140" + title: + en: "Content should be readable without style sheets" + description: + en: "With all the styles for a page turned off, the content of the page should still make sense. Try to turn styles off in the browser and see if the page content is readable and clear." +documentHasTitleElement: + selector: "html:not(html:has(title))" + tags: + - "document" + - "head" + testability: 1 + type: "selector" + guidelines: + wcag: + 2.4.2: + techniques: + - "H25" + title: + en: "The document should have a title element" + description: + en: "The document should have a title element." +documentIDsMustBeUnique: + callback: "documentIDsMustBeUnique" + tags: + - "document" + - "semantics" + testability: 1 + type: "custom" + guidelines: + wcag: + 4.1.1: + techniques: + - "F77" + title: + en: "All element \"id\" attributes must be unique" + description: + en: "Element \"id\" attributes must be unique." +documentIsWrittenClearly: + callback: "documentIsWrittenClearly" + components: + - "textStatistics" + tags: + - "language" + - "content" + testability: 0.5 + type: "custom" + guidelines: + wcag: + 3.1.5: + techniques: + - "G86" + title: + en: "The document should be written to the target audience and read clearly" + description: + en: "If a document is beyond a 10th grade level, then a summary or other guide should also be provided to guide the user through the content." +documentLangIsISO639Standard: + callback: "documentLangIsISO639Standard" + strings: "languageCodes" + tags: + - "document" + - "language" + testability: 1 + type: "custom" + guidelines: + wcag: + 3.1.1: + techniques: + - "H57" + title: + en: "The document's language attribute should be a standard code" + description: + en: "The document should have a default langauge, and that language should use the valid 2 or 3 letter language code according to ISO specification 639." +documentLangNotIdentified: + selector: "html:not(html[lang])" + tags: + - "document" + - "language" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "The document must have a \"lang\" attribute" + description: + en: "The document should have a default langauge, by setting the \"lang\" attribute in the html element." +documentMetaNotUsedWithTimeout: + selector: "meta[http-equiv=refresh]" + tags: + - "document" + testability: 1 + type: "selector" + guidelines: + wcag: + 2.2.1: + techniques: + - "F40" + - "F41" + 2.2.4: + techniques: + - "F40" + - "F41" + 3.2.5: + techniques: + - "F41" + title: + en: "Meta elements must not be used to refresh the content of a page" + description: + en: "Because different users have different speeds and abilities when it comes to parsing the content of a page, a \"meta-refresh\" method to reload the content of the page can prevent users from having full access to the content. Try to use a \"refresh this\" link instead.." +documentReadingDirection: + selector: "*[lang=he]:not(*[dir=rtl]), *[lang=ar]:not(*[dir=rtl])" + tags: + - "document" + - "language" + testability: 0.5 + type: "selector" + guidelines: + wcag: + 1.3.2: + techniques: + - "H34" + title: + en: "Reading direction of text is correctly marked" + description: + en: "Where required, the reading direction of the document (for language that read in different directions), or portions of the text, must be declared." +documentStrictDocType: + callback: "documentStrictDocType" + tags: + - "document" + - "doctype" + testability: 1 + type: "custom" + guidelines: [] + title: + en: "The page uses a strict doctype" + description: + en: "The doctype of the page or document should be either an HTML or XHTML strict doctype." +documentTitleDescribesDocument: + selector: "head title:first" + tags: + - "document" + - "head" + testability: 0 + type: "selector" + guidelines: + wcag: + 2.4.2: + techniques: + - "F25" + - "G88" + title: + en: "The title describes the document" + description: + en: "The document title should actually describe the page. Often, screen readers use the title to navigate from one window to another." +documentTitleIsNotPlaceholder: + components: + - "placeholder" + content: true + selector: "head title:first" + tags: + - "document" + - "head" + testability: 1 + type: "placeholder" + guidelines: + wcag: + 2.4.2: + techniques: + - "F25" + - "G88" + title: + en: "The document title should not be placeholder text" + description: + en: "The document title should not be wasted placeholder text which does not describe the page." +documentTitleIsShort: + callback: "documentTitleIsShort" + tags: + - "document" + - "head" + testability: 0.5 + type: "custom" + guidelines: [] + title: + en: "The document title should be short" + description: + en: "The document title should be short and succinct. This test fails at 150 characters, but authors should consider this to be a suggestion." +documentTitleNotEmpty: + components: + - "placeholder" + content: true + empty: true + selector: "head title" + tags: + - "document" + - "head" + testability: 1 + type: "placeholder" + guidelines: + wcag: + 2.4.2: + techniques: + - "F25" + - "H25" + title: + en: "The document should not have an empty title" + description: + en: "The document should have a title element that is not white space" +documentValidatesToDocType: + callback: "documentValidatesToDocType" + tags: + - "document" + - "doctype" + testability: 1 + type: "custom" + guidelines: + wcag: + 4.1.1: + techniques: + - "G134" + title: + en: "Document must validate to the doctype" + description: + en: "The document must validate to the declared doctype." +documentVisualListsAreMarkedUp: + callback: "documentVisualListsAreMarkedUp" + tags: + - "list" + - "semantics" + - "content" + testability: 1 + type: "custom" + guidelines: + wcag: + 1.3.1: + techniques: + - "H28" + - "T2" + title: + en: "Visual lists of items are marked using ordered or unordered lists" + description: + en: "Use the ordered (ol. or unordered (ul. elements for lists of items, instead of just using new lines which start with numbers or characters to create a visual list." +documentWordsNotInLanguageAreMarked: + selector: "body" + tags: + - "language" + testability: 0 + type: "selector" + guidelines: + wcag: + 3.1.2: + techniques: + - "H58" + title: + en: "Any words or phrases which are not the document's primary language should be marked" + description: + en: "If a document has words or phrases which are not in the document's primary language, those words or phrases should be properly marked. This helps indicate which language or voice a screen-reader should use to read the text." +embedHasAssociatedNoEmbed: + callback: "embedHasAssociatedNoEmbed" + tags: + - "object" + - "embed" + - "content" + testability: 1 + type: "custom" + guidelines: + wcag: + 1.1.1: + techniques: + - "H46" + title: + en: "All \"embed\" elements have an associated \"noembed\" element" + description: + en: "Because some users cannot use the embed element, provide alternative content in a noembed element." +embedMustHaveAltAttribute: + selector: "embed:not(embed[alt])" + tags: + - "object" + - "embed" + - "content" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "Embed\" elements must have an \"alt\" attribute" + description: + en: "All embed elements must have an \"alt\" attribute." +embedMustNotHaveEmptyAlt: + selector: "embed[alt=]" + tags: + - "object" + - "embed" + - "content" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "Embed\" elements cannot have an empty \"alt\" attribute" + description: + en: "All embed elements must have an \"alt\" attribute that is not empty." +embedProvidesMechanismToReturnToParent: + selector: "embed" + tags: + - "object" + - "embed" + - "content" + testability: 0 + type: "selector" + guidelines: + wcag: + 2.1.2: + techniques: + - "G21" + title: + en: "All embed elements should provide a way for keyboard users to escape" + description: + en: "Ensure that a user who has only a keyboard as an input device can escape an embed element. This requires manual confirmation." +emoticonsExcessiveUse: + callback: "emoticonsExcessiveUse" + strings: "emoticons" + tags: + - "language" + - "emoticons" + - "content" + testability: 0.5 + type: "custom" + guidelines: + wcag: + 1.1.1: + techniques: + - "H86" + title: + en: "Emoticons should not be used excessively" + description: + en: "Emoticons should not be used excessively to communicate feelings or content. Try to rewrite the document to have more textual meaning, or wrapping the emoticons in an abbr element as outlined below. Emoticons are not read by screen-readers, and are often used to communicate feelings or other things which are relevant to the content of the document." +emoticonsMissingAbbr: + callback: "emoticonsMissingAbbr" + strings: "emoticons" + tags: + - "language" + - "emoticons" + - "content" + testability: 1 + type: "custom" + guidelines: + wcag: + 1.1.1: + techniques: + - "H86" + title: + en: "Emoticons should have abbreviations" + description: + en: "Emoticons are not read by screen-readers, and are often used to communicate feelings or other things which are relevant to the content of the document. If this emoticon is important content, mark it up with an \"abbr\" or \"acronym\" tag." +fileHasLabel: + components: + - "label" + selector: "input[type=file]" + tags: + - "form" + - "content" + testability: 1 + type: "label" + guidelines: + 508: + - "n" + wcag: + 1.1.1: + techniques: + - "H44" + 1.3.1: + techniques: + - "H44" + - "F68" + 3.3.2: + techniques: + - "H44" + 4.1.2: + techniques: + - "H44" + title: + en: "All \"file\" input elements have a corresponding label" + description: + en: "All input elements of type \"file\" should have a corresponding label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user" +fileLabelIsNearby: + components: + - "labelProximity" + selector: "input[type=file]" + tags: + - "form" + - "content" + testability: 0.5 + type: "labelProximity" + guidelines: [] + title: + en: "All \"file\" input elements have a label that is close" + description: + en: "All input elements of type \"file\" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away." +fontIsNotUsed: + selector: "font" + tags: + - "deprecated" + - "content" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "Font elements should not be used" + description: + en: "The basefont tag is deprecated and should not be used. Investigate using stylesheets instead." +formAllowsCheckIfIrreversable: + selector: "form" + tags: + - "form" + - "content" + testability: 0 + type: "selector" + guidelines: [] +formDeleteIsReversable: + selector: "form" + tags: + - "form" + - "content" + testability: 0 + type: "selector" + guidelines: [] + title: + en: "Deleting items using a form should be reversable" + description: + en: "Check that, if a form has the option to delete an item, that the user has a chance to either reverse the delete process, or is asked for confirmation before the item is deleted. This is not something that can be checked through automated testing and requires manual confirmation." +formErrorMessageHelpsUser: + selector: "form" + tags: + - "form" + - "content" + testability: 0 + type: "selector" + guidelines: [] + title: + en: "Forms offer the user a way to check the results of their form before performing an irrevokable action" + description: + en: "If the form allows users to perform some irrevokable action, like ordreing a product, ensure that users have the ability to review the contents of the form they submitted first. This is not something that can be checked through automated testing and requires manual confirmation." +formHasGoodErrorMessage: + selector: "form" + tags: + - "form" + - "content" + testability: 0 + type: "selector" + guidelines: [] + title: + en: "Form error messages should assist in solving errors" + description: + en: "If the form has some required fields or other ways in which the user can commit an error, check that the reply is accessible. Use the words \"required\" or \"error\" within the label element of input items where the errors happened" +formWithRequiredLabel: + callback: "formWithRequiredLabel" + tags: + - "form" + - "content" + testability: 0 + type: "custom" + guidelines: + wcag: + 1.3.1: + techniques: + - "ARIA2" + 1.4.1: + techniques: + - "F81" + 3.3.2: + techniques: + - "ARIA2" + - "H90" + 3.3.3: + techniques: + - "ARIA2" + title: + en: "Input items which are required are marked as so in the label element" + description: + en: "If a form element is required, it should marked as so. This should not be a mere red asterisk, but instead either a 'required' image with alt text of \"required\" or the actual text \"required.\" The indicator that an item is required should be included in the input element's label element." +frameIsNotUsed: + selector: "frame" + tags: + - "deprecated" + - "frame" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "Frames are not used" + description: + en: ".. code-block:: html" +frameRelationshipsMustBeDescribed: + selector: "frameset:not(frameset[longdesc])" + tags: + - "deprecated" + - "frame" + testability: 0.5 + type: "selector" + guidelines: [] + title: + en: "Complex framesets should contain a \"longdesc\" attribute" + description: + en: "If a frameset contains three or more frames, use a \"longdesc\" attribute to help describe the purpose of the frames." +frameSrcIsAccessible: + selector: "frame" + tags: + - "deprecated" + - "frame" + testability: 0 + type: "selector" + guidelines: [] + title: + en: "The source for each frame is accessible content." + description: + en: "Each frame should contain accessible content, and contain content accessible to screen readers, like HTML as opposed to an image." +frameTitlesDescribeFunction: + attribute: "title" + components: + - "placeholder" + empty: true + selector: "frame[title]" + tags: + - "deprecated" + - "frame" + testability: 0 + type: "placeholder" + guidelines: + wcag: + 2.4.1: + techniques: + - "H64" + title: + en: "All \"frame\" elemetns should have a \"title\" attribute that describes the purpose of the frame" + description: + en: "Each frame elements should have a \"title\" attribute which describes the purpose or function of the frame." +frameTitlesNotEmpty: + selector: "frame:not(frame[title]), frame[title=], iframe:not(iframe[title]), iframe[title=]" + tags: + - "deprecated" + - "frame" + testability: 1 + type: "selector" + guidelines: + wcag: + 2.4.1: + techniques: + - "H64" + 4.1.2: + techniques: + - "H64" + title: + en: "Frames cannot have empty \"title\" attributes" + description: + en: "All frame elements must have a valid \"title\" attribute." +frameTitlesNotPlaceholder: + attribute: "title" + components: + - "placeholder" + selector: "frame, iframe" + tags: + - "deprecated" + - "frame" + testability: 1 + type: "placeholder" + guidelines: + wcag: + 2.4.1: + techniques: + - "H64" + 4.1.2: + techniques: + - "H64" + title: + en: "Frames cannot have \"title\" attributes that are just placeholder text" + description: + en: "Frame \"title\" attributes should not be simple placeholder text like \"frame" +framesHaveATitle: + selector: "frame:not(frame[title]), iframe:not(iframe[title])" + tags: + - "deprecated" + - "frame" + testability: 1 + type: "selector" + guidelines: + wcag: + 2.4.1: + techniques: + - "H64" + 4.1.2: + techniques: + - "H64" + title: + en: "All \"frame\" elements should have a \"title\" attribute" + description: + en: "Each frame elements should have a \"title\" attribute." +framesetIsNotUsed: + selector: "frameset" + tags: + - "deprecated" + - "frame" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "The \"frameset\" element should not be used" + description: + en: ".. code-block:: html" +framesetMustHaveNoFramesSection: + selector: "frameset:not(frameset:has(noframes))" + tags: + - "deprecated" + - "frame" + testability: 0.5 + type: "selector" + guidelines: [] + title: + en: "All framesets should contain a noframes section" + description: + en: "If a frameset contains three or more frames, use a \"longdesc\" attribute to help describe the purpose of the frames." +headerH1: + components: + - "header" + selector: "h1" + tags: + - "header" + - "content" + testability: 0 + type: "header" + guidelines: + wcag: + 2.4.6: + techniques: + - "G130" + title: + en: "The header following an h1 is h1 or h2" + description: + en: "The header following an h1 element should either be an h2 or another h1. " +headerH1Format: + components: + - "header" + selector: "h1" + tags: + - "header" + - "content" + testability: 0 + type: "selector" + guidelines: + wcag: + 1.3.1: + techniques: + - "T3" + title: + en: "All h1 elements are not used for formatting" + description: + en: "An h1 element may not be used purely for formatting." +headerH2: + components: + - "header" + selector: "h2" + tags: + - "header" + - "content" + testability: 0 + type: "header" + guidelines: + wcag: + 2.4.6: + techniques: + - "G130" + title: + en: "The header following an h2 is h1, h2 or h3" + description: + en: "The header following an h2 element should either be an h3, h1 or another h2. " +headerH2Format: + components: + - "header" + selector: "h2" + tags: + - "header" + - "content" + testability: 0 + type: "selector" + guidelines: + wcag: + 1.3.1: + techniques: + - "T3" + title: + en: "All h2 elements are not used for formatting" + description: + en: "An h2 element may not be used purely for formatting." +headerH3: + components: + - "header" + selector: "h3" + tags: + - "header" + - "content" + testability: 0 + type: "header" + guidelines: + wcag: + 2.4.6: + techniques: + - "G130" + title: + en: "The header following an h3 is h1, h2, h3 or h4" + description: + en: "The header following an h3 element should either be an h4, h2, h1 or another h3. " +headerH3Format: + components: + - "header" + selector: "h3" + tags: + - "header" + - "content" + testability: 0 + type: "selector" + guidelines: + wcag: + 1.3.1: + techniques: + - "T3" + title: + en: "All h3 elements are not used for formatting" + description: + en: "An h3 element may not be used purely for formatting." +headerH4: + components: + - "header" + selector: "h4" + tags: + - "header" + - "content" + testability: 0 + type: "header" + guidelines: + wcag: + 2.4.6: + techniques: + - "G130" + title: + en: "The header following an h4 is h1, h2, h3, h4 or h5" + description: + en: "The header following an h4 element should either be an h5, h3, h2, h1, or another h4. " +headerH4Format: + components: + - "header" + selector: "h4" + tags: + - "header" + - "content" + testability: 0 + type: "selector" + guidelines: + wcag: + 1.3.1: + techniques: + - "T3" + title: + en: "All h4 elements are not used for formatting" + description: + en: "An h4 element may not be used purely for formatting." +headerH5: + components: + - "header" + selector: "h5" + tags: + - "header" + - "content" + testability: 0 + type: "header" + guidelines: + wcag: + 2.4.6: + techniques: + - "G130" + title: + en: "The header following an h5 is h6 or any header less than h6" + description: + en: "The header following an h5 element should either be an h6, h3, h2, h1, or another h5. " +headerH5Format: + selector: "h5" + tags: + - "header" + - "content" + testability: 0 + type: "selector" + guidelines: + wcag: + 1.3.1: + techniques: + - "T3" + title: + en: "All h5 elements are not used for formatting" + description: + en: "An h5 element may not be used purely for formatting." +headerH6Format: + selector: "h6" + tags: + - "header" + - "content" + testability: 0 + type: "selector" + guidelines: + wcag: + 1.3.1: + techniques: + - "T3" + title: + en: "All h6 elements are not used for formatting" + description: + en: "An h6 element may not be used purely for formatting." +headersHaveText: + components: + - "placeholder" + content: true + empty: true + selector: "h1, h2, h3, h4, h5, h6" + tags: + - "header" + - "content" + testability: 1 + type: "placeholder" + guidelines: + wcag: + 1.3.1: + techniques: + - "G141" + 2.4.10: + techniques: + - "G141" + title: + en: "All headers should contain readable text" + description: + en: "Users with screen readers use headings like the tabs h1 to navigate the structure of a page. All headings should contain either text, or images with appropriate alt attributes." +headersUseToMarkSections: + callback: "headersUseToMarkSections" + tags: + - "header" + - "content" + testability: 0.5 + type: "custom" + guidelines: + wcag: + 1.3.1: + techniques: + - "G141" + 2.4.10: + techniques: + - "G141" + title: + en: "Use headers to mark the beginning of each section" + description: + en: "Check that each logical section of the page is broken or introduced with a header (. h1-h6>) element." +iIsNotUsed: + selector: "i" + tags: + - "deprecated" + - "content" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "The \"i\" (italic) element is not used" + description: + en: "The i (italic) element provides no emphasis for non-sighted readers. Use the em tag instead." +iframeMustNotHaveLongdesc: + selector: "iframe[longdesc]" + tags: + - "objects" + - "iframe" + - "content" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "Inline frames (\"iframes\") should not have a \"longdesc\" attribute" + description: + en: ".. code-block:: html" +imageMapServerSide: + selector: "img[ismap]" + tags: + - "objects" + - "iframe" + - "content" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "All links in a server-side map should have duplicate links available in the document" + description: + en: "Any image with an \"usemap\" attribute for a server-side image map should have the available links duplicated elsewhere." +imgAltEmptyForDecorativeImages: + selector: "img[alt]" + tags: + - "image" + - "content" + testability: 0 + type: "selector" + guidelines: + wcag: + 1.3.3: + techniques: + - "F26" + title: + en: "If an image is purely decorative, the \"alt\" text must be empty" + description: + en: "Any image that is only decorative (serves no function or adds to the purpose of the page content) should have an \"alt\" attribute" +imgAltIdentifiesLinkDestination: + selector: "a img[alt]:first" + tags: + - "image" + - "content" + testability: 0 + type: "selector" + guidelines: [] + title: + en: "Any image within a link must have \"alt\" text the describes the link destination" + description: + en: "Any image that is within a link should have an \"alt\" attribute which identifies the destination or purpose of the link." +imgAltIsDifferent: + callback: "imgAltIsDifferent" + tags: + - "image" + - "content" + testability: 0.5 + type: "custom" + guidelines: + 508: + - "a" + wcag: + 1.1.1: + techniques: + - "H37" + title: + en: "Image \"alt\" attributes should not be the same as the filename" + description: + en: "All img elements should have an \"alt\" attribute that is not just the name of the file" +imgAltIsSameInText: + selector: "img" + tags: + - "image" + - "content" + testability: 0 + type: "selector" + guidelines: + 508: + - "a" + wcag: + 1.1.1: + techniques: + - "G74" + - "H37" + title: + en: "Check that any text within an image is also in the \"alt\" attribute" + description: + en: "If an image has text within it, that text should be repeated in the \"alt\" attribute" +imgAltIsTooLong: + callback: "imgAltIsTooLong" + tags: + - "image" + - "content" + testability: 1 + type: "custom" + guidelines: + 508: + - "a" + wcag: + 1.1.1: + techniques: + - "H37" + title: + en: "Image Alt text is short" + description: + en: "All \"alt\" attributes for img elements should be clear and concise. \"Alt\" attributes over 100 characters long should be reviewed to see if they are too long." +imgAltNotEmptyInAnchor: + callback: "imgAltNotEmptyInAnchor" + tags: + - "image" + - "content" + testability: 1 + type: "custom" + guidelines: + 508: + - "a" + wcag: + 2.4.4: + techniques: + - "H30" + title: + en: "An image within a link cannot have an empty \"alt\" attribute if there is no other text within the link" + description: + en: "Any image that is within a link (an a element) that has no other text cannot have an empty or missing \"alt\" attribute." +imgAltNotPlaceHolder: + attribute: "alt" + components: + - "placeholder" + selector: "img" + tags: + - "image" + - "content" + testability: 1 + type: "placeholder" + guidelines: + 508: + - "a" + wcag: + 1.1.1: + techniques: + - "F30" + - "F39" + 1.2.1: + techniques: + - "F30" + title: + en: "Images should not have a simple placeholder text as an \"alt\" attribute" + description: + en: "Any image that is not used decorativey or which is purely for layout purposes cannot have an \"alt\" attribute that consists solely of placeholders." +imgAltTextNotRedundant: + callback: "imgAltTextNotRedundant" + tags: + - "image" + - "content" + testability: 1 + type: "custom" + guidelines: [] + title: + en: "Unless the image files are the same, no image should contain redundant alt text" + description: + en: "Every distinct image on a page should have it's own alt text which is different than all the others on the page to avoid redundancy and confusion." +imgGifNoFlicker: + callback: "imgGifNoFlicker" + tags: + - "image" + - "content" + testability: 1 + type: "custom" + guidelines: + 508: + - "j" + wcag: + 2.2.2: + techniques: + - "G152" + title: + en: "Any animated GIF should not flicker" + description: + en: "Animated GIF files should not flicker with a frequency over 2 Hz and lower than 55 Hz. You can check the flicker rate of this GIF using an online tool." +imgHasAlt: + selector: "img:not(img[alt])" + tags: + - "image" + - "content" + testability: 1 + type: "selector" + guidelines: + 508: + - "a" + wcag: + 1.1.1: + techniques: + - "F65" + - "H37" + title: + en: "Image elements must have an \"alt\" attribute" + description: + en: "All img elements must have an alt attribute" +imgHasLongDesc: + callback: "imgHasLongDesc" + tags: + - "image" + - "content" + testability: 1 + type: "custom" + guidelines: + wcag: + 2.4.4: + techniques: + - "G91" + 2.4.9: + techniques: + - "G91" + title: + en: "A \"longdesc\" attribute is required for any image where additional information not in the \"alt\" attribute is required" + description: + en: "Any image that has an \"alt\" attribute that does not fully convey the meaning of the image must have a \"longdesc\" attribute." +imgImportantNoSpacerAlt: + callback: "imgImportantNoSpacerAlt" + tags: + - "image" + - "content" + testability: 0.5 + type: "custom" + guidelines: [] + title: + en: "Images that are important should not have a purely white-space \"alt\" attribute" + description: + en: "Any image that is not used decorativey or which is purely for layout purposes cannot have an \"alt\" attribute that consists solely of white space (i.e. a space" +imgMapAreasHaveDuplicateLink: + callback: "imgMapAreasHaveDuplicateLink" + tags: + - "image" + - "imagemap" + testability: 1 + type: "custom" + guidelines: + 508: + - "ef" + - "ef" + title: + en: "All links within a client-side image are duplicated elsewhere in the document" + description: + en: "Any image that has a \"usemap\" attribute must have links replicated somewhere else in the document." +imgNonDecorativeHasAlt: + callback: "imgNonDecorativeHasAlt" + tags: + - "image" + - "content" + testability: 0.5 + type: "custom" + guidelines: + 508: + - "a" + wcag: + 1.1.1: + techniques: + - "F38" + title: + en: "Any non-decorative images should have a non-empty \"alt\" attribute" + description: + en: "Any image that is not used decorativey or which is purely for layout purposes cannot have an empty \"alt\" attribute." +imgNotReferredToByColorAlone: + selector: "img" + tags: + - "image" + - "color" + - "content" + testability: 0 + type: "selector" + guidelines: + 508: + - "c" + wcag: + 1.1.1: + techniques: + - "F13" + 1.4.1: + techniques: + - "F13" + title: + en: "For any image, the \"alt\" text cannot refer to color alone" + description: + en: "The \"alt\" text or content text for any image should not refer to the image by color alone. This is often fixed by changing the \"alt\" text to the meaning of the image" +imgServerSideMapNotUsed: + selector: "img[ismap]" + tags: + - "image" + - "imagemap" + - "content" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "Server-side image maps should not be used" + description: + en: "Server-side image maps should not be used." +imgShouldNotHaveTitle: + selector: "img[title]" + tags: + - "image" + - "content" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "Images should not have a \"title\" attribute" + description: + en: "Images should not contain a \"title\" attribute." +imgWithMapHasUseMap: + selector: "img[ismap]:not(img[usemap])" + tags: + - "image" + - "imagemap" + - "content" + testability: 1 + type: "selector" + guidelines: + 508: + - "ef" + - "ef" + title: + en: "Any image with an \"ismap\" attribute have a valid \"usemap\" attribute" + description: + en: "If an image has an \"ismap\" attribute" +imgWithMathShouldHaveMathEquivalent: + callback: "imgWithMathShouldHaveMathEquivalent" + tags: + - "image" + - "content" + testability: 0 + type: "custom" + guidelines: [] + title: + en: "Images which contain math equations should provide equivalent MathML" + description: + en: "Images which contain math equations should be accompanied or link to a document with the equivalent equation marked up with MathML." +inputCheckboxHasTabIndex: + attribute: "tabindex" + components: + - "placeholder" + empty: true + selector: "input[type=checkbox]" + tags: + - "form" + - "content" + testability: 1 + type: "placeholder" + guidelines: [] + title: + en: "All \"checkbox\" input elements require a valid \"tabindex\" attribute" + description: + en: "All input elements of type \"checkbox\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone." +inputCheckboxRequiresFieldset: + callback: "inputCheckboxRequiresFieldset" + tags: + - "form" + - "content" + testability: 1 + type: "custom" + guidelines: + wcag: + 3.3.2: + techniques: + - "H71" + title: + en: "Logical groups of check boxes should be grouped with a \"fieldset" + description: + en: "Related \"checkbox\" input fields should be grouped together using a fieldset." +inputDoesNotUseColorAlone: + selector: "input:not(input[type=hidden])" + tags: + - "form" + - "color" + - "content" + testability: 0 + type: "selector" + guidelines: + 508: + - "c" + title: + en: "An \"input\" element should not use color alone" + description: + en: "All input elements should not refer to content by color alone." +inputElementsDontHaveAlt: + selector: "input[type!=image][alt]" + tags: + - "form" + - "content" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "Input elements which are not images should not have an \"alt\" attribute" + description: + en: "Because of inconsistencies in how user agents use the \"alt\" attribute" +inputFileHasTabIndex: + attribute: "tabindex" + components: + - "placeholder" + empty: true + selector: "input[type=file]" + tags: + - "form" + - "tabindex" + testability: 1 + type: "placeholder" + guidelines: [] + title: + en: "All \"file\" input elements require a valid \"tabindex\" attribute" + description: + en: "All input elements of type \"file\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone." +inputImageAltIdentifiesPurpose: + selector: "input[type=image][alt]" + tags: + - "form" + - "content" + testability: 0 + type: "selector" + guidelines: + wcag: + 1.1.1: + techniques: + - "H36" + title: + en: "All \"input\" elements with a type of \"image\" must have an \"alt\" attribute that describes the function of the input" + description: + en: "All input elements with a type of \"image\" should have an \"alt\" attribute" +inputImageAltIsNotFileName: + callback: "inputImageAltIsNotFileName" + tags: + - "form" + - "image" + - "content" + testability: 1 + type: "custom" + guidelines: + 508: + - "a" + wcag: + 1.1.1: + techniques: + - "H36" + title: + en: "All \"input\" elements with a type of \"image\" must have an \"alt\" attribute which is not the same as the filename" + description: + en: "All input elements with a type of \"image\" should have an \"alt\" attribute" +inputImageAltIsNotPlaceholder: + attribute: "alt" + components: + - "placeholder" + selector: "input[type=image]" + tags: + - "form" + - "image" + - "content" + testability: 1 + type: "placeholder" + guidelines: + 508: + - "a" + wcag: + 1.1.1: + techniques: + - "H36" + title: + en: "All \"input\" elements with a type of \"image\" must have an \"alt\" attribute which is not placeholder text" + description: + en: "All input elements with a type of \"image\" should have an \"alt\" attribute" +inputImageAltIsShort: + callback: "inputImageAltIsShort" + tags: + - "form" + - "image" + - "content" + testability: 1 + type: "custom" + guidelines: + 508: + - "a" + wcag: + 1.1.1: + techniques: + - "H36" + title: + en: "All \"input\" elements with a type of \"image\" must have an \"alt\" attribute which is as short as possible" + description: + en: "All input elements with a type of \"image\" should have an \"alt\" attribute" +inputImageAltNotRedundant: + callback: "inputImageAltNotRedundant" + strings: "redundant.inputImage" + tags: + - "form" + - "image" + - "content" + testability: 1 + type: "custom" + guidelines: + wcag: + 1.1.1: + techniques: + - "H36" + title: + en: "The \"alt\" text for input \"image\" submit buttons must not be filler text" + description: + en: "Every form image button should not simply use filler text like \"button\" or \"submit\" as the \"alt\" text." +inputImageHasAlt: + selector: "input[type=image]:not(input[type=image][alt])" + tags: + - "form" + - "image" + - "content" + testability: 1 + type: "selector" + guidelines: + 508: + - "a" + wcag: + 1.1.1: + techniques: + - "F65" + - "G94" + - "H36" + title: + en: "All \"input\" elements with a type of \"image\" must have an \"alt\" attribute" + description: + en: "All input elements with a type of \"image\" should have an \"alt\" attribute." +inputImageNotDecorative: + selector: "input[type=image]" + tags: + - "form" + - "image" + - "content" + testability: 0 + type: "selector" + guidelines: + wcag: + 1.1.1: + techniques: + - "H36" + title: + en: "The \"alt\" text for input \"image\" buttons must be the same as text inside the image" + description: + en: "Every form image button which has text within the image (say, a picture of the word \"Search\" in a special font)" +inputPasswordHasTabIndex: + attribute: "tabindex" + components: + - "placeholder" + empty: true + selector: "input[type=password]" + tags: + - "form" + - "content" + testability: 1 + type: "placeholder" + guidelines: [] + title: + en: "All \"password\" input elements require a valid \"tabindex\" attribute" + description: + en: "All input elements of type \"password\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone." +inputRadioHasTabIndex: + attribute: "tabindex" + components: + - "placeholder" + empty: true + selector: "input[type=radio]" + tags: + - "form" + - "content" + testability: 1 + type: "placeholder" + guidelines: [] + title: + en: "All \"radio\" input elements require a valid \"tabindex\" attribute" + description: + en: "All input elements of type \"radio\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone." +inputSubmitHasTabIndex: + attribute: "tabindex" + components: + - "placeholder" + empty: true + selector: "input[type=submit]" + tags: + - "form" + - "content" + testability: 1 + type: "placeholder" + guidelines: [] + title: + en: "All input elements, type of \"submit\" have a valid tab index." + description: + en: "" +inputTextHasLabel: + selector: "input[type=text]" + tags: + - "form" + - "content" + testability: 1 + type: "label" + guidelines: + wcag: + 1.1.1: + techniques: + - "H44" + 1.3.1: + techniques: + - "H44" + - "F68" + 3.3.2: + techniques: + - "H44" + 4.1.2: + techniques: + - "H44" + title: + en: "All \"input\" elements should have a corresponding \"label" + description: + en: "All input elements should have a corresponding label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user" +inputTextHasTabIndex: + attribute: "tabindex" + components: + - "placeholder" + empty: true + selector: "input[type=text]" + tags: + - "form" + - "content" + testability: 1 + type: "placeholder" + guidelines: [] + title: + en: "All \"text\" input elements require a valid \"tabindex\" attribute" + description: + en: "All input elements of type \"text\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone." +inputTextHasValue: + attribute: "value" + components: + - "placeholder" + empty: true + selector: "input[type=text]" + tags: + - "form" + - "content" + testability: 1 + type: "placeholder" + guidelines: [] + title: + en: "All \"input\" elements of type \"text\" must have a default text" + description: + en: "All input elements with a type of \"text\" should have a default text." +inputTextValueNotEmpty: + attribute: "value" + components: + - "placeholder" + empty: true + selector: "input[type=text]" + tags: + - "form" + - "content" + testability: 1 + type: "placeholder" + guidelines: [] + title: + en: "Text\" input elements require a non-whitespace default text" + description: + en: "All input elements with a type of \"text\" should have a default text which is not empty." +labelDoesNotContainInput: + selector: "label:has(input)" + tags: + - "form" + - "content" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "Label elements should not contain an input element" + description: + en: ".. code-block:: html" +labelMustBeUnique: + callback: "labelMustBeUnique" + tags: + - "form" + - "content" + testability: 1 + type: "custom" + guidelines: + wcag: + 1.3.1: + techniques: + - "F17" + 4.1.1: + techniques: + - "F17" + title: + en: "Every form input must have only one label" + description: + en: "Each form input should have only one label element." +labelMustNotBeEmpty: + components: + - "placeholder" + content: true + empty: true + selector: "label" + tags: + - "form" + - "content" + testability: 1 + type: "placeholder" + guidelines: + wcag: + 1.1.1: + techniques: + - "H44" + 1.3.1: + techniques: + - "H44" + - "F68" + 3.3.2: + techniques: + - "H44" + 4.1.2: + techniques: + - "H44" + title: + en: "Labels must contain text" + description: + en: ".. code-block:: html" +labelsAreAssignedToAnInput: + callback: "labelsAreAssignedToAnInput" + tags: + - "form" + - "content" + testability: 1 + type: "custom" + guidelines: [] + title: + en: "All labels should be associated with an input" + description: + en: "All label elements should be assigned to an input item, and should have a for attribute which equals the id attribute of a form element." +legendDescribesListOfChoices: + selector: "legend" + tags: + - "form" + - "content" + testability: 0 + type: "selector" + guidelines: + wcag: + 2.4.6: + techniques: + - "G131" + title: + en: "All \"legend\" elements must describe the group of choices" + description: + en: "If a legend element is used in a fieldset, the legend content must describe the group of choices." +legendTextNotEmpty: + selector: "legend:empty" + tags: + - "form" + - "content" + testability: 1 + type: "selector" + guidelines: + wcag: + 1.3.1: + techniques: + - "H71" + 2.4.6: + techniques: + - "G131" + 3.3.2: + techniques: + - "H71" + title: + en: "Legend text must not contain just whitespace" + description: + en: "If a legend element is used in a fieldset, the legend should not contain empty text." +legendTextNotPlaceholder: + components: + - "placeholder" + content: true + emtpy: true + selector: "legend" + tags: + - "form" + - "content" + testability: 1 + type: "placeholder" + guidelines: + wcag: + 1.3.1: + techniques: + - "H71" + 2.4.6: + techniques: + - "G131" + 3.3.2: + techniques: + - "H71" + title: + en: "Legend\" text must not contain placeholder text like \"form\" or \"field" + description: + en: "If a legend element is used in a fieldset, the legend should not contain useless placeholder text." +liDontUseImageForBullet: + selector: "li:has(img)" + tags: + - "list" + - "content" + testability: 0.5 + type: "selector" + guidelines: [] +linkUsedForAlternateContent: + selector: "html:not(html:has(link[rel=alternate])) body" + tags: + - "document" + testability: 0 + type: "selector" + guidelines: [] + title: + en: "Use a \"link\" element for alternate content" + description: + en: "Documents which contain things like videos, sound, or other forms of media that are not accessible, should provide a link element with a \"rel\" attribute of \"alternate\" in the document header." +linkUsedToDescribeNavigation: + selector: "html:not(html:has(link[rel=index]))" + tags: + - "document" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "Document uses link element to describe navigation if it is within a collection." + description: + en: "The link element can provide metadata about the position of an HTML page within a set of Web units or can assist in locating content with a set of Web units." +listNotUsedForFormatting: + callback: "listNotUsedForFormatting" + tags: + - "list" + - "content" + testability: 0 + type: "custom" + guidelines: + wcag: + 1.3.2: + techniques: + - "F1" + title: + en: "Lists should not be used for formatting" + description: + en: "Lists like ul and ol are to provide a structured list, and should not be used to format text. This test views any list with just one item as suspicious, but should be manually reviewed." +marqueeIsNotUsed: + selector: "marquee" + tags: + - "deprecated" + - "content" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "The \"marquee\" tag should not be used" + description: + en: "The marquee element is difficult for users to read and is not a standard HTML element. Try to find another way to convey the importance of this text." +menuNotUsedToFormatText: + selector: "menu:not(menu li:parent(menu))" + tags: + - "list" + - "content" + testability: 0 + type: "selector" + guidelines: [] + title: + en: "Menu elements should not be used for formattin" + description: + en: "Menu is a deprecated tag, but is still honored in a transitional DTD. Menu tags are to provide structure for a document and should not be used for formatting. If a menu tag is to be used, it should only contain an ordered or unordered list of links." +noembedHasEquivalentContent: + selector: "noembed" + tags: + - "objects" + - "content" + testability: 0 + type: "selector" + guidelines: [] + title: + en: "Noembed elements must be the same content as their \"embed\" element" + description: + en: "All noembed elements must contain or link to an accessible version of their embed counterparts." +noframesSectionMustHaveTextEquivalent: + selector: "frameset:not(frameset:has(noframes))" + tags: + - "deprecated" + - "frame" + testability: 0.5 + type: "selector" + guidelines: [] + title: + en: "All \"noframes\" elements should contain the text content from all frames" + description: + en: "The noframes content should either replicate or link to the content visible within the frames." +objectContentUsableWhenDisabled: + selector: "object" + tags: + - "objects" + - "content" + testability: 0 + type: "selector" + guidelines: [] + title: + en: "When objects are disabled, content should still be available" + description: + en: "The content within objects should still be available, even if the object is disabled. To do this, place a link to the direct object source within the object tag." +objectDoesNotFlicker: + selector: "object" + tags: + - "objects" + - "content" + testability: 0 + type: "selector" + guidelines: + 508: + - "j" + wcag: + 2.2.2: + techniques: + - "F7" + title: + en: "Objects do not flicker" + description: + en: "The content within an object tag must not flicker." +objectDoesNotUseColorAlone: + selector: "object" + tags: + - "objects" + - "content" + testability: 0 + type: "selector" + guidelines: + 508: + - "c" + title: + en: "Objects must not use color to communicate alone" + description: + en: "Objects should contain content that makes sense without color and is accessible to users who are color blind." +objectInterfaceIsAccessible: + selector: "object" + tags: + - "objects" + - "content" + testability: 0 + type: "selector" + guidelines: [] + title: + en: "Interfaces within objects must be accessible" + description: + en: "Object content should be assessed for accessibility." +objectLinkToMultimediaHasTextTranscript: + selector: "object" + tags: + - "objects" + - "content" + testability: 0 + type: "selector" + guidelines: [] + title: + en: "Objects which reference multimedia files should also provide a link to a transcript" + description: + en: "If an object contains a video, a link to the transcript should be provided near the object." +objectMustContainText: + components: + - "placeholder" + content: true + empty: true + selector: "object" + tags: + - "objects" + - "content" + testability: 1 + type: "placeholder" + guidelines: + wcag: + 1.1.1: + techniques: + - "FLASH1" + - "H27" + title: + en: "Objects must contain their text equivalents" + description: + en: "All object elements should contain a text equivalent if the object cannot be rendered." +objectMustHaveEmbed: + selector: "object:not(object:has(embed))" + tags: + - "objects" + - "content" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "Every object should contain an \"embed\" element" + description: + en: "Every object element must also contain an embed element." +objectMustHaveTitle: + selector: "object:not(object[title])" + tags: + - "objects" + - "content" + testability: 1 + type: "selector" + guidelines: + wcag: + 1.1.1: + techniques: + - "H27" + title: + en: "Objects should have a title attribute" + description: + en: "All object elements should contain a \"title\" attribute." +objectMustHaveValidTitle: + attribute: "title" + components: + - "placeholder" + empty: true + selector: "object" + tags: + - "objects" + - "content" + testability: 1 + type: "placeholder" + guidelines: [] + title: + en: "Objects must not have an empty title attribute" + description: + en: "All object elements should have a \"title\" attribute which is not empty." +objectProvidesMechanismToReturnToParent: + selector: "object" + tags: + - "objects" + - "content" + testability: 0 + type: "selector" + guidelines: [] + title: + en: "All objects should provide a way for keyboard users to escape" + description: + en: "Ensure that a user who has only a keyboard as an input device can escape a object element. This requires manual confirmation." +objectShouldHaveLongDescription: + selector: "object" + tags: + - "objects" + - "content" + testability: 0 + type: "selector" + guidelines: [] + title: + en: "An object might require a long description" + description: + en: "Objects might require a long description, especially if their content is complicated." +objectTextUpdatesWhenObjectChanges: + selector: "object" + tags: + - "objects" + - "content" + testability: 0 + type: "selector" + guidelines: + 508: + - "a" + title: + en: "The text equivalents of an object should update if the object changes" + description: + en: "If an object changes, the text equivalent of that object should also change." +objectUIMustBeAccessible: + selector: "object" + tags: + - "objects" + - "content" + testability: 0 + type: "selector" + guidelines: [] + title: + en: "Content within an \"object\" element should be usable with objects disabled" + description: + en: "Objects who's content changes using java, ActiveX, or other similar technologies, should have their default text change when the object's content changes." +objectWithClassIDHasNoText: + selector: "object[classid]:not(object[classid]:empty)" + tags: + - "objects" + - "content" + testability: 1 + type: "selector" + guidelines: [] + title: + en: "Objects with \"classid\" attributes should change their text if the content of the object changes" + description: + en: "Objects who's content changes using java, ActiveX, or other similar technologies, should have their default text change when the object's content changes." +pNotUsedAsHeader: + callback: "pNotUsedAsHeader" + tags: + - "header" + - "content" + testability: 1 + type: "custom" + guidelines: + wcag: + 1.3.1: + techniques: + - "G141" + - "H42" + 2.4.10: + techniques: + - "G141" + title: + en: "Paragraphs must not be used for headers" + description: + en: "Headers like h1. h6 are extremely useful for non-sighted users to navigate the structure of the page, and formatting a paragraph to just be big or bold, while it might visually look like a header, does not make it one." +paragarphIsWrittenClearly: + callback: "paragarphIsWrittenClearly" + components: + - "textStatistics" + tags: + - "language" + - "content" + testability: 0.5 + type: "custom" + guidelines: + wcag: + 3.1.5: + techniques: + - "G86" +passwordHasLabel: + components: + - "label" + selector: "input[type=password]" + tags: + - "form" + - "content" + testability: 1 + type: "label" + guidelines: + 508: + - "n" + wcag: + 1.1.1: + techniques: + - "H44" + 1.3.1: + techniques: + - "H44" + - "F68" + 3.3.2: + techniques: + - "H44" + 4.1.2: + techniques: + - "H44" + title: + en: "All password input elements should have a corresponding label" + description: + en: "All input elements with a type of \"password\"should have a corresponding label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user" +passwordLabelIsNearby: + components: + - "labelProximity" + selector: "input[type=password]" + tags: + - "form" + - "content" + testability: 0.5 + type: "labelProximity" + guidelines: [] + title: + en: "All \"password\" input elements have a label that is close" + description: + en: "All input elements of type \"password\" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away." +preShouldNotBeUsedForTabularLayout: + callback: "preShouldNotBeUsedForTabularLayout" + tags: + - "table" + - "content" + testability: 0 + type: "custom" + guidelines: + wcag: + 1.3.1: + techniques: + - "F33" + - "F34" + - "F48" + 1.3.2: + techniques: + - "F33" + - "F34" + title: + en: "Pre\" elements should not be used for tabular data" + description: + en: "If a pre element is used for tabular data, change the data to use a well-formed table." +radioHasLabel: + components: + - "label" + selector: "input[type=radio]" + tags: + - "form" + - "content" + testability: 1 + type: "label" + guidelines: + 508: + - "n" + wcag: + 1.1.1: + techniques: + - "H44" + 1.3.1: + techniques: + - "H44" + - "F68" + 3.3.2: + techniques: + - "H44" + 4.1.2: + techniques: + - "H44" + title: + en: "All \"radio\" input elements have a corresponding label" + description: + en: "All input elements of type \"radio\" should have a corresponding label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user" +radioLabelIsNearby: + components: + - "labelProximity" + selector: "input[type=radio]" + tags: + - "form" + - "content" + testability: 0.5 + type: "labelProximity" + guidelines: [] + title: + en: "All \"radio\" input elements have a label that is close" + description: + en: "All input elements of type \"radio\" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away." +radioMarkedWithFieldgroupAndLegend: + selector: "input[type=radio]:not(fieldset input[type=radio])" + tags: + - "form" + - "content" + testability: 1 + type: "selector" + guidelines: + wcag: + 1.3.1: + techniques: + - "H71" + 3.3.2: + techniques: + - "H71" + title: + en: "All radio button groups are marked using fieldset and legend elements." + description: + en: "form element content must contain both fieldset and legend elements if there are related radio buttons." +scriptContentAccessibleWithScriptsTurnedOff: + selector: "script" + tags: + - "javascript" + testability: 0 + type: "selector" + guidelines: [] + title: + en: "Content on the page should still be available if scripts are disabled" + description: + en: "All scripts should be assessed to see if, when the user is browing with scrips turned off, the page content is still available." +scriptInBodyMustHaveNoscript: + selector: "html:not(html:has(noscript)):has(script) body" + tags: + - "javascript" + testability: 0.5 + type: "selector" + guidelines: + 508: + - "l" + title: + en: "Scripts should have a corresponding \"noscript\" element" + description: + en: "Scripts should be followed by a noscripts element to guide the user to content in an alternative way." +scriptOnclickRequiresOnKeypress: + components: + - "event" + - "hasEventListener" + correspondingEvent: "onkeypress" + searchEvent: "onclick" + tags: + - "javascript" + testability: 1 + type: "event" + guidelines: + 508: + - "l" + wcag: + 2.1.1: + techniques: + - "G90" + - "SCR2" + 2.1.3: + techniques: + - "G90" + title: + en: "If an element has an \"onclick\" attribute" + description: + en: "it should also have an \"onkeypress\" attribute" +scriptOndblclickRequiresOnKeypress: + components: + - "event" + - "hasEventListener" + correspondingEvent: "onkeypress" + searchEvent: "ondblclick" + tags: + - "javascript" + testability: 1 + type: "event" + guidelines: + 508: + - "l" + wcag: + 2.1.1: + techniques: + - "G90" + - "SCR2" + 2.1.3: + techniques: + - "G90" + title: + en: "Any element with an \"ondblclick\" attribute shoul have a keyboard-related action as well" + description: + en: "If an element has an \"ondblclick\" attribute" +scriptOnmousedownRequiresOnKeypress: + components: + - "event" + - "hasEventListener" + correspondingEvent: "onkeydown" + searchEvent: "onmousedown" + tags: + - "javascript" + testability: 1 + type: "event" + guidelines: + 508: + - "l" + wcag: + 2.1.1: + techniques: + - "G90" + - "SCR2" + 2.1.3: + techniques: + - "G90" + title: + en: "If an element has a \"mousedown\" attribute" + description: + en: "it should also have an \"onkeydown\" attribute" +scriptOnmousemove: + components: + - "event" + - "hasEventListener" + correspondingEvent: "onkeypress" + searchEvent: "onmousemove" + tags: + - "javascript" + testability: 1 + type: "event" + guidelines: + wcag: + 2.1.1: + techniques: + - "SCR2" + 508: + - "l" + title: + en: "Any element with an \"onmousemove\" attribute shoul have a keyboard-related action as well" + description: + en: "If an element has an \"onmousemove\" attribute" +scriptOnmouseoutHasOnmouseblur: + components: + - "event" + - "hasEventListener" + correspondingEvent: "onblur" + searchEvent: "onmouseout" + tags: + - "javascript" + testability: 1 + type: "event" + guidelines: + wcag: + 2.1.1: + techniques: + - "SCR2" + 508: + - "l" + title: + en: "If an element has a \"onmouseout\" attribute" + description: + en: "it should also have an \"onblur\" attribute" +scriptOnmouseoverHasOnfocus: + components: + - "event" + - "hasEventListener" + correspondingEvent: "onfocus" + searchEvent: "onmouseover" + tags: + - "javascript" + testability: 1 + type: "event" + guidelines: + wcag: + 2.1.1: + techniques: + - "SCR2" + 508: + - "l" + title: + en: "If an element has an \"onmouseover\" attribute" + description: + en: "it should also have an \"onfocus\" attribute" +scriptOnmouseupHasOnkeyup: + components: + - "event" + - "hasEventListener" + correspondingEvent: "onkeyup" + searchEvent: "onmouseup" + tags: + - "javascript" + testability: 1 + type: "event" + guidelines: + wcag: + 2.1.1: + techniques: + - "SCR2" + 508: + - "l" + wcag: + 2.1.1: + techniques: + - "G90" + 2.1.3: + techniques: + - "G90" + title: + en: "If an element has an \"onmouseup\" attribute" + description: + en: "it should also have an \"onkeyup\" attribute" +scriptUIMustBeAccessible: + selector: "script" + tags: + - "javascript" + testability: 0 + type: "selector" + guidelines: + 508: + - "l" + title: + en: "The user interface for scripts should be accessible" + description: + en: "All scripts should be assessed to see if their interface is accessible." +scriptsDoNotFlicker: + selector: "script" + tags: + - "javascript" + testability: 0 + type: "selector" + guidelines: + 508: + - "j" + wcag: + 2.2.2: + techniques: + - "F7" + title: + en: "Scripts should not cause the screen to flicker" + description: + en: "All scripts should be assessed to see if their interface does not flicker." +scriptsDoNotUseColorAlone: + selector: "script" + tags: + - "javascript" + - "color" + testability: 0 + type: "selector" + guidelines: + 508: + - "c" + title: + en: "The interface in scripts should not use color alone" + description: + en: "All scripts should be assessed to see if their interface does not have an interface which requires distinguishing beteween colors alone." +selectDoesNotChangeContext: + components: + - "event" + - "hasEventListener" + searchEvent: "onchange" + selector: "select" + tags: + - "form" + - "content" + testability: 1 + type: "event" + guidelines: [] + title: + en: "Select\" elemetns must not contain an \"onchange\" attribute" + description: + en: "Actions like \"onchange\" can take control away from users who are trying to navigate the page. Using an \"onchange\" attribute for things like select-list menus should instead be replaced with a drop-down and a button which initiates the action." +selectHasAssociatedLabel: + components: + - "label" + selector: "select" + tags: + - "form" + - "content" + testability: 1 + type: "label" + guidelines: + wcag: + 1.1.1: + techniques: + - "H44" + 1.3.1: + techniques: + - "H44" + - "F68" + 3.3.2: + techniques: + - "H44" + 4.1.2: + techniques: + - "H44" + title: + en: "All select elements have an explicitly associated label." + description: + en: "All select elements should have a corresponding label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user" +selectJumpMenu: + callback: "selectJumpMenu" + components: + - "hasEventListener" + tags: + - "form" + - "content" + testability: 0.5 + type: "custom" + guidelines: + wcag: + 3.2.2: + techniques: + - "F37" + 3.2.5: + techniques: + - "F9" + title: + en: "Select jump menus should jump on button press, not on state change" + description: + en: "If you wish to use a 'Jump' menu with a select item that then redirects users to another page, the jump should occur on the user pressing a button, rather than on the change event of that select eleemnt." +selectWithOptionsHasOptgroup: + selector: "select:not(select:has(optgroup)) option:nth-child(5)" + tags: + - "form" + - "content" + testability: 0.5 + type: "selector" + guidelines: + wcag: + 1.3.1: + techniques: + - "H85" + title: + en: "Form select elements should use optgroups for long selections" + description: + en: ".. code-block:: html" +siteMap: + callback: "siteMap" + strings: "siteMap" + tags: + - "document" + testability: 0 + type: "custom" + guidelines: + wcag: + 2.4.5: + techniques: + - "G63" + 2.4.8: + techniques: + - "G63" + title: + en: "Websites must have a site map" + description: + en: "Every web site should have a page which provides a site map or another method to navigate most of the site from a single page to save time for users of assistive devices." +skipToContentLinkProvided: + selector: "body:not(body:has(a:first[href^=#]))" + tags: + - "document" + testability: 0.5 + type: "selector" + guidelines: + wcag: + 2.4.1: + techniques: + - "G1" + 508: + - "o" + title: + en: "A \"skip to content\" link should exist as one of the first links on the page" + description: + en: "A link reading \"skip to content" +svgContainsTitle: + selector: "svg:not(svg:has(title))" + tags: + - "image" + - "svg" + - "content" + testability: 1 + type: "selector" + guidelines: + wcag: + 1.1.1: + techniques: + - "F65" + title: + en: "Inline SVG should use Title elements" + description: + en: "Any inline SVG image should have an embedded title element" +tabIndexFollowsLogicalOrder: + callback: "tabIndexFollowsLogicalOrder" + tags: + - "document" + testability: 0.5 + type: "custom" + guidelines: + wcag: + 2.4.3: + techniques: + - "H4" + title: + en: "The tab order of a document is logical" + description: + en: "Check that the tab-order of a page is logical." +tableCaptionIdentifiesTable: + selector: "caption" + tags: + - "table" + - "content" + testability: 0 + type: "selector" + guidelines: + wcag: + 1.3.1: + techniques: + - "H39" + title: + en: "Captions should identify their table" + description: + en: "Check to make sure that a table's caption identifies the table with a name, figure number, etc." +tableComplexHasSummary: + selector: "table:not(table[summary], table:has(caption))" + tags: + - "table" + - "content" + testability: 0.5 + type: "selector" + guidelines: + wcag: + 1.3.1: + techniques: + - "H39" + title: + en: "Complex tables should have a summary" + description: + en: "If a table is complex (for example, has some cells with \"colspan\" attributes" +tableDataShouldHaveTh: + selector: "table:not(table:has(th))" + tags: + - "table" + - "content" + testability: 1 + type: "selector" + guidelines: + 508: + - "g" + wcag: + 1.3.1: + techniques: + - "F91" + title: + en: "Data tables should contain \"th\" elements" + description: + en: "Tables which contain data (as opposed to layout tables) should contain th elements to mark headers for screen readers and enhance the structure of the document." +tableHeaderLabelMustBeTerse: + callback: "tableHeaderLabelMustBeTerse" + tags: + - "table" + - "content" + testability: 0.5 + type: "custom" + guidelines: [] + title: + en: "Table header lables must be terse" + description: + en: "The \"abbr\" attribute for table headers must be terse (less than 20 characters long)." +tableIsGrouped: + selector: "table:not(table:has(thead), table:has(tfoot))" + tags: + - "table" + - "content" + testability: 0.5 + type: "selector" + guidelines: [] + title: + en: "Mark up the areas of tables using thead and tbody" + description: + en: "" +tableLayoutDataShouldNotHaveTh: + callback: "tableLayoutDataShouldNotHaveTh" + tags: + - "table" + - "layout" + - "content" + testability: 0 + type: "custom" + guidelines: + wcag: + 1.3.1: + techniques: + - "F46" + title: + en: "Layout tables should not contain \"th\" elements" + description: + en: "Tables which are used purely for layout (as opposed to data tables), should not contain th elements, which would make the table appear to be a data table." +tableLayoutHasNoCaption: + callback: "tableLayoutHasNoCaption" + tags: + - "table" + - "layout" + - "content" + testability: 1 + type: "custom" + guidelines: + wcag: + 1.3.1: + techniques: + - "F46" + title: + en: "All tables used for layout have no \"caption\" element" + description: + en: "If a table contains no data, and is used simply for layout, then it should not contain a caption element." +tableLayoutHasNoSummary: + callback: "tableLayoutHasNoSummary" + tags: + - "table" + - "layout" + - "content" + testability: 0.5 + type: "custom" + guidelines: + wcag: + 1.3.1: + techniques: + - "F46" + title: + en: "All tables used for layout have no summary or an empty summary" + description: + en: "If a table contains no data, and is used simply for layout, then it should not have a \"summary\" attribute" +tableLayoutMakesSenseLinearized: + callback: "tableLayoutMakesSenseLinearized" + tags: + - "table" + - "layout" + - "content" + testability: 0 + type: "custom" + guidelines: [] + title: + en: "All tables used for layout should make sense when removed" + description: + en: "If a table element is used for layout purposes only, then the content of the table should make sense if the table is linearized." +tableNotUsedForLayout: + callback: "tableNotUsedForLayout" + tags: + - "table" + - "layout" + testability: 0.5 + type: "custom" + guidelines: + wcag: + 1.3.2: + techniques: + - "F49" +tableSummaryDescribesTable: + selector: "table[summary]" + tags: + - "table" + - "content" + testability: 0 + type: "selector" + guidelines: [] + title: + en: "Table summaries should describe the navigation and structure of the table" + description: + en: "Table summary elements should describe the navigation tools and structure of the table, as well as provide an overview of what the table describes." +tableSummaryDoesNotDuplicateCaption: + callback: "tableSummaryDoesNotDuplicateCaption" + tags: + - "table" + - "content" + testability: 1 + type: "custom" + guidelines: [] + title: + en: "Table \"summary\" elements should not duplicate the \"caption\" element" + description: + en: "The summary and the caption must be different, as both provide different information. A caption. /code element identifies the table., while the \"summary\" attribute describes the table contents." +tableSummaryIsEmpty: + attribute: "summary" + components: + - "placeholder" + empty: true + selector: "table[summary]" + tags: + - "table" + - "content" + testability: 0.5 + type: "placeholder" + guidelines: [] + title: + en: "All data tables should have a summary" + description: + en: "If a table contains data, it should have a \"summary\" attribute." +tableSummaryIsNotTooLong: + callback: "tableSummaryIsNotTooLong" + tags: + - "table" + - "content" + testability: 0 + type: "custom" + guidelines: [] +tableSummaryIsSufficient: + selector: "table[summary]" + tags: + - "table" + - "content" + testability: 0 + type: "selector" + guidelines: [] + title: + en: "All data tables should have an adequate summary" + description: + en: "If a table contains data, it should have a \"summary\" attribute that completely communicates the function and use of the table." +tableUseColGroup: + callback: "tableUseColGroup" + tags: + - "table" + - "content" + testability: 0 + type: "custom" + guidelines: [] + title: + en: "Group columns using \"colgroup\" or \"col\" elements" + description: + en: "To help complex table headers make sense, use colgroup or col to group them together." +tableUsesAbbreviationForHeader: + callback: "tableUsesAbbreviationForHeader" + tags: + - "table" + - "content" + testability: 0 + type: "custom" + guidelines: [] + title: + en: "Table headers over 20 characters should provide an \"abbr\" attribute" + description: + en: "For long table headers, use an \"abbr\" attribute that is less than short (less than 20 characters long)." +tableUsesCaption: + selector: "table:not(table:has(caption))" + tags: + - "table" + - "content" + testability: 1 + type: "selector" + guidelines: + wcag: + 1.3.1: + techniques: + - "H39" + title: + en: "Data tables should contain a \"caption\" element if not described elsewhere" + description: + en: "Unless otherwise described in the document, tables should contain caption elements to describe the purpose of the table." +tableUsesScopeForRow: + callback: "tableUsesScopeForRow" + tags: + - "table" + - "content" + testability: 0.5 + type: "custom" + guidelines: + wcag: + 1.3.1: + techniques: + - "H63" + title: + en: "Data tables should use scoped headers for rows with headers" + description: + en: "Where there are table headers for both rows and columns, use the \"scope\" attribute to help relate those headers with their appropriate cells. This test looks for the first and last cells in each row and sees if they differ in layout or font weight." +tableWithBothHeadersUseScope: + selector: "table:has(tr:not(table tr:first) th:not(th[scope]))" + tags: + - "table" + - "content" + testability: 0.5 + type: "selector" + guidelines: + 508: + - "h" + wcag: + 1.3.1: + techniques: + - "F91" + title: + en: "Data tables with multiple headers should use the \"scope\" attribute" + description: + en: "Where there are table headers for both rows and columns, use the \"scope\" attribute to help relate those headers with their appropriate cells." +tableWithMoreHeadersUseID: + callback: "tableWithMoreHeadersUseID" + tags: + - "table" + - "content" + testability: 0.5 + type: "custom" + guidelines: [] + title: + en: "Complex data tables should provide \"id\" attributes to headers" + description: + en: "and \"headers\" attributes for data cells" +tabularDataIsInTable: + callback: "tabularDataIsInTable" + tags: + - "table" + - "content" + testability: 0.5 + type: "custom" + guidelines: + wcag: + 1.3.1: + techniques: + - "F33" + - "F34" + - "F48" + 1.3.2: + techniques: + - "F33" + - "F34" + title: + en: "All tabular information should use a table" + description: + en: "Tables should be used when displaying tabular information." +textIsNotSmall: + callback: "textIsNotSmall" + components: + - "convertToPx" + tags: + - "textsize" + - "content" + testability: 0.5 + type: "custom" + guidelines: [] + title: + en: "The text size is not less than 9 pixels high" + description: + en: "To help users with difficulty reading small text, ensure text size is no less than 9 pixels high." +textareaHasAssociatedLabel: + components: + - "label" + selector: "textarea" + tags: + - "form" + - "content" + testability: 1 + type: "label" + guidelines: + wcag: + 1.1.1: + techniques: + - "H44" + 1.3.1: + techniques: + - "H44" + - "F68" + 3.3.2: + techniques: + - "H44" + 4.1.2: + techniques: + - "H44" + title: + en: "All textareas should have a corresponding label" + description: + en: "All textarea elements should have a corresponding label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user" +textareaLabelPositionedClose: + components: + - "labelProximity" + selector: "textarea" + tags: + - "form" + - "content" + testability: 0.5 + type: "labelProximity" + guidelines: [] + title: + en: "All textareas should have a label that is close to it" + description: + en: "All textarea elements should have a corresponding label element that is close in proximity.." +videoProvidesCaptions: + selector: "video" + tags: + - "media" + - "content" + testability: 0.5 + type: "selector" + guidelines: + 508: + - "b" + - "b" + wcag: + 1.2.2: + techniques: + - "G87" + 1.2.4: + techniques: + - "G87" + title: + en: "All video tags must provide captions" + description: + en: "All HTML5 video tags must provide captions." +videosEmbeddedOrLinkedNeedCaptions: + callback: "videosEmbeddedOrLinkedNeedCaptions" + components: + - "video" + tags: + - "media" + - "content" + testability: 1 + type: "custom" + guidelines: + wcag: + 1.2.2: + techniques: + - "G87" + 1.2.4: + techniques: + - "G87" + title: + en: "All linked or embedded videos need captions" + description: + en: "Any video hosted or otherwise which is linked or embedded must have a caption." diff --git a/src/wysiwyg_plugins/ckeditor/quail/plugin.min.js b/src/wysiwyg_plugins/ckeditor/quail/plugin.min.js deleted file mode 100644 index abf448e5e..000000000 --- a/src/wysiwyg_plugins/ckeditor/quail/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(e){CKEDITOR.plugins.add("quail",{active:!1,init:function(e){var t=this;e.addCss(".quail-result { padding: 3px; border-radius: 3px;}.quail-result.severe { border: 3px dashed red; }.quail-result.moderate { border: 3px dashed orange; }.quail-result.reccomendation { border: 3px solid green; }.quail-message { position: fixed; background: #fff; color: #000 !important; text-decoration: none !important; border: 1px solid black; padding: 10px;}");e.addCommand("checkQuail",{exec:function(e){if(t.active){t.removeMarkup(e);t.active=!1}else{t.checkContent(e);t.active=!0}}});e.ui.addButton("Quail",{label:"Check content for accessibility",command:"checkQuail",icon:this.path+"img/quail.png"})},removeMarkup:function(t){e(t.document.getDocumentElement().$).find(".quail-result").each(function(){e(this).removeClass("quail-result").removeClass("severe").removeClass("moderate").removeClass("suggestion").unbind("hover")});e(t.document.getDocumentElement().$).find(".quail-message").remove()},checkContent:function(t){var n=t.config.quailOptions;typeof n.testFailed!="object"&&(n.testFailed=function(t){t.element.addClass("quail-result").addClass(t.severity);if(typeof (n.ckEditorMessage==="object")){var r=n.ckEditorMessage(t);t.element.hover(function(){var n=e('
    '+r+"
    "),i=t.element.position();n.css("top",i.top+5+"px").css("left",i.left+t.element.width()+5+"px");t.element.after(n)},function(){t.element.next(".quail-message").remove()})}});e(t.document.getDocumentElement().$).quail(n)}})})(jQuery); \ No newline at end of file diff --git a/tasks/buildGuideline.js b/tasks/buildGuideline.js new file mode 100644 index 000000000..49f388f6c --- /dev/null +++ b/tasks/buildGuideline.js @@ -0,0 +1,29 @@ +'use strict'; + +module.exports = function(grunt) { + + grunt.registerMultiTask('buildGuideline', 'Take guideline JSON files and convert to a simple array.', function() { + this.files.forEach(function(file) { + var contents = file.src.filter(function(filepath) { + if (!grunt.file.exists(filepath)) { + grunt.log.warn('Source file "' + filepath + '" not found.'); + return false; + } else { + return true; + } + }).map(function(filepath) { + return grunt.file.read(filepath); + }); + var data = JSON.parse(contents); + var tests = [ ]; + for (var test in data) { + if (typeof data[test].guidelines[file.guideline] !== 'undefined') { + tests.push(test); + } + } + grunt.file.write(file.dest, JSON.stringify(tests)); + + grunt.log.writeln('File "' + file.dest + '" created.'); + }); + }); +}; \ No newline at end of file diff --git a/tasks/compressTestsJson.js b/tasks/compressTestsJson.js new file mode 100644 index 000000000..e025c864f --- /dev/null +++ b/tasks/compressTestsJson.js @@ -0,0 +1,23 @@ +'use strict'; + +module.exports = function(grunt) { + + grunt.registerMultiTask('compressTestsJson', 'Take test JSON files and compress.', function() { + this.files.forEach(function(file) { + var contents = file.src.filter(function(filepath) { + if (!grunt.file.exists(filepath)) { + grunt.log.warn('Source file "' + filepath + '" not found.'); + return false; + } else { + return true; + } + }).map(function(filepath) { + return grunt.file.read(filepath); + }); + var data = JSON.parse(contents); + grunt.file.write(file.dest, JSON.stringify(data)); + + grunt.log.writeln('File "' + file.dest + '" created.'); + }); + }); +}; \ No newline at end of file diff --git a/tasks/supressSaucelabsOutput.js b/tasks/supressSaucelabsOutput.js new file mode 100644 index 000000000..335c7230f --- /dev/null +++ b/tasks/supressSaucelabsOutput.js @@ -0,0 +1,15 @@ +'use strict'; + +module.exports = function(grunt) { + + grunt.registerMultiTask('supressSaucelabsOutput', 'Suppresses sharing secure information on saucelabs during verbose.', function(target) { + grunt.log.currentwriteflags = grunt.log.writeflags; + + grunt.log.writeflags = function(obj, prefix) { + if(prefix === 'Options' && typeof obj.username !== 'undefined') { + return; + } + grunt.log.currentwriteflags(obj, prefix); + }; + }); +}; \ No newline at end of file diff --git a/test/composite.js b/test/composite.js index f4e3cee75..ca614e035 100644 --- a/test/composite.js +++ b/test/composite.js @@ -2,7 +2,7 @@ var accessibilityTests = { }; -$.ajax({ url : '../../../src/resources/tests.json', +$.ajax({ url : '../../../dist/tests.json', async : false, dataType : 'json', cache : false, @@ -39,6 +39,13 @@ var quailTest = { }, confirmIsEmpty : function() { + $.each(quailTest.results[quailTest.testName], function(index, item) { + if(typeof item === 'undefined' || + (item && item.attr('id') && item.attr('id').indexOf('qunit-') !== -1) || + item.parents('#qunit-wrapper').length) { + quailTest.results[quailTest.testName].splice(index, 1); + } + }); if(quailTest.results[quailTest.testName].length) { return false; } @@ -53,11 +60,8 @@ var quailTest = { }, insertElements : function(callback) { - - $('body').prepend('

      test markup, will be hidden
      '); - + $('body').append('

        test markup, will be hidden
        '); } }; - -quailTest.insertElements(); \ No newline at end of file +$(document).ready(quailTest.insertElements); \ No newline at end of file diff --git a/test/quail.html b/test/quail.html index 99a491a07..418afcdb8 100644 --- a/test/quail.html +++ b/test/quail.html @@ -5,621 +5,582 @@ Quail test suites - - - - + + + + -
        +
        +
        -
        + \ No newline at end of file diff --git a/test/testfiles/common/aAdjacentWithSameResourceShouldBeCombined-fail-2.html b/test/testfiles/common/aAdjacentWithSameResourceShouldBeCombined-fail-2.html new file mode 100644 index 000000000..2f2f62267 --- /dev/null +++ b/test/testfiles/common/aAdjacentWithSameResourceShouldBeCombined-fail-2.html @@ -0,0 +1,29 @@ + + + + + aAdjacentWithSameResourceShouldBeCombined-fail-2 + + + + +

        + + + Products page +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aAdjacentWithSameResourceShouldBeCombined-fail.html b/test/testfiles/common/aAdjacentWithSameResourceShouldBeCombined-fail.html new file mode 100644 index 000000000..036ee7002 --- /dev/null +++ b/test/testfiles/common/aAdjacentWithSameResourceShouldBeCombined-fail.html @@ -0,0 +1,29 @@ + + + + + aAdjacentWithSameResourceShouldBeCombined-fail + + + + +

        +Products page + + Products page +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aAdjacentWithSameResourceShouldBeCombined-pass.html b/test/testfiles/common/aAdjacentWithSameResourceShouldBeCombined-pass.html new file mode 100644 index 000000000..7a0c1b594 --- /dev/null +++ b/test/testfiles/common/aAdjacentWithSameResourceShouldBeCombined-pass.html @@ -0,0 +1,27 @@ + + + + + aAdjacentWithSameResourceShouldBeCombined-pass + + + + +

        +Products page + +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aImgAltNotRepetative-fail.html b/test/testfiles/common/aImgAltNotRepetative-fail.html new file mode 100644 index 000000000..6d07276da --- /dev/null +++ b/test/testfiles/common/aImgAltNotRepetative-fail.html @@ -0,0 +1,27 @@ + + + + + aImgAltNotRepetative-fail + + + + +

        +page1page1 + +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aImgAltNotRepetative-pass.html b/test/testfiles/common/aImgAltNotRepetative-pass.html new file mode 100644 index 000000000..24d765303 --- /dev/null +++ b/test/testfiles/common/aImgAltNotRepetative-pass.html @@ -0,0 +1,27 @@ + + + + + aImgAltNotRepetative-pass + + + + +

        +page1 + +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinkTextDoesNotBeginWithRedundantWord-fail-2.html b/test/testfiles/common/aLinkTextDoesNotBeginWithRedundantWord-fail-2.html new file mode 100644 index 000000000..6bcb4d510 --- /dev/null +++ b/test/testfiles/common/aLinkTextDoesNotBeginWithRedundantWord-fail-2.html @@ -0,0 +1,25 @@ + + + + + aLinkTextDoesNotBeginWithRedundantWord-fail-2 + + + + +

        link to home page +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinkTextDoesNotBeginWithRedundantWord-fail.html b/test/testfiles/common/aLinkTextDoesNotBeginWithRedundantWord-fail.html new file mode 100644 index 000000000..bf5fd9d62 --- /dev/null +++ b/test/testfiles/common/aLinkTextDoesNotBeginWithRedundantWord-fail.html @@ -0,0 +1,25 @@ + + + + + aLinkTextDoesNotBeginWithRedundantWord-fail + + + + +

        link to home page +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinkTextDoesNotBeginWithRedundantWord-pass-2.html b/test/testfiles/common/aLinkTextDoesNotBeginWithRedundantWord-pass-2.html new file mode 100644 index 000000000..6dc35b1f2 --- /dev/null +++ b/test/testfiles/common/aLinkTextDoesNotBeginWithRedundantWord-pass-2.html @@ -0,0 +1,25 @@ + + + + + aLinkTextDoesNotBeginWithRedundantWord-pass-2 + + + + +

        home page +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinkTextDoesNotBeginWithRedundantWord-pass.html b/test/testfiles/common/aLinkTextDoesNotBeginWithRedundantWord-pass.html new file mode 100644 index 000000000..c8d8194fa --- /dev/null +++ b/test/testfiles/common/aLinkTextDoesNotBeginWithRedundantWord-pass.html @@ -0,0 +1,25 @@ + + + + + aLinkTextDoesNotBeginWithRedundantWord-pass + + + + +

        home page +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksAreSeperatedByPrintableCharacters-fail.html b/test/testfiles/common/aLinksAreSeperatedByPrintableCharacters-fail.html new file mode 100644 index 000000000..2bffc395b --- /dev/null +++ b/test/testfiles/common/aLinksAreSeperatedByPrintableCharacters-fail.html @@ -0,0 +1,26 @@ + + + + + aLinksAreSeperatedByPrintableCharacters-fail + + + + +dogs cats birds + snakes + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksAreSeperatedByPrintableCharacters-pass.html b/test/testfiles/common/aLinksAreSeperatedByPrintableCharacters-pass.html new file mode 100644 index 000000000..9447d96c2 --- /dev/null +++ b/test/testfiles/common/aLinksAreSeperatedByPrintableCharacters-pass.html @@ -0,0 +1,26 @@ + + + + + aLinksAreSeperatedByPrintableCharacters-pass + + + + +dogs | cats | birds | + snakes + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksDontOpenNewWindow-fail.html b/test/testfiles/common/aLinksDontOpenNewWindow-fail.html new file mode 100644 index 000000000..b349361d9 --- /dev/null +++ b/test/testfiles/common/aLinksDontOpenNewWindow-fail.html @@ -0,0 +1,26 @@ + + + + + aLinksDontOpenNewWindow-fail + + + + +

        This link to a valid file opens in a new window.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksDontOpenNewWindow-pass-2.html b/test/testfiles/common/aLinksDontOpenNewWindow-pass-2.html new file mode 100644 index 000000000..8eeaf80d7 --- /dev/null +++ b/test/testfiles/common/aLinksDontOpenNewWindow-pass-2.html @@ -0,0 +1,26 @@ + + + + + aLinksDontOpenNewWindow-pass-2 + + + + +same window + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksDontOpenNewWindow-pass-3.html b/test/testfiles/common/aLinksDontOpenNewWindow-pass-3.html new file mode 100644 index 000000000..0900e3d26 --- /dev/null +++ b/test/testfiles/common/aLinksDontOpenNewWindow-pass-3.html @@ -0,0 +1,26 @@ + + + + + aLinksDontOpenNewWindow-pass-3 + + + + +same window + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksDontOpenNewWindow-pass.html b/test/testfiles/common/aLinksDontOpenNewWindow-pass.html new file mode 100644 index 000000000..c6d75d086 --- /dev/null +++ b/test/testfiles/common/aLinksDontOpenNewWindow-pass.html @@ -0,0 +1,25 @@ + + + + + aLinksDontOpenNewWindow-pass + + + + +

        This link to an invalid file opens in the same + window.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksToMultiMediaRequireTranscript-fail-2.html b/test/testfiles/common/aLinksToMultiMediaRequireTranscript-fail-2.html new file mode 100644 index 000000000..32d5687e9 --- /dev/null +++ b/test/testfiles/common/aLinksToMultiMediaRequireTranscript-fail-2.html @@ -0,0 +1,24 @@ + + + + + aLinksToMultiMediaRequireTranscript-fail-2 + + + + +

        View the movie.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksToMultiMediaRequireTranscript-fail-3.html b/test/testfiles/common/aLinksToMultiMediaRequireTranscript-fail-3.html new file mode 100644 index 000000000..def924864 --- /dev/null +++ b/test/testfiles/common/aLinksToMultiMediaRequireTranscript-fail-3.html @@ -0,0 +1,24 @@ + + + + + aLinksToMultiMediaRequireTranscript-fail-3 + + + + +

        View the movie.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksToMultiMediaRequireTranscript-fail-4.html b/test/testfiles/common/aLinksToMultiMediaRequireTranscript-fail-4.html new file mode 100644 index 000000000..38d330493 --- /dev/null +++ b/test/testfiles/common/aLinksToMultiMediaRequireTranscript-fail-4.html @@ -0,0 +1,24 @@ + + + + + aLinksToMultiMediaRequireTranscript-fail-4 + + + + +

        View the movie.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksToMultiMediaRequireTranscript-fail-5.html b/test/testfiles/common/aLinksToMultiMediaRequireTranscript-fail-5.html new file mode 100644 index 000000000..14ee0a655 --- /dev/null +++ b/test/testfiles/common/aLinksToMultiMediaRequireTranscript-fail-5.html @@ -0,0 +1,24 @@ + + + + + aLinksToMultiMediaRequireTranscript-fail-5 + + + + +

        View the movie.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksToMultiMediaRequireTranscript-fail.html b/test/testfiles/common/aLinksToMultiMediaRequireTranscript-fail.html new file mode 100644 index 000000000..0247b1ba2 --- /dev/null +++ b/test/testfiles/common/aLinksToMultiMediaRequireTranscript-fail.html @@ -0,0 +1,24 @@ + + + + + aLinksToMultiMediaRequireTranscript-fail + + + + +

        View the movie.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksToMultiMediaRequireTranscript-pass.html b/test/testfiles/common/aLinksToMultiMediaRequireTranscript-pass.html new file mode 100644 index 000000000..2c2d3f0a8 --- /dev/null +++ b/test/testfiles/common/aLinksToMultiMediaRequireTranscript-pass.html @@ -0,0 +1,24 @@ + + + + + aLinksToMultiMediaRequireTranscript-pass + + + + +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-10.html b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-10.html new file mode 100644 index 000000000..f0a0a26ba --- /dev/null +++ b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-10.html @@ -0,0 +1,25 @@ + + + + + aLinksToSoundFilesNeedTranscripts-fail-10 + + + + +

        Listen to Carol talking about dogs.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-11.html b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-11.html new file mode 100644 index 000000000..8384055c7 --- /dev/null +++ b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-11.html @@ -0,0 +1,25 @@ + + + + + aLinksToSoundFilesNeedTranscripts-fail-11 + + + + +

        Listen to Carol talking about dogs.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-12.html b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-12.html new file mode 100644 index 000000000..5aa111d98 --- /dev/null +++ b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-12.html @@ -0,0 +1,25 @@ + + + + + aLinksToSoundFilesNeedTranscripts-fail-12 + + + + +

        Listen to Carol talking about dogs.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-2.html b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-2.html new file mode 100644 index 000000000..665d82640 --- /dev/null +++ b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-2.html @@ -0,0 +1,25 @@ + + + + + aLinksToSoundFilesNeedTranscripts-fail-2 + + + + +

        Listen to Carol talking about dogs.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-3.html b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-3.html new file mode 100644 index 000000000..8cba61c3b --- /dev/null +++ b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-3.html @@ -0,0 +1,25 @@ + + + + + aLinksToSoundFilesNeedTranscripts-fail-3 + + + + +

        Listen to Carol talking about dogs.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-4.html b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-4.html new file mode 100644 index 000000000..8566044ba --- /dev/null +++ b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-4.html @@ -0,0 +1,25 @@ + + + + + aLinksToSoundFilesNeedTranscripts-fail-4 + + + + +

        Listen to Carol talking about dogs.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-5.html b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-5.html new file mode 100644 index 000000000..58dbfb8ea --- /dev/null +++ b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-5.html @@ -0,0 +1,25 @@ + + + + + aLinksToSoundFilesNeedTranscripts-fail-5 + + + + +

        Read the text transcript of Carol's talk about dogs.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-6.html b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-6.html new file mode 100644 index 000000000..a3df03723 --- /dev/null +++ b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-6.html @@ -0,0 +1,25 @@ + + + + + aLinksToSoundFilesNeedTranscripts-fail-6 + + + + +

        Listen to Carol talking about dogs.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-7.html b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-7.html new file mode 100644 index 000000000..46e14c71a --- /dev/null +++ b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-7.html @@ -0,0 +1,25 @@ + + + + + aLinksToSoundFilesNeedTranscripts-fail-7 + + + + +

        Listen to Carol talking about dogs.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-8.html b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-8.html new file mode 100644 index 000000000..8fb2edc88 --- /dev/null +++ b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-8.html @@ -0,0 +1,25 @@ + + + + + aLinksToSoundFilesNeedTranscripts-fail-8 + + + + +

        Listen to Carol talking about dogs.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-9.html b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-9.html new file mode 100644 index 000000000..58d2f0ad2 --- /dev/null +++ b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail-9.html @@ -0,0 +1,25 @@ + + + + + aLinksToSoundFilesNeedTranscripts-fail-9 + + + + +

        Listen to Carol talking about dogs.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail.html b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail.html new file mode 100644 index 000000000..f36bf6a2c --- /dev/null +++ b/test/testfiles/common/aLinksToSoundFilesNeedTranscripts-fail.html @@ -0,0 +1,25 @@ + + + + + aLinksToSoundFilesNeedTranscripts-fail + + + + +

        Listen to Carol talking about dogs.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aMustContainText-fail-2.html b/test/testfiles/common/aMustContainText-fail-2.html new file mode 100644 index 000000000..c75cfde19 --- /dev/null +++ b/test/testfiles/common/aMustContainText-fail-2.html @@ -0,0 +1,25 @@ + + + + + aMustContainText-fail-2 + + + + +

        Select link for more information about dogs. +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aMustContainText-fail-3.html b/test/testfiles/common/aMustContainText-fail-3.html new file mode 100644 index 000000000..b6b21a411 --- /dev/null +++ b/test/testfiles/common/aMustContainText-fail-3.html @@ -0,0 +1,25 @@ + + + + + aMustContainText-fail-3 + + + + +

        This is a page with an anchor +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aMustContainText-fail.html b/test/testfiles/common/aMustContainText-fail.html new file mode 100644 index 000000000..3f89f7068 --- /dev/null +++ b/test/testfiles/common/aMustContainText-fail.html @@ -0,0 +1,25 @@ + + + + + aMustContainText-fail + + + + +

        For more information .

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aMustContainText-pass-2.html b/test/testfiles/common/aMustContainText-pass-2.html new file mode 100644 index 000000000..f77043f27 --- /dev/null +++ b/test/testfiles/common/aMustContainText-pass-2.html @@ -0,0 +1,25 @@ + + + + + aMustContainText-pass-2 + + + + +

        Select link for more information about dogs.more information about dogs +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aMustContainText-pass-3.html b/test/testfiles/common/aMustContainText-pass-3.html new file mode 100644 index 000000000..4280badf9 --- /dev/null +++ b/test/testfiles/common/aMustContainText-pass-3.html @@ -0,0 +1,25 @@ + + + + + aMustContainText-pass-3 + + + + +

        This is a page with an anchor +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aMustContainText-pass.html b/test/testfiles/common/aMustContainText-pass.html new file mode 100644 index 000000000..fde6c04db --- /dev/null +++ b/test/testfiles/common/aMustContainText-pass.html @@ -0,0 +1,25 @@ + + + + + aMustContainText-pass + + + + +

        Select link for more information about dogs.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aMustHaveTitle-fail.html b/test/testfiles/common/aMustHaveTitle-fail.html new file mode 100644 index 000000000..b4a6ddef1 --- /dev/null +++ b/test/testfiles/common/aMustHaveTitle-fail.html @@ -0,0 +1,25 @@ + + + + + aMustHaveTitle-fail + + + + +

        We have more information about dogs on our site.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aMustHaveTitle-pass.html b/test/testfiles/common/aMustHaveTitle-pass.html new file mode 100644 index 000000000..f384367d6 --- /dev/null +++ b/test/testfiles/common/aMustHaveTitle-pass.html @@ -0,0 +1,25 @@ + + + + + aMustHaveTitle-pass + + + + +

        We have information about dogs on + our site.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aMustNotHaveJavascriptHref-fail.html b/test/testfiles/common/aMustNotHaveJavascriptHref-fail.html new file mode 100644 index 000000000..5ded36134 --- /dev/null +++ b/test/testfiles/common/aMustNotHaveJavascriptHref-fail.html @@ -0,0 +1,26 @@ + + + + + aMustNotHaveJavascriptHref-fail + + + + +Scripted link + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aMustNotHaveJavascriptHref-pass.html b/test/testfiles/common/aMustNotHaveJavascriptHref-pass.html new file mode 100644 index 000000000..c1d816271 --- /dev/null +++ b/test/testfiles/common/aMustNotHaveJavascriptHref-pass.html @@ -0,0 +1,26 @@ + + + + + aMustNotHaveJavascriptHref-pass + + + + +Scripted link with fallback + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aSuspiciousLinkText-fail-2.html b/test/testfiles/common/aSuspiciousLinkText-fail-2.html new file mode 100644 index 000000000..1d83ce5d6 --- /dev/null +++ b/test/testfiles/common/aSuspiciousLinkText-fail-2.html @@ -0,0 +1,27 @@ + + + + + aSuspiciousLinkText-fail-2 + + + + +

        This is the introduction to a news story about recent spending by our + government. +read more +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aSuspiciousLinkText-fail-3.html b/test/testfiles/common/aSuspiciousLinkText-fail-3.html new file mode 100644 index 000000000..0919560b7 --- /dev/null +++ b/test/testfiles/common/aSuspiciousLinkText-fail-3.html @@ -0,0 +1,26 @@ + + + + + aSuspiciousLinkText-fail-3 + + + + +

        This is the introduction to a news story about recent spending by our + government.image +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aSuspiciousLinkText-fail.html b/test/testfiles/common/aSuspiciousLinkText-fail.html new file mode 100644 index 000000000..129ccd979 --- /dev/null +++ b/test/testfiles/common/aSuspiciousLinkText-fail.html @@ -0,0 +1,25 @@ + + + + + aSuspiciousLinkText-fail + + + + +

        For more information about dogs, click here.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aSuspiciousLinkText-pass-2.html b/test/testfiles/common/aSuspiciousLinkText-pass-2.html new file mode 100644 index 000000000..55f5fea0d --- /dev/null +++ b/test/testfiles/common/aSuspiciousLinkText-pass-2.html @@ -0,0 +1,26 @@ + + + + + aSuspiciousLinkText-pass-2 + + + + +

        This is the introduction to a news story about recent spending by our + government.government spending +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aSuspiciousLinkText-pass-3.html b/test/testfiles/common/aSuspiciousLinkText-pass-3.html new file mode 100644 index 000000000..6d988147b --- /dev/null +++ b/test/testfiles/common/aSuspiciousLinkText-pass-3.html @@ -0,0 +1,26 @@ + + + + + aSuspiciousLinkText-pass-3 + + + + +

        This is the introduction to a news story about recent spending by our + government.read more +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aSuspiciousLinkText-pass.html b/test/testfiles/common/aSuspiciousLinkText-pass.html new file mode 100644 index 000000000..6dcac85b5 --- /dev/null +++ b/test/testfiles/common/aSuspiciousLinkText-pass.html @@ -0,0 +1,25 @@ + + + + + aSuspiciousLinkText-pass + + + + +

        Here is a link to information about dogs.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aTitleDescribesDestination-fail.html b/test/testfiles/common/aTitleDescribesDestination-fail.html new file mode 100644 index 000000000..b57738313 --- /dev/null +++ b/test/testfiles/common/aTitleDescribesDestination-fail.html @@ -0,0 +1,25 @@ + + + + + aTitleDescribesDestination-fail + + + + +

        We have more information about dogs on + our site.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/aTitleDescribesDestination-pass.html b/test/testfiles/common/aTitleDescribesDestination-pass.html new file mode 100644 index 000000000..c52639212 --- /dev/null +++ b/test/testfiles/common/aTitleDescribesDestination-pass.html @@ -0,0 +1,25 @@ + + + + + aTitleDescribesDestination-pass + + + + +

        We have information about dogs on + our site.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/addressForAuthor-fail.html b/test/testfiles/common/addressForAuthor-fail.html new file mode 100644 index 000000000..1491e64f0 --- /dev/null +++ b/test/testfiles/common/addressForAuthor-fail.html @@ -0,0 +1,23 @@ + + + + + addressForAuthor-fail + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/addressForAuthor-pass.html b/test/testfiles/common/addressForAuthor-pass.html new file mode 100644 index 000000000..31542a0f0 --- /dev/null +++ b/test/testfiles/common/addressForAuthor-pass.html @@ -0,0 +1,26 @@ + + + + + addressForAuthor-pass + + + + +
        joe smith
        + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/addressForAuthorMustBeValid-fail.html b/test/testfiles/common/addressForAuthorMustBeValid-fail.html new file mode 100644 index 000000000..cfa80b65d --- /dev/null +++ b/test/testfiles/common/addressForAuthorMustBeValid-fail.html @@ -0,0 +1,26 @@ + + + + + addressForAuthorMustBeValid-fail + + + + +
        joe smith
        + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/addressForAuthorMustBeValid-pass.html b/test/testfiles/common/addressForAuthorMustBeValid-pass.html new file mode 100644 index 000000000..57042c4e4 --- /dev/null +++ b/test/testfiles/common/addressForAuthorMustBeValid-pass.html @@ -0,0 +1,26 @@ + + + + + addressForAuthorMustBeValid-pass + + + + +
        joe smith
        + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/appletContainsTextEquivalent-fail.html b/test/testfiles/common/appletContainsTextEquivalent-fail.html new file mode 100644 index 000000000..07d7ab80c --- /dev/null +++ b/test/testfiles/common/appletContainsTextEquivalent-fail.html @@ -0,0 +1,28 @@ + + + + appletContainsTextEquivalent-fail + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/appletContainsTextEquivalent-pass.html b/test/testfiles/common/appletContainsTextEquivalent-pass.html new file mode 100644 index 000000000..66103d588 --- /dev/null +++ b/test/testfiles/common/appletContainsTextEquivalent-pass.html @@ -0,0 +1,30 @@ + + + + appletContainsTextEquivalent-pass + + + + + + We are testing your Java version. + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/appletContainsTextEquivalentInAlt-fail-2.html b/test/testfiles/common/appletContainsTextEquivalentInAlt-fail-2.html new file mode 100644 index 000000000..cbe50392d --- /dev/null +++ b/test/testfiles/common/appletContainsTextEquivalentInAlt-fail-2.html @@ -0,0 +1,29 @@ + + + + + appletContainsTextEquivalentInAlt-fail-2 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/appletContainsTextEquivalentInAlt-fail.html b/test/testfiles/common/appletContainsTextEquivalentInAlt-fail.html new file mode 100644 index 000000000..17c892486 --- /dev/null +++ b/test/testfiles/common/appletContainsTextEquivalentInAlt-fail.html @@ -0,0 +1,29 @@ + + + + + appletContainsTextEquivalentInAlt-fail + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/appletContainsTextEquivalentInAlt-pass.html b/test/testfiles/common/appletContainsTextEquivalentInAlt-pass.html new file mode 100644 index 000000000..8784064ea --- /dev/null +++ b/test/testfiles/common/appletContainsTextEquivalentInAlt-pass.html @@ -0,0 +1,29 @@ + + + + + appletContainsTextEquivalentInAlt-pass + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/appletProvidesMechanismToReturnToParent-fail-2.html b/test/testfiles/common/appletProvidesMechanismToReturnToParent-fail-2.html new file mode 100644 index 000000000..8c59c16ba --- /dev/null +++ b/test/testfiles/common/appletProvidesMechanismToReturnToParent-fail-2.html @@ -0,0 +1,30 @@ + + + + + appletProvidesMechanismToReturnToParent-fail-2 + + + + +

        The following applet is not working. This is just an example.

        + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/appletProvidesMechanismToReturnToParent-fail.html b/test/testfiles/common/appletProvidesMechanismToReturnToParent-fail.html new file mode 100644 index 000000000..8b0c6015b --- /dev/null +++ b/test/testfiles/common/appletProvidesMechanismToReturnToParent-fail.html @@ -0,0 +1,30 @@ + + + + + appletProvidesMechanismToReturnToParent-fail + + + + +

        The following applet is not working. This is just an example.

        + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/appletTextEquivalentsGetUpdated-fail.html b/test/testfiles/common/appletTextEquivalentsGetUpdated-fail.html new file mode 100644 index 000000000..b696eebdf --- /dev/null +++ b/test/testfiles/common/appletTextEquivalentsGetUpdated-fail.html @@ -0,0 +1,29 @@ + + + + + appletTextEquivalentsGetUpdated-fail + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/appletTextEquivalentsGetUpdated-pass.html b/test/testfiles/common/appletTextEquivalentsGetUpdated-pass.html new file mode 100644 index 000000000..9ca4d2c25 --- /dev/null +++ b/test/testfiles/common/appletTextEquivalentsGetUpdated-pass.html @@ -0,0 +1,23 @@ + + + + + appletTextEquivalentsGetUpdated-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/appletUIMustBeAccessible-fail.html b/test/testfiles/common/appletUIMustBeAccessible-fail.html new file mode 100644 index 000000000..08e151aa7 --- /dev/null +++ b/test/testfiles/common/appletUIMustBeAccessible-fail.html @@ -0,0 +1,29 @@ + + + + + appletUIMustBeAccessible-fail + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/appletUIMustBeAccessible-pass.html b/test/testfiles/common/appletUIMustBeAccessible-pass.html new file mode 100644 index 000000000..f07709cf0 --- /dev/null +++ b/test/testfiles/common/appletUIMustBeAccessible-pass.html @@ -0,0 +1,24 @@ + + + + + appletUIMustBeAccessible-pass + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/appletsDoNotFlicker-fail-2.html b/test/testfiles/common/appletsDoNotFlicker-fail-2.html new file mode 100644 index 000000000..9c4401ce1 --- /dev/null +++ b/test/testfiles/common/appletsDoNotFlicker-fail-2.html @@ -0,0 +1,32 @@ + + + + + + + appletsDoNotFlicker-fail-2 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/appletsDoNotFlicker-fail.html b/test/testfiles/common/appletsDoNotFlicker-fail.html new file mode 100644 index 000000000..b316866af --- /dev/null +++ b/test/testfiles/common/appletsDoNotFlicker-fail.html @@ -0,0 +1,29 @@ + + + + + appletsDoNotFlicker-fail + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/appletsDoneUseColorAlone-fail.html b/test/testfiles/common/appletsDoneUseColorAlone-fail.html new file mode 100644 index 000000000..1538b1ff8 --- /dev/null +++ b/test/testfiles/common/appletsDoneUseColorAlone-fail.html @@ -0,0 +1,29 @@ + + + + + appletsDoneUseColorAlone-fail + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/appletsDoneUseColorAlone-pass.html b/test/testfiles/common/appletsDoneUseColorAlone-pass.html new file mode 100644 index 000000000..189cdeb70 --- /dev/null +++ b/test/testfiles/common/appletsDoneUseColorAlone-pass.html @@ -0,0 +1,23 @@ + + + + + appletsDoneUseColorAlone-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/areaAltIdentifiesDestination-fail-2.html b/test/testfiles/common/areaAltIdentifiesDestination-fail-2.html new file mode 100644 index 000000000..4d08b63e4 --- /dev/null +++ b/test/testfiles/common/areaAltIdentifiesDestination-fail-2.html @@ -0,0 +1,33 @@ + + + + + areaAltIdentifiesDestination-fail-2 + + + + +

        + Image map of areas in the library +

        +

        + + reference section + +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/areaAltIdentifiesDestination-fail.html b/test/testfiles/common/areaAltIdentifiesDestination-fail.html new file mode 100644 index 000000000..595049fc8 --- /dev/null +++ b/test/testfiles/common/areaAltIdentifiesDestination-fail.html @@ -0,0 +1,33 @@ + + + + + areaAltIdentifiesDestination-fail + + + + +

        + Image map of areas in the library +

        +

        + + drawing of a blue book + +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/areaAltRefersToText-fail-2.html b/test/testfiles/common/areaAltRefersToText-fail-2.html new file mode 100644 index 000000000..fcc483bb9 --- /dev/null +++ b/test/testfiles/common/areaAltRefersToText-fail-2.html @@ -0,0 +1,35 @@ + + + + + areaAltRefersToText-fail-2 + + + + +

        + Image map of areas in the library +

        +

        + + Reference + Audio Visual Lab + +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/areaAltRefersToText-fail.html b/test/testfiles/common/areaAltRefersToText-fail.html new file mode 100644 index 000000000..cc03a4a91 --- /dev/null +++ b/test/testfiles/common/areaAltRefersToText-fail.html @@ -0,0 +1,34 @@ + + + + + areaAltRefersToText-fail + + + + +

        + Image map of areas in the library +

        +

        + + Reference + Lab + +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/areaDontOpenNewWindow-fail.html b/test/testfiles/common/areaDontOpenNewWindow-fail.html new file mode 100644 index 000000000..2a7816cec --- /dev/null +++ b/test/testfiles/common/areaDontOpenNewWindow-fail.html @@ -0,0 +1,27 @@ + + + + + areaDontOpenNewWindow-fail + + + + + + hello + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/areaDontOpenNewWindow-pass-2.html b/test/testfiles/common/areaDontOpenNewWindow-pass-2.html new file mode 100644 index 000000000..cde37ed27 --- /dev/null +++ b/test/testfiles/common/areaDontOpenNewWindow-pass-2.html @@ -0,0 +1,27 @@ + + + + + areaDontOpenNewWindow-pass-2 + + + + + + reference section + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/areaDontOpenNewWindow-pass-3.html b/test/testfiles/common/areaDontOpenNewWindow-pass-3.html new file mode 100644 index 000000000..7931476db --- /dev/null +++ b/test/testfiles/common/areaDontOpenNewWindow-pass-3.html @@ -0,0 +1,27 @@ + + + + + areaDontOpenNewWindow-pass-3 + + + + + + reference section + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/areaDontOpenNewWindow-pass.html b/test/testfiles/common/areaDontOpenNewWindow-pass.html new file mode 100644 index 000000000..ef40b5420 --- /dev/null +++ b/test/testfiles/common/areaDontOpenNewWindow-pass.html @@ -0,0 +1,27 @@ + + + + + areaDontOpenNewWindow-pass + + + + + + reference section + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/areaHasAltValue-fail.html b/test/testfiles/common/areaHasAltValue-fail.html new file mode 100644 index 000000000..e29dbfac6 --- /dev/null +++ b/test/testfiles/common/areaHasAltValue-fail.html @@ -0,0 +1,28 @@ + + + + + areaHasAltValue-fail + + + + +

        + + + +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/areaHasAltValue-pass.html b/test/testfiles/common/areaHasAltValue-pass.html new file mode 100644 index 000000000..2ce077f0d --- /dev/null +++ b/test/testfiles/common/areaHasAltValue-pass.html @@ -0,0 +1,29 @@ + + + + + areaHasAltValue-pass + + + + +

        + + reference section + +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/areaLinksToSoundFile-fail-10.html b/test/testfiles/common/areaLinksToSoundFile-fail-10.html new file mode 100644 index 000000000..082ad3095 --- /dev/null +++ b/test/testfiles/common/areaLinksToSoundFile-fail-10.html @@ -0,0 +1,26 @@ + + + + + areaLinksToSoundFile-fail-10 + + + + + + hello + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/areaLinksToSoundFile-fail-11.html b/test/testfiles/common/areaLinksToSoundFile-fail-11.html new file mode 100644 index 000000000..119a37ce8 --- /dev/null +++ b/test/testfiles/common/areaLinksToSoundFile-fail-11.html @@ -0,0 +1,26 @@ + + + + + areaLinksToSoundFile-fail-11 + + + + + + hello + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/areaLinksToSoundFile-fail-12.html b/test/testfiles/common/areaLinksToSoundFile-fail-12.html new file mode 100644 index 000000000..5aeb74b89 --- /dev/null +++ b/test/testfiles/common/areaLinksToSoundFile-fail-12.html @@ -0,0 +1,26 @@ + + + + + areaLinksToSoundFile-fail-12 + + + + + + hello + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/areaLinksToSoundFile-fail-2.html b/test/testfiles/common/areaLinksToSoundFile-fail-2.html new file mode 100644 index 000000000..ec9194da2 --- /dev/null +++ b/test/testfiles/common/areaLinksToSoundFile-fail-2.html @@ -0,0 +1,37 @@ + + + + + areaLinksToSoundFile-fail-2 + + + + +

        + Image map of areas in the library +

        +

        + + Reference + Audio Visual Lab + +

        +

        Audio Visual Lab Text Transcript +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/areaLinksToSoundFile-fail-3.html b/test/testfiles/common/areaLinksToSoundFile-fail-3.html new file mode 100644 index 000000000..f76c6d0ba --- /dev/null +++ b/test/testfiles/common/areaLinksToSoundFile-fail-3.html @@ -0,0 +1,26 @@ + + + + + areaLinksToSoundFile-fail-3 + + + + + + hello + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/areaLinksToSoundFile-fail-4.html b/test/testfiles/common/areaLinksToSoundFile-fail-4.html new file mode 100644 index 000000000..39d79b615 --- /dev/null +++ b/test/testfiles/common/areaLinksToSoundFile-fail-4.html @@ -0,0 +1,26 @@ + + + + + areaLinksToSoundFile-fail-4 + + + + + + hello + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/areaLinksToSoundFile-fail-5.html b/test/testfiles/common/areaLinksToSoundFile-fail-5.html new file mode 100644 index 000000000..33d84e2cb --- /dev/null +++ b/test/testfiles/common/areaLinksToSoundFile-fail-5.html @@ -0,0 +1,26 @@ + + + + + areaLinksToSoundFile-fail-5 + + + + + + hello + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/areaLinksToSoundFile-fail-6.html b/test/testfiles/common/areaLinksToSoundFile-fail-6.html new file mode 100644 index 000000000..8375d4321 --- /dev/null +++ b/test/testfiles/common/areaLinksToSoundFile-fail-6.html @@ -0,0 +1,26 @@ + + + + + areaLinksToSoundFile-fail-6 + + + + + + hello + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/areaLinksToSoundFile-fail-7.html b/test/testfiles/common/areaLinksToSoundFile-fail-7.html new file mode 100644 index 000000000..bfc123890 --- /dev/null +++ b/test/testfiles/common/areaLinksToSoundFile-fail-7.html @@ -0,0 +1,26 @@ + + + + + areaLinksToSoundFile-fail-7 + + + + + + hello + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/areaLinksToSoundFile-fail-8.html b/test/testfiles/common/areaLinksToSoundFile-fail-8.html new file mode 100644 index 000000000..613b58abc --- /dev/null +++ b/test/testfiles/common/areaLinksToSoundFile-fail-8.html @@ -0,0 +1,26 @@ + + + + + areaLinksToSoundFile-fail-8 + + + + + + hello + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/areaLinksToSoundFile-fail-9.html b/test/testfiles/common/areaLinksToSoundFile-fail-9.html new file mode 100644 index 000000000..482bb4a1b --- /dev/null +++ b/test/testfiles/common/areaLinksToSoundFile-fail-9.html @@ -0,0 +1,26 @@ + + + + + areaLinksToSoundFile-fail-9 + + + + + + hello + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/areaLinksToSoundFile-fail.html b/test/testfiles/common/areaLinksToSoundFile-fail.html new file mode 100644 index 000000000..6594ca40b --- /dev/null +++ b/test/testfiles/common/areaLinksToSoundFile-fail.html @@ -0,0 +1,35 @@ + + + + + areaLinksToSoundFile-fail + + + + +

        + Image map of areas in the library +

        +

        + + Reference + Audio Visual Lab + +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/basefontIsNotUsed-fail.html b/test/testfiles/common/basefontIsNotUsed-fail.html new file mode 100644 index 000000000..430d2f008 --- /dev/null +++ b/test/testfiles/common/basefontIsNotUsed-fail.html @@ -0,0 +1,24 @@ + + + + + basefontIsNotUsed-fail + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/basefontIsNotUsed-pass.html b/test/testfiles/common/basefontIsNotUsed-pass.html new file mode 100644 index 000000000..969025c30 --- /dev/null +++ b/test/testfiles/common/basefontIsNotUsed-pass.html @@ -0,0 +1,23 @@ + + + + + basefontIsNotUsed-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/blinkIsNotUsed-fail.html b/test/testfiles/common/blinkIsNotUsed-fail.html new file mode 100644 index 000000000..0c6470c72 --- /dev/null +++ b/test/testfiles/common/blinkIsNotUsed-fail.html @@ -0,0 +1,24 @@ + + + + + blinkIsNotUsed-fail + + + + + blinks + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/blinkIsNotUsed-pass.html b/test/testfiles/common/blinkIsNotUsed-pass.html new file mode 100644 index 000000000..c1af807af --- /dev/null +++ b/test/testfiles/common/blinkIsNotUsed-pass.html @@ -0,0 +1,23 @@ + + + + + blinkIsNotUsed-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/blockquoteNotUsedForIndentation-fail.html b/test/testfiles/common/blockquoteNotUsedForIndentation-fail.html new file mode 100644 index 000000000..b79f28605 --- /dev/null +++ b/test/testfiles/common/blockquoteNotUsedForIndentation-fail.html @@ -0,0 +1,25 @@ + + + + + blockquoteNotUsedForIndentation-fail + + + + +
        If I have any sins to confess, I will tell them to my priest.
        . + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/blockquoteNotUsedForIndentation-pass.html b/test/testfiles/common/blockquoteNotUsedForIndentation-pass.html new file mode 100644 index 000000000..5ec28f977 --- /dev/null +++ b/test/testfiles/common/blockquoteNotUsedForIndentation-pass.html @@ -0,0 +1,25 @@ + + + + + blockquoteNotUsedForIndentation-pass + + + + +
        If I have any sins to confess, I will tell them to my priest.
        . + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/blockquoteUseForQuotations-fail.html b/test/testfiles/common/blockquoteUseForQuotations-fail.html new file mode 100644 index 000000000..3665da55f --- /dev/null +++ b/test/testfiles/common/blockquoteUseForQuotations-fail.html @@ -0,0 +1,32 @@ + + + + + blockquoteUseForQuotations-fail + + + + +

        The following is an excerpt from the The Story of my Life by Helen Keller

        +

        "Even in the days before my teacher came, I used to feel along the square + stiff boxwood hedges, and, guided by the sense of smell, would find the + first violets and lilies. There, too, after a fit of temper, I went to + find comfort and to hide my hot face in the cool leaves and grass."

        +

        Helen Keller said, Self-pity is our worst enemy and if we yield to it, + we can never do anything good in the world.

        +

        Beth received 1st place in the 9th grade science competition.

        +

        The chemical notation for water is H2O.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/blockquoteUseForQuotations-pass.html b/test/testfiles/common/blockquoteUseForQuotations-pass.html new file mode 100644 index 000000000..5dec43fd3 --- /dev/null +++ b/test/testfiles/common/blockquoteUseForQuotations-pass.html @@ -0,0 +1,37 @@ + + + + + blockquoteUseForQuotations-pass + + + + +

        The following is an excerpt from the The Story of my Life by + Helen Keller

        +
        +

        Even in the days before my teacher came, I used to feel along the square + stiff boxwood hedges, and, guided by the sense of smell, would find the + first violets and lilies. There, too, after a fit of temper, I went to + find comfort and to hide my hot face in the cool leaves and grass.

        +
        +

        Helen Keller said, Self-pity is our worst enemy and if we yield to it, +we can never do anything good in the world. +

        +

        Beth received 1st place in the 9th grade science competition.

        +

        The chemical notation for water is H2O.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/bodyActiveLinkColorContrast-fail.html b/test/testfiles/common/bodyActiveLinkColorContrast-fail.html new file mode 100644 index 000000000..544aadad6 --- /dev/null +++ b/test/testfiles/common/bodyActiveLinkColorContrast-fail.html @@ -0,0 +1,25 @@ + + + + + bodyActiveLinkColorContrast-fail + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/bodyActiveLinkColorContrast-pass-2.html b/test/testfiles/common/bodyActiveLinkColorContrast-pass-2.html new file mode 100644 index 000000000..ed369440a --- /dev/null +++ b/test/testfiles/common/bodyActiveLinkColorContrast-pass-2.html @@ -0,0 +1,25 @@ + + + + + bodyActiveLinkColorContrast-pass-2 + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/bodyActiveLinkColorContrast-pass.html b/test/testfiles/common/bodyActiveLinkColorContrast-pass.html new file mode 100644 index 000000000..7fdcb0f16 --- /dev/null +++ b/test/testfiles/common/bodyActiveLinkColorContrast-pass.html @@ -0,0 +1,25 @@ + + + + + bodyActiveLinkColorContrast-pass + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/bodyColorContrast-fail.html b/test/testfiles/common/bodyColorContrast-fail.html new file mode 100644 index 000000000..4d9076e5e --- /dev/null +++ b/test/testfiles/common/bodyColorContrast-fail.html @@ -0,0 +1,24 @@ + + + + + bodyColorContrast-fail + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/bodyColorContrast-pass-2.html b/test/testfiles/common/bodyColorContrast-pass-2.html new file mode 100644 index 000000000..987ee7e28 --- /dev/null +++ b/test/testfiles/common/bodyColorContrast-pass-2.html @@ -0,0 +1,26 @@ + + + + + bodyColorContrast-pass-2 + + + + +
        +

        This is some example text.

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/bodyColorContrast-pass.html b/test/testfiles/common/bodyColorContrast-pass.html new file mode 100644 index 000000000..eac1d89f1 --- /dev/null +++ b/test/testfiles/common/bodyColorContrast-pass.html @@ -0,0 +1,26 @@ + + + + + bodyColorContrast-pass + + + + +
        +

        This is some example text.

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/bodyLinkColorContrast-fail.html b/test/testfiles/common/bodyLinkColorContrast-fail.html new file mode 100644 index 000000000..cb4aa3f22 --- /dev/null +++ b/test/testfiles/common/bodyLinkColorContrast-fail.html @@ -0,0 +1,25 @@ + + + + + bodyLinkColorContrast-fail + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/bodyLinkColorContrast-pass-2.html b/test/testfiles/common/bodyLinkColorContrast-pass-2.html new file mode 100644 index 000000000..4261637ee --- /dev/null +++ b/test/testfiles/common/bodyLinkColorContrast-pass-2.html @@ -0,0 +1,25 @@ + + + + + bodyLinkColorContrast-pass-2 + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/bodyLinkColorContrast-pass.html b/test/testfiles/common/bodyLinkColorContrast-pass.html new file mode 100644 index 000000000..2512bb2ac --- /dev/null +++ b/test/testfiles/common/bodyLinkColorContrast-pass.html @@ -0,0 +1,25 @@ + + + + + bodyLinkColorContrast-pass + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/bodyMustNotHaveBackground-fail.html b/test/testfiles/common/bodyMustNotHaveBackground-fail.html new file mode 100644 index 000000000..29fe4b735 --- /dev/null +++ b/test/testfiles/common/bodyMustNotHaveBackground-fail.html @@ -0,0 +1,23 @@ + + + + + bodyMustNotHaveBackground-fail + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/bodyMustNotHaveBackground-pass.html b/test/testfiles/common/bodyMustNotHaveBackground-pass.html new file mode 100644 index 000000000..01edfc9ee --- /dev/null +++ b/test/testfiles/common/bodyMustNotHaveBackground-pass.html @@ -0,0 +1,23 @@ + + + + + bodyMustNotHaveBackground-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/bodyVisitedLinkColorContrast-fail.html b/test/testfiles/common/bodyVisitedLinkColorContrast-fail.html new file mode 100644 index 000000000..6e34687c9 --- /dev/null +++ b/test/testfiles/common/bodyVisitedLinkColorContrast-fail.html @@ -0,0 +1,25 @@ + + + + + bodyVisitedLinkColorContrast-fail + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/bodyVisitedLinkColorContrast-pass-2.html b/test/testfiles/common/bodyVisitedLinkColorContrast-pass-2.html new file mode 100644 index 000000000..afd4a769b --- /dev/null +++ b/test/testfiles/common/bodyVisitedLinkColorContrast-pass-2.html @@ -0,0 +1,25 @@ + + + + + bodyVisitedLinkColorContrast-pass-2 + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/bodyVisitedLinkColorContrast-pass.html b/test/testfiles/common/bodyVisitedLinkColorContrast-pass.html new file mode 100644 index 000000000..3542325fe --- /dev/null +++ b/test/testfiles/common/bodyVisitedLinkColorContrast-pass.html @@ -0,0 +1,25 @@ + + + + + bodyVisitedLinkColorContrast-pass + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/boldIsNotUsed-fail.html b/test/testfiles/common/boldIsNotUsed-fail.html new file mode 100644 index 000000000..e719a97ac --- /dev/null +++ b/test/testfiles/common/boldIsNotUsed-fail.html @@ -0,0 +1,26 @@ + + + + + boldIsNotUsed-fail + + + + +

        What she + reallymeant to say was, "This isn't ok, it is + excellent!"

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/boldIsNotUsed-pass.html b/test/testfiles/common/boldIsNotUsed-pass.html new file mode 100644 index 000000000..33973bdcd --- /dev/null +++ b/test/testfiles/common/boldIsNotUsed-pass.html @@ -0,0 +1,25 @@ + + + + + boldIsNotUsed-pass + + + + +

        What she really meant to say was, "This isn't ok, it is excellent!"

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/checkboxHasLabel-fail-2.html b/test/testfiles/common/checkboxHasLabel-fail-2.html new file mode 100644 index 000000000..00e1a284c --- /dev/null +++ b/test/testfiles/common/checkboxHasLabel-fail-2.html @@ -0,0 +1,28 @@ + + + + + checkboxHasLabel-fail-2 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/checkboxHasLabel-fail-3.html b/test/testfiles/common/checkboxHasLabel-fail-3.html new file mode 100644 index 000000000..f07de39a3 --- /dev/null +++ b/test/testfiles/common/checkboxHasLabel-fail-3.html @@ -0,0 +1,28 @@ + + + + + checkboxHasLabel-fail-3 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/checkboxHasLabel-fail-4.html b/test/testfiles/common/checkboxHasLabel-fail-4.html new file mode 100644 index 000000000..527344792 --- /dev/null +++ b/test/testfiles/common/checkboxHasLabel-fail-4.html @@ -0,0 +1,30 @@ + + + + + checkboxHasLabel-fail-4 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/checkboxHasLabel-fail.html b/test/testfiles/common/checkboxHasLabel-fail.html new file mode 100644 index 000000000..400e1489c --- /dev/null +++ b/test/testfiles/common/checkboxHasLabel-fail.html @@ -0,0 +1,29 @@ + + + + + checkboxHasLabel-fail + + + + +
        +

        + + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/checkboxHasLabel-pass-2.html b/test/testfiles/common/checkboxHasLabel-pass-2.html new file mode 100644 index 000000000..5997bdaa6 --- /dev/null +++ b/test/testfiles/common/checkboxHasLabel-pass-2.html @@ -0,0 +1,30 @@ + + + + + checkboxHasLabel-pass-2 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/checkboxHasLabel-pass.html b/test/testfiles/common/checkboxHasLabel-pass.html new file mode 100644 index 000000000..43ddab4b2 --- /dev/null +++ b/test/testfiles/common/checkboxHasLabel-pass.html @@ -0,0 +1,30 @@ + + + + + checkboxHasLabel-pass + + + + +
        +

        + + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/checkboxLabelIsNearby-fail.html b/test/testfiles/common/checkboxLabelIsNearby-fail.html new file mode 100644 index 000000000..3cb77a719 --- /dev/null +++ b/test/testfiles/common/checkboxLabelIsNearby-fail.html @@ -0,0 +1,52 @@ + + + + + checkboxLabelIsNearby-fail + + + + +

        Select your animals using the form below:

        +
        + + + + + + + + + + + + + + + + +
        + + dog
        + + cat
        + + polar bear
        + +
        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/checkboxLabelIsNearby-pass.html b/test/testfiles/common/checkboxLabelIsNearby-pass.html new file mode 100644 index 000000000..e18e9feb5 --- /dev/null +++ b/test/testfiles/common/checkboxLabelIsNearby-pass.html @@ -0,0 +1,52 @@ + + + + + checkboxLabelIsNearby-pass + + + + +

        Select your animals using the form below:

        +
        + + + + + + + + + + + + + + + + +
        + + dog
        + + cat
        + + polar bear
        + +
        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/cssDocumentMakesSenseStyleTurnedOff-fail.html b/test/testfiles/common/cssDocumentMakesSenseStyleTurnedOff-fail.html new file mode 100644 index 000000000..20e1a1f39 --- /dev/null +++ b/test/testfiles/common/cssDocumentMakesSenseStyleTurnedOff-fail.html @@ -0,0 +1,24 @@ + + + + + cssDocumentMakesSenseStyleTurnedOff-fail + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/cssDocumentMakesSenseStyleTurnedOff-pass.html b/test/testfiles/common/cssDocumentMakesSenseStyleTurnedOff-pass.html new file mode 100644 index 000000000..7b7af259b --- /dev/null +++ b/test/testfiles/common/cssDocumentMakesSenseStyleTurnedOff-pass.html @@ -0,0 +1,29 @@ + + + + + cssDocumentMakesSenseStyleTurnedOff-pass + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/doctypeProvided-fail.html b/test/testfiles/common/doctypeProvided-fail.html new file mode 100644 index 000000000..ef6123ffd --- /dev/null +++ b/test/testfiles/common/doctypeProvided-fail.html @@ -0,0 +1,23 @@ + + + + doctypeProvided-fail + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/doctypeProvided-pass.html b/test/testfiles/common/doctypeProvided-pass.html new file mode 100644 index 000000000..84a989163 --- /dev/null +++ b/test/testfiles/common/doctypeProvided-pass.html @@ -0,0 +1,23 @@ + + + + + doctypeProvided-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentAbbrIsUsed-fail.html b/test/testfiles/common/documentAbbrIsUsed-fail.html new file mode 100644 index 000000000..86b510601 --- /dev/null +++ b/test/testfiles/common/documentAbbrIsUsed-fail.html @@ -0,0 +1,30 @@ + + + + + documentAbbrIsUsed-fail + + + + +

        Everyone loves QUAIL.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentAbbrIsUsed-pass-2.html b/test/testfiles/common/documentAbbrIsUsed-pass-2.html new file mode 100644 index 000000000..0da973710 --- /dev/null +++ b/test/testfiles/common/documentAbbrIsUsed-pass-2.html @@ -0,0 +1,26 @@ + + + + + documentAbbrIsUsed-pass-2 + + + + +
        +

        Everyone loves QUAIL.

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentAbbrIsUsed-pass-3.html b/test/testfiles/common/documentAbbrIsUsed-pass-3.html new file mode 100644 index 000000000..c71616d46 --- /dev/null +++ b/test/testfiles/common/documentAbbrIsUsed-pass-3.html @@ -0,0 +1,26 @@ + + + + + documentAbbrIsUsed-pass-3 + + + + +
        +

        This might be A acronym.

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentAbbrIsUsed-pass.html b/test/testfiles/common/documentAbbrIsUsed-pass.html new file mode 100644 index 000000000..5cd792d3c --- /dev/null +++ b/test/testfiles/common/documentAbbrIsUsed-pass.html @@ -0,0 +1,26 @@ + + + + + documentAbbrIsUsed-pass + + + + +
        +

        hello

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentAcronymsHaveElement-fail.html b/test/testfiles/common/documentAcronymsHaveElement-fail.html new file mode 100644 index 000000000..b4fb96b50 --- /dev/null +++ b/test/testfiles/common/documentAcronymsHaveElement-fail.html @@ -0,0 +1,30 @@ + + + + + documentAcronymsHaveElement-fail + + + + +

        Everyone loves QUAIL.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentAcronymsHaveElement-pass.html b/test/testfiles/common/documentAcronymsHaveElement-pass.html new file mode 100644 index 000000000..fee0c7561 --- /dev/null +++ b/test/testfiles/common/documentAcronymsHaveElement-pass.html @@ -0,0 +1,26 @@ + + + + + documentAcronymsHaveElement-pass + + + + +
        +

        Hi this is a document with no acronyms.

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentAllColorsAreSet-fail.html b/test/testfiles/common/documentAllColorsAreSet-fail.html new file mode 100644 index 000000000..35bef9f93 --- /dev/null +++ b/test/testfiles/common/documentAllColorsAreSet-fail.html @@ -0,0 +1,24 @@ + + + + + documentAllColorsAreSet-fail + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentAllColorsAreSet-pass-2.html b/test/testfiles/common/documentAllColorsAreSet-pass-2.html new file mode 100644 index 000000000..ae20b8eae --- /dev/null +++ b/test/testfiles/common/documentAllColorsAreSet-pass-2.html @@ -0,0 +1,24 @@ + + + + + documentAllColorsAreSet-pass-2 + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentAllColorsAreSet-pass.html b/test/testfiles/common/documentAllColorsAreSet-pass.html new file mode 100644 index 000000000..e3f3833ce --- /dev/null +++ b/test/testfiles/common/documentAllColorsAreSet-pass.html @@ -0,0 +1,25 @@ + + + + + documentAllColorsAreSet-pass + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentAutoRedirectNotUsed-fail.html b/test/testfiles/common/documentAutoRedirectNotUsed-fail.html new file mode 100644 index 000000000..b8100d87f --- /dev/null +++ b/test/testfiles/common/documentAutoRedirectNotUsed-fail.html @@ -0,0 +1,24 @@ + + + + + documentAutoRedirectNotUsed-fail + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentAutoRedirectNotUsed-pass.html b/test/testfiles/common/documentAutoRedirectNotUsed-pass.html new file mode 100644 index 000000000..1c84562dc --- /dev/null +++ b/test/testfiles/common/documentAutoRedirectNotUsed-pass.html @@ -0,0 +1,23 @@ + + + + + documentAutoRedirectNotUsed-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentColorWaiActiveLinkAlgorithm-fail.html b/test/testfiles/common/documentColorWaiActiveLinkAlgorithm-fail.html new file mode 100644 index 000000000..b4ee49274 --- /dev/null +++ b/test/testfiles/common/documentColorWaiActiveLinkAlgorithm-fail.html @@ -0,0 +1,24 @@ + + + + + documentColorWaiActiveLinkAlgorithm-fail + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentColorWaiActiveLinkAlgorithm-pass-2.html b/test/testfiles/common/documentColorWaiActiveLinkAlgorithm-pass-2.html new file mode 100644 index 000000000..8039f19f1 --- /dev/null +++ b/test/testfiles/common/documentColorWaiActiveLinkAlgorithm-pass-2.html @@ -0,0 +1,24 @@ + + + + + documentColorWaiActiveLinkAlgorithm-pass-2 + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentColorWaiActiveLinkAlgorithm-pass.html b/test/testfiles/common/documentColorWaiActiveLinkAlgorithm-pass.html new file mode 100644 index 000000000..724c608de --- /dev/null +++ b/test/testfiles/common/documentColorWaiActiveLinkAlgorithm-pass.html @@ -0,0 +1,24 @@ + + + + + documentColorWaiActiveLinkAlgorithm-pass + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentColorWaiAlgorithm-fail.html b/test/testfiles/common/documentColorWaiAlgorithm-fail.html new file mode 100644 index 000000000..2e3c8e4cb --- /dev/null +++ b/test/testfiles/common/documentColorWaiAlgorithm-fail.html @@ -0,0 +1,24 @@ + + + + + documentColorWaiAlgorithm-fail + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentColorWaiAlgorithm-pass-2.html b/test/testfiles/common/documentColorWaiAlgorithm-pass-2.html new file mode 100644 index 000000000..96cdf475d --- /dev/null +++ b/test/testfiles/common/documentColorWaiAlgorithm-pass-2.html @@ -0,0 +1,26 @@ + + + + + documentColorWaiAlgorithm-pass-2 + + + + +
        +

        This is some example text.

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentColorWaiAlgorithm-pass.html b/test/testfiles/common/documentColorWaiAlgorithm-pass.html new file mode 100644 index 000000000..33913df76 --- /dev/null +++ b/test/testfiles/common/documentColorWaiAlgorithm-pass.html @@ -0,0 +1,26 @@ + + + + + documentColorWaiAlgorithm-pass + + + + +
        +

        This is some example text.

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentColorWaiLinkAlgorithm-fail.html b/test/testfiles/common/documentColorWaiLinkAlgorithm-fail.html new file mode 100644 index 000000000..03d9cfa79 --- /dev/null +++ b/test/testfiles/common/documentColorWaiLinkAlgorithm-fail.html @@ -0,0 +1,24 @@ + + + + + documentColorWaiLinkAlgorithm-fail + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentColorWaiLinkAlgorithm-pass-2.html b/test/testfiles/common/documentColorWaiLinkAlgorithm-pass-2.html new file mode 100644 index 000000000..c57f58300 --- /dev/null +++ b/test/testfiles/common/documentColorWaiLinkAlgorithm-pass-2.html @@ -0,0 +1,24 @@ + + + + + documentColorWaiLinkAlgorithm-pass-2 + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentColorWaiLinkAlgorithm-pass.html b/test/testfiles/common/documentColorWaiLinkAlgorithm-pass.html new file mode 100644 index 000000000..bc712990e --- /dev/null +++ b/test/testfiles/common/documentColorWaiLinkAlgorithm-pass.html @@ -0,0 +1,24 @@ + + + + + documentColorWaiLinkAlgorithm-pass + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentColorWaiVisitedLinkAlgorithm-fail.html b/test/testfiles/common/documentColorWaiVisitedLinkAlgorithm-fail.html new file mode 100644 index 000000000..44160424d --- /dev/null +++ b/test/testfiles/common/documentColorWaiVisitedLinkAlgorithm-fail.html @@ -0,0 +1,24 @@ + + + + + documentColorWaiVisitedLinkAlgorithm-fail + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentColorWaiVisitedLinkAlgorithm-pass-2.html b/test/testfiles/common/documentColorWaiVisitedLinkAlgorithm-pass-2.html new file mode 100644 index 000000000..fb28e2570 --- /dev/null +++ b/test/testfiles/common/documentColorWaiVisitedLinkAlgorithm-pass-2.html @@ -0,0 +1,24 @@ + + + + + documentColorWaiVisitedLinkAlgorithm-pass-2 + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentColorWaiVisitedLinkAlgorithm-pass.html b/test/testfiles/common/documentColorWaiVisitedLinkAlgorithm-pass.html new file mode 100644 index 000000000..678d08714 --- /dev/null +++ b/test/testfiles/common/documentColorWaiVisitedLinkAlgorithm-pass.html @@ -0,0 +1,24 @@ + + + + + documentColorWaiVisitedLinkAlgorithm-pass + + + + +

        This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentContentReadableWithoutStylesheets-fail.html b/test/testfiles/common/documentContentReadableWithoutStylesheets-fail.html new file mode 100644 index 000000000..869636fe0 --- /dev/null +++ b/test/testfiles/common/documentContentReadableWithoutStylesheets-fail.html @@ -0,0 +1,25 @@ + + + + + documentContentReadableWithoutStylesheets-fail + + + + +

        Hello.

        +

        Bye.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentContentReadableWithoutStylesheets-pass.html b/test/testfiles/common/documentContentReadableWithoutStylesheets-pass.html new file mode 100644 index 000000000..f267f15a1 --- /dev/null +++ b/test/testfiles/common/documentContentReadableWithoutStylesheets-pass.html @@ -0,0 +1,24 @@ + + + + + documentContentReadableWithoutStylesheets-pass + + + + +

        Hello.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentHasTitleElement-fail.html b/test/testfiles/common/documentHasTitleElement-fail.html new file mode 100644 index 000000000..2acd74f9e --- /dev/null +++ b/test/testfiles/common/documentHasTitleElement-fail.html @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentHasTitleElement-pass.html b/test/testfiles/common/documentHasTitleElement-pass.html new file mode 100644 index 000000000..57d596de6 --- /dev/null +++ b/test/testfiles/common/documentHasTitleElement-pass.html @@ -0,0 +1,23 @@ + + + + + documentHasTitleElement-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentIDsMustBeUnique-fail.html b/test/testfiles/common/documentIDsMustBeUnique-fail.html new file mode 100644 index 000000000..1bfa359c5 --- /dev/null +++ b/test/testfiles/common/documentIDsMustBeUnique-fail.html @@ -0,0 +1,51 @@ + + + + + documentIDsMustBeUnique-fail + + + + + + + + + + + + + + + + + +
        CityState
        PhoenixArizona
        SeattleWashington
        + + + + + + + + + + + + + +
        CityState
        PhoenixArizona
        SeattleWashington
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentIDsMustBeUnique-pass.html b/test/testfiles/common/documentIDsMustBeUnique-pass.html new file mode 100644 index 000000000..7d7f120be --- /dev/null +++ b/test/testfiles/common/documentIDsMustBeUnique-pass.html @@ -0,0 +1,51 @@ + + + + + documentIDsMustBeUnique-pass + + + + + + + + + + + + + + + + + +
        CityState
        PhoenixArizona
        SeattleWashington
        + + + + + + + + + + + + + +
        CityState
        PhoenixArizona
        SeattleWashington
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentLangIsISO639Standard-fail.html b/test/testfiles/common/documentLangIsISO639Standard-fail.html new file mode 100644 index 000000000..5e0278842 --- /dev/null +++ b/test/testfiles/common/documentLangIsISO639Standard-fail.html @@ -0,0 +1,23 @@ + + + + + documentLangIsISO639Standard-fail + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentLangIsISO639Standard-pass.html b/test/testfiles/common/documentLangIsISO639Standard-pass.html new file mode 100644 index 000000000..175c1c9c7 --- /dev/null +++ b/test/testfiles/common/documentLangIsISO639Standard-pass.html @@ -0,0 +1,23 @@ + + + + + documentLangIsISO639Standard-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentMetaNotUsedWithTimeout-fail.html b/test/testfiles/common/documentMetaNotUsedWithTimeout-fail.html new file mode 100644 index 000000000..5ea25d8b1 --- /dev/null +++ b/test/testfiles/common/documentMetaNotUsedWithTimeout-fail.html @@ -0,0 +1,24 @@ + + + + + documentMetaNotUsedWithTimeout-fail + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentMetaNotUsedWithTimeout-pass.html b/test/testfiles/common/documentMetaNotUsedWithTimeout-pass.html new file mode 100644 index 000000000..dfa649f8d --- /dev/null +++ b/test/testfiles/common/documentMetaNotUsedWithTimeout-pass.html @@ -0,0 +1,23 @@ + + + + + documentMetaNotUsedWithTimeout-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentReadingDirection-fail.html b/test/testfiles/common/documentReadingDirection-fail.html new file mode 100644 index 000000000..fd1650e59 --- /dev/null +++ b/test/testfiles/common/documentReadingDirection-fail.html @@ -0,0 +1,25 @@ + + + + + documentReadingDirection-fail + + + + +

        The title says "פעילות הבינאום, W3C" in Hebrew.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentReadingDirection-pass.html b/test/testfiles/common/documentReadingDirection-pass.html new file mode 100644 index 000000000..ab2489361 --- /dev/null +++ b/test/testfiles/common/documentReadingDirection-pass.html @@ -0,0 +1,25 @@ + + + + + documentReadingDirection-pass + + + + +

        The title says "פעילות הבינאום, W3C" + in Hebrew.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentStrictDocType-fail-2.html b/test/testfiles/common/documentStrictDocType-fail-2.html new file mode 100644 index 000000000..135a78f14 --- /dev/null +++ b/test/testfiles/common/documentStrictDocType-fail-2.html @@ -0,0 +1,26 @@ + + + + + documentStrictDocType-fail-2 + + + + +

        + A black and brown cat named Rex. +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentStrictDocType-fail-3.html b/test/testfiles/common/documentStrictDocType-fail-3.html new file mode 100644 index 000000000..7d288e463 --- /dev/null +++ b/test/testfiles/common/documentStrictDocType-fail-3.html @@ -0,0 +1,26 @@ + + + + + documentStrictDocType-fail-3 + + + + +

        + A black and brown cat named Rex. +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentStrictDocType-fail.html b/test/testfiles/common/documentStrictDocType-fail.html new file mode 100644 index 000000000..3a06e8887 --- /dev/null +++ b/test/testfiles/common/documentStrictDocType-fail.html @@ -0,0 +1,25 @@ + + + + documentStrictDocType-fail + + + + +

        + A black and brown cat named Rex. +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentStrictDocType-pass-2.html b/test/testfiles/common/documentStrictDocType-pass-2.html new file mode 100644 index 000000000..f08145028 --- /dev/null +++ b/test/testfiles/common/documentStrictDocType-pass-2.html @@ -0,0 +1,26 @@ + + + + + documentStrictDocType-pass-2 + + + + +

        + A black and brown cat named Rex. +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentStrictDocType-pass.html b/test/testfiles/common/documentStrictDocType-pass.html new file mode 100644 index 000000000..36dd7c261 --- /dev/null +++ b/test/testfiles/common/documentStrictDocType-pass.html @@ -0,0 +1,26 @@ + + + + + documentStrictDocType-pass + + + + +

        + A black and brown cat named Rex. +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentTitleDescribesDocument-fail-2.html b/test/testfiles/common/documentTitleDescribesDocument-fail-2.html new file mode 100644 index 000000000..7f38b78cb --- /dev/null +++ b/test/testfiles/common/documentTitleDescribesDocument-fail-2.html @@ -0,0 +1,28 @@ + + + + + documentTitleDescribesDocument-fail-2 + + + + + +

        History Of Birds

        + +

        This document contains the history of Birds. The title of the document + is appropriate.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentTitleDescribesDocument-fail.html b/test/testfiles/common/documentTitleDescribesDocument-fail.html new file mode 100644 index 000000000..a94509130 --- /dev/null +++ b/test/testfiles/common/documentTitleDescribesDocument-fail.html @@ -0,0 +1,29 @@ + + + + + documentTitleDescribesDocument-fail + + + + + +

        History Of Birds

        + +

        This document contains a history of birds. The title of this document + does not describe the contents of this document.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentTitleIsNotPlaceholder-fail-2.html b/test/testfiles/common/documentTitleIsNotPlaceholder-fail-2.html new file mode 100644 index 000000000..44b86d5a5 --- /dev/null +++ b/test/testfiles/common/documentTitleIsNotPlaceholder-fail-2.html @@ -0,0 +1,23 @@ + + + + + the title + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentTitleIsNotPlaceholder-fail-3.html b/test/testfiles/common/documentTitleIsNotPlaceholder-fail-3.html new file mode 100644 index 000000000..1f8d8f9fd --- /dev/null +++ b/test/testfiles/common/documentTitleIsNotPlaceholder-fail-3.html @@ -0,0 +1,23 @@ + + + + + this is the title + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentTitleIsNotPlaceholder-fail-4.html b/test/testfiles/common/documentTitleIsNotPlaceholder-fail-4.html new file mode 100644 index 000000000..0f911d822 --- /dev/null +++ b/test/testfiles/common/documentTitleIsNotPlaceholder-fail-4.html @@ -0,0 +1,23 @@ + + + + + untitled document + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentTitleIsNotPlaceholder-fail.html b/test/testfiles/common/documentTitleIsNotPlaceholder-fail.html new file mode 100644 index 000000000..2f8b374aa --- /dev/null +++ b/test/testfiles/common/documentTitleIsNotPlaceholder-fail.html @@ -0,0 +1,23 @@ + + + + + title + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentTitleIsNotPlaceholder-pass.html b/test/testfiles/common/documentTitleIsNotPlaceholder-pass.html new file mode 100644 index 000000000..817ba06e8 --- /dev/null +++ b/test/testfiles/common/documentTitleIsNotPlaceholder-pass.html @@ -0,0 +1,23 @@ + + + + + documentTitleIsNotPlaceholder-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentTitleIsShort-fail.html b/test/testfiles/common/documentTitleIsShort-fail.html new file mode 100644 index 000000000..4caadc918 --- /dev/null +++ b/test/testfiles/common/documentTitleIsShort-fail.html @@ -0,0 +1,25 @@ + + + + + This is a really really long title and maybe it should be shortened. In + fact I think it really should be shortened. Yes, let's all shorted the + title so it's more manageable for everyone. + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentTitleIsShort-pass.html b/test/testfiles/common/documentTitleIsShort-pass.html new file mode 100644 index 000000000..146a8e801 --- /dev/null +++ b/test/testfiles/common/documentTitleIsShort-pass.html @@ -0,0 +1,23 @@ + + + + + documentTitleIsShort-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentTitleNotEmpty-fail-2.html b/test/testfiles/common/documentTitleNotEmpty-fail-2.html new file mode 100644 index 000000000..787236d2c --- /dev/null +++ b/test/testfiles/common/documentTitleNotEmpty-fail-2.html @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentTitleNotEmpty-fail.html b/test/testfiles/common/documentTitleNotEmpty-fail.html new file mode 100644 index 000000000..6768b5f1c --- /dev/null +++ b/test/testfiles/common/documentTitleNotEmpty-fail.html @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentTitleNotEmpty-pass.html b/test/testfiles/common/documentTitleNotEmpty-pass.html new file mode 100644 index 000000000..1475c681c --- /dev/null +++ b/test/testfiles/common/documentTitleNotEmpty-pass.html @@ -0,0 +1,23 @@ + + + + + documentTitleNotEmpty-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentVisualListsAreMarkedUp-fail.html b/test/testfiles/common/documentVisualListsAreMarkedUp-fail.html new file mode 100644 index 000000000..9cecc0ba3 --- /dev/null +++ b/test/testfiles/common/documentVisualListsAreMarkedUp-fail.html @@ -0,0 +1,29 @@ + + + + + documentVisualListsAreMarkedUp-fail + + + + +

        * chocolate +
        * vanilla +
        * cherry +
        * bananna +
        +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentVisualListsAreMarkedUp-pass-2.html b/test/testfiles/common/documentVisualListsAreMarkedUp-pass-2.html new file mode 100644 index 000000000..c81c69e89 --- /dev/null +++ b/test/testfiles/common/documentVisualListsAreMarkedUp-pass-2.html @@ -0,0 +1,25 @@ + + + + + documentVisualListsAreMarkedUp-pass-2 + + + + +

        Our ice-cream flavours include chocolate, vanilla, cherry, and bananna.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentVisualListsAreMarkedUp-pass.html b/test/testfiles/common/documentVisualListsAreMarkedUp-pass.html new file mode 100644 index 000000000..faf20f169 --- /dev/null +++ b/test/testfiles/common/documentVisualListsAreMarkedUp-pass.html @@ -0,0 +1,29 @@ + + + + + documentVisualListsAreMarkedUp-pass + + + + +
          +
        • chocolate
        • +
        • vanilla
        • +
        • cherry
        • +
        • bananna
        • +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentWordsNotInLanguageAreMarked-fail.html b/test/testfiles/common/documentWordsNotInLanguageAreMarked-fail.html new file mode 100644 index 000000000..6b20cdb47 --- /dev/null +++ b/test/testfiles/common/documentWordsNotInLanguageAreMarked-fail.html @@ -0,0 +1,25 @@ + + + + + documentWordsNotInLanguageAreMarked-fail + + + + +

        And with a certain je ne sais quoi, she entered both the room, and his + life, forever.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/documentWordsNotInLanguageAreMarked-pass.html b/test/testfiles/common/documentWordsNotInLanguageAreMarked-pass.html new file mode 100644 index 000000000..067a2105e --- /dev/null +++ b/test/testfiles/common/documentWordsNotInLanguageAreMarked-pass.html @@ -0,0 +1,26 @@ + + + + + documentWordsNotInLanguageAreMarked-pass + + + + +

        And with a certain + je ne sais quoi, she entered both the room, and his life, forever.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/embedHasAssociatedNoEmbed-fail.html b/test/testfiles/common/embedHasAssociatedNoEmbed-fail.html new file mode 100644 index 000000000..e63d2d892 --- /dev/null +++ b/test/testfiles/common/embedHasAssociatedNoEmbed-fail.html @@ -0,0 +1,23 @@ + + + + embedHasAssociatedNoEmbed-fail + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/embedHasAssociatedNoEmbed-pass-2.html b/test/testfiles/common/embedHasAssociatedNoEmbed-pass-2.html new file mode 100644 index 000000000..b9b6de832 --- /dev/null +++ b/test/testfiles/common/embedHasAssociatedNoEmbed-pass-2.html @@ -0,0 +1,26 @@ + + + + embedHasAssociatedNoEmbed-pass-2 + + + + + + <a href="../transcripts/transcript_history_rome.htm">Transcript of "The history of Rome"</a> + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/embedHasAssociatedNoEmbed-pass.html b/test/testfiles/common/embedHasAssociatedNoEmbed-pass.html new file mode 100644 index 000000000..d9b48cafb --- /dev/null +++ b/test/testfiles/common/embedHasAssociatedNoEmbed-pass.html @@ -0,0 +1,27 @@ + + + + embedHasAssociatedNoEmbed-pass + + + + + + <a href="../transcripts/transcript_history_rome.htm">Transcript of "The history of Rome"</a> + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/embedMustHaveAltAttribute-fail.html b/test/testfiles/common/embedMustHaveAltAttribute-fail.html new file mode 100644 index 000000000..5f01f668f --- /dev/null +++ b/test/testfiles/common/embedMustHaveAltAttribute-fail.html @@ -0,0 +1,26 @@ + + + + + embedMustHaveAltAttribute-fail + + + + + + Alternate content for the embed + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/embedMustHaveAltAttribute-pass.html b/test/testfiles/common/embedMustHaveAltAttribute-pass.html new file mode 100644 index 000000000..2982ab29c --- /dev/null +++ b/test/testfiles/common/embedMustHaveAltAttribute-pass.html @@ -0,0 +1,26 @@ + + + + + embedMustHaveAltAttribute-pass + + + + + + Alternate content for the embed + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/embedMustNotHaveEmptyAlt-fail.html b/test/testfiles/common/embedMustNotHaveEmptyAlt-fail.html new file mode 100644 index 000000000..6d3bc9c5a --- /dev/null +++ b/test/testfiles/common/embedMustNotHaveEmptyAlt-fail.html @@ -0,0 +1,26 @@ + + + + + embedMustNotHaveEmptyAlt-fail + + + + + + Alternate content for the embed + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/embedMustNotHaveEmptyAlt-pass.html b/test/testfiles/common/embedMustNotHaveEmptyAlt-pass.html new file mode 100644 index 000000000..d935637f1 --- /dev/null +++ b/test/testfiles/common/embedMustNotHaveEmptyAlt-pass.html @@ -0,0 +1,26 @@ + + + + + embedMustNotHaveEmptyAlt-pass + + + + + + Alternate content for the embed + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/embedProvidesMechanismToReturnToParent-fail-2.html b/test/testfiles/common/embedProvidesMechanismToReturnToParent-fail-2.html new file mode 100644 index 000000000..1f0edb865 --- /dev/null +++ b/test/testfiles/common/embedProvidesMechanismToReturnToParent-fail-2.html @@ -0,0 +1,26 @@ + + + + + embedProvidesMechanismToReturnToParent-fail-2 + + + + +

        The following embed is not working. This is just an example.

        + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/embedProvidesMechanismToReturnToParent-fail.html b/test/testfiles/common/embedProvidesMechanismToReturnToParent-fail.html new file mode 100644 index 000000000..f649dd507 --- /dev/null +++ b/test/testfiles/common/embedProvidesMechanismToReturnToParent-fail.html @@ -0,0 +1,26 @@ + + + + + embedProvidesMechanismToReturnToParent-fail + + + + +

        The following embed is not working. This is just an example.

        + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/emoticonsExcessiveUse-fail.html b/test/testfiles/common/emoticonsExcessiveUse-fail.html new file mode 100644 index 000000000..2571a545d --- /dev/null +++ b/test/testfiles/common/emoticonsExcessiveUse-fail.html @@ -0,0 +1,25 @@ + + + + + emoticonsExcessiveUse-fail + + + + +

        Just a regular paragraph.

        +

        I am feeling :) :( B) :/ :P :o

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/emoticonsExcessiveUse-pass.html b/test/testfiles/common/emoticonsExcessiveUse-pass.html new file mode 100644 index 000000000..8a7ba537f --- /dev/null +++ b/test/testfiles/common/emoticonsExcessiveUse-pass.html @@ -0,0 +1,24 @@ + + + + + emoticonsExcessiveUse-pass + + + + +

        Just a regular paragraph.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/emoticonsMissingAbbr-fail.html b/test/testfiles/common/emoticonsMissingAbbr-fail.html new file mode 100644 index 000000000..a1fbb6b6b --- /dev/null +++ b/test/testfiles/common/emoticonsMissingAbbr-fail.html @@ -0,0 +1,25 @@ + + + + + emoticonsMissingAbbr-fail + + + + +

        Just a regular paragraph.

        +

        I feel :)

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/emoticonsMissingAbbr-pass.html b/test/testfiles/common/emoticonsMissingAbbr-pass.html new file mode 100644 index 000000000..370391019 --- /dev/null +++ b/test/testfiles/common/emoticonsMissingAbbr-pass.html @@ -0,0 +1,26 @@ + + + + + emoticonsMissingAbbr-pass + + + + +

        Just a regular paragraph.

        +

        I feel :) +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/fileHasLabel-fail-2.html b/test/testfiles/common/fileHasLabel-fail-2.html new file mode 100644 index 000000000..24e5072f3 --- /dev/null +++ b/test/testfiles/common/fileHasLabel-fail-2.html @@ -0,0 +1,28 @@ + + + + + fileHasLabel-fail-2 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/fileHasLabel-fail-3.html b/test/testfiles/common/fileHasLabel-fail-3.html new file mode 100644 index 000000000..0ace98809 --- /dev/null +++ b/test/testfiles/common/fileHasLabel-fail-3.html @@ -0,0 +1,29 @@ + + + + + fileHasLabel-fail-3 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/fileHasLabel-fail-5.html b/test/testfiles/common/fileHasLabel-fail-5.html new file mode 100644 index 000000000..4a10514ab --- /dev/null +++ b/test/testfiles/common/fileHasLabel-fail-5.html @@ -0,0 +1,31 @@ + + + + + fileHasLabel-fail-5 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/fileHasLabel-fail.html b/test/testfiles/common/fileHasLabel-fail.html new file mode 100644 index 000000000..5ab368a7e --- /dev/null +++ b/test/testfiles/common/fileHasLabel-fail.html @@ -0,0 +1,29 @@ + + + + + fileHasLabel-fail + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/fileHasLabel-pass-2.html b/test/testfiles/common/fileHasLabel-pass-2.html new file mode 100644 index 000000000..32eeed3bc --- /dev/null +++ b/test/testfiles/common/fileHasLabel-pass-2.html @@ -0,0 +1,31 @@ + + + + + fileHasLabel-pass-2 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/fileHasLabel-pass.html b/test/testfiles/common/fileHasLabel-pass.html new file mode 100644 index 000000000..50b6dbc68 --- /dev/null +++ b/test/testfiles/common/fileHasLabel-pass.html @@ -0,0 +1,30 @@ + + + + + fileHasLabel-pass + + + + +
        +

        + + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/fileLabelIsNearby-fail.html b/test/testfiles/common/fileLabelIsNearby-fail.html new file mode 100644 index 000000000..3b8b042af --- /dev/null +++ b/test/testfiles/common/fileLabelIsNearby-fail.html @@ -0,0 +1,40 @@ + + + + + fileLabelIsNearby-fail + + + + +

        Please upload your file using the form below:

        +
        + + + + + + + + +
        file: + +
        + +
        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/fileLabelIsNearby-pass.html b/test/testfiles/common/fileLabelIsNearby-pass.html new file mode 100644 index 000000000..4ff189bc5 --- /dev/null +++ b/test/testfiles/common/fileLabelIsNearby-pass.html @@ -0,0 +1,40 @@ + + + + + fileLabelIsNearby-pass + + + + +

        Please upload your file using the form below:

        +
        + + + + + + + + +
        file: + +
        + +
        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/fontIsNotUsed-fail.html b/test/testfiles/common/fontIsNotUsed-fail.html new file mode 100644 index 000000000..5d2245df3 --- /dev/null +++ b/test/testfiles/common/fontIsNotUsed-fail.html @@ -0,0 +1,23 @@ + + + + + fontIsNotUsed-fail + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/fontIsNotUsed-pass.html b/test/testfiles/common/fontIsNotUsed-pass.html new file mode 100644 index 000000000..12116a8ec --- /dev/null +++ b/test/testfiles/common/fontIsNotUsed-pass.html @@ -0,0 +1,23 @@ + + + + + fontIsNotUsed-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/formDeleteIsReversable-fail-2.html b/test/testfiles/common/formDeleteIsReversable-fail-2.html new file mode 100644 index 000000000..83fa2ad35 --- /dev/null +++ b/test/testfiles/common/formDeleteIsReversable-fail-2.html @@ -0,0 +1,35 @@ + + + + + formDeleteIsReversable-fail-2 + + + + +

        Use the form below to remove your report from the repository. +
        Select the following link if you would like to recover a report that + has been previously deleted.

        +
        +

        + + +
        + +

        +
        +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/formDeleteIsReversable-fail.html b/test/testfiles/common/formDeleteIsReversable-fail.html new file mode 100644 index 000000000..6ee3e3c09 --- /dev/null +++ b/test/testfiles/common/formDeleteIsReversable-fail.html @@ -0,0 +1,33 @@ + + + + + formDeleteIsReversable-fail + + + + +

        Use the form below to remove your report from the repository.

        +
        +

        + + +
        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/formErrorMessageHelpsUser-fail-2.html b/test/testfiles/common/formErrorMessageHelpsUser-fail-2.html new file mode 100644 index 000000000..fc7d80c0d --- /dev/null +++ b/test/testfiles/common/formErrorMessageHelpsUser-fail-2.html @@ -0,0 +1,73 @@ + + + + + formErrorMessageHelpsUser-fail-2 + + + + +

        Shown below are the steps required to purchase a concert ticket.

        +
          +
        1. User fills out the form and selects the "submit" button.
        2. +
        3. Data is presented to user with the option to correct data or submit it.
        4. +
        5. If user submits form then credit card is charged for the tickets and tickets + are mailed to user.
        6. +
        + +

        Step 1 - fill out form

        + +
        +

        + + +
        + + +
        + +

        +
        + +

        Step 2 - data is presented to user

        + +

        Please review the data below. If the data is correct select the "Purchase + Ticket" button. If data is not correct then select this link to modify the data.

        +
        +

        + + +
        + + +
        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/formErrorMessageHelpsUser-fail.html b/test/testfiles/common/formErrorMessageHelpsUser-fail.html new file mode 100644 index 000000000..33cb6560a --- /dev/null +++ b/test/testfiles/common/formErrorMessageHelpsUser-fail.html @@ -0,0 +1,46 @@ + + + + + formErrorMessageHelpsUser-fail + + + + +

        Shown below are the steps required to purchase a concert ticket.

        +
          +
        1. User fills out the form and selects the "submit" button.
        2. +
        3. User's credit card is charged for the tickets and tickets are mailed to + user.
        4. +
        +
        +

        + + +
        + + +
        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/formHasGoodErrorMessage-fail-2.html b/test/testfiles/common/formHasGoodErrorMessage-fail-2.html new file mode 100644 index 000000000..ffae7151c --- /dev/null +++ b/test/testfiles/common/formHasGoodErrorMessage-fail-2.html @@ -0,0 +1,35 @@ + + + + + formHasGoodErrorMessage-fail-2 + + + + +

        Assume the form below was submitted to the server and has now been returned + with an error message.

        +

        Error: Date should be entered as dd mm yyyy (e.g. 30 12 + 2006).

        +
        +

        + + +
        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/formHasGoodErrorMessage-fail.html b/test/testfiles/common/formHasGoodErrorMessage-fail.html new file mode 100644 index 000000000..c9c5114f7 --- /dev/null +++ b/test/testfiles/common/formHasGoodErrorMessage-fail.html @@ -0,0 +1,34 @@ + + + + + formHasGoodErrorMessage-fail + + + + +

        Assume the form below was submitted to the server and has now been returned + with an error message.

        +

        Error: Form submission wrong.

        +
        +

        + + +
        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/formWithRequiredLabel-fail-2.html b/test/testfiles/common/formWithRequiredLabel-fail-2.html new file mode 100644 index 000000000..3ceb20741 --- /dev/null +++ b/test/testfiles/common/formWithRequiredLabel-fail-2.html @@ -0,0 +1,44 @@ + + + + + formWithRequiredLabel-fail-2 + + + + + +
        +
        +

        + + +
        + + +
        + + +
        + +

        +
        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/formWithRequiredLabel-fail-3.html b/test/testfiles/common/formWithRequiredLabel-fail-3.html new file mode 100644 index 000000000..606d6423d --- /dev/null +++ b/test/testfiles/common/formWithRequiredLabel-fail-3.html @@ -0,0 +1,43 @@ + + + + + formWithRequiredLabel-fail-3 + + + + + +
        +

        + + +
        + + +
        + + +
        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/formWithRequiredLabel-fail.html b/test/testfiles/common/formWithRequiredLabel-fail.html new file mode 100644 index 000000000..bd05b3af9 --- /dev/null +++ b/test/testfiles/common/formWithRequiredLabel-fail.html @@ -0,0 +1,39 @@ + + + + + formWithRequiredLabel-fail + + + + +
        +
        +

        + + +
        + + +
        + + +
        + +

        +
        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/formWithRequiredLabel-pass-2.html b/test/testfiles/common/formWithRequiredLabel-pass-2.html new file mode 100644 index 000000000..60efcd584 --- /dev/null +++ b/test/testfiles/common/formWithRequiredLabel-pass-2.html @@ -0,0 +1,40 @@ + + + + + formWithRequiredLabel-pass-2 + + + + +
        +
        +

        + + +
        + + +
        + + +
        + +

        +
        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/formWithRequiredLabel-pass.html b/test/testfiles/common/formWithRequiredLabel-pass.html new file mode 100644 index 000000000..c6326a084 --- /dev/null +++ b/test/testfiles/common/formWithRequiredLabel-pass.html @@ -0,0 +1,39 @@ + + + + + formWithRequiredLabel-pass + + + + +
        +
        +

        + + +
        + + +
        + + +
        + +

        +
        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/frameTitlesNotPlaceholder-fail.html b/test/testfiles/common/frameTitlesNotPlaceholder-fail.html new file mode 100644 index 000000000..11f9f062b --- /dev/null +++ b/test/testfiles/common/frameTitlesNotPlaceholder-fail.html @@ -0,0 +1,25 @@ + + + + + frameTitlesNotPlaceholder-fail + + + + +

        This is an iframe.

        + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/frameTitlesNotPlaceholder-pass.html b/test/testfiles/common/frameTitlesNotPlaceholder-pass.html new file mode 100644 index 000000000..cffbc501c --- /dev/null +++ b/test/testfiles/common/frameTitlesNotPlaceholder-pass.html @@ -0,0 +1,25 @@ + + + + + frameTitlesNotPlaceholder-pass + + + + +

        This is an iframe.

        + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/framesHaveATitle-fail.html b/test/testfiles/common/framesHaveATitle-fail.html new file mode 100644 index 000000000..1f71b61a6 --- /dev/null +++ b/test/testfiles/common/framesHaveATitle-fail.html @@ -0,0 +1,25 @@ + + + + + framesHaveATitle-fail + + + + +

        This is an iframe.

        + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/framesHaveATitle-pass.html b/test/testfiles/common/framesHaveATitle-pass.html new file mode 100644 index 000000000..09dc517fa --- /dev/null +++ b/test/testfiles/common/framesHaveATitle-pass.html @@ -0,0 +1,25 @@ + + + + + framesHaveATitle-pass + + + + +

        This is an iframe.

        + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/headerH1-fail.html b/test/testfiles/common/headerH1-fail.html new file mode 100644 index 000000000..2e3a6dddc --- /dev/null +++ b/test/testfiles/common/headerH1-fail.html @@ -0,0 +1,31 @@ + + + + + headerH1-fail + + + + + +

        The First Heading

        + +

        Here is some demo text.

        + +

        The bad Heading

        + +

        Here is some more demo text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/headerH1-pass.html b/test/testfiles/common/headerH1-pass.html new file mode 100644 index 000000000..cc8ec6062 --- /dev/null +++ b/test/testfiles/common/headerH1-pass.html @@ -0,0 +1,31 @@ + + + + + headerH1-pass + + + + + +

        The First Heading

        + +

        Here is some demo text.

        + +

        The Second Heading

        + +

        Here is some more demo text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/headerH2-fail.html b/test/testfiles/common/headerH2-fail.html new file mode 100644 index 000000000..1964d61fa --- /dev/null +++ b/test/testfiles/common/headerH2-fail.html @@ -0,0 +1,31 @@ + + + + + headerH2-fail + + + + + +

        The First Heading

        + +

        Here is some demo text.

        + +

        The bad Heading

        + +

        Here is some more demo text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/headerH2-pass.html b/test/testfiles/common/headerH2-pass.html new file mode 100644 index 000000000..2b881d570 --- /dev/null +++ b/test/testfiles/common/headerH2-pass.html @@ -0,0 +1,31 @@ + + + + + headerH2-pass + + + + + +

        The First Heading

        + +

        Here is some demo text.

        + +

        This Heading Is OK

        + +

        Here is some more demo text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/headerH3-fail.html b/test/testfiles/common/headerH3-fail.html new file mode 100644 index 000000000..62051473d --- /dev/null +++ b/test/testfiles/common/headerH3-fail.html @@ -0,0 +1,31 @@ + + + + + headerH3-fail + + + + + +

        The First Heading

        + +

        Here is some demo text.

        + +
        The bad Heading
        + +

        Here is some more demo text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/headerH3-pass.html b/test/testfiles/common/headerH3-pass.html new file mode 100644 index 000000000..f129ea9c9 --- /dev/null +++ b/test/testfiles/common/headerH3-pass.html @@ -0,0 +1,31 @@ + + + + + headerH3-pass + + + + + +

        The First Heading

        + +

        Here is some demo text.

        + +

        This Heading Is OK

        + +

        Here is some more demo text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/headerH4-fail.html b/test/testfiles/common/headerH4-fail.html new file mode 100644 index 000000000..28ada48ad --- /dev/null +++ b/test/testfiles/common/headerH4-fail.html @@ -0,0 +1,29 @@ + + + + + headerH4-fail + + + + + +

        The First Heading

        + + +
        The Second Heading
        + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/headerH4-pass.html b/test/testfiles/common/headerH4-pass.html new file mode 100644 index 000000000..e15e9753f --- /dev/null +++ b/test/testfiles/common/headerH4-pass.html @@ -0,0 +1,29 @@ + + + + + headerH4-pass + + + + + +
        The First Heading
        + + +
        The Second Heading
        + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/headerH6Format-fail.html b/test/testfiles/common/headerH6Format-fail.html new file mode 100644 index 000000000..49362fd28 --- /dev/null +++ b/test/testfiles/common/headerH6Format-fail.html @@ -0,0 +1,25 @@ + + + + + headerH6Format-fail + + + + +

        This is very important and you should read it.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/headersUseToMarkSections-fail.html b/test/testfiles/common/headersUseToMarkSections-fail.html new file mode 100644 index 000000000..2fd7050fe --- /dev/null +++ b/test/testfiles/common/headersUseToMarkSections-fail.html @@ -0,0 +1,46 @@ + + + + + headersUseToMarkSections-fail + + + + +

        Applicability

        + HTML and XHTML +
        +This technique is referenced from: +
        How to Meet Success Criterion 2.4.1 +
        +User Agent and Assistive Technology Support Notes +
        Home Page Reader, JAWS, and WindowEyes all provide navigation via headings + and provide information about the level of the heading. The Opera browser + provides a mechanism to navigate by headings. Additional plugins support + navigation by headings in other user agents. +
        +Description +
        The objective of this technique is to demonstrate how using the heading + elements, h and h1 - h6, to markup the beginning of each section in the + content can assist in navigation. Most assistive technologies and many + user agents provide a mechanism to navigate by heading elements by providing + keyboard commands that allow users to jump from one heading to the next. + Using heading elements to markup sections of a document allows users to + easily navigate from section to section. +
        +Examples +
        Example 1...

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/headersUseToMarkSections-pass-2.html b/test/testfiles/common/headersUseToMarkSections-pass-2.html new file mode 100644 index 000000000..cd7986086 --- /dev/null +++ b/test/testfiles/common/headersUseToMarkSections-pass-2.html @@ -0,0 +1,28 @@ + + + + + headersUseToMarkSections-pass-2 + + + + + +

        User Agent and Assistive Technology Support Notes

        + +

        Home Page Reader, JAWS, and WindowEyes all provide navigation + via headingss.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/headersUseToMarkSections-pass.html b/test/testfiles/common/headersUseToMarkSections-pass.html new file mode 100644 index 000000000..d98c37255 --- /dev/null +++ b/test/testfiles/common/headersUseToMarkSections-pass.html @@ -0,0 +1,55 @@ + + + + + headersUseToMarkSections-pass + + + + + +

        H69: Providing Heading elements at the beginning of each section of content

        + + +

        Applicability

        + +

        HTML and XHTML

        + +

        This technique is referenced from:

        + +

        How to Meet Success Criterion 2.4.1

        + +

        User Agent and Assistive Technology Support Notes

        + +

        Home Page Reader, JAWS, and WindowEyes all provide navigation via headings + and provide information about the level of the heading. The Opera browser + provides a mechanism to navigate by headings. Additional plugins support + navigation by headings in other user agents.

        + +

        Description

        + +

        The objective of this technique is to demonstrate how using the heading + elements, h and h1 - h6, to markup the beginning of each section in the + content can assist in navigation. Most assistive technologies and many + user agents provide a mechanism to navigate by heading elements by providing + keyboard commands that allow users to jump from one heading to the next. + Using heading elements to markup sections of a document allows users to + easily navigate from section to section.

        + +

        Examples

        + +

        Example 1...

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/iIsNotUsed-fail.html b/test/testfiles/common/iIsNotUsed-fail.html new file mode 100644 index 000000000..af13ae786 --- /dev/null +++ b/test/testfiles/common/iIsNotUsed-fail.html @@ -0,0 +1,25 @@ + + + + + iIsNotUsed-fail + + + + +

        What she really meant to say was, "This isn't ok, it is excellent!"

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/iIsNotUsed-pass.html b/test/testfiles/common/iIsNotUsed-pass.html new file mode 100644 index 000000000..0f8a7dbb8 --- /dev/null +++ b/test/testfiles/common/iIsNotUsed-pass.html @@ -0,0 +1,25 @@ + + + + + iIsNotUsed-pass + + + + +

        What she really meant to say was, "This isn't ok, it is excellent!"

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/iframeMustNotHaveLongdesc-fail.html b/test/testfiles/common/iframeMustNotHaveLongdesc-fail.html new file mode 100644 index 000000000..629cada46 --- /dev/null +++ b/test/testfiles/common/iframeMustNotHaveLongdesc-fail.html @@ -0,0 +1,24 @@ + + + + + iframeMustNotHaveLongdesc-fail + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/iframeMustNotHaveLongdesc-pass.html b/test/testfiles/common/iframeMustNotHaveLongdesc-pass.html new file mode 100644 index 000000000..e73db2beb --- /dev/null +++ b/test/testfiles/common/iframeMustNotHaveLongdesc-pass.html @@ -0,0 +1,24 @@ + + + + + iframeMustNotHaveLongdesc-pass + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imageMapServerSide-fail.html b/test/testfiles/common/imageMapServerSide-fail.html new file mode 100644 index 000000000..6f289ae8c --- /dev/null +++ b/test/testfiles/common/imageMapServerSide-fail.html @@ -0,0 +1,26 @@ + + + + + imageMapServerSide-fail + + + + +

        + map of the country +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imageMapServerSide-pass.html b/test/testfiles/common/imageMapServerSide-pass.html new file mode 100644 index 000000000..b1ee70cb7 --- /dev/null +++ b/test/testfiles/common/imageMapServerSide-pass.html @@ -0,0 +1,30 @@ + + + + + imageMapServerSide-pass + + + + +

        + map of the country +

        +

        East Coast | Central | + West Coast +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgAltEmptyForDecorativeImages-fail-2.html b/test/testfiles/common/imgAltEmptyForDecorativeImages-fail-2.html new file mode 100644 index 000000000..1abbfeabc --- /dev/null +++ b/test/testfiles/common/imgAltEmptyForDecorativeImages-fail-2.html @@ -0,0 +1,26 @@ + + + + + imgAltEmptyForDecorativeImages-fail-2 + + + + +

        My poem requires a big space + here.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgAltEmptyForDecorativeImages-fail-3.html b/test/testfiles/common/imgAltEmptyForDecorativeImages-fail-3.html new file mode 100644 index 000000000..62a93d320 --- /dev/null +++ b/test/testfiles/common/imgAltEmptyForDecorativeImages-fail-3.html @@ -0,0 +1,25 @@ + + + + + imgAltEmptyForDecorativeImages-fail-3 + + + + +

        red stardogs +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgAltEmptyForDecorativeImages-fail-4.html b/test/testfiles/common/imgAltEmptyForDecorativeImages-fail-4.html new file mode 100644 index 000000000..d0e309411 --- /dev/null +++ b/test/testfiles/common/imgAltEmptyForDecorativeImages-fail-4.html @@ -0,0 +1,25 @@ + + + + + imgAltEmptyForDecorativeImages-fail-4 + + + + +

        dogs +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgAltEmptyForDecorativeImages-fail.html b/test/testfiles/common/imgAltEmptyForDecorativeImages-fail.html new file mode 100644 index 000000000..32311ac26 --- /dev/null +++ b/test/testfiles/common/imgAltEmptyForDecorativeImages-fail.html @@ -0,0 +1,26 @@ + + + + + imgAltEmptyForDecorativeImages-fail + + + + +

        My poem requires a big space + big spacehere.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgAltIdentifiesLinkDestination-fail.html b/test/testfiles/common/imgAltIdentifiesLinkDestination-fail.html new file mode 100644 index 000000000..ea96a61d8 --- /dev/null +++ b/test/testfiles/common/imgAltIdentifiesLinkDestination-fail.html @@ -0,0 +1,25 @@ + + + + + imgAltIdentifiesLinkDestination-fail + + + + +

        Current routes at Boulders Climbing Gym +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgAltIsDifferent-fail.html b/test/testfiles/common/imgAltIsDifferent-fail.html new file mode 100644 index 000000000..2e0c664db --- /dev/null +++ b/test/testfiles/common/imgAltIsDifferent-fail.html @@ -0,0 +1,24 @@ + + + + + imgAltIsDifferent-fail + + + + + resources/rex.jpg + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgAltIsDifferent-pass.html b/test/testfiles/common/imgAltIsDifferent-pass.html new file mode 100644 index 000000000..2b36d88b1 --- /dev/null +++ b/test/testfiles/common/imgAltIsDifferent-pass.html @@ -0,0 +1,24 @@ + + + + + imgAltIsDifferent-pass + + + + + photo of rex the cat + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgAltIsSameInText-fail.html b/test/testfiles/common/imgAltIsSameInText-fail.html new file mode 100644 index 000000000..71a43f2c2 --- /dev/null +++ b/test/testfiles/common/imgAltIsSameInText-fail.html @@ -0,0 +1,26 @@ + + + + + imgAltIsSameInText-fail + + + + +

        + logo +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgAltIsSameInText-pass.html b/test/testfiles/common/imgAltIsSameInText-pass.html new file mode 100644 index 000000000..65b369fce --- /dev/null +++ b/test/testfiles/common/imgAltIsSameInText-pass.html @@ -0,0 +1,27 @@ + + + + + imgAltIsSameInText-pass + + + + +

        + W3C Working Draft logo +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgAltIsTooLong-fail.html b/test/testfiles/common/imgAltIsTooLong-fail.html new file mode 100644 index 000000000..e2f0e3884 --- /dev/null +++ b/test/testfiles/common/imgAltIsTooLong-fail.html @@ -0,0 +1,27 @@ + + + + + imgAltIsTooLong-fail + + + + +

        + A picture of Rex the cat with some extra text. This is very long alt text. In fact, it was much much too long for this image. Sort alt text would be much better and this alt text should be shortened. +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgAltIsTooLong-pass.html b/test/testfiles/common/imgAltIsTooLong-pass.html new file mode 100644 index 000000000..a556d2b1e --- /dev/null +++ b/test/testfiles/common/imgAltIsTooLong-pass.html @@ -0,0 +1,26 @@ + + + + + imgAltIsTooLong-pass + + + + +

        + photo of rex the cat +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgAltNotEmptyInAnchor-fail.html b/test/testfiles/common/imgAltNotEmptyInAnchor-fail.html new file mode 100644 index 000000000..72f832bdb --- /dev/null +++ b/test/testfiles/common/imgAltNotEmptyInAnchor-fail.html @@ -0,0 +1,25 @@ + + + + + imgAltNotEmptyInAnchor-fail + + + + +

        +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgAltNotEmptyInAnchor-pass.html b/test/testfiles/common/imgAltNotEmptyInAnchor-pass.html new file mode 100644 index 000000000..e81dce551 --- /dev/null +++ b/test/testfiles/common/imgAltNotEmptyInAnchor-pass.html @@ -0,0 +1,25 @@ + + + + + imgAltNotEmptyInAnchor-pass + + + + +

        a story about Rex the cat +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgAltNotPlaceHolder-fail-2.html b/test/testfiles/common/imgAltNotPlaceHolder-fail-2.html new file mode 100644 index 000000000..42325f9ce --- /dev/null +++ b/test/testfiles/common/imgAltNotPlaceHolder-fail-2.html @@ -0,0 +1,24 @@ + + + + + imgAltNotPlaceHolder-fail-2 + + + + + photo + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgAltNotPlaceHolder-fail-3.html b/test/testfiles/common/imgAltNotPlaceHolder-fail-3.html new file mode 100644 index 000000000..2baaeffd2 --- /dev/null +++ b/test/testfiles/common/imgAltNotPlaceHolder-fail-3.html @@ -0,0 +1,25 @@ + + + + + imgAltNotPlaceHolder-fail-3 + + + + + 13K bytes + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgAltNotPlaceHolder-fail-4.html b/test/testfiles/common/imgAltNotPlaceHolder-fail-4.html new file mode 100644 index 000000000..2ac6b2654 --- /dev/null +++ b/test/testfiles/common/imgAltNotPlaceHolder-fail-4.html @@ -0,0 +1,26 @@ + + + + + imgAltNotPlaceHolder-fail-4 + + + + +

        + spacer +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgAltNotPlaceHolder-fail-5.html b/test/testfiles/common/imgAltNotPlaceHolder-fail-5.html new file mode 100644 index 000000000..c308e5017 --- /dev/null +++ b/test/testfiles/common/imgAltNotPlaceHolder-fail-5.html @@ -0,0 +1,26 @@ + + + + + imgAltNotPlaceHolder-fail-5 + + + + +

        + nbsp +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgAltNotPlaceHolder-fail.html b/test/testfiles/common/imgAltNotPlaceHolder-fail.html new file mode 100644 index 000000000..01f322043 --- /dev/null +++ b/test/testfiles/common/imgAltNotPlaceHolder-fail.html @@ -0,0 +1,24 @@ + + + + + imgAltNotPlaceHolder-fail + + + + + image + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgAltNotPlaceHolder-pass-2.html b/test/testfiles/common/imgAltNotPlaceHolder-pass-2.html new file mode 100644 index 000000000..31cae853a --- /dev/null +++ b/test/testfiles/common/imgAltNotPlaceHolder-pass-2.html @@ -0,0 +1,26 @@ + + + + + imgAltNotPlaceHolder-pass-2 + + + + +

        + +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgAltNotPlaceHolder-pass.html b/test/testfiles/common/imgAltNotPlaceHolder-pass.html new file mode 100644 index 000000000..e6fc2210a --- /dev/null +++ b/test/testfiles/common/imgAltNotPlaceHolder-pass.html @@ -0,0 +1,27 @@ + + + + + imgAltNotPlaceHolder-pass + + + + +

        + Photo of a brown and black cat named Rex. +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgGifNoFlicker-fail.html b/test/testfiles/common/imgGifNoFlicker-fail.html new file mode 100644 index 000000000..0836c3a4a --- /dev/null +++ b/test/testfiles/common/imgGifNoFlicker-fail.html @@ -0,0 +1,25 @@ + + + + + imgGifNoFlicker-fail + + + + + eat at Joes + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgGifNoFlicker-pass.html b/test/testfiles/common/imgGifNoFlicker-pass.html new file mode 100644 index 000000000..512094deb --- /dev/null +++ b/test/testfiles/common/imgGifNoFlicker-pass.html @@ -0,0 +1,25 @@ + + + + + imgGifNoFlicker-pass + + + + + A brown and black cat named Rex. + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgHasAlt-fail.html b/test/testfiles/common/imgHasAlt-fail.html new file mode 100644 index 000000000..25bb1001e --- /dev/null +++ b/test/testfiles/common/imgHasAlt-fail.html @@ -0,0 +1,26 @@ + + + + + imgHasAlt-fail + + + + +

        + +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgHasAlt-pass.html b/test/testfiles/common/imgHasAlt-pass.html new file mode 100644 index 000000000..68ac1ff56 --- /dev/null +++ b/test/testfiles/common/imgHasAlt-pass.html @@ -0,0 +1,26 @@ + + + + + imgHasAlt-pass + + + + +

        + A black and brown cat named Rex. +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgHasLongDesc-fail-2.html b/test/testfiles/common/imgHasLongDesc-fail-2.html new file mode 100644 index 000000000..537456937 --- /dev/null +++ b/test/testfiles/common/imgHasLongDesc-fail-2.html @@ -0,0 +1,28 @@ + + + + + imgHasLongDesc-fail-2 + + + + +

        The text in this document fully describes the image shown here however + the Alt text does not refer to this text. + a complex chart +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgHasLongDesc-fail.html b/test/testfiles/common/imgHasLongDesc-fail.html new file mode 100644 index 000000000..95e0143fd --- /dev/null +++ b/test/testfiles/common/imgHasLongDesc-fail.html @@ -0,0 +1,28 @@ + + + + + imgHasLongDesc-fail + + + + +

        The text in this document does not fully describe the complex image shown + here. + a complex chart +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgHasLongDesc-pass-2.html b/test/testfiles/common/imgHasLongDesc-pass-2.html new file mode 100644 index 000000000..2765f4332 --- /dev/null +++ b/test/testfiles/common/imgHasLongDesc-pass-2.html @@ -0,0 +1,28 @@ + + + + + imgHasLongDesc-pass-2 + + + + +

        The text in this document fully describes the image shown here and the + Alt text refers to this text. + a complex chart as described above +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgHasLongDesc-pass-3.html b/test/testfiles/common/imgHasLongDesc-pass-3.html new file mode 100644 index 000000000..8c96e55a3 --- /dev/null +++ b/test/testfiles/common/imgHasLongDesc-pass-3.html @@ -0,0 +1,27 @@ + + + + + imgHasLongDesc-pass-3 + + + + +

        The text in this document does not fully describe the image. + a complex chart (Description of image.) +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgHasLongDesc-pass.html b/test/testfiles/common/imgHasLongDesc-pass.html new file mode 100644 index 000000000..741eb273f --- /dev/null +++ b/test/testfiles/common/imgHasLongDesc-pass.html @@ -0,0 +1,29 @@ + + + + + imgHasLongDesc-pass + + + + +

        The text in this document does not fully describe the image shown here + but the image contains a longdesc attribute linking to a text file that + does describe the image. + a complex chart +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgImportantNoSpacerAlt-fail.html b/test/testfiles/common/imgImportantNoSpacerAlt-fail.html new file mode 100644 index 000000000..b4009be95 --- /dev/null +++ b/test/testfiles/common/imgImportantNoSpacerAlt-fail.html @@ -0,0 +1,24 @@ + + + + + imgImportantNoSpacerAlt-fail + + + + +   + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgImportantNoSpacerAlt-pass-2.html b/test/testfiles/common/imgImportantNoSpacerAlt-pass-2.html new file mode 100644 index 000000000..1641cd052 --- /dev/null +++ b/test/testfiles/common/imgImportantNoSpacerAlt-pass-2.html @@ -0,0 +1,24 @@ + + + + + imgImportantNoSpacerAlt-pass-2 + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgImportantNoSpacerAlt-pass.html b/test/testfiles/common/imgImportantNoSpacerAlt-pass.html new file mode 100644 index 000000000..f3ee3a9c4 --- /dev/null +++ b/test/testfiles/common/imgImportantNoSpacerAlt-pass.html @@ -0,0 +1,24 @@ + + + + + imgImportantNoSpacerAlt-pass + + + + +   + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgMapAreasHaveDuplicateLink-fail-2.html b/test/testfiles/common/imgMapAreasHaveDuplicateLink-fail-2.html new file mode 100644 index 000000000..7d3f1c532 --- /dev/null +++ b/test/testfiles/common/imgMapAreasHaveDuplicateLink-fail-2.html @@ -0,0 +1,39 @@ + + + + + imgMapAreasHaveDuplicateLink-fail-2 + + + + +

        + + horses + dogs + birds + +

        +

        + navigation +

        +

        Horses | Dogs +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgMapAreasHaveDuplicateLink-fail.html b/test/testfiles/common/imgMapAreasHaveDuplicateLink-fail.html new file mode 100644 index 000000000..4a3f14ffe --- /dev/null +++ b/test/testfiles/common/imgMapAreasHaveDuplicateLink-fail.html @@ -0,0 +1,37 @@ + + + + + imgMapAreasHaveDuplicateLink-fail + + + + +

        + + horses + dogs + birds + +

        +

        + navigation +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgMapAreasHaveDuplicateLink-pass.html b/test/testfiles/common/imgMapAreasHaveDuplicateLink-pass.html new file mode 100644 index 000000000..901482a06 --- /dev/null +++ b/test/testfiles/common/imgMapAreasHaveDuplicateLink-pass.html @@ -0,0 +1,39 @@ + + + + + imgMapAreasHaveDuplicateLink-pass + + + + +

        + + horses + dogs + birds + +

        +

        + navigation +

        +

        Horses | Dogs | Birds +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgNonDecorativeHasAlt-fail.html b/test/testfiles/common/imgNonDecorativeHasAlt-fail.html new file mode 100644 index 000000000..b045503ac --- /dev/null +++ b/test/testfiles/common/imgNonDecorativeHasAlt-fail.html @@ -0,0 +1,27 @@ + + + + + imgNonDecorativeHasAlt-fail + + + + +

        We would like to adopt another pet and are looking for one that is similar + to what's shown in the picture.

        + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgNonDecorativeHasAlt-pass.html b/test/testfiles/common/imgNonDecorativeHasAlt-pass.html new file mode 100644 index 000000000..cf70b0c94 --- /dev/null +++ b/test/testfiles/common/imgNonDecorativeHasAlt-pass.html @@ -0,0 +1,27 @@ + + + + + imgNonDecorativeHasAlt-pass + + + + +

        We would like to adopt another pet and are looking for one that is similar + to what's shown in the picture.

        + large brown and black cat named Rex + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgNotReferredToByColorAlone-fail-2.html b/test/testfiles/common/imgNotReferredToByColorAlone-fail-2.html new file mode 100644 index 000000000..c69edf6ed --- /dev/null +++ b/test/testfiles/common/imgNotReferredToByColorAlone-fail-2.html @@ -0,0 +1,31 @@ + + + + + imgNotReferredToByColorAlone-fail-2 + + + + + +

        Clayton's Class

        + +

        This is Clayton's class photo from 2004. Clayton is third from the left + wearing a red coat and no boots.

        +

        + class photo showing 6 children +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgNotReferredToByColorAlone-fail-3.html b/test/testfiles/common/imgNotReferredToByColorAlone-fail-3.html new file mode 100644 index 000000000..d4d842134 --- /dev/null +++ b/test/testfiles/common/imgNotReferredToByColorAlone-fail-3.html @@ -0,0 +1,31 @@ + + + + + imgNotReferredToByColorAlone-fail-3 + + + + + +

        Clayton's Class

        + +

        Clayton is shown below in the class photo from grade 3.

        +

        + class photo showing Clayton with red coat. +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgNotReferredToByColorAlone-fail.html b/test/testfiles/common/imgNotReferredToByColorAlone-fail.html new file mode 100644 index 000000000..ab9cfd7e7 --- /dev/null +++ b/test/testfiles/common/imgNotReferredToByColorAlone-fail.html @@ -0,0 +1,31 @@ + + + + + imgNotReferredToByColorAlone-fail + + + + + +

        Clayton's Class

        + +

        This is Clayton's class photo from 2004. Clayton is the one wearing a + red coat.

        +

        + class photo showing 6 children +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgServerSideMapNotUsed-fail-2.html b/test/testfiles/common/imgServerSideMapNotUsed-fail-2.html new file mode 100644 index 000000000..d4baf91d9 --- /dev/null +++ b/test/testfiles/common/imgServerSideMapNotUsed-fail-2.html @@ -0,0 +1,29 @@ + + + + + imgServerSideMapNotUsed-fail-2 + + + + +

        + image map +

        +

        To perform this test, you must look at the server-side image map file + and determine if the active areas in the image map use available geometric + shapes.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgServerSideMapNotUsed-fail.html b/test/testfiles/common/imgServerSideMapNotUsed-fail.html new file mode 100644 index 000000000..840371f9c --- /dev/null +++ b/test/testfiles/common/imgServerSideMapNotUsed-fail.html @@ -0,0 +1,29 @@ + + + + + imgServerSideMapNotUsed-fail + + + + +

        + image map +

        +

        To perform this test, you must look at the server-side image map file + and determine if the active areas in the image map use available geometric + shapes.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgShouldNotHaveTitle-fail.html b/test/testfiles/common/imgShouldNotHaveTitle-fail.html new file mode 100644 index 000000000..f1afc8517 --- /dev/null +++ b/test/testfiles/common/imgShouldNotHaveTitle-fail.html @@ -0,0 +1,25 @@ + + + + + imgShouldNotHaveTitle-fail + + + + + A brown and black cat named Rex. + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgShouldNotHaveTitle-pass.html b/test/testfiles/common/imgShouldNotHaveTitle-pass.html new file mode 100644 index 000000000..0bd086bc2 --- /dev/null +++ b/test/testfiles/common/imgShouldNotHaveTitle-pass.html @@ -0,0 +1,24 @@ + + + + + imgShouldNotHaveTitle-pass + + + + + A brown and black cat named Rex. + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgWithMapHasUseMap-fail.html b/test/testfiles/common/imgWithMapHasUseMap-fail.html new file mode 100644 index 000000000..e503eb79b --- /dev/null +++ b/test/testfiles/common/imgWithMapHasUseMap-fail.html @@ -0,0 +1,27 @@ +hjp + + + + + imgWithMapHasUseMap-fail + + + + +

        + image map +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgWithMapHasUseMap-pass.html b/test/testfiles/common/imgWithMapHasUseMap-pass.html new file mode 100644 index 000000000..a0be9d663 --- /dev/null +++ b/test/testfiles/common/imgWithMapHasUseMap-pass.html @@ -0,0 +1,27 @@ + + + + + imgWithMapHasUseMap-pass + + + + +

        + image map +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgWithMathShouldHaveMathEquivalent-fail.html b/test/testfiles/common/imgWithMathShouldHaveMathEquivalent-fail.html new file mode 100644 index 000000000..df709cbd6 --- /dev/null +++ b/test/testfiles/common/imgWithMathShouldHaveMathEquivalent-fail.html @@ -0,0 +1,28 @@ + + + + + imgWithMathShouldHaveMathEquivalent-fail + + + + +

        The following image shows the solution to the quadratic equation: begin + fraction minus b plus or minus begin square root of b squared minus four + a c end square root over 2 a end fraction

        + solution to the quadratic equation + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/imgWithMathShouldHaveMathEquivalent-pass.html b/test/testfiles/common/imgWithMathShouldHaveMathEquivalent-pass.html new file mode 100644 index 000000000..cd82ab195 --- /dev/null +++ b/test/testfiles/common/imgWithMathShouldHaveMathEquivalent-pass.html @@ -0,0 +1,23 @@ + + + + + imgWithMathShouldHaveMathEquivalent-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputCheckboxHasTabIndex-fail-2.html b/test/testfiles/common/inputCheckboxHasTabIndex-fail-2.html new file mode 100644 index 000000000..d0a8fa0ab --- /dev/null +++ b/test/testfiles/common/inputCheckboxHasTabIndex-fail-2.html @@ -0,0 +1,30 @@ + + + + + inputCheckboxHasTabIndex-fail-2 + + + + +
        +

        + : + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputCheckboxHasTabIndex-fail.html b/test/testfiles/common/inputCheckboxHasTabIndex-fail.html new file mode 100644 index 000000000..5c096eba7 --- /dev/null +++ b/test/testfiles/common/inputCheckboxHasTabIndex-fail.html @@ -0,0 +1,29 @@ + + + + + inputCheckboxHasTabIndex-fail + + + + +
        +

        + : + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputCheckboxHasTabIndex-pass.html b/test/testfiles/common/inputCheckboxHasTabIndex-pass.html new file mode 100644 index 000000000..9aa0a17f1 --- /dev/null +++ b/test/testfiles/common/inputCheckboxHasTabIndex-pass.html @@ -0,0 +1,30 @@ + + + + + inputCheckboxHasTabIndex-pass + + + + +
        +

        + : + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputCheckboxRequiresFieldset-fail.html b/test/testfiles/common/inputCheckboxRequiresFieldset-fail.html new file mode 100644 index 000000000..621d92726 --- /dev/null +++ b/test/testfiles/common/inputCheckboxRequiresFieldset-fail.html @@ -0,0 +1,37 @@ + + + + + inputCheckboxRequiresFieldset-fail + + + + +
        +

        + + +
        + + +
        + + +
        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputCheckboxRequiresFieldset-pass.html b/test/testfiles/common/inputCheckboxRequiresFieldset-pass.html new file mode 100644 index 000000000..2586fe588 --- /dev/null +++ b/test/testfiles/common/inputCheckboxRequiresFieldset-pass.html @@ -0,0 +1,42 @@ + + + + + + inputCheckboxRequiresFieldset-pass + + + + +
        +
        + Donuts Requested (check all that apply) +

        + + +
        + + +
        + + +

        +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputDoesNotUseColorAlone-fail.html b/test/testfiles/common/inputDoesNotUseColorAlone-fail.html new file mode 100644 index 000000000..0b7d9ad65 --- /dev/null +++ b/test/testfiles/common/inputDoesNotUseColorAlone-fail.html @@ -0,0 +1,27 @@ + + + + + inputDoesNotUseColorAlone-fail + + + + +
        + + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputDoesNotUseColorAlone-pass.html b/test/testfiles/common/inputDoesNotUseColorAlone-pass.html new file mode 100644 index 000000000..82f8c770b --- /dev/null +++ b/test/testfiles/common/inputDoesNotUseColorAlone-pass.html @@ -0,0 +1,23 @@ + + + + + inputDoesNotUseColorAlone-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputElementsDontHaveAlt-fail.html b/test/testfiles/common/inputElementsDontHaveAlt-fail.html new file mode 100644 index 000000000..fa2b99dcd --- /dev/null +++ b/test/testfiles/common/inputElementsDontHaveAlt-fail.html @@ -0,0 +1,28 @@ + + + + + inputElementsDontHaveAlt-fail + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputElementsDontHaveAlt-pass.html b/test/testfiles/common/inputElementsDontHaveAlt-pass.html new file mode 100644 index 000000000..36e6fd9b1 --- /dev/null +++ b/test/testfiles/common/inputElementsDontHaveAlt-pass.html @@ -0,0 +1,28 @@ + + + + + inputElementsDontHaveAlt-pass + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputFileHasTabIndex-fail-2.html b/test/testfiles/common/inputFileHasTabIndex-fail-2.html new file mode 100644 index 000000000..e7f34db7e --- /dev/null +++ b/test/testfiles/common/inputFileHasTabIndex-fail-2.html @@ -0,0 +1,29 @@ + + + + + inputFileHasTabIndex-fail-2 + + + + +
        +

        + : + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputFileHasTabIndex-fail.html b/test/testfiles/common/inputFileHasTabIndex-fail.html new file mode 100644 index 000000000..fc92923d4 --- /dev/null +++ b/test/testfiles/common/inputFileHasTabIndex-fail.html @@ -0,0 +1,29 @@ + + + + + inputFileHasTabIndex-fail + + + + +
        +

        + : + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputFileHasTabIndex-pass.html b/test/testfiles/common/inputFileHasTabIndex-pass.html new file mode 100644 index 000000000..ecb4fd80f --- /dev/null +++ b/test/testfiles/common/inputFileHasTabIndex-pass.html @@ -0,0 +1,29 @@ + + + + + inputFileHasTabIndex-pass + + + + +
        +

        + : + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputImageAltIdentifiesPurpose-fail-2.html b/test/testfiles/common/inputImageAltIdentifiesPurpose-fail-2.html new file mode 100644 index 000000000..df77d89cb --- /dev/null +++ b/test/testfiles/common/inputImageAltIdentifiesPurpose-fail-2.html @@ -0,0 +1,29 @@ + + + + + inputImageAltIdentifiesPurpose-fail-2 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputImageAltIdentifiesPurpose-fail.html b/test/testfiles/common/inputImageAltIdentifiesPurpose-fail.html new file mode 100644 index 000000000..398d0ef48 --- /dev/null +++ b/test/testfiles/common/inputImageAltIdentifiesPurpose-fail.html @@ -0,0 +1,29 @@ + + + + + inputImageAltIdentifiesPurpose-fail + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputImageAltIsNotFileName-fail.html b/test/testfiles/common/inputImageAltIsNotFileName-fail.html new file mode 100644 index 000000000..0792a6313 --- /dev/null +++ b/test/testfiles/common/inputImageAltIsNotFileName-fail.html @@ -0,0 +1,29 @@ + + + + + inputImageAltIsNotFileName-fail + + + + +
        + : +
        +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputImageAltIsNotFileName-pass.html b/test/testfiles/common/inputImageAltIsNotFileName-pass.html new file mode 100644 index 000000000..cd259a7f7 --- /dev/null +++ b/test/testfiles/common/inputImageAltIsNotFileName-pass.html @@ -0,0 +1,29 @@ + + + + + inputImageAltIsNotFileName-pass + + + + +
        + : +
        +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputImageAltIsNotPlaceholder-fail-2.html b/test/testfiles/common/inputImageAltIsNotPlaceholder-fail-2.html new file mode 100644 index 000000000..f1b24ba23 --- /dev/null +++ b/test/testfiles/common/inputImageAltIsNotPlaceholder-fail-2.html @@ -0,0 +1,29 @@ + + + + + inputImageAltIsNotPlaceholder-fail-2 + + + + +
        + : +
        +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputImageAltIsNotPlaceholder-fail-3.html b/test/testfiles/common/inputImageAltIsNotPlaceholder-fail-3.html new file mode 100644 index 000000000..ce6cfd99b --- /dev/null +++ b/test/testfiles/common/inputImageAltIsNotPlaceholder-fail-3.html @@ -0,0 +1,29 @@ + + + + + inputImageAltIsNotPlaceholder-fail-3 + + + + +
        + : +
        +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputImageAltIsNotPlaceholder-fail.html b/test/testfiles/common/inputImageAltIsNotPlaceholder-fail.html new file mode 100644 index 000000000..0f6c9c960 --- /dev/null +++ b/test/testfiles/common/inputImageAltIsNotPlaceholder-fail.html @@ -0,0 +1,29 @@ + + + + + inputImageAltIsNotPlaceholder-fail + + + + +
        + : +
        +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputImageAltIsNotPlaceholder-pass.html b/test/testfiles/common/inputImageAltIsNotPlaceholder-pass.html new file mode 100644 index 000000000..0cd20d5e4 --- /dev/null +++ b/test/testfiles/common/inputImageAltIsNotPlaceholder-pass.html @@ -0,0 +1,29 @@ + + + + + inputImageAltIsNotPlaceholder-pass + + + + +
        + : +
        +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputImageAltIsShort-fail.html b/test/testfiles/common/inputImageAltIsShort-fail.html new file mode 100644 index 000000000..3b66647a4 --- /dev/null +++ b/test/testfiles/common/inputImageAltIsShort-fail.html @@ -0,0 +1,29 @@ + + + + + inputImageAltIsShort-fail + + + + +
        + : +
        +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputImageAltIsShort-pass.html b/test/testfiles/common/inputImageAltIsShort-pass.html new file mode 100644 index 000000000..e12b02b93 --- /dev/null +++ b/test/testfiles/common/inputImageAltIsShort-pass.html @@ -0,0 +1,29 @@ + + + + + inputImageAltIsShort-pass + + + + +
        + : +
        +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputImageAltNotRedundant-fail.html b/test/testfiles/common/inputImageAltNotRedundant-fail.html new file mode 100644 index 000000000..bf07e01c2 --- /dev/null +++ b/test/testfiles/common/inputImageAltNotRedundant-fail.html @@ -0,0 +1,27 @@ + + + + + inputImageAltNotRedundant-fail + + + + +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputImageAltNotRedundant-pass.html b/test/testfiles/common/inputImageAltNotRedundant-pass.html new file mode 100644 index 000000000..2188fb1da --- /dev/null +++ b/test/testfiles/common/inputImageAltNotRedundant-pass.html @@ -0,0 +1,27 @@ + + + + + inputImageAltNotRedundant-pass + + + + +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputImageHasAlt-fail.html b/test/testfiles/common/inputImageHasAlt-fail.html new file mode 100644 index 000000000..78f8f2f8a --- /dev/null +++ b/test/testfiles/common/inputImageHasAlt-fail.html @@ -0,0 +1,28 @@ + + + + + inputImageHasAlt-fail + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputImageHasAlt-pass.html b/test/testfiles/common/inputImageHasAlt-pass.html new file mode 100644 index 000000000..ef2da5352 --- /dev/null +++ b/test/testfiles/common/inputImageHasAlt-pass.html @@ -0,0 +1,29 @@ + + + + + inputImageHasAlt-pass + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputImageNotDecorative-fail-2.html b/test/testfiles/common/inputImageNotDecorative-fail-2.html new file mode 100644 index 000000000..dc8db06f7 --- /dev/null +++ b/test/testfiles/common/inputImageNotDecorative-fail-2.html @@ -0,0 +1,29 @@ + + + + + inputImageNotDecorative-fail-2 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputImageNotDecorative-fail.html b/test/testfiles/common/inputImageNotDecorative-fail.html new file mode 100644 index 000000000..f899b5367 --- /dev/null +++ b/test/testfiles/common/inputImageNotDecorative-fail.html @@ -0,0 +1,29 @@ + + + + + inputImageNotDecorative-fail + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputPasswordHasTabIndex-fail-2.html b/test/testfiles/common/inputPasswordHasTabIndex-fail-2.html new file mode 100644 index 000000000..1919718b9 --- /dev/null +++ b/test/testfiles/common/inputPasswordHasTabIndex-fail-2.html @@ -0,0 +1,30 @@ + + + + + inputPasswordHasTabIndex-fail-2 + + + + +
        +

        + : + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputPasswordHasTabIndex-fail.html b/test/testfiles/common/inputPasswordHasTabIndex-fail.html new file mode 100644 index 000000000..ef98d3b12 --- /dev/null +++ b/test/testfiles/common/inputPasswordHasTabIndex-fail.html @@ -0,0 +1,30 @@ + + + + + inputPasswordHasTabIndex-fail + + + + +
        +

        + : + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputPasswordHasTabIndex-pass.html b/test/testfiles/common/inputPasswordHasTabIndex-pass.html new file mode 100644 index 000000000..074f8603b --- /dev/null +++ b/test/testfiles/common/inputPasswordHasTabIndex-pass.html @@ -0,0 +1,30 @@ + + + + + inputPasswordHasTabIndex-pass + + + + +
        +

        + : + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputRadioHasTabIndex-fail-2.html b/test/testfiles/common/inputRadioHasTabIndex-fail-2.html new file mode 100644 index 000000000..dfd4448fa --- /dev/null +++ b/test/testfiles/common/inputRadioHasTabIndex-fail-2.html @@ -0,0 +1,30 @@ + + + + + inputRadioHasTabIndex-fail-2 + + + + +
        +

        + : + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputRadioHasTabIndex-fail.html b/test/testfiles/common/inputRadioHasTabIndex-fail.html new file mode 100644 index 000000000..ea4594b91 --- /dev/null +++ b/test/testfiles/common/inputRadioHasTabIndex-fail.html @@ -0,0 +1,30 @@ + + + + + inputRadioHasTabIndex-fail + + + + +
        +

        + : + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputRadioHasTabIndex-pass.html b/test/testfiles/common/inputRadioHasTabIndex-pass.html new file mode 100644 index 000000000..83c97873e --- /dev/null +++ b/test/testfiles/common/inputRadioHasTabIndex-pass.html @@ -0,0 +1,30 @@ + + + + + inputRadioHasTabIndex-pass + + + + +
        +

        + : + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputSubmitHasTabIndex-fail-2.html b/test/testfiles/common/inputSubmitHasTabIndex-fail-2.html new file mode 100644 index 000000000..d84342c4a --- /dev/null +++ b/test/testfiles/common/inputSubmitHasTabIndex-fail-2.html @@ -0,0 +1,28 @@ + + + + + inputSubmitHasTabIndex-fail-2 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputSubmitHasTabIndex-fail.html b/test/testfiles/common/inputSubmitHasTabIndex-fail.html new file mode 100644 index 000000000..9b715860b --- /dev/null +++ b/test/testfiles/common/inputSubmitHasTabIndex-fail.html @@ -0,0 +1,28 @@ + + + + + inputSubmitHasTabIndex-fail + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputSubmitHasTabIndex-pass.html b/test/testfiles/common/inputSubmitHasTabIndex-pass.html new file mode 100644 index 000000000..8f402faab --- /dev/null +++ b/test/testfiles/common/inputSubmitHasTabIndex-pass.html @@ -0,0 +1,28 @@ + + + + + inputSubmitHasTabIndex-pass + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputTextHasLabel-fail-2.html b/test/testfiles/common/inputTextHasLabel-fail-2.html new file mode 100644 index 000000000..2599370fd --- /dev/null +++ b/test/testfiles/common/inputTextHasLabel-fail-2.html @@ -0,0 +1,28 @@ + + + + + inputTextHasLabel-fail-2 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputTextHasLabel-fail-3.html b/test/testfiles/common/inputTextHasLabel-fail-3.html new file mode 100644 index 000000000..aa52b0473 --- /dev/null +++ b/test/testfiles/common/inputTextHasLabel-fail-3.html @@ -0,0 +1,27 @@ + + + + + inputTextHasLabel-fail-3 + + + + +
        Name: + + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputTextHasLabel-fail.html b/test/testfiles/common/inputTextHasLabel-fail.html new file mode 100644 index 000000000..4e8366431 --- /dev/null +++ b/test/testfiles/common/inputTextHasLabel-fail.html @@ -0,0 +1,29 @@ + + + + + inputTextHasLabel-fail + + + + +
        +

        + + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputTextHasLabel-pass-2.html b/test/testfiles/common/inputTextHasLabel-pass-2.html new file mode 100644 index 000000000..bc0bc2769 --- /dev/null +++ b/test/testfiles/common/inputTextHasLabel-pass-2.html @@ -0,0 +1,30 @@ + + + + + inputTextHasLabel-pass-2 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputTextHasLabel-pass.html b/test/testfiles/common/inputTextHasLabel-pass.html new file mode 100644 index 000000000..86ddeb9f8 --- /dev/null +++ b/test/testfiles/common/inputTextHasLabel-pass.html @@ -0,0 +1,30 @@ + + + + + inputTextHasLabel-pass + + + + +
        +

        + + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputTextHasTabIndex-fail-2.html b/test/testfiles/common/inputTextHasTabIndex-fail-2.html new file mode 100644 index 000000000..b922a99bb --- /dev/null +++ b/test/testfiles/common/inputTextHasTabIndex-fail-2.html @@ -0,0 +1,30 @@ + + + + + inputTextHasTabIndex-fail-2 + + + + +
        +

        + : + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputTextHasTabIndex-fail.html b/test/testfiles/common/inputTextHasTabIndex-fail.html new file mode 100644 index 000000000..8112f011d --- /dev/null +++ b/test/testfiles/common/inputTextHasTabIndex-fail.html @@ -0,0 +1,30 @@ + + + + + inputTextHasTabIndex-fail + + + + +
        +

        + : + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputTextHasTabIndex-pass.html b/test/testfiles/common/inputTextHasTabIndex-pass.html new file mode 100644 index 000000000..4a32c65bc --- /dev/null +++ b/test/testfiles/common/inputTextHasTabIndex-pass.html @@ -0,0 +1,30 @@ + + + + + inputTextHasTabIndex-pass + + + + +
        +

        + : + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputTextHasValue-fail.html b/test/testfiles/common/inputTextHasValue-fail.html new file mode 100644 index 000000000..8d51e2b71 --- /dev/null +++ b/test/testfiles/common/inputTextHasValue-fail.html @@ -0,0 +1,29 @@ + + + + + inputTextHasValue-fail + + + + +
        + : + + +
        + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputTextHasValue-pass.html b/test/testfiles/common/inputTextHasValue-pass.html new file mode 100644 index 000000000..48f572648 --- /dev/null +++ b/test/testfiles/common/inputTextHasValue-pass.html @@ -0,0 +1,29 @@ + + + + + inputTextHasValue-pass + + + + +
        + : + + +
        + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputTextValueNotEmpty-fail.html b/test/testfiles/common/inputTextValueNotEmpty-fail.html new file mode 100644 index 000000000..3963b1d64 --- /dev/null +++ b/test/testfiles/common/inputTextValueNotEmpty-fail.html @@ -0,0 +1,27 @@ + + + + + inputTextValueNotEmpty-fail + + + + +
        + + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/inputTextValueNotEmpty-pass.html b/test/testfiles/common/inputTextValueNotEmpty-pass.html new file mode 100644 index 000000000..e8f6d5e3b --- /dev/null +++ b/test/testfiles/common/inputTextValueNotEmpty-pass.html @@ -0,0 +1,26 @@ + + + + + inputTextValueNotEmpty-pass + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/labelDoesNotContainInput-fail.html b/test/testfiles/common/labelDoesNotContainInput-fail.html new file mode 100644 index 000000000..68cbb3783 --- /dev/null +++ b/test/testfiles/common/labelDoesNotContainInput-fail.html @@ -0,0 +1,28 @@ + + + + + labelDoesNotContainInput-fail + + + + +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/labelDoesNotContainInput-pass.html b/test/testfiles/common/labelDoesNotContainInput-pass.html new file mode 100644 index 000000000..73245c608 --- /dev/null +++ b/test/testfiles/common/labelDoesNotContainInput-pass.html @@ -0,0 +1,27 @@ + + + + + labelDoesNotContainInput-pass + + + + +
        + + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/labelMustBeUnique-fail.html b/test/testfiles/common/labelMustBeUnique-fail.html new file mode 100644 index 000000000..ae5d9a77c --- /dev/null +++ b/test/testfiles/common/labelMustBeUnique-fail.html @@ -0,0 +1,28 @@ + + + + + labelMustBeUnique-fail + + + + +
        + + + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/labelMustBeUnique-pass.html b/test/testfiles/common/labelMustBeUnique-pass.html new file mode 100644 index 000000000..f1dabf113 --- /dev/null +++ b/test/testfiles/common/labelMustBeUnique-pass.html @@ -0,0 +1,27 @@ + + + + + labelMustBeUnique-pass + + + + +
        + + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/labelMustNotBeEmpty-fail-2.html b/test/testfiles/common/labelMustNotBeEmpty-fail-2.html new file mode 100644 index 000000000..d137aa1fd --- /dev/null +++ b/test/testfiles/common/labelMustNotBeEmpty-fail-2.html @@ -0,0 +1,29 @@ + + + + + labelMustNotBeEmpty-fail-2 + + + + +
        +

        + + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/labelMustNotBeEmpty-fail-3.html b/test/testfiles/common/labelMustNotBeEmpty-fail-3.html new file mode 100644 index 000000000..b61eed8a5 --- /dev/null +++ b/test/testfiles/common/labelMustNotBeEmpty-fail-3.html @@ -0,0 +1,31 @@ + + + + + labelMustNotBeEmpty-fail-3 + + + + +
        +

        + + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/labelMustNotBeEmpty-fail.html b/test/testfiles/common/labelMustNotBeEmpty-fail.html new file mode 100644 index 000000000..6df6dfc38 --- /dev/null +++ b/test/testfiles/common/labelMustNotBeEmpty-fail.html @@ -0,0 +1,29 @@ + + + + + labelMustNotBeEmpty-fail + + + + +
        +

        + + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/labelMustNotBeEmpty-pass-2.html b/test/testfiles/common/labelMustNotBeEmpty-pass-2.html new file mode 100644 index 000000000..6231d9aac --- /dev/null +++ b/test/testfiles/common/labelMustNotBeEmpty-pass-2.html @@ -0,0 +1,31 @@ + + + + + labelMustNotBeEmpty-pass-2 + + + + +
        +

        + + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/labelMustNotBeEmpty-pass.html b/test/testfiles/common/labelMustNotBeEmpty-pass.html new file mode 100644 index 000000000..753e6ebf6 --- /dev/null +++ b/test/testfiles/common/labelMustNotBeEmpty-pass.html @@ -0,0 +1,29 @@ + + + + + labelMustNotBeEmpty-pass + + + + +
        +

        + + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/legendDescribesListOfChoices-fail-2.html b/test/testfiles/common/legendDescribesListOfChoices-fail-2.html new file mode 100644 index 000000000..733a6f569 --- /dev/null +++ b/test/testfiles/common/legendDescribesListOfChoices-fail-2.html @@ -0,0 +1,42 @@ + + + + + legendDescribesListOfChoices-fail-2 + + + + +
        +
        + Donut Type +

        + + +
        + + +
        + + +

        +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/legendDescribesListOfChoices-fail.html b/test/testfiles/common/legendDescribesListOfChoices-fail.html new file mode 100644 index 000000000..d00bdbd10 --- /dev/null +++ b/test/testfiles/common/legendDescribesListOfChoices-fail.html @@ -0,0 +1,42 @@ + + + + + legendDescribesListOfChoices-fail + + + + +
        +
        + dogs +

        + + +
        + + +
        + + +

        +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/legendTextNotEmpty-fail.html b/test/testfiles/common/legendTextNotEmpty-fail.html new file mode 100644 index 000000000..8bf847bbc --- /dev/null +++ b/test/testfiles/common/legendTextNotEmpty-fail.html @@ -0,0 +1,42 @@ + + + + + legendTextNotEmpty-fail + + + + +
        +
        + +

        + + +
        + + +
        + + +

        +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/legendTextNotEmpty-pass.html b/test/testfiles/common/legendTextNotEmpty-pass.html new file mode 100644 index 000000000..3a842e21f --- /dev/null +++ b/test/testfiles/common/legendTextNotEmpty-pass.html @@ -0,0 +1,42 @@ + + + + + legendTextNotEmpty-pass + + + + +
        +
        + Donut Type +

        + + +
        + + +
        + + +

        +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/legendTextNotPlaceholder-fail.html b/test/testfiles/common/legendTextNotPlaceholder-fail.html new file mode 100644 index 000000000..7ae912b85 --- /dev/null +++ b/test/testfiles/common/legendTextNotPlaceholder-fail.html @@ -0,0 +1,42 @@ + + + + + legendTextNotPlaceholder-fail + + + + +
        +
        + legend +

        + + +
        + + +
        + + +

        +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/legendTextNotPlaceholder-pass.html b/test/testfiles/common/legendTextNotPlaceholder-pass.html new file mode 100644 index 000000000..9f838b88d --- /dev/null +++ b/test/testfiles/common/legendTextNotPlaceholder-pass.html @@ -0,0 +1,42 @@ + + + + + legendTextNotPlaceholder-pass + + + + +
        +
        + Donut Type +

        + + +
        + + +
        + + +

        +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/liDontUseImageForBullet-fail.html b/test/testfiles/common/liDontUseImageForBullet-fail.html new file mode 100644 index 000000000..a79ea2200 --- /dev/null +++ b/test/testfiles/common/liDontUseImageForBullet-fail.html @@ -0,0 +1,29 @@ + + + + + liDontUseImageForBullet-fail + + + + +
          +
        • + Item One
        • +
        • + Item Two
        • +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/liDontUseImageForBullet-pass.html b/test/testfiles/common/liDontUseImageForBullet-pass.html new file mode 100644 index 000000000..2c46cf028 --- /dev/null +++ b/test/testfiles/common/liDontUseImageForBullet-pass.html @@ -0,0 +1,27 @@ + + + + + liDontUseImageForBullet-pass + + + + +
          +
        • Item One
        • +
        • Item Two
        • +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/linkUsedForAlternateContent-fail.html b/test/testfiles/common/linkUsedForAlternateContent-fail.html new file mode 100644 index 000000000..264dc917b --- /dev/null +++ b/test/testfiles/common/linkUsedForAlternateContent-fail.html @@ -0,0 +1,23 @@ + + + + + linkUsedForAlternateContent-fail + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/linkUsedForAlternateContent-pass.html b/test/testfiles/common/linkUsedForAlternateContent-pass.html new file mode 100644 index 000000000..75111c7bf --- /dev/null +++ b/test/testfiles/common/linkUsedForAlternateContent-pass.html @@ -0,0 +1,23 @@ + + + + + linkUsedForAlternateContent-pass + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/listNotUsedForFormatting-fail.html b/test/testfiles/common/listNotUsedForFormatting-fail.html new file mode 100644 index 000000000..ac3d16ecf --- /dev/null +++ b/test/testfiles/common/listNotUsedForFormatting-fail.html @@ -0,0 +1,26 @@ + + + + + listNotUsedForFormatting-fail + + + + +
          +
        1. Item text
        2. +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/listNotUsedForFormatting-pass.html b/test/testfiles/common/listNotUsedForFormatting-pass.html new file mode 100644 index 000000000..2acc8bd5a --- /dev/null +++ b/test/testfiles/common/listNotUsedForFormatting-pass.html @@ -0,0 +1,27 @@ + + + + + listNotUsedForFormatting-pass + + + + +
          +
        1. Item text 1
        2. +
        3. Item text 2
        4. +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/marqueeIsNotUsed-fail.html b/test/testfiles/common/marqueeIsNotUsed-fail.html new file mode 100644 index 000000000..f4325184a --- /dev/null +++ b/test/testfiles/common/marqueeIsNotUsed-fail.html @@ -0,0 +1,26 @@ + + + + + marqueeIsNotUsed-fail + + + + +

        + this is marquee text +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/marqueeIsNotUsed-pass.html b/test/testfiles/common/marqueeIsNotUsed-pass.html new file mode 100644 index 000000000..6416f7937 --- /dev/null +++ b/test/testfiles/common/marqueeIsNotUsed-pass.html @@ -0,0 +1,25 @@ + + + + + marqueeIsNotUsed-pass + + + + +

        There is no marquee text in this document.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/menuNotUsedToFormatText-fail.html b/test/testfiles/common/menuNotUsedToFormatText-fail.html new file mode 100644 index 000000000..6faf5ac98 --- /dev/null +++ b/test/testfiles/common/menuNotUsedToFormatText-fail.html @@ -0,0 +1,26 @@ + + + + + menuNotUsedToFormatText-fail + + + + + +
      1. some text
      2. +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/menuNotUsedToFormatText-pass.html b/test/testfiles/common/menuNotUsedToFormatText-pass.html new file mode 100644 index 000000000..8631d7474 --- /dev/null +++ b/test/testfiles/common/menuNotUsedToFormatText-pass.html @@ -0,0 +1,23 @@ + + + + + menuNotUsedToFormatText-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/noembedHasEquivalentContent-fail.html b/test/testfiles/common/noembedHasEquivalentContent-fail.html new file mode 100644 index 000000000..76d2f7657 --- /dev/null +++ b/test/testfiles/common/noembedHasEquivalentContent-fail.html @@ -0,0 +1,26 @@ + + + + + noembedHasEquivalentContent-fail + + + + + + Alternate content for the embed + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/noembedHasEquivalentContent-pass.html b/test/testfiles/common/noembedHasEquivalentContent-pass.html new file mode 100644 index 000000000..7e761129c --- /dev/null +++ b/test/testfiles/common/noembedHasEquivalentContent-pass.html @@ -0,0 +1,24 @@ + + + + + noembedHasEquivalentContent-pass + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectContentUsableWhenDisabled-fail.html b/test/testfiles/common/objectContentUsableWhenDisabled-fail.html new file mode 100644 index 000000000..79fbcc3cb --- /dev/null +++ b/test/testfiles/common/objectContentUsableWhenDisabled-fail.html @@ -0,0 +1,24 @@ + + + + + objectContentUsableWhenDisabled-fail + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectContentUsableWhenDisabled-pass.html b/test/testfiles/common/objectContentUsableWhenDisabled-pass.html new file mode 100644 index 000000000..530bdc50f --- /dev/null +++ b/test/testfiles/common/objectContentUsableWhenDisabled-pass.html @@ -0,0 +1,23 @@ + + + + + objectContentUsableWhenDisabled-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectDoesNotFlicker-fail-2.html b/test/testfiles/common/objectDoesNotFlicker-fail-2.html new file mode 100644 index 000000000..d7793e0a9 --- /dev/null +++ b/test/testfiles/common/objectDoesNotFlicker-fail-2.html @@ -0,0 +1,25 @@ + + + + + objectDoesNotFlicker-fail-2 + + + + +

        There is not a real object here. I need an object that does not flicker.

        + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectDoesNotFlicker-fail.html b/test/testfiles/common/objectDoesNotFlicker-fail.html new file mode 100644 index 000000000..008603e26 --- /dev/null +++ b/test/testfiles/common/objectDoesNotFlicker-fail.html @@ -0,0 +1,25 @@ + + + + + objectDoesNotFlicker-fail + + + + +

        There is not a real object here. I need an object that flickers.

        + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectDoesNotUseColorAlone-fail.html b/test/testfiles/common/objectDoesNotUseColorAlone-fail.html new file mode 100644 index 000000000..a6647eca9 --- /dev/null +++ b/test/testfiles/common/objectDoesNotUseColorAlone-fail.html @@ -0,0 +1,24 @@ + + + + + objectDoesNotUseColorAlone-fail + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectDoesNotUseColorAlone-pass.html b/test/testfiles/common/objectDoesNotUseColorAlone-pass.html new file mode 100644 index 000000000..dfc996bfc --- /dev/null +++ b/test/testfiles/common/objectDoesNotUseColorAlone-pass.html @@ -0,0 +1,23 @@ + + + + + objectDoesNotUseColorAlone-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectInterfaceIsAccessible-fail.html b/test/testfiles/common/objectInterfaceIsAccessible-fail.html new file mode 100644 index 000000000..b33710c97 --- /dev/null +++ b/test/testfiles/common/objectInterfaceIsAccessible-fail.html @@ -0,0 +1,24 @@ + + + + + objectInterfaceIsAccessible-fail + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectInterfaceIsAccessible-pass.html b/test/testfiles/common/objectInterfaceIsAccessible-pass.html new file mode 100644 index 000000000..37c53c8fc --- /dev/null +++ b/test/testfiles/common/objectInterfaceIsAccessible-pass.html @@ -0,0 +1,23 @@ + + + + + objectInterfaceIsAccessible-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectLinkToMultimediaHasTextTranscript-fail.html b/test/testfiles/common/objectLinkToMultimediaHasTextTranscript-fail.html new file mode 100644 index 000000000..9162be15f --- /dev/null +++ b/test/testfiles/common/objectLinkToMultimediaHasTextTranscript-fail.html @@ -0,0 +1,24 @@ + + + + + objectLinkToMultimediaHasTextTranscript-fail + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectLinkToMultimediaHasTextTranscript-pass.html b/test/testfiles/common/objectLinkToMultimediaHasTextTranscript-pass.html new file mode 100644 index 000000000..92d3152f1 --- /dev/null +++ b/test/testfiles/common/objectLinkToMultimediaHasTextTranscript-pass.html @@ -0,0 +1,23 @@ + + + + + objectLinkToMultimediaHasTextTranscript-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectMustContainText-fail-2.html b/test/testfiles/common/objectMustContainText-fail-2.html new file mode 100644 index 000000000..5d6cb6b2f --- /dev/null +++ b/test/testfiles/common/objectMustContainText-fail-2.html @@ -0,0 +1,26 @@ + + + + + objectMustContainText-fail-2 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectMustContainText-fail.html b/test/testfiles/common/objectMustContainText-fail.html new file mode 100644 index 000000000..d8a3ce3ed --- /dev/null +++ b/test/testfiles/common/objectMustContainText-fail.html @@ -0,0 +1,24 @@ + + + + + objectMustContainText-fail + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectMustContainText-pass.html b/test/testfiles/common/objectMustContainText-pass.html new file mode 100644 index 000000000..94e30a4bc --- /dev/null +++ b/test/testfiles/common/objectMustContainText-pass.html @@ -0,0 +1,25 @@ + + + + + objectMustContainText-pass + + + + + Here is some text that describes the object and its operation. + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectMustHaveEmbed-fail.html b/test/testfiles/common/objectMustHaveEmbed-fail.html new file mode 100644 index 000000000..94828c16b --- /dev/null +++ b/test/testfiles/common/objectMustHaveEmbed-fail.html @@ -0,0 +1,27 @@ + + + + + objectMustHaveEmbed-fail + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectMustHaveEmbed-pass.html b/test/testfiles/common/objectMustHaveEmbed-pass.html new file mode 100644 index 000000000..6ca846d1f --- /dev/null +++ b/test/testfiles/common/objectMustHaveEmbed-pass.html @@ -0,0 +1,33 @@ + + + + + objectMustHaveEmbed-pass + + + + + + + + + <img alt="Still from Movie" "resources/moviename.gif" width="100" height="80" + /> + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectMustHaveTitle-fail.html b/test/testfiles/common/objectMustHaveTitle-fail.html new file mode 100644 index 000000000..a03115d6b --- /dev/null +++ b/test/testfiles/common/objectMustHaveTitle-fail.html @@ -0,0 +1,25 @@ + + + + + objectMustHaveTitle-fail + + + + + The text equivalent for the object should go here. + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectMustHaveTitle-pass.html b/test/testfiles/common/objectMustHaveTitle-pass.html new file mode 100644 index 000000000..fe008061f --- /dev/null +++ b/test/testfiles/common/objectMustHaveTitle-pass.html @@ -0,0 +1,25 @@ + + + + + objectMustHaveTitle-pass + + + + + The text equivalent for the object should go here. + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectMustHaveValidTitle-fail-2.html b/test/testfiles/common/objectMustHaveValidTitle-fail-2.html new file mode 100644 index 000000000..23d0ffb9a --- /dev/null +++ b/test/testfiles/common/objectMustHaveValidTitle-fail-2.html @@ -0,0 +1,26 @@ + + + + + objectMustHaveValidTitle-fail-2 + + + + + The text equivalent for the object should go here. + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectMustHaveValidTitle-fail.html b/test/testfiles/common/objectMustHaveValidTitle-fail.html new file mode 100644 index 000000000..f80511cd4 --- /dev/null +++ b/test/testfiles/common/objectMustHaveValidTitle-fail.html @@ -0,0 +1,25 @@ + + + + + objectMustHaveValidTitle-fail + + + + + The text equivalent for the object should go here. + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectMustHaveValidTitle-pass.html b/test/testfiles/common/objectMustHaveValidTitle-pass.html new file mode 100644 index 000000000..ffa1e36af --- /dev/null +++ b/test/testfiles/common/objectMustHaveValidTitle-pass.html @@ -0,0 +1,25 @@ + + + + + objectMustHaveValidTitle-pass + + + + + The text equivalent for the object should go here. + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectProvidesMechanismToReturnToParent-fail-2.html b/test/testfiles/common/objectProvidesMechanismToReturnToParent-fail-2.html new file mode 100644 index 000000000..c84fcbcd8 --- /dev/null +++ b/test/testfiles/common/objectProvidesMechanismToReturnToParent-fail-2.html @@ -0,0 +1,26 @@ + + + + + objectProvidesMechanismToReturnToParent-fail-2 + + + + +

        The following object is not working. This is just an example.

        + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectProvidesMechanismToReturnToParent-fail.html b/test/testfiles/common/objectProvidesMechanismToReturnToParent-fail.html new file mode 100644 index 000000000..1ed8f9a79 --- /dev/null +++ b/test/testfiles/common/objectProvidesMechanismToReturnToParent-fail.html @@ -0,0 +1,26 @@ + + + + + objectProvidesMechanismToReturnToParent-fail + + + + +

        The following object is not working. This is just an example.

        + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectShouldHaveLongDescription-fail.html b/test/testfiles/common/objectShouldHaveLongDescription-fail.html new file mode 100644 index 000000000..be50ac31a --- /dev/null +++ b/test/testfiles/common/objectShouldHaveLongDescription-fail.html @@ -0,0 +1,24 @@ + + + + + objectShouldHaveLongDescription-fail + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectShouldHaveLongDescription-pass.html b/test/testfiles/common/objectShouldHaveLongDescription-pass.html new file mode 100644 index 000000000..72e513984 --- /dev/null +++ b/test/testfiles/common/objectShouldHaveLongDescription-pass.html @@ -0,0 +1,23 @@ + + + + + objectShouldHaveLongDescription-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectTextUpdatesWhenObjectChanges-fail.html b/test/testfiles/common/objectTextUpdatesWhenObjectChanges-fail.html new file mode 100644 index 000000000..18a0c614b --- /dev/null +++ b/test/testfiles/common/objectTextUpdatesWhenObjectChanges-fail.html @@ -0,0 +1,24 @@ + + + + + objectTextUpdatesWhenObjectChanges-fail + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectTextUpdatesWhenObjectChanges-pass.html b/test/testfiles/common/objectTextUpdatesWhenObjectChanges-pass.html new file mode 100644 index 000000000..579855f8a --- /dev/null +++ b/test/testfiles/common/objectTextUpdatesWhenObjectChanges-pass.html @@ -0,0 +1,23 @@ + + + + + objectTextUpdatesWhenObjectChanges-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectUIMustBeAccessible-fail.html b/test/testfiles/common/objectUIMustBeAccessible-fail.html new file mode 100644 index 000000000..1bf68db2b --- /dev/null +++ b/test/testfiles/common/objectUIMustBeAccessible-fail.html @@ -0,0 +1,24 @@ + + + + + objectUIMustBeAccessible-fail + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectWithClassIDHasNoText-fail.html b/test/testfiles/common/objectWithClassIDHasNoText-fail.html new file mode 100644 index 000000000..ab0ddf552 --- /dev/null +++ b/test/testfiles/common/objectWithClassIDHasNoText-fail.html @@ -0,0 +1,24 @@ + + + + + objectWithClassIDHasNoText-fail + + + + + text equiv for object + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/objectWithClassIDHasNoText-pass.html b/test/testfiles/common/objectWithClassIDHasNoText-pass.html new file mode 100644 index 000000000..091336f65 --- /dev/null +++ b/test/testfiles/common/objectWithClassIDHasNoText-pass.html @@ -0,0 +1,24 @@ + + + + + objectWithClassIDHasNoText-pass + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/pNotUsedAsHeader-fail-2.html b/test/testfiles/common/pNotUsedAsHeader-fail-2.html new file mode 100644 index 000000000..f1f1b094e --- /dev/null +++ b/test/testfiles/common/pNotUsedAsHeader-fail-2.html @@ -0,0 +1,27 @@ + + + + + pNotUsedAsHeader-fail-2 + + + + +
        +

        Looks like a header +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/pNotUsedAsHeader-fail-3.html b/test/testfiles/common/pNotUsedAsHeader-fail-3.html new file mode 100644 index 000000000..f1beac1bb --- /dev/null +++ b/test/testfiles/common/pNotUsedAsHeader-fail-3.html @@ -0,0 +1,27 @@ + + + + + pNotUsedAsHeader-fail-3 + + + + +
        +

        Looks like a header +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/pNotUsedAsHeader-fail-4.html b/test/testfiles/common/pNotUsedAsHeader-fail-4.html new file mode 100644 index 000000000..e7ce61cc0 --- /dev/null +++ b/test/testfiles/common/pNotUsedAsHeader-fail-4.html @@ -0,0 +1,27 @@ + + + + + pNotUsedAsHeader-fail-4 + + + + +
        +

        Looks like a header +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/pNotUsedAsHeader-fail-5.html b/test/testfiles/common/pNotUsedAsHeader-fail-5.html new file mode 100644 index 000000000..4a2aab996 --- /dev/null +++ b/test/testfiles/common/pNotUsedAsHeader-fail-5.html @@ -0,0 +1,27 @@ + + + + + pNotUsedAsHeader-fail-5 + + + + +
        +

        Looks like a header +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/pNotUsedAsHeader-fail-6.html b/test/testfiles/common/pNotUsedAsHeader-fail-6.html new file mode 100644 index 000000000..498f8dc0f --- /dev/null +++ b/test/testfiles/common/pNotUsedAsHeader-fail-6.html @@ -0,0 +1,27 @@ + + + + + pNotUsedAsHeader-fail-6 + + + + +
        +

        Looks like a header +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/pNotUsedAsHeader-fail-7.html b/test/testfiles/common/pNotUsedAsHeader-fail-7.html new file mode 100644 index 000000000..ef975272a --- /dev/null +++ b/test/testfiles/common/pNotUsedAsHeader-fail-7.html @@ -0,0 +1,27 @@ + + + + + pNotUsedAsHeader-fail-7 + + + + +
        +

        A regular paragraph.

        +

        Looks like a header

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/pNotUsedAsHeader-fail.html b/test/testfiles/common/pNotUsedAsHeader-fail.html new file mode 100644 index 000000000..f7c53d4f0 --- /dev/null +++ b/test/testfiles/common/pNotUsedAsHeader-fail.html @@ -0,0 +1,27 @@ + + + + + pNotUsedAsHeader-fail + + + + +
        +

        Looks like a header +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/pNotUsedAsHeader-pass-2.html b/test/testfiles/common/pNotUsedAsHeader-pass-2.html new file mode 100644 index 000000000..523f0abdb --- /dev/null +++ b/test/testfiles/common/pNotUsedAsHeader-pass-2.html @@ -0,0 +1,30 @@ + + + + + pNotUsedAsHeader-pass-2 + + + + +
        +

        Nobis nulla sollemnes assum est volutpat. Et ii wisi hendrerit saepius + duis.

        +

        Looks like a header, but it's not.

        +

        Nobis nulla sollemnes assum est volutpat. Et ii wisi hendrerit saepius + duis.

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/pNotUsedAsHeader-pass.html b/test/testfiles/common/pNotUsedAsHeader-pass.html new file mode 100644 index 000000000..75f632816 --- /dev/null +++ b/test/testfiles/common/pNotUsedAsHeader-pass.html @@ -0,0 +1,26 @@ + + + + + pNotUsedAsHeader-pass + + + + +
        +

        This is a regular paragraph

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/passwordHasLabel-fail-2.html b/test/testfiles/common/passwordHasLabel-fail-2.html new file mode 100644 index 000000000..b0aab677b --- /dev/null +++ b/test/testfiles/common/passwordHasLabel-fail-2.html @@ -0,0 +1,28 @@ + + + + + passwordHasLabel-fail-2 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/passwordHasLabel-fail-3.html b/test/testfiles/common/passwordHasLabel-fail-3.html new file mode 100644 index 000000000..ed49454f9 --- /dev/null +++ b/test/testfiles/common/passwordHasLabel-fail-3.html @@ -0,0 +1,29 @@ + + + + + passwordHasLabel-fail-3 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/passwordHasLabel-fail-4.html b/test/testfiles/common/passwordHasLabel-fail-4.html new file mode 100644 index 000000000..8b853914f --- /dev/null +++ b/test/testfiles/common/passwordHasLabel-fail-4.html @@ -0,0 +1,30 @@ + + + + + passwordHasLabel-fail-4 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/passwordHasLabel-fail.html b/test/testfiles/common/passwordHasLabel-fail.html new file mode 100644 index 000000000..2c8a64fb5 --- /dev/null +++ b/test/testfiles/common/passwordHasLabel-fail.html @@ -0,0 +1,30 @@ + + + + + passwordHasLabel-fail + + + + +
        +

        + + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/passwordHasLabel-pass-2.html b/test/testfiles/common/passwordHasLabel-pass-2.html new file mode 100644 index 000000000..258d941e9 --- /dev/null +++ b/test/testfiles/common/passwordHasLabel-pass-2.html @@ -0,0 +1,30 @@ + + + + + passwordHasLabel-pass-2 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/passwordHasLabel-pass.html b/test/testfiles/common/passwordHasLabel-pass.html new file mode 100644 index 000000000..9e441c7b2 --- /dev/null +++ b/test/testfiles/common/passwordHasLabel-pass.html @@ -0,0 +1,30 @@ + + + + + passwordHasLabel-pass + + + + +
        +

        + + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/passwordLabelIsNearby-fail.html b/test/testfiles/common/passwordLabelIsNearby-fail.html new file mode 100644 index 000000000..4a74c7c78 --- /dev/null +++ b/test/testfiles/common/passwordLabelIsNearby-fail.html @@ -0,0 +1,42 @@ + + + + + passwordLabelIsNearby-fail + + + + +

        Please enter your password below:

        +
        + + + + + + + + +
        + + + +
        + +
        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/passwordLabelIsNearby-pass.html b/test/testfiles/common/passwordLabelIsNearby-pass.html new file mode 100644 index 000000000..ec232a90a --- /dev/null +++ b/test/testfiles/common/passwordLabelIsNearby-pass.html @@ -0,0 +1,40 @@ + + + + + passwordLabelIsNearby-pass + + + + +

        Please enter your password below:

        +
        + + + + + + + + +
        password: + +
        + +
        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/preShouldNotBeUsedForTabularLayout-fail.html b/test/testfiles/common/preShouldNotBeUsedForTabularLayout-fail.html new file mode 100644 index 000000000..c23e4bb3a --- /dev/null +++ b/test/testfiles/common/preShouldNotBeUsedForTabularLayout-fail.html @@ -0,0 +1,29 @@ + + + + + preShouldNotBeUsedForTabularLayout-fail + + + + +
        +     dogs  cats
        +big	  2     4
        +small 5     7
        +
        + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/preShouldNotBeUsedForTabularLayout-pass.html b/test/testfiles/common/preShouldNotBeUsedForTabularLayout-pass.html new file mode 100644 index 000000000..7a788a3e0 --- /dev/null +++ b/test/testfiles/common/preShouldNotBeUsedForTabularLayout-pass.html @@ -0,0 +1,23 @@ + + + + + preShouldNotBeUsedForTabularLayout-pass + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/radioHasLabel-fail-2.html b/test/testfiles/common/radioHasLabel-fail-2.html new file mode 100644 index 000000000..45a4fa9bb --- /dev/null +++ b/test/testfiles/common/radioHasLabel-fail-2.html @@ -0,0 +1,28 @@ + + + + + radioHasLabel-fail-2 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/radioHasLabel-fail-3.html b/test/testfiles/common/radioHasLabel-fail-3.html new file mode 100644 index 000000000..fd99af29a --- /dev/null +++ b/test/testfiles/common/radioHasLabel-fail-3.html @@ -0,0 +1,28 @@ + + + + + radioHasLabel-fail-3 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/radioHasLabel-fail-5.html b/test/testfiles/common/radioHasLabel-fail-5.html new file mode 100644 index 000000000..0e8bc5b88 --- /dev/null +++ b/test/testfiles/common/radioHasLabel-fail-5.html @@ -0,0 +1,30 @@ + + + + + radioHasLabel-fail-5 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/radioHasLabel-fail-6.html b/test/testfiles/common/radioHasLabel-fail-6.html new file mode 100644 index 000000000..6abfabb78 --- /dev/null +++ b/test/testfiles/common/radioHasLabel-fail-6.html @@ -0,0 +1,30 @@ + + + + + radioHasLabel-fail-6 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/radioHasLabel-fail.html b/test/testfiles/common/radioHasLabel-fail.html new file mode 100644 index 000000000..5f032d0d6 --- /dev/null +++ b/test/testfiles/common/radioHasLabel-fail.html @@ -0,0 +1,29 @@ + + + + + radioHasLabel-fail + + + + +
        +

        + + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/radioHasLabel-pass-2.html b/test/testfiles/common/radioHasLabel-pass-2.html new file mode 100644 index 000000000..7c687381a --- /dev/null +++ b/test/testfiles/common/radioHasLabel-pass-2.html @@ -0,0 +1,30 @@ + + + + + radioHasLabel-pass-2 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/radioHasLabel-pass.html b/test/testfiles/common/radioHasLabel-pass.html new file mode 100644 index 000000000..bceb284e0 --- /dev/null +++ b/test/testfiles/common/radioHasLabel-pass.html @@ -0,0 +1,30 @@ + + + + + radioHasLabel-pass + + + + +
        +

        + + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/radioLabelIsNearby-fail.html b/test/testfiles/common/radioLabelIsNearby-fail.html new file mode 100644 index 000000000..fb2c9dd5c --- /dev/null +++ b/test/testfiles/common/radioLabelIsNearby-fail.html @@ -0,0 +1,52 @@ + + + + + radioLabelIsNearby-fail + + + + +

        Select your favourite animal using the form below:

        +
        + + + + + + + + + + + + + + + + +
        + + dog
        + + cat
        + + polar bear
        + +
        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/radioLabelIsNearby-pass.html b/test/testfiles/common/radioLabelIsNearby-pass.html new file mode 100644 index 000000000..5e54fa3d1 --- /dev/null +++ b/test/testfiles/common/radioLabelIsNearby-pass.html @@ -0,0 +1,52 @@ + + + + + radioLabelIsNearby-pass + + + + +

        Select your favourite animal using the form below:

        +
        + + + + + + + + + + + + + + + + +
        + + dog
        + + cat
        + + polar bear
        + +
        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/radioMarkedWithFieldgroupAndLegend-fail.html b/test/testfiles/common/radioMarkedWithFieldgroupAndLegend-fail.html new file mode 100644 index 000000000..4d0855b08 --- /dev/null +++ b/test/testfiles/common/radioMarkedWithFieldgroupAndLegend-fail.html @@ -0,0 +1,38 @@ + + + + + radioMarkedWithFieldgroupAndLegend-fail + + + + +
        +

        + + +
        + + +
        + + +
        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/radioMarkedWithFieldgroupAndLegend-pass-2.html b/test/testfiles/common/radioMarkedWithFieldgroupAndLegend-pass-2.html new file mode 100644 index 000000000..4dac6fa99 --- /dev/null +++ b/test/testfiles/common/radioMarkedWithFieldgroupAndLegend-pass-2.html @@ -0,0 +1,31 @@ + + + + + radioMarkedWithFieldgroupAndLegend-pass-2 + + + + +
        +
        + + + + +
        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/radioMarkedWithFieldgroupAndLegend-pass-3.html b/test/testfiles/common/radioMarkedWithFieldgroupAndLegend-pass-3.html new file mode 100644 index 000000000..45fbddeb3 --- /dev/null +++ b/test/testfiles/common/radioMarkedWithFieldgroupAndLegend-pass-3.html @@ -0,0 +1,30 @@ + + + + + radioMarkedWithFieldgroupAndLegend-pass-3 + + + + +
        + Personal information + + + + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/radioMarkedWithFieldgroupAndLegend-pass.html b/test/testfiles/common/radioMarkedWithFieldgroupAndLegend-pass.html new file mode 100644 index 000000000..1b6395625 --- /dev/null +++ b/test/testfiles/common/radioMarkedWithFieldgroupAndLegend-pass.html @@ -0,0 +1,42 @@ + + + + + radioMarkedWithFieldgroupAndLegend-pass + + + + +
        +
        + Donut Type +

        + + +
        + + +
        + + +

        +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/resources/alternative1.html b/test/testfiles/common/resources/alternative1.html new file mode 100644 index 000000000..ac88ca554 --- /dev/null +++ b/test/testfiles/common/resources/alternative1.html @@ -0,0 +1,18 @@ + + + + + +Text Alternative For Gunfight Movie (Poor) + + + + +

        This movie shows a gunfight.

        + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/resources/alternative2.html b/test/testfiles/common/resources/alternative2.html new file mode 100644 index 000000000..6d2f3475b --- /dev/null +++ b/test/testfiles/common/resources/alternative2.html @@ -0,0 +1,20 @@ + + + + + +Text Alternative For Gunfight Movie (Good) + + + + +

        Harmonica sounds play softly in the background. The setting is a small dusty town in the wild +west days. The opening shot is the main street of the town under the bright noon sun. The harmonica sounds stop and only the wind can be heard softly. A tall man dressed all in black wearing +a black hat stands at the far end of the street. The shot changes to a closeup of the man's emotionless face. He spits tobacco juice on the ground but leaves some brown liquid dripping down his chin. He slowly speaks the words "It's about time now sheriff".

        + + + + + + + \ No newline at end of file diff --git a/test/testfiles/oac/avlab.mp3 b/test/testfiles/common/resources/avlab.mp3 similarity index 100% rename from test/testfiles/oac/avlab.mp3 rename to test/testfiles/common/resources/avlab.mp3 diff --git a/test/testfiles/oac/avlab.txt b/test/testfiles/common/resources/avlab.txt similarity index 100% rename from test/testfiles/oac/avlab.txt rename to test/testfiles/common/resources/avlab.txt diff --git a/test/testfiles/oac/big-fail.png b/test/testfiles/common/resources/big-fail.png similarity index 100% rename from test/testfiles/oac/big-fail.png rename to test/testfiles/common/resources/big-fail.png diff --git a/test/testfiles/oac/birds.html b/test/testfiles/common/resources/birds.html similarity index 100% rename from test/testfiles/oac/birds.html rename to test/testfiles/common/resources/birds.html diff --git a/test/testfiles/oac/chart.gif b/test/testfiles/common/resources/chart.gif similarity index 100% rename from test/testfiles/oac/chart.gif rename to test/testfiles/common/resources/chart.gif diff --git a/test/testfiles/oac/contrast1.gif b/test/testfiles/common/resources/contrast1.gif similarity index 100% rename from test/testfiles/oac/contrast1.gif rename to test/testfiles/common/resources/contrast1.gif diff --git a/test/testfiles/oac/contrast2.gif b/test/testfiles/common/resources/contrast2.gif similarity index 100% rename from test/testfiles/oac/contrast2.gif rename to test/testfiles/common/resources/contrast2.gif diff --git a/test/testfiles/oac/doc.html b/test/testfiles/common/resources/doc.html similarity index 100% rename from test/testfiles/oac/doc.html rename to test/testfiles/common/resources/doc.html diff --git a/test/testfiles/oac/eatatjoes.gif b/test/testfiles/common/resources/eatatjoes.gif similarity index 100% rename from test/testfiles/oac/eatatjoes.gif rename to test/testfiles/common/resources/eatatjoes.gif diff --git a/test/testfiles/oac/finddogs.gif b/test/testfiles/common/resources/finddogs.gif similarity index 100% rename from test/testfiles/oac/finddogs.gif rename to test/testfiles/common/resources/finddogs.gif diff --git a/test/testfiles/oac/fish.gif b/test/testfiles/common/resources/fish.gif similarity index 100% rename from test/testfiles/oac/fish.gif rename to test/testfiles/common/resources/fish.gif diff --git a/test/testfiles/common/resources/fish1.html b/test/testfiles/common/resources/fish1.html new file mode 100644 index 000000000..2a643d46a --- /dev/null +++ b/test/testfiles/common/resources/fish1.html @@ -0,0 +1,19 @@ + + + + + +Movement Using Animated GIF + + + + + + + + + + + + + diff --git a/test/testfiles/common/resources/fish2.html b/test/testfiles/common/resources/fish2.html new file mode 100644 index 000000000..5e013310c --- /dev/null +++ b/test/testfiles/common/resources/fish2.html @@ -0,0 +1,19 @@ + + + + + +No Movement, Static GIF + + + + + + + + + + + + + diff --git a/test/testfiles/oac/fishswim.gif b/test/testfiles/common/resources/fishswim.gif similarity index 100% rename from test/testfiles/oac/fishswim.gif rename to test/testfiles/common/resources/fishswim.gif diff --git a/test/testfiles/oac/go.gif b/test/testfiles/common/resources/go.gif similarity index 100% rename from test/testfiles/oac/go.gif rename to test/testfiles/common/resources/go.gif diff --git a/test/testfiles/oac/image.gif b/test/testfiles/common/resources/image.gif similarity index 100% rename from test/testfiles/oac/image.gif rename to test/testfiles/common/resources/image.gif diff --git a/test/testfiles/oac/library.gif b/test/testfiles/common/resources/library.gif similarity index 100% rename from test/testfiles/oac/library.gif rename to test/testfiles/common/resources/library.gif diff --git a/test/testfiles/oac/nav.html b/test/testfiles/common/resources/nav.html similarity index 100% rename from test/testfiles/oac/nav.html rename to test/testfiles/common/resources/nav.html diff --git a/test/testfiles/oac/renew.gif b/test/testfiles/common/resources/renew.gif similarity index 100% rename from test/testfiles/oac/renew.gif rename to test/testfiles/common/resources/renew.gif diff --git a/test/testfiles/oac/rex.gif b/test/testfiles/common/resources/rex.gif similarity index 100% rename from test/testfiles/oac/rex.gif rename to test/testfiles/common/resources/rex.gif diff --git a/test/testfiles/common/resources/rex.html b/test/testfiles/common/resources/rex.html new file mode 100644 index 000000000..29e309d9d --- /dev/null +++ b/test/testfiles/common/resources/rex.html @@ -0,0 +1,21 @@ + + + + + +Photo Of Rex + + + + + +

        Photo of a brown and black cat named Rex.

        + + + + + + + + + diff --git a/test/testfiles/oac/rex.jpg b/test/testfiles/common/resources/rex.jpg similarity index 100% rename from test/testfiles/oac/rex.jpg rename to test/testfiles/common/resources/rex.jpg diff --git a/test/testfiles/oac/spacer.gif b/test/testfiles/common/resources/spacer.gif similarity index 100% rename from test/testfiles/oac/spacer.gif rename to test/testfiles/common/resources/spacer.gif diff --git a/test/testfiles/oac/star.gif b/test/testfiles/common/resources/star.gif similarity index 100% rename from test/testfiles/oac/star.gif rename to test/testfiles/common/resources/star.gif diff --git a/test/testfiles/oac/submit.gif b/test/testfiles/common/resources/submit.gif similarity index 100% rename from test/testfiles/oac/submit.gif rename to test/testfiles/common/resources/submit.gif diff --git a/test/testfiles/oac/welcome.gif b/test/testfiles/common/resources/welcome.gif similarity index 100% rename from test/testfiles/oac/welcome.gif rename to test/testfiles/common/resources/welcome.gif diff --git a/test/testfiles/common/scriptContentAccessibleWithScriptsTurnedOff-fail-2.html b/test/testfiles/common/scriptContentAccessibleWithScriptsTurnedOff-fail-2.html new file mode 100644 index 000000000..cb6ad0dba --- /dev/null +++ b/test/testfiles/common/scriptContentAccessibleWithScriptsTurnedOff-fail-2.html @@ -0,0 +1,23 @@ + + + + + scriptContentAccessibleWithScriptsTurnedOff-fail-2 + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptContentAccessibleWithScriptsTurnedOff-fail.html b/test/testfiles/common/scriptContentAccessibleWithScriptsTurnedOff-fail.html new file mode 100644 index 000000000..ad0a09fbf --- /dev/null +++ b/test/testfiles/common/scriptContentAccessibleWithScriptsTurnedOff-fail.html @@ -0,0 +1,26 @@ + + + + + scriptContentAccessibleWithScriptsTurnedOff-fail + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptInBodyMustHaveNoscript-fail.html b/test/testfiles/common/scriptInBodyMustHaveNoscript-fail.html new file mode 100644 index 000000000..f35c739d4 --- /dev/null +++ b/test/testfiles/common/scriptInBodyMustHaveNoscript-fail.html @@ -0,0 +1,25 @@ + + + + + scriptInBodyMustHaveNoscript-fail + + + + There are scripts in here. + Somewhere. + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptInBodyMustHaveNoscript-pass.html b/test/testfiles/common/scriptInBodyMustHaveNoscript-pass.html new file mode 100644 index 000000000..beebebb3f --- /dev/null +++ b/test/testfiles/common/scriptInBodyMustHaveNoscript-pass.html @@ -0,0 +1,26 @@ + + + + + scriptInBodyMustHaveNoscript-pass + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptOnclickRequiresOnKeypress-fail.html b/test/testfiles/common/scriptOnclickRequiresOnKeypress-fail.html new file mode 100644 index 000000000..9972dcf79 --- /dev/null +++ b/test/testfiles/common/scriptOnclickRequiresOnKeypress-fail.html @@ -0,0 +1,26 @@ + + + + + scriptOnclickRequiresOnKeypress-fail + + + + +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptOnclickRequiresOnKeypress-fail2.html b/test/testfiles/common/scriptOnclickRequiresOnKeypress-fail2.html new file mode 100644 index 000000000..1ad8ec15e --- /dev/null +++ b/test/testfiles/common/scriptOnclickRequiresOnKeypress-fail2.html @@ -0,0 +1,32 @@ + + + + + scriptOnclickRequiresOnKeypress-fail2 + + + + +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptOnclickRequiresOnKeypress-pass.html b/test/testfiles/common/scriptOnclickRequiresOnKeypress-pass.html new file mode 100644 index 000000000..b9354b7a6 --- /dev/null +++ b/test/testfiles/common/scriptOnclickRequiresOnKeypress-pass.html @@ -0,0 +1,26 @@ + + + + + scriptOnclickRequiresOnKeypress-pass + + + + +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptOndblclickRequiresOnKeypress-fail.html b/test/testfiles/common/scriptOndblclickRequiresOnKeypress-fail.html new file mode 100644 index 000000000..ccbcf7994 --- /dev/null +++ b/test/testfiles/common/scriptOndblclickRequiresOnKeypress-fail.html @@ -0,0 +1,26 @@ + + + + + scriptOndblclickRequiresOnKeypress-fail + + + + +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptOndblclickRequiresOnKeypress-pass.html b/test/testfiles/common/scriptOndblclickRequiresOnKeypress-pass.html new file mode 100644 index 000000000..640005bfb --- /dev/null +++ b/test/testfiles/common/scriptOndblclickRequiresOnKeypress-pass.html @@ -0,0 +1,26 @@ + + + + + scriptOndblclickRequiresOnKeypress-pass + + + + +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptOnmousedownRequiresOnKeypress-fail.html b/test/testfiles/common/scriptOnmousedownRequiresOnKeypress-fail.html new file mode 100644 index 000000000..d3065d034 --- /dev/null +++ b/test/testfiles/common/scriptOnmousedownRequiresOnKeypress-fail.html @@ -0,0 +1,26 @@ + + + + + scriptOnmousedownRequiresOnKeypress-fail + + + + +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptOnmousedownRequiresOnKeypress-pass.html b/test/testfiles/common/scriptOnmousedownRequiresOnKeypress-pass.html new file mode 100644 index 000000000..db8aa55c5 --- /dev/null +++ b/test/testfiles/common/scriptOnmousedownRequiresOnKeypress-pass.html @@ -0,0 +1,26 @@ + + + + + scriptOnmousedownRequiresOnKeypress-pass + + + + +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptOnmousemove-fail.html b/test/testfiles/common/scriptOnmousemove-fail.html new file mode 100644 index 000000000..0ef90753c --- /dev/null +++ b/test/testfiles/common/scriptOnmousemove-fail.html @@ -0,0 +1,26 @@ + + + + + scriptOnmousemove-fail + + + + +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptOnmousemove-pass.html b/test/testfiles/common/scriptOnmousemove-pass.html new file mode 100644 index 000000000..13aeb0555 --- /dev/null +++ b/test/testfiles/common/scriptOnmousemove-pass.html @@ -0,0 +1,26 @@ + + + + + scriptOnmousemove-pass + + + + +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptOnmouseoutHasOnmouseblur-fail.html b/test/testfiles/common/scriptOnmouseoutHasOnmouseblur-fail.html new file mode 100644 index 000000000..24fa76c1f --- /dev/null +++ b/test/testfiles/common/scriptOnmouseoutHasOnmouseblur-fail.html @@ -0,0 +1,26 @@ + + + + + scriptOnmouseoutHasOnmouseblur-fail + + + + +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptOnmouseoutHasOnmouseblur-pass.html b/test/testfiles/common/scriptOnmouseoutHasOnmouseblur-pass.html new file mode 100644 index 000000000..7568e529e --- /dev/null +++ b/test/testfiles/common/scriptOnmouseoutHasOnmouseblur-pass.html @@ -0,0 +1,26 @@ + + + + + scriptOnmouseoutHasOnmouseblur-pass + + + + +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptOnmouseoverHasOnfocus-fail.html b/test/testfiles/common/scriptOnmouseoverHasOnfocus-fail.html new file mode 100644 index 000000000..9bb0d851b --- /dev/null +++ b/test/testfiles/common/scriptOnmouseoverHasOnfocus-fail.html @@ -0,0 +1,26 @@ + + + + + scriptOnmouseoverHasOnfocus-fail + + + + +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptOnmouseoverHasOnfocus-pass.html b/test/testfiles/common/scriptOnmouseoverHasOnfocus-pass.html new file mode 100644 index 000000000..729e2f803 --- /dev/null +++ b/test/testfiles/common/scriptOnmouseoverHasOnfocus-pass.html @@ -0,0 +1,26 @@ + + + + + scriptOnmouseoverHasOnfocus-pass + + + + +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptOnmouseupHasOnkeyup-fail.html b/test/testfiles/common/scriptOnmouseupHasOnkeyup-fail.html new file mode 100644 index 000000000..118c32035 --- /dev/null +++ b/test/testfiles/common/scriptOnmouseupHasOnkeyup-fail.html @@ -0,0 +1,24 @@ + + + + + scriptOnmouseupHasOnkeyup-fail + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptOnmouseupHasOnkeyup-pass.html b/test/testfiles/common/scriptOnmouseupHasOnkeyup-pass.html new file mode 100644 index 000000000..55d849065 --- /dev/null +++ b/test/testfiles/common/scriptOnmouseupHasOnkeyup-pass.html @@ -0,0 +1,24 @@ + + + + + scriptOnmouseupHasOnkeyup-pass + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptUIMustBeAccessible-fail-2.html b/test/testfiles/common/scriptUIMustBeAccessible-fail-2.html new file mode 100644 index 000000000..40a4ff7a1 --- /dev/null +++ b/test/testfiles/common/scriptUIMustBeAccessible-fail-2.html @@ -0,0 +1,23 @@ + + + + + scriptUIMustBeAccessible-fail-2 + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptUIMustBeAccessible-fail.html b/test/testfiles/common/scriptUIMustBeAccessible-fail.html new file mode 100644 index 000000000..cc3e1355a --- /dev/null +++ b/test/testfiles/common/scriptUIMustBeAccessible-fail.html @@ -0,0 +1,25 @@ + + + + + scriptUIMustBeAccessible-fail + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptsDoNotFlicker-fail-2.html b/test/testfiles/common/scriptsDoNotFlicker-fail-2.html new file mode 100644 index 000000000..3d74b8002 --- /dev/null +++ b/test/testfiles/common/scriptsDoNotFlicker-fail-2.html @@ -0,0 +1,26 @@ + + + + + scriptsDoNotFlicker-fail-2 + + + + +
        +

        There are no scripts here

        + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptsDoNotFlicker-fail.html b/test/testfiles/common/scriptsDoNotFlicker-fail.html new file mode 100644 index 000000000..358e06655 --- /dev/null +++ b/test/testfiles/common/scriptsDoNotFlicker-fail.html @@ -0,0 +1,27 @@ + + + + + scriptsDoNotFlicker-fail + + + + +
        + + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptsDoNotUseColorAlone-fail.html b/test/testfiles/common/scriptsDoNotUseColorAlone-fail.html new file mode 100644 index 000000000..f9b0569b4 --- /dev/null +++ b/test/testfiles/common/scriptsDoNotUseColorAlone-fail.html @@ -0,0 +1,29 @@ + + + + + scriptsDoNotUseColorAlone-fail + + + + +
        + +
        + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/scriptsDoNotUseColorAlone-pass.html b/test/testfiles/common/scriptsDoNotUseColorAlone-pass.html new file mode 100644 index 000000000..9cfc55c9f --- /dev/null +++ b/test/testfiles/common/scriptsDoNotUseColorAlone-pass.html @@ -0,0 +1,26 @@ + + + + + scriptsDoNotUseColorAlone-pass + + + + +
        +

        No scripts be here.

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/selectDoesNotChangeContext-fail-2.html b/test/testfiles/common/selectDoesNotChangeContext-fail-2.html new file mode 100644 index 000000000..5101f61df --- /dev/null +++ b/test/testfiles/common/selectDoesNotChangeContext-fail-2.html @@ -0,0 +1,82 @@ + + + + + selectDoesNotChangeContext-fail-2 + + + + + + +

        Dynamic Select Statements

        + +
        +

        + + +
        + + +
        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/selectDoesNotChangeContext-fail.html b/test/testfiles/common/selectDoesNotChangeContext-fail.html new file mode 100644 index 000000000..ca43e1bbb --- /dev/null +++ b/test/testfiles/common/selectDoesNotChangeContext-fail.html @@ -0,0 +1,33 @@ + + + + + selectDoesNotChangeContext-fail + + + + +
        +

        + + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/selectDoesNotChangeContext-pass.html b/test/testfiles/common/selectDoesNotChangeContext-pass.html new file mode 100644 index 000000000..a80a31159 --- /dev/null +++ b/test/testfiles/common/selectDoesNotChangeContext-pass.html @@ -0,0 +1,35 @@ + + + + + selectDoesNotChangeContext-pass + + + + +
        +

        + + +
        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/selectHasAssociatedLabel-fail-2.html b/test/testfiles/common/selectHasAssociatedLabel-fail-2.html new file mode 100644 index 000000000..4c2384e3c --- /dev/null +++ b/test/testfiles/common/selectHasAssociatedLabel-fail-2.html @@ -0,0 +1,32 @@ + + + + + selectHasAssociatedLabel-fail-2 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/selectHasAssociatedLabel-fail-3.html b/test/testfiles/common/selectHasAssociatedLabel-fail-3.html new file mode 100644 index 000000000..c03be41bb --- /dev/null +++ b/test/testfiles/common/selectHasAssociatedLabel-fail-3.html @@ -0,0 +1,32 @@ + + + + + selectHasAssociatedLabel-fail-3 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/selectHasAssociatedLabel-fail-4.html b/test/testfiles/common/selectHasAssociatedLabel-fail-4.html new file mode 100644 index 000000000..1e3c5b77d --- /dev/null +++ b/test/testfiles/common/selectHasAssociatedLabel-fail-4.html @@ -0,0 +1,32 @@ + + + + + selectHasAssociatedLabel-fail-4 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/selectHasAssociatedLabel-fail-5.html b/test/testfiles/common/selectHasAssociatedLabel-fail-5.html new file mode 100644 index 000000000..48bf6840a --- /dev/null +++ b/test/testfiles/common/selectHasAssociatedLabel-fail-5.html @@ -0,0 +1,32 @@ + + + + + selectHasAssociatedLabel-fail-5 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/selectHasAssociatedLabel-fail-6.html b/test/testfiles/common/selectHasAssociatedLabel-fail-6.html new file mode 100644 index 000000000..3b56d507c --- /dev/null +++ b/test/testfiles/common/selectHasAssociatedLabel-fail-6.html @@ -0,0 +1,34 @@ + + + + + selectHasAssociatedLabel-fail-6 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/selectHasAssociatedLabel-fail-7.html b/test/testfiles/common/selectHasAssociatedLabel-fail-7.html new file mode 100644 index 000000000..b2ed94f22 --- /dev/null +++ b/test/testfiles/common/selectHasAssociatedLabel-fail-7.html @@ -0,0 +1,34 @@ + + + + + selectHasAssociatedLabel-fail-7 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/selectHasAssociatedLabel-fail.html b/test/testfiles/common/selectHasAssociatedLabel-fail.html new file mode 100644 index 000000000..8406a5d25 --- /dev/null +++ b/test/testfiles/common/selectHasAssociatedLabel-fail.html @@ -0,0 +1,33 @@ + + + + + selectHasAssociatedLabel-fail + + + + +
        +

        + + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/selectHasAssociatedLabel-pass-2.html b/test/testfiles/common/selectHasAssociatedLabel-pass-2.html new file mode 100644 index 000000000..92e4d738f --- /dev/null +++ b/test/testfiles/common/selectHasAssociatedLabel-pass-2.html @@ -0,0 +1,34 @@ + + + + + selectHasAssociatedLabel-pass-2 + + + + +
        +

        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/selectHasAssociatedLabel-pass.html b/test/testfiles/common/selectHasAssociatedLabel-pass.html new file mode 100644 index 000000000..23ddf95d5 --- /dev/null +++ b/test/testfiles/common/selectHasAssociatedLabel-pass.html @@ -0,0 +1,33 @@ + + + + + selectHasAssociatedLabel-pass + + + + +
        +

        + + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/selectWithOptionsHasOptgroup-fail.html b/test/testfiles/common/selectWithOptionsHasOptgroup-fail.html new file mode 100644 index 000000000..af37d295e --- /dev/null +++ b/test/testfiles/common/selectWithOptionsHasOptgroup-fail.html @@ -0,0 +1,36 @@ + + + + + selectWithOptionsHasOptgroup-fail + + + + +
        + + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/selectWithOptionsHasOptgroup-pass.html b/test/testfiles/common/selectWithOptionsHasOptgroup-pass.html new file mode 100644 index 000000000..592f1888e --- /dev/null +++ b/test/testfiles/common/selectWithOptionsHasOptgroup-pass.html @@ -0,0 +1,40 @@ + + + + + selectWithOptionsHasOptgroup-pass + + + + +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/siteMap-fail.html b/test/testfiles/common/siteMap-fail.html new file mode 100644 index 000000000..88b902677 --- /dev/null +++ b/test/testfiles/common/siteMap-fail.html @@ -0,0 +1,25 @@ + + + + + siteMap-fail + + + + +

        This document is part of a large collection of related documents.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/siteMap-pass.html b/test/testfiles/common/siteMap-pass.html new file mode 100644 index 000000000..ae0920c62 --- /dev/null +++ b/test/testfiles/common/siteMap-pass.html @@ -0,0 +1,27 @@ + + + + + siteMap-pass + + + + +Site Map + +

        This document is part of a large collection of related documents.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/skipToContentLinkProvided-fail.html b/test/testfiles/common/skipToContentLinkProvided-fail.html new file mode 100644 index 000000000..1e79c068b --- /dev/null +++ b/test/testfiles/common/skipToContentLinkProvided-fail.html @@ -0,0 +1,41 @@ + + + + + skipToContentLinkProvided-fail + + + + +

        + company logo +

        + +

        The main content of the document goes here. This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/skipToContentLinkProvided-pass.html b/test/testfiles/common/skipToContentLinkProvided-pass.html new file mode 100644 index 000000000..968e1741e --- /dev/null +++ b/test/testfiles/common/skipToContentLinkProvided-pass.html @@ -0,0 +1,45 @@ + + + + + skipToContentLinkProvided-pass + + + + +

        skip to content +

        +

        + company logo +

        + + + +

        The main content of the document goes here. This is some example text.

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tabIndexFollowsLogicalOrder-fail.html b/test/testfiles/common/tabIndexFollowsLogicalOrder-fail.html new file mode 100644 index 000000000..155105171 --- /dev/null +++ b/test/testfiles/common/tabIndexFollowsLogicalOrder-fail.html @@ -0,0 +1,53 @@ + + + + + tabIndexFollowsLogicalOrder-fail + + + + +
        +

        + + +
        + + +
        + + +
        + +

        +
        +
        +

        + + +
        + + +
        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tabIndexFollowsLogicalOrder-pass.html b/test/testfiles/common/tabIndexFollowsLogicalOrder-pass.html new file mode 100644 index 000000000..a29c35676 --- /dev/null +++ b/test/testfiles/common/tabIndexFollowsLogicalOrder-pass.html @@ -0,0 +1,53 @@ + + + + + tabIndexFollowsLogicalOrder-pass + + + + +
        +

        + + +
        + + +
        + + +
        + +

        +
        +
        +

        + + +
        + + +
        + +

        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableCaptionIdentifiesTable-fail-2.html b/test/testfiles/common/tableCaptionIdentifiesTable-fail-2.html new file mode 100644 index 000000000..0d7141deb --- /dev/null +++ b/test/testfiles/common/tableCaptionIdentifiesTable-fail-2.html @@ -0,0 +1,62 @@ + + + + + tableCaptionIdentifiesTable-fail-2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Cups of coffee consumed by each senator
        namenumber of cupstypewith sugar
        Adams, Willie2regularsugar
        Bacon, Lise4regularno sugar
        Chaput, Maria1decafsugar
        Di Nino, Consiglio0not applicablenot applicable
        Eggleton, Art6regularno sugar
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableCaptionIdentifiesTable-fail.html b/test/testfiles/common/tableCaptionIdentifiesTable-fail.html new file mode 100644 index 000000000..a408ff80e --- /dev/null +++ b/test/testfiles/common/tableCaptionIdentifiesTable-fail.html @@ -0,0 +1,62 @@ + + + + + tableCaptionIdentifiesTable-fail + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Caption Goes Here
        namenumber of cupstypewith sugar
        Adams, Willie2regularsugar
        Bacon, Lise4regularno sugar
        Chaput, Maria1decafsugar
        Di Nino, Consiglio0not applicablenot applicable
        Eggleton, Art6regularno sugar
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableComplexHasSummary-fail.html b/test/testfiles/common/tableComplexHasSummary-fail.html new file mode 100644 index 000000000..6d9a3ed5f --- /dev/null +++ b/test/testfiles/common/tableComplexHasSummary-fail.html @@ -0,0 +1,49 @@ + + + + + tableComplexHasSummary-fail + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        State & FirstState & SixthState & FifteenthFifteenth & Morrison
        4:004:054:114:19
        5:005:055:115:19
        6:006:056:116:19
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableComplexHasSummary-pass.html b/test/testfiles/common/tableComplexHasSummary-pass.html new file mode 100644 index 000000000..87de74d99 --- /dev/null +++ b/test/testfiles/common/tableComplexHasSummary-pass.html @@ -0,0 +1,50 @@ + + + + + tableComplexHasSummary-pass + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Manager Work Days
        DayManager
        MondayErol
        TuesdayDavid
        WednesdayCarol
        ThursdaySusan
        FridayPiere
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableDataShouldHaveTh-fail.html b/test/testfiles/common/tableDataShouldHaveTh-fail.html new file mode 100644 index 000000000..1eba02826 --- /dev/null +++ b/test/testfiles/common/tableDataShouldHaveTh-fail.html @@ -0,0 +1,61 @@ + + + + + tableDataShouldHaveTh-fail + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namenumber of cupstypewith sugar
        Adams, Willie2regularsugar
        Bacon, Lise4regularno sugar
        Chaput, Maria1decafsugar
        Di Nino, Consiglio0not applicablenot applicable
        Eggleton, Art6regularno sugar
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableDataShouldHaveTh-pass.html b/test/testfiles/common/tableDataShouldHaveTh-pass.html new file mode 100644 index 000000000..04eb95403 --- /dev/null +++ b/test/testfiles/common/tableDataShouldHaveTh-pass.html @@ -0,0 +1,61 @@ + + + + + tableDataShouldHaveTh-pass + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namenumber of cupstypewith sugar
        Adams, Willie2regularsugar
        Bacon, Lise4regularno sugar
        Chaput, Maria1decafsugar
        Di Nino, Consiglio0not applicablenot applicable
        Eggleton, Art6regularno sugar
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableHeaderLabelMustBeTerse-fail.html b/test/testfiles/common/tableHeaderLabelMustBeTerse-fail.html new file mode 100644 index 000000000..9c4ae5e36 --- /dev/null +++ b/test/testfiles/common/tableHeaderLabelMustBeTerse-fail.html @@ -0,0 +1,41 @@ + + + + + tableHeaderLabelMustBeTerse-fail + + + + + + + + + + + + + + + + + + + + + +
        A Test Table
        Col. 1 header really long textCol. 2 header really long text
        Row 1 headerC1R1C1R2
        Row 2 headerC2R1C2R2
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableHeaderLabelMustBeTerse-pass.html b/test/testfiles/common/tableHeaderLabelMustBeTerse-pass.html new file mode 100644 index 000000000..fb6ca3798 --- /dev/null +++ b/test/testfiles/common/tableHeaderLabelMustBeTerse-pass.html @@ -0,0 +1,41 @@ + + + + + tableHeaderLabelMustBeTerse-pass + + + + + + + + + + + + + + + + + + + + + +
        A Test Table
        Col. 1 header really long textCol. 2 header really long text
        Row 1 headerC1R1C1R2
        Row 2 headerC2R1C2R2
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableIsGrouped-fail.html b/test/testfiles/common/tableIsGrouped-fail.html new file mode 100644 index 000000000..c908b4134 --- /dev/null +++ b/test/testfiles/common/tableIsGrouped-fail.html @@ -0,0 +1,61 @@ + + + + + tableIsGrouped-fail + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namenumber of cupstypewith sugar
        Adams, Willie2regularsugar
        Bacon, Lise4regularno sugar
        Chaput, Maria1decafsugar
        Di Nino, Consiglio0not applicablenot applicable
        Eggleton, Art6regularno sugar
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableIsGrouped-pass.html b/test/testfiles/common/tableIsGrouped-pass.html new file mode 100644 index 000000000..ba60ad563 --- /dev/null +++ b/test/testfiles/common/tableIsGrouped-pass.html @@ -0,0 +1,65 @@ + + + + + tableIsGrouped-pass + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namenumber of cupstypewith sugar
        Adams, Willie2regularsugar
        Bacon, Lise4regularno sugar
        Chaput, Maria1decafsugar
        Di Nino, Consiglio0not applicablenot applicable
        Eggleton, Art6regularno sugar
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableLayoutDataShouldNotHaveTh-fail.html b/test/testfiles/common/tableLayoutDataShouldNotHaveTh-fail.html new file mode 100644 index 000000000..275fd191a --- /dev/null +++ b/test/testfiles/common/tableLayoutDataShouldNotHaveTh-fail.html @@ -0,0 +1,50 @@ + + + + + tableLayoutDataShouldNotHaveTh-fail + + + + + + + + + + + + + +
        Latin is a dead language.The English language thrives.
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, + quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo + consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse + cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat + non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.But I must explain to you how all this mistaken idea of denouncing pleasure + and praising pain was born and I will give you a complete account of the + system, and expound the actual teachings of the great explorer of the truth, + the master-builder of human happiness. No one rejects, dislikes, or avoids + pleasure itself, because it is pleasure, but because those who do not know + how to pursue pleasure rationally encounter consequences that are extremely + painful. Nor again is there anyone who loves or pursues or desires to obtain + pain of itself, because it is pain, but because occasionally circumstances + occur in which toil and pain can procure him some great pleasure. To take + a trivial example, which of us ever undertakes laborious physical exercise, + except to obtain some advantage from it? But who has any right to find + fault with a man who chooses to enjoy a pleasure that has no annoying consequences, + or one who avoids a pain that produces no resultant pleasure.
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableLayoutDataShouldNotHaveTh-pass.html b/test/testfiles/common/tableLayoutDataShouldNotHaveTh-pass.html new file mode 100644 index 000000000..d1cc2cbb0 --- /dev/null +++ b/test/testfiles/common/tableLayoutDataShouldNotHaveTh-pass.html @@ -0,0 +1,50 @@ + + + + + tableLayoutDataShouldNotHaveTh-pass + + + + + + + + + + + + + +
        Latin is a dead language.The English language thrives.
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, + quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo + consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse + cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat + non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.But I must explain to you how all this mistaken idea of denouncing pleasure + and praising pain was born and I will give you a complete account of the + system, and expound the actual teachings of the great explorer of the truth, + the master-builder of human happiness. No one rejects, dislikes, or avoids + pleasure itself, because it is pleasure, but because those who do not know + how to pursue pleasure rationally encounter consequences that are extremely + painful. Nor again is there anyone who loves or pursues or desires to obtain + pain of itself, because it is pain, but because occasionally circumstances + occur in which toil and pain can procure him some great pleasure. To take + a trivial example, which of us ever undertakes laborious physical exercise, + except to obtain some advantage from it? But who has any right to find + fault with a man who chooses to enjoy a pleasure that has no annoying consequences, + or one who avoids a pain that produces no resultant pleasure.
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableLayoutHasNoCaption-fail.html b/test/testfiles/common/tableLayoutHasNoCaption-fail.html new file mode 100644 index 000000000..9b3708dcc --- /dev/null +++ b/test/testfiles/common/tableLayoutHasNoCaption-fail.html @@ -0,0 +1,47 @@ + + + + + tableLayoutHasNoCaption-fail + + + + + + + + + + +
        Latin And English Text
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, + quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo + consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse + cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat + non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.But I must explain to you how all this mistaken idea of denouncing pleasure + and praising pain was born and I will give you a complete account of the + system, and expound the actual teachings of the great explorer of the truth, + the master-builder of human happiness. No one rejects, dislikes, or avoids + pleasure itself, because it is pleasure, but because those who do not know + how to pursue pleasure rationally encounter consequences that are extremely + painful. Nor again is there anyone who loves or pursues or desires to obtain + pain of itself, because it is pain, but because occasionally circumstances + occur in which toil and pain can procure him some great pleasure. To take + a trivial example, which of us ever undertakes laborious physical exercise, + except to obtain some advantage from it? But who has any right to find + fault with a man who chooses to enjoy a pleasure that has no annoying consequences, + or one who avoids a pain that produces no resultant pleasure.
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableLayoutHasNoCaption-pass.html b/test/testfiles/common/tableLayoutHasNoCaption-pass.html new file mode 100644 index 000000000..f296e8215 --- /dev/null +++ b/test/testfiles/common/tableLayoutHasNoCaption-pass.html @@ -0,0 +1,46 @@ + + + + + tableLayoutHasNoCaption-pass + + + + + + + + + +
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, + quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo + consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse + cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat + non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.But I must explain to you how all this mistaken idea of denouncing pleasure + and praising pain was born and I will give you a complete account of the + system, and expound the actual teachings of the great explorer of the truth, + the master-builder of human happiness. No one rejects, dislikes, or avoids + pleasure itself, because it is pleasure, but because those who do not know + how to pursue pleasure rationally encounter consequences that are extremely + painful. Nor again is there anyone who loves or pursues or desires to obtain + pain of itself, because it is pain, but because occasionally circumstances + occur in which toil and pain can procure him some great pleasure. To take + a trivial example, which of us ever undertakes laborious physical exercise, + except to obtain some advantage from it? But who has any right to find + fault with a man who chooses to enjoy a pleasure that has no annoying consequences, + or one who avoids a pain that produces no resultant pleasure.
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableLayoutHasNoSummary-fail-2.html b/test/testfiles/common/tableLayoutHasNoSummary-fail-2.html new file mode 100644 index 000000000..f4b9ba029 --- /dev/null +++ b/test/testfiles/common/tableLayoutHasNoSummary-fail-2.html @@ -0,0 +1,41 @@ + + + + + tableLayoutHasNoSummary-fail-2 + + + + + + + + + + + + + + + +
        This would be a sidebar. + + + + +
        This is a content area given some border through a table.
        +
        This is a footer.
        This is another footer.
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableLayoutHasNoSummary-fail-3.html b/test/testfiles/common/tableLayoutHasNoSummary-fail-3.html new file mode 100644 index 000000000..61001eb3e --- /dev/null +++ b/test/testfiles/common/tableLayoutHasNoSummary-fail-3.html @@ -0,0 +1,37 @@ + + + + + tableLayoutHasNoSummary-fail-3 + + + + + + + + + + + + + + + + + +
        This would be a sidebar.
        This is a footer.
        This is another footer.
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableLayoutHasNoSummary-fail.html b/test/testfiles/common/tableLayoutHasNoSummary-fail.html new file mode 100644 index 000000000..f4201d7f1 --- /dev/null +++ b/test/testfiles/common/tableLayoutHasNoSummary-fail.html @@ -0,0 +1,46 @@ + + + + + tableLayoutHasNoSummary-fail + + + + + + + + + +
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, + quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo + consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse + cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat + non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.But I must explain to you how all this mistaken idea of denouncing pleasure + and praising pain was born and I will give you a complete account of the + system, and expound the actual teachings of the great explorer of the truth, + the master-builder of human happiness. No one rejects, dislikes, or avoids + pleasure itself, because it is pleasure, but because those who do not know + how to pursue pleasure rationally encounter consequences that are extremely + painful. Nor again is there anyone who loves or pursues or desires to obtain + pain of itself, because it is pain, but because occasionally circumstances + occur in which toil and pain can procure him some great pleasure. To take + a trivial example, which of us ever undertakes laborious physical exercise, + except to obtain some advantage from it? But who has any right to find + fault with a man who chooses to enjoy a pleasure that has no annoying consequences, + or one who avoids a pain that produces no resultant pleasure.
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableLayoutHasNoSummary-pass-2.html b/test/testfiles/common/tableLayoutHasNoSummary-pass-2.html new file mode 100644 index 000000000..b87eda0c5 --- /dev/null +++ b/test/testfiles/common/tableLayoutHasNoSummary-pass-2.html @@ -0,0 +1,46 @@ + + + + + tableLayoutHasNoSummary-pass-2 + + + + + + + + + +
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, + quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo + consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse + cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat + non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.But I must explain to you how all this mistaken idea of denouncing pleasure + and praising pain was born and I will give you a complete account of the + system, and expound the actual teachings of the great explorer of the truth, + the master-builder of human happiness. No one rejects, dislikes, or avoids + pleasure itself, because it is pleasure, but because those who do not know + how to pursue pleasure rationally encounter consequences that are extremely + painful. Nor again is there anyone who loves or pursues or desires to obtain + pain of itself, because it is pain, but because occasionally circumstances + occur in which toil and pain can procure him some great pleasure. To take + a trivial example, which of us ever undertakes laborious physical exercise, + except to obtain some advantage from it? But who has any right to find + fault with a man who chooses to enjoy a pleasure that has no annoying consequences, + or one who avoids a pain that produces no resultant pleasure.
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableLayoutHasNoSummary-pass.html b/test/testfiles/common/tableLayoutHasNoSummary-pass.html new file mode 100644 index 000000000..6a40b51a2 --- /dev/null +++ b/test/testfiles/common/tableLayoutHasNoSummary-pass.html @@ -0,0 +1,46 @@ + + + + + tableLayoutHasNoSummary-pass + + + + + + + + + +
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, + quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo + consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse + cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat + non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.But I must explain to you how all this mistaken idea of denouncing pleasure + and praising pain was born and I will give you a complete account of the + system, and expound the actual teachings of the great explorer of the truth, + the master-builder of human happiness. No one rejects, dislikes, or avoids + pleasure itself, because it is pleasure, but because those who do not know + how to pursue pleasure rationally encounter consequences that are extremely + painful. Nor again is there anyone who loves or pursues or desires to obtain + pain of itself, because it is pain, but because occasionally circumstances + occur in which toil and pain can procure him some great pleasure. To take + a trivial example, which of us ever undertakes laborious physical exercise, + except to obtain some advantage from it? But who has any right to find + fault with a man who chooses to enjoy a pleasure that has no annoying consequences, + or one who avoids a pain that produces no resultant pleasure.
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableLayoutMakesSenseLinearized-fail.html b/test/testfiles/common/tableLayoutMakesSenseLinearized-fail.html new file mode 100644 index 000000000..c88f73120 --- /dev/null +++ b/test/testfiles/common/tableLayoutMakesSenseLinearized-fail.html @@ -0,0 +1,34 @@ + + + + + tableLayoutMakesSenseLinearized-fail + + + + + + + + + + + + +
        + XYZ mountaineering + top!
        XYZ gets you to the
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableLayoutMakesSenseLinearized-pass.html b/test/testfiles/common/tableLayoutMakesSenseLinearized-pass.html new file mode 100644 index 000000000..9524c243d --- /dev/null +++ b/test/testfiles/common/tableLayoutMakesSenseLinearized-pass.html @@ -0,0 +1,34 @@ + + + + + tableLayoutMakesSenseLinearized-pass + + + + + + + + + + + + +
        + XYZ mountaineering +
        XYZ gets you to thetop!
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableSummaryDescribesTable-fail-2.html b/test/testfiles/common/tableSummaryDescribesTable-fail-2.html new file mode 100644 index 000000000..e584b544b --- /dev/null +++ b/test/testfiles/common/tableSummaryDescribesTable-fail-2.html @@ -0,0 +1,51 @@ + + + + + tableSummaryDescribesTable-fail-2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        State & FirstState & SixthState & FifteenthFifteenth & Morrison
        4:004:054:114:19
        5:005:055:115:19
        6:006:056:116:19
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableSummaryDescribesTable-fail.html b/test/testfiles/common/tableSummaryDescribesTable-fail.html new file mode 100644 index 000000000..8f749cfdc --- /dev/null +++ b/test/testfiles/common/tableSummaryDescribesTable-fail.html @@ -0,0 +1,48 @@ + + + + + tableSummaryDescribesTable-fail + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        State & FirstState & SixthState & FifteenthFifteenth & Morrison
        4:004:054:114:19
        5:005:055:115:19
        6:006:056:116:19
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableSummaryDoesNotDuplicateCaption-fail.html b/test/testfiles/common/tableSummaryDoesNotDuplicateCaption-fail.html new file mode 100644 index 000000000..12a98b738 --- /dev/null +++ b/test/testfiles/common/tableSummaryDoesNotDuplicateCaption-fail.html @@ -0,0 +1,62 @@ + + + + + tableSummaryDoesNotDuplicateCaption-fail + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Cups of coffee consumed by each senator
        namenumber of cupstypewith sugar
        Adams, Willie2regularsugar
        Bacon, Lise4regularno sugar
        Chaput, Maria1decafsugar
        Di Nino, Consiglio0not applicablenot applicable
        Eggleton, Art6regularno sugar
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableSummaryDoesNotDuplicateCaption-pass.html b/test/testfiles/common/tableSummaryDoesNotDuplicateCaption-pass.html new file mode 100644 index 000000000..38813d98e --- /dev/null +++ b/test/testfiles/common/tableSummaryDoesNotDuplicateCaption-pass.html @@ -0,0 +1,62 @@ + + + + + tableSummaryDoesNotDuplicateCaption-pass + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Cups of coffee consumed by each senator
        namenumber of cupstypewith sugar
        Adams, Willie2regularsugar
        Bacon, Lise4regularno sugar
        Chaput, Maria1decafsugar
        Di Nino, Consiglio0not applicablenot applicable
        Eggleton, Art6regularno sugar
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableSummaryIsEmpty-fail.html b/test/testfiles/common/tableSummaryIsEmpty-fail.html new file mode 100644 index 000000000..8e554457c --- /dev/null +++ b/test/testfiles/common/tableSummaryIsEmpty-fail.html @@ -0,0 +1,61 @@ + + + + + tableSummaryIsEmpty-fail + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namenumber of cupstypewith sugar
        Adams, Willie2regularsugar
        Bacon, Lise4regularno sugar
        Chaput, Maria1decafsugar
        Di Nino, Consiglio0not applicablenot applicable
        Eggleton, Art6regularno sugar
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableSummaryIsEmpty-pass.html b/test/testfiles/common/tableSummaryIsEmpty-pass.html new file mode 100644 index 000000000..62fa089a3 --- /dev/null +++ b/test/testfiles/common/tableSummaryIsEmpty-pass.html @@ -0,0 +1,61 @@ + + + + + tableSummaryIsEmpty-pass + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namenumber of cupstypewith sugar
        Adams, Willie2regularsugar
        Bacon, Lise4regularno sugar
        Chaput, Maria1decafsugar
        Di Nino, Consiglio0not applicablenot applicable
        Eggleton, Art6regularno sugar
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableSummaryIsNotTooLong-fail.html b/test/testfiles/common/tableSummaryIsNotTooLong-fail.html new file mode 100644 index 000000000..22bee22bc --- /dev/null +++ b/test/testfiles/common/tableSummaryIsNotTooLong-fail.html @@ -0,0 +1,61 @@ + + + + + tableSummaryIsNotTooLong-fail + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namenumber of cupstypewith sugar
        Adams, Willie2regularsugar
        Bacon, Lise4regularno sugar
        Chaput, Maria1decafsugar
        Di Nino, Consiglio0not applicablenot applicable
        Eggleton, Art6regularno sugar
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableUseColGroup-fail.html b/test/testfiles/common/tableUseColGroup-fail.html new file mode 100644 index 000000000..0e0a2a2e2 --- /dev/null +++ b/test/testfiles/common/tableUseColGroup-fail.html @@ -0,0 +1,68 @@ + + + + + tableUseColGroup-fail + + + + +

        From the WCAG 2.0 HTML techniques: "Describe the use and benefits of column + structure elements. Much of this may be theoretical."

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namenumber of cupstypewith sugar
        Adams, Willie2regularsugar
        Bacon, Lise4regularno sugar
        Chaput, Maria1decafsugar
        Di Nino, Consiglio0not applicablenot applicable
        Eggleton, Art6regularno sugar
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableUseColGroup-pass.html b/test/testfiles/common/tableUseColGroup-pass.html new file mode 100644 index 000000000..b70ba1280 --- /dev/null +++ b/test/testfiles/common/tableUseColGroup-pass.html @@ -0,0 +1,26 @@ + + + + + tableUseColGroup-pass + + + + +

        From the WCAG 2.0 HTML techniques: "Describe the use and benefits of column + structure elements. Much of this may be theoretical."

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableUsesAbbreviationForHeader-fail.html b/test/testfiles/common/tableUsesAbbreviationForHeader-fail.html new file mode 100644 index 000000000..fe159340a --- /dev/null +++ b/test/testfiles/common/tableUsesAbbreviationForHeader-fail.html @@ -0,0 +1,41 @@ + + + + + tableUsesAbbreviationForHeader-fail + + + + + + + + + + + + + + + + + + + + + +
        A Test Table
        Col. 1 header really long textCol. 2 header really long text
        Row 1 headerC1R1C1R2
        Row 2 headerC2R1C2R2
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableUsesAbbreviationForHeader-pass-2.html b/test/testfiles/common/tableUsesAbbreviationForHeader-pass-2.html new file mode 100644 index 000000000..03d196c73 --- /dev/null +++ b/test/testfiles/common/tableUsesAbbreviationForHeader-pass-2.html @@ -0,0 +1,41 @@ + + + + + tableUsesAbbreviationForHeader-pass-2 + + + + + + + + + + + + + + + + + + + + + +
        A Test Table
        Col. 1 header really long textCol. 2 header really long text
        Row 1 headerC1R1C1R2
        Row 2 headerC2R1C2R2
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableUsesAbbreviationForHeader-pass.html b/test/testfiles/common/tableUsesAbbreviationForHeader-pass.html new file mode 100644 index 000000000..0b4d39771 --- /dev/null +++ b/test/testfiles/common/tableUsesAbbreviationForHeader-pass.html @@ -0,0 +1,40 @@ + + + + + tableUsesAbbreviationForHeader-pass + + + + + + + + + + + + + + + + + + + + +
        Col. 1 headerCol. 2 header
        Row 1 headerC1R1C1R2
        Row 2 headerC2R1C2R2
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableUsesCaption-fail-2.html b/test/testfiles/common/tableUsesCaption-fail-2.html new file mode 100644 index 000000000..4ed8aceaa --- /dev/null +++ b/test/testfiles/common/tableUsesCaption-fail-2.html @@ -0,0 +1,61 @@ + + + + + tableUsesCaption-fail-2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namenumber of cupstypewith sugar
        Adams, Willie2regularsugar
        Bacon, Lise4regularno sugar
        Chaput, Maria1decafsugar
        Di Nino, Consiglio0not applicablenot applicable
        Eggleton, Art6regularno sugar
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableUsesCaption-pass.html b/test/testfiles/common/tableUsesCaption-pass.html new file mode 100644 index 000000000..8fc0aae82 --- /dev/null +++ b/test/testfiles/common/tableUsesCaption-pass.html @@ -0,0 +1,62 @@ + + + + + tableUsesCaption-pass + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Coffee Consumed By Senators
        namenumber of cupstypewith sugar
        Adams, Willie2regularsugar
        Bacon, Lise4regularno sugar
        Chaput, Maria1decafsugar
        Di Nino, Consiglio0not applicablenot applicable
        Eggleton, Art6regularno sugar
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableWithBothHeadersUseScope-fail.html b/test/testfiles/common/tableWithBothHeadersUseScope-fail.html new file mode 100644 index 000000000..04e8a3b8a --- /dev/null +++ b/test/testfiles/common/tableWithBothHeadersUseScope-fail.html @@ -0,0 +1,56 @@ + + + + + tableWithBothHeadersUseScope-fail + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        NameBirthGender
        Clayton2005-10-10male
        Carol2005-10-11female
        Susan2005-10-12female
        Oleg2005-10-13male
        Belnar2005-10-14male
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableWithBothHeadersUseScope-pass.html b/test/testfiles/common/tableWithBothHeadersUseScope-pass.html new file mode 100644 index 000000000..eef7b3c0e --- /dev/null +++ b/test/testfiles/common/tableWithBothHeadersUseScope-pass.html @@ -0,0 +1,55 @@ + + + + + tableWithBothHeadersUseScope-pass + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        NameBirthGender
        Clayton2005-10-10male
        Carol2005-10-11female
        Susan2005-10-12female
        Oleg2005-10-13male
        Belnar2005-10-14male
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableWithMoreHeadersUseID-fail.html b/test/testfiles/common/tableWithMoreHeadersUseID-fail.html new file mode 100644 index 000000000..875653f8d --- /dev/null +++ b/test/testfiles/common/tableWithMoreHeadersUseID-fail.html @@ -0,0 +1,58 @@ + + + + + tableWithMoreHeadersUseID-fail + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        ClassTeacherMalesFemales
        First YearD. Bolter54
        A. Cheetham79
        Second YearM. Lam39
        S. Crossy43
        A. Forsyth69
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tableWithMoreHeadersUseID-pass.html b/test/testfiles/common/tableWithMoreHeadersUseID-pass.html new file mode 100644 index 000000000..1b52e30d8 --- /dev/null +++ b/test/testfiles/common/tableWithMoreHeadersUseID-pass.html @@ -0,0 +1,58 @@ + + + + + tableWithMoreHeadersUseID-pass + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        ClassTeacherMalesFemales
        First YearD. Bolter54
        A. Cheetham79
        Second YearM. Lam39
        S. Crossy43
        A. Forsyth69
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tabularDataIsInTable-fail.html b/test/testfiles/common/tabularDataIsInTable-fail.html new file mode 100644 index 000000000..a4d91fe01 --- /dev/null +++ b/test/testfiles/common/tabularDataIsInTable-fail.html @@ -0,0 +1,34 @@ + + + + + tabularDataIsInTable-fail + + + + +

        +

        +name           number of cups   type   with sugar
        +Adams, Willie      2		regular		sugar
        +Bacon, Lise        4		regular		no sugar
        +Chaput, Maria      1		decaf		sugar
        +Di Nino, Consiglio 0		n/a		n/a
        +Eggleton, Art      6		regular		no sugar 
        +
        + +

        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/tabularDataIsInTable-pass.html b/test/testfiles/common/tabularDataIsInTable-pass.html new file mode 100644 index 000000000..33ac81faa --- /dev/null +++ b/test/testfiles/common/tabularDataIsInTable-pass.html @@ -0,0 +1,61 @@ + + + + + tabularDataIsInTable-pass + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        namenumber of cupstypewith sugar
        Adams, Willie2regularsugar
        Bacon, Lise4regularno sugar
        Chaput, Maria1decafsugar
        Di Nino, Consiglio0not applicablenot applicable
        Eggleton, Art6regularno sugar
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/textareaHasAssociatedLabel-fail-2.html b/test/testfiles/common/textareaHasAssociatedLabel-fail-2.html new file mode 100644 index 000000000..fd246cf2a --- /dev/null +++ b/test/testfiles/common/textareaHasAssociatedLabel-fail-2.html @@ -0,0 +1,26 @@ + + + + + textareaHasAssociatedLabel-fail-2 + + + + +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/textareaHasAssociatedLabel-fail.html b/test/testfiles/common/textareaHasAssociatedLabel-fail.html new file mode 100644 index 000000000..93a542515 --- /dev/null +++ b/test/testfiles/common/textareaHasAssociatedLabel-fail.html @@ -0,0 +1,27 @@ + + + + + textareaHasAssociatedLabel-fail + + + + +
        + + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/textareaHasAssociatedLabel-pass-2.html b/test/testfiles/common/textareaHasAssociatedLabel-pass-2.html new file mode 100644 index 000000000..306e4a26a --- /dev/null +++ b/test/testfiles/common/textareaHasAssociatedLabel-pass-2.html @@ -0,0 +1,28 @@ + + + + + textareaHasAssociatedLabel-pass-2 + + + + +
        + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/textareaHasAssociatedLabel-pass.html b/test/testfiles/common/textareaHasAssociatedLabel-pass.html new file mode 100644 index 000000000..702248082 --- /dev/null +++ b/test/testfiles/common/textareaHasAssociatedLabel-pass.html @@ -0,0 +1,27 @@ + + + + + textareaHasAssociatedLabel-pass + + + + +
        + + +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/textareaLabelPositionedClose-fail.html b/test/testfiles/common/textareaLabelPositionedClose-fail.html new file mode 100644 index 000000000..91f7cc462 --- /dev/null +++ b/test/testfiles/common/textareaLabelPositionedClose-fail.html @@ -0,0 +1,52 @@ + + + + + textareaLabelPositionedClose-fail + + + + +
        + + + + + + + + + + + + + + + + +
        first name: + +
        last name: + +
        + + + +
        + +
        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/common/textareaLabelPositionedClose-pass.html b/test/testfiles/common/textareaLabelPositionedClose-pass.html new file mode 100644 index 000000000..19cac79f5 --- /dev/null +++ b/test/testfiles/common/textareaLabelPositionedClose-pass.html @@ -0,0 +1,51 @@ + + + + + textareaLabelPositionedClose-pass + + + + +
        + + + + + + + + + + + + + + + + +
        first name: + +
        last name: + +
        comment: + + +
        + +
        +
        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/oac/1-1.html b/test/testfiles/oac/1-1.html deleted file mode 100644 index 21c20ec1a..000000000 --- a/test/testfiles/oac/1-1.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Testfile - Check #1 - Positive - - - - -

        - - - - - - - - diff --git a/test/testfiles/oac/1-2.html b/test/testfiles/oac/1-2.html deleted file mode 100644 index d2d16d000..000000000 --- a/test/testfiles/oac/1-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Testfile - Check #1 - Negative - - - - -

        A black and brown cat named Rex.

        - - - - - - - - - diff --git a/test/testfiles/oac/10-1.html b/test/testfiles/oac/10-1.html deleted file mode 100644 index 78d7442e5..000000000 --- a/test/testfiles/oac/10-1.html +++ /dev/null @@ -1,23 +0,0 @@ - - - -Check #10.1 - Positive - - - - -eat at Joes - - - - - - - - - diff --git a/test/testfiles/oac/10-2.html b/test/testfiles/oac/10-2.html deleted file mode 100644 index 84e3e5bc1..000000000 --- a/test/testfiles/oac/10-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - -Check #10.2 - Negative - - - - -A brown and black cat named Rex. - - - - - - - - - - diff --git a/test/testfiles/oac/100-1.html b/test/testfiles/oac/100-1.html deleted file mode 100644 index 604dbe3dc..000000000 --- a/test/testfiles/oac/100-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #100 - Positive - - - - -
        If I have any sins to confess, I will tell them to my priest.
        . - - - - - - - - - diff --git a/test/testfiles/oac/100-2.html b/test/testfiles/oac/100-2.html deleted file mode 100644 index 969d179f5..000000000 --- a/test/testfiles/oac/100-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #100 - Negative - - - - -
        If I have any sins to confess, I will tell them to my priest.
        . - - - - - - - - - diff --git a/test/testfiles/oac/102-1.html b/test/testfiles/oac/102-1.html deleted file mode 100644 index 61aecfebd..000000000 --- a/test/testfiles/oac/102-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #102 - Positive - - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/102-2.html b/test/testfiles/oac/102-2.html deleted file mode 100644 index e06978160..000000000 --- a/test/testfiles/oac/102-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #102 - Negative - - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/102-3.html b/test/testfiles/oac/102-3.html deleted file mode 100644 index b813b2441..000000000 --- a/test/testfiles/oac/102-3.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - -Check #102 - Positive - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/103-1.html b/test/testfiles/oac/103-1.html deleted file mode 100644 index bd439a762..000000000 --- a/test/testfiles/oac/103-1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - -Check #103 - Positive - - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/103-2.html b/test/testfiles/oac/103-2.html deleted file mode 100644 index 099b359f9..000000000 --- a/test/testfiles/oac/103-2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - -Check #103 - Negative - - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/104-1.html b/test/testfiles/oac/104-1.html deleted file mode 100644 index d1b119be7..000000000 --- a/test/testfiles/oac/104-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #104.1 - Positive - - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/104-2.html b/test/testfiles/oac/104-2.html deleted file mode 100644 index 6b7c66887..000000000 --- a/test/testfiles/oac/104-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #104.2 - Negative - - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/105-1.html b/test/testfiles/oac/105-1.html deleted file mode 100644 index 2e7793319..000000000 --- a/test/testfiles/oac/105-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #105 - Positive - - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/105-2.html b/test/testfiles/oac/105-2.html deleted file mode 100644 index 2ab770cac..000000000 --- a/test/testfiles/oac/105-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #105 - Negative - - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/106-1.html b/test/testfiles/oac/106-1.html deleted file mode 100644 index 694f0cfd5..000000000 --- a/test/testfiles/oac/106-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #106 - Positive - - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/106-2.html b/test/testfiles/oac/106-2.html deleted file mode 100644 index 7b215c7f2..000000000 --- a/test/testfiles/oac/106-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #106 - Negative - - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/107-1.html b/test/testfiles/oac/107-1.html deleted file mode 100644 index e89b62c57..000000000 --- a/test/testfiles/oac/107-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #107 - Positive - - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/107-2.html b/test/testfiles/oac/107-2.html deleted file mode 100644 index 3be9e6cc3..000000000 --- a/test/testfiles/oac/107-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #107 - Negative - - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/108-1.html b/test/testfiles/oac/108-1.html deleted file mode 100644 index c020e7856..000000000 --- a/test/testfiles/oac/108-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #108 - Positive - - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/108-2.html b/test/testfiles/oac/108-2.html deleted file mode 100644 index 1ceca2150..000000000 --- a/test/testfiles/oac/108-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #108 - Negative - - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/109-1.html b/test/testfiles/oac/109-1.html deleted file mode 100644 index b6b69c7ce..000000000 --- a/test/testfiles/oac/109-1.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #109 - Positive - - - - - -

        Hello.

        - -

        Bye.

        - - - - - - - - - - diff --git a/test/testfiles/oac/109-2.html b/test/testfiles/oac/109-2.html deleted file mode 100644 index 594d3985c..000000000 --- a/test/testfiles/oac/109-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #109 - Negative - - - - - -

        Hello.

        - - - - - - - - - - diff --git a/test/testfiles/oac/11-1.html b/test/testfiles/oac/11-1.html deleted file mode 100644 index a7f8691fa..000000000 --- a/test/testfiles/oac/11-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #11 - Positive - - - - -

        logo

        - - - - - - - - - diff --git a/test/testfiles/oac/11-2.html b/test/testfiles/oac/11-2.html deleted file mode 100644 index 8e6eb4150..000000000 --- a/test/testfiles/oac/11-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #11 - Negative - - - - -

        W3C Working Draft logo

        - - - - - - - - - diff --git a/test/testfiles/oac/110-1.html b/test/testfiles/oac/110-1.html deleted file mode 100644 index b5960d38b..000000000 --- a/test/testfiles/oac/110-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #110 - Positive - - - - -

        And with a certain je ne sais quoi, she entered both the room, and his life, forever.

        - - - - - - - - - diff --git a/test/testfiles/oac/110-2.html b/test/testfiles/oac/110-2.html deleted file mode 100644 index 796105737..000000000 --- a/test/testfiles/oac/110-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #110 - Positive - - - - -

        And with a certain je ne sais quoi, she entered both the room, and his life, forever.

        - - - - - - - - - diff --git a/test/testfiles/oac/111-1.html b/test/testfiles/oac/111-1.html deleted file mode 100644 index 528c72172..000000000 --- a/test/testfiles/oac/111-1.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - -Check #111.1 - Positive - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        State & FirstState & SixthState & FifteenthFifteenth & Morrison
        4:004:054:114:19
        5:005:055:115:19
        6:006:056:116:19
        - - - - - - - - - - diff --git a/test/testfiles/oac/111-2.html b/test/testfiles/oac/111-2.html deleted file mode 100644 index 9be8af558..000000000 --- a/test/testfiles/oac/111-2.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - -Check #111-2 - Negative - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        State & FirstState & SixthState & FifteenthFifteenth & Morrison
        4:004:054:114:19
        5:005:055:115:19
        6:006:056:116:19
        - - - - - - - - - - diff --git a/test/testfiles/oac/111-3.html b/test/testfiles/oac/111-3.html deleted file mode 100644 index d3a28e816..000000000 --- a/test/testfiles/oac/111-3.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - -Check #111.3 - Negative - - - - - - - - - - - - -
        Manager Work Days
        DayManager
        MondayErol
        TuesdayDavid
        WednesdayCarol
        ThursdaySusan
        FridayPiere
        - - - - - - - - - - diff --git a/test/testfiles/oac/112-1.html b/test/testfiles/oac/112-1.html deleted file mode 100644 index 1e6070dba..000000000 --- a/test/testfiles/oac/112-1.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - -Check #112-1 - Positive - - - - - - - - - - - - - -
        namenumber of cupstypewith sugar
        Adams, Willie2regularsugar
        Bacon, Lise4regularno sugar
        Chaput, Maria1decafsugar
        Di Nino, Consiglio0not applicablenot applicable
        Eggleton, Art6regularno sugar
        - - - - - - - - - - diff --git a/test/testfiles/oac/112-2.html b/test/testfiles/oac/112-2.html deleted file mode 100644 index 6509f1f76..000000000 --- a/test/testfiles/oac/112-2.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - -Check #112-2 - Negative - - - - - - - - - - - - - -
        namenumber of cupstypewith sugar
        Adams, Willie2regularsugar
        Bacon, Lise4regularno sugar
        Chaput, Maria1decafsugar
        Di Nino, Consiglio0not applicablenot applicable
        Eggleton, Art6regularno sugar
        - - - - - - - - - - diff --git a/test/testfiles/oac/113-1.html b/test/testfiles/oac/113-1.html deleted file mode 100644 index fd2094b44..000000000 --- a/test/testfiles/oac/113-1.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - -Check #113-1 - Positive - - - - - - - - - - - - - -
        namenumber of cupstypewith sugar
        Adams, Willie2regularsugar
        Bacon, Lise4regularno sugar
        Chaput, Maria1decafsugar
        Di Nino, Consiglio0not applicablenot applicable
        Eggleton, Art6regularno sugar
        - - - - - - - - - - diff --git a/test/testfiles/oac/113-2.html b/test/testfiles/oac/113-2.html deleted file mode 100644 index ebcde903b..000000000 --- a/test/testfiles/oac/113-2.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - -Check #113-2 - Positive - - - - - - - - - - - - - -
        namenumber of cupstypewith sugar
        Adams, Willie2regularsugar
        Bacon, Lise4regularno sugar
        Chaput, Maria1decafsugar
        Di Nino, Consiglio0not applicablenot applicable
        Eggleton, Art6regularno sugar
        - - - - - - - - - - diff --git a/test/testfiles/oac/114-1.html b/test/testfiles/oac/114-1.html deleted file mode 100644 index e625645c5..000000000 --- a/test/testfiles/oac/114-1.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - -Check #114-1 - Positive - - - - - - - - - - -
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure.
        - - - - - - - - - - diff --git a/test/testfiles/oac/114-2.html b/test/testfiles/oac/114-2.html deleted file mode 100644 index 5306e3a64..000000000 --- a/test/testfiles/oac/114-2.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - -Check #114-2 - Negative - - - - - - - - - - -
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure.
        - - - - - - - - - - diff --git a/test/testfiles/oac/114-3.html b/test/testfiles/oac/114-3.html deleted file mode 100644 index c93666d33..000000000 --- a/test/testfiles/oac/114-3.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - -Check #114-3 - Negative - - - - - - - - - - -
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure.
        - - - - - - - - - - diff --git a/test/testfiles/oac/114-4.html b/test/testfiles/oac/114-4.html deleted file mode 100644 index cadb23e36..000000000 --- a/test/testfiles/oac/114-4.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - -Check #114-4 - Positive - - - - - - - - - - - - - - - - -
        This would be a sidebar. - - - - -
        - This is a content area given some border through a table. -
        -
        This is a footer.
        This is another footer.
        - - - - - - - - - - diff --git a/test/testfiles/oac/114-5.html b/test/testfiles/oac/114-5.html deleted file mode 100644 index 75adc4204..000000000 --- a/test/testfiles/oac/114-5.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - -Check #114-4 - Positive - - - - - - - - - - - - - - - - - - - - -
        This would be a sidebar.
        This is a footer.
        This is another footer.
        - - - - - - - - - - diff --git a/test/testfiles/oac/115-1.html b/test/testfiles/oac/115-1.html deleted file mode 100644 index ce719556c..000000000 --- a/test/testfiles/oac/115-1.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - -Check #115-1 - Positive - - - - - - - - - - -
        Latin And English Text
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure.
        - - - - - - - - - - diff --git a/test/testfiles/oac/115-2.html b/test/testfiles/oac/115-2.html deleted file mode 100644 index bfc572798..000000000 --- a/test/testfiles/oac/115-2.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - -Check #115-2 - Negative - - - - - - - - - - -
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure.
        - - - - - - - - - - diff --git a/test/testfiles/oac/116-1.html b/test/testfiles/oac/116-1.html deleted file mode 100644 index e55d381be..000000000 --- a/test/testfiles/oac/116-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #116 - Positive - - - - -

        What she really meant to say was, "This isn't ok, it is excellent!"

        - - - - - - - - - diff --git a/test/testfiles/oac/116-2.html b/test/testfiles/oac/116-2.html deleted file mode 100644 index 105faa0e5..000000000 --- a/test/testfiles/oac/116-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #116 - Negative - - - - -

        What she really meant to say was, "This isn't ok, it is excellent!"

        - - - - - - - - - diff --git a/test/testfiles/oac/117-1.html b/test/testfiles/oac/117-1.html deleted file mode 100644 index 4567f8c30..000000000 --- a/test/testfiles/oac/117-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #117 - Positive - - - - -

        What she really meant to say was, "This isn't ok, it is excellent!"

        - - - - - - - - - diff --git a/test/testfiles/oac/117-2.html b/test/testfiles/oac/117-2.html deleted file mode 100644 index 00594c645..000000000 --- a/test/testfiles/oac/117-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #117 - Negative - - - - -

        What she really meant to say was, "This isn't ok, it is excellent!"

        - - - - - - - - - diff --git a/test/testfiles/oac/118-1.html b/test/testfiles/oac/118-1.html deleted file mode 100644 index 9062f74b2..000000000 --- a/test/testfiles/oac/118-1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #118 - Positive - - - - -
        -

        - - -

        -
        - - - - - - - - - diff --git a/test/testfiles/oac/118-2.html b/test/testfiles/oac/118-2.html deleted file mode 100644 index c5ee45ba8..000000000 --- a/test/testfiles/oac/118-2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #118 - Negative - - - - -
        -

        - - -

        -
        - - - - - - - - - diff --git a/test/testfiles/oac/118-3.html b/test/testfiles/oac/118-3.html deleted file mode 100644 index 895458c11..000000000 --- a/test/testfiles/oac/118-3.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #118 - Positive - - - - -
        -

        - -

        -
        - - - - - - - - - diff --git a/test/testfiles/oac/118-4.html b/test/testfiles/oac/118-4.html deleted file mode 100644 index d43dbbdd6..000000000 --- a/test/testfiles/oac/118-4.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #118 - Negative - - - - -
        -

        - -

        -
        - - - - - - - - - diff --git a/test/testfiles/oac/119-1.html b/test/testfiles/oac/119-1.html deleted file mode 100644 index 7a76709f7..000000000 --- a/test/testfiles/oac/119-1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #119 - Positive - - - - -
        -

        - - -

        -
        - - - - - - - - - diff --git a/test/testfiles/oac/119-2.html b/test/testfiles/oac/119-2.html deleted file mode 100644 index 3434d079a..000000000 --- a/test/testfiles/oac/119-2.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #119 - Negative - - - - -
        -

        - - -

        -
        - - - - - - - - diff --git a/test/testfiles/oac/119-3.html b/test/testfiles/oac/119-3.html deleted file mode 100644 index 3fdffbd77..000000000 --- a/test/testfiles/oac/119-3.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #119 - Negative - - - - -
        -

        - -

        -
        - - - - - - - - diff --git a/test/testfiles/oac/119-4.html b/test/testfiles/oac/119-4.html deleted file mode 100644 index c960722f0..000000000 --- a/test/testfiles/oac/119-4.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #57 - Negative - - - - -
        -

        - -

        -
        - - - - - - - - - diff --git a/test/testfiles/oac/12-1.html b/test/testfiles/oac/12-1.html deleted file mode 100644 index eb43d7714..000000000 --- a/test/testfiles/oac/12-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #12 - Positive - - - - -

        image map

        - - - - - - - - - diff --git a/test/testfiles/oac/12-2.html b/test/testfiles/oac/12-2.html deleted file mode 100644 index 0a75ab3d4..000000000 --- a/test/testfiles/oac/12-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #12 - Positive - - - - -

        image map

        - - - - - - - - - diff --git a/test/testfiles/oac/120-1.html b/test/testfiles/oac/120-1.html deleted file mode 100644 index ffc103f54..000000000 --- a/test/testfiles/oac/120-1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #120 - Positive - - - - -
        -

        - - -

        -
        - - - - - - - - - diff --git a/test/testfiles/oac/120-2.html b/test/testfiles/oac/120-2.html deleted file mode 100644 index b419ea740..000000000 --- a/test/testfiles/oac/120-2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #120 - Negative - - - - -
        -

        - - -

        -
        - - - - - - - - - diff --git a/test/testfiles/oac/120-3.html b/test/testfiles/oac/120-3.html deleted file mode 100644 index af439ca72..000000000 --- a/test/testfiles/oac/120-3.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #120 - Negative - - - - -
        -

        - -

        -
        - - - - - - - - - diff --git a/test/testfiles/oac/120-4.html b/test/testfiles/oac/120-4.html deleted file mode 100644 index 9e911e2fc..000000000 --- a/test/testfiles/oac/120-4.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #120 - Negative - - - - -
        -

        - -

        -
        - - - - - - - - - diff --git a/test/testfiles/oac/121-1.html b/test/testfiles/oac/121-1.html deleted file mode 100644 index 41751f335..000000000 --- a/test/testfiles/oac/121-1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #121 - Positive - - - - -
        -

        - - -

        -
        - - - - - - - - - diff --git a/test/testfiles/oac/121-2.html b/test/testfiles/oac/121-2.html deleted file mode 100644 index 1e906b28f..000000000 --- a/test/testfiles/oac/121-2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #121 - Negative - - - - -
        -

        - - -

        -
        - - - - - - - - - diff --git a/test/testfiles/oac/121-3.html b/test/testfiles/oac/121-3.html deleted file mode 100644 index 2d7100711..000000000 --- a/test/testfiles/oac/121-3.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #121 - Positive - - - - -
        -

        - -

        -
        - - - - - - - - - diff --git a/test/testfiles/oac/121-4.html b/test/testfiles/oac/121-4.html deleted file mode 100644 index 01812fefb..000000000 --- a/test/testfiles/oac/121-4.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #121 - Negative - - - - -
        -

        - -

        -
        - - - - - - - - - diff --git a/test/testfiles/oac/122-1.html b/test/testfiles/oac/122-1.html deleted file mode 100644 index f0ee922da..000000000 --- a/test/testfiles/oac/122-1.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - -Testfile - Check #122.1 - Positive - - - - -

        Please enter your password below:

        -
        - - - -
        -
        - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/122-2.html b/test/testfiles/oac/122-2.html deleted file mode 100644 index 43eadce2d..000000000 --- a/test/testfiles/oac/122-2.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - -Testfile - Check #122.2 - Negative - - - - -

        Please enter your password below:

        -
        - - - -
        password:
        -
        - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/123-1.html b/test/testfiles/oac/123-1.html deleted file mode 100644 index 0da1de8a6..000000000 --- a/test/testfiles/oac/123-1.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Testfile - Check #123.1 - Positive - - - - -

        Select your animals using the form below:

        -
        - - - - - -
        dog
        cat
        polar bear
        -
        - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/123-2.html b/test/testfiles/oac/123-2.html deleted file mode 100644 index 6b29005cc..000000000 --- a/test/testfiles/oac/123-2.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Testfile - Check #123.2 - Negative - - - - -

        Select your animals using the form below:

        -
        - - - - - -
        dog
        cat
        polar bear
        -
        - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/124-1.html b/test/testfiles/oac/124-1.html deleted file mode 100644 index d6b7cb1b2..000000000 --- a/test/testfiles/oac/124-1.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - -Testfile - Check #124.1 - Positive - - - - -

        Please upload your file using the form below:

        -
        - - - -
        file:
        -
        - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/124-2.html b/test/testfiles/oac/124-2.html deleted file mode 100644 index 00184f923..000000000 --- a/test/testfiles/oac/124-2.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - -Testfile - Check #124.2 - Negative - - - - -

        Please upload your file using the form below:

        -
        - - - -
        file:
        -
        - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/125-1.html b/test/testfiles/oac/125-1.html deleted file mode 100644 index 09b7af2a1..000000000 --- a/test/testfiles/oac/125-1.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Testfile - Check #125.1 - Positive - - - - -

        Select your favourite animal using the form below:

        -
        - - - - - -
        dog
        cat
        polar bear
        -
        - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/125-2.html b/test/testfiles/oac/125-2.html deleted file mode 100644 index c97fcd3a2..000000000 --- a/test/testfiles/oac/125-2.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Testfile - Check #125.2 - Negative - - - - -

        Select your favourite animal using the form below:

        -
        - - - - - -
        dog
        cat
        polar bear
        -
        - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/126-1.html b/test/testfiles/oac/126-1.html deleted file mode 100644 index f8e5e9cd3..000000000 --- a/test/testfiles/oac/126-1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #126 - Positive - - - - -
        -
        - - - - - - - - - diff --git a/test/testfiles/oac/126-2.html b/test/testfiles/oac/126-2.html deleted file mode 100644 index 38ea8fa48..000000000 --- a/test/testfiles/oac/126-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #126 - Negative - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/127-1.html b/test/testfiles/oac/127-1.html deleted file mode 100644 index b36354a82..000000000 --- a/test/testfiles/oac/127-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #127 - Positive - - - - -text equiv for object - - - - - - - - - diff --git a/test/testfiles/oac/127-2.html b/test/testfiles/oac/127-2.html deleted file mode 100644 index 3d04ee71f..000000000 --- a/test/testfiles/oac/127-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #127 - Negative - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/128-1.html b/test/testfiles/oac/128-1.html deleted file mode 100644 index 59a79a7c5..000000000 --- a/test/testfiles/oac/128-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #128 - Positive - - - - -text equiv for object - - - - - - - - - diff --git a/test/testfiles/oac/128-2.html b/test/testfiles/oac/128-2.html deleted file mode 100644 index 16a2a46b9..000000000 --- a/test/testfiles/oac/128-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #128 - Negative - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/129-1.html b/test/testfiles/oac/129-1.html deleted file mode 100644 index 4ccf2c0c7..000000000 --- a/test/testfiles/oac/129-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #129 - Negative - - - - -text equiv for object - - - - - - - - - diff --git a/test/testfiles/oac/129-2.html b/test/testfiles/oac/129-2.html deleted file mode 100644 index e696160fb..000000000 --- a/test/testfiles/oac/129-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #129 - Negative - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/13-1.html b/test/testfiles/oac/13-1.html deleted file mode 100644 index 1e9211f87..000000000 --- a/test/testfiles/oac/13-1.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - -Check #13 - Positive - - - - -

        -horses -dogs -birds -

        - -

        navigation

        - - - - - - - - - - diff --git a/test/testfiles/oac/13-2.html b/test/testfiles/oac/13-2.html deleted file mode 100644 index 7bba74b36..000000000 --- a/test/testfiles/oac/13-2.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Check #13 - Negative - - - - -

        -horses -dogs -birds -

        - -

        navigation

        - -

        Horses | Dogs | Birds

        - - - - - - - - - diff --git a/test/testfiles/oac/13-3.html b/test/testfiles/oac/13-3.html deleted file mode 100644 index d869591e2..000000000 --- a/test/testfiles/oac/13-3.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - -Check #13 - Positive - - - - -

        -horses -dogs -birds -

        - -

        navigation

        - -

        Horses | Dogs

        - - - - - - - - - - diff --git a/test/testfiles/oac/131-1.html b/test/testfiles/oac/131-1.html deleted file mode 100644 index 2ad05f1c6..000000000 --- a/test/testfiles/oac/131-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #131 - Positive - - - - -

        This is a paragraph which is not a quote; however, there is one below.

        -

        "It was a dark and stormy night."

        -

        Wasn't that a scary quote?

        - - - - - - - - - diff --git a/test/testfiles/oac/131-2.html b/test/testfiles/oac/131-2.html deleted file mode 100644 index dd90c1e0e..000000000 --- a/test/testfiles/oac/131-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #131 - Negative - - - - -

        This is a paragraph which does not have a quote.

        - -

        This is also paragraph which does not have a quote.

        - - - - - - - - - diff --git a/test/testfiles/oac/132-1.html b/test/testfiles/oac/132-1.html deleted file mode 100644 index 13467f2cd..000000000 --- a/test/testfiles/oac/132-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #132 - Positive - - - - -

        map of the country

        - - - - - - - - - diff --git a/test/testfiles/oac/132-2.html b/test/testfiles/oac/132-2.html deleted file mode 100644 index b6f204dfa..000000000 --- a/test/testfiles/oac/132-2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #132 - Negative - - - - -

        map of the country

        -

        East Coast | Central | West Coast

        - - - - - - - - - diff --git a/test/testfiles/oac/133-1.html b/test/testfiles/oac/133-1.html deleted file mode 100644 index 7d39aa968..000000000 --- a/test/testfiles/oac/133-1.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - -Check #133.1 - Positive - - - - - - - - - - - - - -
        XYZ mountaineeringtop!
        XYZ gets you to the
        - - - - - - - - - - diff --git a/test/testfiles/oac/133-2.html b/test/testfiles/oac/133-2.html deleted file mode 100644 index dde020c0b..000000000 --- a/test/testfiles/oac/133-2.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - -Check #133.2 - Negative - - - - - - - - - - - - - -
        XYZ mountaineering
        XYZ gets you to thetop!
        - - - - - - - - - - diff --git a/test/testfiles/oac/134-1.html b/test/testfiles/oac/134-1.html deleted file mode 100644 index 1610016ac..000000000 --- a/test/testfiles/oac/134-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #134 - Positive - - - - -dogs cats birds snakes - - - - - - - - - diff --git a/test/testfiles/oac/134-2.html b/test/testfiles/oac/134-2.html deleted file mode 100644 index 3f12dced8..000000000 --- a/test/testfiles/oac/134-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #134 - Negative - - - - -dogs | cats | birds | snakes - - - - - - - - - diff --git a/test/testfiles/oac/135-1.html b/test/testfiles/oac/135-1.html deleted file mode 100644 index 60e1e0e3d..000000000 --- a/test/testfiles/oac/135-1.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - Testfile - Check #135 - Positive - - - - - - - -

        The following image shows the solution to the quadratic equation: begin fraction minus b plus or minus begin square root of b squared minus four a c end square root over 2 a end fraction

        - - - - solution to the quadratic equation - - - - - - - - - - - diff --git a/test/testfiles/oac/135-2.html b/test/testfiles/oac/135-2.html deleted file mode 100644 index 126f292df..000000000 --- a/test/testfiles/oac/135-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #135 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/135-3.html b/test/testfiles/oac/135-3.html deleted file mode 100644 index 6dab160a6..000000000 --- a/test/testfiles/oac/135-3.html +++ /dev/null @@ -1,114 +0,0 @@ - ]> - - - - - - Testfile - Check #135 - Negative - - - - - - - -

        - -
        - -

        - -
          - -
          test markup, will be hidden
          - -

          The following image shows the solution to the quadratic equation: begin fraction minus b plus or - - minus begin square root of b squared minus four a c end square root over 2 a - - end fraction

          - - solution to the quadratic equation - - - - - - - - - - - - - b - - - - ± - - - - - - - - b - - 2 - - - - - - - - - 4 - - - - a - - - - c - - - - - - - - - - - - 2 - - - - a - - - - - - - - - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/136-1.html b/test/testfiles/oac/136-1.html deleted file mode 100644 index 1e50fcd79..000000000 --- a/test/testfiles/oac/136-1.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Check #136-1 - Positive - - - - - - - - - - - - -
          namenumber of cupstypewith sugar
          Adams, Willie2regularsugar
          Bacon, Lise4regularno sugar
          Chaput, Maria1decafsugar
          Di Nino, Consiglio0not applicablenot applicable
          Eggleton, Art6regularno sugar
          - - - - - - - - - diff --git a/test/testfiles/oac/136-2.html b/test/testfiles/oac/136-2.html deleted file mode 100644 index 7d222b9c7..000000000 --- a/test/testfiles/oac/136-2.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Check #136-2 - Negative - - - - - - - - - - - - -
          namenumber of cupstypewith sugar
          Adams, Willie2regularsugar
          Bacon, Lise4regularno sugar
          Chaput, Maria1decafsugar
          Di Nino, Consiglio0not applicablenot applicable
          Eggleton, Art6regularno sugar
          - - - - - - - - - diff --git a/test/testfiles/oac/137-1.html b/test/testfiles/oac/137-1.html deleted file mode 100644 index a44fccc94..000000000 --- a/test/testfiles/oac/137-1.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - -Check #114-1 - Positive - - - - - - - - - - - -
          Latin is a dead language.The English language thrives.
          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure.
          - - - - - - - - - diff --git a/test/testfiles/oac/137-2.html b/test/testfiles/oac/137-2.html deleted file mode 100644 index a6744eb40..000000000 --- a/test/testfiles/oac/137-2.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - -Check #114-1 - Positive - - - - - - - - - - - -
          Latin is a dead language.The English language thrives.
          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness. No one rejects, dislikes, or avoids pleasure itself, because it is pleasure, but because those who do not know how to pursue pleasure rationally encounter consequences that are extremely painful. Nor again is there anyone who loves or pursues or desires to obtain pain of itself, because it is pain, but because occasionally circumstances occur in which toil and pain can procure him some great pleasure. To take a trivial example, which of us ever undertakes laborious physical exercise, except to obtain some advantage from it? But who has any right to find fault with a man who chooses to enjoy a pleasure that has no annoying consequences, or one who avoids a pain that produces no resultant pleasure.
          - - - - - - - - - diff --git a/test/testfiles/oac/138-1.html b/test/testfiles/oac/138-1.html deleted file mode 100644 index d02b8dcb7..000000000 --- a/test/testfiles/oac/138-1.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #138.1 - Positive - - - - -
          -

          -: -

          -
          - - - - - - - - diff --git a/test/testfiles/oac/138-2.html b/test/testfiles/oac/138-2.html deleted file mode 100644 index c6e1f30ce..000000000 --- a/test/testfiles/oac/138-2.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #138.2 - Positive - - - - -
          -

          -: -

          -
          - - - - - - - - diff --git a/test/testfiles/oac/138-3.html b/test/testfiles/oac/138-3.html deleted file mode 100644 index 597fb368b..000000000 --- a/test/testfiles/oac/138-3.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #138.3 - Negative - - - - -
          -

          -: -

          -
          - - - - - - - - diff --git a/test/testfiles/oac/139-1.html b/test/testfiles/oac/139-1.html deleted file mode 100644 index c2722b05e..000000000 --- a/test/testfiles/oac/139-1.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #139.1 - Positive - - - - -
          -

          -: -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/139-2.html b/test/testfiles/oac/139-2.html deleted file mode 100644 index b3052afbd..000000000 --- a/test/testfiles/oac/139-2.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #138.2 - Positive - - - - -
          -

          -: -

          -
          - - - - - - - - diff --git a/test/testfiles/oac/139-3.html b/test/testfiles/oac/139-3.html deleted file mode 100644 index 1e0614d5e..000000000 --- a/test/testfiles/oac/139-3.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #138.3 - Negative - - - - -
          -

          -: -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/14-1.html b/test/testfiles/oac/14-1.html deleted file mode 100644 index ab04bc44c..000000000 --- a/test/testfiles/oac/14-1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #14.1 - Positive - - - - -

          Clayton's Class

          - -

          This is Clayton's class photo from 2004. Clayton is the one wearing a red coat.

          - -

          class photo showing 6 children

          - - - - - - - - - - diff --git a/test/testfiles/oac/14-2.html b/test/testfiles/oac/14-2.html deleted file mode 100644 index 4c109cc7c..000000000 --- a/test/testfiles/oac/14-2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #14.2 - Negative - - - - -

          Clayton's Class

          - -

          This is Clayton's class photo from 2004. Clayton is third from the left wearing a red coat and no boots.

          - -

          class photo showing 6 children

          - - - - - - - - - - diff --git a/test/testfiles/oac/14-3.html b/test/testfiles/oac/14-3.html deleted file mode 100644 index 484a9fcc6..000000000 --- a/test/testfiles/oac/14-3.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #14.3 - Positive - - - - -

          Clayton's Class

          - -

          Clayton is shown below in the class photo from grade 3.

          - -

          class photo showing Clayton with red coat.

          - - - - - - - - - - diff --git a/test/testfiles/oac/140-1.html b/test/testfiles/oac/140-1.html deleted file mode 100644 index e38aef069..000000000 --- a/test/testfiles/oac/140-1.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #140.1 - Positive - - - - -
          -

          -: -

          -
          - - - - - - - - diff --git a/test/testfiles/oac/140-2.html b/test/testfiles/oac/140-2.html deleted file mode 100644 index 9c0286ef0..000000000 --- a/test/testfiles/oac/140-2.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #140.2 - Positive - - - - -
          -

          -: -

          -
          - - - - - - - - diff --git a/test/testfiles/oac/140-3.html b/test/testfiles/oac/140-3.html deleted file mode 100644 index 6349f7129..000000000 --- a/test/testfiles/oac/140-3.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #138.3 - Negative - - - - -
          -

          -: -

          -
          - - - - - - - - diff --git a/test/testfiles/oac/141-1.html b/test/testfiles/oac/141-1.html deleted file mode 100644 index a7300e43b..000000000 --- a/test/testfiles/oac/141-1.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #141.1 - Positive - - - - -
          -

          -: -

          -
          - - - - - - - - diff --git a/test/testfiles/oac/141-2.html b/test/testfiles/oac/141-2.html deleted file mode 100644 index 9d62965cd..000000000 --- a/test/testfiles/oac/141-2.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #141.2 - Positive - - - - -
          -

          -: -

          -
          - - - - - - - - diff --git a/test/testfiles/oac/141-3.html b/test/testfiles/oac/141-3.html deleted file mode 100644 index fcd144d38..000000000 --- a/test/testfiles/oac/141-3.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #141.3 - Positive - - - - -
          -

          -: -

          -
          - - - - - - - - diff --git a/test/testfiles/oac/142-1.html b/test/testfiles/oac/142-1.html deleted file mode 100644 index 3c7d4a998..000000000 --- a/test/testfiles/oac/142-1.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #142.1 - Positive - - - - -
          -

          -: -

          -
          - - - - - - - - diff --git a/test/testfiles/oac/142-2.html b/test/testfiles/oac/142-2.html deleted file mode 100644 index 968e93057..000000000 --- a/test/testfiles/oac/142-2.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #142.2 - Positive - - - - -
          -

          -: -

          -
          - - - - - - - - diff --git a/test/testfiles/oac/142-3.html b/test/testfiles/oac/142-3.html deleted file mode 100644 index fd6fb97b0..000000000 --- a/test/testfiles/oac/142-3.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #142.3 - Negative - - - - -
          -

          -: -

          -
          - - - - - - - - diff --git a/test/testfiles/oac/143-1.html b/test/testfiles/oac/143-1.html deleted file mode 100644 index c69e1fb30..000000000 --- a/test/testfiles/oac/143-1.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #143 - Positive - - - - - - - - - - - - - diff --git a/test/testfiles/oac/143-2.html b/test/testfiles/oac/143-2.html deleted file mode 100644 index ed149ba93..000000000 --- a/test/testfiles/oac/143-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #143 - Negative - - - - -
          joe smith
          - - - - - - - - - diff --git a/test/testfiles/oac/144-1.html b/test/testfiles/oac/144-1.html deleted file mode 100644 index be058a7e8..000000000 --- a/test/testfiles/oac/144-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #144 - Positive - - - - -
          joe smith
          - - - - - - - - - diff --git a/test/testfiles/oac/144-2.html b/test/testfiles/oac/144-2.html deleted file mode 100644 index de2edc1d7..000000000 --- a/test/testfiles/oac/144-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #144 - Negative - - - - -
          joe smith
          - - - - - - - - - diff --git a/test/testfiles/oac/148-1.html b/test/testfiles/oac/148-1.html deleted file mode 100644 index ea6914eef..000000000 --- a/test/testfiles/oac/148-1.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - Check #148 - Positive - - - - - - - - - - - - - diff --git a/test/testfiles/oac/148-2.html b/test/testfiles/oac/148-2.html deleted file mode 100644 index 0bbf58911..000000000 --- a/test/testfiles/oac/148-2.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - Check #148 - Negative - - - - - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/15-1.html b/test/testfiles/oac/15-1.html deleted file mode 100644 index 4ddd5a51d..000000000 --- a/test/testfiles/oac/15-1.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #15 - Positive - - - - -

          large rock with arrow

          - - - - - - - - - diff --git a/test/testfiles/oac/15-2.html b/test/testfiles/oac/15-2.html deleted file mode 100644 index ea3d84611..000000000 --- a/test/testfiles/oac/15-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #15 - Negative - - - - -

          Current routes at Boulders Climbing Gym

          - - - - - - - - - diff --git a/test/testfiles/oac/150-1.html b/test/testfiles/oac/150-1.html deleted file mode 100644 index a86873495..000000000 --- a/test/testfiles/oac/150-1.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - Check #150 - Positive - - - - - - - -
            - -
          • Item One
          • - -
          • Item Two
          • - -
          - - - - - - - - - - - diff --git a/test/testfiles/oac/150-2.html b/test/testfiles/oac/150-2.html deleted file mode 100644 index fe6938e4a..000000000 --- a/test/testfiles/oac/150-2.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - Check #150 - Positive - - - - - - - -
            - -
          • Item One
          • - -
          • Item Two
          • - -
          - - - - - - - - - - - diff --git a/test/testfiles/oac/151-1.html b/test/testfiles/oac/151-1.html deleted file mode 100644 index 1f048a83b..000000000 --- a/test/testfiles/oac/151-1.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Check #151.1 - Positive - - - - - - - - - - - - -
          namenumber of cupstypewith sugar
          Adams, Willie2regularsugar
          Bacon, Lise4regularno sugar
          Chaput, Maria1decafsugar
          Di Nino, Consiglio0not applicablenot applicable
          Eggleton, Art6regularno sugar
          - - - - - - - - - diff --git a/test/testfiles/oac/151-2.html b/test/testfiles/oac/151-2.html deleted file mode 100644 index 0c5edb774..000000000 --- a/test/testfiles/oac/151-2.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Check #151.2 - Negative - - - - - - - - - - - - -
          Coffee Consumed By Senators
          namenumber of cupstypewith sugar
          Adams, Willie2regularsugar
          Bacon, Lise4regularno sugar
          Chaput, Maria1decafsugar
          Di Nino, Consiglio0not applicablenot applicable
          Eggleton, Art6regularno sugar
          - - - - - - - - - diff --git a/test/testfiles/oac/151-3.html b/test/testfiles/oac/151-3.html deleted file mode 100644 index 6ae88b4e6..000000000 --- a/test/testfiles/oac/151-3.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - -Check #151.3 - Negative - - - - - -

          The table below shows the number of cups of coffee consumed by senators.

          - - - - - - - - -
          namenumber of cupstypewith sugar
          Adams, Willie2regularsugar
          Bacon, Lise4regularno sugar
          Chaput, Maria1decafsugar
          Di Nino, Consiglio0not applicablenot applicable
          Eggleton, Art6regularno sugar
          - - - - - - - - - diff --git a/test/testfiles/oac/152-1.html b/test/testfiles/oac/152-1.html deleted file mode 100644 index 8d4d9744d..000000000 --- a/test/testfiles/oac/152-1.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - -Check #152 - Positive - - - - - - - - - - - - - - - - - - - - - - -
          A Test Table
          Col. 1 header really long textCol. 2 header really long text
          Row 1 headerC1R1C1R2
          Row 2 headerC2R1C2R2
          - - - - - - - - - - - diff --git a/test/testfiles/oac/152-2.html b/test/testfiles/oac/152-2.html deleted file mode 100644 index 92c592847..000000000 --- a/test/testfiles/oac/152-2.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - -Check #152 - Positive - - - - - - - - - - - - - - - - - - - - - -
          Col. 1 headerCol. 2 header
          Row 1 headerC1R1C1R2
          Row 2 headerC2R1C2R2
          - - - - - - - - - - diff --git a/test/testfiles/oac/152-3.html b/test/testfiles/oac/152-3.html deleted file mode 100644 index 0609d5809..000000000 --- a/test/testfiles/oac/152-3.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - -Check #152 - Positive - - - - - - - - - - - - - - - - - - - - - - -
          A Test Table
          Col. 1 header really long textCol. 2 header really long text
          Row 1 headerC1R1C1R2
          Row 2 headerC2R1C2R2
          - - - - - - - - - - diff --git a/test/testfiles/oac/153-1.html b/test/testfiles/oac/153-1.html deleted file mode 100644 index 1bd3b804c..000000000 --- a/test/testfiles/oac/153-1.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - -Check #153 - Positive - - - - - - - - - - - - - - - - - - - - - - -
          A Test Table
          Col. 1 header really long textCol. 2 header really long text
          Row 1 headerC1R1C1R2
          Row 2 headerC2R1C2R2
          - - - - - - - - - - - diff --git a/test/testfiles/oac/153-2.html b/test/testfiles/oac/153-2.html deleted file mode 100644 index eded71773..000000000 --- a/test/testfiles/oac/153-2.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - -Check #153 - Negative - - - - - - - - - - - - - - - - - - - - - - -
          A Test Table
          Col. 1 header really long textCol. 2 header really long text
          Row 1 headerC1R1C1R2
          Row 2 headerC2R1C2R2
          - - - - - - - - - - - diff --git a/test/testfiles/oac/154-1.html b/test/testfiles/oac/154-1.html deleted file mode 100644 index 68d7b6b09..000000000 --- a/test/testfiles/oac/154-1.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - -Check #154 - Positive - - - - - -
          -     dogs  cats
          -big	  2     4
          -small 5     7
          -
          - - - - - - - - - - diff --git a/test/testfiles/oac/154-2.html b/test/testfiles/oac/154-2.html deleted file mode 100644 index 37427b62e..000000000 --- a/test/testfiles/oac/154-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #154 - Positive - - - - - - - - - - - - - diff --git a/test/testfiles/oac/159-1.html b/test/testfiles/oac/159-1.html deleted file mode 100644 index 3d0b57316..000000000 --- a/test/testfiles/oac/159-1.html +++ /dev/null @@ -1,23 +0,0 @@ - - - -Check #159 - Positive - - - - -A brown and black cat named Rex. - - - - - - - - - diff --git a/test/testfiles/oac/159-2.html b/test/testfiles/oac/159-2.html deleted file mode 100644 index 528af2abf..000000000 --- a/test/testfiles/oac/159-2.html +++ /dev/null @@ -1,23 +0,0 @@ - - - -Check #159 - Negative - - - - -A brown and black cat named Rex. - - - - - - - - - diff --git a/test/testfiles/oac/16-1.html b/test/testfiles/oac/16-1.html deleted file mode 100644 index 4c65b97e2..000000000 --- a/test/testfiles/oac/16-1.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #16 - Positive - - - - -

          My poem requires a big spacebig spacehere.

          - - - - - - - - - diff --git a/test/testfiles/oac/16-2.html b/test/testfiles/oac/16-2.html deleted file mode 100644 index c65cfdccd..000000000 --- a/test/testfiles/oac/16-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #16 - Negative - - - - -

          My poem requires a big spacehere.

          - - - - - - - - - diff --git a/test/testfiles/oac/16-3.html b/test/testfiles/oac/16-3.html deleted file mode 100644 index 1750664fd..000000000 --- a/test/testfiles/oac/16-3.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #16 - Positive - - - - -

          red stardogs

          - - - - - - - - - diff --git a/test/testfiles/oac/16-4.html b/test/testfiles/oac/16-4.html deleted file mode 100644 index 6cbb22f0f..000000000 --- a/test/testfiles/oac/16-4.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #16 - Negative - - - - -

          dogs

          - - - - - - - - - diff --git a/test/testfiles/oac/160-1.html b/test/testfiles/oac/160-1.html deleted file mode 100644 index 6b803d626..000000000 --- a/test/testfiles/oac/160-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #160 - Positive - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/160-2.html b/test/testfiles/oac/160-2.html deleted file mode 100644 index 87073e746..000000000 --- a/test/testfiles/oac/160-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #160 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/161-1.html b/test/testfiles/oac/161-1.html deleted file mode 100644 index 3222ec2c8..000000000 --- a/test/testfiles/oac/161-1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #161 - Positive - - - - -

          Just a regular paragraph.

          -

          I am feeling :) :( B) :/ :P :o

          - - - - - - - - - diff --git a/test/testfiles/oac/161-2.html b/test/testfiles/oac/161-2.html deleted file mode 100644 index 78e8e2e3d..000000000 --- a/test/testfiles/oac/161-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #161 - Negative - - - - -

          Just a regular paragraph.

          - - - - - - - - - diff --git a/test/testfiles/oac/162-1.html b/test/testfiles/oac/162-1.html deleted file mode 100644 index ce1df5bfb..000000000 --- a/test/testfiles/oac/162-1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #162 - Positive - - - - -

          Just a regular paragraph.

          -

          I feel :)

          - - - - - - - - - diff --git a/test/testfiles/oac/162-2.html b/test/testfiles/oac/162-2.html deleted file mode 100644 index 8b63a13d8..000000000 --- a/test/testfiles/oac/162-2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #162 - Negative - - - - -

          Just a regular paragraph.

          -

          I feel :)

          - - - - - - - - - diff --git a/test/testfiles/oac/163-1.html b/test/testfiles/oac/163-1.html deleted file mode 100644 index bed98725e..000000000 --- a/test/testfiles/oac/163-1.html +++ /dev/null @@ -1,23 +0,0 @@ - - -Check #163.1 - Positive - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/163-2.html b/test/testfiles/oac/163-2.html deleted file mode 100644 index f7fb92963..000000000 --- a/test/testfiles/oac/163-2.html +++ /dev/null @@ -1,26 +0,0 @@ - - -Check #163.2 - Negative - - - - - - - <a href="../transcripts/transcript_history_rome.htm">Transcript of "The history of Rome"</a> - - - - - - - - - - - diff --git a/test/testfiles/oac/163-3.html b/test/testfiles/oac/163-3.html deleted file mode 100644 index 587a10c86..000000000 --- a/test/testfiles/oac/163-3.html +++ /dev/null @@ -1,25 +0,0 @@ - - -Check #163.3 - Negative - - - - - - - - <a href="../transcripts/transcript_history_rome.htm">Transcript of "The history of Rome"</a> - - - - - - - - - diff --git a/test/testfiles/oac/164-1.html b/test/testfiles/oac/164-1.html deleted file mode 100644 index 4bd32f7d6..000000000 --- a/test/testfiles/oac/164-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #164 - Positive - - - - - -Alternate content for the embed - - - - - - - - - - diff --git a/test/testfiles/oac/164-2.html b/test/testfiles/oac/164-2.html deleted file mode 100644 index ce80ed1f1..000000000 --- a/test/testfiles/oac/164-2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #164 - Negative - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/165-1.html b/test/testfiles/oac/165-1.html deleted file mode 100644 index 4fe21740d..000000000 --- a/test/testfiles/oac/165-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #165 - Positive - - - - - -Alternate content for the embed - - - - - - - - - - diff --git a/test/testfiles/oac/165-2.html b/test/testfiles/oac/165-2.html deleted file mode 100644 index 78d4f376c..000000000 --- a/test/testfiles/oac/165-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #165 - Negative - - - - - -Alternate content for the embed - - - - - - - - - - diff --git a/test/testfiles/oac/166-1.html b/test/testfiles/oac/166-1.html deleted file mode 100644 index c190e2f62..000000000 --- a/test/testfiles/oac/166-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #166 - Positive - - - - - -Alternate content for the embed - - - - - - - - - - diff --git a/test/testfiles/oac/166-2.html b/test/testfiles/oac/166-2.html deleted file mode 100644 index 87000eece..000000000 --- a/test/testfiles/oac/166-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #166 - Negative - - - - - -Alternate content for the embed - - - - - - - - - - diff --git a/test/testfiles/oac/167-1.html b/test/testfiles/oac/167-1.html deleted file mode 100644 index 224fa6fe7..000000000 --- a/test/testfiles/oac/167-1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #167 - Positive - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/167-2.html b/test/testfiles/oac/167-2.html deleted file mode 100644 index 4ae4cfa5c..000000000 --- a/test/testfiles/oac/167-2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #167 - Negative - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/168-1.html b/test/testfiles/oac/168-1.html deleted file mode 100644 index edf9bdf45..000000000 --- a/test/testfiles/oac/168-1.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - -Check #168 - Positive - - - - - -
          -

          - -
          - -
          - - -
          -

          -
          - - - - - - - - - - diff --git a/test/testfiles/oac/168-2.html b/test/testfiles/oac/168-2.html deleted file mode 100644 index 99091d5fe..000000000 --- a/test/testfiles/oac/168-2.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - -Check #168 - Negative - - - - - -
          -
          -Donut Type -

          - -
          - -
          - - -

          -
          -

          -
          - - - - - - - - - - diff --git a/test/testfiles/oac/168-3.html b/test/testfiles/oac/168-3.html deleted file mode 100644 index f527b8c41..000000000 --- a/test/testfiles/oac/168-3.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - -Check #168 - Negative - - - - - -
          -
          - - - - -
          -
          - - - - - - - - - - diff --git a/test/testfiles/oac/168-4.html b/test/testfiles/oac/168-4.html deleted file mode 100644 index c0f956dc3..000000000 --- a/test/testfiles/oac/168-4.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Check #168 - Negative - - - - - -
          - Personal information - - - - -
          - - - - - - - - - - diff --git a/test/testfiles/oac/169-1.html b/test/testfiles/oac/169-1.html deleted file mode 100644 index ade59c1ea..000000000 --- a/test/testfiles/oac/169-1.html +++ /dev/null @@ -1,55 +0,0 @@ - - - - - -Check #169 - Positive - - - - - -
          - - -
          - - - - - - - - - - diff --git a/test/testfiles/oac/169-2.html b/test/testfiles/oac/169-2.html deleted file mode 100644 index 2fe90dd38..000000000 --- a/test/testfiles/oac/169-2.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - -Check #169 - Negative - - - - - -
          - -
          - - - - - - - - - - diff --git a/test/testfiles/oac/17-1.html b/test/testfiles/oac/17-1.html deleted file mode 100644 index 4726bc6db..000000000 --- a/test/testfiles/oac/17-1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #17 - Positive - - - - -

          -Listen to Carol talking about dogs. -

          - - - - - - - - diff --git a/test/testfiles/oac/17-10.html b/test/testfiles/oac/17-10.html deleted file mode 100644 index 7a0f78593..000000000 --- a/test/testfiles/oac/17-10.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #17 - Positive - - - - -

          -Listen to Carol talking about dogs. -

          - - - - - - - - diff --git a/test/testfiles/oac/17-11.html b/test/testfiles/oac/17-11.html deleted file mode 100644 index 8c56c685c..000000000 --- a/test/testfiles/oac/17-11.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #17 - Positive - - - - -

          -Listen to Carol talking about dogs. -

          - - - - - - - - diff --git a/test/testfiles/oac/17-12.html b/test/testfiles/oac/17-12.html deleted file mode 100644 index 8760de297..000000000 --- a/test/testfiles/oac/17-12.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #17 - Positive - - - - -

          -Listen to Carol talking about dogs. -

          - - - - - - - - diff --git a/test/testfiles/oac/17-2.html b/test/testfiles/oac/17-2.html deleted file mode 100644 index 0bd7b57cf..000000000 --- a/test/testfiles/oac/17-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #17 - Negative - - - - -

          -Read the text transcript of Carol's talk about dogs. -

          - - - - - - - - - diff --git a/test/testfiles/oac/17-3.html b/test/testfiles/oac/17-3.html deleted file mode 100644 index 83d0cd5c9..000000000 --- a/test/testfiles/oac/17-3.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #17 - Positive - - - - -

          -Listen to Carol talking about dogs. -

          - - - - - - - - diff --git a/test/testfiles/oac/17-4.html b/test/testfiles/oac/17-4.html deleted file mode 100644 index 27c1fbf54..000000000 --- a/test/testfiles/oac/17-4.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #17 - Positive - - - - -

          -Listen to Carol talking about dogs. -

          - - - - - - - - diff --git a/test/testfiles/oac/17-5.html b/test/testfiles/oac/17-5.html deleted file mode 100644 index 4c355f778..000000000 --- a/test/testfiles/oac/17-5.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #17 - Positive - - - - -

          -Listen to Carol talking about dogs. -

          - - - - - - - - diff --git a/test/testfiles/oac/17-6.html b/test/testfiles/oac/17-6.html deleted file mode 100644 index 1a6a3bd28..000000000 --- a/test/testfiles/oac/17-6.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #17 - Positive - - - - -

          -Listen to Carol talking about dogs. -

          - - - - - - - - diff --git a/test/testfiles/oac/17-7.html b/test/testfiles/oac/17-7.html deleted file mode 100644 index c07a9cca6..000000000 --- a/test/testfiles/oac/17-7.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #17 - Positive - - - - -

          -Listen to Carol talking about dogs. -

          - - - - - - - - diff --git a/test/testfiles/oac/17-8.html b/test/testfiles/oac/17-8.html deleted file mode 100644 index c5375ffcf..000000000 --- a/test/testfiles/oac/17-8.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #17 - Positive - - - - -

          -Listen to Carol talking about dogs. -

          - - - - - - - - diff --git a/test/testfiles/oac/17-9.html b/test/testfiles/oac/17-9.html deleted file mode 100644 index d1a07053a..000000000 --- a/test/testfiles/oac/17-9.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #17 - Positive - - - - -

          -Listen to Carol talking about dogs. -

          - - - - - - - - diff --git a/test/testfiles/oac/173-1.html b/test/testfiles/oac/173-1.html deleted file mode 100644 index 12d4d3da3..000000000 --- a/test/testfiles/oac/173-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #173 - Positive - - - - - -

          For more information click here.

          - - - - - - - - - - diff --git a/test/testfiles/oac/173-2.html b/test/testfiles/oac/173-2.html deleted file mode 100644 index b832906a2..000000000 --- a/test/testfiles/oac/173-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #173 - Negative - - - - - -

          Select link for more information about dogs.

          - - - - - - - - - - diff --git a/test/testfiles/oac/173-3.html b/test/testfiles/oac/173-3.html deleted file mode 100644 index b32debaca..000000000 --- a/test/testfiles/oac/173-3.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #173 - Positive - - - - - -

          For more information.

          - - - - - - - - - - diff --git a/test/testfiles/oac/174-1.html b/test/testfiles/oac/174-1.html deleted file mode 100644 index bea808d2d..000000000 --- a/test/testfiles/oac/174-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #174 - Positive - - - - - -

          For more information .

          - - - - - - - - - - diff --git a/test/testfiles/oac/174-2.html b/test/testfiles/oac/174-2.html deleted file mode 100644 index a662baa00..000000000 --- a/test/testfiles/oac/174-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #174 - Negative - - - - - -

          Select link for more information about dogs.

          - - - - - - - - - - diff --git a/test/testfiles/oac/174-3.html b/test/testfiles/oac/174-3.html deleted file mode 100644 index 2d659248c..000000000 --- a/test/testfiles/oac/174-3.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #174 - Positive - - - - - -

          Select link for more information about dogs.

          - - - - - - - - - - diff --git a/test/testfiles/oac/174-4.html b/test/testfiles/oac/174-4.html deleted file mode 100644 index e40bd84d0..000000000 --- a/test/testfiles/oac/174-4.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #174 - Negative - - - - - -

          Select link for more information about dogs.more information about dogs

          - - - - - - - - - - diff --git a/test/testfiles/oac/174-5.html b/test/testfiles/oac/174-5.html deleted file mode 100644 index bd05fee94..000000000 --- a/test/testfiles/oac/174-5.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #174 - Negative - - - - - -

          This is a page with an anchor

          - - - - - - - - - - diff --git a/test/testfiles/oac/174-6.html b/test/testfiles/oac/174-6.html deleted file mode 100644 index 77025db1b..000000000 --- a/test/testfiles/oac/174-6.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #174 - Negative - - - - - -

          This is a page with an anchor

          - - - - - - - - - - diff --git a/test/testfiles/oac/175-1.html b/test/testfiles/oac/175-1.html deleted file mode 100644 index 0958c54c6..000000000 --- a/test/testfiles/oac/175-1.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - -Check #175 - Positive - - - - - -

          -page1page1 -

          - - - - - - - - - - diff --git a/test/testfiles/oac/175-2.html b/test/testfiles/oac/175-2.html deleted file mode 100644 index 4cd4eb352..000000000 --- a/test/testfiles/oac/175-2.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - -Check #175 - Negative - - - - - -

          -page1 -

          - - - - - - - - - - diff --git a/test/testfiles/oac/176-1.html b/test/testfiles/oac/176-1.html deleted file mode 100644 index c49bf6f4b..000000000 --- a/test/testfiles/oac/176-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #176 - Positive - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/176-2.html b/test/testfiles/oac/176-2.html deleted file mode 100644 index e53c9ada1..000000000 --- a/test/testfiles/oac/176-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #176 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/177-1.html b/test/testfiles/oac/177-1.html deleted file mode 100644 index 929b03b59..000000000 --- a/test/testfiles/oac/177-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #177 - Positive - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/177-2.html b/test/testfiles/oac/177-2.html deleted file mode 100644 index 7b794bde9..000000000 --- a/test/testfiles/oac/177-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #177 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/18-1.html b/test/testfiles/oac/18-1.html deleted file mode 100644 index d681876a9..000000000 --- a/test/testfiles/oac/18-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #18 - Positive - - - - -new window - - - - - - - - - diff --git a/test/testfiles/oac/18-2.html b/test/testfiles/oac/18-2.html deleted file mode 100644 index 44b6ab816..000000000 --- a/test/testfiles/oac/18-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #18 - Negative - - - - -same window - - - - - - - - - diff --git a/test/testfiles/oac/18-3.html b/test/testfiles/oac/18-3.html deleted file mode 100644 index 9cf666514..000000000 --- a/test/testfiles/oac/18-3.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #18 - Negative - - - - -same window - - - - - - - - - diff --git a/test/testfiles/oac/18-4.html b/test/testfiles/oac/18-4.html deleted file mode 100644 index f8a57f4ca..000000000 --- a/test/testfiles/oac/18-4.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #18 - Negative - - - - -same window - - - - - - - - - diff --git a/test/testfiles/oac/180-1.html b/test/testfiles/oac/180-1.html deleted file mode 100644 index c766e5e77..000000000 --- a/test/testfiles/oac/180-1.html +++ /dev/null @@ -1,24 +0,0 @@ - - - -Check #180 - Positive - - - - -Products for dogs -Products For Dogs - - - - - - - - - diff --git a/test/testfiles/oac/180-2.html b/test/testfiles/oac/180-2.html deleted file mode 100644 index 88488e348..000000000 --- a/test/testfiles/oac/180-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - -Check #180 - Negative - - - - -Products for dogs -Products For Cats - - - - - - - - - diff --git a/test/testfiles/oac/181-1.html b/test/testfiles/oac/181-1.html deleted file mode 100644 index 15c160617..000000000 --- a/test/testfiles/oac/181-1.html +++ /dev/null @@ -1,23 +0,0 @@ - - - -Check #181 - Positive - - - - -Scripted link - - - - - - - - - diff --git a/test/testfiles/oac/181-2.html b/test/testfiles/oac/181-2.html deleted file mode 100644 index 3bec72c98..000000000 --- a/test/testfiles/oac/181-2.html +++ /dev/null @@ -1,23 +0,0 @@ - - - -Check #181 - Negative - - - - -Scripted link with fallback - - - - - - - - - diff --git a/test/testfiles/oac/182-1.html b/test/testfiles/oac/182-1.html deleted file mode 100644 index 59edddc49..000000000 --- a/test/testfiles/oac/182-1.html +++ /dev/null @@ -1,21 +0,0 @@ - - - -Check #182 - Positive - - - - - - - - - - - - diff --git a/test/testfiles/oac/182-2.html b/test/testfiles/oac/182-2.html deleted file mode 100644 index 5d720b7ba..000000000 --- a/test/testfiles/oac/182-2.html +++ /dev/null @@ -1,22 +0,0 @@ - - - -Check #182 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/183-1.html b/test/testfiles/oac/183-1.html deleted file mode 100644 index b0a59a574..000000000 --- a/test/testfiles/oac/183-1.html +++ /dev/null @@ -1,29 +0,0 @@ - - - -Check #183 - Positive - - - - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/183-2.html b/test/testfiles/oac/183-2.html deleted file mode 100644 index e79801587..000000000 --- a/test/testfiles/oac/183-2.html +++ /dev/null @@ -1,36 +0,0 @@ - - - -Check #183 - Negative - - - - - - - - - - <img alt="Still from Movie" src="moviename.gif" - width="100" height="80" /> - - - - - - - - - - - - - diff --git a/test/testfiles/oac/184-1.html b/test/testfiles/oac/184-1.html deleted file mode 100644 index ce76edbe8..000000000 --- a/test/testfiles/oac/184-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - -Check #184 - Positive - - - - - -

          This document is part of a large collection of related documents.

          - - - - - - - - - - diff --git a/test/testfiles/oac/184-2.html b/test/testfiles/oac/184-2.html deleted file mode 100644 index 1c6563688..000000000 --- a/test/testfiles/oac/184-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - -Check #184 - Negative - - - - - -Site Map - -

          This document is part of a large collection of related documents.

          - - - - - - - - - - diff --git a/test/testfiles/oac/185-1.html b/test/testfiles/oac/185-1.html deleted file mode 100644 index cb573306a..000000000 --- a/test/testfiles/oac/185-1.html +++ /dev/null @@ -1,52 +0,0 @@ - - - -Check #185 - Positive - - - - - - - - - - - - - - - - - -
          CityState
          PhoenixArizona
          SeattleWashington
          - - - - - - - - - - - - - - - -
          CityState
          PhoenixArizona
          SeattleWashington
          - - - - - - - - - diff --git a/test/testfiles/oac/185-2.html b/test/testfiles/oac/185-2.html deleted file mode 100644 index 547d5cba1..000000000 --- a/test/testfiles/oac/185-2.html +++ /dev/null @@ -1,52 +0,0 @@ - - - -Check #1 - Negative - - - - - - - - - - - - - - - - - -
          CityState
          PhoenixArizona
          SeattleWashington
          - - - - - - - - - - - - - - - -
          CityState
          PhoenixArizona
          SeattleWashington
          - - - - - - - - - diff --git a/test/testfiles/oac/186-1.html b/test/testfiles/oac/186-1.html deleted file mode 100644 index 2f8824e82..000000000 --- a/test/testfiles/oac/186-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - -Check #186 - Positive - - - - - -
          - -
          - - - - - - - - - - diff --git a/test/testfiles/oac/186-2.html b/test/testfiles/oac/186-2.html deleted file mode 100644 index 4daf3d20c..000000000 --- a/test/testfiles/oac/186-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - -Check #186 - Negative - - - - - -
          - -
          - - - - - - - - - - diff --git a/test/testfiles/oac/187-1.html b/test/testfiles/oac/187-1.html deleted file mode 100644 index 1468a98e6..000000000 --- a/test/testfiles/oac/187-1.html +++ /dev/null @@ -1,29 +0,0 @@ - - - -Check #187 - Positive - - - - - -
          - - - -
          - - - - - - - - - - diff --git a/test/testfiles/oac/187-2.html b/test/testfiles/oac/187-2.html deleted file mode 100644 index ea84b262d..000000000 --- a/test/testfiles/oac/187-2.html +++ /dev/null @@ -1,29 +0,0 @@ - - - -Check #187 - Negative - - - - - -
          - - -
          - - - - - - - - - - - diff --git a/test/testfiles/oac/188-1.html b/test/testfiles/oac/188-1.html deleted file mode 100644 index c6c6ed6f4..000000000 --- a/test/testfiles/oac/188-1.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - -Check #188 - Positive - - - - - -
          -

          - - -

          -
          - - - - - - - - - - diff --git a/test/testfiles/oac/188-2.html b/test/testfiles/oac/188-2.html deleted file mode 100644 index baadd89ff..000000000 --- a/test/testfiles/oac/188-2.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - -Check #188 - Negative - - - - - -
          -

          - - -

          -
          - - - - - - - - - - diff --git a/test/testfiles/oac/188-3.html b/test/testfiles/oac/188-3.html deleted file mode 100644 index 56cef0c7a..000000000 --- a/test/testfiles/oac/188-3.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - -Check #188 - Positive - - - - - -
          -

          - - -

          -
          - - - - - - - - - - diff --git a/test/testfiles/oac/188-4.html b/test/testfiles/oac/188-4.html deleted file mode 100644 index 281496d6b..000000000 --- a/test/testfiles/oac/188-4.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - -Check #188 - Positive - - - - - -
          -

          - - -

          -
          - - - - - - - - - - diff --git a/test/testfiles/oac/188-5.html b/test/testfiles/oac/188-5.html deleted file mode 100644 index c770ea5a5..000000000 --- a/test/testfiles/oac/188-5.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - -Check #188 - Positive - - - - - -
          -

          - - -

          -
          - - - - - - - - - - diff --git a/test/testfiles/oac/190-1.html b/test/testfiles/oac/190-1.html deleted file mode 100644 index 75f7d7a9a..000000000 --- a/test/testfiles/oac/190-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Testfile - Check #190 - Positive - - - - -

          We have more information about dogs on our site.

          - - - - - - - - - diff --git a/test/testfiles/oac/190-2.html b/test/testfiles/oac/190-2.html deleted file mode 100644 index 59de0186c..000000000 --- a/test/testfiles/oac/190-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Testfile - Check #190 - Negative - - - - -

          We have information about dogs on our site.

          - - - - - - - - - diff --git a/test/testfiles/oac/191-1.html b/test/testfiles/oac/191-1.html deleted file mode 100644 index 6317cf892..000000000 --- a/test/testfiles/oac/191-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Testfile - Check #191 - Positive - - - - -

          We have more information about dogs on our site.

          - - - - - - - - - diff --git a/test/testfiles/oac/191-2.html b/test/testfiles/oac/191-2.html deleted file mode 100644 index 12bb6fcfd..000000000 --- a/test/testfiles/oac/191-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Testfile - Check #191 - Negative - - - - -

          We have information about dogs on our site.

          - - - - - - - - - diff --git a/test/testfiles/oac/192-1.html b/test/testfiles/oac/192-1.html deleted file mode 100644 index 06b3c62ee..000000000 --- a/test/testfiles/oac/192-1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - -Check #192 - Positive - - - - -
          - -
          - - - - - - - - - diff --git a/test/testfiles/oac/192-2.html b/test/testfiles/oac/192-2.html deleted file mode 100644 index 27d39f5d5..000000000 --- a/test/testfiles/oac/192-2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - -Check #192 - Negative - - - - -
          - -
          - - - - - - - - - diff --git a/test/testfiles/oac/193-1.html b/test/testfiles/oac/193-1.html deleted file mode 100644 index c0cf8ca8c..000000000 --- a/test/testfiles/oac/193-1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - -Check #193 - Positive - - - - -
          -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/193-2.html b/test/testfiles/oac/193-2.html deleted file mode 100644 index a3f8833a6..000000000 --- a/test/testfiles/oac/193-2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - -Check #193 - Negative - - - - -
          -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/194-1.html b/test/testfiles/oac/194-1.html deleted file mode 100644 index 33d8b4c58..000000000 --- a/test/testfiles/oac/194-1.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - -Check #194 - Positive - - - - -

          Image map of areas in the library

          -

          -Reference -Lab -

          - - - - - - - - - diff --git a/test/testfiles/oac/194-2.html b/test/testfiles/oac/194-2.html deleted file mode 100644 index bbf1ef7f9..000000000 --- a/test/testfiles/oac/194-2.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - -Check #194 - Negative - - - - -

          Image map of areas in the library

          -

          -Reference -Audio Visual Lab -

          - - - - - - - - - diff --git a/test/testfiles/oac/195-1.html b/test/testfiles/oac/195-1.html deleted file mode 100644 index 984390507..000000000 --- a/test/testfiles/oac/195-1.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #195 - Positive - - - - -

          link to home page

          - - - - - - - - - diff --git a/test/testfiles/oac/195-2.html b/test/testfiles/oac/195-2.html deleted file mode 100644 index 58c63c0d9..000000000 --- a/test/testfiles/oac/195-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #195 - Negative - - - - -

          home page

          - - - - - - - - - diff --git a/test/testfiles/oac/195-3.html b/test/testfiles/oac/195-3.html deleted file mode 100644 index d0cd442f1..000000000 --- a/test/testfiles/oac/195-3.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #195 - Positive - - - - -

          link to home page

          - - - - - - - - - diff --git a/test/testfiles/oac/195-4.html b/test/testfiles/oac/195-4.html deleted file mode 100644 index 667f522a1..000000000 --- a/test/testfiles/oac/195-4.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #195 - Negative - - - - -

          home page

          - - - - - - - - - diff --git a/test/testfiles/oac/196-1.html b/test/testfiles/oac/196-1.html deleted file mode 100644 index 678763954..000000000 --- a/test/testfiles/oac/196-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - -Check #196 - Positive - - - - -

          image map

          -

          To perform this test, you must look at the server-side image map file and determine if the active areas in the image map use available geometric shapes.

          - - - - - - - - - diff --git a/test/testfiles/oac/196-2.html b/test/testfiles/oac/196-2.html deleted file mode 100644 index 4fb84b48b..000000000 --- a/test/testfiles/oac/196-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - -Check #196 - Negative - - - - -

          image map

          -

          To perform this test, you must look at the server-side image map file and determine if the active areas in the image map use available geometric shapes.

          - - - - - - - - - diff --git a/test/testfiles/oac/197-1.html b/test/testfiles/oac/197-1.html deleted file mode 100644 index 31adeea3a..000000000 --- a/test/testfiles/oac/197-1.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #197 - Positive - - - - -

          For more information about dogs, click here.

          - - - - - - - - - diff --git a/test/testfiles/oac/197-2.html b/test/testfiles/oac/197-2.html deleted file mode 100644 index caedb8fb3..000000000 --- a/test/testfiles/oac/197-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #197 - Negative - - - - -

          Here is a link to information about dogs.

          - - - - - - - - - diff --git a/test/testfiles/oac/197-3.html b/test/testfiles/oac/197-3.html deleted file mode 100644 index 8dc9f89d0..000000000 --- a/test/testfiles/oac/197-3.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #197 - Negative - - - - -

          This is the introduction to a news story about recent spending by our government.government spending

          - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/197-4.html b/test/testfiles/oac/197-4.html deleted file mode 100644 index 72c8ce04e..000000000 --- a/test/testfiles/oac/197-4.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - -Check #197 - Negative - - - - -

          This is the introduction to a news story about recent spending by our government. -read more

          - - - - - - - - - diff --git a/test/testfiles/oac/197-5.html b/test/testfiles/oac/197-5.html deleted file mode 100644 index 8c4a7e005..000000000 --- a/test/testfiles/oac/197-5.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #197 - Negative - - - - -

          This is the introduction to a news story about recent spending by our government.image

          - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/198-1.html b/test/testfiles/oac/198-1.html deleted file mode 100644 index e37f563af..000000000 --- a/test/testfiles/oac/198-1.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - -Check #198 - Positive - - - - - -
          -
          -dogs -

          - -
          - -
          - - -

          -
          -

          -
          - - - - - - - - - - diff --git a/test/testfiles/oac/198-2.html b/test/testfiles/oac/198-2.html deleted file mode 100644 index de5b04637..000000000 --- a/test/testfiles/oac/198-2.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - -Check #198 - Negative - - - - - -
          -
          -Donut Type -

          - -
          - -
          - - -

          -
          -

          -
          - - - - - - - - - - diff --git a/test/testfiles/oac/199-1.html b/test/testfiles/oac/199-1.html deleted file mode 100644 index ad42529f0..000000000 --- a/test/testfiles/oac/199-1.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - -Check #199 - Positive - - - - - -
          -
          - -

          - -
          - -
          - - -

          -
          -

          -
          - - - - - - - - - - diff --git a/test/testfiles/oac/199-2.html b/test/testfiles/oac/199-2.html deleted file mode 100644 index 101929f6b..000000000 --- a/test/testfiles/oac/199-2.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - -Check #199 - Negative - - - - - -
          -
          -Donut Type -

          - -
          - -
          - - -

          -
          -

          -
          - - - - - - - - - - diff --git a/test/testfiles/oac/2-1.html b/test/testfiles/oac/2-1.html deleted file mode 100644 index 7da1fec92..000000000 --- a/test/testfiles/oac/2-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - -Check #2 - Positive - - - - -rex.jpg - - - - - - - - - - diff --git a/test/testfiles/oac/2-2.html b/test/testfiles/oac/2-2.html deleted file mode 100644 index fbdf11610..000000000 --- a/test/testfiles/oac/2-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - -Check #2 - Negative - - - - - -photo of rex the cat - - - - - - - - - diff --git a/test/testfiles/oac/20-1.html b/test/testfiles/oac/20-1.html deleted file mode 100644 index d816bbdd4..000000000 --- a/test/testfiles/oac/20-1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #20 - Positive - - - - -

          -View the movie. -

          - - - - - - - - diff --git a/test/testfiles/oac/20-2.html b/test/testfiles/oac/20-2.html deleted file mode 100644 index eee812a52..000000000 --- a/test/testfiles/oac/20-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #20 - Negative - - - - -

          -

          - - - - - - - - diff --git a/test/testfiles/oac/20-3.html b/test/testfiles/oac/20-3.html deleted file mode 100644 index 2c6659215..000000000 --- a/test/testfiles/oac/20-3.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #20 - Positive - - - - -

          -View the movie. -

          - - - - - - - - diff --git a/test/testfiles/oac/20-4.html b/test/testfiles/oac/20-4.html deleted file mode 100644 index 684689bc2..000000000 --- a/test/testfiles/oac/20-4.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #20 - Positive - - - - -

          -View the movie. -

          - - - - - - - - diff --git a/test/testfiles/oac/20-5.html b/test/testfiles/oac/20-5.html deleted file mode 100644 index 77d1964bd..000000000 --- a/test/testfiles/oac/20-5.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #20 - Positive - - - - -

          -View the movie. -

          - - - - - - - - diff --git a/test/testfiles/oac/20-6.html b/test/testfiles/oac/20-6.html deleted file mode 100644 index 1bfc03da3..000000000 --- a/test/testfiles/oac/20-6.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #20 - Positive - - - - -

          -View the movie. -

          - - - - - - - - diff --git a/test/testfiles/oac/200-1.html b/test/testfiles/oac/200-1.html deleted file mode 100644 index 9d41e1b08..000000000 --- a/test/testfiles/oac/200-1.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - -Check #200 - Positive - - - - - -
          -
          -legend -

          - -
          - -
          - - -

          -
          -

          -
          - - - - - - - - - - diff --git a/test/testfiles/oac/200-2.html b/test/testfiles/oac/200-2.html deleted file mode 100644 index a49e1e2d1..000000000 --- a/test/testfiles/oac/200-2.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - -Check #200 - Negative - - - - - -
          -
          -Donut Type -

          - -
          - -
          - - -

          -
          -

          -
          - - - - - - - - - - diff --git a/test/testfiles/oac/203-1.html b/test/testfiles/oac/203-1.html deleted file mode 100644 index a182b2e3f..000000000 --- a/test/testfiles/oac/203-1.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - -Check #203.1 - Positive - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          State & FirstState & SixthState & FifteenthFifteenth & Morrison
          4:004:054:114:19
          5:005:055:115:19
          6:006:056:116:19
          - - - - - - - - - - diff --git a/test/testfiles/oac/203-2.html b/test/testfiles/oac/203-2.html deleted file mode 100644 index ae8efd1ab..000000000 --- a/test/testfiles/oac/203-2.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - -Check #203.2 - Negative - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          State & FirstState & SixthState & FifteenthFifteenth & Morrison
          4:004:054:114:19
          5:005:055:115:19
          6:006:056:116:19
          - - - - - - - - - - diff --git a/test/testfiles/oac/204-1.html b/test/testfiles/oac/204-1.html deleted file mode 100644 index 2a420e24d..000000000 --- a/test/testfiles/oac/204-1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #204 - Positive - - - - -
          -

          - - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/204-2.html b/test/testfiles/oac/204-2.html deleted file mode 100644 index d6ffa8ca9..000000000 --- a/test/testfiles/oac/204-2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #204 - Negative - - - - -
          -

          - - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/204-3.html b/test/testfiles/oac/204-3.html deleted file mode 100644 index 566a40c4d..000000000 --- a/test/testfiles/oac/204-3.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #204 - Positive - - - - -
          -

          - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/204-4.html b/test/testfiles/oac/204-4.html deleted file mode 100644 index d0a4ba6ca..000000000 --- a/test/testfiles/oac/204-4.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #204 - Negative - - - - -
          -

          - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/204-5.html b/test/testfiles/oac/204-5.html deleted file mode 100644 index dbcd0e04a..000000000 --- a/test/testfiles/oac/204-5.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #204 - Positive - - - - -
          -

          - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/204-6.html b/test/testfiles/oac/204-6.html deleted file mode 100644 index 3bf909531..000000000 --- a/test/testfiles/oac/204-6.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #204 - Negative - - - - -
          -

          - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/205-1.html b/test/testfiles/oac/205-1.html deleted file mode 100644 index d7edae88e..000000000 --- a/test/testfiles/oac/205-1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Testfile 205.1 - Negative - - - - -
          -

          - - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/205-2.html b/test/testfiles/oac/205-2.html deleted file mode 100644 index 1946a9cb7..000000000 --- a/test/testfiles/oac/205-2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Testfile 205.2 - Negative - - - - -
          -

          - - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/205-3.html b/test/testfiles/oac/205-3.html deleted file mode 100644 index 8a0222e7c..000000000 --- a/test/testfiles/oac/205-3.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Testfile 205.3 - Positive - - - - -
          -

          - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/205-4.html b/test/testfiles/oac/205-4.html deleted file mode 100644 index 4e6b779e5..000000000 --- a/test/testfiles/oac/205-4.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Testfile 205.4 - Positive - - - - -
          -

          - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/205-5.html b/test/testfiles/oac/205-5.html deleted file mode 100644 index 3db5574c1..000000000 --- a/test/testfiles/oac/205-5.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Testfile 205.5 - Negative - - - - -
          -

          - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/205-6.html b/test/testfiles/oac/205-6.html deleted file mode 100644 index 31b1b7059..000000000 --- a/test/testfiles/oac/205-6.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Testfile 205.6 - Positive - - - - -
          -

          - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/206-1.html b/test/testfiles/oac/206-1.html deleted file mode 100644 index f1bdc7b9f..000000000 --- a/test/testfiles/oac/206-1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #206 - Positive - - - - -
          -

          - - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/206-2.html b/test/testfiles/oac/206-2.html deleted file mode 100644 index 09f035397..000000000 --- a/test/testfiles/oac/206-2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #206 - Negative - - - - -
          -

          - - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/206-3.html b/test/testfiles/oac/206-3.html deleted file mode 100644 index 1951f918a..000000000 --- a/test/testfiles/oac/206-3.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #206 - Positive - - - - -
          -

          - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/206-4.html b/test/testfiles/oac/206-4.html deleted file mode 100644 index 396c427f9..000000000 --- a/test/testfiles/oac/206-4.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #206 - Negative - - - - -
          -

          - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/206-5.html b/test/testfiles/oac/206-5.html deleted file mode 100644 index 4825e1a6d..000000000 --- a/test/testfiles/oac/206-5.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #206 - Positive - - - - -
          -

          - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/206-6.html b/test/testfiles/oac/206-6.html deleted file mode 100644 index 2e08db892..000000000 --- a/test/testfiles/oac/206-6.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #214 - Negative - - - - -
          -

          - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/207-1.html b/test/testfiles/oac/207-1.html deleted file mode 100644 index 663610715..000000000 --- a/test/testfiles/oac/207-1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #207 - Positive - - - - -
          -

          - - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/207-2.html b/test/testfiles/oac/207-2.html deleted file mode 100644 index a1f9bf394..000000000 --- a/test/testfiles/oac/207-2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #207 - Negative - - - - -
          -

          - - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/207-3.html b/test/testfiles/oac/207-3.html deleted file mode 100644 index e116dfec6..000000000 --- a/test/testfiles/oac/207-3.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #207 - Positive - - - - -
          -

          - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/207-4.html b/test/testfiles/oac/207-4.html deleted file mode 100644 index 95efdc1a3..000000000 --- a/test/testfiles/oac/207-4.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #207 - Negative - - - - -
          -

          - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/207-5.html b/test/testfiles/oac/207-5.html deleted file mode 100644 index b7eb66d39..000000000 --- a/test/testfiles/oac/207-5.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #207 - Positive - - - - -
          -

          - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/207-6.html b/test/testfiles/oac/207-6.html deleted file mode 100644 index 4aea781b7..000000000 --- a/test/testfiles/oac/207-6.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #207 - Negative - - - - -
          -

          - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/208-1.html b/test/testfiles/oac/208-1.html deleted file mode 100644 index 33f242522..000000000 --- a/test/testfiles/oac/208-1.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - -Testfile 208.1 - Positive - - - - -
          -

          - - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/208-2.html b/test/testfiles/oac/208-2.html deleted file mode 100644 index 2c9d39ef4..000000000 --- a/test/testfiles/oac/208-2.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - -Testfile 208.2 - Negative - - - - -
          -

          - - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/208-3.html b/test/testfiles/oac/208-3.html deleted file mode 100644 index 7eb51a135..000000000 --- a/test/testfiles/oac/208-3.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - -Testfile 208.3 - Positive - - - - -
          -

          - - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/208-4.html b/test/testfiles/oac/208-4.html deleted file mode 100644 index 87e0130a4..000000000 --- a/test/testfiles/oac/208-4.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Testfile 208.4 - Positive - - - - -
          -

          - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/208-5.html b/test/testfiles/oac/208-5.html deleted file mode 100644 index 2a9b78a49..000000000 --- a/test/testfiles/oac/208-5.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Testfile 208.5 - Negative - - - - -
          -

          - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/208-6.html b/test/testfiles/oac/208-6.html deleted file mode 100644 index 47f4a738e..000000000 --- a/test/testfiles/oac/208-6.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Testfile 208.6 - Positive - - - - -
          -

          - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/208-7.html b/test/testfiles/oac/208-7.html deleted file mode 100644 index 05716e21f..000000000 --- a/test/testfiles/oac/208-7.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - -Testfile 208.9 - Positive - - - - -
          -

          - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/208-8.html b/test/testfiles/oac/208-8.html deleted file mode 100644 index c24293849..000000000 --- a/test/testfiles/oac/208-8.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - -Testfile 208.9 - Negative - - - - -
          -

          - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/208-9.html b/test/testfiles/oac/208-9.html deleted file mode 100644 index faa22a8a6..000000000 --- a/test/testfiles/oac/208-9.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - -Testfile 208.9 - Positive - - - - -
          -

          - -

          -
          - - - - - - - - - diff --git a/test/testfiles/oac/21-1.html b/test/testfiles/oac/21-1.html deleted file mode 100644 index b935b8a40..000000000 --- a/test/testfiles/oac/21-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #21.1 - Positive - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/21-2.html b/test/testfiles/oac/21-2.html deleted file mode 100644 index 0f23a32ae..000000000 --- a/test/testfiles/oac/21-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #21.2 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/22-1.html b/test/testfiles/oac/22-1.html deleted file mode 100644 index c3e52397f..000000000 --- a/test/testfiles/oac/22-1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #22.1 - Positive - - - - -

          There is not a realy applet here yet. I'm looking for one that flickers.

          - - - - - - - - - - diff --git a/test/testfiles/oac/22-2.html b/test/testfiles/oac/22-2.html deleted file mode 100644 index ea2e18920..000000000 --- a/test/testfiles/oac/22-2.html +++ /dev/null @@ -1 +0,0 @@ - Check #22.2 - Negative

            test markup, will be hidden

            There is not a realy applet here yet. I'm looking for one that does not flicker.

            \ No newline at end of file diff --git a/test/testfiles/oac/221-1.html b/test/testfiles/oac/221-1.html deleted file mode 100644 index 6a9a92095..000000000 --- a/test/testfiles/oac/221-1.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - -Check #221.1 - Positive - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/221-2.html b/test/testfiles/oac/221-2.html deleted file mode 100644 index b5cd351f2..000000000 --- a/test/testfiles/oac/221-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - -Check #221.2 - Negative - - - -
            -

            This is some example text.

            -
            - - - - - - - - diff --git a/test/testfiles/oac/221-3.html b/test/testfiles/oac/221-3.html deleted file mode 100644 index 1a86ec70a..000000000 --- a/test/testfiles/oac/221-3.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - -Check #221.3 - Negative - - - -
            -

            This is some example text.

            -
            - - - - - - - - diff --git a/test/testfiles/oac/222-1.html b/test/testfiles/oac/222-1.html deleted file mode 100644 index f84795025..000000000 --- a/test/testfiles/oac/222-1.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #222.1 - Positive - - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/222-2.html b/test/testfiles/oac/222-2.html deleted file mode 100644 index f8477fe63..000000000 --- a/test/testfiles/oac/222-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #222.2 - Negative - - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/222-3.html b/test/testfiles/oac/222-3.html deleted file mode 100644 index 73f436b2d..000000000 --- a/test/testfiles/oac/222-3.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #222.3 - Negative - - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/223-1.html b/test/testfiles/oac/223-1.html deleted file mode 100644 index 4c6b7ffbb..000000000 --- a/test/testfiles/oac/223-1.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - -Check #223.1 - Positive - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/223-2.html b/test/testfiles/oac/223-2.html deleted file mode 100644 index afd0ffe3e..000000000 --- a/test/testfiles/oac/223-2.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - -Check #223.2 - Negative - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/223-3.html b/test/testfiles/oac/223-3.html deleted file mode 100644 index 43f18ba62..000000000 --- a/test/testfiles/oac/223-3.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #223.3 - Negative - - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/224-1.html b/test/testfiles/oac/224-1.html deleted file mode 100644 index 483c3d941..000000000 --- a/test/testfiles/oac/224-1.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - -Check #224.1 - Positive - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/224-2.html b/test/testfiles/oac/224-2.html deleted file mode 100644 index f13792a58..000000000 --- a/test/testfiles/oac/224-2.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - -Check #224.2 - Negative - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/224-3.html b/test/testfiles/oac/224-3.html deleted file mode 100644 index 097823ccd..000000000 --- a/test/testfiles/oac/224-3.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #224.3 - Negative - - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/225-1.html b/test/testfiles/oac/225-1.html deleted file mode 100644 index e0447de39..000000000 --- a/test/testfiles/oac/225-1.html +++ /dev/null @@ -1,22 +0,0 @@ - - -Testfile - Check #225-1 - Positive - - - - -

            A black and brown cat named Rex.

            - - - - - - - - - diff --git a/test/testfiles/oac/225-2.html b/test/testfiles/oac/225-2.html deleted file mode 100644 index e45079b36..000000000 --- a/test/testfiles/oac/225-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Testfile - Check #225-2 - Negative - - - - -

            A black and brown cat named Rex.

            - - - - - - - - - diff --git a/test/testfiles/oac/225-3.html b/test/testfiles/oac/225-3.html deleted file mode 100644 index 2265ad2eb..000000000 --- a/test/testfiles/oac/225-3.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Testfile - Check #225-3 - Negative - - - - -

            A black and brown cat named Rex.

            - - - - - - - - - diff --git a/test/testfiles/oac/225-4.html b/test/testfiles/oac/225-4.html deleted file mode 100644 index 625cd6e24..000000000 --- a/test/testfiles/oac/225-4.html +++ /dev/null @@ -1,23 +0,0 @@ - - - -Testfile - Check #225-4 - Positive - - - - -

            A black and brown cat named Rex.

            - - - - - - - - - diff --git a/test/testfiles/oac/225-5.html b/test/testfiles/oac/225-5.html deleted file mode 100644 index 0dc9e9518..000000000 --- a/test/testfiles/oac/225-5.html +++ /dev/null @@ -1,23 +0,0 @@ - - - -Testfile - Check #225-5 - Positive - - - - -

            A black and brown cat named Rex.

            - - - - - - - - - diff --git a/test/testfiles/oac/226-1.html b/test/testfiles/oac/226-1.html deleted file mode 100644 index 1afaae6d5..000000000 --- a/test/testfiles/oac/226-1.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - -Check #226-1 - Positive - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/226-2.html b/test/testfiles/oac/226-2.html deleted file mode 100644 index 6e284062e..000000000 --- a/test/testfiles/oac/226-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #226-2 - Negative - - - -
            -

            This is some example text.

            -
            - - - - - - - - diff --git a/test/testfiles/oac/226-3.html b/test/testfiles/oac/226-3.html deleted file mode 100644 index 16ea5b735..000000000 --- a/test/testfiles/oac/226-3.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #226-3 - Negative - - - -
            -

            This is some example text.

            -
            - - - - - - - - diff --git a/test/testfiles/oac/227-1.html b/test/testfiles/oac/227-1.html deleted file mode 100644 index c06cfd19d..000000000 --- a/test/testfiles/oac/227-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #227-1 - Positive - - - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/227-2.html b/test/testfiles/oac/227-2.html deleted file mode 100644 index e34c67ab8..000000000 --- a/test/testfiles/oac/227-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #227-2 - Negative - - - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/227-3.html b/test/testfiles/oac/227-3.html deleted file mode 100644 index 0229c6712..000000000 --- a/test/testfiles/oac/227-3.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #227-3 - Negative - - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/227-4.html b/test/testfiles/oac/227-4.html deleted file mode 100644 index e0508cccf..000000000 --- a/test/testfiles/oac/227-4.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - -Check #227-3 - Negative - - - - - -

            This is some example text. this is a faint link

            - - - - - - - - diff --git a/test/testfiles/oac/228-1.html b/test/testfiles/oac/228-1.html deleted file mode 100644 index ab6d074f3..000000000 --- a/test/testfiles/oac/228-1.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - -Check #228-1 - Positive - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/228-2.html b/test/testfiles/oac/228-2.html deleted file mode 100644 index b4dc2ed20..000000000 --- a/test/testfiles/oac/228-2.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - -Check #228-2 - Negative - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/228-3.html b/test/testfiles/oac/228-3.html deleted file mode 100644 index 8d371e751..000000000 --- a/test/testfiles/oac/228-3.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #228-3 - Negative - - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/229-1.html b/test/testfiles/oac/229-1.html deleted file mode 100644 index 963dfe7f5..000000000 --- a/test/testfiles/oac/229-1.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - -Check #229-1 - Positive - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/229-2.html b/test/testfiles/oac/229-2.html deleted file mode 100644 index da5704507..000000000 --- a/test/testfiles/oac/229-2.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - -Check #229-2 - Negative - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/229-3.html b/test/testfiles/oac/229-3.html deleted file mode 100644 index 6a70d9e7f..000000000 --- a/test/testfiles/oac/229-3.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #229-3 - Negative - - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/23-1.html b/test/testfiles/oac/23-1.html deleted file mode 100644 index ab1cd1304..000000000 --- a/test/testfiles/oac/23-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #23 - Positive - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/23-2.html b/test/testfiles/oac/23-2.html deleted file mode 100644 index 08b72a9dd..000000000 --- a/test/testfiles/oac/23-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #23 - Negative - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/23-3.html b/test/testfiles/oac/23-3.html deleted file mode 100644 index 686f8f2bf..000000000 --- a/test/testfiles/oac/23-3.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #23 - Positive - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/230-1.html b/test/testfiles/oac/230-1.html deleted file mode 100644 index ff6e07b8e..000000000 --- a/test/testfiles/oac/230-1.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Testfile 230-1 Positive - - - - - - - - - - - - -
            namenumber of cupstypewith sugar
            Adams, Willie2regularsugar
            Bacon, Lise4regularno sugar
            Chaput, Maria1decafsugar
            Di Nino, Consiglio0not applicablenot applicable
            Eggleton, Art6regularno sugar
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/230-2.html b/test/testfiles/oac/230-2.html deleted file mode 100644 index 13b195833..000000000 --- a/test/testfiles/oac/230-2.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - -Testfile 230-1 Positive - - - - - - - - - - - - - - - - -
            namenumber of cupstypewith sugar
            Adams, Willie2regularsugar
            Bacon, Lise4regularno sugar
            Chaput, Maria1decafsugar
            Di Nino, Consiglio0not applicablenot applicable
            Eggleton, Art6regularno sugar
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/231-1.html b/test/testfiles/oac/231-1.html deleted file mode 100644 index 39b3380c4..000000000 --- a/test/testfiles/oac/231-1.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -Testfile 231-1 Positive - - - - - -

            From the WCAG 2.0 HTML techniques: "Describe the use and benefits of column structure elements. Much of this may be theoretical."

            - - - - - - - - - - - - -
            namenumber of cupstypewith sugar
            Adams, Willie2regularsugar
            Bacon, Lise4regularno sugar
            Chaput, Maria1decafsugar
            Di Nino, Consiglio0not applicablenot applicable
            Eggleton, Art6regularno sugar
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/231-2.html b/test/testfiles/oac/231-2.html deleted file mode 100644 index c63b8bfa0..000000000 --- a/test/testfiles/oac/231-2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Testfile 231-1 Positive - - - - - -

            From the WCAG 2.0 HTML techniques: "Describe the use and benefits of column structure elements. Much of this may be theoretical."

            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/232-1.html b/test/testfiles/oac/232-1.html deleted file mode 100644 index 6f64d43b6..000000000 --- a/test/testfiles/oac/232-1.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Testfile - Check #232-1 - Positive - - - - -

            This link to a valid file opens in a new window.

            - - - - - - - - - diff --git a/test/testfiles/oac/232-2.html b/test/testfiles/oac/232-2.html deleted file mode 100644 index 9c800a7af..000000000 --- a/test/testfiles/oac/232-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Testfile - Check #232-2 - Negative - - - - -

            This link to an invalid file opens in the same window.

            - - - - - - - - - diff --git a/test/testfiles/oac/235-1.html b/test/testfiles/oac/235-1.html deleted file mode 100644 index d2a194528..000000000 --- a/test/testfiles/oac/235-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Testfile - Check #235.1 - Positive - - - - -

            Normal body text goes here

            -
            - -
            - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/235-2.html b/test/testfiles/oac/235-2.html deleted file mode 100644 index 64c685a7b..000000000 --- a/test/testfiles/oac/235-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Testfile - Check #235.2 - Negative - - - - -

            Normal body text goes here

            -
            - -
            - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/236-1.html b/test/testfiles/oac/236-1.html deleted file mode 100644 index 612bd9f8a..000000000 --- a/test/testfiles/oac/236-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Testfile - Check #236.1 - Positive - - - - -

            -Products page -Products page -

            - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/236-2.html b/test/testfiles/oac/236-2.html deleted file mode 100644 index 3cd6822e9..000000000 --- a/test/testfiles/oac/236-2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Testfile - Check #236.2 - Negative - - - - -

            -Products page -

            - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/236-3.html b/test/testfiles/oac/236-3.html deleted file mode 100644 index 8950892b9..000000000 --- a/test/testfiles/oac/236-3.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Testfile - Check #236.3 - Positive - - - - -

            - -Products page -

            - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/238-1.html b/test/testfiles/oac/238-1.html deleted file mode 100644 index 8e419c386..000000000 --- a/test/testfiles/oac/238-1.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #238.1 - Positive - - - - - -
            -

            -
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/238-2.html b/test/testfiles/oac/238-2.html deleted file mode 100644 index 760ac0856..000000000 --- a/test/testfiles/oac/238-2.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #238.2 - Negative - - - - - -
            -

            -
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/238-3.html b/test/testfiles/oac/238-3.html deleted file mode 100644 index 28d3e06f5..000000000 --- a/test/testfiles/oac/238-3.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - -Check #238.3 - Negative - - - - - -
            -

            -
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/24-1.html b/test/testfiles/oac/24-1.html deleted file mode 100644 index bf3fefe33..000000000 --- a/test/testfiles/oac/24-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #24 - Positive - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/24-2.html b/test/testfiles/oac/24-2.html deleted file mode 100644 index b430c9c88..000000000 --- a/test/testfiles/oac/24-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #24 - Negative - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/241-1.html b/test/testfiles/oac/241-1.html deleted file mode 100644 index e54ccb408..000000000 --- a/test/testfiles/oac/241-1.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - -Check #241.1 - Positive - - - - - -

            -

            -name           number of cups   type   with sugar
            -Adams, Willie      2		regular		sugar
            -Bacon, Lise        4		regular		no sugar
            -Chaput, Maria      1		decaf		sugar
            -Di Nino, Consiglio 0		n/a		n/a
            -Eggleton, Art      6		regular		no sugar 
            -
            -

            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/241-2.html b/test/testfiles/oac/241-2.html deleted file mode 100644 index 5787671a1..000000000 --- a/test/testfiles/oac/241-2.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Check #241.2 - Negative - - - - - - - - - - - - -
            namenumber of cupstypewith sugar
            Adams, Willie2regularsugar
            Bacon, Lise4regularno sugar
            Chaput, Maria1decafsugar
            Di Nino, Consiglio0not applicablenot applicable
            Eggleton, Art6regularno sugar
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/242-1.html b/test/testfiles/oac/242-1.html deleted file mode 100644 index 9b5f55949..000000000 --- a/test/testfiles/oac/242-1.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Check #242.2 - Positive - - - - - - - - - - - - -
            Caption Goes Here
            namenumber of cupstypewith sugar
            Adams, Willie2regularsugar
            Bacon, Lise4regularno sugar
            Chaput, Maria1decafsugar
            Di Nino, Consiglio0not applicablenot applicable
            Eggleton, Art6regularno sugar
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/242-2.html b/test/testfiles/oac/242-2.html deleted file mode 100644 index 37030f826..000000000 --- a/test/testfiles/oac/242-2.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Check #242.2 - Negative - - - - - - - - - - - - -
            Cups of coffee consumed by each senator
            namenumber of cupstypewith sugar
            Adams, Willie2regularsugar
            Bacon, Lise4regularno sugar
            Chaput, Maria1decafsugar
            Di Nino, Consiglio0not applicablenot applicable
            Eggleton, Art6regularno sugar
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/243-1.html b/test/testfiles/oac/243-1.html deleted file mode 100644 index c1dee43d7..000000000 --- a/test/testfiles/oac/243-1.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Check #243.2 - Positive - - - - - - - - - - - - -
            Cups of coffee consumed by each senator
            namenumber of cupstypewith sugar
            Adams, Willie2regularsugar
            Bacon, Lise4regularno sugar
            Chaput, Maria1decafsugar
            Di Nino, Consiglio0not applicablenot applicable
            Eggleton, Art6regularno sugar
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/243-2.html b/test/testfiles/oac/243-2.html deleted file mode 100644 index 8da4b7985..000000000 --- a/test/testfiles/oac/243-2.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Check #243.2 - Negative - - - - - - - - - - - - -
            Cups of coffee consumed by each senator
            namenumber of cupstypewith sugar
            Adams, Willie2regularsugar
            Bacon, Lise4regularno sugar
            Chaput, Maria1decafsugar
            Di Nino, Consiglio0not applicablenot applicable
            Eggleton, Art6regularno sugar
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/244-1.html b/test/testfiles/oac/244-1.html deleted file mode 100644 index 705560642..000000000 --- a/test/testfiles/oac/244-1.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - -Check #244.1 - Positive - - - - - - - - - - - - - -
            NameBirthGender
            Clayton2005-10-10male
            Carol2005-10-11female
            Susan2005-10-12female
            Oleg2005-10-13male
            Belnar2005-10-14male
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/244-2.html b/test/testfiles/oac/244-2.html deleted file mode 100644 index 884eb25f3..000000000 --- a/test/testfiles/oac/244-2.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Check #244.2 - Negative - - - - - - - - - - - - -
            NameBirthGender
            Clayton2005-10-10male
            Carol2005-10-11female
            Susan2005-10-12female
            Oleg2005-10-13male
            Belnar2005-10-14male
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/245-1.html b/test/testfiles/oac/245-1.html deleted file mode 100644 index 1197988bc..000000000 --- a/test/testfiles/oac/245-1.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - -Check #245.1 - Positive - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
            ClassTeacherMalesFemales
            First YearD. Bolter54
            A. Cheetham79
            Second YearM. Lam39
            S. Crossy43
            A. Forsyth69
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/245-2.html b/test/testfiles/oac/245-2.html deleted file mode 100644 index 49fcd1836..000000000 --- a/test/testfiles/oac/245-2.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - -Check #245.2 - Negative - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
            ClassTeacherMalesFemales
            First YearD. Bolter54
            A. Cheetham79
            Second YearM. Lam39
            S. Crossy43
            A. Forsyth69
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/246-1.html b/test/testfiles/oac/246-1.html deleted file mode 100644 index 9405b4c6f..000000000 --- a/test/testfiles/oac/246-1.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - -Check #246.1 - Positive - - - -
            - -
            - -

            - -
            - -
            - -
            - -

            - -
            -
            - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/246-2.html b/test/testfiles/oac/246-2.html deleted file mode 100644 index eae759cfb..000000000 --- a/test/testfiles/oac/246-2.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - -Check #246.2 - Negative - - - -
            -
            - -

            - -
            - -
            - -
            - -

            - -
            -
            - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/246-3.html b/test/testfiles/oac/246-3.html deleted file mode 100644 index c5619a6dd..000000000 --- a/test/testfiles/oac/246-3.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - -Check #246.1 - Negative - - - -
            - -
            - -

            - -
            - -
            - -
            - -

            - -
            -
            - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/246-4.html b/test/testfiles/oac/246-4.html deleted file mode 100644 index 523365db7..000000000 --- a/test/testfiles/oac/246-4.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - -Check #246.1 - Positive - - - - -
            - -
            - -

            - -
            - -
            - -
            - -

            - -
            -
            - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/246-5.html b/test/testfiles/oac/246-5.html deleted file mode 100644 index cfc285f90..000000000 --- a/test/testfiles/oac/246-5.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - -Check #246.1 - Positive - - - - - - -
            - -

            - -
            - -
            - -
            - -

            - -
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/247-1.html b/test/testfiles/oac/247-1.html deleted file mode 100644 index 7bfd4e80d..000000000 --- a/test/testfiles/oac/247-1.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - -Check #247.1 - Positive - - - - - -
            -

            - -
            - -
            - - -
            -

            -
            - - - - - - - - - - diff --git a/test/testfiles/oac/247-2.html b/test/testfiles/oac/247-2.html deleted file mode 100644 index 020425820..000000000 --- a/test/testfiles/oac/247-2.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - -Check #247.2 - Negative - - - - - -
            -
            -Donuts Requested (check all that apply) -

            - -
            - -
            - - -

            -
            -

            -
            - - - - - - - - - - diff --git a/test/testfiles/oac/248-1.html b/test/testfiles/oac/248-1.html deleted file mode 100644 index 308d253c0..000000000 --- a/test/testfiles/oac/248-1.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - -Check #248.1 - Positive - - - - - -

            -* chocolate
            -* vanilla
            -* cherry
            -* bananna
            -

            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/248-2.html b/test/testfiles/oac/248-2.html deleted file mode 100644 index beee91524..000000000 --- a/test/testfiles/oac/248-2.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - -Check #248.2 - Negative - - - - - -
              -
            • chocolate
            • -
            • vanilla
            • -
            • cherry
            • -
            • bananna
            • -
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/248-3.html b/test/testfiles/oac/248-3.html deleted file mode 100644 index d2f2b6c86..000000000 --- a/test/testfiles/oac/248-3.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #248.3 - Negative - - - - - -

            Our ice-cream flavours include chocolate, vanilla, cherry, and bananna.

            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/249-1.html b/test/testfiles/oac/249-1.html deleted file mode 100644 index 9f17bf57c..000000000 --- a/test/testfiles/oac/249-1.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - -Check #249.1 - Positive - - - - - -

            The following is an excerpt from the The Story of my Life by Helen Keller

            - -

            "Even in the days before my teacher came, I used to feel along the square stiff boxwood - hedges, and, guided by the sense of smell, would find the first violets and lilies. - There, too, after a fit of temper, I went to find comfort and to hide my hot face - in the cool leaves and grass."

            - - -

            Helen Keller said, Self-pity is our worst enemy and if we yield to it, -we can never do anything good in the world.

            - -

            Beth received 1st place in the 9th grade science competition.

            -

            The chemical notation for water is H2O.

            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/249-2.html b/test/testfiles/oac/249-2.html deleted file mode 100644 index 2d6f7e27d..000000000 --- a/test/testfiles/oac/249-2.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - -Check #249.2 - Negative - - - - - -

            The following is an excerpt from the The Story of my Life by Helen Keller

            -
            -

            Even in the days before my teacher came, I used to feel along the square stiff boxwood - hedges, and, guided by the sense of smell, would find the first violets and lilies. - There, too, after a fit of temper, I went to find comfort and to hide my hot face - in the cool leaves and grass.

            -
            - -

            Helen Keller said, Self-pity is our worst enemy and if we yield to it, -we can never do anything good in the world.

            - -

            Beth received 1st place in the 9th grade science competition.

            -

            The chemical notation for water is H2O.

            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/25-1.html b/test/testfiles/oac/25-1.html deleted file mode 100644 index 1f33a6116..000000000 --- a/test/testfiles/oac/25-1.html +++ /dev/null @@ -1,23 +0,0 @@ - - -Check #25.1 - Positive - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/25-2.html b/test/testfiles/oac/25-2.html deleted file mode 100644 index 407f59f1e..000000000 --- a/test/testfiles/oac/25-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - -Check #25.2 - Negative - - - - - - As temperature increases, the molecules in the balloon... - - - - - - - - - - diff --git a/test/testfiles/oac/252-1.html b/test/testfiles/oac/252-1.html deleted file mode 100644 index 859d0fd14..000000000 --- a/test/testfiles/oac/252-1.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - -Check #252.1 - Positive - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/252-2.html b/test/testfiles/oac/252-2.html deleted file mode 100644 index 9558ce1b8..000000000 --- a/test/testfiles/oac/252-2.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - -Check #252.2 - Negative - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/252-3.html b/test/testfiles/oac/252-3.html deleted file mode 100644 index f383e4251..000000000 --- a/test/testfiles/oac/252-3.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #252.3 - Negative - - - - -

            This is some example text.

            - - - - - - - - diff --git a/test/testfiles/oac/258-1.html b/test/testfiles/oac/258-1.html deleted file mode 100644 index ededeb639..000000000 --- a/test/testfiles/oac/258-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - -Check #258.1 - Positive - - - - -

            The following applet is not working. This is just an example.

            - - - - - - - - - - - diff --git a/test/testfiles/oac/258-2.html b/test/testfiles/oac/258-2.html deleted file mode 100644 index 049de66c6..000000000 --- a/test/testfiles/oac/258-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - -Check #258.2 - Positive - - - - -

            The following applet is not working. This is just an example.

            - - - - - - - - - - - diff --git a/test/testfiles/oac/259-1.html b/test/testfiles/oac/259-1.html deleted file mode 100644 index 4515a3144..000000000 --- a/test/testfiles/oac/259-1.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - -Check #259.1 - Positive - - - - -

            The following object is not working. This is just an example.

            - - - - - - - - - - - - diff --git a/test/testfiles/oac/259-2.html b/test/testfiles/oac/259-2.html deleted file mode 100644 index 35e676388..000000000 --- a/test/testfiles/oac/259-2.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - -Check #259.2 - Positive - - - - -

            The following object is not working. This is just an example.

            - - - - - - - - - - - - diff --git a/test/testfiles/oac/26-1.html b/test/testfiles/oac/26-1.html deleted file mode 100644 index 1596c2883..000000000 --- a/test/testfiles/oac/26-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #26 - Positive - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/26-2.html b/test/testfiles/oac/26-2.html deleted file mode 100644 index 12fe2ece2..000000000 --- a/test/testfiles/oac/26-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #26 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/260-1.html b/test/testfiles/oac/260-1.html deleted file mode 100644 index 3c6670fdc..000000000 --- a/test/testfiles/oac/260-1.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - -Check #260.1 - Positive - - - - -

            The following embed is not working. This is just an example.

            - - - - - - - - - - - - diff --git a/test/testfiles/oac/260-2.html b/test/testfiles/oac/260-2.html deleted file mode 100644 index 437f02d56..000000000 --- a/test/testfiles/oac/260-2.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - -Check #260.2 - Positive - - - - -

            The following embed is not working. This is just an example.

            - - - - - - - - - - - - diff --git a/test/testfiles/oac/261-1.html b/test/testfiles/oac/261-1.html deleted file mode 100644 index fa919bfc0..000000000 --- a/test/testfiles/oac/261-1.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - -Check #261.1 - Positive - - - - - - -

            Applicability

            -HTML and XHTML
            - -This technique is referenced from:
            -How to Meet Success Criterion 2.4.1
            - -User Agent and Assistive Technology Support Notes
            -Home Page Reader, JAWS, and WindowEyes all provide navigation via headings and provide information about the level of the heading. The Opera browser provides a mechanism to navigate by headings. Additional plugins support navigation by headings in other user agents.
            - -Description
            -The objective of this technique is to demonstrate how using the heading elements, h and h1 - h6, to markup the beginning of each section in the content can assist in navigation. Most assistive technologies and many user agents provide a mechanism to navigate by heading elements by providing keyboard commands that allow users to jump from one heading to the next. Using heading elements to markup sections of a document allows users to easily navigate from section to section.
            - -Examples
            -Example 1... -

            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/261-2.html b/test/testfiles/oac/261-2.html deleted file mode 100644 index 12a4d3b8e..000000000 --- a/test/testfiles/oac/261-2.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - -Check #261.2 - Negative - - - - -

            H69: Providing Heading elements at the beginning of each section of content

            - -

            Applicability

            -

            HTML and XHTML

            - -

            This technique is referenced from:

            -

            How to Meet Success Criterion 2.4.1

            - -

            User Agent and Assistive Technology Support Notes

            -

            Home Page Reader, JAWS, and WindowEyes all provide navigation via headings and provide information about the level of the heading. The Opera browser provides a mechanism to navigate by headings. Additional plugins support navigation by headings in other user agents.

            - -

            Description

            -

            The objective of this technique is to demonstrate how using the heading elements, h and h1 - h6, to markup the beginning of each section in the content can assist in navigation. Most assistive technologies and many user agents provide a mechanism to navigate by heading elements by providing keyboard commands that allow users to jump from one heading to the next. Using heading elements to markup sections of a document allows users to easily navigate from section to section.

            - -

            Examples

            - -

            Example 1...

            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/261-3.html b/test/testfiles/oac/261-3.html deleted file mode 100644 index 6c7c138cd..000000000 --- a/test/testfiles/oac/261-3.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #261.2 - Negative - - - - -

            User Agent and Assistive Technology Support Notes

            -

            Home Page Reader, JAWS, and WindowEyes all provide navigation via headingss.

            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/264-1.html b/test/testfiles/oac/264-1.html deleted file mode 100644 index 295459580..000000000 --- a/test/testfiles/oac/264-1.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #264.1 - Positive - - - - -
            -

            - -

            -
            - - - - - - - - diff --git a/test/testfiles/oac/264-2.html b/test/testfiles/oac/264-2.html deleted file mode 100644 index 70f492690..000000000 --- a/test/testfiles/oac/264-2.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #264.2 - Positive - - - - -
            -

            - -

            -
            - - - - - - - - diff --git a/test/testfiles/oac/264-3.html b/test/testfiles/oac/264-3.html deleted file mode 100644 index 44f03837d..000000000 --- a/test/testfiles/oac/264-3.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #264.3 - Negative - - - - -
            -

            - -

            -
            - - - - - - - - diff --git a/test/testfiles/oac/265-1.html b/test/testfiles/oac/265-1.html deleted file mode 100644 index dbbe2c096..000000000 --- a/test/testfiles/oac/265-1.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - -Check #264.1 - Positive - - - - - -
            -

            - -
            - -
            - -
            - -

            -
            - -
            -

            - -
            - -
            - - -

            -
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/265-2.html b/test/testfiles/oac/265-2.html deleted file mode 100644 index d0d74a354..000000000 --- a/test/testfiles/oac/265-2.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - -Check #264.2 - Negative - - - - - -
            -

            - -
            - -
            - -
            - -

            -
            - -
            -

            - -
            - -
            - - -

            -
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/268-1.html b/test/testfiles/oac/268-1.html deleted file mode 100644 index 4fe1da6c3..000000000 --- a/test/testfiles/oac/268-1.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - -Check #268.1 - Positive - - - - - -

            Assume the form below was submitted to the server and has now been returned with an error message.

            - -

            Error: Form submission wrong.

            - -
            - -

            - -
            - -

            - -
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/268-2.html b/test/testfiles/oac/268-2.html deleted file mode 100644 index e04bb9e05..000000000 --- a/test/testfiles/oac/268-2.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - -Check #268.2 - Negative - - - - - -

            Assume the form below was submitted to the server and has now been returned with an error message.

            - -

            Error: Date should be entered as dd mm yyyy (e.g. 30 12 2006).

            - -
            - -

            - -
            - -

            - -
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/269-1.html b/test/testfiles/oac/269-1.html deleted file mode 100644 index 0dd91fc35..000000000 --- a/test/testfiles/oac/269-1.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - -Check #269.1 - Positive - - - - - -

            Shown below are the steps required to purchase a concert ticket.

            - -
              -
            1. User fills out the form and selects the "submit" button.
            2. -
            3. User's credit card is charged for the tickets and tickets are mailed to user.
            4. -
            - - -
            - -

            - - - -
            - - -
            - -

            - -
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/269-2.html b/test/testfiles/oac/269-2.html deleted file mode 100644 index b9c2445b2..000000000 --- a/test/testfiles/oac/269-2.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - -Check #269.2 - Negative - - - - - -

            Shown below are the steps required to purchase a concert ticket.

            - -
              -
            1. User fills out the form and selects the "submit" button.
            2. -
            3. Data is presented to user with the option to correct data or submit it.
            4. -
            5. If user submits form then credit card is charged for the tickets and tickets are mailed to user.
            6. -
            - -

            Step 1 - fill out form

            - -
            - -

            - - - -
            - - -
            - -

            - -
            - -

            Step 2 - data is presented to user

            - -

            Please review the data below. If the data is correct select the "Purchase Ticket" button. If data is not correct then select this link to modify the data.

            - -
            - -

            - - - -
            - - -
            - -

            - -
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/27-1.html b/test/testfiles/oac/27-1.html deleted file mode 100644 index 754462b5a..000000000 --- a/test/testfiles/oac/27-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #27.1 - Positive - - - - -blinks - - - - - - - - - diff --git a/test/testfiles/oac/27-2.html b/test/testfiles/oac/27-2.html deleted file mode 100644 index 9e756142a..000000000 --- a/test/testfiles/oac/27-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #27.2 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/271-1.html b/test/testfiles/oac/271-1.html deleted file mode 100644 index 6681dc5fb..000000000 --- a/test/testfiles/oac/271-1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #271.1 - Positive - - - - - -

            The title says "פעילות הבינאום, W3C" in Hebrew.

            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/271-2.html b/test/testfiles/oac/271-2.html deleted file mode 100644 index 27a116da5..000000000 --- a/test/testfiles/oac/271-2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #271.2 - Negative - - - - - -

            The title says "פעילות הבינאום, W3C" in Hebrew.

            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/272-1.html b/test/testfiles/oac/272-1.html deleted file mode 100644 index 82aeea2a9..000000000 --- a/test/testfiles/oac/272-1.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Check #272.1 - Positive - - - - - -

            Use the form below to remove your report from the repository.

            - -
            -

            -
            - -

            -
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/272-2.html b/test/testfiles/oac/272-2.html deleted file mode 100644 index f17352ec4..000000000 --- a/test/testfiles/oac/272-2.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - -Check #272.2 - Negative - - - - - -

            Use the form below to remove your report from the repository.
            -Select the following link if you would like to recover a report that has been previously deleted.

            - -
            -

            -
            - -

            -
            - -

            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/273-1.html b/test/testfiles/oac/273-1.html deleted file mode 100644 index 3f3d3ee03..000000000 --- a/test/testfiles/oac/273-1.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - -Check #273.1 - Positive - - - - - -

            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/28-1.html b/test/testfiles/oac/28-1.html deleted file mode 100644 index b84857769..000000000 --- a/test/testfiles/oac/28-1.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - -Check #28.1 - Positive - - - - - -

            company logo

            - - - -

            The main content of the document goes here. This is some example text.

            - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/28-2.html b/test/testfiles/oac/28-2.html deleted file mode 100644 index 76f3601da..000000000 --- a/test/testfiles/oac/28-2.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - -Check #28.2 - Negative - - - - - -

            skip to content

            - -

            company logo

            - - - - -

            The main content of the document goes here. This is some example text.

            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/29-1.html b/test/testfiles/oac/29-1.html deleted file mode 100644 index 6f0242d7e..000000000 --- a/test/testfiles/oac/29-1.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #29 - Positive - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/29-2.html b/test/testfiles/oac/29-2.html deleted file mode 100644 index 7ea8f2d44..000000000 --- a/test/testfiles/oac/29-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #29 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/3-1.html b/test/testfiles/oac/3-1.html deleted file mode 100644 index a9be4dbfa..000000000 --- a/test/testfiles/oac/3-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #3 - Positive - - - - -

            A picture of Rex the cat with some extra text. This is very long alt text. In fact, it was much much too long for this image. Sort alt text would be much better and this alt text should be shortened.

            - - - - - - - - - diff --git a/test/testfiles/oac/3-2.html b/test/testfiles/oac/3-2.html deleted file mode 100644 index 738ad3abc..000000000 --- a/test/testfiles/oac/3-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #3 - Negative - - - - -

            photo of rex the cat

            - - - - - - - - - diff --git a/test/testfiles/oac/30-1.html b/test/testfiles/oac/30-1.html deleted file mode 100644 index 88ba56675..000000000 --- a/test/testfiles/oac/30-1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #30.1 - Positive - - - - -

            There is not a real object here. I need an object that flickers.

            - - - - - - - - - - diff --git a/test/testfiles/oac/30-2.html b/test/testfiles/oac/30-2.html deleted file mode 100644 index 50868f967..000000000 --- a/test/testfiles/oac/30-2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #30.2 - Negative - - - - -

            There is not a real object here. I need an object that does not flicker.

            - - - - - - - - - - diff --git a/test/testfiles/oac/37-1.html b/test/testfiles/oac/37-1.html deleted file mode 100644 index ea502dc4e..000000000 --- a/test/testfiles/oac/37-1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #37 - Positive - - - - - -

            The First Heading

            -

            Here is some demo text.

            -

            The bad Heading

            -

            Here is some more demo text.

            - - - - - - - - - - diff --git a/test/testfiles/oac/37-2.html b/test/testfiles/oac/37-2.html deleted file mode 100644 index 0025f6aba..000000000 --- a/test/testfiles/oac/37-2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #37 - Negative - - - - - -

            The First Heading

            -

            Here is some demo text.

            -

            The Second Heading

            -

            Here is some more demo text.

            - - - - - - - - - - diff --git a/test/testfiles/oac/38-1.html b/test/testfiles/oac/38-1.html deleted file mode 100644 index f3a4e4a97..000000000 --- a/test/testfiles/oac/38-1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #38 - Positive - - - - - -

            The First Heading

            -

            Here is some demo text.

            -

            The bad Heading

            -

            Here is some more demo text.

            - - - - - - - - - - diff --git a/test/testfiles/oac/38-2.html b/test/testfiles/oac/38-2.html deleted file mode 100644 index 2df39a9af..000000000 --- a/test/testfiles/oac/38-2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #38 - Negative - - - - - -

            The First Heading

            -

            Here is some demo text.

            -

            This Heading Is OK

            -

            Here is some more demo text.

            - - - - - - - - - - diff --git a/test/testfiles/oac/39-1.html b/test/testfiles/oac/39-1.html deleted file mode 100644 index 7ac4994c2..000000000 --- a/test/testfiles/oac/39-1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #39 - Positive - - - - - -

            The First Heading

            -

            Here is some demo text.

            -
            The bad Heading
            -

            Here is some more demo text.

            - - - - - - - - - - diff --git a/test/testfiles/oac/39-2.html b/test/testfiles/oac/39-2.html deleted file mode 100644 index daae2af8b..000000000 --- a/test/testfiles/oac/39-2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #39 - Negative - - - - - -

            The First Heading

            -

            Here is some demo text.

            -

            This Heading Is OK

            -

            Here is some more demo text.

            - - - - - - - - - - diff --git a/test/testfiles/oac/4-1.html b/test/testfiles/oac/4-1.html deleted file mode 100644 index c77535f54..000000000 --- a/test/testfiles/oac/4-1.html +++ /dev/null @@ -1,24 +0,0 @@ - - - -Check #4 - Positive - - - - -

            We would like to adopt another pet and are looking for one that is similar to what's shown in the picture.

            - - - - - - - - - - diff --git a/test/testfiles/oac/4-2.html b/test/testfiles/oac/4-2.html deleted file mode 100644 index fcd15f56d..000000000 --- a/test/testfiles/oac/4-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - -Check #4 - Negative - - - - -

            We would like to adopt another pet and are looking for one that is similar to what's shown in the picture.

            -large brown and black cat named Rex - - - - - - - - - diff --git a/test/testfiles/oac/40-1.html b/test/testfiles/oac/40-1.html deleted file mode 100644 index cfa4475a9..000000000 --- a/test/testfiles/oac/40-1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #40 - Positive - - - - - -

            The First Heading

            -

            Here is some demo text.

            -
            The bad Heading
            -

            Here is some more demo text.

            - - - - - - - - - - diff --git a/test/testfiles/oac/40-2.html b/test/testfiles/oac/40-2.html deleted file mode 100644 index 9f5d85705..000000000 --- a/test/testfiles/oac/40-2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #40 - Negative - - - - - -

            The First Heading

            -

            Here is some demo text.

            -
            This Heading Is OK
            -

            Here is some more demo text.

            - - - - - - - - - - diff --git a/test/testfiles/oac/41-1.html b/test/testfiles/oac/41-1.html deleted file mode 100644 index ebb97cc27..000000000 --- a/test/testfiles/oac/41-1.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #41 - Positive - - - - - -

            The First Heading

            - -
            The Second Heading
            - - - - - - - - - - diff --git a/test/testfiles/oac/41-2.html b/test/testfiles/oac/41-2.html deleted file mode 100644 index 85d3ae311..000000000 --- a/test/testfiles/oac/41-2.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #41 - Negative - - - - - -
            The First Heading
            - -
            The Second Heading
            - - - - - - - - - - diff --git a/test/testfiles/oac/42-1.html b/test/testfiles/oac/42-1.html deleted file mode 100644 index f4042469e..000000000 --- a/test/testfiles/oac/42-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #42 - Positive - - - - -
            -

            This is

            very important

            and you should read it.

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/42-2.html b/test/testfiles/oac/42-2.html deleted file mode 100644 index a128876d8..000000000 --- a/test/testfiles/oac/42-2.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #42 - Negative - - - -
            -

            The First Heading

            - -

            This is very important and you should read it.

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/43-1.html b/test/testfiles/oac/43-1.html deleted file mode 100644 index 6ac5e9021..000000000 --- a/test/testfiles/oac/43-1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #43 - Positive - - - -
            -

            This is

            very important

            and you should read it.

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/43-2.html b/test/testfiles/oac/43-2.html deleted file mode 100644 index c85a1881f..000000000 --- a/test/testfiles/oac/43-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #43 - Negative - - - -
            - -

            This is very important and you should read it.

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/44-1.html b/test/testfiles/oac/44-1.html deleted file mode 100644 index d46751720..000000000 --- a/test/testfiles/oac/44-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #44 - Positive - - - - - -

            This is

            very important

            and you should read it.

            - - - - - - - - - - diff --git a/test/testfiles/oac/44-2.html b/test/testfiles/oac/44-2.html deleted file mode 100644 index e23936816..000000000 --- a/test/testfiles/oac/44-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #44 - Negative - - - - - -

            This is very important and you should read it.

            - - - - - - - - - - diff --git a/test/testfiles/oac/45-1.html b/test/testfiles/oac/45-1.html deleted file mode 100644 index 1714dfd0a..000000000 --- a/test/testfiles/oac/45-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #45 - Positive - - - - - -

            This is

            very important

            and you should read it.

            - - - - - - - - - - diff --git a/test/testfiles/oac/45-2.html b/test/testfiles/oac/45-2.html deleted file mode 100644 index dbb5095ad..000000000 --- a/test/testfiles/oac/45-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #45 - Negative - - - - - -

            This is very important and you should read it.

            - - - - - - - - - - diff --git a/test/testfiles/oac/46-1.html b/test/testfiles/oac/46-1.html deleted file mode 100644 index 7e1a6a9f1..000000000 --- a/test/testfiles/oac/46-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #46 - Positive - - - - - -

            This is

            very important

            and you should read it.

            - - - - - - - - - - diff --git a/test/testfiles/oac/46-2.html b/test/testfiles/oac/46-2.html deleted file mode 100644 index 8ea2a72de..000000000 --- a/test/testfiles/oac/46-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #46 - Negative - - - - - -

            This is very important and you should read it.

            - - - - - - - - - - diff --git a/test/testfiles/oac/47-1.html b/test/testfiles/oac/47-1.html deleted file mode 100644 index 19472e8d1..000000000 --- a/test/testfiles/oac/47-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #47 - Positive - - - - - -

            This is

            very important

            and you should read it.

            - - - - - - - - - - diff --git a/test/testfiles/oac/47-2.html b/test/testfiles/oac/47-2.html deleted file mode 100644 index 8eb3d6cd0..000000000 --- a/test/testfiles/oac/47-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #47 - Negative - - - - - -

            This is very important and you should read it.

            - - - - - - - - - - diff --git a/test/testfiles/oac/49-1.html b/test/testfiles/oac/49-1.html deleted file mode 100644 index a48029858..000000000 --- a/test/testfiles/oac/49-1.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #49 - Positive - - - - - - - - - - - - - diff --git a/test/testfiles/oac/49-2.html b/test/testfiles/oac/49-2.html deleted file mode 100644 index cbfa38561..000000000 --- a/test/testfiles/oac/49-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #49 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/5-1.html b/test/testfiles/oac/5-1.html deleted file mode 100644 index 9ed2cd1fc..000000000 --- a/test/testfiles/oac/5-1.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #5 - Positive - - - - -  - - - - - - - - - diff --git a/test/testfiles/oac/5-2.html b/test/testfiles/oac/5-2.html deleted file mode 100644 index 498aa58b7..000000000 --- a/test/testfiles/oac/5-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #5 - Negative - - - - -  - - - - - - - - - diff --git a/test/testfiles/oac/5-3.html b/test/testfiles/oac/5-3.html deleted file mode 100644 index ec5d536d5..000000000 --- a/test/testfiles/oac/5-3.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #5 - Negative - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/50-1.html b/test/testfiles/oac/50-1.html deleted file mode 100644 index 4e5364428..000000000 --- a/test/testfiles/oac/50-1.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/50-2.html b/test/testfiles/oac/50-2.html deleted file mode 100644 index cc7190b47..000000000 --- a/test/testfiles/oac/50-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #50.2 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/51-1.html b/test/testfiles/oac/51-1.html deleted file mode 100644 index 8458a351d..000000000 --- a/test/testfiles/oac/51-1.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/51-2.html b/test/testfiles/oac/51-2.html deleted file mode 100644 index dbc399b66..000000000 --- a/test/testfiles/oac/51-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #51 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/51-3.html b/test/testfiles/oac/51-3.html deleted file mode 100644 index 2db177362..000000000 --- a/test/testfiles/oac/51-3.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/52-1.html b/test/testfiles/oac/52-1.html deleted file mode 100644 index 4401eaacb..000000000 --- a/test/testfiles/oac/52-1.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -This is a really really long title and maybe it should be shortened. In fact I think it really should be shortened. Yes, let's all shorted the title so it's more manageable for everyone. - - - - - - - - - - - - - diff --git a/test/testfiles/oac/52-2.html b/test/testfiles/oac/52-2.html deleted file mode 100644 index ff4fd644d..000000000 --- a/test/testfiles/oac/52-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #52 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/53-1.html b/test/testfiles/oac/53-1.html deleted file mode 100644 index d6868d10a..000000000 --- a/test/testfiles/oac/53-1.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -title - - - - - - - - - - - - - diff --git a/test/testfiles/oac/53-2.html b/test/testfiles/oac/53-2.html deleted file mode 100644 index a0d51a391..000000000 --- a/test/testfiles/oac/53-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #53 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/53-3.html b/test/testfiles/oac/53-3.html deleted file mode 100644 index 28ace8df9..000000000 --- a/test/testfiles/oac/53-3.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -the title - - - - - - - - - - - - - diff --git a/test/testfiles/oac/53-4.html b/test/testfiles/oac/53-4.html deleted file mode 100644 index 6faba2bcd..000000000 --- a/test/testfiles/oac/53-4.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -this is the title - - - - - - - - - - - - - diff --git a/test/testfiles/oac/53-5.html b/test/testfiles/oac/53-5.html deleted file mode 100644 index 338795c63..000000000 --- a/test/testfiles/oac/53-5.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -untitled document - - - - - - - - - - - - - diff --git a/test/testfiles/oac/54-1.html b/test/testfiles/oac/54-1.html deleted file mode 100644 index ae2ce9d1e..000000000 --- a/test/testfiles/oac/54-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -New Page - - - - -

            History Of Birds

            -

            This document contains a history of birds. -The title of this document does not describe the contents of this document.

            - - - - - - - - - diff --git a/test/testfiles/oac/54-2.html b/test/testfiles/oac/54-2.html deleted file mode 100644 index b7ac4e1a2..000000000 --- a/test/testfiles/oac/54-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -The History Of Birds - - - - -

            History Of Birds

            -

            This document contains the history of Birds. -The title of the document is appropriate.

            - - - - - - - - - diff --git a/test/testfiles/oac/55-1.html b/test/testfiles/oac/55-1.html deleted file mode 100644 index 568057303..000000000 --- a/test/testfiles/oac/55-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #55 - Positive - - - - -
            - -
            - - - - - - - - - diff --git a/test/testfiles/oac/55-2.html b/test/testfiles/oac/55-2.html deleted file mode 100644 index ec089c870..000000000 --- a/test/testfiles/oac/55-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #55 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/56-1.html b/test/testfiles/oac/56-1.html deleted file mode 100644 index d34a2a2ff..000000000 --- a/test/testfiles/oac/56-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #56 - Positive - - - - -
            -Name:

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/56-2.html b/test/testfiles/oac/56-2.html deleted file mode 100644 index eecefd769..000000000 --- a/test/testfiles/oac/56-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #56 - Positive - - - - -
            -Name:
            -
            - - - - - - - - - diff --git a/test/testfiles/oac/56-3.html b/test/testfiles/oac/56-3.html deleted file mode 100644 index f2440f131..000000000 --- a/test/testfiles/oac/56-3.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #56 - Negative - - - - -
            -Name: -
            - - - - - - - - - diff --git a/test/testfiles/oac/56-4.html b/test/testfiles/oac/56-4.html deleted file mode 100644 index 12e9c7783..000000000 --- a/test/testfiles/oac/56-4.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #56 - Negative - - - - -
            -:

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/57-1.html b/test/testfiles/oac/57-1.html deleted file mode 100644 index efb2be82e..000000000 --- a/test/testfiles/oac/57-1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #57 - Positive - - - - -
            -

            - - -

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/57-2.html b/test/testfiles/oac/57-2.html deleted file mode 100644 index 1c8ea6aae..000000000 --- a/test/testfiles/oac/57-2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #57 - Negative - - - - -
            -

            - - -

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/57-3.html b/test/testfiles/oac/57-3.html deleted file mode 100644 index 3405c6a42..000000000 --- a/test/testfiles/oac/57-3.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #57 - Positive - - - - -
            -

            - -

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/57-4.html b/test/testfiles/oac/57-4.html deleted file mode 100644 index 14442440f..000000000 --- a/test/testfiles/oac/57-4.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #57 - Negative - - - - -
            -

            - -

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/58-1.html b/test/testfiles/oac/58-1.html deleted file mode 100644 index c6d2826c5..000000000 --- a/test/testfiles/oac/58-1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - -Check #58 - Positive - - - - -
            -

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/58-2.html b/test/testfiles/oac/58-2.html deleted file mode 100644 index d0b8c52e5..000000000 --- a/test/testfiles/oac/58-2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - -Check #58 - Negative - - - - -
            -

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/59-1.html b/test/testfiles/oac/59-1.html deleted file mode 100644 index e754ef786..000000000 --- a/test/testfiles/oac/59-1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - -Check #59 - Positive - - - - -
            -

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/59-2.html b/test/testfiles/oac/59-2.html deleted file mode 100644 index 82fabb1d4..000000000 --- a/test/testfiles/oac/59-2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - -Check #59 - Negative - - - - -
            -

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/6-1.html b/test/testfiles/oac/6-1.html deleted file mode 100644 index c759ed83d..000000000 --- a/test/testfiles/oac/6-1.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -OAC Testfile - Check #6 - Positive - - - - -image - - - - - - - - - diff --git a/test/testfiles/oac/6-2.html b/test/testfiles/oac/6-2.html deleted file mode 100644 index 70227ed11..000000000 --- a/test/testfiles/oac/6-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #6 - Negative - - - - -

            Photo of a brown and black cat named Rex.

            - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/6-3.html b/test/testfiles/oac/6-3.html deleted file mode 100644 index 5c5d93f4d..000000000 --- a/test/testfiles/oac/6-3.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #6 - Positive - - - - -photo - - - - - - - - - diff --git a/test/testfiles/oac/6-4.html b/test/testfiles/oac/6-4.html deleted file mode 100644 index 1a292f63d..000000000 --- a/test/testfiles/oac/6-4.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #6 - Positive - - - - -13K bytes - - - - - - - - - diff --git a/test/testfiles/oac/6-5.html b/test/testfiles/oac/6-5.html deleted file mode 100644 index 047496523..000000000 --- a/test/testfiles/oac/6-5.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #6 - Positive - - - - -

            spacer

            - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/6-6.html b/test/testfiles/oac/6-6.html deleted file mode 100644 index 095fc8649..000000000 --- a/test/testfiles/oac/6-6.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #6 - Positive - - - - -

            nbsp

            - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/6-7.html b/test/testfiles/oac/6-7.html deleted file mode 100644 index fcf0b824b..000000000 --- a/test/testfiles/oac/6-7.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #6 - Negative - - - - -

            - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/60-1.html b/test/testfiles/oac/60-1.html deleted file mode 100644 index 1ee71e3ce..000000000 --- a/test/testfiles/oac/60-1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - -Check #60 - Positive - - - - -
            -:

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/60-2.html b/test/testfiles/oac/60-2.html deleted file mode 100644 index 9cee71363..000000000 --- a/test/testfiles/oac/60-2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - -Check #60 - Negative - - - - -
            -:

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/61-1.html b/test/testfiles/oac/61-1.html deleted file mode 100644 index 74cef7eef..000000000 --- a/test/testfiles/oac/61-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #61 - Positive - - - - -
            -:

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/61-2.html b/test/testfiles/oac/61-2.html deleted file mode 100644 index fca8c2ac9..000000000 --- a/test/testfiles/oac/61-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #61 - Negative - - - - -
            -:

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/62-1.html b/test/testfiles/oac/62-1.html deleted file mode 100644 index 06a853013..000000000 --- a/test/testfiles/oac/62-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #62 - Positive - - - - -
            -:

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/62-2.html b/test/testfiles/oac/62-2.html deleted file mode 100644 index bafbc6b34..000000000 --- a/test/testfiles/oac/62-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #62 - Negative - - - - -
            -:

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/62-3.html b/test/testfiles/oac/62-3.html deleted file mode 100644 index 54c6837d0..000000000 --- a/test/testfiles/oac/62-3.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #62 - Positive - - - - -
            -:

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/62-4.html b/test/testfiles/oac/62-4.html deleted file mode 100644 index 1f7290d59..000000000 --- a/test/testfiles/oac/62-4.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #62 - Positive - - - - -
            -:

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/63-1.html b/test/testfiles/oac/63-1.html deleted file mode 100644 index 6b2052ff0..000000000 --- a/test/testfiles/oac/63-1.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #63 - Positive - - - - -
            -: -
            - - - - - - - - - - diff --git a/test/testfiles/oac/63-2.html b/test/testfiles/oac/63-2.html deleted file mode 100644 index 1394dede9..000000000 --- a/test/testfiles/oac/63-2.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #63 - Negative - - - - -
            -: -
            - - - - - - - - - - diff --git a/test/testfiles/oac/64-1.html b/test/testfiles/oac/64-1.html deleted file mode 100644 index b9c240108..000000000 --- a/test/testfiles/oac/64-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #64 - Positive - - - - -

            - -

            - - - - - - - - - diff --git a/test/testfiles/oac/64-2.html b/test/testfiles/oac/64-2.html deleted file mode 100644 index 24f3b45ed..000000000 --- a/test/testfiles/oac/64-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #64 - Negative - - - - -

            -reference section -

            - - - - - - - - - diff --git a/test/testfiles/oac/65-1.html b/test/testfiles/oac/65-1.html deleted file mode 100644 index 811e9f3a1..000000000 --- a/test/testfiles/oac/65-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - -Check #65 - Positive - - - - -

            Image map of areas in the library

            -

            -drawing of a blue book -

            - - - - - - - - - diff --git a/test/testfiles/oac/65-2.html b/test/testfiles/oac/65-2.html deleted file mode 100644 index eeb013943..000000000 --- a/test/testfiles/oac/65-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - -Check #65 - Negative - - - - -

            Image map of areas in the library

            -

            -reference section -

            - - - - - - - - - diff --git a/test/testfiles/oac/65-3.html b/test/testfiles/oac/65-3.html deleted file mode 100644 index 8dabba019..000000000 --- a/test/testfiles/oac/65-3.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #65 - Negative - - - - - -  - - - - - - - - - diff --git a/test/testfiles/oac/66-1.html b/test/testfiles/oac/66-1.html deleted file mode 100644 index 5080d50e7..000000000 --- a/test/testfiles/oac/66-1.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #66 - Positive - - - - -

            Image map of areas in the library

            -

            -Reference -Audio Visual Lab -

            - - - - - - - - - diff --git a/test/testfiles/oac/66-10.html b/test/testfiles/oac/66-10.html deleted file mode 100644 index 7a03e8ff7..000000000 --- a/test/testfiles/oac/66-10.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #66 - Negative - - - - - - hello - - - - - - - - - diff --git a/test/testfiles/oac/66-11.html b/test/testfiles/oac/66-11.html deleted file mode 100644 index 8c72cfd00..000000000 --- a/test/testfiles/oac/66-11.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #66 - Negative - - - - - - hello - - - - - - - - - diff --git a/test/testfiles/oac/66-12.html b/test/testfiles/oac/66-12.html deleted file mode 100644 index 1220e6ef7..000000000 --- a/test/testfiles/oac/66-12.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #66 - Negative - - - - - - hello - - - - - - - - - diff --git a/test/testfiles/oac/66-2.html b/test/testfiles/oac/66-2.html deleted file mode 100644 index b6fb84457..000000000 --- a/test/testfiles/oac/66-2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #66 - Negative - - - - -

            Image map of areas in the library

            -

            -Reference -Audio Visual Lab -

            -

            Audio Visual Lab Text Transcript

            - - - - - - - - - diff --git a/test/testfiles/oac/66-3.html b/test/testfiles/oac/66-3.html deleted file mode 100644 index ba61179b8..000000000 --- a/test/testfiles/oac/66-3.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #66 - Negative - - - - - - hello - - - - - - - - - diff --git a/test/testfiles/oac/66-4.html b/test/testfiles/oac/66-4.html deleted file mode 100644 index 3404a8cf8..000000000 --- a/test/testfiles/oac/66-4.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #66 - Negative - - - - - - hello - - - - - - - - - diff --git a/test/testfiles/oac/66-5.html b/test/testfiles/oac/66-5.html deleted file mode 100644 index 6e5605411..000000000 --- a/test/testfiles/oac/66-5.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #66 - Negative - - - - - - hello - - - - - - - - - diff --git a/test/testfiles/oac/66-6.html b/test/testfiles/oac/66-6.html deleted file mode 100644 index 27ed7e435..000000000 --- a/test/testfiles/oac/66-6.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #66 - Negative - - - - - - hello - - - - - - - - - diff --git a/test/testfiles/oac/66-7.html b/test/testfiles/oac/66-7.html deleted file mode 100644 index 85d5f2b3b..000000000 --- a/test/testfiles/oac/66-7.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #66 - Negative - - - - - - hello - - - - - - - - - diff --git a/test/testfiles/oac/66-8.html b/test/testfiles/oac/66-8.html deleted file mode 100644 index 5ab38fd6e..000000000 --- a/test/testfiles/oac/66-8.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #66 - Negative - - - - - - hello - - - - - - - - - diff --git a/test/testfiles/oac/66-9.html b/test/testfiles/oac/66-9.html deleted file mode 100644 index 68fd3f1f0..000000000 --- a/test/testfiles/oac/66-9.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #66 - Negative - - - - - - hello - - - - - - - - - diff --git a/test/testfiles/oac/68-1.html b/test/testfiles/oac/68-1.html deleted file mode 100644 index 425b013b0..000000000 --- a/test/testfiles/oac/68-1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #68 - Positive - - - - - - hello - - - - - - - - - diff --git a/test/testfiles/oac/68-2.html b/test/testfiles/oac/68-2.html deleted file mode 100644 index 1a1006b3e..000000000 --- a/test/testfiles/oac/68-2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #68 - Negative - - - - - - reference section - - - - - - - - - diff --git a/test/testfiles/oac/68-3.html b/test/testfiles/oac/68-3.html deleted file mode 100644 index 8b354780c..000000000 --- a/test/testfiles/oac/68-3.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #68 - Negative - - - - - - reference section - - - - - - - - - diff --git a/test/testfiles/oac/68-4.html b/test/testfiles/oac/68-4.html deleted file mode 100644 index b28180d0d..000000000 --- a/test/testfiles/oac/68-4.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #68 - Negative - - - - - - reference section - - - - - - - - - diff --git a/test/testfiles/oac/69-1.html b/test/testfiles/oac/69-1.html deleted file mode 100644 index 6d4a5e022..000000000 --- a/test/testfiles/oac/69-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #69 - Positive - - - - -

            this is marquee text

            - - - - - - - - - diff --git a/test/testfiles/oac/69-2.html b/test/testfiles/oac/69-2.html deleted file mode 100644 index 0544e68a0..000000000 --- a/test/testfiles/oac/69-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #69 - Negative - - - - -

            There is no marquee text in this document.

            - - - - - - - - - diff --git a/test/testfiles/oac/7-1.html b/test/testfiles/oac/7-1.html deleted file mode 100644 index b735e2694..000000000 --- a/test/testfiles/oac/7-1.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #7 - Positive - - - - -

            - - - - - - - - - diff --git a/test/testfiles/oac/7-2.html b/test/testfiles/oac/7-2.html deleted file mode 100644 index 816115e4e..000000000 --- a/test/testfiles/oac/7-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #7 - Negative - - - - -

            a story about Rex the cat

            - - - - - - - - - diff --git a/test/testfiles/oac/70-1.html b/test/testfiles/oac/70-1.html deleted file mode 100644 index 190feeb96..000000000 --- a/test/testfiles/oac/70-1.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #70 - Positive - - - - - - -
          1. some text
          2. -
            - - - - - - - - - diff --git a/test/testfiles/oac/70-2.html b/test/testfiles/oac/70-2.html deleted file mode 100644 index c192db2c9..000000000 --- a/test/testfiles/oac/70-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #70 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/71-1.html b/test/testfiles/oac/71-1.html deleted file mode 100644 index 035652ec4..000000000 --- a/test/testfiles/oac/71-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #71 - Positive - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/71-2.html b/test/testfiles/oac/71-2.html deleted file mode 100644 index a7192f287..000000000 --- a/test/testfiles/oac/71-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #71 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/72-1.html b/test/testfiles/oac/72-1.html deleted file mode 100644 index 47e8b10d9..000000000 --- a/test/testfiles/oac/72-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - -Check #72.1 - Positive - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/72-2.html b/test/testfiles/oac/72-2.html deleted file mode 100644 index a58f73ab5..000000000 --- a/test/testfiles/oac/72-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #72.2 - Negative - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/73-1.html b/test/testfiles/oac/73-1.html deleted file mode 100644 index e7c9a194f..000000000 --- a/test/testfiles/oac/73-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #73 - Positive - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/73-2.html b/test/testfiles/oac/73-2.html deleted file mode 100644 index 645d48707..000000000 --- a/test/testfiles/oac/73-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #74 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/74-1.html b/test/testfiles/oac/74-1.html deleted file mode 100644 index 6a888daa7..000000000 --- a/test/testfiles/oac/74-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #74 - Positive - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/74-2.html b/test/testfiles/oac/74-2.html deleted file mode 100644 index b620e5fcb..000000000 --- a/test/testfiles/oac/74-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #74 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/75-1.html b/test/testfiles/oac/75-1.html deleted file mode 100644 index d602201eb..000000000 --- a/test/testfiles/oac/75-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #75 - Positive - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/75-2.html b/test/testfiles/oac/75-2.html deleted file mode 100644 index aea15e958..000000000 --- a/test/testfiles/oac/75-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #75 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/76-1.html b/test/testfiles/oac/76-1.html deleted file mode 100644 index 3914609ad..000000000 --- a/test/testfiles/oac/76-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #76 - Positive - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/76-2.html b/test/testfiles/oac/76-2.html deleted file mode 100644 index a72646689..000000000 --- a/test/testfiles/oac/76-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #76 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/77-1.html b/test/testfiles/oac/77-1.html deleted file mode 100644 index a2c6f6131..000000000 --- a/test/testfiles/oac/77-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #77 - Positive - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/77-2.html b/test/testfiles/oac/77-2.html deleted file mode 100644 index 54ecb8cc2..000000000 --- a/test/testfiles/oac/77-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #77 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/78-1.html b/test/testfiles/oac/78-1.html deleted file mode 100644 index 89c4ad82d..000000000 --- a/test/testfiles/oac/78-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #78 - Positive - - - - - -The text equivalent for the object should go here. - - - - - - - - - - diff --git a/test/testfiles/oac/78-2.html b/test/testfiles/oac/78-2.html deleted file mode 100644 index d58ff1670..000000000 --- a/test/testfiles/oac/78-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #78 - Positive - - - - - -The text equivalent for the object should go here. - - - - - - - - - - diff --git a/test/testfiles/oac/79-1.html b/test/testfiles/oac/79-1.html deleted file mode 100644 index 8963cc4fe..000000000 --- a/test/testfiles/oac/79-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #79 - Positive - - - - - -The text equivalent for the object should go here. - - - - - - - - - - diff --git a/test/testfiles/oac/79-2.html b/test/testfiles/oac/79-2.html deleted file mode 100644 index cfca35471..000000000 --- a/test/testfiles/oac/79-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #79 - Negative - - - - - -The text equivalent for the object should go here. - - - - - - - - - - diff --git a/test/testfiles/oac/79-3.html b/test/testfiles/oac/79-3.html deleted file mode 100644 index 0a91470ba..000000000 --- a/test/testfiles/oac/79-3.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #79 - Positive - - - - - -The text equivalent for the object should go here. - - - - - - - - - - diff --git a/test/testfiles/oac/8-1.html b/test/testfiles/oac/8-1.html deleted file mode 100644 index fc55915ad..000000000 --- a/test/testfiles/oac/8-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - -Check #8.1 - Positive - - - - -

            The text in this document does not fully describe the complex image shown here. -a complex chart

            - - - - - - - - - diff --git a/test/testfiles/oac/8-2.html b/test/testfiles/oac/8-2.html deleted file mode 100644 index a691601d2..000000000 --- a/test/testfiles/oac/8-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #8.2 - Negative - - - - -

            The text in this document does not fully describe the image shown here but the image contains a longdesc attribute linking to a text file that does describe the image. a complex chart

            - - - - - - - - - diff --git a/test/testfiles/oac/8-3.html b/test/testfiles/oac/8-3.html deleted file mode 100644 index 906418aea..000000000 --- a/test/testfiles/oac/8-3.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #8.3 - Positive - - - - -

            The text in this document fully describes the image shown here however the Alt text does not refer to this text. a complex chart

            - - - - - - - - - diff --git a/test/testfiles/oac/8-4.html b/test/testfiles/oac/8-4.html deleted file mode 100644 index c5edd2420..000000000 --- a/test/testfiles/oac/8-4.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #8.4 - Negative - - - - -

            The text in this document fully describes the image shown here and the Alt text refers to this text. a complex chart as described above

            - - - - - - - - - diff --git a/test/testfiles/oac/8-5.html b/test/testfiles/oac/8-5.html deleted file mode 100644 index c778b6d6f..000000000 --- a/test/testfiles/oac/8-5.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - -Check #8.5 - Negative - - - - -

            The text in this document does not fully describe the image.a complex chart (Description of image.)

            - - - - - - - - - diff --git a/test/testfiles/oac/80-1.html b/test/testfiles/oac/80-1.html deleted file mode 100644 index 433141169..000000000 --- a/test/testfiles/oac/80-1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #80 - Positive - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/80-2.html b/test/testfiles/oac/80-2.html deleted file mode 100644 index d13a13682..000000000 --- a/test/testfiles/oac/80-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #80 - Positive - - - - - -Here is some text that describes the object and its operation. - - - - - - - - - - diff --git a/test/testfiles/oac/80-3.html b/test/testfiles/oac/80-3.html deleted file mode 100644 index 56f522faa..000000000 --- a/test/testfiles/oac/80-3.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #80 - Positive - - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/80-4.html b/test/testfiles/oac/80-4.html deleted file mode 100644 index 623b30167..000000000 --- a/test/testfiles/oac/80-4.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #80 - Positive - - - - - -object equivalent page - - - - - - - - - - diff --git a/test/testfiles/oac/81-1.html b/test/testfiles/oac/81-1.html deleted file mode 100644 index 2fcbe6d52..000000000 --- a/test/testfiles/oac/81-1.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Check #81 - Positive - - - - - -
              -
            1. Item text
            2. -
            - - - - - - - - - - diff --git a/test/testfiles/oac/81-2.html b/test/testfiles/oac/81-2.html deleted file mode 100644 index 67ee893f5..000000000 --- a/test/testfiles/oac/81-2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #81 - Negative - - - - - -
              -
            1. Item text 1
            2. -
            3. Item text 2
            4. -
            - - - - - - - - - - diff --git a/test/testfiles/oac/82-1.html b/test/testfiles/oac/82-1.html deleted file mode 100644 index ca0d7118d..000000000 --- a/test/testfiles/oac/82-1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #82 - Positive - - - -
            -

            Looks like a header

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/82-2.html b/test/testfiles/oac/82-2.html deleted file mode 100644 index 4fb2e63b3..000000000 --- a/test/testfiles/oac/82-2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #82 - Negative - - - -
            -

            This is a regular paragraph

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/82-3.html b/test/testfiles/oac/82-3.html deleted file mode 100644 index d3314aa34..000000000 --- a/test/testfiles/oac/82-3.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #82 - Positive - - - -
            -

            Looks like a header

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/82-4.html b/test/testfiles/oac/82-4.html deleted file mode 100644 index 8deafba8a..000000000 --- a/test/testfiles/oac/82-4.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #82 - Positive - - - -
            -

            Looks like a header

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/82-5.html b/test/testfiles/oac/82-5.html deleted file mode 100644 index 7c92b4f7f..000000000 --- a/test/testfiles/oac/82-5.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #82 - Positive - - - -
            -

            Looks like a header

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/82-6.html b/test/testfiles/oac/82-6.html deleted file mode 100644 index 6fb7975cb..000000000 --- a/test/testfiles/oac/82-6.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #82 - Positive - - - -
            -

            Looks like a header

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/82-7.html b/test/testfiles/oac/82-7.html deleted file mode 100644 index 4c53ca416..000000000 --- a/test/testfiles/oac/82-7.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #82 - Positive - - - -
            -

            Looks like a header

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/82-8.html b/test/testfiles/oac/82-8.html deleted file mode 100644 index 6d4cc27d6..000000000 --- a/test/testfiles/oac/82-8.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #82 - Positive - - - -
            -

            A regular paragraph.

            -

            Looks like a header

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/82-9.html b/test/testfiles/oac/82-9.html deleted file mode 100644 index 813dbd716..000000000 --- a/test/testfiles/oac/82-9.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #82 - Negative - - - -
            -

            Nobis nulla sollemnes assum est volutpat. Et ii wisi hendrerit saepius duis.

            -

            Looks like a header, but it's not.

            -

            Nobis nulla sollemnes assum est volutpat. Et ii wisi hendrerit saepius duis.

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/86-1.html b/test/testfiles/oac/86-1.html deleted file mode 100644 index 6375a8a88..000000000 --- a/test/testfiles/oac/86-1.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - -Check #86 - Positive - - - -
            - -
            - - - - - - - - - - diff --git a/test/testfiles/oac/86-2.html b/test/testfiles/oac/86-2.html deleted file mode 100644 index 1027b72fa..000000000 --- a/test/testfiles/oac/86-2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #86 - Negative - - - -
            -

            No scripts be here.

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/87-1.html b/test/testfiles/oac/87-1.html deleted file mode 100644 index 3eec02b1b..000000000 --- a/test/testfiles/oac/87-1.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #87 - Positive - - - -
            - - -
            - - - - - - - - - diff --git a/test/testfiles/oac/87-2.html b/test/testfiles/oac/87-2.html deleted file mode 100644 index 33279f7cb..000000000 --- a/test/testfiles/oac/87-2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #87 - Negative - - - -
            -

            There are no scripts here

            - - - - - - - - - - diff --git a/test/testfiles/oac/88-1.html b/test/testfiles/oac/88-1.html deleted file mode 100644 index dd6a9485b..000000000 --- a/test/testfiles/oac/88-1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #88 - Positive - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/88-2.html b/test/testfiles/oac/88-2.html deleted file mode 100644 index 0eabea12a..000000000 --- a/test/testfiles/oac/88-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #88 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/89-1.html b/test/testfiles/oac/89-1.html deleted file mode 100644 index fd0da038c..000000000 --- a/test/testfiles/oac/89-1.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #89 - Positive - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/89-2.html b/test/testfiles/oac/89-2.html deleted file mode 100644 index 3b640e50e..000000000 --- a/test/testfiles/oac/89-2.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - -Check #88 - Negative - - - - - - - - - - - - - diff --git a/test/testfiles/oac/90-1.html b/test/testfiles/oac/90-1.html deleted file mode 100644 index e1a58cc19..000000000 --- a/test/testfiles/oac/90-1.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - -Check #90 - Positive - - - - -There are scripts in here. - -Somewhere. - - - - - - - - - diff --git a/test/testfiles/oac/90-2.html b/test/testfiles/oac/90-2.html deleted file mode 100644 index 73dcef32f..000000000 --- a/test/testfiles/oac/90-2.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Check #90 - Negative - - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/91-1.html b/test/testfiles/oac/91-1.html deleted file mode 100644 index a3e64d7ad..000000000 --- a/test/testfiles/oac/91-1.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - -Testfile 91.1 - Positive - - - - -
            -

            - - -

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/91-2.html b/test/testfiles/oac/91-2.html deleted file mode 100644 index cbe857a5b..000000000 --- a/test/testfiles/oac/91-2.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Testfile 91.2 - Negative - - - - -
            -

            - - -

            -
            - - - - - - - - diff --git a/test/testfiles/oac/91-3.html b/test/testfiles/oac/91-3.html deleted file mode 100644 index dc936c620..000000000 --- a/test/testfiles/oac/91-3.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - -Testfile 91.3 - Positive - - - - -
            -

            - -

            -
            - - - - - - - - diff --git a/test/testfiles/oac/91-4.html b/test/testfiles/oac/91-4.html deleted file mode 100644 index 43b824111..000000000 --- a/test/testfiles/oac/91-4.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Testfile 91.4 - Negative - - - - -
            -

            - -

            -
            - - - - - - - - diff --git a/test/testfiles/oac/92-1.html b/test/testfiles/oac/92-1.html deleted file mode 100644 index db26ce041..000000000 --- a/test/testfiles/oac/92-1.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - -Check #92 - Positive - - - - - -
            -

            - -

            -
            - - - - - - - - - - diff --git a/test/testfiles/oac/92-2.html b/test/testfiles/oac/92-2.html deleted file mode 100644 index e2694f3c4..000000000 --- a/test/testfiles/oac/92-2.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - -Check #92 - Negative - - - - - -
            -

            - -
            -

            -
            - - - - - - - - - - diff --git a/test/testfiles/oac/92-3.html b/test/testfiles/oac/92-3.html deleted file mode 100644 index 98167cc9c..000000000 --- a/test/testfiles/oac/92-3.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - -Dynamic Select Statements - - - - - -

            Dynamic Select Statements

            -
            -

            - - -
            - - -
            -

            -
            - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/95-1.html b/test/testfiles/oac/95-1.html deleted file mode 100644 index b57879e05..000000000 --- a/test/testfiles/oac/95-1.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - -Check #95.1 - Positive - - - - - -
            - - -
            - - - - - - - - - - diff --git a/test/testfiles/oac/95-2.html b/test/testfiles/oac/95-2.html deleted file mode 100644 index aced82897..000000000 --- a/test/testfiles/oac/95-2.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - -Check #95.2 - Negative - - - - - -
            - - -
            - - - - - - - - - - diff --git a/test/testfiles/oac/95-3.html b/test/testfiles/oac/95-3.html deleted file mode 100644 index 739bead46..000000000 --- a/test/testfiles/oac/95-3.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Check #95.3 - Positive - - - - - -
            - -
            - - - - - - - - - - diff --git a/test/testfiles/oac/95-4.html b/test/testfiles/oac/95-4.html deleted file mode 100644 index 8ca36272b..000000000 --- a/test/testfiles/oac/95-4.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - -Check #95.4 - Positive - - - - - -
            - -
            - - - - - - - - - - diff --git a/test/testfiles/oac/96-1.html b/test/testfiles/oac/96-1.html deleted file mode 100644 index 1ba59c18c..000000000 --- a/test/testfiles/oac/96-1.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - -Testfile - Check #96.1 - Positive - - - - -
            - - - - - -
            first name:
            last name:
            -
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/96-2.html b/test/testfiles/oac/96-2.html deleted file mode 100644 index 8c24d1f6a..000000000 --- a/test/testfiles/oac/96-2.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - -Testfile - Check #96.2 - Negative - - - - -
            - - - - - -
            first name:
            last name:
            comment: -
            -
            - - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/97-1.html b/test/testfiles/oac/97-1.html deleted file mode 100644 index 106c66c5a..000000000 --- a/test/testfiles/oac/97-1.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #97 - Positive - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/97-2.html b/test/testfiles/oac/97-2.html deleted file mode 100644 index 103210765..000000000 --- a/test/testfiles/oac/97-2.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - -Check #97 - Negative - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/98-1.html b/test/testfiles/oac/98-1.html deleted file mode 100644 index bbdee2894..000000000 --- a/test/testfiles/oac/98-1.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - -Check #98 - Positive - - - - -

            Everyone loves QUAIL.

            - - - - - - - - - diff --git a/test/testfiles/oac/98-2.html b/test/testfiles/oac/98-2.html deleted file mode 100644 index 0503c5334..000000000 --- a/test/testfiles/oac/98-2.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - - -Check #98 - Positive - - - -
            -

            hello

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/98-3.html b/test/testfiles/oac/98-3.html deleted file mode 100644 index dea16d729..000000000 --- a/test/testfiles/oac/98-3.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #98 - Negative - - - -
            - -

            Everyone loves QUAIL.

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/98-4.html b/test/testfiles/oac/98-4.html deleted file mode 100644 index f10f1180e..000000000 --- a/test/testfiles/oac/98-4.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #98 - Negative - - - -
            - -

            This might be A acronym.

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/99-1.html b/test/testfiles/oac/99-1.html deleted file mode 100644 index 96e4770cb..000000000 --- a/test/testfiles/oac/99-1.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - -Check #99 - Positive - - - - -

            Everyone loves QUAIL.

            - - - - - - - - - diff --git a/test/testfiles/oac/99-2.html b/test/testfiles/oac/99-2.html deleted file mode 100644 index 01f060c0e..000000000 --- a/test/testfiles/oac/99-2.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - -Check #99 - Negative - - - - -
            -

            Hi

            -
            - - - - - - - - - diff --git a/test/testfiles/oac/alternative1.html b/test/testfiles/oac/alternative1.html deleted file mode 100644 index 54681c1c4..000000000 --- a/test/testfiles/oac/alternative1.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - -Text Alternative For Gunfight Movie (Poor) - - - - -

            This movie shows a gunfight.

            - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/alternative2.html b/test/testfiles/oac/alternative2.html deleted file mode 100644 index 6080e9392..000000000 --- a/test/testfiles/oac/alternative2.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - -Text Alternative For Gunfight Movie (Good) - - - - -

            Harmonica sounds play softly in the background. The setting is a small dusty town in the wild -west days. The opening shot is the main street of the town under the bright noon sun. The harmonica sounds stop and only the wind can be heard softly. A tall man dressed all in black wearing -a black hat stands at the far end of the street. The shot changes to a closeup of the man's emotionless face. He spits tobacco juice on the ground but leaves some brown liquid dripping down his chin. He slowly speaks the words "It's about time now sheriff".

            - - - - - - - - \ No newline at end of file diff --git a/test/testfiles/oac/fish1.html b/test/testfiles/oac/fish1.html deleted file mode 100644 index cbb417fc7..000000000 --- a/test/testfiles/oac/fish1.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - -Movement Using Animated GIF - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/fish2.html b/test/testfiles/oac/fish2.html deleted file mode 100644 index 61fe0cf2a..000000000 --- a/test/testfiles/oac/fish2.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - -No Movement, Static GIF - - - - - - - - - - - - - - diff --git a/test/testfiles/oac/rex.html b/test/testfiles/oac/rex.html deleted file mode 100644 index fb5f65d72..000000000 --- a/test/testfiles/oac/rex.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - -Photo Of Rex - - - - - -

            Photo of a brown and black cat named Rex.

            - - - - - - - - - - diff --git a/test/testfiles/quail/aLinksNotSeparatedBySymbols-fail.html b/test/testfiles/quail/aLinksNotSeparatedBySymbols-fail.html new file mode 100644 index 000000000..ce6e5f993 --- /dev/null +++ b/test/testfiles/quail/aLinksNotSeparatedBySymbols-fail.html @@ -0,0 +1,26 @@ + + + + + aLinksNotSeparatedBySymbols-fail + + + + +dogs | cats * birds | + snakes + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/quail/aLinksNotSeparatedBySymbols-pass.html b/test/testfiles/quail/aLinksNotSeparatedBySymbols-pass.html new file mode 100644 index 000000000..53cfb2455 --- /dev/null +++ b/test/testfiles/quail/aLinksNotSeparatedBySymbols-pass.html @@ -0,0 +1,26 @@ + + + + + aLinksNotSeparatedBySymbols-pass + + + + +dogs cats text birds more + text snakes + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/quail/acronymTestsDontFailForOtherTags-fail.html b/test/testfiles/quail/acronymTestsDontFailForOtherTags-fail.html new file mode 100644 index 000000000..66fb3d7b1 --- /dev/null +++ b/test/testfiles/quail/acronymTestsDontFailForOtherTags-fail.html @@ -0,0 +1,29 @@ + + + + + acronymTestsDontFailForOtherTags-fail + + + + +
            +

            Everyone loves QUAIL and AAAA.

            +
            + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/quail/acronymTestsDontFailForOtherTags-pass.html b/test/testfiles/quail/acronymTestsDontFailForOtherTags-pass.html new file mode 100644 index 000000000..3f950d1eb --- /dev/null +++ b/test/testfiles/quail/acronymTestsDontFailForOtherTags-pass.html @@ -0,0 +1,30 @@ + + + + + acronymTestsDontFailForOtherTags-pass + + + + +
            +

            Everyone loves QUAIL and + AAAA.

            +
            + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/quail/ariaOrphanedContent-fail.html b/test/testfiles/quail/ariaOrphanedContent-fail.html index a3b31eb85..e31239916 100644 --- a/test/testfiles/quail/ariaOrphanedContent-fail.html +++ b/test/testfiles/quail/ariaOrphanedContent-fail.html @@ -1,22 +1,24 @@ - - - Pages using aria role do not contain orphaned conent - Fail - - -

            This is a paragraph.

            -
            This is a footer
            - - - - - - - - + + + + Pages using aria role do not contain orphaned conent - Fail + + + +

            This is a paragraph.

            +
            This is a footer
            + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/quail/ariaOrphanedContent-pass.html b/test/testfiles/quail/ariaOrphanedContent-pass.html index 48cb70301..6cbfe343b 100644 --- a/test/testfiles/quail/ariaOrphanedContent-pass.html +++ b/test/testfiles/quail/ariaOrphanedContent-pass.html @@ -1,25 +1,26 @@ - - - Pages using aria role do not contain orphaned conent - Fail - - -
            + + + + Pages using aria role do not contain orphaned conent - Fail + + + +
            +
            This is a header
            +
            This is a footer
            +
            + + + + + + -
            This is a header
            -
            This is a footer
            -
            - - - - - - - - + \ No newline at end of file diff --git a/test/testfiles/quail/cssTextHasContrast-fail.html b/test/testfiles/quail/cssTextHasContrast-fail.html index a513104ea..cb96d937d 100644 --- a/test/testfiles/quail/cssTextHasContrast-fail.html +++ b/test/testfiles/quail/cssTextHasContrast-fail.html @@ -1,40 +1,38 @@ - - Text has appropriate contrast - pass - - + + + +
            +

            This is some text that I have put into this paragraph, but this is OK.

            +

            This text contrast is OK

            +
            + + + + + + - p strong { - color: #C8D8DF; - } - - - -
            -

            - This is some text that I have put into this paragraph, but this is OK. -

            - -

            - This text contrast is OK -

            -
            - - - - - - - - - + \ No newline at end of file diff --git a/test/testfiles/quail/cssTextHasContrast-pass.html b/test/testfiles/quail/cssTextHasContrast-pass.html index 232701544..489a42719 100644 --- a/test/testfiles/quail/cssTextHasContrast-pass.html +++ b/test/testfiles/quail/cssTextHasContrast-pass.html @@ -1,40 +1,38 @@ - - Text has appropriate contrast - pass - - + + + +
            +

            This is some text that I have put into this paragraph.

            +

            This text contrast is OK

            +
            + + + + + + - p strong { - color: #000; - } - - - -
            -

            - This is some text that I have put into this paragraph. -

            - -

            - This text contrast is OK -

            -
            - - - - - - - - - + \ No newline at end of file diff --git a/test/testfiles/quail/customTest.html b/test/testfiles/quail/customTest.html index 7a1ac24f2..1e6e1a932 100644 --- a/test/testfiles/quail/customTest.html +++ b/test/testfiles/quail/customTest.html @@ -1,53 +1,52 @@ - - - Adding custom tests to QUAIL - - -
            -

            - This is a paragraph. -

            -

            - This is a paragraph we are testing for. -

            -

            Heading!

            -
            - - - - - - - - + + + + Adding custom tests to QUAIL + + + +
            +

            This is a paragraph.

            +

            This is a paragraph we are testing for.

            +

            Heading!

            + +
            + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/quail/documentIsWrittenClearly-fail.html b/test/testfiles/quail/documentIsWrittenClearly-fail.html index ba398e066..4730c3228 100644 --- a/test/testfiles/quail/documentIsWrittenClearly-fail.html +++ b/test/testfiles/quail/documentIsWrittenClearly-fail.html @@ -1,23 +1,50 @@ - - - Document is written to no more than a 9.9 grade level - Fail - - -
            -

            Objectively disintermediate B2B action items vis-a-vis backward-compatible methods of empowerment. Dynamically disseminate just in time growth strategies after scalable convergence. Continually mesh wireless value through tactical initiatives. Progressively leverage existing one-to-one process improvements whereas corporate niches. Authoritatively aggregate superior products without progressive content. Credibly provide access to high-payoff deliverables with highly efficient vortals. Authoritatively revolutionize interoperable internal or "organic" sources before visionary partnerships. Seamlessly formulate global initiatives without cross functional applications. Authoritatively expedite collaborative markets rather than maintainable methodologies. Progressively parallel task market-driven expertise for emerging initiatives. Completely administrate value-added process improvements via reliable web services. Authoritatively underwhelm functional mindshare via distinctive partnerships. Competently initiate customer directed relationships after future-proof initiatives. Professionally revolutionize low-risk high-yield opportunities for frictionless e-commerce. Intrinsicly visualize wireless total linkage and collaborative data. Credibly unleash parallel growth strategies before business partnerships. Energistically extend principle-centered mindshare for team building initiatives. Monotonectally pursue 24/7 supply chains after stand-alone manufactured products. Synergistically maintain clicks-and-mortar information through innovative convergence. Dramatically deploy plug-and-play platforms after orthogonal scenarios. Energistically supply customized benefits with parallel potentialities. Collaboratively initiate prospective vortals rather than stand-alone deliverables. Energistically parallel task leading-edge methodologies after one-to-one bandwidth. Globally extend emerging communities and mission-critical ROI.

            -
            - - - - - - - - + + + + Document is written to no more than a 9.9 grade level - Fail + + + +
            +

            Objectively disintermediate B2B action items vis-a-vis backward-compatible + methods of empowerment. Dynamically disseminate just in time growth strategies + after scalable convergence. Continually mesh wireless value through tactical + initiatives. Progressively leverage existing one-to-one process improvements + whereas corporate niches. Authoritatively aggregate superior products without + progressive content. Credibly provide access to high-payoff deliverables + with highly efficient vortals. Authoritatively revolutionize interoperable + internal or "organic" sources before visionary partnerships. Seamlessly + formulate global initiatives without cross functional applications. Authoritatively + expedite collaborative markets rather than maintainable methodologies. + Progressively parallel task market-driven expertise for emerging initiatives. + Completely administrate value-added process improvements + via reliable web services. Authoritatively underwhelm functional mindshare + via distinctive partnerships. Competently initiate customer directed relationships + after future-proof initiatives. Professionally revolutionize low-risk high-yield + opportunities for frictionless e-commerce. Intrinsicly visualize wireless + total linkage and collaborative data. Credibly unleash parallel growth + strategies before business partnerships. Energistically extend principle-centered + mindshare for team building initiatives. Monotonectally pursue 24/7 supply + chains after stand-alone manufactured products. Synergistically maintain + clicks-and-mortar information through innovative convergence. Dramatically + deploy plug-and-play platforms after orthogonal scenarios. Energistically + supply customized benefits with parallel potentialities. Collaboratively + initiate prospective vortals rather than stand-alone deliverables. Energistically + parallel task leading-edge methodologies after one-to-one bandwidth. Globally + extend emerging communities and mission-critical ROI.

            +
            + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/quail/documentIsWrittenClearly-pass-2.html b/test/testfiles/quail/documentIsWrittenClearly-pass-2.html index aaa06c030..4caf3eb83 100644 --- a/test/testfiles/quail/documentIsWrittenClearly-pass-2.html +++ b/test/testfiles/quail/documentIsWrittenClearly-pass-2.html @@ -1,23 +1,26 @@ - - - Document is written to no more than a 9.9 grade level - Pass - - -
            -

            The quick brown fox jumped over the lazy dogs.

            -
            - - - - - - - - + + + + Document is written to no more than a 9.9 grade level - Pass + + + +
            +

            The quick brown fox jumped over the lazy dogs.

            +
            + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/quail/documentIsWrittenClearly-pass.html b/test/testfiles/quail/documentIsWrittenClearly-pass.html index 280c45486..31ba431b2 100644 --- a/test/testfiles/quail/documentIsWrittenClearly-pass.html +++ b/test/testfiles/quail/documentIsWrittenClearly-pass.html @@ -1,23 +1,29 @@ - - - Document is written to no more than a 9.9 grade level - Pass - - -
            -

            The quick brown fox jumped over the lazy dogs. The quick brown fox jumped over the lazy dogs. The quick brown fox jumped over the lazy dogs. The quick brown fox jumped over the lazy dogs. The quick brown fox jumped over the lazy dogs. The quick brown fox jumped over the lazy dogs.

            -
            - - - - - - - - + + + + Document is written to no more than a 9.9 grade level - Pass + + + +
            +

            The quick brown fox jumped over the lazy dogs. The quick brown fox jumped + over the lazy dogs. The quick brown fox jumped over the lazy dogs. The + quick brown fox jumped over the lazy dogs. The quick brown fox jumped over + the lazy dogs. The quick brown fox jumped over the lazy dogs.

            +
            + + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/quail/eventComplete.html b/test/testfiles/quail/eventComplete.html index 7986deff0..005fd736c 100644 --- a/test/testfiles/quail/eventComplete.html +++ b/test/testfiles/quail/eventComplete.html @@ -1,41 +1,46 @@ - + - - -Test that QUAIL calls events correctly - - - + + + + Test that QUAIL calls events correctly + + + + +

            + +

            + + + + + + + -

            - - - - - - - - + \ No newline at end of file diff --git a/test/testfiles/quail/eventTester.html b/test/testfiles/quail/eventTester.html index a09177064..efbfd6130 100644 --- a/test/testfiles/quail/eventTester.html +++ b/test/testfiles/quail/eventTester.html @@ -1,41 +1,46 @@ - + - - -Test that QUAIL calls events correctly - - - + + + + Test that QUAIL calls events correctly + + + + +

            + +

            + + + + + + + -

            - - - - - - - - + \ No newline at end of file diff --git a/test/testfiles/quail/guidelineFallback.html b/test/testfiles/quail/guidelineFallback.html index 5e64834ce..7699a00d6 100644 --- a/test/testfiles/quail/guidelineFallback.html +++ b/test/testfiles/quail/guidelineFallback.html @@ -1,34 +1,35 @@ - - - Adding custom tests to QUAIL - - -
            -

            - This is a paragraph. -

            -

            - This is a paragraph we are testing for. -

            -

            Heading!

            -
            - - - - - - - - +
            + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/quail/guidelineLoading.html b/test/testfiles/quail/guidelineLoading.html index 56e260e83..ffd61aa6a 100644 --- a/test/testfiles/quail/guidelineLoading.html +++ b/test/testfiles/quail/guidelineLoading.html @@ -1,41 +1,46 @@ - + - - -Test that QUAIL loads guidelines dynamically - - - + + + + Test that QUAIL loads guidelines dynamically + + + + +

            + +

            + + + + + + + -

            - - - - - - - - + \ No newline at end of file diff --git a/test/testfiles/quail/headersHaveText-fail.html b/test/testfiles/quail/headersHaveText-fail.html index 011a2034d..8e3052d23 100644 --- a/test/testfiles/quail/headersHaveText-fail.html +++ b/test/testfiles/quail/headersHaveText-fail.html @@ -1,27 +1,35 @@ - - Header has text - Fail - - - -
            + + + Header has text - Fail + + + + +
            +

            This is a correct header

            -

            This is a correct header

            -

            Intrinsicly actualize web-enabled users and cross functional growth strategies. Monotonectally simplify B2B opportunities vis-a-vis top-line processes.

            -

            -

            Globally synergize ethical process improvements before go forward technology. Synergistically seize backward-compatible quality vectors through magnetic sources. Distinctively reintermediate virtual "outside the box" thinking without market positioning supply chains.

            -
            - - - - - - - - +

            Intrinsicly actualize web-enabled users and cross functional growth strategies. + Monotonectally simplify B2B opportunities vis-a-vis top-line processes.

            +

            + +

            Globally synergize ethical process improvements before go forward technology. + Synergistically seize backward-compatible quality vectors through magnetic + sources. Distinctively reintermediate virtual "outside the box" thinking + without market positioning supply chains.

            +
            + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/quail/headersHaveText-fail2.html b/test/testfiles/quail/headersHaveText-fail2.html index 9c0b57e4b..c6e938764 100644 --- a/test/testfiles/quail/headersHaveText-fail2.html +++ b/test/testfiles/quail/headersHaveText-fail2.html @@ -1,28 +1,35 @@ - - Header has text - Fail - - - -
            + + + Header has text - Fail + + + + +
            +

            This is a correct header

            -

            This is a correct header

            -

            Intrinsicly actualize web-enabled users and cross functional growth strategies. Monotonectally simplify B2B opportunities vis-a-vis top-line processes.

            -

            -

            Globally synergize ethical process improvements before go forward technology. Synergistically seize backward-compatible quality vectors through magnetic sources. Distinctively reintermediate virtual "outside the box" thinking without market positioning supply chains.

            -
            - - - - - - +

            Intrinsicly actualize web-enabled users and cross functional growth strategies. + Monotonectally simplify B2B opportunities vis-a-vis top-line processes.

            +

            - - +

            Globally synergize ethical process improvements before go forward technology. + Synergistically seize backward-compatible quality vectors through magnetic + sources. Distinctively reintermediate virtual "outside the box" thinking + without market positioning supply chains.

            +
            + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/quail/headersHaveText-pass.html b/test/testfiles/quail/headersHaveText-pass.html index b332aaf51..3a913f6b2 100644 --- a/test/testfiles/quail/headersHaveText-pass.html +++ b/test/testfiles/quail/headersHaveText-pass.html @@ -1,28 +1,35 @@ - - Header has text - Fail - - - + + + Header has text - Fail + + + + +
            +

            This is a correct header

            -
            -

            This is a correct header

            -

            Intrinsicly actualize web-enabled users and cross functional growth strategies. Monotonectally simplify B2B opportunities vis-a-vis top-line processes.

            -

            This header is also OK.

            -

            Globally synergize ethical process improvements before go forward technology. Synergistically seize backward-compatible quality vectors through magnetic sources. Distinctively reintermediate virtual "outside the box" thinking without market positioning supply chains.

            -
            - - - - - - +

            Intrinsicly actualize web-enabled users and cross functional growth strategies. + Monotonectally simplify B2B opportunities vis-a-vis top-line processes.

            +

            This header is also OK.

            - - +

            Globally synergize ethical process improvements before go forward technology. + Synergistically seize backward-compatible quality vectors through magnetic + sources. Distinctively reintermediate virtual "outside the box" thinking + without market positioning supply chains.

            +
            + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/quail/imgAltTextNotRedundant-fail.html b/test/testfiles/quail/imgAltTextNotRedundant-fail.html index bfcebd6d9..f1061584e 100644 --- a/test/testfiles/quail/imgAltTextNotRedundant-fail.html +++ b/test/testfiles/quail/imgAltTextNotRedundant-fail.html @@ -1,26 +1,27 @@ - - Image alt attributes are not redundant unless the image files are the same - fail - - - -
            -

            -
              -
              test markup, will be hidden
              - this is an image of rex - this is an image of rex - - - - - - - - + + + Image alt attributes are not redundant unless the image files are the + same - fail + + + + + + this is an image of rex + this is an image of rex + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/quail/imgAltTextNotRedundant-pass.html b/test/testfiles/quail/imgAltTextNotRedundant-pass.html index de0dbf68c..7946289ac 100644 --- a/test/testfiles/quail/imgAltTextNotRedundant-pass.html +++ b/test/testfiles/quail/imgAltTextNotRedundant-pass.html @@ -1,26 +1,27 @@ - - Image alt attributes are not redundant unless the image files are the same - pass - - - -
              -

              -
                -
                test markup, will be hidden
                - this is an image of rex - this is an image of rex - - - - - - - - + + + Image alt attributes are not redundant unless the image files are the + same - pass + + + + + + this is an image of rex + this is an image of rex + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/quail/labelsAreAssignedToAnInput-fail.html b/test/testfiles/quail/labelsAreAssignedToAnInput-fail.html index 4593adf0f..4de71154a 100644 --- a/test/testfiles/quail/labelsAreAssignedToAnInput-fail.html +++ b/test/testfiles/quail/labelsAreAssignedToAnInput-fail.html @@ -1,31 +1,29 @@ - - All labels have an input item - pass - - - -
                -

                -
                  -
                  test markup, will be hidden
                  + + + All labels have an input item - pass + + + + -
                  - - - -
                  - - - - - - +
                  + + + +
                  + + + + + + - - + \ No newline at end of file diff --git a/test/testfiles/quail/labelsAreAssignedToAnInput-fail2.html b/test/testfiles/quail/labelsAreAssignedToAnInput-fail2.html index 0e3c62d16..d31f1d67a 100644 --- a/test/testfiles/quail/labelsAreAssignedToAnInput-fail2.html +++ b/test/testfiles/quail/labelsAreAssignedToAnInput-fail2.html @@ -1,31 +1,29 @@ - - All labels have an input item - pass - - - -
                  -

                  -
                    -
                    test markup, will be hidden
                    + + + All labels have an input item - pass + + + + -
                    - - - -
                    - - - - - - +
                    + + + +
                    + + + + + + - - + \ No newline at end of file diff --git a/test/testfiles/quail/labelsAreAssignedToAnInput-fail3.html b/test/testfiles/quail/labelsAreAssignedToAnInput-fail3.html index aabbbb973..645e2f040 100644 --- a/test/testfiles/quail/labelsAreAssignedToAnInput-fail3.html +++ b/test/testfiles/quail/labelsAreAssignedToAnInput-fail3.html @@ -1,32 +1,30 @@ - - All labels have an input item - pass - - - -
                    -

                    -
                      -
                      test markup, will be hidden
                      + + + All labels have an input item - pass + + + + -
                      - - - -

                      Wow, wrong thing

                      -
                      - - - - - - +
                      + + + +

                      Wow, wrong thing

                      +
                      + + + + + + - - + \ No newline at end of file diff --git a/test/testfiles/quail/labelsAreAssignedToAnInput-pass.html b/test/testfiles/quail/labelsAreAssignedToAnInput-pass.html index 770faea22..d2f7e3336 100644 --- a/test/testfiles/quail/labelsAreAssignedToAnInput-pass.html +++ b/test/testfiles/quail/labelsAreAssignedToAnInput-pass.html @@ -1,30 +1,28 @@ - - All labels have an input item - pass - - - -
                      -

                      -
                        -
                        test markup, will be hidden
                        + + + All labels have an input item - pass + + + + -
                        - - -
                        - - - - - - +
                        + + +
                        + + + + + + - - + \ No newline at end of file diff --git a/test/testfiles/quail/liDontUseImageForBullet-fail.html b/test/testfiles/quail/liDontUseImageForBullet-fail.html index e8a2a98da..1d62273bd 100644 --- a/test/testfiles/quail/liDontUseImageForBullet-fail.html +++ b/test/testfiles/quail/liDontUseImageForBullet-fail.html @@ -1,30 +1,36 @@ - + - - -List items don't use images for bullets - Check #1 - Positive - - - + + + + List items don't use images for bullets - Check #1 - Positive + + + + +

                        +

                          +
                        • + This is item one
                        • +
                        • + This is item two
                        • +
                        • + This is item three
                        • +
                        +

                        + + + + + + + -

                        -

                          -
                        • This is item one
                        • -
                        • This is item two
                        • -
                        • This is item three
                        • -
                        -

                        - - - - - - - - + \ No newline at end of file diff --git a/test/testfiles/quail/liDontUseImageForBullet-pass.html b/test/testfiles/quail/liDontUseImageForBullet-pass.html index ed649762f..66fe74076 100644 --- a/test/testfiles/quail/liDontUseImageForBullet-pass.html +++ b/test/testfiles/quail/liDontUseImageForBullet-pass.html @@ -1,30 +1,33 @@ - + - - -List items don't use images for bullets - Check #1 - Negative - - - + + + + List items don't use images for bullets - Check #1 - Negative + + + + +

                        +

                          +
                        • This is item one
                        • +
                        • This is item two
                        • +
                        • This is item three
                        • +
                        +

                        + + + + + + + -

                        -

                          -
                        • This is item one
                        • -
                        • This is item two
                        • -
                        • This is item three
                        • -
                        -

                        - - - - - - - - + \ No newline at end of file diff --git a/test/testfiles/quail/preFilter.html b/test/testfiles/quail/preFilter.html index 440be3001..be0c5f9ac 100644 --- a/test/testfiles/quail/preFilter.html +++ b/test/testfiles/quail/preFilter.html @@ -1,45 +1,48 @@ - - - Adding custom tests to QUAIL - - -
                        -

                        This is an image .

                        -
                        - - - - - - + + + + + - }, - complete : function(results) { - testResults = results.results; - }}); - equal(1, testResults.imgHasAlt.length, 'Image was found.'); - - $('.test-area').quail({ jsonPath : '../../../src/resources', - guideline : [ 'imgHasAlt' ], - reset : true, - preFilter : function(testName, element) { - if(element.get(0).tagName == 'IMG') { - return false; - } - }, - complete : function(results) { - testResults = results.results; - }}); - equal(0, testResults.imgHasAlt.length, 'Image was filtered out.'); -}); - - - + \ No newline at end of file diff --git a/test/testfiles/quail/selectJumpMenus-fail.html b/test/testfiles/quail/selectJumpMenus-fail.html index ad8a0184f..f0f345ce0 100644 --- a/test/testfiles/quail/selectJumpMenus-fail.html +++ b/test/testfiles/quail/selectJumpMenus-fail.html @@ -1,31 +1,29 @@ - - no select jump menus - fail - - - -
                        -

                        -
                          -
                          test markup, will be hidden
                          + + + no select jump menus - fail + + + + +
                          + +
                          + + + + + + -
                          - -
                          - - - - - - - - + \ No newline at end of file diff --git a/test/testfiles/quail/selectJumpMenus-pass.html b/test/testfiles/quail/selectJumpMenus-pass.html index 22dbf553f..cb43d0bcd 100644 --- a/test/testfiles/quail/selectJumpMenus-pass.html +++ b/test/testfiles/quail/selectJumpMenus-pass.html @@ -1,32 +1,31 @@ - - no select jump menus - pass - - - -
                          -

                          -
                            -
                            test markup, will be hidden
                            + + + no select jump menus - pass + + + + -
                            - - -
                            - - - - - - - - +
                            + + +
                            + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/quail/svgContainsTitle-fail.html b/test/testfiles/quail/svgContainsTitle-fail.html index 19c934ce4..2bef55c8e 100644 --- a/test/testfiles/quail/svgContainsTitle-fail.html +++ b/test/testfiles/quail/svgContainsTitle-fail.html @@ -1,36 +1,34 @@ - - SVG Contains Title - Fail - - - -
                            -

                            -
                              -
                              test markup, will be hidden
                              + + + SVG Contains Title - Fail + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/test/testfiles/quail/svgContainsTitle-pass.html b/test/testfiles/quail/svgContainsTitle-pass.html index 6ccd8e9f6..72ab809df 100644 --- a/test/testfiles/quail/svgContainsTitle-pass.html +++ b/test/testfiles/quail/svgContainsTitle-pass.html @@ -1,38 +1,35 @@ - - SVG Contains Title - Pass - - - -
                              -

                              -
                                -
                                test markup, will be hidden
                                - - - An example SVG file - - - - - - - + + + SVG Contains Title - Pass + + + + + + An example SVG file + + + + + + + + + + + + + - - - - - - - - - + \ No newline at end of file diff --git a/test/testfiles/quail/tableNotUsedForLayout-fail.html b/test/testfiles/quail/tableNotUsedForLayout-fail.html index 2b9e870c3..f9809fc20 100644 --- a/test/testfiles/quail/tableNotUsedForLayout-fail.html +++ b/test/testfiles/quail/tableNotUsedForLayout-fail.html @@ -1,33 +1,29 @@ - - SVG Contains Title - Pass - - - -
                                -

                                -
                                  -
                                  test markup, will be hidden
                                  - - - - - - -
                                  This is the content area of my tableThis is a sidebar
                                  + + + SVG Contains Title - Pass + + + + + + + + + +
                                  This is the content area of my tableThis is a sidebar
                                  + + + + + + - - - - - - - - - + \ No newline at end of file diff --git a/test/testfiles/quail/tableNotUsedForLayout-fail2.html b/test/testfiles/quail/tableNotUsedForLayout-fail2.html index 3e57b2662..ab40d2fc9 100644 --- a/test/testfiles/quail/tableNotUsedForLayout-fail2.html +++ b/test/testfiles/quail/tableNotUsedForLayout-fail2.html @@ -1,48 +1,41 @@ - - SVG Contains Title - Pass - - - -
                                  -

                                  -
                                    -
                                    test markup, will be hidden
                                    - + + + SVG Contains Title - Pass + + + + + + + + + + + + + + + +
                                    This would be a sidebar. + + + + +
                                    This is a content area given some border through a table.
                                    +
                                    This is a footer.
                                    This is another footer.
                                    + + + + + + - - - - - - - - - - - -
                                    This would be a sidebar. - - - - -
                                    - This is a content area given some border through a table. -
                                    -
                                    This is a footer.
                                    This is another footer.
                                    - - - - - - - - - - + \ No newline at end of file diff --git a/test/testfiles/quail/tableNotUsedForLayout-pass.html b/test/testfiles/quail/tableNotUsedForLayout-pass.html index 2290bb6bb..ed5583106 100644 --- a/test/testfiles/quail/tableNotUsedForLayout-pass.html +++ b/test/testfiles/quail/tableNotUsedForLayout-pass.html @@ -1,45 +1,41 @@ - - SVG Contains Title - Pass - - - -
                                    -

                                    -
                                      -
                                      test markup, will be hidden
                                      - - - - - - - - - - - - - - - - - - -
                                      Head oneHead two
                                      Item OneItem two
                                      Item OneItem two
                                      + + + SVG Contains Title - Pass + + + + + + + + + + + + + + + + + + + + + +
                                      Head oneHead two
                                      Item OneItem two
                                      Item OneItem two
                                      + + + + + + - - - - - - - - - + \ No newline at end of file diff --git a/test/testfiles/quail/tableUsesScopeForRow-fail.html b/test/testfiles/quail/tableUsesScopeForRow-fail.html index da40236cd..0ec36f112 100644 --- a/test/testfiles/quail/tableUsesScopeForRow-fail.html +++ b/test/testfiles/quail/tableUsesScopeForRow-fail.html @@ -1,46 +1,47 @@ - - Table uses scope for row headers - Fail - - - -
                                      -

                                      -
                                        -
                                        test markup, will be hidden
                                        - - - - - - - - - - - - - - - - - - - - -
                                        Should be scopedItem twoItem three
                                        Row one12
                                        Row two12
                                        + + + Table uses scope for row headers - Fail + + + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + +
                                        Should be scopedItem twoItem three
                                        Row one + 12
                                        Row two + 12
                                        + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/quail/tableUsesScopeForRow-fail2.html b/test/testfiles/quail/tableUsesScopeForRow-fail2.html index 6e7eac424..419398a18 100644 --- a/test/testfiles/quail/tableUsesScopeForRow-fail2.html +++ b/test/testfiles/quail/tableUsesScopeForRow-fail2.html @@ -1,46 +1,47 @@ - - Table uses scope for row headers - Fail - - - -
                                        -

                                        -
                                          -
                                          test markup, will be hidden
                                          - - - - - - - - - - - - - - - - - - - - -
                                          Should be scopedItem twoItem three
                                          12Row one
                                          12Row two
                                          + + + Table uses scope for row headers - Fail + + + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + +
                                          Should be scopedItem twoItem three
                                          12Row one +
                                          12Row two +
                                          + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/quail/tableUsesScopeForRow-pass.html b/test/testfiles/quail/tableUsesScopeForRow-pass.html index 42916793d..4c2345a46 100644 --- a/test/testfiles/quail/tableUsesScopeForRow-pass.html +++ b/test/testfiles/quail/tableUsesScopeForRow-pass.html @@ -1,46 +1,46 @@ - - Table uses scope for row headers - Fail - - - -
                                          -

                                          -
                                            -
                                            test markup, will be hidden
                                            - - - - - - - - - - - - - - - - - - - - -
                                            Should be scopedItem twoItem three
                                            Row one12
                                            Row two12
                                            + + + Table uses scope for row headers - Fail + + + + - - - - - - - - + + + + + + + + + + + + + + + + + + + + +
                                            Should be scopedItem twoItem three
                                            Row one + 12
                                            Row two12
                                            + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/quail/testConfiguration.html b/test/testfiles/quail/testConfiguration.html new file mode 100644 index 000000000..e8094e4fd --- /dev/null +++ b/test/testfiles/quail/testConfiguration.html @@ -0,0 +1,68 @@ + + + + + testConfiguration + + + + +
                                            +

                                            This is a paragraph with a strong element and an emphasis element.

                                            +
                                            + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/quail/textIsNotSmall-fail.html b/test/testfiles/quail/textIsNotSmall-fail.html index f916a11b4..9fb0017b7 100644 --- a/test/testfiles/quail/textIsNotSmall-fail.html +++ b/test/testfiles/quail/textIsNotSmall-fail.html @@ -1,27 +1,25 @@ - - Text size is not too small - fail - - - -
                                            -

                                            -
                                              -
                                              test markup, will be hidden
                                              -

                                              - This text is fine. -

                                              - - - - - - - - + + + Text size is not too small - fail + + + + + +

                                              This text is fine.

                                              + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/quail/textIsNotSmall-fail2.html b/test/testfiles/quail/textIsNotSmall-fail2.html index a4f49e9cd..1d061add0 100644 --- a/test/testfiles/quail/textIsNotSmall-fail2.html +++ b/test/testfiles/quail/textIsNotSmall-fail2.html @@ -1,35 +1,30 @@ - + + + Text size is not too small - fail + + + + + + - Text size is not too small - fail - - - - - -
                                              -

                                              -
                                                -
                                                test markup, will be hidden
                                                -

                                                - This text is too small. -

                                                - - - - - - - + \ No newline at end of file diff --git a/test/testfiles/quail/textIsNotSmall-pass.html b/test/testfiles/quail/textIsNotSmall-pass.html index d4af23fff..4519a7f81 100644 --- a/test/testfiles/quail/textIsNotSmall-pass.html +++ b/test/testfiles/quail/textIsNotSmall-pass.html @@ -1,28 +1,25 @@ - - Text size is not too small - pass - - - -
                                                -

                                                -
                                                  -
                                                  test markup, will be hidden
                                                  -

                                                  - This text is fine. -

                                                  - - - - - - + + + Text size is not too small - pass + + + + + +

                                                  This text is fine.

                                                  + + + + + + - - + \ No newline at end of file diff --git a/test/testfiles/quail/videosEmbeddedOrLinkedNeedCaptions-fail.html b/test/testfiles/quail/videosEmbeddedOrLinkedNeedCaptions-fail.html index b3ef71031..5d22cc963 100644 --- a/test/testfiles/quail/videosEmbeddedOrLinkedNeedCaptions-fail.html +++ b/test/testfiles/quail/videosEmbeddedOrLinkedNeedCaptions-fail.html @@ -1,25 +1,26 @@ - - Vide links are captioned - Fail - - - -
                                                  -

                                                  -
                                                    -
                                                    test markup, will be hidden
                                                    -

                                                    Hey, check Out this awesome video.

                                                    - - - - - - - - + + + Video links are captioned - Fail + + + + + +

                                                    Hey, check Out this awesome video. +

                                                    + + + + + + + + \ No newline at end of file diff --git a/test/testfiles/quail/videosEmbeddedOrLinkedNeedCaptions-pass.html b/test/testfiles/quail/videosEmbeddedOrLinkedNeedCaptions-pass.html index b3e9c3571..90003c6fd 100644 --- a/test/testfiles/quail/videosEmbeddedOrLinkedNeedCaptions-pass.html +++ b/test/testfiles/quail/videosEmbeddedOrLinkedNeedCaptions-pass.html @@ -1,26 +1,28 @@ - - Vide links are captioned - Pass - - - -
                                                    -

                                                    -
                                                      -
                                                      test markup, will be hidden
                                                      -

                                                      Hey, check Out this awesome video.

                                                      -

                                                      There's also another link to throw you off.

                                                      - - - - - - - - + + + Video links are captioned - Pass + + + + + +

                                                      Hey, check Out this awesome video. +

                                                      +

                                                      There's also another link to throw you off. +

                                                      + + + + + + + + \ No newline at end of file diff --git a/utilities/testToTest.php b/utilities/testToTest.php deleted file mode 100644 index 4a953d664..000000000 --- a/utilities/testToTest.php +++ /dev/null @@ -1,25 +0,0 @@ -\w+)\',/i", $contents, $test_name); - if($test_name['name']) { - $tests[$test_number] = $test_name['name']; - } -} -ksort($tests); -print "|_. OAC Number |_. QUAIL Test | \n"; -foreach($tests as $number => $name) { - print "| ". $number . "| " . $name ."|\n"; -} \ No newline at end of file