1/* global RbsRecaptcha, grecaptcha */ 2 3(function () { 4 var DEBUG = !!(window.RbsRecaptcha && window.RbsRecaptcha.debug); 5 6 function isSubmitControl(el) { 7 if (!el) return false; 8 var tag = (el.tagName || '').toLowerCase(); 9 if (tag === 'button') return (el.type || 'submit') === 'submit'; 10 if (tag === 'input') return (el.type || '').toLowerCase() === 'submit'; 11 return false; 12 } 13 14 function addHiddenSubmitter(form, submitter) { 15 if (!submitter) return null; 16 var name = submitter.getAttribute('name'); 17 if (!name) return null; 18 var value = submitter.getAttribute('value') || submitter.value || ''; 19 20 // Rimuovi eventuale precedente 21 var prev = form.querySelector('[data-rbs-recaptcha-submitter="1"]'); 22 if (prev) prev.remove(); 23 24 var input = document.createElement('input'); 25 input.type = 'hidden'; 26 input.name = name; 27 input.value = value; 28 input.setAttribute('data-rbs-recaptcha-submitter', '1'); 29 form.appendChild(input); 30 return input; 31 } 32 33 function findForms() { 34 return Array.prototype.slice.call( 35 document.querySelectorAll('form') 36 ).filter(function (form) { 37 return form.querySelector('[data-rbs-recaptcha-token]'); 38 }); 39 } 40 41 function ensureCompatTokenInput(form, token) { 42 var compat = form.querySelector('input[data-rbs-recaptcha-compat]'); 43 if (compat) { 44 compat.value = token; 45 } 46 } 47 48 function bindForm(form) { 49 if (form.dataset.rbsRecaptchaBound === '1') return; 50 form.dataset.rbsRecaptchaBound = '1'; 51 52 var lastSubmitter = null; 53 form.addEventListener('click', function (e) { 54 var t = e.target; 55 if (isSubmitControl(t)) { 56 lastSubmitter = t; 57 } else if (t && t.closest) { 58 var btn = t.closest('button, input[type="submit"]'); 59 if (isSubmitControl(btn)) lastSubmitter = btn; 60 } 61 }, true); 62 63 if (DEBUG) { 64 // eslint-disable-next-line no-console 65 console.log('[rbs-recaptcha:v3] bound form', form); 66 } 67 68 form.addEventListener('submit', function (e) { 69 var tokenInput = form.querySelector('[data-rbs-recaptcha-token]'); 70 if (!tokenInput) return; 71 72 var submitter = e.submitter || lastSubmitter; 73 74 // Evita loop: al secondo giro lasciamo proseguire. 75 if (form.dataset.rbsRecaptchaReady === '1' && tokenInput.value) { 76 form.dataset.rbsRecaptchaReady = ''; 77 return; 78 } 79 80 e.preventDefault(); 81 82 if (form.dataset.rbsRecaptchaInProgress === '1') return; 83 form.dataset.rbsRecaptchaInProgress = '1'; 84 85 var action = tokenInput.getAttribute('data-rbs-recaptcha-action') || 'custom'; 86 87 if (DEBUG) { 88 // eslint-disable-next-line no-console 89 console.log('[rbs-recaptcha:v3] submit intercepted', { action: action, hasGrecaptcha: typeof grecaptcha !== 'undefined', submitterName: submitter && submitter.getAttribute ? submitter.getAttribute('name') : null }); 90 } 91 92 if (typeof grecaptcha === 'undefined' || !grecaptcha.execute) { 93 // Se reCAPTCHA non è disponibile lasciamo fallire lato server con messaggio coerente. 94 form.dataset.rbsRecaptchaInProgress = ''; 95 form.dataset.rbsRecaptchaReady = '1'; 96 // Mantieni name/value del bottone submit (WooCommerce si aspetta "register"/"login") 97 addHiddenSubmitter(form, submitter); 98 if (form.requestSubmit && submitter) form.requestSubmit(submitter); 99 else form.submit(); 100 return; 101 } 102 103 grecaptcha.ready(function () { 104 grecaptcha 105 .execute(RbsRecaptcha.siteKey, { action: action }) 106 .then(function (token) { 107 if (DEBUG) { 108 // eslint-disable-next-line no-console 109 console.log('[rbs-recaptcha:v3] token received', { action: action, tokenLen: token ? token.length : 0 }); 110 } 111 tokenInput.value = token; 112 ensureCompatTokenInput(form, token); 113 form.dataset.rbsRecaptchaInProgress = ''; 114 form.dataset.rbsRecaptchaReady = '1'; 115 addHiddenSubmitter(form, submitter); 116 if (form.requestSubmit && submitter) form.requestSubmit(submitter); 117 else form.submit(); 118 }) 119 .catch(function () { 120 if (DEBUG) { 121 // eslint-disable-next-line no-console 122 console.warn('[rbs-recaptcha:v3] grecaptcha.execute failed'); 123 } 124 form.dataset.rbsRecaptchaInProgress = ''; 125 form.dataset.rbsRecaptchaReady = '1'; 126 addHiddenSubmitter(form, submitter); 127 if (form.requestSubmit && submitter) form.requestSubmit(submitter); 128 else form.submit(); 129 }); 130 }); 131 }); 132 } 133 134 function boot() { 135 if (!window.RbsRecaptcha || !RbsRecaptcha.siteKey) { 136 if (DEBUG) { 137 // eslint-disable-next-line no-console 138 console.warn('[rbs-recaptcha:v3] missing siteKey'); 139 } 140 return; 141 }
142 findForms().forEach(bindForm); 143 } 144 145 if (document.readyState === 'loading') { 146 document.addEventListener('DOMContentLoaded', boot); 147 } else { 148 boot(); 149 } 150})(); 151 152
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.