Bug 363395 - Firebug console messages do not appear in Eclipse any longer
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/CFThrowable.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/CFThrowable.java
index a91b140..16174f8 100644
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/CFThrowable.java
+++ b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/CFThrowable.java
@@ -34,7 +34,22 @@
 	 */
 	public CFThrowable(Map json) {
 		super();
-		frame = (Map) json.get(Attributes.FRAME);
+		if(json != null) {
+			frame = (Map) json.get(Attributes.FRAME);
+			if(frame != null) {
+				processFrame();
+			}
+			else {
+				Map map = (Map) json.get(Attributes.STACKTRACE);
+				if(map != null) {
+					//TODO process any frame infos we get
+				}
+			}
+			error = (Map) json.get(Attributes.ERROR);
+		}
+	}
+
+	void processFrame() {
 		if(frame != null) {
 			objects = new HashMap(frame.size());
 			Map vals = (Map) frame.remove(Attributes.VALUE);
@@ -63,9 +78,8 @@
 				objects.put(Attributes.THIS_VALUE, new CFObject(Attributes.THIS_VALUE, (String)vals.get(Attributes.TYPE), (Number) vals.get(Attributes.HANDLE)));
 			}
 		}
-		error = (Map) json.get(Attributes.ERROR);
 	}
-
+	
 	/**
 	 * Returns if the error was caused by the debugger or not
 	 * 
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFEventQueue.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFEventQueue.java
index 616f2df..e98e36f 100644
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFEventQueue.java
+++ b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFEventQueue.java
@@ -13,6 +13,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.MultiStatus;
@@ -212,7 +213,7 @@
 					}
 				}
 				else if(CFEventPacket.ON_CONSOLE_DEBUG.equals(name)) {
-					List info = (List) event.getBody().get(Attributes.DATA);
+					Map info = (Map) event.getBody().get(Attributes.VALUE);
 					if(info != null) {
 						log(IStatus.INFO, info);
 					}
@@ -222,17 +223,14 @@
 					return null;
 				}
 				else if(CFEventPacket.ON_CONSOLE_ERROR.equals(name)) {
-					List info = (List) event.getBody().get(Attributes.VALUE);
-					if(info != null) {
-						log(IStatus.ERROR, info);
-					}
+					logError(event.getBody());
 					if(TRACE) {
 						Tracing.writeString("QUEUE [event - "+CFEventPacket.ON_CONSOLE_ERROR+"] "+JSON.serialize(event)); //$NON-NLS-1$ //$NON-NLS-2$
 					}
 					return null;
 				}
 				else if(CFEventPacket.ON_CONSOLE_INFO.equals(name)) {
-					List info = (List) event.getBody().get(Attributes.DATA);
+					Map info = (Map) event.getBody().get(Attributes.VALUE);
 					if(info != null) {
 						log(IStatus.INFO, info);
 					}
@@ -242,7 +240,7 @@
 					return null;
 				}
 				else if(CFEventPacket.ON_CONSOLE_LOG.equals(name)) {
-					List info = (List) event.getBody().get(Attributes.DATA);
+					Map info = (Map) event.getBody().get(Attributes.VALUE);
 					if(info != null) {
 						log(IStatus.INFO, info);
 					}
@@ -252,7 +250,7 @@
 					return null;
 				}
 				else if(CFEventPacket.ON_CONSOLE_WARN.equals(name)) {
-					List info = (List) event.getBody().get(Attributes.DATA);
+					Map info = (Map) event.getBody().get(Attributes.VALUE);
 					if(info != null) {
 						log(IStatus.WARNING, info);
 					}
@@ -262,9 +260,6 @@
 					return null;
 				}
 				else if(CFEventPacket.ON_ERROR.equals(name)) {
-					//	"QueryInterface":{"type":"function","handle":30},
-					//	"pc":{"type":"number","value":26},
-					//	"eval":{"type":"function","handle":33},
 					Map body = event.getBody();
 					if(body != null) {
 						Throwable thro = new CFThrowable(body);
@@ -310,24 +305,47 @@
 		return null;
 	}
 	
+	void logError(Map info) {
+		if(info != null) {
+			MultiStatus mstatus = new MultiStatus(CrossFirePlugin.PLUGIN_ID, IStatus.ERROR, "Error message logged in Firebug console", null); //$NON-NLS-1$
+			String message = (String) info.get(Attributes.MESSAGE);
+			CFThrowable thrw = new CFThrowable((Map) info.get(Attributes.STACKTRACE));
+			if(message != null) {
+				IStatus status = new Status(IStatus.ERROR, CrossFirePlugin.PLUGIN_ID, message, thrw);
+				mstatus.add(status);
+			}
+			if(mstatus.getChildren().length > 0) {
+				CrossFirePlugin.log(mstatus);
+			}
+		}
+	}
+	
 	/**
 	 * Logs the entry from the queue
 	 * 
 	 * @param kind
 	 * @param objects
 	 */
-	void log(int kind, List objects) {
+	void log(int kind, Map objects) {
 		IStatus status = null;
 		if(objects.size() > 1) {
-			MultiStatus mstatus = new MultiStatus(CrossFirePlugin.PLUGIN_ID, kind, "Messages logged from Crossfire", null); //$NON-NLS-1$
-			for (Iterator i = objects.iterator(); i.hasNext();) {
-				mstatus.add(new Status(kind, CrossFirePlugin.PLUGIN_ID, i.next().toString()));
+			MultiStatus mstatus = new MultiStatus(CrossFirePlugin.PLUGIN_ID, kind, "Messages logged from Firebug console", null); //$NON-NLS-1$
+			Entry entry = null;
+			for (Iterator i = objects.entrySet().iterator(); i.hasNext();) {
+				entry = (Entry) i.next();
+				Object value = entry.getValue();
+				if(value instanceof Map) {
+					Map map = (Map) entry.getValue();
+					if(!map.containsKey(Attributes.HANDLE)) {
+						Object val = map.get(Attributes.VALUE);
+						if(val != null) {
+							mstatus.add(new Status(kind, CrossFirePlugin.PLUGIN_ID, val.toString()));
+						}
+					}
+				}
 			}
 			status = mstatus;
 		}
-		else if(objects.size() == 1) {
-			status = new Status(kind, CrossFirePlugin.PLUGIN_ID, objects.iterator().next().toString());
-		}
 		if(status != null) {
 			CrossFirePlugin.log(status);
 		}