Permalink
Browse files

Moved more dom stuff into platform.dom and fixed browser bugs. Now wo…

…rks in IE7-9.
  • Loading branch information...
1 parent 03b0d01 commit 008da7b2adfc915b06ffd7c83910f7f834779427 @jbeard4 committed Aug 11, 2012
Showing with 53 additions and 25 deletions.
  1. +12 −0 lib/browser/dom.js
  2. +14 −14 lib/core/util/annotate-scxml-json.js
  3. +10 −10 lib/core/util/code-gen.js
  4. +1 −1 lib/core/util/docToModel.js
  5. +16 −0 lib/embedded/dom.js
View
12 lib/browser/dom.js
@@ -24,6 +24,18 @@ function getItem(nodeList,index){
var dom = Object.create(baseDom);
+dom.hasAttribute = function(node,attribute){
+ return node.hasAttribute ? node.hasAttribute(attribute) : node.getAttribute(attribute);
+};
+
+dom.localName = function(node){
+ return node.localName || node.tagName;
+};
+
+dom.createElementNS = function(doc,ns,localName){
+ return doc.createElementNS ? doc.createElementNS(ns,localName) : doc.createElement(localName);
+};
+
dom.getChildren = function(node){
var toReturn = [];
for(var i = 0; i < node.childNodes.length; i++){
View
28 lib/core/util/annotate-scxml-json.js
@@ -31,17 +31,17 @@ var STATES_THAT_CAN_BE_CHILDREN = ["state", "parallel", "history", "final", "ini
STATE_TAGS = STATES_THAT_CAN_BE_CHILDREN.concat("scxml");
-var states, basicStates, uniqueEvents, transitions, idToStateMap, onFoundStateIdCallbacks, datamodel, document;
+var states, basicStates, uniqueEvents, transitions, idToStateMap, onFoundStateIdCallbacks, datamodel, doc;
var transformAndSerialize = exports.transformAndSerialize = transformAndSerialize = function(root) {
return JSON.stringify(transform(root));
};
-var transform = exports.transform = function(doc) {
+var transform = exports.transform = function(scxmlDoc) {
- document = doc;
+ doc = scxmlDoc;
- var root = document.documentElement;
+ var root = doc.documentElement;
states = [];
basicStates = [];
@@ -110,7 +110,7 @@ function transformTransitionNode (transitionNode, parentState) {
//wildcard "*" event will show up on transition.events, but will not show up in uniqueEvents
//default transitions (those without events) will have events set to undefined (rather than empty array)
- if (transitionNode.hasAttribute('event')) {
+ if (pm.platform.dom.hasAttribute(transitionNode,'event')) {
var events;
var event = pm.platform.dom.getAttribute(transitionNode,'event');
@@ -145,7 +145,7 @@ function transformTransitionNode (transitionNode, parentState) {
source: parentState.id,
cond: pm.platform.dom.getAttribute(transitionNode,"cond"),
events: events,
- targets: transitionNode.hasAttribute("target") ? pm.platform.dom.getAttribute(transitionNode,"target").trim().split(/\s+/) : null
+ targets: pm.platform.dom.hasAttribute(transitionNode,"target") ? pm.platform.dom.getAttribute(transitionNode,"target").trim().split(/\s+/) : null
};
if(pm.platform.dom.getElementChildren(transitionNode).length) transition.actions = codeGen.gen.parentToFnBody(transitionNode);
@@ -159,14 +159,14 @@ function transformTransitionNode (transitionNode, parentState) {
function transformDatamodel(node, ancestors) {
pm.platform.dom.getChildren(node).filter(function(child){return pm.platform.dom.localName(child) === 'data';}).forEach(function(child){
- if (child.hasAttribute("id")) {
- datamodel[pm.platform.dom.getAttribute(child,"id")] = child.hasAttribute("expr") ? pm.platform.dom.getAttribute(child,"expr") : null;
+ if (pm.platform.dom.hasAttribute(child,"id")) {
+ datamodel[pm.platform.dom.getAttribute(child,"id")] = pm.platform.dom.hasAttribute(child,"expr") ? pm.platform.dom.getAttribute(child,"expr") : null;
}
});
}
function transformStateNode(node, ancestors) {
- var id = node.hasAttribute("id") ? pm.platform.dom.getAttribute(node,"id") : genId(pm.platform.dom.localName(node));
+ var id = pm.platform.dom.hasAttribute(node,"id") ? pm.platform.dom.getAttribute(node,"id") : genId(pm.platform.dom.localName(node));
var kind;
switch (pm.platform.dom.localName(node)) {
@@ -278,14 +278,14 @@ function transformStateNode(node, ancestors) {
});
if (!processedInitial && pm.platform.dom.localName(node) !== "parallel") {
- var hasInitialAttribute = node.hasAttribute("initial");
+ var hasInitialAttribute = pm.platform.dom.hasAttribute(node,"initial");
//create a fake initial state and process him
var generateFakeInitialState = function(targetId) {
- var initial = document.createElementNS(constants.SCXML_NS,"initial");
- var transition = document.createElementNS(constants.SCXML_NS,"transition");
- transition.setAttribute("target",targetId);
- initial.appendChild(transition);
+ var initial = pm.platform.dom.createElementNS(doc,constants.SCXML_NS,"initial");
+ var transition = pm.platform.dom.createElementNS(doc,constants.SCXML_NS,"transition");
+ pm.platform.dom.setAttribute(transition,"target",targetId);
+ pm.platform.dom.appendChild(initial,transition);
return processInitialState(initial);
};
View
20 lib/core/util/code-gen.js
@@ -102,8 +102,8 @@ var actionTags = {
"log" : function(action){
var params = [];
- if(action.hasAttribute("label")) params.push( JSON.stringify(pm.platform.dom.getAttribute(action,"label")));
- if(action.hasAttribute("expr")) params.push( pm.platform.dom.getAttribute(action,"expr"));
+ if(pm.platform.dom.hasAttribute(action,"label")) params.push( JSON.stringify(pm.platform.dom.getAttribute(action,"label")));
+ if(pm.platform.dom.hasAttribute(action,"expr")) params.push( pm.platform.dom.getAttribute(action,"expr"));
return "$log(" + params.join(",") + ");";
},
@@ -118,19 +118,19 @@ var actionTags = {
"send" : function(action){
return "$send({\n" +
- "target: " + (action.hasAttribute("targetexpr") ? pm.platform.dom.getAttribute(action,"targetexpr") : JSON.stringify(pm.platform.dom.getAttribute(action,"target"))) + ",\n" +
- "name: " + (action.hasAttribute("eventexpr") ? pm.platform.dom.getAttribute(action,"eventexpr") : JSON.stringify(pm.platform.dom.getAttribute(action,"event"))) + ",\n" +
- "type: " + (action.hasAttribute("typeexpr") ? pm.platform.dom.getAttribute(action,"typeexpr") : JSON.stringify(pm.platform.dom.getAttribute(action,"type"))) + ",\n" +
+ "target: " + (pm.platform.dom.hasAttribute(action,"targetexpr") ? pm.platform.dom.getAttribute(action,"targetexpr") : JSON.stringify(pm.platform.dom.getAttribute(action,"target"))) + ",\n" +
+ "name: " + (pm.platform.dom.hasAttribute(action,"eventexpr") ? pm.platform.dom.getAttribute(action,"eventexpr") : JSON.stringify(pm.platform.dom.getAttribute(action,"event"))) + ",\n" +
+ "type: " + (pm.platform.dom.hasAttribute(action,"typeexpr") ? pm.platform.dom.getAttribute(action,"typeexpr") : JSON.stringify(pm.platform.dom.getAttribute(action,"type"))) + ",\n" +
"data: " + constructSendEventData(action) + ",\n" +
"origin: $origin\n" +
"}, {\n" +
- "delay: " + (action.hasAttribute("delayexpr") ? pm.platform.dom.getAttribute(action,"delayexpr") : getDelayInMs(pm.platform.dom.getAttribute(action,"delay"))) + ",\n" +
- "sendId: " + (action.hasAttribute("idlocation") ? pm.platform.dom.getAttribute(action,"idlocation") : JSON.stringify(pm.platform.dom.getAttribute(action,"id"))) + "\n" +
+ "delay: " + (pm.platform.dom.hasAttribute(action,"delayexpr") ? pm.platform.dom.getAttribute(action,"delayexpr") : getDelayInMs(pm.platform.dom.getAttribute(action,"delay"))) + ",\n" +
+ "sendId: " + (pm.platform.dom.hasAttribute(action,"idlocation") ? pm.platform.dom.getAttribute(action,"idlocation") : JSON.stringify(pm.platform.dom.getAttribute(action,"id"))) + "\n" +
"});";
},
"foreach" : function(action){
- var isIndexDefined = action.hasAttribute("index"),
+ var isIndexDefined = pm.platform.dom.hasAttribute(action,"index"),
index = pm.platform.dom.getAttribute(action,"index") || "$i", //FIXME: the index variable could shadow the datamodel. We should pick a unique temperorary variable name
item = pm.platform.dom.getAttribute(action,"item"),
arr = pm.platform.dom.getAttribute(action,"array");
@@ -221,14 +221,14 @@ function makeActionFactory(topLevelScripts,actionStrings,datamodel){
function constructSendEventData(action){
- var namelist = action.hasAttribute("namelist") ? pm.platform.dom.getAttribute(action,"namelist").trim().split(/ +/) : null,
+ var namelist = pm.platform.dom.hasAttribute(action,"namelist") ? pm.platform.dom.getAttribute(action,"namelist").trim().split(/ +/) : null,
params = pm.platform.dom.getChildren(action).filter(function(child){return pm.platform.dom.localName(child) === 'param';}),
content = pm.platform.dom.getChildren(action).filter(function(child){return pm.platform.dom.localName(child) === 'content';});
if(content.length){
//TODO: instead of using textContent, serialize the XML
return JSON.stringify(content.map(function(child){return pm.platform.dom.textContent(child);})[0]);
- }else if(action.hasAttribute("contentexpr")){
+ }else if(pm.platform.dom.hasAttribute(action,"contentexpr")){
return pm.platform.dom.getAttribute(action,"contentexpr");
}else{
var s = "{";
View
2 lib/core/util/docToModel.js
@@ -86,7 +86,7 @@ function inlineSrcs(url,doc,cb){
}
function traverse(node,nodeList){
- if((pm.platform.dom.localName(node) === 'script' || pm.platform.dom.localName(node) === 'data') && node.hasAttribute("src")){
+ if((pm.platform.dom.localName(node) === 'script' || pm.platform.dom.localName(node) === 'data') && pm.platform.dom.hasAttribute(node,"src")){
nodeList.push(node);
}
View
16 lib/embedded/dom.js
@@ -32,10 +32,26 @@ module.exports = {
return node.getAttribute(attribute);
},
+ hasAttribute : function(node,attribute){
+ return node.hasAttribute(attribute);
+ },
+
namespaceURI : function(node){
return node.namespaceURI;
},
+ createElementNS : function(doc,ns,localName){
+ return doc.createElementNS(ns,localName);
+ },
+
+ setAttribute : function(node,name,value){
+ return node.setAttribute(name,value);
+ },
+
+ appendChild : function(parent,child){
+ return parent.appendChild(child);
+ },
+
textContent : function(node,txt){
if(txt === undefined){
if(node.nodeType === 1){

0 comments on commit 008da7b

Please sign in to comment.