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'> --> - - - + + +