Author: jbeard
Date: Wed Jun 16 03:20:05 2010
New Revision: 955120

URL: http://svn.apache.org/viewvc?rev=955120&view=rev
Log:
Browser front-end works in IE8.

Added:
    
commons/sandbox/gsoc/2010/scxml-js/branches/browser-tests.1.ie/src/xslt/backends/js/StatePatternStatechartGenerator_combined.xsl
   (with props)
Modified:
    
commons/sandbox/gsoc/2010/scxml-js/branches/browser-tests.1.ie/src/javascript/scxml/cgf/backends/js/StatePatternStatechartGenerator.js
    
commons/sandbox/gsoc/2010/scxml-js/branches/browser-tests.1.ie/test/SCXMLCompiler.js

Modified: 
commons/sandbox/gsoc/2010/scxml-js/branches/browser-tests.1.ie/src/javascript/scxml/cgf/backends/js/StatePatternStatechartGenerator.js
URL: 
http://svn.apache.org/viewvc/commons/sandbox/gsoc/2010/scxml-js/branches/browser-tests.1.ie/src/javascript/scxml/cgf/backends/js/StatePatternStatechartGenerator.js?rev=955120&r1=955119&r2=955120&view=diff
==============================================================================
--- 
commons/sandbox/gsoc/2010/scxml-js/branches/browser-tests.1.ie/src/javascript/scxml/cgf/backends/js/StatePatternStatechartGenerator.js
 (original)
+++ 
commons/sandbox/gsoc/2010/scxml-js/branches/browser-tests.1.ie/src/javascript/scxml/cgf/backends/js/StatePatternStatechartGenerator.js
 Wed Jun 16 03:20:05 2010
@@ -5,7 +5,10 @@ require.def(
        [
                
"src/javascript/scxml/cgf/backends/js/AbstractStatechartGenerator",
                "xml!src/xslt/ir-compiler/appendTransitionInformation.xsl",
-               "xml!src/xslt/backends/js/StatePatternStatechartGenerator.xsl" 
],
+               //stylesheet must be preprocessed with preprocess_import.xsl 
for IE and maybe chrome
+               
"xml!src/xslt/backends/js/StatePatternStatechartGenerator_combined.xsl" 
+               
//"xml!src/xslt/backends/js/StatePatternStatechartGenerator.xsl" 
+       ],
 
        function(
                AbstractStatechartGenerator,

Added: 
commons/sandbox/gsoc/2010/scxml-js/branches/browser-tests.1.ie/src/xslt/backends/js/StatePatternStatechartGenerator_combined.xsl
URL: 
http://svn.apache.org/viewvc/commons/sandbox/gsoc/2010/scxml-js/branches/browser-tests.1.ie/src/xslt/backends/js/StatePatternStatechartGenerator_combined.xsl?rev=955120&view=auto
==============================================================================
--- 
commons/sandbox/gsoc/2010/scxml-js/branches/browser-tests.1.ie/src/xslt/backends/js/StatePatternStatechartGenerator_combined.xsl
 (added)
+++ 
commons/sandbox/gsoc/2010/scxml-js/branches/browser-tests.1.ie/src/xslt/backends/js/StatePatternStatechartGenerator_combined.xsl
 Wed Jun 16 03:20:05 2010
@@ -0,0 +1,568 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+--><stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform"; 
xmlns:c="urn://scxml-js" xmlns:s="http://www.w3.org/2005/07/scxml";>
+  <output method="text"/>
+  <param name="log" select="true()"/>
+  <param name="noIndexOf" select="false()"/>
+  <param name="noMap" select="false()"/>
+  <param name="noForEach" select="false()"/>
+  <param name="name"/>
+  <variable name="allStates" select="//*[(self::s:state or self::s:parallel or 
self::s:final or self::s:initial or self::s:scxml or self::s:history)]"/>
+  <variable name="states" select="//s:state"/>
+  <variable name="transitions" select="//s:transition"/>
+  <variable name="basicStates" select="$allStates[not(.//*[(self::s:state or 
self::s:parallel or self::s:final or self::s:initial or self::s:scxml or 
self::s:history)])]"/>
+  <variable name="compositeStates" select="$allStates[.//*[(self::s:state or 
self::s:parallel or self::s:final or self::s:initial or self::s:scxml or 
self::s:history)]]"/>
+  <variable name="eventsEnum" select="/s:scxml/c:eventsEnum/c:event"/>
+  <template match="/s:scxml">
+    <if test="$noIndexOf">
+      <call-template name="genNoIndexOfArrayPrototypeExtension"/>
+    </if>
+    <if test="$noMap">
+      <call-template name="genNoMapArrayPrototypeExtension"/>
+    </if>
+    <if test="$noForEach">
+      <call-template name="genNoForEachArrayPrototypeExtension"/>
+    </if>
+
+               function <value-of select="$name"/>StatechartExecutionContext(){
+
+                               var self = this;        //used in the rare 
occasions we call public functions from inside this class
+
+                               //abstract state
+
+                               <call-template 
name="genAbstractState"><with-param name="events" 
select="$eventsEnum"/></call-template>
+
+                               //states
+                               <for-each select="$allStates"><call-template 
name="genState"><with-param name="state" select="."/></call-template></for-each>
+
+               
+                               //states enum for glass-box unit testing
+                               <call-template name="genStatesEnum"><with-param 
name="states" select="$basicStates"/></call-template>
+
+                               //trigger methods for synchronous interaction
+                               <for-each select="$eventsEnum"><call-template 
name="genExternalTriggerDispatcher"><with-param name="event" 
select="."/></call-template></for-each><call-template name="genContextHooks"/>
+
+                               //initialization script
+                               <value-of select="s:script"/>
+
+                               //initialization method
+                               <call-template name="genInitialization"/>
+
+                               //internal runtime functions
+                               <call-template 
name="genInternalRuntimeFunctions"/>
+
+                               //start static boilerplate code
+                               <call-template 
name="genBoilerplateDispatchCode"/>
+
+                       }
+
+       </template>
+  <template name="genAbstractState">
+    <param name="events"/>
+
+               var AbstractState = new function(){
+                       //triggers are methods
+
+                       <for-each select="$events">
+                               this.<value-of select="./c:name"/> = 
function(){};
+                       </for-each>
+
+                       this.$default = function(){};
+               }
+       </template>
+  <template name="genState">
+    <param name="state"/>
+    <variable name="stateName" select="$state/@id"/>
+    <variable name="parentName">
+      <choose>
+        <!-- FIXME: probably want to refine this query, as we may not be able 
to assume that all states have ids?-->
+        <when test="$state/../@id">
+          <value-of select="$state/../@id"/>
+        </when>
+        <otherwise>
+          <value-of select="'AbstractState'"/>
+        </otherwise>
+      </choose>
+    </variable>
+    <variable name="historyState" select="$state/s:history"/>
+    <variable name="constructorFunctionName" 
select="concat($stateName,'Constructor')"/>
+
+               <!--
+                                       var stateName = sta...@id;
+                                       var parentName = state.parent() ? 
state.parent()....@id : "AbstractState";
+                                       var historyState = state.history;
+                                       var hasHistoryState = 
historyState.length() > 0;
+                                       var constructorFunctionName = stateName 
+ "Constructor";
+               -->
+
+               var <value-of select="$stateName"/> = (function(){
+
+                       function <value-of 
select="$constructorFunctionName"/>(){
+                               this.parent = <value-of select="$parentName"/>;
+
+                               this.initial = null;
+
+                               this.depth = <value-of 
select="count($state/ancestor::*)"/>;
+
+                               this.historyState = null;
+
+                               <if test="$state/self::s:history">
+                                       this.parent.historyState = this; //init 
parent's pointer to history state
+                               </if><if test="$state/self::s:initial">
+                                       this.parent.initial = this; //init 
parent's pointer to initial state
+                               </if>
+                               
+                               this.toString = function(){
+                                       return "<value-of select="$stateName"/>"
+                               }
+
+                               this.enterAction = function(){
+                                       <if test="$log">
+                                               console.log("entering <value-of 
select="$stateName"/>");
+                                       </if><apply-templates 
select="$state/s:onentry/*[self::s:if or self::s:raise or self::s:log or 
self::s:script or self::s:send or self::s:cancel or self::s:invoke or 
self::s:finalize or self::s:datamodel or self::s:data or self::s:assign or 
self::s:validate or self::s:param]"/>
+                               }
+
+                               this.exitAction = function(){
+                                       <if test="$log">
+                                               console.log("exiting <value-of 
select="$stateName"/>" );
+                                       </if><if test="$historyState">
+                                               
this.historyState.lastConfiguration = currentConfiguration.slice();
+                                       </if><apply-templates 
select="$state/s:onexit/*[self::s:if or self::s:raise or self::s:log or 
self::s:script or self::s:send or self::s:cancel or self::s:invoke or 
self::s:finalize or self::s:datamodel or self::s:data or self::s:assign or 
self::s:validate or self::s:param]"/>
+                               }
+
+                               <call-template name="genStateHooks"><with-param 
name="state" select="$state"/></call-template>
+                               
+
+                       }
+                       <value-of select="$constructorFunctionName"/>.prototype 
= <value-of select="$parentName"/>;
+                       return new <value-of 
select="$constructorFunctionName"/>();
+               })();
+
+       </template>
+  <template name="genStatesEnum">
+    <param name="states"/>
+
+               this._states = {
+                       <for-each select="$states"><value-of select="@id"/> : 
<value-of select="@id"/><if test="not(position() = last())">,</if></for-each>
+               }
+
+       </template>
+  <template match="s:if">
+               if (<value-of select="@cond"/>) {
+                       <apply-templates select="c:executableContent/*"/>       
+               }
+               <apply-templates select="s:elseif"/><apply-templates 
select="s:else"/></template>
+  <template match="s:elseif">
+               else if (<value-of select="@cond"/>) {
+                       <apply-templates select="c:executableContent/*"/>
+               }
+       </template>
+  <template match="s:else">
+               else {
+                       <apply-templates select="c:executableContent/*"/>
+               }
+       </template>
+  <template match="s:log">
+    <if test="@label">
+                       console.log( ' <value-of select="@label"/> : ' );
+               </if>
+    <if test="@expr">
+                       console.log(  <value-of select="@expr"/>  );
+                       
+               </if>
+  </template>
+  <template match="s:raise">
+       <!--TODO-->
+       </template>
+  <template match="s:script">
+    <value-of select="."/>
+  </template>
+  <template match="s:cancel">
+       <!--TODO-->
+       </template>
+  <template match="s:invoke">
+       <!--TODO-->
+       </template>
+  <template match="s:finalize">
+       <!--TODO-->
+       </template>
+  <template match="s:datamodel">
+       <!--TODO-->
+       </template>
+  <template match="s:data">
+       <!--TODO-->
+       </template>
+  <template match="s:assign">
+       <!--TODO-->
+       </template>
+  <template match="s:validate">
+       <!--TODO-->
+       </template>
+  <template match="s:param">
+       <!--TODO-->
+       </template>
+  <template name="genInternalRuntimeFunctions">
+               function sortByDepthDeepToShallow(a,b){
+                       return b.depth - a.depth;
+               }
+       </template>
+  <template name="genBoilerplateDispatchCode">
+               //static private member variables
+               var currentConfiguration = []; //current configuration
+               var innerEventQueue = []; //inner event queue
+               var outerEventQueue = []; //outer event queue
+               var isInStableState = true;
+               var isPreempted = false;
+               var hasTakenDefaultTransition = false;
+               var destroyed = false;
+               var mainLoopCallback = null;
+
+               //static private member functions
+               function mainLoop() {
+
+                       if(!destroyed){
+                               //take an event from the current outer event 
queue
+                               if (outerEventQueue.length &amp;&amp; 
isInStableState) {
+                                       
runToCompletion(outerEventQueue.shift());
+                               }
+                               //call back
+                               mainLoopCallback = window.setTimeout(function() 
{
+                                       mainLoop(); //FIXME: note that when 
calling mainloop this way, we won't have access to the "this" object. 
+                                       //I don't think we ever use it though. 
Everything we need is private in function scope.
+                               },
+                               100);
+                       }
+               }
+
+               function runToCompletion(e){
+                       isInStableState = false;
+
+                       if(e){
+                               innerEventQueue.push(e);
+                       }
+
+                       do{
+                               //take any available default transitions
+                               microstep(<value-of 
select="$defaultEventLiteral"/>);
+
+                               if(!hasTakenDefaultTransition){
+                                       
+                                       if(!innerEventQueue.length){
+                                               //we have no more generated 
events, and no default transitions fired, so
+                                               //we are done, and have run to 
completion
+                                               break;
+                                       }else{
+                                               //microstep, then dequeue next 
event sending in event
+                                               
microstep(innerEventQueue.shift());
+                                       }
+                               }else{
+                                       //he has taken a default transition, so 
reset the global variable to false and loop again
+                                       hasTakenDefaultTransition = false;
+                               }
+
+                       }while(true)
+
+                       isInStableState = true;
+               }
+
+               function microstep(e){
+                       currentConfiguration.forEach(function(state){
+                               if(!isPreempted) 
+                                       <value-of select="$dispatchInvocation"/>
+                       });
+
+                       //reset the isPreempted flag
+                       isPreempted = false;
+               }
+
+
+               this.destroy = function(){
+                       //right now, this only disables timer and sets global 
destroyed variable to prevent future callbacks
+                       window.clearTimeout(mainLoopCallback);
+                       mainLoopCallback = null;
+                       destroyed = true;
+               }
+
+
+               //this is for async communication
+               this.GEN = function(e){
+                       outerEventQueue.push(e);
+               }
+
+               //this may or may not be something we want to expose, but for 
right now, we at least need it for testing
+               this.getCurrentConfiguration = function(){
+                       //slice it to return a copy of the configuration rather 
than the conf itself
+                       //this saves us all kinds of confusion involving 
references and stuff
+                       return <value-of 
select="$currentConfigurationExpression"/>;
+               }
+
+               //end static boilerplate code
+       </template>
+  <variable name="deepHistoryEnterAction">
+    <text>
+                       var topState;
+                       while(topState = statesEntered.pop()){
+                               topState.enterAction();
+                       }
+               </text>
+  </variable>
+  <variable name="shallowHistoryEnterAction">
+    <text>
+                       var topState = statesEntered.pop();
+
+                       topState.enterAction();
+
+                       newConfiguration.push(topState.initial ? 
topState.initial : topState ); 
+               </text>
+  </variable>
+  <variable name="genNonBasicTriggerDispatcherExitBlockInnerForEach">
+    <text>
+                       do{
+                               statesExited.push(state);
+                       }while((state = state.parent) &amp;&amp;
+                               state != lca &amp;&amp; 
+                               statesExited.indexOf(state) == -1)
+               </text>
+  </variable>
+  <template name="genHistoryTriggerDispatcher">
+    <param name="s"/>
+    <param name="t"/>
+    <variable name="isDeep" select="$s/@type = 'deep'"/>
+    <variable name="historyStateReference">
+      <call-template name="genHistoryTriggerDispatcherHistoryStateReference">
+        <with-param name="s" select="$s"/>
+      </call-template>
+    </variable>
+
+
+               //history state semantics
+               if(<value-of 
select="$historyStateReference"/>.lastConfiguration){
+
+                       //transition action
+                       <if test="$log"><choose><when test="$isDeep">
+                                               console.log("return to last 
deep configuration");
+                                       </when><otherwise>
+                                               console.log("return to last 
shallow configuration");
+                                       </otherwise></choose></if>
+                                       
+                               
+                       <!--gen executable content for t-->
+                       <apply-templates select="$t/*[self::s:if or 
self::s:raise or self::s:log or self::s:script or self::s:send or 
self::s:cancel or self::s:invoke or self::s:finalize or self::s:datamodel or 
self::s:data or self::s:assign or self::s:validate or self::s:param]"/>
+
+
+
+                       var historyState = <value-of 
select="$historyStateReference"/>;
+
+                       <if test="not($isDeep)">
+                               var newConfiguration = [];
+                       </if><value-of 
select="$historyStateReference"/>.lastConfiguration.forEach(function(state){
+                               <call-template 
name="genHistoryTriggerDispatcherInnerForEach"><with-param name="isDeep" 
select="$isDeep"/></call-template>
+                       });
+                       
+                       <choose><when test="$isDeep">
+                                       currentConfiguration =  <value-of 
select="$historyStateReference"/>.lastConfiguration.slice();
+                               </when><otherwise>
+                                       currentConfiguration = <value-of 
select="$genHistoryTriggerDispatcherCurrentConfigurationAssignmentRHS"/>;
+                               </otherwise></choose>
+                       
+               }else{
+                       <call-template 
name="genTriggerDispatcherContents"><with-param name="s" 
select="$s"/><with-param name="t" select="$t"/></call-template>
+               }
+       </template>
+  <template name="genHistoryTriggerDispatcherInnerForEach">
+    <param name="isDeep"/>
+
+               var statesEntered = [<value-of 
select="$genHistoryTriggerDispatcherInnerForEachStateReference"/>]; 
+
+               for(var parent = <value-of 
select="$genHistoryTriggerDispatcherInnerForEachStateReference"/>.parent; 
+                       parent != historyState.parent &amp;&amp; parent != 
null; 
+                       parent = parent.parent){
+                       statesEntered.push(parent);
+               }
+
+               
+               <choose><when test="$isDeep"><value-of 
select="$deepHistoryEnterAction"/></when><otherwise><value-of 
select="$shallowHistoryEnterAction"/></otherwise></choose></template>
+  <template name="genNonBasicTriggerDispatcherExitBlock">
+    <param name="t"/> 
+
+               var statesExited = [];
+               var lca = <value-of select="$t/c:lca"/>;
+
+               <value-of 
select="$genNonBasicTriggerDispatcherExitBlockIteratorExpression"/>.forEach(function(state){
+                       <value-of 
select="$genNonBasicTriggerDispatcherExitBlockInnerForEach"/>
+               });
+
+               //sort by depth
+               statesExited.sort(sortByDepthDeepToShallow);
+
+               //execute actions for each of these states
+               statesExited.forEach(function(state){
+                       state.exitAction();
+               });
+       </template>
+  <template name="genTriggerDispatcherContents">
+    <param name="s"/>
+    <param name="t"/>
+    <if test="not($t/@event)">
+                       hasTakenDefaultTransition = true;
+               </if>
+
+               //exit states
+               <choose><when test="local-name($s) = 'initial' or 
local-name($s) = 'history' or        ( $s/@c:isBasic and         ( 
not($s/@c:isParallelSubstate) or          ($s/@c:isParallelSubstate and 
not($t/@c:exitsParallelRegion))))"><for-each 
select="$t/c:exitpath/c:state"><value-of select="."/>.exitAction();
+                               </for-each></when><otherwise><call-template 
name="genNonBasicTriggerDispatcherExitBlock"><with-param name="t" 
select="$t"/></call-template></otherwise></choose>
+
+               //transition action
+               <apply-templates select="$t/*[self::s:if or self::s:raise or 
self::s:log or self::s:script or self::s:send or self::s:cancel or 
self::s:invoke or self::s:finalize or self::s:datamodel or self::s:data or 
self::s:assign or self::s:validate or self::s:param]"/>
+
+               //enter states
+               <for-each select="$t/c:targets/c:target/c:enterpath/c:state"> 
+                       <!-- iterate in reverse order -->
+                       <sort data-type="number" order="descending" 
select="position()"/><value-of select="."/>.enterAction();
+               </for-each>
+
+               //update configuration
+               <choose><when test="$s/@c:isParallelSubstate and 
not($t/@c:exitsParallelRegion)"><call-template 
name="genParallelSubstateConfigurationSetString"><with-param name="s" 
select="$s"/><with-param name="t" 
select="$t"/></call-template></when><otherwise><call-template 
name="genNonParallelSubstateConfigurationSetString"><with-param name="s" 
select="$s"/><with-param name="t" 
select="$t"/></call-template></otherwise></choose>
+
+
+               //set whether preempted
+               <if test="$t/@c:isPreempted">
+                       isPreempted = true;
+               </if></template>
+  <template name="genNoForEachArrayPrototypeExtension">
+               if(!Array.forEach){
+                       Array.prototype.forEach = function(fn){
+                               for(var i=0; i &lt; this.length; i++){
+                                       fn(this[i]);
+                               }
+                               return undefined;
+                       }
+               }
+       </template>
+  <template name="genNoIndexOfArrayPrototypeExtension">
+               if(!Array.indexOf){
+                       Array.prototype.indexOf = function(obj){
+                               for(var i=0; i &lt; this.length; i++){
+                                       if(this[i]==obj){
+                                               return i;
+                                       }
+                               }
+                               return -1;
+                       }
+               }
+       </template>
+  <template name="genNoMapArrayPrototypeExtension">
+               if(!Array.map){
+                       Array.prototype.map = function(fn){
+                               var toReturn = [];
+                               for(var i=0; i &lt; this.length; i++){
+                                       toReturn[i]=fn(this[i]);
+                               }
+                               return toReturn;
+                       }
+               }
+       </template>
+  <template name="genContextHooks"/>
+  <!-- these params get overridden by subclasses -->
+  <param name="dispatchInvocation" select="'state[e]();'"/>
+  <param name="defaultEventLiteral" select="'&quot;$default&quot;'"/>
+  <param name="currentConfigurationExpression" 
select="'currentConfiguration.slice()'"/>
+  <param name="genHistoryTriggerDispatcherCurrentConfigurationAssignmentRHS" 
select="'newConfiguration'"/>
+  <param name="genHistoryTriggerDispatcherInnerForEachStateReference" 
select="'state'"/>
+  <param name="genNonBasicTriggerDispatcherExitBlockIteratorExpression" 
select="'currentConfiguration'"/>
+  <template name="genStateHooks">
+    <param name="state"/>
+    <for-each select="$state/s:transition">
+      <call-template name="genTriggerDispatcherContext">
+        <with-param name="s" select="$state"/>
+        <with-param name="t" select="."/>
+      </call-template>
+    </for-each>
+  </template>
+  <template name="genExternalTriggerDispatcher">
+    <param name="event"/>
+
+               this.<value-of select="$event/c:name"/> = function(){
+                       if(isInStableState){
+                               runToCompletion("<value-of 
select="$event/c:name"/>");
+                       }else{
+                               return undefined;
+                       }
+               }
+       </template>
+  <template name="genParallelSubstateConfigurationSetString">
+    <param name="s"/>
+    <param name="t"/>
+
+               
currentConfiguration.splice(currentConfiguration.indexOf(this),1,
+                       <for-each 
select="$t/c:targets/c:target/c:targetState"><value-of select="."/><if 
test="not(position() = last())">,</if></for-each> 
+               ); 
+       </template>
+  <template name="genNonParallelSubstateConfigurationSetString">
+    <param name="t"/>
+    <param name="s"/>
+
+               currentConfiguration = [
+                       <for-each 
select="$t/c:targets/c:target/c:targetState"><value-of select="."/><if 
test="not(position() = last())">,</if></for-each>
+               ]; 
+       </template>
+  <template name="genInitialization">
+    <variable name="initialStateName">
+      <value-of 
select="/s:scxml/s:initial/s:transition/c:targets/c:target/c:targetState"/>
+    </variable>
+ 
+               this.initialize = function(){
+                       currentConfiguration = [<value-of 
select="$initialStateName"/>];
+                       runToCompletion();
+                       mainLoop();
+               }
+
+       </template>
+  <template name="genTriggerDispatcherContext">
+    <param name="s"/>
+    <param name="t"/>
+    <variable name="eventName">
+      <choose>
+        <when test="$t/@event">
+          <value-of select="$t/@event"/>
+        </when>
+        <otherwise>
+          <value-of select="'$default'"/>
+        </otherwise>
+      </choose>
+    </variable>
+
+               this.<value-of select="$eventName"/> = function(){
+                       <choose><when test="local-name($s) = 
'history'"><call-template name="genHistoryTriggerDispatcher"><with-param 
name="s" select="$s"/><with-param name="t" 
select="$t"/></call-template></when><otherwise><call-template 
name="genTriggerDispatcherContents"><with-param name="s" 
select="$s"/><with-param name="t" 
select="$t"/></call-template></otherwise></choose>
+               }
+       </template>
+  <template name="genHistoryTriggerDispatcherHistoryStateReference">
+    <param name="s"/>
+    <text>this</text>
+  </template>
+  <template match="s:send">
+    <choose>
+      <when test="@delay">
+                               window.setTimeout(function(){
+                                       self.GEN("<value-of select="@event"/>");
+                               },<value-of select="number(@delay)*1000"/>);
+                       </when>
+      <otherwise>
+                               innerEventQueue.push("<value-of 
select="@event"/>");
+                       </otherwise>
+    </choose>
+  </template>
+</stylesheet>

Propchange: 
commons/sandbox/gsoc/2010/scxml-js/branches/browser-tests.1.ie/src/xslt/backends/js/StatePatternStatechartGenerator_combined.xsl
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
commons/sandbox/gsoc/2010/scxml-js/branches/browser-tests.1.ie/test/SCXMLCompiler.js
URL: 
http://svn.apache.org/viewvc/commons/sandbox/gsoc/2010/scxml-js/branches/browser-tests.1.ie/test/SCXMLCompiler.js?rev=955120&r1=955119&r2=955120&view=diff
==============================================================================
--- 
commons/sandbox/gsoc/2010/scxml-js/branches/browser-tests.1.ie/test/SCXMLCompiler.js
 (original)
+++ 
commons/sandbox/gsoc/2010/scxml-js/branches/browser-tests.1.ie/test/SCXMLCompiler.js
 Wed Jun 16 03:20:05 2010
@@ -8,6 +8,38 @@ require.def(
                KitchenSink,
                StatePatternStatechartGenerator
        ){
+               //some compatibility stuff for IE
+               //TODO: move out into another file
+               if (!Array.indexOf) {
+                   Array.prototype.indexOf = function(obj) {
+                       for (var i = 0; i < this.length; i++) {
+                           if (this[i] == obj) {
+                               return i;
+                           }
+                       }
+                       return -1;
+                   }
+               }
+
+               if (!Array.map) {
+                   Array.prototype.map = function(fn) {
+                       var toReturn = [];
+                       for (var i = 0; i < this.length; i++) {
+                           toReturn[i] = fn(this[i]);
+                       }
+                       return toReturn;
+                   }
+               }
+
+               if (!Array.forEach) {
+                   Array.prototype.forEach = function(fn) {
+                       for (var i = 0; i < this.length; i++) {
+                           fn(this[i]);
+                       }
+                       return undefined;
+                   }
+               }
+
 
                var sourceDocument = KitchenSink;
                var transforms = 
StatePatternStatechartGenerator.transformations;
@@ -19,8 +51,13 @@ require.def(
                }
 
                function xmlToString(d){
-                       var s = new XMLSerializer();  
-                       var str = s.serializeToString(d);  
+                       var str;
+                       if(window.XMLSerializer){
+                               var s = new XMLSerializer();  
+                               str = s.serializeToString(d);  
+                       }else{
+                               str = d.xml;
+                       }
                        return str;
                }
 
@@ -31,38 +68,60 @@ require.def(
 
                return {        
                        compile : function(options){
-                               var processors = 
transforms.map(getProcessorFromStylesheetDocument); 
-
-                               //transform to IR
                                var docToTransform = sourceDocument;
-                               processors.forEach(function(p){
-                                       docToTransform = 
p.transformToDocument(docToTransform);
-                               });
-
-                               //print IR
-                               //console.log(xmlToString(docToTransform));  
-
-                               //transform to js
-                               var statePatternStatechartGeneratorProcessor =  
-                                        
getProcessorFromStylesheetDocument(StatePatternStatechartGenerator.code);
+
+                               var transformedJs;
+                               if(window.ActiveXObject){
+                                       //IE
+
+                                       //transform to IR
+                                       transforms.forEach(function(t){
+                                               var txt = 
docToTransform.transformNode(t); 
+
+                                               //TODO:can reuse same doc?
+                                               xmlDoc=new 
ActiveXObject("Microsoft.XMLDOM");
+                                               xmlDoc.async="false";
+                                               xmlDoc.loadXML(txt); 
        
-                               //set parameters
-                               for(optName in options){
-                                        
statePatternStatechartGeneratorProcessor.setParameter(null,optName,options[optName]);
-                               }
+                                               docToTransform = xmlDoc;        
+                                       });
 
-                               docToTransform = 
statePatternStatechartGeneratorProcessor.transformToDocument(docToTransform);
-                       
-                               //console.log(xmlToString(docToTransform));
-                               
//console.log(getResultTextFromDoc(docToTransform));
+                                       //transform to js
+                                       //TODO:set parameters
+                                       transformedJs = 
docToTransform.transformNode(StatePatternStatechartGenerator.code);
+                               }else{
+                                       //everything else
+
+                                       //transform to IR
+                                       var processors = 
transforms.map(getProcessorFromStylesheetDocument); 
+
+                                       processors.forEach(function(p){
+                                               docToTransform = 
p.transformToDocument(docToTransform);
+                                       });
+
+                                       //transform to js
+                                       var 
statePatternStatechartGeneratorProcessor =  
+                                                
getProcessorFromStylesheetDocument(StatePatternStatechartGenerator.code);
+               
+                                       //set parameters
+                                       for(optName in options){
+                                                
statePatternStatechartGeneratorProcessor.setParameter(null,optName,options[optName]);
+                                       }
 
-                               var transformedJs = 
getResultTextFromDoc(docToTransform);
+                                       docToTransform = 
statePatternStatechartGeneratorProcessor.transformToDocument(docToTransform);
 
+                                       transformedJs = 
getResultTextFromDoc(docToTransform);
+                               }
+
+
+                       
                                //optionally beautify it
                                if(options.beautify){
                                        transformedJs = 
js_beautify(transformedJs);
                                }
 
+                               console.log(transformedJs);
+
                                return transformedJs;
                        }
                }


Reply via email to