Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Merge branch 'almond'

  • Loading branch information...
commit 51d347cab183a033221c14b25f271b9ba1ea45a9 2 parents a1bed08 + 8b101ca
@gtanner gtanner authored
View
18 build/packager.js
@@ -6,15 +6,15 @@ module.exports = {
var util = require('util'),
fs = require('fs'),
files = [
+ "lib/utils.js",
"lib/plugin/navigator.js",
"lib/plugin/notification.js",
"lib/plugin/accelerometer.js",
"lib/plugin/Connection.js",
"lib/plugin/network.js",
"lib/plugin/" + platform + "/device.js",
- "lib/Channel.js",
+ "lib/channel.js",
"lib/builder.js",
- "lib/utils.js",
"lib/exec/" +platform + ".js"
],
include = function (files, transform) {
@@ -32,24 +32,24 @@ module.exports = {
});
//include require
- output += include("thirdparty/browser-require/require.js");
+ output += include("thirdparty/almond.js");
//include modules
output += include(files, function (file, path) {
- return "require.define('" + path.replace(/lib\//, "phonegap/").replace(/\.js$/, '') +
- "', function (require, module, exports) {\n" + file + "});\n";
+ var id = path.replace(/lib\//, "phonegap/").replace(/\.js$/, '');
+ return "define('" + id + "', function (require, exports, module) {\n" + file + "});\n";
});
//include platform
output += include('lib/platform/' + platform + '.js', function (file, path) {
- return "require.define('phonegap/platform'" +
- ", function (require, module, exports) {\n" + file + "});\n";
+ return "define('phonegap/platform'" +
+ ", function (require, exports, module) {\n" + file + "});\n";
});
//include phonegap
output += include('lib/phonegap.js', function (file, path) {
- return "require.define('phonegap'" +
- ", function (require, module, exports) {\n" + file + "});\n";
+ return "define('phonegap'" +
+ ", function (require, exports, module) {\n" + file + "});\n";
});
//include bootstrap
View
34 lib/bootstrap.js
@@ -1,45 +1,45 @@
(function (context) {
- var Channel = require("phonegap/Channel"),
+ var channel = require("phonegap/channel"),
/**
* onDOMContentLoaded channel is fired when the DOM content
* of the page has been parsed.
*/
- onDOMContentLoaded = new Channel('onDOMContentLoaded'),
+ onDOMContentLoaded = channel.create('onDOMContentLoaded'),
/**
* onNativeReady channel is fired when the PhoneGap native code
* has been initialized.
*/
- onNativeReady = new Channel('onNativeReady'),
+ onNativeReady = channel.create('onNativeReady'),
/**
* onPhoneGapReady channel is fired when the JS PhoneGap objects have been created.
*/
- onPhoneGapReady = new Channel('onPhoneGapReady'),
+ onPhoneGapReady = channel.create('onPhoneGapReady'),
/**
* onPhoneGapInfoReady channel is fired when the PhoneGap device properties
* has been set.
*/
- onPhoneGapInfoReady = new Channel('onPhoneGapInfoReady'),
+ onPhoneGapInfoReady = channel.create('onPhoneGapInfoReady'),
/**
* onPhoneGapConnectionReady channel is fired when the PhoneGap connection properties
* has been set.
*/
- onPhoneGapConnectionReady = new Channel('onPhoneGapConnectionReady'),
+ onPhoneGapConnectionReady = channel.create('onPhoneGapConnectionReady'),
/**
* onResume channel is fired when the PhoneGap native code
* resumes.
*/
- onResume = new Channel('onResume'),
+ onResume = channel.create('onResume'),
/**
* onPause channel is fired when the PhoneGap native code
* pauses.
*/
- onPause = new Channel('onPause'),
+ onPause = channel.create('onPause'),
/**
* onDeviceReady is fired only after all PhoneGap objects are created and
* the device properties are set.
*/
- onDeviceReady = new Channel('onDeviceReady'),
+ onDeviceReady = channel.create('onDeviceReady'),
/**
* PhoneGap Channels that must fire before "deviceready" is fired.
*/
@@ -56,7 +56,7 @@
* Listen for DOMContentLoaded and notify our channel subscribers.
*/
document.addEventListener('DOMContentLoaded', function() {
- Channel["onDOMContentLoaded"].fire();
+ channel.onDOMContentLoaded.fire();
}, false);
/**
@@ -68,15 +68,15 @@
document.addEventListener = function(evt, handler, capture) {
var e = evt.toLowerCase();
if (e == 'deviceready') {
- Channel["onDeviceReady"].subscribeOnce(handler);
+ channel.onDeviceReady.subscribeOnce(handler);
} else if (e == 'resume') {
- Channel["onResume"].subscribe(handler);
+ channel.onResume.subscribe(handler);
// if subscribing listener after event has already fired, invoke the handler
- if (Channel["onResume"].fired && handler instanceof Function) {
+ if (channel.onResume.fired && handler instanceof Function) {
handler();
}
} else if (e == 'pause') {
- Channel["onPause"].subscribe(handler);
+ channel.onPause.subscribe(handler);
} else {
m_document_addEventListener.call(document, evt, handler, capture);
}
@@ -85,7 +85,7 @@
/**
* Create all PhoneGap objects once page has fully loaded and native side is ready.
*/
- Channel.join(function() {
+ channel.join(function() {
var builder = require('phonegap/builder'),
platform = require('phonegap/platform');
@@ -101,7 +101,7 @@
// Fire onDeviceReady event once all constructors have run and
// PhoneGap info has been received from native side.
- Channel.join(function() {
+ channel.join(function() {
onDeviceReady.fire();
// Fire the onresume event, since first one happens before JavaScript is loaded
@@ -117,7 +117,7 @@
// it may be called before any PhoneGap JS is ready.
if (window._nativeReady) {
_self.boot();
- Channel["onNativeReady"].fire();
+ channel.onNativeReady.fire();
}
}(window));
View
43 lib/Channel.js → lib/channel.js
@@ -7,10 +7,29 @@ var Channel = function(type) {
this.guid = 0;
this.fired = false;
this.enabled = true;
-
- Channel[type] = this;
},
- utils = require('./utils');
+ channel = {
+ /**
+ * Calls the provided function only after all of the channels specified
+ * have been fired.
+ */
+ join: function (h, c) {
+ var i = c.length;
+ var len = i;
+ var f = function() {
+ if (!(--i)) h();
+ };
+ for (var j=0; j<len; j++) {
+ (!c[j].fired?c[j].subscribeOnce(f):i--);
+ }
+ if (!i) h();
+ },
+ create: function (type) {
+ channel[type] = new Channel(type);
+ return channel[type];
+ }
+ },
+ utils = require('phonegap/utils');
/**
* Subscribes the given function to the channel. Any time that
@@ -82,20 +101,4 @@ Channel.prototype.fire = function(e) {
return true;
};
-/**
- * Calls the provided function only after all of the channels specified
- * have been fired.
- */
-Channel.join = function(h, c) {
- var i = c.length;
- var len = i;
- var f = function() {
- if (!(--i)) h();
- };
- for (var j=0; j<len; j++) {
- (!c[j].fired?c[j].subscribeOnce(f):i--);
- }
- if (!i) h();
-};
-
-module.exports = Channel;
+module.exports = channel;
View
4 lib/exec/ios.js
@@ -1,9 +1,9 @@
// This queue holds the currently executing command and all pending
// commands executed with PhoneGap.exec().
-var commandQueue: [],
+var commandQueue = [],
// Indicates if we're currently in the middle of flushing the command
// queue on the native side.
- commandQueueFlushing: false,
+ commandQueueFlushing = false,
/**
* Creates a gap bridge iframe used to notify the native code about queued
* commands.
View
4 lib/plugin/android/device.js
@@ -17,7 +17,7 @@
* under the License.
*/
-var Channel = require('phonegap/Channel');
+var channel = require('phonegap/channel');
/**
* This represents the mobile device, and provides properties for inspecting the model, version, UUID of the
@@ -41,7 +41,7 @@ function Device() {
me.name = info.name;
me.uuid = info.uuid;
me.phonegap = info.phonegap;
- Channel.onPhoneGapInfoReady.fire();
+ channel.onPhoneGapInfoReady.fire();
},
function(e) {
me.available = false;
View
4 lib/plugin/blackberry/device.js
@@ -15,12 +15,12 @@ var device = navigator.device || {},
uuid: phonegap.device.uuid,
phonegap: phonegap.device.phonegap
},
- Channel = require('phonegap/Channel'),
+ channel = require('phonegap/channel'),
key;
for (key in props) {
device[key] = props[key];
}
-Channel.onPhoneGapInfoReady.fire();
+channel.onPhoneGapInfoReady.fire();
module.exports = device;
View
6 lib/plugin/network.js
@@ -7,7 +7,7 @@
* Copyright (c) 2010-2011, IBM Corporation
*/
-var Channel = require('phonegap/Channel'),
+var channel = require('phonegap/channel'),
NetworkConnection = function () {
this.type = null;
this._firstRun = true;
@@ -23,7 +23,7 @@ var Channel = require('phonegap/Channel'),
// should only fire this once
if (me._firstRun) {
me._firstRun = false;
- Channel["onPhoneGapConnectionReady"].fire();
+ channel.onPhoneGapConnectionReady.fire();
}
},
function (e) {
@@ -31,7 +31,7 @@ var Channel = require('phonegap/Channel'),
// to fire the deviceready event.
if (me._firstRun) {
me._firstRun = false;
- Channel["onPhoneGapConnectionReady"].fire();
+ channel.onPhoneGapConnectionReady.fire();
}
console.log("Error initializing Network Connection: " + e);
});
View
26 test/index.html
@@ -8,13 +8,6 @@
<link rel="stylesheet" type="text/css" href="../thirdparty/jasmine/jasmine.css">
<script type="text/javascript" src="../thirdparty/jasmine/jasmine.js"></script>
<script type="text/javascript" src="../thirdparty/jasmine/jasmine-html.js"></script>
- <script type="text/javascript" src="../thirdparty/browser-require/require.js"></script>
-
-
- <script type="text/javascript" src="../pkg/phonegap.blackberry.js"></script>
-
- <!-- include tests files here... -->
- <script type="text/javascript" src="test.accelerometer.js"></script>
<script type="text/javascript">
(function() {
@@ -29,17 +22,28 @@
return trivialReporter.specFilter(spec);
};
+ //HACK: until we clean up and modulerize the bridge
+ window.PhoneGap = {
+ exec: jasmine.createSpy("PhoneGap.exec")
+ };
+
+ window.phonegap = {
+ platform: ""
+ };
+
window.addEventListener("load", function () {
- //HACK: until we clean up and modulerize the bridge
- window.PhoneGap = {
- exec: jasmine.createSpy("PhoneGap.exec")
- };
jasmineEnv.execute();
});
})();
</script>
+ <script type="text/javascript" src="../pkg/phonegap.ios.js"></script>
+
+ <!-- include tests files here... -->
+ <script type="text/javascript" src="test.accelerometer.js"></script>
+
+
</head>
<body>
View
277 thirdparty/almond.js
@@ -0,0 +1,277 @@
+/**
+ * almond 0.0.3 Copyright (c) 2011, The Dojo Foundation All Rights Reserved.
+ * Available via the MIT or new BSD license.
+ * see: http://github.com/jrburke/almond for details
+ */
+/*jslint strict: false, plusplus: false */
+/*global setTimeout: false */
+
+var requirejs, require, define;
+(function (undef) {
+
+ var defined = {},
+ waiting = {},
+ aps = [].slice,
+ main, req;
+
+ if (typeof define === "function") {
+ //If a define is already in play via another AMD loader,
+ //do not overwrite.
+ return;
+ }
+
+ /**
+ * Given a relative module name, like ./something, normalize it to
+ * a real name that can be mapped to a path.
+ * @param {String} name the relative name
+ * @param {String} baseName a real name that the name arg is relative
+ * to.
+ * @returns {String} normalized name
+ */
+ function normalize(name, baseName) {
+ //Adjust any relative paths.
+ if (name && name.charAt(0) === ".") {
+ //If have a base name, try to normalize against it,
+ //otherwise, assume it is a top-level require that will
+ //be relative to baseUrl in the end.
+ if (baseName) {
+ //Convert baseName to array, and lop off the last part,
+ //so that . matches that "directory" and not name of the baseName's
+ //module. For instance, baseName of "one/two/three", maps to
+ //"one/two/three.js", but we want the directory, "one/two" for
+ //this normalization.
+ baseName = baseName.split("/");
+ baseName = baseName.slice(0, baseName.length - 1);
+
+ name = baseName.concat(name.split("/"));
+
+ //start trimDots
+ var i, part;
+ for (i = 0; (part = name[i]); i++) {
+ if (part === ".") {
+ name.splice(i, 1);
+ i -= 1;
+ } else if (part === "..") {
+ if (i === 1 && (name[2] === '..' || name[0] === '..')) {
+ //End of the line. Keep at least one non-dot
+ //path segment at the front so it can be mapped
+ //correctly to disk. Otherwise, there is likely
+ //no path mapping for a path starting with '..'.
+ //This can still fail, but catches the most reasonable
+ //uses of ..
+ break;
+ } else if (i > 0) {
+ name.splice(i - 1, 2);
+ i -= 2;
+ }
+ }
+ }
+ //end trimDots
+
+ name = name.join("/");
+ }
+ }
+ return name;
+ }
+
+ function makeRequire(relName, forceSync) {
+ return function () {
+ //A version of a require function that passes a moduleName
+ //value for items that may need to
+ //look up paths relative to the moduleName
+ return req.apply(undef, aps.call(arguments, 0).concat([relName, forceSync]));
+ };
+ }
+
+ function makeNormalize(relName) {
+ return function (name) {
+ return normalize(name, relName);
+ };
+ }
+
+ function makeLoad(depName) {
+ return function (value) {
+ defined[depName] = value;
+ };
+ }
+
+ function callDep(name) {
+ if (waiting.hasOwnProperty(name)) {
+ var args = waiting[name];
+ delete waiting[name];
+ main.apply(undef, args);
+ }
+ return defined[name];
+ }
+
+ /**
+ * Makes a name map, normalizing the name, and using a plugin
+ * for normalization if necessary. Grabs a ref to plugin
+ * too, as an optimization.
+ */
+ function makeMap(name, relName) {
+ var prefix, plugin,
+ index = name.indexOf('!');
+
+ if (index !== -1) {
+ prefix = normalize(name.slice(0, index), relName);
+ name = name.slice(index + 1);
+ plugin = callDep(prefix);
+
+ //Normalize according
+ if (plugin && plugin.normalize) {
+ name = plugin.normalize(name, makeNormalize(relName));
+ } else {
+ name = normalize(name, relName);
+ }
+ } else {
+ name = normalize(name, relName);
+ }
+
+ //Using ridiculous property names for space reasons
+ return {
+ f: prefix ? prefix + '!' + name : name, //fullName
+ n: name,
+ p: plugin
+ };
+ }
+
+ main = function (name, deps, callback, relName) {
+ var args = [],
+ usingExports,
+ cjsModule, depName, i, ret, map;
+
+ //Use name if no relName
+ if (!relName) {
+ relName = name;
+ }
+
+ //Call the callback to define the module, if necessary.
+ if (typeof callback === 'function') {
+
+ //Default to require, exports, module if no deps if
+ //the factory arg has any arguments specified.
+ if (!deps.length && callback.length) {
+ deps = ['require', 'exports', 'module'];
+ }
+
+ //Pull out the defined dependencies and pass the ordered
+ //values to the callback.
+ for (i = 0; i < deps.length; i++) {
+ map = makeMap(deps[i], relName);
+ depName = map.f;
+
+ //Fast path CommonJS standard dependencies.
+ if (depName === "require") {
+ args[i] = makeRequire(name);
+ } else if (depName === "exports") {
+ //CommonJS module spec 1.1
+ args[i] = defined[name] = {};
+ usingExports = true;
+ } else if (depName === "module") {
+ //CommonJS module spec 1.1
+ cjsModule = args[i] = {
+ id: name,
+ uri: '',
+ exports: defined[name]
+ };
+ } else if (defined.hasOwnProperty(depName) || waiting.hasOwnProperty(depName)) {
+ args[i] = callDep(depName);
+ } else if (map.p) {
+ map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});
+ args[i] = defined[depName];
+ } else {
+ throw name + ' missing ' + depName;
+ }
+ }
+
+ ret = callback.apply(defined[name], args);
+
+ if (name) {
+ //If setting exports via "module" is in play,
+ //favor that over return value and exports. After that,
+ //favor a non-undefined return value over exports use.
+ if (cjsModule && cjsModule.exports !== undef) {
+ defined[name] = cjsModule.exports;
+ } else if (!usingExports) {
+ //Use the return value from the function.
+ defined[name] = ret;
+ }
+ }
+ } else if (name) {
+ //May just be an object definition for the module. Only
+ //worry about defining if have a module name.
+ defined[name] = callback;
+ }
+ };
+
+ requirejs = req = function (deps, callback, relName, forceSync) {
+ if (typeof deps === "string") {
+
+ //Just return the module wanted. In this scenario, the
+ //deps arg is the module name, and second arg (if passed)
+ //is just the relName.
+ //Normalize module name, if it contains . or ..
+ return callDep(makeMap(deps, callback).f);
+ } else if (!deps.splice) {
+ //deps is a config object, not an array.
+ //Drop the config stuff on the ground.
+ if (callback.splice) {
+ //callback is an array, which means it is a dependency list.
+ //Adjust args if there are dependencies
+ deps = callback;
+ callback = arguments[2];
+ } else {
+ deps = [];
+ }
+ }
+
+ //Simulate async callback;
+ if (forceSync) {
+ main(undef, deps, callback, relName);
+ } else {
+ setTimeout(function () {
+ main(undef, deps, callback, relName);
+ }, 15);
+ }
+
+ return req;
+ };
+
+ /**
+ * Just drops the config on the floor, but returns req in case
+ * the config return value is used.
+ */
+ req.config = function () {
+ return req;
+ };
+
+ /**
+ * Export require as a global, but only if it does not already exist.
+ */
+ if (!require) {
+ require = req;
+ }
+
+ define = function (name, deps, callback) {
+
+ //This module may not have dependencies
+ if (!deps.splice) {
+ //deps is not an array, so probably means
+ //an object literal or factory function for
+ //the value. Adjust args.
+ callback = deps;
+ deps = [];
+ }
+
+ if (define.unordered) {
+ waiting[name] = [name, deps, callback];
+ } else {
+ main(name, deps, callback);
+ }
+ };
+
+ define.amd = {
+ jQuery: true
+ };
+}());
1  thirdparty/browser-require
@@ -1 +0,0 @@
-Subproject commit 0f1c1fe858352f2007c99cd302203ec65aad3d21
Please sign in to comment.
Something went wrong with that request. Please try again.