diff --git a/include/fab-test/FABTest.as b/include/fab-test/FABTest.as
new file mode 100644
index 00000000..fe3ed616
--- /dev/null
+++ b/include/fab-test/FABTest.as
@@ -0,0 +1,37 @@
+package {
+
+import flash.events.*;
+import flash.external.*;
+import flash.utils.*;
+
+[Event(name="message", type="FABTestMessageEvent")]
+public class FABTest extends EventDispatcher {
+
+ private var main:FABTestMain;
+ private var intervalID:int;
+ private var seqCnt:int;
+
+ public function FABTest(main:FABTestMain) {
+ this.main = main;
+ ExternalInterface.call("console.log", "[FABTest] FABTest()");
+ }
+
+ public function start(eventDelay:int):void {
+ ExternalInterface.call("console.log", "[FABTest] start()");
+ seqCnt = 0;
+ intervalID = setInterval(sendEvent, eventDelay);
+ }
+
+ public function stop():void {
+ ExternalInterface.call("console.log", "[FABTest] stop()");
+ clearInterval(intervalID);
+ }
+
+ private function sendEvent():void {
+ //ExternalInterface.call("console.log", "[FABTest] sendEvent " + seqCnt);
+ dispatchEvent(new FABTestMessageEvent("message", encodeURIComponent(seqCnt.toString())));
+ seqCnt = seqCnt + 1;
+ }
+}
+
+}
diff --git a/include/fab-test/FABTestMain.as b/include/fab-test/FABTestMain.as
new file mode 100644
index 00000000..e16ded98
--- /dev/null
+++ b/include/fab-test/FABTestMain.as
@@ -0,0 +1,28 @@
+package {
+
+import flash.display.*;
+import flash.events.*;
+import bridge.FABridge;
+
+public class FABTestMain extends Sprite {
+
+ public function FABTestMain() {
+
+ // This is to avoid "You are trying to call recursively into the Flash Player ..."
+ // error which (I heard) happens when you pass bunch of messages.
+ // This workaround was written here:
+ // http://www.themorphicgroup.com/blog/2009/02/14/fabridge-error-you-are-trying-to-call-recursively-into-the-flash-player-which-is-not-allowed/
+ FABridge.EventsToCallLater["flash.events::Event"] = "true";
+ FABridge.EventsToCallLater["FABTestMessageEvent"] = "true";
+
+ var fab:FABridge = new FABridge();
+ fab.rootObject = this;
+ //log("Flash initialized");
+ }
+
+ public function create():FABTest {
+ return new FABTest(this);
+ }
+}
+
+}
diff --git a/include/fab-test/FABTestMain.swf b/include/fab-test/FABTestMain.swf
new file mode 100644
index 00000000..fcdb9c8a
Binary files /dev/null and b/include/fab-test/FABTestMain.swf differ
diff --git a/include/fab-test/FABTestMessageEvent.as b/include/fab-test/FABTestMessageEvent.as
new file mode 100644
index 00000000..fbf14650
--- /dev/null
+++ b/include/fab-test/FABTestMessageEvent.as
@@ -0,0 +1,14 @@
+package {
+
+import flash.events.*;
+
+public class FABTestMessageEvent extends Event {
+ public var data:String;
+
+ public function FABTestMessageEvent(type:String, data:String) {
+ super(type);
+ this.data = data;
+ }
+}
+
+}
diff --git a/include/fab-test/bridge/FABridge.as b/include/fab-test/bridge/FABridge.as
new file mode 120000
index 00000000..7d525f84
--- /dev/null
+++ b/include/fab-test/bridge/FABridge.as
@@ -0,0 +1 @@
+../../web-socket-js/flash-src/bridge/FABridge.as
\ No newline at end of file
diff --git a/include/fab-test/fab-test.js b/include/fab-test/fab-test.js
new file mode 100755
index 00000000..499366e5
--- /dev/null
+++ b/include/fab-test/fab-test.js
@@ -0,0 +1,136 @@
+// Copyright: Hiroshi Ichikawa
+// Lincense: New BSD Lincense
+
+(function() {
+
+ var console = window.console;
+ if (!console) console = {log: function(){ }, error: function(){ }};
+
+ function hasFlash() {
+ if ('navigator' in window && 'plugins' in navigator && navigator.plugins['Shockwave Flash']) {
+ return !!navigator.plugins['Shockwave Flash'].description;
+ }
+ if ('ActiveXObject' in window) {
+ try {
+ return !!new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');
+ } catch (e) {}
+ }
+ return false;
+ }
+
+ if (!hasFlash()) {
+ console.error("Flash Player is not installed.");
+ return;
+ }
+
+ FABTest = function() {
+ var self = this;
+ FABTest.__addTask(function() {
+ self.__flash =
+ FABTest.__flash.create();
+
+ self.__flash.addEventListener("message", function(fe) {
+ var data = decodeURIComponent(fe.getData());
+ try {
+ if (self.onmessage) {
+ var e;
+ if (window.MessageEvent) {
+ e = document.createEvent("MessageEvent");
+ e.initMessageEvent("message", false, false, data, null, null, window);
+ } else { // IE
+ e = {data: data};
+ }
+ self.onmessage(e);
+ }
+ } catch (e) {
+ console.error(e.toString());
+ }
+ });
+
+ //console.log("[FABTest] Flash object is ready");
+ });
+ }
+
+ FABTest.prototype.start = function(eventDelay) {
+ if (!this.__flash) {
+ throw "INVALID_STATE_ERR: FABTest connection has not been established";
+ }
+ var result = this.__flash.start(eventDelay);
+ if (result < 0) { // success
+ return true;
+ } else {
+ return false;
+ }
+ };
+
+ FABTest.prototype.stop = function() {
+ if (!this.__flash) return;
+ this.__flash.stop();
+ };
+
+
+
+ FABTest.__tasks = [];
+
+ FABTest.__initialize = function() {
+ if (!FABTest.__swfLocation) {
+ console.error("[FABTest] set FABTest.__swfLocation to location of FABTestMain.swf");
+ return;
+ }
+ var container = document.createElement("div");
+ container.id = "fabTestContainer";
+ // Puts the Flash out of the window. Note that we cannot use display: none or visibility: hidden
+ // here because it prevents Flash from loading at least in IE.
+ container.style.position = "absolute";
+ container.style.left = "-100px";
+ container.style.top = "-100px";
+ var holder = document.createElement("div");
+ holder.id = "fabTestFlash";
+ container.appendChild(holder);
+ document.body.appendChild(container);
+ swfobject.embedSWF(
+ FABTest.__swfLocation, "fabTestFlash", "8", "8", "9.0.0",
+ null, {bridgeName: "fabTest"}, null, null,
+ function(e) {
+ if (!e.success) console.error("[FABTest] swfobject.embedSWF failed");
+ }
+ );
+ FABridge.addInitializationCallback("fabTest", function() {
+ try {
+ console.log("[FABTest] FABridge initializad");
+ FABTest.__flash = FABridge.fabTest.root();
+ for (var i = 0; i < FABTest.__tasks.length; ++i) {
+ FABTest.__tasks[i]();
+ }
+ FABTest.__tasks = [];
+ } catch (e) {
+ console.error("[FABTest] " + e.toString());
+ }
+ });
+ };
+
+ FABTest.__addTask = function(task) {
+ if (FABTest.__flash) {
+ task();
+ } else {
+ FABTest.__tasks.push(task);
+ }
+ }
+
+ // called from Flash
+ function fabTestLog(message) {
+ console.log(decodeURIComponent(message));
+ }
+
+ // called from Flash
+ function fabTestError(message) {
+ console.error(decodeURIComponent(message));
+ }
+
+ if (window.addEventListener) {
+ window.addEventListener("load", FABTest.__initialize, false);
+ } else {
+ window.attachEvent("onload", FABTest.__initialize);
+ }
+
+})();
diff --git a/tests/fab.html b/tests/fab.html
new file mode 100644
index 00000000..6079eccc
--- /dev/null
+++ b/tests/fab.html
@@ -0,0 +1,114 @@
+
+
+
FABridge Event Test
+
+
+
+ Event Delay (ms):
+
+
+
+
+
+ Good Events Received: |
+ 0 |
+
+ Errors (Bad Events Received:) |
+ 0 |
+
+
+
+
+ Errors:
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/wstest.html b/tests/ws.html
similarity index 98%
rename from wstest.html
rename to tests/ws.html
index c0ca6230..a2f223d1 100644
--- a/wstest.html
+++ b/tests/ws.html
@@ -37,9 +37,9 @@
src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'>
-->
-
-
-
+
+
+