Updated Branches: refs/heads/master 993c3aec5 -> d5a72028f
Add logic to toggle between different exec() techniques on iOS. Project: http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/commit/d5a72028 Tree: http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/tree/d5a72028 Diff: http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/diff/d5a72028 Branch: refs/heads/master Commit: d5a72028f2375c9ba587e37a3e6f099765b50b03 Parents: 993c3ae Author: Andrew Grieve <agri...@chromium.org> Authored: Wed Aug 8 22:39:48 2012 -0400 Committer: Andrew Grieve <agri...@chromium.org> Committed: Fri Aug 17 12:39:36 2012 -0400 ---------------------------------------------------------------------- lib/ios/exec.js | 77 ++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 63 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cordova-js/blob/d5a72028/lib/ios/exec.js ---------------------------------------------------------------------- diff --git a/lib/ios/exec.js b/lib/ios/exec.js index bf0e1dd..ffe8710 100644 --- a/lib/ios/exec.js +++ b/lib/ios/exec.js @@ -5,20 +5,42 @@ * @private */ var cordova = require('cordova'), + channel = require('cordova/channel'), + nativecomm = require('cordova/plugin/ios/nativecomm'), utils = require('cordova/utils'), - gapBridge, - createGapBridge = function() { - - gapBridge = document.createElement("iframe"); - gapBridge.setAttribute("style", "display:none;"); - gapBridge.setAttribute("height","0px"); - gapBridge.setAttribute("width","0px"); - gapBridge.setAttribute("frameborder","0"); - document.documentElement.appendChild(gapBridge); + jsToNativeModes = { + IFRAME_NAV: 0, + XHR_NO_PAYLOAD: 1, + XHR_WITH_PAYLOAD: 2, + XHR_OPTIONAL_PAYLOAD: 3 }, - channel = require('cordova/channel'); + bridgeMode = jsToNativeModes.IFRAME_NAV, + execIframe, + execXhr; + +function createExecIframe() { + var iframe = document.createElement("iframe"); + iframe.style.display = 'none'; + document.body.appendChild(iframe); + return iframe; +} + +function shouldBundleCommandJson() { + if (bridgeMode == 2) { + return true; + } + if (bridgeMode == 3) { + var payloadLength = 0; + for (var i = 0; i < cordova.commandQueue.length; ++i) { + payloadLength += cordova.commandQueue[i].length; + } + // The value here was determined using the benchmark within CordovaLibApp on an iPad 3. + return payloadLength < 4500; + } + return false; +} -module.exports = function() { +function iOSExec() { if (!channel.onCordovaReady.fired) { utils.alert("ERROR: Attempting to call cordova.exec()" + " before 'deviceready'. Ignoring."); @@ -68,9 +90,36 @@ module.exports = function() { // commands to execute, unless the queue is currently being flushed, in // which case the command will be picked up without notification. if (cordova.commandQueue.length == 1 && !cordova.commandQueueFlushing) { - if (!gapBridge) { - createGapBridge(); + if (bridgeMode) { + execXhr = execXhr || new XMLHttpRequest(); + execXhr.open('HEAD', "file:///!gap_exec", true); + execXhr.setRequestHeader('vc', cordova.iOSVCAddr); + if (shouldBundleCommandJson()) { + execXhr.setRequestHeader('cmds', nativecomm()); + } + execXhr.send(null); + } else { + execIframe = execIframe || createExecIframe(); + execIframe.src = "gap://ready"; } - gapBridge.src = "gap://ready"; } +} + +iOSExec.jsToNativeModes = jsToNativeModes; + +iOSExec.setJsToNativeBridgeMode = function(mode) { + // Remove the iFrame since it may be no longer required, and its existence + // can trigger browser bugs. + // https://issues.apache.org/jira/browse/CB-593 + if (execIframe) { + execIframe.parentNode.removeChild(execIframe); + execIframe = null; + } + if (mode && !cordova.iOSVCAddr) { + alert('ViewController not correctly initialized for XHR mode.'); + mode = 0; + } + bridgeMode = mode; }; + +module.exports = iOSExec;