How to convert Msxml2.XMLHTTP IE-based website only so that it also works with Firefox?

This is an IE-only website that I want to use with other browsers like Firefox:

https://golestan.sbu.ac.ir/Forms/AuthenticateUser/login.htm

I have to use this site for my university. It uses Msxml2.XMLHTTP , which is a feature only for IE. I tried converting it to XMLHttpRequest , so it only works with Firefox. This is the Greasemonkey script we created. Now it does not give errors, but it does not work. All functions come from the original website script, but they are changed so that they work with XMLHttpRequest . If the login script appears, I'm fine. How can I debug this javascript?

 // ==UserScript== // @name Golestan Login // @namespace sbu.ac.ir // @include https://golestan.sbu.ac.ir/Forms/AuthenticateUser/login.htm // @version 1 // @grant none // ==/UserScript== var isInternetExplorer = 0; function check(){ var x; if (window.XMLHttpRequest) { x = new XMLHttpRequest(); } else { try { x = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { x = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { x = false; } } } x.open("HEAD",document.location,true); x.send(); var sd=new Date(x.getResponseHeader('Last-Modified')); var cd=new Date(document.lastModified); if(sd-cd>3660000){ document.cookie = "reloading=1"; window.location.reload(true); return false; } return true; } function a(){ for (k = 0; k < nall; k++) { td = document.createElement('TD'); td.className = 'e'; Pr.appendChild(td); } if (!check()) { //window.open("/_Templates/howtoclearcache.htm","_blank"); //top.close(); return; } var aCookie = document.cookie.split("; "); var cook=0; for (var i=0; i < aCookie.length; i++) { var aCrumb = aCookie[i].split("="); if ("reloading" == aCrumb[0]) { cook=unescape(aCrumb[1]); break; } } var ind=0; for( i=0;i<all.length;i=i+2){ if(all[i+1]==1) for(j=0;j<4;j++){ var r; if (window.XMLHttpRequest) { r = new XMLHttpRequest(); } else { try { r = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { r = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { r = false; } } } r.open("GET", all[i]+imstat[j]+".gif", true); if(cook==1) r.setRequestHeader('If-Modified-Since','Sat,01 Jan 2000 00:00:00 GMT'); getobj(r,ind++); } else{ var r; if (window.XMLHttpRequest) { r = new XMLHttpRequest(); } else { try { r = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { r = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { r = false; } } } r.open("GET", all[i], true); if(cook==1) r.setRequestHeader('If-Modified-Since','Sat,01 Jan 2000 00:00:00 GMT'); getobj(r,ind++); } } document.cookie = "reloading=0; expires=Fri, 31 Dec 1999 23:59:59 GMT;"; } function main_DoFSCommand(command, args) { var mainObj = document.all.main; // // Place your code here. // document.getElementById("rdir").style.visibility = "hidden"; if(command != "showmenu") if(command == "Animation_Complete") { var x = 0; var y = 0; x = main.clientHeight/2 - 300; y = main.clientWidth/2 - 400; document.getElementById("iframeNews").style.top = x + 120; document.getElementById("iframeNews").style.left = y + 264; modifySrc(); document.getElementById("iframeNews").style.visibility = "visible"; } else { if(command == "Enter") { bal('main'); } else if(command == "Education") { bal('test'); } else document.getElementById("iframeNews").style.visibility = "hidden"; } } // http://stackoverflow.com/questions/21271997 addJS_Node (check); addJS_Node (a); addJS_Node (main_DoFSCommand); isInternetExplorer=true; function addJS_Node (text, s_URL, funcToRun, runOnLoad) { var D = document; var scriptNode = D.createElement ('script'); if (runOnLoad) { scriptNode.addEventListener ("load", runOnLoad, false); } scriptNode.type = "text/javascript"; if (text) scriptNode.textContent = text; if (s_URL) scriptNode.src = s_URL; if (funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()'; var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement; targ.appendChild (scriptNode); } 

I think this work is worth it because it affects hundreds of thousands of users who are university students.

Update. We could continue one level and reach main.htm . So, I wrote another script for this page. But finally, I get ReferenceError: element is not defined[Learn More] .

 // ==UserScript== // @name Golestan Main // @namespace sbu.ac.ir // @include https://golestan.sbu.ac.ir/Forms/AuthenticateUser/main.htm // @version 1 // @grant none // ==/UserScript== // Microsoft WebService Behavior (Predecessor of modern AJAX) // Information: https://web.archive.org/web/20060101200359/https://msdn.microsoft.com/workshop/author/webservice/webservice.asp // JavaScript version: https://raw.githubusercontent.com/nzakas/professional-javascript/master/edition1/ch17/webservice.htc // NOTE: You should paste the Javascript code from the above URL here // end Microsoft WebService Behavior function l(){ useService("../f0241_process_authexit/authexit.asmx?WSDL", "get"); // useService("authuser.asmx?WSDL", "get"); mt = new MainTit(document,titH); mt.Maxi(); t = new Tab(document,titH,0,document.body.clientWidth,document.body.clientHeight-titH); t.maintitle=mt; OpenFaci('صفحه اصلي','nav.htm?fid=0;1&tck='+'&'+location.search.replace('?','')); mt.HideGTit(); KeysValues = location.search.split(/[\?&]+/); for (i = 0; i < KeysValues.length; i++) { KeyValue = KeysValues[i].split("="); if (KeyValue[0] == "CSURL") { CSURL = KeyValue[1]; break; } } } function ex(ltck,tck,u,si,ft,fid,sess){ var co = createCallOptions(); co.funcName = "ex"; co.async = false; // callService(function(result){if(result.error){/*alert(result.errorDetail.string);*/}},"ex",ltck,tck,u,si,ft,fid,sess); callService(co,ltck,tck,u,si,ft,fid,sess); } addJS_Node (l); addJS_Node (ex); addJS_Node(ErrDetail); addJS_Node(postError); addJS_Node(returnError); addJS_Node(createCallOptions); addJS_Node(createUseOptions); addJS_Node(cloneObject); addJS_Node(ensureVBArray); addJS_Node(encb64hlp); addJS_Node(decb64hlp); addJS_Node(encb64); addJS_Node(decb64); addJS_Node(ensureWsdlUrl); addJS_Node(allocCall); addJS_Node(fnShowProgress); addJS_Node(isSimpleType); addJS_Node(isPrimitive); addJS_Node(getSdl); addJS_Node(processService); addJS_Node(onImportLoaded); addJS_Node(loadImports); addJS_Node(invokeNext); addJS_Node(callNext); addJS_Node(getAttrib); addJS_Node(getBaseName); addJS_Node(getQualifier); addJS_Node(getNextNsq); addJS_Node(getUniqueNsq); addJS_Node(parseSimpleType); addJS_Node(parseType); addJS_Node(parseArrayType); addJS_Node(parseComplexType); addJS_Node(parseAttrib); addJS_Node(parseElem); addJS_Node(parseSoapHeader); addJS_Node(expBase); addJS_Node(parseSchemas); addJS_Node(parseSdl); addJS_Node(ensureXmlHttp); addJS_Node(encodeHeader); addJS_Node(_invoke); addJS_Node(callService); addJS_Node(useService); addJS_Node(getMsg); addJS_Node(fixupDT); addJS_Node(encTZ); addJS_Node(encodePrimitive); addJS_Node(bldJsAry); addJS_Node(getNextIndexAry); addJS_Node(vbArrayToJs); addJS_Node(encodeArray); addJS_Node(encodeVar); addJS_Node(getArySize); addJS_Node(get1stAryItem); addJS_Node(getAryItemFromIndex); addJS_Node(getSchema); addJS_Node(getArySizeInfo); addJS_Node(encodeAttrib); addJS_Node(serPart); addJS_Node(getWrap); addJS_Node(encodeArgs); addJS_Node(returnResult); addJS_Node(decTZ); addJS_Node(applyTZ); addJS_Node(decDate); addJS_Node(decTime); addJS_Node(decodePrimitive); addJS_Node(getAryInfo); addJS_Node(decodeArray); addJS_Node(decodeAryItem); addJS_Node(getAryElem); addJS_Node(decodeElem); addJS_Node(decodeType); addJS_Node(processResult); addJS_Node(hideProgress); addJS_Node(getResult); function addJS_Node (text, s_URL, funcToRun, runOnLoad) { var D = document; var scriptNode = D.createElement ('script'); if (runOnLoad) { scriptNode.addEventListener ("load", runOnLoad, false); } scriptNode.type = "text/javascript"; if (text) scriptNode.textContent = text; if (s_URL) scriptNode.src = s_URL; if (funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()'; var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement; targ.appendChild (scriptNode); } 
+6
javascript cross-browser
source share
2 answers

Things to care

Website using xhr(async:false) in a HEAD request. What is outdated

You can learn more about this here https://xhr.spec.whatwg.org/

Main statement

Synchronous XMLHttpRequest outside of production is in the process of being removed from the web platform because it has a harmful effect on end users. (This is a lengthy process that takes many years.) Developers should not pass false for the async argument when the current global object is a Window object. User agents are strongly advised to warn of such use in developer tools and may experiment with raising an InvalidAccessError when this occurs.

So change it to true .

Then use @run-at document-end .

I created a script that does this job for you.

The approach I used is

I copied all the script code from the site and made the necessary changes.

In a custom script, remove the script element and enter the modified script into the web page.

It will change the page as shown below. But it seems that all td elements are empty that came from the server.

enter image description here

Here you can see the network transmission.

enter image description here

This is a user script.

 // ==UserScript== // @name golestan // @namespace Sagar V // @author Sagar V // @include https://golestan.sbu.ac.ir/Forms/AuthenticateUser/login.htm // @version 1 // @grant none // @run-at document-end // ==/UserScript== (function(){ var script=document.createElement('script'); script.innerHTML=`c=0; Ip="/_Images/";ip="/_images/";tp="/_Templates/";scp="/_Scripts/";stp="/_styles/";Stp="/_Styles/";ap="/Forms/AuthenticateUser/"; all =new Array( '/blank.htm',0, scp+'printTemplate.htm?tck=r',0, stp+'comm_butt2.htc',0, stp+'select.htc',0, stp+'simplegrid.htc',0, stp+'validation.htc',0, stp+'webservice.htc',0, Stp+'helpStyle.css',0, Stp+'winlessmovable.htc',0, stp+'main.css',0, stp+'MenuStyle.css',0, stp+'Toolb.htc',0, stp+'npui.css',0, ap+'Message.XSLT',0, ap+'Golestan.htm',0, ap+'NewsPage.htm',0, ap+'LoginPage.htm',0, ap+'TopPage.htm',0, ap+'main.htm',0, tp+'Commander.htm',0, tp+'Message_Page.htm',0, tp+'help.htm',0, scp+'Commander.js',0, scp + 'npobj.js', 0, scp + 'faci.js', 0, scp+'Forms1_5.js',0, scp+'help.js',0, scp + 'Message.js', 0, scp + 'npnfwin.js', 0, '/_scripts/jqnpsrv.js', 0, '/_scripts/npgrd.js', 0, scp + 'Forms1_5_npgrid.js', 0, Ip+'Status_OK.gif',0, ip+'tabs.png',0, ip+'ftabs.png',0, ip+'corner.png',0, ip+'c1.png',0, ip+'jqnpgridicons.png',0, '/Forms/F0202_PROCESS_REP_FILTER/command.htm',0); nall=0; for(k=0;k<all.length;k=k+2){ if(all[k+1]==1)nall=nall+4; else nall++; } imstat=new Array('','_clicked','_focus','_disable'); function check(){ var x=new XMLHttpRequest() || new ActiveXObject("MSXML2.XMLHTTP"); x.open("HEAD",document.location,true); x.send(); var sd=new Date(x.getResponseHeader('Last-Modified')); var cd=new Date(document.lastModified); if(sd-cd>3660000){ //alert('با توجه به تغييرات جديد سيستم ، جهت مشاهده کامل صفحات لطفا فايل هاي ذخيره شده در مرورگر خودرا حذف کنيد'); document.cookie = "reloading=1"; window.location.reload(true); return false; } return true; } function a(){ for (k = 0; k < nall; k++) { td = document.createElement('TD'); td.className = 'e'; Pr.appendChild(td); } if (!check()) { //window.open("/_Templates/howtoclearcache.htm","_blank"); //top.close(); return; } var aCookie = document.cookie.split("; "); var cook=0; for (var i=0; i < aCookie.length; i++) { var aCrumb = aCookie[i].split("="); if ("reloading" == aCrumb[0]) { cook=unescape(aCrumb[1]); break; } } var ind=0; for( i=0;i<all.length;i=i+2){ if(all[i+1]==1) for(j=0;j<4;j++){ var r=new XMLHttpRequest() || new ActiveXObject("MSXML2.XMLHTTP"); r.open("GET", all[i]+imstat[j]+".gif", true); if(cook==1) r.setRequestHeader('If-Modified-Since','Sat,01 Jan 2000 00:00:00 GMT'); getobj(r,ind++); } else{ var r=new XMLHttpRequest() || new ActiveXObject("MSXML2.XMLHTTP"); r.open("GET", all[i], true); if(cook==1) r.setRequestHeader('If-Modified-Since','Sat,01 Jan 2000 00:00:00 GMT'); getobj(r,ind++); } } document.cookie = "reloading=0; expires=Fri, 31 Dec 1999 23:59:59 GMT;"; } function getobj(o,ind){ o.onreadystatechange=function(){ if(o.readystate==4){ Pr.cells(c).className="f"; c++; if(c==nall){ if (location.search){ top.location = "main.htm" + location.search ; } else top.location="main.htm"; } } } o.send(); }`; //alert(script); document.getElementsByTagName('script')[0].parentNode.removeChild(document.getElementsByTagName('script')[0]); document.head.appendChild(script); })(); 

or

Install it directly from Github

+3
source

Unfortunately, a heavy JavaScript web application built for IE is likely to contain more IE-specific things than just creating XMLHttpRequests. Using ActiveXObject to create XMLHttpRequests also means that JavaScript was written for a very old version of IE, because the standard XmlHttpRequest object is present with IE7. So expect the worst!

For a specific problem with all calls to new ActiveXObject("MSXML.HttpRequest") working in Firefox. You can use the following in your Greasemonkey script:

 window.ActiveXObject = function(type) { switch(type.toUpperCase()) { case "MSXML2.XMLHTTP": case "MICROSOFT.XMLHTTP": return new XMLHttpRequest(); break; default: console.log("Unknown ActiveXObject type: ", type); } } 

I checked this with your example, and I noticed that the JavaScript tests are .readystate , not .readystate !

A further Greasemonkey fix may work around this:

 Object.defineProperty(XMLHttpRequest.prototype, "readystate", { get: function() { return this.readyState; } }); 

The next problem was that JavaScript used a collection of TableRow cells, as if it were a function ... Therefore:

 Object.defineProperty(HTMLTableRowElement.prototype, "cells", { get: function() { return function(index) { return this.querySelectorAll('td')[index]; }; } }) 

If he no longer felt that things were getting out of control, the page ends and goes to "main.html", where things get more interesting.

Because it contains this very nasty explosion from the past:

 <div id="service" style="display:none" style="behavior:url(/_styles/webservice.htc)"></div> 

Microsoft CSS Behavior !!! It was all rage about 15 years ago or so.

If you think that getting to this point was bad, going further would require more patience than I have time, I looked at webservice.htc and there was a lot of reversible script around this, for one question.

I am very sorry that I could not get this to work for you!

Instead of investing time in this, I personally resigned to launching IE on Linux via VirtualBox and using the IE VM

+3
source

All Articles