123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- ;(function() {
- if (window.WebViewJavascriptBridge) { return }
- var messagingIframe
- var sendMessageQueue = []
- var receiveMessageQueue = []
- var messageHandlers = {}
-
- var CUSTOM_PROTOCOL_SCHEME = 'wvjbscheme'
- var QUEUE_HAS_MESSAGE = '__WVJB_QUEUE_MESSAGE__'
-
- var responseCallbacks = {}
- var uniqueId = 1
-
- function _createQueueReadyIframe(doc) {
- messagingIframe = doc.createElement('iframe')
- messagingIframe.style.display = 'none'
- messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE
- doc.documentElement.appendChild(messagingIframe)
- }
- function init(messageHandler) {
- if (WebViewJavascriptBridge._messageHandler) { throw new Error('WebViewJavascriptBridge.init called twice') }
- WebViewJavascriptBridge._messageHandler = messageHandler
- var receivedMessages = receiveMessageQueue
- receiveMessageQueue = null
- for (var i=0; i<receivedMessages.length; i++) {
- _dispatchMessageFromObjC(receivedMessages[i])
- }
- }
- function send(data, responseCallback) {
- _doSend({ data:data }, responseCallback)
- }
-
- function registerHandler(handlerName, handler) {
- messageHandlers[handlerName] = handler
- }
-
- function callHandler(handlerName, data, responseCallback) {
- _doSend({ handlerName:handlerName, data:data }, responseCallback)
- }
-
- function _doSend(message, responseCallback) {
- if (responseCallback) {
- var callbackId = 'cb_'+(uniqueId++)+'_'+new Date().getTime()
- responseCallbacks[callbackId] = responseCallback
- message['callbackId'] = callbackId
- }
- sendMessageQueue.push(message)
- messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE
- }
- function _fetchQueue() {
- var messageQueueString = JSON.stringify(sendMessageQueue)
- sendMessageQueue = []
- return messageQueueString
- }
- function _dispatchMessageFromObjC(messageJSON) {
- setTimeout(function _timeoutDispatchMessageFromObjC() {
- var message = JSON.parse(messageJSON)
- var messageHandler
-
- if (message.responseId) {
- var responseCallback = responseCallbacks[message.responseId]
- if (!responseCallback) { return; }
- responseCallback(message.responseData)
- delete responseCallbacks[message.responseId]
- } else {
- var responseCallback
- if (message.callbackId) {
- var callbackResponseId = message.callbackId
- responseCallback = function(responseData) {
- _doSend({ responseId:callbackResponseId, responseData:responseData })
- }
- }
-
- var handler = WebViewJavascriptBridge._messageHandler
- if (message.handlerName) {
- handler = messageHandlers[message.handlerName]
- }
-
- try {
- handler(message.data, responseCallback)
- } catch(exception) {
- if (typeof console != 'undefined') {
- console.log("WebViewJavascriptBridge: WARNING: javascript handler threw.", message, exception)
- }
- }
- }
- })
- }
-
- function _handleMessageFromObjC(messageJSON) {
- if (receiveMessageQueue) {
- receiveMessageQueue.push(messageJSON)
- } else {
- _dispatchMessageFromObjC(messageJSON)
- }
- }
- window.WebViewJavascriptBridge = {
- init: init,
- send: send,
- registerHandler: registerHandler,
- callHandler: callHandler,
- _fetchQueue: _fetchQueue,
- _handleMessageFromObjC: _handleMessageFromObjC
- }
- var doc = document
- _createQueueReadyIframe(doc)
- var readyEvent = doc.createEvent('Events')
- readyEvent.initEvent('WebViewJavascriptBridgeReady')
- readyEvent.bridge = WebViewJavascriptBridge
- doc.dispatchEvent(readyEvent)
- })();
|