+
+
+
+
\ No newline at end of file
diff --git a/caravel-test/js/basic_triggering.js b/caravel-test/js/basic_triggering.js
index 104b2cf..d826da6 100644
--- a/caravel-test/js/basic_triggering.js
+++ b/caravel-test/js/basic_triggering.js
@@ -1,5 +1,5 @@
Caravel.getDefault().register("From iOS", function(name, data) {
- $('body').append('
Received From iOS!');
+ $('body').append('
Received From iOS!
');
});
Caravel.getDefault().post("From JS");
diff --git a/caravel-test/js/hazardous_data.js b/caravel-test/js/hazardous_data.js
new file mode 100644
index 0000000..4e42f97
--- /dev/null
+++ b/caravel-test/js/hazardous_data.js
@@ -0,0 +1,2 @@
+Caravel.get('@D@ngerousBus').post('@D@ngerousEvent', '@@@');
+Caravel.get('@D@ngerousBus').post('@D@ngerousBusWith@rgument');
\ No newline at end of file
diff --git a/caravel/ArgumentParser.swift b/caravel/ArgumentParser.swift
index 8c89dad..dafdeeb 100644
--- a/caravel/ArgumentParser.swift
+++ b/caravel/ArgumentParser.swift
@@ -14,49 +14,21 @@ import Foundation
*/
internal class ArgumentParser {
- internal class func parse(input: String) -> [String] {
- var outcome = [String]()
- var prev: Character?
- var buffer = String()
+ internal class func parse(input: String) -> (busName: String, eventName: String, eventData: String?) {
+ var queryPairs = input.componentsSeparatedByString("&")
+ var outcome: (busName: String, eventName: String, eventData: String?) = (busName: "", eventName: "", eventData: nil)
- if count(input) == 0 { // No arg
- return outcome
- }
-
- for current in input {
- if current == "@" {
- if prev != nil && prev != "\\" {
- // Arguments are split using "@" symbol
- // Existing "@" have been escaped before
- outcome.append(buffer)
- buffer = ""
- } else if prev != nil && prev == "\\" {
- // Escaped "@" symbol
- // Let's unescape it
- var i = 0, size = count(buffer)
- var s = ""
-
- for c in buffer {
- if i < size - 1 {
- s.append(c)
- }
- i++
- }
-
- buffer = s
- buffer.append(current)
- }
- // A "@" symbol cannot be first as it has been escaped, so no else condition
+ for p in queryPairs {
+ var keyValue = p.componentsSeparatedByString("=")
+ if keyValue[0] == "busName" {
+ outcome.busName = keyValue[1].stringByReplacingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
+ } else if keyValue[1] == "eventName" {
+ outcome.eventName = keyValue[1].stringByReplacingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
} else {
- buffer.append(current)
+ outcome.eventData = keyValue[1].stringByReplacingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
}
-
- prev = current
}
- // Add latest buffer
- outcome.append(buffer)
-
return outcome
}
}
\ No newline at end of file
diff --git a/caravel/Caravel.swift b/caravel/Caravel.swift
index f10a3d1..5aac349 100644
--- a/caravel/Caravel.swift
+++ b/caravel/Caravel.swift
@@ -89,18 +89,14 @@ public class Caravel: NSObject, UIWebViewDelegate {
* int, float, double, string
*/
public func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
- if let lastPathComponent: String = request.URL?.lastPathComponent {
-
- // The last path of the URL needs to contains at least the "caravel" word
- if count(lastPathComponent) > count("caravel") && (lastPathComponent as NSString).substringToIndex(count("caravel")) == "caravel" {
- var args = ArgumentParser.parse(lastPathComponent)
- var busName = args[1]
- var eventName = args[2]
+ if let scheme: String = request.URL?.scheme {
+ if scheme == "caravel" {
+ var args = ArgumentParser.parse(request.URL!.query!)
// All buses are notified about that incoming event. Then, they need to investigate first if they
// are potential receivers
- if _name == busName {
- if eventName == "CaravelInit" { // Reserved event name. Triggers whenReady
+ if _name == args.busName {
+ if args.eventName == "CaravelInit" { // Reserved event name. Triggers whenReady
objc_sync_enter(_initializationLock)
_isInitialized = true
@@ -114,14 +110,14 @@ public class Caravel: NSObject, UIWebViewDelegate {
} else {
var eventData: AnyObject? = nil
- if args.count > 3 { // Arg is optional
- eventData = DataSerializer.deserialize(args[3])
+ if let d = args.eventData { // Data are optional
+ eventData = DataSerializer.deserialize(d)
}
for s in _subscribers {
- if s.name == eventName {
+ if s.name == args.eventName {
dispatch_async(dispatch_get_main_queue()) {
- s.callback(eventName, eventData)
+ s.callback(args.eventName, eventData)
}
}
}
diff --git a/caravel/js/caravel.coffee b/caravel/js/caravel.coffee
index 102a87c..88de9d9 100644
--- a/caravel/js/caravel.coffee
+++ b/caravel/js/caravel.coffee
@@ -12,12 +12,12 @@ class Caravel
_post: (eventName, data) ->
# TODO: Improve that code using an AJAX request
iframe = document.createElement 'iframe'
- src = "caravel@#{@name}@#{eventName}"
+ src = "caravel://host.com?busName=#{encodeURIComponent(@name)}&eventName=#{encodeURIComponent(eventName)}"
if data?
if data instanceof Array or data instanceof Object
- src += "@#{JSON.stringify(data)}"
+ src += "&eventData=#{encodeURIComponent(JSON.stringify(data))}"
else
- src += "@#{data}"
+ src += "&eventData=#{encodeURIComponent(data)}"
iframe.setAttribute 'src', src
document.documentElement.appendChild iframe
iframe.parentNode.removeChild iframe
diff --git a/caravel/js/caravel.min.js b/caravel/js/caravel.min.js
index 9d0b76a..69cc9f5 100644
--- a/caravel/js/caravel.min.js
+++ b/caravel/js/caravel.min.js
@@ -1,2 +1,2 @@
-/** Caravel 0.3.1 - https://github.com/coshx/caravel */
-var Caravel;Caravel=function(){function Caravel(name){this.name=name,this.subscribers=[]}return Caravel["default"]=null,Caravel.buses=[],Caravel.prototype._post=function(eventName,data){var iframe,src;return iframe=document.createElement("iframe"),src="caravel@"+this.name+"@"+eventName,null!=data&&(src+=data instanceof Array||data instanceof Object?"@"+JSON.stringify(data):"@"+data),iframe.setAttribute("src",src),document.documentElement.appendChild(iframe),iframe.parentNode.removeChild(iframe)},Caravel.prototype.getName=function(){return this.name},Caravel.prototype.post=function(name,data){return this._post(name,data)},Caravel.prototype.register=function(name,callback){return this.subscribers.push({name:name,callback:callback})},Caravel.prototype.raise=function(name,data){var e,i,len,parsedData,ref,results;for(parsedData=data instanceof Array||data instanceof Object||"string"==typeof data||data instanceof String?data:JSON.parse(data),ref=this.subscribers,results=[],i=0,len=ref.length;len>i;i++)e=ref[i],e.name===name?results.push(e.callback(name,parsedData)):results.push(void 0);return results},Caravel.getDefault=function(){return null==Caravel["default"]&&(Caravel["default"]=new Caravel("default"),Caravel["default"].post("CaravelInit")),Caravel["default"]},Caravel.get=function(name){var b,i,len,ref;for(ref=Caravel.buses,i=0,len=ref.length;len>i;i++)if(b=ref[i],b.getName()===name)return b;return b=new Caravel(name),Caravel.buses.push(b),b.post("CaravelInit"),b},Caravel}();
\ No newline at end of file
+/** Caravel 0.3.2 - https://github.com/coshx/caravel */
+var Caravel;Caravel=function(){function Caravel(name){this.name=name,this.subscribers=[]}return Caravel["default"]=null,Caravel.buses=[],Caravel.prototype._post=function(eventName,data){var iframe,src;return iframe=document.createElement("iframe"),src="caravel://host.com?busName="+encodeURIComponent(this.name)+"&eventName="+encodeURIComponent(eventName),null!=data&&(src+=data instanceof Array||data instanceof Object?"&eventData="+encodeURIComponent(JSON.stringify(data)):"&eventData="+encodeURIComponent(data)),iframe.setAttribute("src",src),document.documentElement.appendChild(iframe),iframe.parentNode.removeChild(iframe)},Caravel.prototype.getName=function(){return this.name},Caravel.prototype.post=function(name,data){return this._post(name,data)},Caravel.prototype.register=function(name,callback){return this.subscribers.push({name:name,callback:callback})},Caravel.prototype.raise=function(name,data){var e,i,len,parsedData,ref,results;for(parsedData=data instanceof Array||data instanceof Object||"string"==typeof data||data instanceof String?data:JSON.parse(data),ref=this.subscribers,results=[],i=0,len=ref.length;len>i;i++)e=ref[i],e.name===name?results.push(e.callback(name,parsedData)):results.push(void 0);return results},Caravel.getDefault=function(){return null==Caravel["default"]&&(Caravel["default"]=new Caravel("default"),Caravel["default"].post("CaravelInit")),Caravel["default"]},Caravel.get=function(name){var b,i,len,ref;for(ref=Caravel.buses,i=0,len=ref.length;len>i;i++)if(b=ref[i],b.getName()===name)return b;return b=new Caravel(name),Caravel.buses.push(b),b.post("CaravelInit"),b},Caravel}();
\ No newline at end of file
From 7735a2f2954a60e75f6ca08d2b7b9187f820b271 Mon Sep 17 00:00:00 2001
From: Adrien Cadet
Date: Fri, 19 Jun 2015 19:03:26 -0700
Subject: [PATCH 2/9] Adds hints to existing tests
---
caravel-test/html/basic_triggering.html | 2 ++
caravel-test/html/event_name.html | 2 ++
caravel-test/html/initialization.html | 2 ++
caravel-test/html/multiple_subscribers.html | 2 ++
caravel-test/html/two_buses.html | 2 ++
caravel-test/html/two_events.html | 2 ++
6 files changed, 12 insertions(+)
diff --git a/caravel-test/html/basic_triggering.html b/caravel-test/html/basic_triggering.html
index c9f714d..0e629a0 100644
--- a/caravel-test/html/basic_triggering.html
+++ b/caravel-test/html/basic_triggering.html
@@ -1,5 +1,7 @@
Basic triggering
+
You should see:
Received From iOS!
+
\ No newline at end of file
diff --git a/caravel-test/html/event_name.html b/caravel-test/html/event_name.html
index a536d29..27b3ce6 100644
--- a/caravel-test/html/event_name.html
+++ b/caravel-test/html/event_name.html
@@ -1,5 +1,7 @@
Event name
+
You should only see
You should see me
+
\ No newline at end of file
diff --git a/caravel-test/html/initialization.html b/caravel-test/html/initialization.html
index 66c2d52..fb1d0a0 100644
--- a/caravel-test/html/initialization.html
+++ b/caravel-test/html/initialization.html
@@ -1,5 +1,7 @@
Initialization
+
You should see
Before
After
+
\ No newline at end of file
diff --git a/caravel-test/html/multiple_subscribers.html b/caravel-test/html/multiple_subscribers.html
index a007dfa..590a2ca 100644
--- a/caravel-test/html/multiple_subscribers.html
+++ b/caravel-test/html/multiple_subscribers.html
@@ -1,5 +1,7 @@
Multiple subscribers
+
You should see:
First!
Second!
+
\ No newline at end of file
diff --git a/caravel-test/html/two_buses.html b/caravel-test/html/two_buses.html
index 1f27e13..1c21eb3 100644
--- a/caravel-test/html/two_buses.html
+++ b/caravel-test/html/two_buses.html
@@ -1,5 +1,7 @@
Two buses
+
You should see
You should see me first and only once
You should see me after and only once
+
\ No newline at end of file
diff --git a/caravel-test/html/two_events.html b/caravel-test/html/two_events.html
index 0cf7b0b..177e977 100644
--- a/caravel-test/html/two_events.html
+++ b/caravel-test/html/two_events.html
@@ -1,5 +1,7 @@
Two events
+
You should only see
You should see me and only me
+
\ No newline at end of file
From 539c69514e825962605775b7e1aff435ef5c8c0f Mon Sep 17 00:00:00 2001
From: Adrien Cadet
Date: Fri, 19 Jun 2015 19:03:36 -0700
Subject: [PATCH 3/9] Fixes index trouble
---
caravel/ArgumentParser.swift | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/caravel/ArgumentParser.swift b/caravel/ArgumentParser.swift
index dafdeeb..8f44a8b 100644
--- a/caravel/ArgumentParser.swift
+++ b/caravel/ArgumentParser.swift
@@ -22,7 +22,7 @@ internal class ArgumentParser {
var keyValue = p.componentsSeparatedByString("=")
if keyValue[0] == "busName" {
outcome.busName = keyValue[1].stringByReplacingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
- } else if keyValue[1] == "eventName" {
+ } else if keyValue[0] == "eventName" {
outcome.eventName = keyValue[1].stringByReplacingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
} else {
outcome.eventData = keyValue[1].stringByReplacingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
From a7ee23a5f89c8a6618868d8b779bedab3cd6689b Mon Sep 17 00:00:00 2001
From: Adrien Cadet
Date: Fri, 19 Jun 2015 19:10:28 -0700
Subject: [PATCH 4/9] Night stashing - TOFIX
---
caravel-test/js/event_data.js | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/caravel-test/js/event_data.js b/caravel-test/js/event_data.js
index dc87f2b..e76f8f5 100644
--- a/caravel-test/js/event_data.js
+++ b/caravel-test/js/event_data.js
@@ -3,6 +3,9 @@ function ok(name) {
}
function fail(name, data) {
+ if ((data instanceof Array) || (data instanceof Object)) {
+ data = JSON.stringify(data);
+ }
$('body').append('