michael@0: /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: var parser = new DOMParser(); michael@0: var methodExpr = (new XPathEvaluator).createExpression("xsl:output/@method", michael@0: { michael@0: lookupNamespaceURI: function(aPrefix) michael@0: { michael@0: if (aPrefix == "xsl") michael@0: return "http://www.w3.org/1999/XSL/Transform"; michael@0: return ""; michael@0: } michael@0: }); michael@0: michael@0: const nsIWebProgListener = Components.interfaces.nsIWebProgressListener; michael@0: michael@0: var runQueue = michael@0: { michael@0: mArray : new Array(), michael@0: push : function(aRunItem) michael@0: { michael@0: this.mArray.push(aRunItem); michael@0: }, michael@0: observe : function(aSubject, aTopic, aData) michael@0: { michael@0: var item = this.mArray.shift(); michael@0: if (item) { michael@0: item.run(this); michael@0: } michael@0: }, michael@0: run : function() michael@0: { michael@0: this.observe(null,'',''); michael@0: } michael@0: } michael@0: michael@0: var itemCache = michael@0: { michael@0: mArray : new Array(), michael@0: getItem : function(aResource) michael@0: { michael@0: // Directory selected michael@0: if (kContUtils.IsSeq(runItem.prototype.kDatabase, aResource)) { michael@0: var aSeq = kContUtils.MakeSeq(runItem.prototype.kDatabase, aResource); michael@0: dump("sequence: "+aSeq+" with "+aSeq.GetCount()+" elements\n"); michael@0: var child, children = aSeq.GetElements(); michael@0: var m = 0, first; michael@0: while (children.hasMoreElements()) { michael@0: m += 1; michael@0: child = children.getNext(); michael@0: child.QueryInterface(nsIRDFResource); michael@0: if (!first) michael@0: first = itemCache.getItem(child); michael@0: else michael@0: itemCache.getItem(child); michael@0: } michael@0: return first; michael@0: } michael@0: if (aResource.Value in this.mArray) { michael@0: return this.mArray[aResource.Value]; michael@0: } michael@0: var retItem = new runItem(aResource); michael@0: this.mArray[aResource.Value] = retItem; michael@0: runQueue.push(retItem); michael@0: return retItem; michael@0: }, michael@0: rerunItem : function(aResource, aObserver) michael@0: { michael@0: var anItem = new runItem(aResource); michael@0: this.mArray[aResource.Value] = anItem; michael@0: anItem.run(aObserver); michael@0: }, michael@0: observe : function(aSubject, aTopic, aData) michael@0: { michael@0: this.mRun += 1; michael@0: if (aTopic == "success") { michael@0: if (aData == "yes") { michael@0: this.mGood += 1; michael@0: } michael@0: else { michael@0: this.mFalse +=1; michael@0: } michael@0: } michael@0: } michael@0: } michael@0: michael@0: function runItem(aResource) michael@0: { michael@0: this.mResource = aResource; michael@0: // Directory selected michael@0: if (kContUtils.IsSeq(this.kDatabase,this.mResource)) { michael@0: var aSeq = kContUtils.MakeSeq(this.kDatabase,this.mResource); michael@0: dump("THIS SHOULDN'T HAPPEN\n"); michael@0: var child, children = aSeq.GetElements(); michael@0: var m = 0; michael@0: while (children.hasMoreElements()) { michael@0: m += 1; michael@0: child = children.getNext(); michael@0: child.QueryInterface(nsIRDFResource); michael@0: itemCache.getItem(child); michael@0: } michael@0: } michael@0: } michael@0: michael@0: runItem.prototype = michael@0: { michael@0: // RDF resource associated with this test michael@0: mResource : null, michael@0: // XML documents for the XSLT transformation michael@0: mSourceDoc : null, michael@0: mStyleDoc : null, michael@0: mResDoc : null, michael@0: // XML or plaintext document for the reference michael@0: mRefDoc : null, michael@0: // bitfield signaling the loaded documents michael@0: mLoaded : 0, michael@0: kSource : 1, michael@0: kStyle : 2, michael@0: kReference : 4, michael@0: // a observer, potential argument to run() michael@0: mObserver : null, michael@0: mSuccess : null, michael@0: mMethod : 'xml', michael@0: // XSLTProcessor, shared by the instances michael@0: kProcessor : new XSLTProcessor(), michael@0: kXalan : kStandardURL.createInstance(nsIURL), michael@0: kDatabase : null, michael@0: kObservers : new Array(), michael@0: michael@0: run : function(aObserver) michael@0: { michael@0: if (aObserver && typeof(aObserver)=='function' || michael@0: (typeof(aObserver)=='object' && michael@0: typeof(aObserver.observe)=='function')) { michael@0: this.mObserver=aObserver; michael@0: } michael@0: var name = this.kDatabase.GetTarget(this.mResource, krTypeName, true); michael@0: if (name) { michael@0: var cat = this.kDatabase.GetTarget(this.mResource, krTypeCat, true); michael@0: var path = this.kDatabase.GetTarget(this.mResource, krTypePath, true); michael@0: cat = cat.QueryInterface(nsIRDFLiteral); michael@0: name = name.QueryInterface(nsIRDFLiteral); michael@0: path = path.QueryInterface(nsIRDFLiteral); michael@0: var xalan_fl = this.kXalan.resolve(cat.Value+"/"+path.Value); michael@0: var xalan_ref = this.kXalan.resolve(cat.Value+"-gold/"+path.Value); michael@0: this.mRefURL = michael@0: this.kXalan.resolve(cat.Value + "-gold/" + path.Value + ".out"); michael@0: dump(name.Value+" links to "+xalan_fl+"\n"); michael@0: } michael@0: // Directory selected michael@0: if (kContUtils.IsSeq(this.kDatabase,this.mResource)) { michael@0: return; michael@0: var aSeq = kContUtils.MakeSeq(this.kDatabase,this.mResource); michael@0: dump("sequence: "+aSeq+" with "+aSeq.GetCount()+" elements\n"); michael@0: var child, children = aSeq.GetElements(); michael@0: var m = 0; michael@0: while (children.hasMoreElements()) { michael@0: m += 1; michael@0: child = children.getNext(); michael@0: child.QueryInterface(nsIRDFResource); michael@0: } michael@0: } michael@0: this.mSourceDoc = document.implementation.createDocument('', '', null); michael@0: this.mSourceDoc.addEventListener("load",this.onload(1),false); michael@0: this.mSourceDoc.load(xalan_fl+".xml"); michael@0: this.mStyleDoc = document.implementation.createDocument('', '', null); michael@0: this.mStyleDoc.addEventListener("load",this.styleLoaded(),false); michael@0: this.mStyleDoc.load(xalan_fl+".xsl"); michael@0: }, michael@0: michael@0: // nsIWebProgressListener michael@0: QueryInterface: function(aIID) michael@0: { michael@0: return this; michael@0: }, michael@0: onStateChange: function(aProg, aRequest, aFlags, aStatus) michael@0: { michael@0: if ((aFlags & nsIWebProgListener.STATE_STOP) && michael@0: (aFlags & nsIWebProgListener.STATE_IS_DOCUMENT)) { michael@0: aProg.removeProgressListener(this); michael@0: this.mRefDoc = document.getElementById('hiddenHtml').contentDocument; michael@0: this.fileLoaded(4); michael@0: } michael@0: }, michael@0: onProgressChange: function(aProg, b,c,d,e,f) michael@0: { michael@0: }, michael@0: onLocationChange: function(aProg, aRequest, aURI, aFlags) michael@0: { michael@0: }, michael@0: onStatusChange: function(aProg, aRequest, aStatus, aMessage) michael@0: { michael@0: }, michael@0: onSecurityChange: function(aWebProgress, aRequest, aState) michael@0: { michael@0: }, michael@0: michael@0: // onload handler helper michael@0: onload : function(file) michael@0: { michael@0: var self = this; michael@0: return function(e) michael@0: { michael@0: return self.fileLoaded(file); michael@0: }; michael@0: }, michael@0: michael@0: styleLoaded : function() michael@0: { michael@0: var self = this; michael@0: return function(e) michael@0: { michael@0: return self.styleLoadedHelper(); michael@0: }; michael@0: }, michael@0: styleLoadedHelper : function() michael@0: { michael@0: var method = methodExpr.evaluate(this.mStyleDoc.documentElement, 2, michael@0: null).stringValue; michael@0: var refContent; michael@0: if (!method) { michael@0: // implicit method, guess from result michael@0: refContent = this.loadTextFile(this.mRefURL); michael@0: if (refContent.match(/^\s*