override init.js in the firefoxos platform for navigator fix, other bugfixes
Project: http://git-wip-us.apache.org/repos/asf/cordova-js/repo Commit: http://git-wip-us.apache.org/repos/asf/cordova-js/commit/d6603c93 Tree: http://git-wip-us.apache.org/repos/asf/cordova-js/tree/d6603c93 Diff: http://git-wip-us.apache.org/repos/asf/cordova-js/diff/d6603c93 Branch: refs/heads/ffos Commit: d6603c93aa913eb79366e063e84e03142802f84b Parents: 6866193 Author: James Long <[email protected]> Authored: Wed Aug 21 15:19:08 2013 -0400 Committer: Steven Gill <[email protected]> Committed: Wed Sep 11 15:47:24 2013 -0700 ---------------------------------------------------------------------- lib/firefoxos/exec.js | 3 + lib/firefoxos/init.js | 142 +++++++++++++++++++++++++++++++++++++++++ lib/firefoxos/platform.js | 12 +--- 3 files changed, 146 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cordova-js/blob/d6603c93/lib/firefoxos/exec.js ---------------------------------------------------------------------- diff --git a/lib/firefoxos/exec.js b/lib/firefoxos/exec.js new file mode 100644 index 0000000..ab3311b --- /dev/null +++ b/lib/firefoxos/exec.js @@ -0,0 +1,3 @@ +module.exports = function() { + console.log('exec not implemented yet'); +} http://git-wip-us.apache.org/repos/asf/cordova-js/blob/d6603c93/lib/firefoxos/init.js ---------------------------------------------------------------------- diff --git a/lib/firefoxos/init.js b/lib/firefoxos/init.js new file mode 100644 index 0000000..b25d4af --- /dev/null +++ b/lib/firefoxos/init.js @@ -0,0 +1,142 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * +*/ + +/* + * This file has been copied into the firefoxos platform and patched + * to fix a problem with replacing the navigator object. We will have + * to keep this file up-to-date with the common init.js. + */ + +var channel = require('cordova/channel'); +var cordova = require('cordova'); +var modulemapper = require('cordova/modulemapper'); +var platform = require('cordova/platform'); +var pluginloader = require('cordova/pluginloader'); + +var platformInitChannelsArray = [channel.onNativeReady, channel.onPluginsReady]; + +function logUnfiredChannels(arr) { + for (var i = 0; i < arr.length; ++i) { + if (arr[i].state != 2) { + console.log('Channel not fired: ' + arr[i].type); + } + } +} + +window.setTimeout(function() { + if (channel.onDeviceReady.state != 2) { + console.log('deviceready has not fired after 5 seconds.'); + logUnfiredChannels(platformInitChannelsArray); + logUnfiredChannels(channel.deviceReadyChannelsArray); + } +}, 5000); + +// Replace navigator before any modules are required(), to ensure it happens as soon as possible. +// We replace it so that properties that can't be clobbered can instead be overridden. +function replaceNavigator(origNavigator) { + var CordovaNavigator = function() {}; + CordovaNavigator.prototype = origNavigator; + var newNavigator = new CordovaNavigator(); + // This work-around really only applies to new APIs that are newer than Function.bind. + // Without it, APIs such as getGamepads() break. + if (CordovaNavigator.bind) { + for (var key in origNavigator) { + try { + if (typeof origNavigator[key] == 'function') { + newNavigator[key] = origNavigator[key].bind(origNavigator); + } + } catch(e) { + // This try/catch was added for Firefox OS 1.0 and 1.1 + // because it throws an security exception when trying + // to access a few properties of the navigator object. + // It has been fixed in 1.2. + } + } + } + return newNavigator; +} +if (window.navigator) { + window.navigator = replaceNavigator(window.navigator); +} + +if (!window.console) { + window.console = { + log: function(){} + }; +} +if (!window.console.warn) { + window.console.warn = function(msg) { + this.log("warn: " + msg); + }; +} + +// Register pause, resume and deviceready channels as events on document. +channel.onPause = cordova.addDocumentEventHandler('pause'); +channel.onResume = cordova.addDocumentEventHandler('resume'); +channel.onDeviceReady = cordova.addStickyDocumentEventHandler('deviceready'); + +// Listen for DOMContentLoaded and notify our channel subscribers. +if (document.readyState == 'complete' || document.readyState == 'interactive') { + channel.onDOMContentLoaded.fire(); +} else { + document.addEventListener('DOMContentLoaded', function() { + channel.onDOMContentLoaded.fire(); + }, false); +} + +// _nativeReady is global variable that the native side can set +// to signify that the native code is ready. It is a global since +// it may be called before any cordova JS is ready. +if (window._nativeReady) { + channel.onNativeReady.fire(); +} + +modulemapper.clobbers('cordova', 'cordova'); +modulemapper.clobbers('cordova/exec', 'cordova.exec'); +modulemapper.clobbers('cordova/exec', 'Cordova.exec'); + +// Call the platform-specific initialization. +platform.bootstrap && platform.bootstrap(); + +pluginloader.load(function() { + channel.onPluginsReady.fire(); +}); + +/** + * Create all cordova objects once native side is ready. + */ +channel.join(function() { + modulemapper.mapModules(window); + + platform.initialize && platform.initialize(); + + // Fire event to notify that all objects are created + channel.onCordovaReady.fire(); + + // Fire onDeviceReady event once page has fully loaded, all + // constructors have run and cordova info has been received from native + // side. + channel.join(function() { + require('cordova').fireDocumentEvent('deviceready'); + }, channel.deviceReadyChannelsArray); + +}, platformInitChannelsArray); + http://git-wip-us.apache.org/repos/asf/cordova-js/blob/d6603c93/lib/firefoxos/platform.js ---------------------------------------------------------------------- diff --git a/lib/firefoxos/platform.js b/lib/firefoxos/platform.js index a9829c6..4903014 100644 --- a/lib/firefoxos/platform.js +++ b/lib/firefoxos/platform.js @@ -22,16 +22,6 @@ module.exports = { id: 'firefoxos', bootstrap: function() { - var channel = require('cordova/channel'), - cordova = require('cordova'), - exec = require('cordova/exec'), - modulemapper = require('cordova/modulemapper'); - - // Tell the JS that the native side is ready. - channel.onNativeReady.fire(); - - // TODO: Extract this as a proper plugin. - // modulemapper.clobbers('cordova/plugin/firefoxos/app', 'navigator.app'); - + require('cordova/channel').onNativeReady.fire(); } };
