Update JS snapshot to version 3.5.0-dev-81f9a00

This commit is contained in:
Ian Clelland 2014-04-02 13:27:59 -04:00
parent 298cd9e065
commit 0add4af208

View File

@ -1,5 +1,5 @@
// Platform: android // Platform: android
// 3.5.0-dev-ddf13aa // 3.5.0-dev-81f9a00
/* /*
Licensed to the Apache Software Foundation (ASF) under one Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file or more contributor license agreements. See the NOTICE file
@ -19,7 +19,7 @@
under the License. under the License.
*/ */
;(function() { ;(function() {
var CORDOVA_JS_BUILD_LABEL = '3.5.0-dev-ddf13aa'; var CORDOVA_JS_BUILD_LABEL = '3.5.0-dev-81f9a00';
// file: src/scripts/require.js // file: src/scripts/require.js
/*jshint -W079 */ /*jshint -W079 */
@ -437,6 +437,16 @@ base64.fromArrayBuffer = function(arrayBuffer) {
return uint8ToBase64(array); return uint8ToBase64(array);
}; };
base64.toArrayBuffer = function(str) {
var decodedStr = typeof atob != 'undefined' ? atob(str) : new Buffer(str,'base64').toString('binary');
var arrayBuffer = new ArrayBuffer(decodedStr.length);
var array = new Uint8Array(arrayBuffer);
for (var i=0, len=decodedStr.length; i < len; i++) {
array[i] = decodedStr.charCodeAt(i);
}
return arrayBuffer;
};
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
/* This code is based on the performance tests at http://jsperf.com/b64tests /* This code is based on the performance tests at http://jsperf.com/b64tests
@ -919,7 +929,7 @@ function androidExec(success, fail, service, action, args) {
androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT); androidExec.setJsToNativeBridgeMode(jsToNativeModes.JS_OBJECT);
return; return;
} else { } else {
androidExec.processMessages(messages); androidExec.processMessages(messages, true);
} }
} }
} }
@ -963,7 +973,6 @@ androidExec.nativeToJsModes = nativeToJsModes;
androidExec.setJsToNativeBridgeMode = function(mode) { androidExec.setJsToNativeBridgeMode = function(mode) {
if (mode == jsToNativeModes.JS_OBJECT && !window._cordovaNative) { if (mode == jsToNativeModes.JS_OBJECT && !window._cordovaNative) {
console.log('Falling back on PROMPT mode since _cordovaNative is missing. Expected for Android 3.2 and lower only.');
mode = jsToNativeModes.PROMPT; mode = jsToNativeModes.PROMPT;
} }
nativeApiProvider.setPreferPrompt(mode == jsToNativeModes.PROMPT); nativeApiProvider.setPreferPrompt(mode == jsToNativeModes.PROMPT);
@ -1028,48 +1037,64 @@ function processMessage(message) {
} }
cordova.callbackFromNative(callbackId, success, status, [payload], keepCallback); cordova.callbackFromNative(callbackId, success, status, [payload], keepCallback);
} else { } else {
console.log("processMessage failed: invalid message:" + message); console.log("processMessage failed: invalid message: " + JSON.stringify(message));
} }
} catch (e) { } catch (e) {
console.log("processMessage failed: Message: " + message);
console.log("processMessage failed: Error: " + e); console.log("processMessage failed: Error: " + e);
console.log("processMessage failed: Stack: " + e.stack); console.log("processMessage failed: Stack: " + e.stack);
console.log("processMessage failed: Message: " + message);
} }
} }
var isProcessing = false;
// This is called from the NativeToJsMessageQueue.java. // This is called from the NativeToJsMessageQueue.java.
androidExec.processMessages = function(messages) { androidExec.processMessages = function(messages, opt_useTimeout) {
if (messages) { if (messages) {
messagesFromNative.push(messages); messagesFromNative.push(messages);
// Check for the reentrant case, and enqueue the message if that's the case. }
if (messagesFromNative.length > 1) { // Check for the reentrant case.
return; if (isProcessing) {
} return;
}
if (opt_useTimeout) {
window.setTimeout(androidExec.processMessages, 0);
return;
}
isProcessing = true;
try {
// TODO: add setImmediate polyfill and process only one message at a time.
while (messagesFromNative.length) { while (messagesFromNative.length) {
// Don't unshift until the end so that reentrancy can be detected. var msg = popMessageFromQueue();
messages = messagesFromNative[0];
// The Java side can send a * message to indicate that it // The Java side can send a * message to indicate that it
// still has messages waiting to be retrieved. // still has messages waiting to be retrieved.
if (messages == '*') { if (msg == '*' && messagesFromNative.length === 0) {
messagesFromNative.shift(); setTimeout(pollOnce, 0);
window.setTimeout(pollOnce, 0);
return; return;
} }
processMessage(msg);
var spaceIdx = messages.indexOf(' ');
var msgLen = +messages.slice(0, spaceIdx);
var message = messages.substr(spaceIdx + 1, msgLen);
messages = messages.slice(spaceIdx + msgLen + 1);
processMessage(message);
if (messages) {
messagesFromNative[0] = messages;
} else {
messagesFromNative.shift();
}
} }
} finally {
isProcessing = false;
} }
}; };
function popMessageFromQueue() {
var messageBatch = messagesFromNative.shift();
if (messageBatch == '*') {
return '*';
}
var spaceIdx = messageBatch.indexOf(' ');
var msgLen = +messageBatch.slice(0, spaceIdx);
var message = messageBatch.substr(spaceIdx + 1, msgLen);
messageBatch = messageBatch.slice(spaceIdx + msgLen + 1);
if (messageBatch) {
messagesFromNative.unshift(messageBatch);
}
return message;
}
module.exports = androidExec; module.exports = androidExec;
}); });
@ -1191,9 +1216,13 @@ modulemapper.clobbers('cordova/exec', 'Cordova.exec');
// Call the platform-specific initialization. // Call the platform-specific initialization.
platform.bootstrap && platform.bootstrap(); platform.bootstrap && platform.bootstrap();
pluginloader.load(function() { // Wrap in a setTimeout to support the use-case of having plugin JS appended to cordova.js.
channel.onPluginsReady.fire(); // The delay allows the attached modules to be defined before the plugin loader looks for them.
}); setTimeout(function() {
pluginloader.load(function() {
channel.onPluginsReady.fire();
});
}, 0);
/** /**
* Create all cordova objects once native side is ready. * Create all cordova objects once native side is ready.
@ -1444,43 +1473,51 @@ var modulemapper = require('cordova/modulemapper');
var urlutil = require('cordova/urlutil'); var urlutil = require('cordova/urlutil');
// Helper function to inject a <script> tag. // Helper function to inject a <script> tag.
function injectScript(url, onload, onerror) { // Exported for testing.
exports.injectScript = function(url, onload, onerror) {
var script = document.createElement("script"); var script = document.createElement("script");
// onload fires even when script fails loads with an error. // onload fires even when script fails loads with an error.
script.onload = onload; script.onload = onload;
script.onerror = onerror || onload; // onerror fires for malformed URLs.
script.onerror = onerror;
script.src = url; script.src = url;
document.head.appendChild(script); document.head.appendChild(script);
};
function injectIfNecessary(id, url, onload, onerror) {
onerror = onerror || onload;
if (id in define.moduleMap) {
onload();
} else {
exports.injectScript(url, function() {
if (id in define.moduleMap) {
onload();
} else {
onerror();
}
}, onerror);
}
} }
function onScriptLoadingComplete(moduleList, finishPluginLoading) { function onScriptLoadingComplete(moduleList, finishPluginLoading) {
// Loop through all the plugins and then through their clobbers and merges. // Loop through all the plugins and then through their clobbers and merges.
for (var i = 0, module; module = moduleList[i]; i++) { for (var i = 0, module; module = moduleList[i]; i++) {
if (module) { if (module.clobbers && module.clobbers.length) {
try { for (var j = 0; j < module.clobbers.length; j++) {
if (module.clobbers && module.clobbers.length) { modulemapper.clobbers(module.id, module.clobbers[j]);
for (var j = 0; j < module.clobbers.length; j++) {
modulemapper.clobbers(module.id, module.clobbers[j]);
}
}
if (module.merges && module.merges.length) {
for (var k = 0; k < module.merges.length; k++) {
modulemapper.merges(module.id, module.merges[k]);
}
}
// Finally, if runs is truthy we want to simply require() the module.
// This can be skipped if it had any merges or clobbers, though,
// since the mapper will already have required the module.
if (module.runs && !(module.clobbers && module.clobbers.length) && !(module.merges && module.merges.length)) {
modulemapper.runs(module.id);
}
} }
catch(err) { }
// error with module, most likely clobbers, should we continue?
if (module.merges && module.merges.length) {
for (var k = 0; k < module.merges.length; k++) {
modulemapper.merges(module.id, module.merges[k]);
} }
} }
// Finally, if runs is truthy we want to simply require() the module.
if (module.runs) {
modulemapper.runs(module.id);
}
} }
finishPluginLoading(); finishPluginLoading();
@ -1505,26 +1542,10 @@ function handlePluginsObject(path, moduleList, finishPluginLoading) {
} }
for (var i = 0; i < moduleList.length; i++) { for (var i = 0; i < moduleList.length; i++) {
injectScript(path + moduleList[i].file, scriptLoadedCallback); injectIfNecessary(moduleList[i].id, path + moduleList[i].file, scriptLoadedCallback);
} }
} }
function injectPluginScript(pathPrefix, finishPluginLoading) {
var pluginPath = pathPrefix + 'cordova_plugins.js';
injectScript(pluginPath, function() {
try {
var moduleList = require("cordova/plugin_list");
handlePluginsObject(pathPrefix, moduleList, finishPluginLoading);
}
catch (e) {
// Error loading cordova_plugins.js, file not found or something
// this is an acceptable error, pre-3.0.0, so we just move on.
finishPluginLoading();
}
}, finishPluginLoading); // also, add script load error handler for file not found
}
function findCordovaPath() { function findCordovaPath() {
var path = null; var path = null;
var scripts = document.getElementsByTagName('script'); var scripts = document.getElementsByTagName('script');
@ -1548,7 +1569,10 @@ exports.load = function(callback) {
console.log('Could not find cordova.js script tag. Plugin loading may fail.'); console.log('Could not find cordova.js script tag. Plugin loading may fail.');
pathPrefix = ''; pathPrefix = '';
} }
injectPluginScript(pathPrefix, callback); injectIfNecessary('cordova/plugin_list', pathPrefix + 'cordova_plugins.js', function() {
var moduleList = require("cordova/plugin_list");
handlePluginsObject(pathPrefix, moduleList, callback);
}, callback);
}; };