diff --git a/backend/routes/clickTtHttpPageRoutes.js b/backend/routes/clickTtHttpPageRoutes.js index da46269e..3fc0649d 100644 --- a/backend/routes/clickTtHttpPageRoutes.js +++ b/backend/routes/clickTtHttpPageRoutes.js @@ -317,8 +317,14 @@ function injectProxyNavigationScript(html, proxyBaseUrl, pageBaseUrl, sid) { 'if(action)return normalizeUrl(action,PAGE_BASE_URL);', "return normalizeUrl((form&&form.getAttribute?form.getAttribute('action'):null)||PAGE_BASE_URL,PAGE_BASE_URL);", '}', + 'var lastSubmitter=null;', "document.addEventListener('click',function(event){", "var anchor=event.target&&event.target.closest?event.target.closest('a[href]'):null;", + "var submitControl=event.target&&event.target.closest?event.target.closest('button, input[type=\"submit\"], input[type=\"image\"]'):null;", + 'if(submitControl){', + 'lastSubmitter=submitControl;', + "try{console.log('[ClickTT Proxy] submit control click',{name:submitControl.name||null,value:submitControl.value||null,type:submitControl.type||submitControl.tagName,formAction:submitControl.getAttribute?submitControl.getAttribute('formaction'):null,text:(submitControl.textContent||'').trim().slice(0,120)});}catch(e){}", + '}', 'if(!anchor||event.defaultPrevented)return;', "var targetUrl=normalizeUrl(anchor.getAttribute('href'),PAGE_BASE_URL);", 'if(!targetUrl||!shouldProxyUrl(targetUrl))return;', @@ -329,9 +335,20 @@ function injectProxyNavigationScript(html, proxyBaseUrl, pageBaseUrl, sid) { "document.addEventListener('submit',function(event){", 'var form=event.target;', "if(!form||!form.tagName||form.tagName.toLowerCase()!=='form')return;", - 'var submitter=event.submitter||null;', + 'var submitter=event.submitter||lastSubmitter||null;', 'var targetUrl=getSubmitTarget(form,submitter);', 'if(!targetUrl||!shouldProxyUrl(targetUrl))return;', + 'if(submitter&&submitter.form===form&&submitter.name){', + "var hasField=!!form.querySelector('[name=\"'+CSS.escape(submitter.name)+'\"]');", + 'if(!hasField){', + "var hidden=document.createElement('input');", + "hidden.type='hidden';", + 'hidden.name=submitter.name;', + "hidden.value=submitter.value||'';", + "hidden.setAttribute('data-clicktt-submit-proxy','1');", + 'form.appendChild(hidden);', + '}', + '}', 'try{', 'var formDataEntries=[];', 'if(window.FormData){', @@ -367,8 +384,20 @@ function injectProxyNavigationScript(html, proxyBaseUrl, pageBaseUrl, sid) { 'if(window.HTMLFormElement&&window.HTMLFormElement.prototype&&window.HTMLFormElement.prototype.submit){', 'var nativeSubmit=window.HTMLFormElement.prototype.submit;', 'window.HTMLFormElement.prototype.submit=function patchedSubmit(){', - 'var targetUrl=getSubmitTarget(this,null);', - 'try{console.log("[ClickTT Proxy] direct form.submit()",{action:this.getAttribute("action"),targetUrl:targetUrl});}catch(e){}', + 'var submitter=lastSubmitter&&lastSubmitter.form===this?lastSubmitter:null;', + 'var targetUrl=getSubmitTarget(this,submitter);', + 'if(submitter&&submitter.name){', + "var hasField=!!this.querySelector('[name=\"'+CSS.escape(submitter.name)+'\"]');", + 'if(!hasField){', + "var hidden=document.createElement('input');", + "hidden.type='hidden';", + 'hidden.name=submitter.name;', + "hidden.value=submitter.value||'';", + "hidden.setAttribute('data-clicktt-submit-proxy','1');", + 'this.appendChild(hidden);', + '}', + '}', + 'try{console.log("[ClickTT Proxy] direct form.submit()",{action:this.getAttribute("action"),targetUrl:targetUrl,submitterName:submitter&&submitter.name?submitter.name:null,submitterValue:submitter&&submitter.value?submitter.value:null});}catch(e){}', "if(targetUrl&&shouldProxyUrl(targetUrl)){this.setAttribute('action',buildProxyUrl(targetUrl));}", 'return nativeSubmit.apply(this,arguments);', '};',