| /* |
| * Copyright (C) 2007-2018 Diego Perini |
| * All rights reserved. |
| * |
| * this is just a small example to show |
| * how an extension for NWMatcher could be |
| * adapted to handle WebForms/HTML5 selectors |
| * |
| * Pseudo Selectors |
| * :default, :indeterminate, :optional, :required, |
| * :valid, :invalid, :in-range, :out-of-range, |
| * :read-only, :read-write |
| * :has, :matches (not yet in a defined specification) |
| * |
| */ |
| |
| // for UI pseudo-classes extensions (WebForms/HTML5) |
| NW.Dom.registerSelector( |
| 'html5:pseudos', |
| /^\:(default|indeterminate|optional|required|valid|invalid|in-range|out-of-range|read-only|read-write)(.*)/, |
| (function(global) { |
| |
| return function(match, source) { |
| |
| var status = true, |
| |
| HTML5PseudoClasses = { |
| 'default': 4, 'indeterminate': 4, 'invalid': 4, 'valid': 4, |
| 'optional': 4, 'required': 4, 'read-write': 4, 'read-only': 4 |
| }; |
| |
| switch (match[1]) { |
| |
| // HTML5 UI element states (form controls) |
| case 'default': |
| // only radio buttons, check boxes and option elements |
| source = 'if(((typeof e.form!=="undefined"&&(/radio|checkbox/i).test(e.type))||/option/i.test(e.nodeName))&&(e.defaultChecked||e.defaultSelected)){' + source + '}'; |
| break; |
| |
| case 'indeterminate': |
| // only radio buttons, check boxes and option elements |
| source = 'if(typeof e.form!=="undefined"&&(/radio|checkbox/i).test(e.type)&&s.select("[checked]",e.form).length===0){' + source + '}'; |
| break; |
| |
| case 'optional': |
| // only fields for which "required" applies |
| source = 'if(typeof e.form!=="undefined"&&typeof e.required!="undefined"&&!e.required){' + source + '}'; |
| break; |
| |
| case 'required': |
| // only fields for which "required" applies |
| source = 'if(typeof e.form!=="undefined"&&typeof e.required!="undefined"&&e.required){' + source + '}'; |
| break; |
| |
| case 'read-write': |
| // only fields for which "readOnly" applies |
| source = 'if(typeof e.form!=="undefined"&&typeof e.readOnly!="undefined"&&!e.readOnly){' + source + '}'; |
| break; |
| |
| case 'read-only': |
| // only fields for which "readOnly" applies |
| source = 'if(typeof e.form!=="undefined"&&typeof e.readOnly!="undefined"&&e.readOnly){' + source + '}'; |
| break; |
| |
| case 'invalid': |
| // only fields for which validity applies |
| source = 'if(typeof e.form!=="undefined"&&typeof e.validity=="object"&&!e.validity.valid){' + source + '}'; |
| break; |
| |
| case 'valid': |
| // only fields for which validity applies |
| source = 'if(typeof e.form!=="undefined"&&typeof e.validity=="object"&&e.validity.valid){' + source + '}'; |
| break; |
| |
| case 'in-range': |
| // only fields for which validity applies |
| source = 'if(typeof e.form!=="undefined"&&' + |
| '(s.getAttribute(e,"min")||s.getAttribute(e,"max"))&&' + |
| 'typeof e.validity=="object"&&!e.validity.typeMismatch&&' + |
| '!e.validity.rangeUnderflow&&!e.validity.rangeOverflow){' + source + '}'; |
| break; |
| |
| case 'out-of-range': |
| // only fields for which validity applies |
| source = 'if(typeof e.form!=="undefined"&&' + |
| '(s.getAttribute(e,"min")||s.getAttribute(e,"max"))&&' + |
| 'typeof e.validity=="object"&&(e.validity.rangeUnderflow||e.validity.rangeOverflow)){' + source + '}'; |
| break; |
| |
| default: |
| status = false; |
| break; |
| |
| } |
| |
| // compiler will add this to "source" |
| return { |
| 'source': source, |
| 'status': status |
| }; |
| |
| }; |
| |
| })(this)); |