Siesta.REPORTER = true;

Siesta.Harness.meta.extend({
	methods: {
		generateJSONReport: function() {
			return {
				durationSec: (this.endDate - this.startDate) / 1000,
				passed: this.allPassed(),
				suites: this.descriptors.map(
					function(descriptor) {
						var suite = this.getSuiteResults(
							this.testsByURL[descriptor.url].getResults().toJSON()
						);
						
						if (suite.totalCount) {
							return Ext.apply(
								Ext.copyTo(
									{},
									suite,
									[
										'description',
										'durationSec',
										'passed'
									]
								),
								{
									specs: [
										Ext.apply(suite, { description: '[all]' })
									]
								}
							);
						}
						else {
							return suite;
						}
					},
					this
				)
			};
		},
		
		getSuiteResults: function(results) {
			var output = {
				description: results.name || results.url.replace(/^.*\//, ''),
				durationSec: (results.endDate - results.startDate) / 1000,
				passed: results.passed
			};
			
			var suites = [];
			var specs = [];
			
			var pass = 0;
			var fail = 0;
			var total = 0;
			
			results.assertions.forEach(
				function(child) {
					if (child.type === "Siesta.Result.SubTest") {
						(child.bddSpecType === 'describe'
								? suites
								: specs)
							.push(
								this.getSuiteResults(child)
							);
					}
					else {
						if (child.passed)
							pass++;
						else {
							fail++;
						}
						
						total++;
					}
				},
				this
			);
			
			if (suites.length || specs.length) {
				return Ext.apply(output, {
					suites: suites,
					specs: specs
				});
			}
			else {
				return Ext.apply(output, {
					passedCount: pass,
					failedCount: fail,
					totalCount: total
				});
			}
		}
	}
});
@@ -205,16 +205,36 @@
 suites: 
+Ext.Array.map(%0A%09%09%09%09%09
 this.des
@@ -241,21 +241,17 @@
 criptors
-.map(
+,
 %0A%09%09%09%09%09fu
@@ -1117,16 +1117,39 @@
  0;%0A%09%09%09%0A
+%09%09%09Ext.Array.forEach(%0A%09
 %09%09%09resul
@@ -1161,25 +1161,17 @@
 sertions
-.forEach(
+,
 %0A%09%09%09%09fun

Use ExtJS shims for array methods, for use in pre-ES5 browsers.