ugrás a tartalomhoz

Tesztelés régi js környezetben

inf3rno · Jún. 20. (Sze), 05.38
Van bármi ötletetek, hogy hogyan lehetne előző ECMAScript verziókon kódot tesztelni? Úgy értem, hogy ES5 előttieken, pl ES3 vagy ES1. Nem igazán találok semmilyen környezetet, amivel meg tudnám csinálni. Akár még az is játszik, ha virtuális gépen kell futtatni valami netscape-et vagy ilyesmit. Igazából csak annyira kell, hogy egy hibakezelő keretrendszert teszteljek, hogy működik e bármilyen környezetben, akár ilyen extrémben is.
 
1

Közben utánajártam, elvileg

inf3rno · Jún. 20. (Sze), 07.40
Közben utánajártam, elvileg Netscape 4.0 és IE 4.0, amik ES1-et már implementálták. 1997-ben standardizálták a js-t. Előtte is volt nem standard js 1995-től a Netscape 2.0-tól és 1996-tól az IE 3.0-tól. Odáig már nincs sok értelme visszamenni, max kíváncsiságból. Szóval elvileg ha tudok szerezni egy NS4-et, akkor azon tudom tesztelni a kódot. A dolog annyiból lesz problémás, hogy valamennyi regex-et is használ a kódom, ami csak 1999-ben került be elvileg a böngészőkbe. Igazából string parser-t írni a néhány nagyon alap regex minta helyett nem annyira bonyolult. Egyelőre csinálok egy absztrakciót, amivel elfedem a regex mintákat, aztán később esetleg kiváltom egy parserrel. Úgy rémlik, hogy van win98-am egy nagyon régi virtuális gépen. Elvileg ahhoz IE4 vagy IE5 jár, úgyhogy talán megoldódik a probléma azzal. Ha nem, akkor marad valami NS4 image vagy ilyesmi. Amit nem értek, hogy miért nem létezik erre valami virtuális gép, amit csak el kell indítani. Nem hiszem, hogy egyedül vagyok ezzel az igénnyel, mármint néhányan tolnak retro böngészőket poénból.

szerk:
No csekkoltam IE6 van fent a win98-on. Itt van egy egész jó lista ECMAScript verziókról: link, az IE6 elvileg még épphogy ES3, de igazából még IE8-hoz is azt írja, pedig az már elég sok ES5 feature-t implementál. Ezek alapján nekem IE4 és NS4.06 fog kelleni. Megnézem, hogy tudom e downgradelni. Sikerült IE5-re downgradelni, szóval win98 second edition lehet. Van még rajta egy opera 10.63, ami szintén hasznos lesz tesztelésre.
2

Hát nem egyszerű. :DA már

inf3rno · Jún. 21. (Cs), 00.29
Hát nem egyszerű. :D

A már meglévő win98-on nem működött a hálózat, fogalmam sincs, hogy miért, elvileg jól volt beállítva. Végül leszedtem egy win98 first edition-t innen: link. Kulcsot is lehet találni az oldalon, retro warez-nek minősül, de már senki nem nézi. Utána telepítés, kék halál a képernyő illesztő miatt, csökkentett mód, újraindítás, stb. Utána belőttem a hálózatot LAN-nak, a VirtualBox-on meg beállítottam NAT-nak, és végre sikerült internetet varázsolni rá. Nem tudom hogyan lehet letiltani az internet hozzáférését úgy, hogy megmaradjon a belső háló virtualbox-on, szóval biztonsági rést jelent, ha esetleg fertőződne a rendszer, de nem akkora gond.

A fájlok átküldése érdekes módon a legnehezebb. Alapból a VirtualBox nem támogatja a win98-at, tehát nem lehet azon keresztül mappákat megosztani. A samba fájl megosztásnál a win98 régebbi protokollt használ, mint a win7. Elvileg be lehet állítani a win7-et, hogy legyen visszafele kompatibilis, és csatlakozzon win98 megosztásokhoz, mint kliens, de a gyakorlatban nekem nem működött. Kipróbáltam az FTP-t is, azzal meg az a baj, hogy az IE6, ami fent van, nem támogatja a passive mode-ot (ezt már win98 second edition-el próbáltam, ahol IE6 és nem IE4 van). Érdekes, mert a későbbi oprendszereknél meg már támogatja a passive mode-ot, és ugyanúgy IE6. Port forward-al nem sikerült életet lehelni az active mode-ba, a visszafele nyitott data connection nem megy át az IE6-hoz, úgyhogy gyakorlatilag az FTP is kilőve. Marad, hogy generálok linkeket a fájlokhoz, amiket át akarok küldeni, aztán letöltöm őket egyesével HTTP-n keresztül. Esetleg telepítek egy FTP klienst, ami tud passive mode-ot, pl TotalCommander-t, de annyira nem ragaszkodom ehhez az egész FTP-hez. Ha sok fájlt kell áttenni nem sokkal egyszerűbb, mint becsomagolni zip-be, aztán HTTP-vel átrántani és kicsomagolni.

A localhost a host OS-en elérhető a 10.0.2.2 címen. Ha esetleg nem jönne össze, akkor run, command (a cmd nem működik), ipconfig-al a default gateway címe az. Alapból ehhez a first edition-höz IE4-et adnak, ami jó, mert tudom ECMAScript 1-el tesztelni a kódom rajta.

Az eddigi tanulságok IE4-el és ES1-el kapcsolatban:
- nincs konzol
- a DOM-ban csak innerHTML van, nincs createElement és appendChild
- nincs a DOM-ban getElementById, muszáj vagy a gyerek elemeket átnézni, vagy a document.all-ból kikeresni, hogy melyikkel azonos az id
- nincs JSON stringify
- nincs Array.prototype.push
- nincs Error stack és try-catch, csak window.onerror
- nincs instanceof, csak typeof
- nincs hasOwnProperty, és if key in object, csak az értékeket lehet tesztelni
- nincs undefined, csak null, bár néha undefined-et ír
- az enumeration minden property-t végignyálaz, a prototype-al örökölteket is

Sikerült egy alap konzolt létrehozni az alábbi pár sor kóddal:
<html>
<head>
<title></title>
<script src="console.js"></script>
<script src="main.js"></script>
</head>
<body onload="initConsole(main);">
Running browser tests, check the console!
</body>
</html>

function initConsole(callback){
	if (!window.JSON || !window.JSON.stringify)
		stringifyShim();
	if (!window.console)
		consoleShim();
	callback();
}

function consoleShim(){
	var body = document.body || document.getElementsByTagName("body")[0];
	body.innerHTML += '<h3>console:</h3><div id="console_container"></div>';
	var consoleContainer;
	if (document.getElementById)
		consoleContainer = document.getElementById("console_container");
	else {
		var bodyChildren = body.childNodes || body.children;
		for (var i=0; i<bodyChildren.length; ++i){
			var bodyChild = bodyChildren[i];
			if (bodyChild.id == "console_container"){
				consoleContainer = bodyChild;
				break;
			}
		}
	}
	
	window.console = {
		log: function (){
			var text = "$ ";
			var notFirst = false;
			for (var i = 0; i<arguments.length; ++i){
				var arg = arguments[i];
				if (notFirst)
					text += ",";
				text += JSON.stringify(arg);
				notFirst = true;
			}
			consoleContainer.innerHTML += "<pre>"+text+"</pre>";
		}
	};
	
	window.onerror = function (message, path, line, col, errorObj){
		var err = errorObj || {message: message, fileName: path, lineNumber: line, columnNumber: col};
		var stack = err.stack || err.stacktrace;
		if (stack)
			console.log(stack);
		else
			console.log(err);
		return true;
	};
}

function stringifyShim(){
	if (!window.JSON)
		window.JSON = {};
	JSON.stringify = function (data){
		var text = "";
		var undef;
		if (data === undef || data === null)
			text += data;
		else if (typeof data == "string")
			text += '"' + data + '"';
		else if (typeof data == "object" && data.constructor === Array){
			text += "[";
			var notFirst = false;
			for (var i = 0; i<data.length; ++i){
				var value = data[i];
				if (notFirst)
					text += ",";
				text += JSON.stringify(value);
				notFirst = true;
			}
			text += "]";
		}
		else if (typeof data == "object" && data.constructor === Object) {
			text += "{";
			var notFirst = false;
			for (var key in data){
				var value = data[key];
				if (value === Object.prototype[key] && value !== undef)
					continue;
				if (notFirst)
					text += ",";
				text += JSON.stringify(key) + ":" + JSON.stringify(value);
				notFirst = true;
			}
			text += "}";
		}
		else
			text += data;
		return text;
	};
}
function main(){
	eval("try{}catch(e){}");
}
Nyilván ez a main() kód Syntax Error-t ad így a konzolba, mivel nincs try-catch. Érdekesnek érdekes volt megnézni, de a hibakezelő keretrendszerem gyakorlatilag try-catch-en és kivétel dobáson alapul, szóval az ES1 nem lesz támogatott benne. Nézem tovább, hogy mi az a minimum, amit már tudok támogatni.
3

Mi a cél? És miért? :)

T.G · Jún. 21. (Cs), 13.32
Mielőtt megkérdezném a bődületesen naiv kérdésemet, szeretném leszögezni, hogy mindig is nagy tisztelettel olvastam a munkásságodat. Ahogy most is, még akkor is, ha nehezen értem.
Konkrétan mi is a cél? A keretrendszeredet szeretnéd IE4 kompatibilissé tenni? Honnan jött ez az ötlet, hogy jó lenne ilyet csinálni? :)
4

Nem ez a cél. Szeretném

inf3rno · Jún. 21. (Cs), 13.52
Nem ez a cél. Szeretném meghatározni, hogy mi a minimum requirement js/ecmascript verzióban, aztán úgy megvalósítani, hogy annál ne igényeljen többet. Mivel hibakezelős keretrendszer, tehát egy nagyon alap feature-ről van szó, nem DOM-ról vagy ilyesmiről, ezért szeretném, ha egységesen működne minden elképzelhető környezetben. Ez alatt böngészőket értem, nodejs-t és egyéb szerver oldali js-t, egyedi js engine-eket, meg ami még létezik ezeken kívül. (Szerintem a felét sem ismerem.) Én konkrétan néhány tucat böngészőn fogom tesztelni, illetve nodejs-ben, de még nincsen készen. Nem fog sokat tudni, csak annyit, hogy egységes, lehetőleg objektum alapú stack formátum, néhány kivétel osztály, illetve az el nem kapott hibák továbbítása egy event emitter-nek, amit bárki rá tud kötni loggerre, ha olyanja van. Egyelőre az jött le, hogy ES3 a minimum ehhez, mert try-catch onnantól van, az IE4 az ES1-el kevés hozzá. Talán a maximum, amit esetleg el tudok érni IE4-ben, hogy kiírja, hogy nem támogatott környezet anélkül, hogy hibára futna a rendszer, de valószínűleg nem fogok foglalkozni vele.