Skip to content

Commit 9297f5c

Browse files
committed
encode message queue as JSON
If JS included the separator as part of its data, the Obj-C side would interpret it incorrectly: WebViewJavascriptBridge.send('Including __WVJB_MESSAGE_SEPERATOR__ in my message is broken.'); Before: WVJB receivd: {"data":"Including WVJB receivd: in my message is broken."} After: WVJB receivd: {"data":"Including __WVJB_MESSAGE_SEPERATOR__ in my message is broken."}
1 parent 3ba0b84 commit 9297f5c

File tree

3 files changed

+20
-13
lines changed

3 files changed

+20
-13
lines changed

WebViewJavascriptBridge/WebViewJavascriptBridge.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
#import <Foundation/Foundation.h>
1010

11-
#define kMessageSeparator @"__WVJB_MESSAGE_SEPERATOR__"
1211
#define kCustomProtocolScheme @"wvjbscheme"
1312
#define kQueueHasMessage @"__WVJB_QUEUE_MESSAGE__"
1413

WebViewJavascriptBridge/WebViewJavascriptBridge.js.txt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
var receiveMessageQueue = []
66
var messageHandlers = {}
77

8-
var MESSAGE_SEPARATOR = '__WVJB_MESSAGE_SEPERATOR__'
98
var CUSTOM_PROTOCOL_SCHEME = 'wvjbscheme'
109
var QUEUE_HAS_MESSAGE = '__WVJB_QUEUE_MESSAGE__'
1110

@@ -46,12 +45,12 @@
4645
responseCallbacks[callbackId] = responseCallback
4746
message['callbackId'] = callbackId
4847
}
49-
sendMessageQueue.push(JSON.stringify(message))
48+
sendMessageQueue.push(message)
5049
messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE
5150
}
5251

5352
function _fetchQueue() {
54-
var messageQueueString = sendMessageQueue.join(MESSAGE_SEPARATOR)
53+
var messageQueueString = JSON.stringify(sendMessageQueue)
5554
sendMessageQueue = []
5655
return messageQueueString
5756
}

WebViewJavascriptBridge/WebViewJavascriptBridge.m

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -138,12 +138,18 @@ - (void)_dispatchMessage:(NSDictionary *)message {
138138
- (void)_flushMessageQueue {
139139
NSString *messageQueueString = [_webView stringByEvaluatingJavaScriptFromString:@"WebViewJavascriptBridge._fetchQueue();"];
140140

141-
NSArray* messages = [messageQueueString componentsSeparatedByString:kMessageSeparator];
142-
for (NSString *messageJSON in messages) {
143-
[self _log:@"receivd" json:messageJSON];
144-
145-
NSDictionary* message = [self _deserializeMessageJSON:messageJSON];
146-
141+
id messages = [self _deserializeMessageJSON:messageQueueString];
142+
if (![messages isKindOfClass:[NSArray class]]) {
143+
NSLog(@"WebViewJavascriptBridge: WARNING: Invalid %@ received: %@", [messages class], messages);
144+
return;
145+
}
146+
for (NSDictionary *message in messages) {
147+
if (![message isKindOfClass:[NSDictionary class]]) {
148+
NSLog(@"WebViewJavascriptBridge: WARNING: Invalid %@ received: %@", [message class], message);
149+
continue;
150+
}
151+
[self _log:@"receivd" json:message];
152+
147153
NSString* responseId = message[@"responseId"];
148154
if (responseId) {
149155
WVJBResponseCallback responseCallback = _responseCallbacks[responseId];
@@ -202,10 +208,13 @@ - (NSDictionary *)_deserializeMessageJSON:(NSString *)messageJSON {
202208
#endif
203209
}
204210

205-
- (void)_log:(NSString *)action json:(NSString *)json {
211+
- (void)_log:(NSString *)action json:(id)json {
206212
if (!logging) { return; }
207-
if (json.length > 500) {
208-
NSLog(@"WVJB %@: %@", action, [[json substringToIndex:500] stringByAppendingString:@" [...]"]);
213+
if (![json isKindOfClass:[NSString class]]) {
214+
json = [self _serializeMessage:json];
215+
}
216+
if ([json length] > 500) {
217+
NSLog(@"WVJB %@: %@ [...]", action, [json substringToIndex:500]);
209218
} else {
210219
NSLog(@"WVJB %@: %@", action, json);
211220
}

0 commit comments

Comments
 (0)