Andrew, I'll add a doc issue for this, although I don't know where the doc will go yet exactly. Also perhaps a mobile-spec issue. I'll update the ios repo with the new js in the interim.
On Fri, Aug 17, 2012 at 9:40 AM, <[email protected]> wrote: > 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 <[email protected]> > Authored: Wed Aug 8 22:39:48 2012 -0400 > Committer: Andrew Grieve <[email protected]> > 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; >
