You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by fi...@apache.org on 2013/01/10 00:00:36 UTC

[1/11] updates for 2.3.0 support. bumped version. removed checked-in native project fixtures for tests, now on install create fixtures based on actual `create` scripts for platforms.

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/fixtures/projects/native/ios/www/css/index.css
----------------------------------------------------------------------
diff --git a/spec/fixtures/projects/native/ios/www/css/index.css b/spec/fixtures/projects/native/ios/www/css/index.css
deleted file mode 100644
index f1f9d76..0000000
--- a/spec/fixtures/projects/native/ios/www/css/index.css
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * 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.
- */
-* {
-    -webkit-touch-callout: none;                /* prevent callout to copy image, etc when tap to hold */
-    -webkit-text-size-adjust: none;             /* prevent webkit from resizing text to fit */
-    -webkit-tap-highlight-color: rgba(0,0,0,0); /* make transparent link selection, adjust last value opacity 0 to 1.0 */
-    -webkit-user-select: none;                  /* prevent copy paste, to allow, change 'none' to 'text' */
-}
-
-body {
-    background-color:#E4E4E4;
-    background-image:linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%);
-    background-image:-webkit-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%);
-    background-image:-ms-linear-gradient(top, #A7A7A7 0%, #E4E4E4 51%);
-    background-image:-webkit-gradient(
-        linear,
-        left top,
-        left bottom,
-        color-stop(0, #A7A7A7),
-        color-stop(0.51, #E4E4E4)
-    );
-    background-attachment:fixed;
-    font-family:'HelveticaNeue-Light', 'HelveticaNeue', Helvetica, Arial, sans-serif;
-    font-size:12px;
-    height:100%;
-    margin:0px;
-    padding:0px;
-    text-transform:uppercase;
-    width:100%;
-}
-
-/* Portrait layout (default) */
-.app {
-    background:url(../img/logo.png) no-repeat center top; /* 170px x 200px */
-    position:absolute;             /* position in the center of the screen */
-    left:50%;
-    top:50%;
-    height:50px;                   /* text area height */
-    width:225px;                   /* text area width */
-    text-align:center;
-    padding:180px 0px 0px 0px;     /* image height is 200px (bottom 20px are overlapped with text) */
-    margin:-115px 0px 0px -112px;  /* offset vertical: half of image height and text area height */
-                                   /* offset horizontal: half of text area width */
-}
-
-/* Landscape layout (with min-width) */
-@media screen and (min-aspect-ratio: 1/1) and (min-width:400px) {
-    .app {
-        background-position:left center;
-        padding:75px 0px 75px 170px;  /* padding-top + padding-bottom + text area = image height */
-        margin:-90px 0px 0px -198px;  /* offset vertical: half of image height */
-                                      /* offset horizontal: half of image width and text area width */
-    }
-}
-
-h1 {
-    font-size:24px;
-    font-weight:normal;
-    margin:0px;
-    overflow:visible;
-    padding:0px;
-    text-align:center;
-}
-
-.event {
-    border-radius:4px;
-    -webkit-border-radius:4px;
-    color:#FFFFFF;
-    font-size:12px;
-    margin:0px 30px;
-    padding:2px 0px;
-}
-
-.event.listening {
-    background-color:#333333;
-    display:block;
-}
-
-.event.received {
-    background-color:#4B946A;
-    display:none;
-}
-
-@keyframes fade {
-    from { opacity: 1.0; }
-    50% { opacity: 0.4; }
-    to { opacity: 1.0; }
-}
- 
-@-webkit-keyframes fade {
-    from { opacity: 1.0; }
-    50% { opacity: 0.4; }
-    to { opacity: 1.0; }
-}
- 
-.blink {
-    animation:fade 3000ms infinite;
-    -webkit-animation:fade 3000ms infinite;
-}

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/fixtures/projects/native/ios/www/img/logo.png
----------------------------------------------------------------------
diff --git a/spec/fixtures/projects/native/ios/www/img/logo.png b/spec/fixtures/projects/native/ios/www/img/logo.png
deleted file mode 100644
index 9519e7d..0000000
Binary files a/spec/fixtures/projects/native/ios/www/img/logo.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/fixtures/projects/native/ios/www/index.html
----------------------------------------------------------------------
diff --git a/spec/fixtures/projects/native/ios/www/index.html b/spec/fixtures/projects/native/ios/www/index.html
deleted file mode 100644
index 92484ad..0000000
--- a/spec/fixtures/projects/native/ios/www/index.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE html>
-<!--
-    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.
--->
-<html>
-    <head>
-        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-        <meta name="format-detection" content="telephone=no" />
-        <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" />
-        <link rel="stylesheet" type="text/css" href="css/index.css" />
-        <title>Hello World</title>
-    </head>
-    <body>
-        <div class="app">
-            <h1>Apache Cordova</h1>
-            <div id="deviceready" class="blink">
-                <p class="event listening">Connecting to Device</p>
-                <p class="event received">Device is Ready</p>
-            </div>
-        </div>
-        <script type="text/javascript" src="cordova-2.1.0.js"></script>
-        <script type="text/javascript" src="js/index.js"></script>
-        <script type="text/javascript">
-            app.initialize();
-        </script>
-    </body>
-</html>

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/fixtures/projects/native/ios/www/js/index.js
----------------------------------------------------------------------
diff --git a/spec/fixtures/projects/native/ios/www/js/index.js b/spec/fixtures/projects/native/ios/www/js/index.js
deleted file mode 100644
index 3b75d3f..0000000
--- a/spec/fixtures/projects/native/ios/www/js/index.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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.
- */
-var app = {
-    // Application Constructor
-    initialize: function() {
-        this.bindEvents();
-    },
-    // Bind Event Listeners
-    //
-    // Bind any events that are required on startup. Common events are:
-    // `load`, `deviceready`, `offline`, and `online`.
-    bindEvents: function() {
-        document.addEventListener('deviceready', this.onDeviceReady, false);
-    },
-    // deviceready Event Handler
-    //
-    // The scope of `this` is the event. In order to call the `receivedEvent`
-    // function, we must explicity call `app.receivedEvent(...);`
-    onDeviceReady: function() {
-        app.receivedEvent('deviceready');
-    },
-    // Update DOM on a Received Event
-    receivedEvent: function(id) {
-        var parentElement = document.getElementById(id);
-        var listeningElement = parentElement.querySelector('.listening');
-        var receivedElement = parentElement.querySelector('.received');
-
-        listeningElement.setAttribute('style', 'display:none;');
-        receivedElement.setAttribute('style', 'display:block;');
-
-        console.log('Received Event: ' + id);
-    }
-};

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/fixtures/projects/native/ios/www/res/icon/ios/icon-57-2x.png
----------------------------------------------------------------------
diff --git a/spec/fixtures/projects/native/ios/www/res/icon/ios/icon-57-2x.png b/spec/fixtures/projects/native/ios/www/res/icon/ios/icon-57-2x.png
deleted file mode 100644
index efd9c37..0000000
Binary files a/spec/fixtures/projects/native/ios/www/res/icon/ios/icon-57-2x.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/fixtures/projects/native/ios/www/res/icon/ios/icon-57.png
----------------------------------------------------------------------
diff --git a/spec/fixtures/projects/native/ios/www/res/icon/ios/icon-57.png b/spec/fixtures/projects/native/ios/www/res/icon/ios/icon-57.png
deleted file mode 100644
index c795fc4..0000000
Binary files a/spec/fixtures/projects/native/ios/www/res/icon/ios/icon-57.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/fixtures/projects/native/ios/www/res/icon/ios/icon-72-2x.png
----------------------------------------------------------------------
diff --git a/spec/fixtures/projects/native/ios/www/res/icon/ios/icon-72-2x.png b/spec/fixtures/projects/native/ios/www/res/icon/ios/icon-72-2x.png
deleted file mode 100644
index dd819da..0000000
Binary files a/spec/fixtures/projects/native/ios/www/res/icon/ios/icon-72-2x.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/fixtures/projects/native/ios/www/res/icon/ios/icon-72.png
----------------------------------------------------------------------
diff --git a/spec/fixtures/projects/native/ios/www/res/icon/ios/icon-72.png b/spec/fixtures/projects/native/ios/www/res/icon/ios/icon-72.png
deleted file mode 100644
index b1cfde7..0000000
Binary files a/spec/fixtures/projects/native/ios/www/res/icon/ios/icon-72.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-ipad-landscape-2x.png
----------------------------------------------------------------------
diff --git a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-ipad-landscape-2x.png b/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-ipad-landscape-2x.png
deleted file mode 100644
index 95c542d..0000000
Binary files a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-ipad-landscape-2x.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-ipad-landscape.png
----------------------------------------------------------------------
diff --git a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-ipad-landscape.png b/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-ipad-landscape.png
deleted file mode 100644
index 04be5ac..0000000
Binary files a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-ipad-landscape.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-ipad-portrait-2x.png
----------------------------------------------------------------------
diff --git a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-ipad-portrait-2x.png b/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-ipad-portrait-2x.png
deleted file mode 100644
index aae1862..0000000
Binary files a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-ipad-portrait-2x.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-ipad-portrait.png
----------------------------------------------------------------------
diff --git a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-ipad-portrait.png b/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-ipad-portrait.png
deleted file mode 100644
index 41e839d..0000000
Binary files a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-ipad-portrait.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-iphone-landscape-2x.png
----------------------------------------------------------------------
diff --git a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-iphone-landscape-2x.png b/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-iphone-landscape-2x.png
deleted file mode 100644
index 0165669..0000000
Binary files a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-iphone-landscape-2x.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-iphone-landscape.png
----------------------------------------------------------------------
diff --git a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-iphone-landscape.png b/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-iphone-landscape.png
deleted file mode 100644
index d154883..0000000
Binary files a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-iphone-landscape.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-iphone-portrait-2x.png
----------------------------------------------------------------------
diff --git a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-iphone-portrait-2x.png b/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-iphone-portrait-2x.png
deleted file mode 100644
index bd24886..0000000
Binary files a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-iphone-portrait-2x.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-iphone-portrait.png
----------------------------------------------------------------------
diff --git a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-iphone-portrait.png b/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-iphone-portrait.png
deleted file mode 100644
index 6fcba56..0000000
Binary files a/spec/fixtures/projects/native/ios/www/res/screen/ios/screen-iphone-portrait.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/fixtures/projects/test/www/config.xml
----------------------------------------------------------------------
diff --git a/spec/fixtures/projects/test/www/config.xml b/spec/fixtures/projects/test/www/config.xml
index 84b4137..cfb59fc 100644
--- a/spec/fixtures/projects/test/www/config.xml
+++ b/spec/fixtures/projects/test/www/config.xml
@@ -1,5 +1,5 @@
 <?xml version='1.0' encoding='utf-8'?>
-<widget id="io.cordova.hellocordova" version="2.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:gap="http://phonegap.com/ns/1.0">
+<widget id="ca.filmaj.dewd" version="2.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:gap="http://phonegap.com/ns/1.0">
     <name>bond. james bond.</name>
     <access origin="*" />
 </widget>

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/helper.js
----------------------------------------------------------------------
diff --git a/spec/helper.js b/spec/helper.js
index 95afaf3..ce6a952 100644
--- a/spec/helper.js
+++ b/spec/helper.js
@@ -1,44 +1 @@
 jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
-
-var shell = require('shelljs'),
-    path = require('path'),
-    fs = require('fs'),
-    android_project = path.join(__dirname, 'fixtures', 'projects', 'native', 'android'),
-    bb_project = path.join(__dirname, 'fixtures', 'projects', 'native', 'blackberry');
-
-var orig_exec = shell.exec;
-
-module.exports = {
-    enabled:false,
-    enable:function() {
-        module.exports.enabled = true;
-        require('shelljs').exec = function(cmd, opts) {
-            // Match various commands to exec
-            if (cmd.match(/android.bin.create/)) {
-                var r = new RegExp(/android.bin.create"\s"([\/\\\w-_\.\s]*)"/);
-                var dir = r.exec(cmd)[1];
-                shell.cp('-r', android_project, path.join(dir, '..'));
-                fs.chmodSync(path.join(dir, 'cordova', 'debug'), '754');
-                return {code:0};
-            } else if (cmd.match(/blackberry.bin.create/)) {
-                var r = new RegExp(/blackberry.bin.create"\s"([\/\\\w-_\.\s]*)"/);
-                var dir = r.exec(cmd)[1];
-                var platformsDir = path.join(dir, '..');
-                shell.cp('-r', bb_project, platformsDir);
-                // TODO: will need to handle bb sub-platforms
-                shell.mv(path.join(platformsDir, 'blackberry'), path.join(platformsDir, 'blackberry-10'));
-                return {code:0};
-            }
-            // Fire off to original exec
-            return orig_exec.apply(null, arguments);
-        }
-    },
-    disable:function() {
-        module.exports.enabled = false;
-        require('shelljs').exec = orig_exec;
-    }
-};
-
-if (!module.exports.enabled) {
-    module.exports.enable();
-}

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/hooker.spec.js
----------------------------------------------------------------------
diff --git a/spec/hooker.spec.js b/spec/hooker.spec.js
index b6bea95..2055757 100644
--- a/spec/hooker.spec.js
+++ b/spec/hooker.spec.js
@@ -10,6 +10,7 @@ var cwd = process.cwd();
 
 describe('hooker', function() {
     it('should throw if provided directory is not a cordova project', function() {
+        shell.rm('-rf', tempDir);
         shell.mkdir('-p', tempDir); 
         this.after(function() {
             shell.rm('-rf', tempDir);

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/metadata/android_parser.spec.js
----------------------------------------------------------------------
diff --git a/spec/metadata/android_parser.spec.js b/spec/metadata/android_parser.spec.js
index 6371e6b..d0cf31f 100644
--- a/spec/metadata/android_parser.spec.js
+++ b/spec/metadata/android_parser.spec.js
@@ -1,19 +1,21 @@
 var android_parser = require('../../src/metadata/android_parser'),
     config_parser = require('../../src/config_parser'),
+    util = require('../../src/util'),
     path = require('path'),
     shell = require('shelljs'),
     fs = require('fs'),
     et = require('elementtree'),
-    cfg_path = path.join(__dirname, '..', 'fixtures', 'projects', 'test', 'www', 'config.xml'),
-    android_path = path.join(__dirname, '..', 'fixtures', 'projects', 'native', 'android'),
-    android_strings = path.join(android_path, 'res', 'values', 'strings.xml'),
-    android_manifest = path.join(android_path, 'AndroidManifest.xml'),
-    android_config = path.join(android_path, 'res', 'xml', 'config.xml'),
     tempDir = path.join(__dirname, '..', '..', 'temp'),
     cordova = require('../../cordova');
+    cfg_path = path.join(__dirname, '..', 'fixtures', 'projects', 'test', 'www', 'config.xml'),
+    android_path = path.join(__dirname, '..', 'fixtures', 'projects', 'native', 'android_fixture'),
+    create = path.join(__dirname, '..', '..', 'lib', 'android', 'bin', 'create');
 
 var cwd = process.cwd();
 
+var android_strings = path.join(android_path, 'res', 'values', 'strings.xml');
+var android_manifest = path.join(android_path, 'AndroidManifest.xml');
+var android_config = path.join(android_path, 'res', 'xml', 'config.xml');
 var original_strings = fs.readFileSync(android_strings, 'utf-8');
 var original_manifest = fs.readFileSync(android_manifest, 'utf-8');
 var original_config = fs.readFileSync(cfg_path, 'utf-8');
@@ -61,8 +63,8 @@ describe('android project parser', function() {
             expect(app_name).toBe('bond. james bond.');
         });
         it('should update the application package name properly', function() {
-            var javs = path.join(android_path, 'src', 'ca', 'filmaj', 'dewd', 'HelloCordova.java');
-            var orig_javs = path.join(android_path, 'src', 'io', 'cordova', 'hellocordova', 'HelloCordova.java');
+            var javs = path.join(android_path, 'src', 'ca', 'filmaj', 'dewd', 'cordovaExample.java');
+            var orig_javs = path.join(android_path, 'src', 'io', 'cordova', 'hellocordova', 'cordovaExample.java');
             var orig_contents = fs.readFileSync(orig_javs, 'utf-8');
             this.after(function() {
                 fs.writeFileSync(orig_javs, orig_contents, 'utf-8');
@@ -114,7 +116,7 @@ describe('android project parser', function() {
         });
         it('should write out android js to cordova.js', function() {
             parser.update_www();
-            expect(fs.readFileSync(path.join(android_platform, 'assets', 'www', 'cordova.js'),'utf-8')).toBe(fs.readFileSync(path.join(__dirname, '..', '..', 'lib', 'android', 'framework', 'assets', 'js', 'cordova.android.js'), 'utf-8'));
+            expect(fs.readFileSync(path.join(android_platform, 'assets', 'www', 'cordova.js'),'utf-8')).toBe(fs.readFileSync(path.join(util.libDirectory, 'cordova-android', 'framework', 'assets', 'js', 'cordova.android.js'), 'utf-8'));
         });
     });
 

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/metadata/blackberry_parser.spec.js
----------------------------------------------------------------------
diff --git a/spec/metadata/blackberry_parser.spec.js b/spec/metadata/blackberry_parser.spec.js
index c4cb1d3..d1d28b7 100644
--- a/spec/metadata/blackberry_parser.spec.js
+++ b/spec/metadata/blackberry_parser.spec.js
@@ -6,9 +6,9 @@ var blackberry_parser = require('../../src/metadata/blackberry_parser'),
     cordova = require('../../cordova'),
     fs = require('fs'),
     tempDir = path.join(__dirname, '..', '..', 'temp'),
-    tempBb = path.join(tempDir, 'platforms', 'blackberry-10'),
+    tempBb = path.join(tempDir, 'platforms', 'blackberry'),
     cfg_path = path.join(__dirname, '..', 'fixtures', 'projects', 'test', 'www', 'config.xml'),
-    blackberry_path = path.join(__dirname, '..', 'fixtures', 'projects', 'native', 'blackberry'),
+    blackberry_path = path.join(__dirname, '..', 'fixtures', 'projects', 'native', 'blackberry_fixture'),
     blackberry_config = path.join(blackberry_path, 'www', 'config.xml');
 
 var cwd = process.cwd();
@@ -103,13 +103,6 @@ describe('blackberry project parser', function() {
             parser.update_www();
             expect(fs.existsSync(path.join(tempBb, 'www', 'somescript.js'))).toBe(true);
         });
-        it('should write out bb qnx js to cordova.js', function() {
-            var qnx_dir = path.join(tempBb, 'www', 'qnx');
-            var qnx_js_path = path.join(qnx_dir, fs.readdirSync(qnx_dir)[0]);
-            var qnx_js = fs.readFileSync(qnx_js_path, 'utf-8');
-            parser.update_www();
-            expect(fs.readFileSync(path.join(tempBb, 'www', 'cordova.js'),'utf-8')).toBe(qnx_js);
-        });
         it('should not overwrite the blackberry-specific config.xml', function() {
             var www_cfg = fs.readFileSync(path.join(tempDir, 'www', 'config.xml'), 'utf-8');
             parser.update_www();

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/metadata/ios_parser.spec.js
----------------------------------------------------------------------
diff --git a/spec/metadata/ios_parser.spec.js b/spec/metadata/ios_parser.spec.js
index 272a710..2005d01 100644
--- a/spec/metadata/ios_parser.spec.js
+++ b/spec/metadata/ios_parser.spec.js
@@ -1,22 +1,23 @@
 var ios_parser = require('../../src/metadata/ios_parser'),
     config_parser = require('../../src/config_parser'),
     cordova = require('../../cordova'),
+    util = require('../../src/util'),
     path = require('path'),
     shell = require('shelljs'),
     fs = require('fs'),
     cfg_path = path.join(__dirname, '..', 'fixtures', 'projects', 'test', 'www', 'config.xml'),
-    ios_path = path.join(__dirname, '..', 'fixtures', 'projects', 'native', 'ios'),
+    ios_path = path.join(__dirname, '..', 'fixtures', 'projects', 'native', 'ios_fixture'),
     tempDir = path.join(__dirname, '..', '..', 'temp'),
-    ios_plist = path.join(ios_path, 'balls', 'balls-Info.plist'),
-    ios_pbx = path.join(ios_path, 'balls.xcodeproj', 'project.pbxproj'),
-    cordova_plist = path.join(ios_path, 'balls', 'Cordova.plist');
+    ios_plist = path.join(ios_path, 'cordovaExample', 'cordovaExample-Info.plist'),
+    ios_pbx = path.join(ios_path, 'cordovaExample.xcodeproj', 'project.pbxproj'),
+    ios_config_xml = path.join(ios_path, 'cordovaExample', 'config.xml');
 
 var cwd = process.cwd();
 
 var original_pbx = fs.readFileSync(ios_pbx, 'utf-8');
 var original_plist = fs.readFileSync(ios_plist, 'utf-8');
 var original_config = fs.readFileSync(cfg_path, 'utf-8');
-var orig_cordova = fs.readFileSync(cordova_plist, 'utf-8');
+var orig_cordova = fs.readFileSync(ios_config_xml, 'utf-8');
 
 describe('ios project parser', function() {
     it('should throw an exception with a path that is not a native ios project', function() {
@@ -41,7 +42,7 @@ describe('ios project parser', function() {
         });
         afterEach(function() {
             fs.writeFileSync(ios_pbx, original_pbx, 'utf-8');
-            fs.writeFileSync(cordova_plist, orig_cordova, 'utf-8');
+            fs.writeFileSync(ios_config_xml, orig_cordova, 'utf-8');
             fs.writeFileSync(ios_plist, original_plist, 'utf-8');
             fs.writeFileSync(cfg_path, original_config, 'utf-8');
         });
@@ -80,7 +81,7 @@ describe('ios project parser', function() {
                 expect(plist_contents).toMatch(/<string>ca.filmaj.dewd/);
             });
         });
-        it('should update the externalhosts whitelist properly', function() {
+        it('should update the whitelist in the project config.xml', function() {
             var cb = jasmine.createSpy();
 
             runs(function() {
@@ -90,8 +91,8 @@ describe('ios project parser', function() {
             waitsFor(function() { return cb.wasCalled; }, "update_from_config callback");
 
             runs(function() {
-                var plist_contents = fs.readFileSync(cordova_plist, 'utf-8');
-                expect(plist_contents).toMatch(/<key>ExternalHosts<\/key>\s*<array>\s*<string>\*<\/string>/);
+                var config_contents = fs.readFileSync(ios_config_xml, 'utf-8');
+                expect(config_contents).toMatch(/<access origin="\*" \/>/);
             });
         });
     });
@@ -131,7 +132,7 @@ describe('ios project parser', function() {
             runs(function() {
                 parser = new ios_parser(ios_platform);
                 parser.update_www();
-                expect(fs.readFileSync(path.join(ios_platform, 'www', 'cordova.js'),'utf-8')).toBe(fs.readFileSync(path.join(__dirname, '..', '..', 'lib', 'ios', 'bin', 'templates', 'project', 'www', 'cordova-2.2.0.js'), 'utf-8'));
+                expect(fs.readFileSync(path.join(ios_platform, 'www', 'cordova.js'),'utf-8')).toBe(fs.readFileSync(path.join(util.libDirectory, 'cordova-ios', 'CordovaLib', 'cordova.ios.js'), 'utf-8'));
             });
         });
     });

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/platform.spec.js
----------------------------------------------------------------------
diff --git a/spec/platform.spec.js b/spec/platform.spec.js
index da4b2e5..77808af 100644
--- a/spec/platform.spec.js
+++ b/spec/platform.spec.js
@@ -47,42 +47,38 @@ describe('platform command', function() {
         }).toThrow();
     });
 
-    var listing_tests = function(_invocation) {
-        return function() {
-            beforeEach(function() {
-                cordova.create(tempDir);
-                process.chdir(tempDir);
-            });
+    describe('`ls`', function() { 
+        beforeEach(function() {
+            cordova.create(tempDir);
+            process.chdir(tempDir);
+        });
 
-            afterEach(function() {
-                process.chdir(cwd);
-            });
+        afterEach(function() {
+            process.chdir(cwd);
+        });
 
-            it('should list out no platforms for a fresh project', function() {
-                expect(cordova.platform(_invocation).length).toEqual(0);
-            });
+        it('should list out no platforms for a fresh project', function() {
+            expect(cordova.platform('list').length).toEqual(0);
+        });
 
-            it('should list out added platforms in a project', function() {
-                var cbtwo = jasmine.createSpy();
-                var cb = jasmine.createSpy();
+        it('should list out added platforms in a project', function() {
+            var cbtwo = jasmine.createSpy();
+            var cb = jasmine.createSpy();
 
-                runs(function() {
-                    cordova.platform('add', 'android', cb);
-                });
-                waitsFor(function() { return cb.wasCalled; }, "create callback");
-                runs(function() {
-                    expect(cordova.platform(_invocation)[0]).toEqual('android');
-                    cordova.platform('add', 'ios', cbtwo);
-                });
-                waitsFor(function() { return cbtwo.wasCalled; }, "create callback number two");
-                runs(function() {
-                    expect(cordova.platform(_invocation)[1]).toEqual('ios');
-                });
+            runs(function() {
+                cordova.platform('add', 'android', cb);
+            });
+            waitsFor(function() { return cb.wasCalled; }, "android create callback");
+            runs(function() {
+                expect(cordova.platform('list')[0]).toEqual('android');
+                cordova.platform('add', 'ios', cbtwo);
             });
-        };
-    };
-    describe('`ls`', listing_tests('ls'));
-    describe('`list`', listing_tests('list'));
+            waitsFor(function() { return cbtwo.wasCalled; }, "create callback number two");
+            runs(function() {
+                expect(cordova.platform('list')[1]).toEqual('ios');
+            });
+        });
+    });
 
     describe('`add`', function() {
         beforeEach(function() {
@@ -95,55 +91,24 @@ describe('platform command', function() {
         });
 
         describe('without any libraries cloned', function() {
-            var lib = path.join(__dirname, '..', 'lib');
-            var libs = fs.readdirSync(lib);
-            
+            var bkup = path.join(util.libDirectory, '..', 'bkup');
             beforeEach(function() {
-                libs.forEach(function(p) {
-                    var s = path.join(lib, p);
-                    var d = path.join(lib, p + '-bkup');
-                    shell.mv(s, d);
-                });
+                shell.mkdir('-p', bkup);
+                shell.mv(util.libDirectory, bkup);
             });
             afterEach(function() {
-                libs.forEach(function(p) {
-                    var s = path.join(lib, p + '-bkup', '*');
-                    var d = path.join(lib, p);
-                    shell.mkdir(d);
-                    shell.mv(s, d);
-                    shell.rm('-rf', path.join(lib, p + '-bkup'));
-                });
+                shell.mv(path.join(bkup, fs.readdirSync(bkup)[0]), path.join(util.libDirectory, '..'));
+                shell.rm('-rf', bkup);
             });
-            it('should download the android library', function() {
+            it('should download the cordova library', function() {
                 var s = spyOn(request, 'get');
                 try {
                     cordova.platform('add', 'android', function() {});
                 } catch(e) {}
 
                 expect(s).toHaveBeenCalled();
-                expect(s.calls[0].args[0]).toMatch(/cordova-android\/zipball/);
-            });
-            it('should download the ios library', function() {
-                var s = spyOn(request, 'get');
-                try {
-                    cordova.platform('add', 'ios', function() {});
-                } catch(e) {}
-
-                expect(s).toHaveBeenCalled();
-                expect(s.calls[0].args[0]).toMatch(/cordova-ios\/zipball/);
-            });
-            it('should download the blackberry library', function() {
-                var s = spyOn(request, 'get');
-                try {
-                    cordova.platform('add', 'blackberry', function() {});
-                } catch(e) {}
-
-                expect(s).toHaveBeenCalled();
-                expect(s.calls[0].args[0]).toMatch(/cordova-blackberry-webworks\/zipball/);
+                expect(s.calls[0].args[0]).toMatch(/apache.org\/dist\/cordova.*\.zip$/);
             });
-            it('should add a basic android project');
-            it('should add a basic ios project');
-            it('should add a basic blackberry project');
         });
 
         describe('android', function() {
@@ -187,23 +152,23 @@ describe('platform command', function() {
                 }).toThrow();
             });
         });
-        describe('blackberry-10', function() {
+        describe('blackberry', function() {
             it('should add a basic blackberry project', function() {
                 var cb = jasmine.createSpy();
                 var s = spyOn(require('prompt'), 'get').andReturn(true);
 
                 runs(function() {
-                    cordova.platform('add', 'blackberry-10', cb);
+                    cordova.platform('add', 'blackberry', cb);
                     s.mostRecentCall.args[1](null, {}); // fake out prompt
                 });
                 waitsFor(function() { return cb.wasCalled; }, "platform add blackberry");
                 runs(function() {
-                    expect(fs.existsSync(path.join(tempDir, 'platforms', 'blackberry-10', 'www'))).toBe(true);
+                    expect(fs.existsSync(path.join(tempDir, 'platforms', 'blackberry', 'www'))).toBe(true);
                 });
             });
             it('should call blackberry_parser\'s update_project', function() {
                 var s = spyOn(blackberry_parser.prototype, 'update_project');
-                cordova.platform('add', 'blackberry-10');
+                cordova.platform('add', 'blackberry');
                 expect(s).toHaveBeenCalled();
             });
         });
@@ -220,46 +185,42 @@ describe('platform command', function() {
         });
     });
 
-    var removing_tests = function(_invocation) {
-        return function() {
-            beforeEach(function() {
-                cordova.create(tempDir);
-                process.chdir(tempDir);
-            });
+    describe('`remove`',function() { 
+        beforeEach(function() {
+            cordova.create(tempDir);
+            process.chdir(tempDir);
+        });
 
-            afterEach(function() {
-                process.chdir(cwd);
-            });
+        afterEach(function() {
+            process.chdir(cwd);
+        });
 
-            it('should remove a supported and added platform', function() {
-                var cb = jasmine.createSpy();
+        it('should remove a supported and added platform', function() {
+            var cb = jasmine.createSpy();
 
-                runs(function() {
-                    cordova.platform('add', ['android', 'ios'], cb);
-                });
-                waitsFor(function() { return cb.wasCalled; }, "android+ios platfomr add callback");
-                runs(function() {
-                    cordova.platform(_invocation, 'android');
-                    expect(cordova.platform('ls').length).toEqual(1);
-                    expect(cordova.platform('ls')[0]).toEqual('ios');
-                });
+            runs(function() {
+                cordova.platform('add', ['android', 'ios'], cb);
             });
-            it('should be able to remove multiple platforms', function() {
-                var cb = jasmine.createSpy();
+            waitsFor(function() { return cb.wasCalled; }, "android+ios platfomr add callback");
+            runs(function() {
+                cordova.platform('remove', 'android');
+                expect(cordova.platform('ls').length).toEqual(1);
+                expect(cordova.platform('ls')[0]).toEqual('ios');
+            });
+        });
+        it('should be able to remove multiple platforms', function() {
+            var cb = jasmine.createSpy();
 
-                runs(function() {
-                    cordova.platform('add', ['android', 'ios'], cb);
-                });
-                waitsFor(function() { return cb.wasCalled; }, "android+ios platfomr add callback");
-                runs(function() {
-                    cordova.platform(_invocation, ['android','ios']);
-                    expect(cordova.platform('ls').length).toEqual(0);
-                });
+            runs(function() {
+                cordova.platform('add', ['android', 'ios'], cb);
             });
-        };
-    };
-    describe('`rm`', removing_tests('rm'));
-    describe('`remove`', removing_tests('remove'));
+            waitsFor(function() { return cb.wasCalled; }, "android+ios platfomr add callback");
+            runs(function() {
+                cordova.platform('remove', ['android','ios']);
+                expect(cordova.platform('ls').length).toEqual(0);
+            });
+        });
+    });
 
     describe('hooks', function() {
         var s;

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/spec/plugin.spec.js
----------------------------------------------------------------------
diff --git a/spec/plugin.spec.js b/spec/plugin.spec.js
index 07101fe..4840671 100644
--- a/spec/plugin.spec.js
+++ b/spec/plugin.spec.js
@@ -42,25 +42,21 @@ describe('plugin command', function() {
         }).toThrow();
     });
 
-    var listing_tests = function(_invocation) {
-        return function() {
-            beforeEach(function() {
-                cordova.create(tempDir);
-            });
+    describe('`ls`', function() {
+        beforeEach(function() {
+            cordova.create(tempDir);
+        });
 
-            afterEach(function() {
-                process.chdir(cwd);
-            });
+        afterEach(function() {
+            process.chdir(cwd);
+        });
 
-            it('should list out no plugins for a fresh project', function() {
-                process.chdir(tempDir);
+        it('should list out no plugins for a fresh project', function() {
+            process.chdir(tempDir);
 
-                expect(cordova.plugin(_invocation)).toEqual('No plugins added. Use `cordova plugin add <plugin>`.');
-            });
-        };
-    };
-    describe('`ls`', listing_tests('ls'));
-    describe('`list`', listing_tests('list'));
+            expect(cordova.plugin('list')).toEqual('No plugins added. Use `cordova plugin add <plugin>`.');
+        });
+    });
 
     describe('`add`', function() {
         beforeEach(function() {
@@ -165,98 +161,94 @@ describe('plugin command', function() {
         });
     });
 
-    var removing_tests = function(_invocation) {
-        return function() {
-            beforeEach(function() {
-                cordova.create(tempDir);
-                process.chdir(tempDir);
-            });
+    describe('`rm`',function() {
+        beforeEach(function() {
+            cordova.create(tempDir);
+            process.chdir(tempDir);
+        });
 
-            afterEach(function() {
-                process.chdir(cwd);
+        afterEach(function() {
+            process.chdir(cwd);
+        });
+        describe('failure', function() {
+            it('should throw if your app has no platforms added', function() {
+                expect(function() {
+                    cordova.plugin(_invocation, testPlugin);
+                }).toThrow('You need at least one platform added to your app. Use `cordova platform add <platform>`.');
             });
-            describe('failure', function() {
-                it('should throw if your app has no platforms added', function() {
+            it('should throw if plugin is not added to project', function() {
+                var cb = jasmine.createSpy();
+                runs(function() {
+                    cordova.platform('add', 'ios', cb);
+                });
+                waitsFor(function() { return cb.wasCalled; }, 'ios platform add');
+                runs(function() {
                     expect(function() {
-                        cordova.plugin(_invocation, testPlugin);
-                    }).toThrow('You need at least one platform added to your app. Use `cordova platform add <platform>`.');
+                        cordova.plugin(_invocation, 'test', function() {});
+                    }).toThrow('Plugin "test" not added to project.');
+                });
+            });
+        });
+        describe('success', function() {
+            it('should remove plugin www assets from project www folder', function() {
+                var cb = jasmine.createSpy();
+                var pluginCb = jasmine.createSpy();
+                var removeCb = jasmine.createSpy();
+                runs(function() {
+                    cordova.platform('add', 'ios', cb);
+                });
+                waitsFor(function() { return cb.wasCalled; }, 'ios platform add');
+                runs(function() {
+                    cordova.plugin('add', testPlugin, pluginCb);
                 });
-                it('should throw if plugin is not added to project', function() {
-                    var cb = jasmine.createSpy();
-                    runs(function() {
-                        cordova.platform('add', 'ios', cb);
-                    });
-                    waitsFor(function() { return cb.wasCalled; }, 'ios platform add');
-                    runs(function() {
-                        expect(function() {
-                            cordova.plugin(_invocation, 'test', function() {});
-                        }).toThrow('Plugin "test" not added to project.');
-                    });
+                waitsFor(function() { return pluginCb.wasCalled; }, 'test plugin add');
+                runs(function() {
+                    cordova.plugin(_invocation, 'test', removeCb);
+                });
+                waitsFor(function() { return removeCb.wasCalled; }, 'test plugin remove');
+                runs(function() {
+                    expect(fs.existsSync(path.join(tempDir, 'www', 'test.js'))).toBe(false);
                 });
             });
-            describe('success', function() {
-                it('should remove plugin www assets from project www folder', function() {
-                    var cb = jasmine.createSpy();
-                    var pluginCb = jasmine.createSpy();
-                    var removeCb = jasmine.createSpy();
-                    runs(function() {
-                        cordova.platform('add', 'ios', cb);
-                    });
-                    waitsFor(function() { return cb.wasCalled; }, 'ios platform add');
-                    runs(function() {
-                        cordova.plugin('add', testPlugin, pluginCb);
-                    });
-                    waitsFor(function() { return pluginCb.wasCalled; }, 'test plugin add');
-                    runs(function() {
-                        cordova.plugin(_invocation, 'test', removeCb);
-                    });
-                    waitsFor(function() { return removeCb.wasCalled; }, 'test plugin remove');
-                    runs(function() {
-                        expect(fs.existsSync(path.join(tempDir, 'www', 'test.js'))).toBe(false);
-                    });
+            it('should remove the full plugin from the plugins directory', function() {
+                var cb = jasmine.createSpy();
+                var pluginCb = jasmine.createSpy();
+                var removeCb = jasmine.createSpy();
+                runs(function() {
+                    cordova.platform('add', 'ios', cb);
                 });
-                it('should remove the full plugin from the plugins directory', function() {
-                    var cb = jasmine.createSpy();
-                    var pluginCb = jasmine.createSpy();
-                    var removeCb = jasmine.createSpy();
-                    runs(function() {
-                        cordova.platform('add', 'ios', cb);
-                    });
-                    waitsFor(function() { return cb.wasCalled; }, 'ios platform add');
-                    runs(function() {
-                        cordova.plugin('add', testPlugin, pluginCb);
-                    });
-                    waitsFor(function() { return pluginCb.wasCalled; }, 'test plugin add');
-                    runs(function() {
-                        cordova.plugin(_invocation, 'test', removeCb);
-                    });
-                    waitsFor(function() { return removeCb.wasCalled; }, 'test plugin remove');
-                    runs(function() {
-                        expect(fs.existsSync(path.join(tempDir, 'plugins', 'test'))).toBe(false);
-                    });
+                waitsFor(function() { return cb.wasCalled; }, 'ios platform add');
+                runs(function() {
+                    cordova.plugin('add', testPlugin, pluginCb);
+                });
+                waitsFor(function() { return pluginCb.wasCalled; }, 'test plugin add');
+                runs(function() {
+                    cordova.plugin(_invocation, 'test', removeCb);
+                });
+                waitsFor(function() { return removeCb.wasCalled; }, 'test plugin remove');
+                runs(function() {
+                    expect(fs.existsSync(path.join(tempDir, 'plugins', 'test'))).toBe(false);
+                });
+            });
+            it('should be able to handle removing multiple plugins', function() {
+                cordova.platform('add', 'android');
+                var cb = jasmine.createSpy();
+                var cbtwo = jasmine.createSpy();
+                runs(function() {
+                    cordova.plugin('add', [testPlugin, androidPlugin], cb);
                 });
-                it('should be able to handle removing multiple plugins', function() {
-                    cordova.platform('add', 'android');
-                    var cb = jasmine.createSpy();
-                    var cbtwo = jasmine.createSpy();
-                    runs(function() {
-                        cordova.plugin('add', [testPlugin, androidPlugin], cb);
-                    });
-                    waitsFor(function() { return cb.wasCalled; }, 'test+android plugin add');
-                    runs(function() {
-                        cordova.plugin(_invocation, [testPlugin, androidPlugin], cbtwo);
-                    });
-                    waitsFor(function() { return cbtwo.wasCalled; }, 'test+android plugin rm');
-                    runs(function() {
-                        expect(fs.existsSync(path.join(tempDir, 'plugins', 'test'))).toBe(false);
-                        expect(fs.existsSync(path.join(tempDir, 'plugins', 'android'))).toBe(false);
-                    });
+                waitsFor(function() { return cb.wasCalled; }, 'test+android plugin add');
+                runs(function() {
+                    cordova.plugin(_invocation, [testPlugin, androidPlugin], cbtwo);
+                });
+                waitsFor(function() { return cbtwo.wasCalled; }, 'test+android plugin rm');
+                runs(function() {
+                    expect(fs.existsSync(path.join(tempDir, 'plugins', 'test'))).toBe(false);
+                    expect(fs.existsSync(path.join(tempDir, 'plugins', 'android'))).toBe(false);
                 });
             });
-        };
-    };
-    describe('`rm`', removing_tests('rm'));
-    describe('`remove`', removing_tests('remove'));
+        });
+    });
 
     describe('hooks', function() {
         var s;

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/src/build.js
----------------------------------------------------------------------
diff --git a/src/build.js b/src/build.js
index deb60f8..ad16563 100644
--- a/src/build.js
+++ b/src/build.js
@@ -18,7 +18,8 @@ function shell_out_to_debug(projectRoot, platform) {
     var cmd = path.join(projectRoot, 'platforms', platform);
     // TODO: wait for https://issues.apache.org/jira/browse/CB-1548 to be fixed before we axe this
     // TODO: this is bb10 only for now
-    if (platform.indexOf('blackberry') > -1) {
+    // TODO: PLATFORM LIBRARY INCONSISTENCY
+    if (platform == 'blackberry') {
         cmd = 'ant -f "' + path.join(cmd, 'build.xml') + '" qnx load-device';
     } else {
         cmd = '"' + cmd + '/cordova/build"';
@@ -74,14 +75,14 @@ module.exports = function build (platforms, callback) {
                 shell_out_to_debug(projectRoot, 'android');
                 end();
                 break;
-            case 'blackberry-10':
-                platformPath = path.join(projectRoot, 'platforms', 'blackberry-10');
+            case 'blackberry':
+                platformPath = path.join(projectRoot, 'platforms', 'blackberry');
                 parser = new blackberry_parser(platformPath);
                 
                 // Update the related platform project from the config
                 parser.update_project(cfg, function() {
                     // Shell it
-                    shell_out_to_debug(projectRoot, 'blackberry-10');
+                    shell_out_to_debug(projectRoot, 'blackberry');
                     end();
                 });
                 break;

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/src/emulate.js
----------------------------------------------------------------------
diff --git a/src/emulate.js b/src/emulate.js
index 40340e2..3847766 100644
--- a/src/emulate.js
+++ b/src/emulate.js
@@ -14,8 +14,8 @@ var cordova_util = require('./util'),
 
 function shell_out_to_emulate(root, platform) {
     var cmd = path.join(root, 'platforms', platform, 'cordova', 'emulate');
-    // TODO: bad bad bad
-    if (platform.indexOf('blackberry') > -1) {
+    // TODO: PLATFORM LIBRARY INCONSISTENCY 
+    if (platform == 'blackberry') {
         cmd = 'ant -f ' + path.join(root, 'platforms', platform, 'build.xml') + ' qnx load-simulator';
     } else if (platform.indexOf('android') > -1) {
         cmd = path.join(root, 'platforms', platform, 'cordova', 'run');
@@ -69,20 +69,19 @@ module.exports = function emulate (platforms, callback) {
                 shell_out_to_emulate(projectRoot, 'android');
                 end();
                 break;
-            case 'blackberry-10':
-                platformPath = path.join(projectRoot, 'platforms', 'blackberry-10');
+            case 'blackberry':
+                platformPath = path.join(projectRoot, 'platforms', 'blackberry');
                 parser = new blackberry_parser(platformPath);
                 
                 // Update the related platform project from the config
                 parser.update_project(cfg, function() {
                     // Shell it
-                    shell_out_to_emulate(projectRoot, 'blackberry-10');
+                    shell_out_to_emulate(projectRoot, 'blackberry');
                     end();
                 });
                 break;
             case 'ios':
                 platformPath = path.join(projectRoot, 'platforms', 'ios');
-                js = path.join(__dirname, '..', 'lib', 'ios', 'CordovaLib', 'javascript', 'cordova.ios.js');
                 parser = new ios_parser(platformPath);
                 // Update the related platform project from the config
                 parser.update_project(cfg, function() {

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/src/metadata/android_parser.js
----------------------------------------------------------------------
diff --git a/src/metadata/android_parser.js b/src/metadata/android_parser.js
index 3c6a844..90b06b8 100644
--- a/src/metadata/android_parser.js
+++ b/src/metadata/android_parser.js
@@ -1,8 +1,8 @@
-var fs   = require('fs'),
-    path = require('path'),
-    et = require('elementtree'),
-    util = require('../util'),
-    shell = require('shelljs'),
+var fs            = require('fs'),
+    path          = require('path'),
+    et            = require('elementtree'),
+    util          = require('../util'),
+    shell         = require('shelljs'),
     config_parser = require('../config_parser');
 
 module.exports = function android_parser(project) {
@@ -62,7 +62,7 @@ module.exports.prototype = {
         var www = path.join(projectRoot, 'www');
         var platformWww = path.join(this.path, 'assets');
         shell.cp('-rf', www, platformWww);
-        var jsPath = path.join(__dirname, '..', '..', 'lib', 'android', 'framework', 'assets', 'js', 'cordova.android.js');
+        var jsPath = path.join(util.libDirectory, 'cordova-android', 'framework', 'assets', 'js', 'cordova.android.js');
         fs.writeFileSync(path.join(platformWww, 'www', 'cordova.js'), fs.readFileSync(jsPath, 'utf-8'), 'utf-8');
     },
     update_project:function(cfg) {

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/src/metadata/ios_parser.js
----------------------------------------------------------------------
diff --git a/src/metadata/ios_parser.js b/src/metadata/ios_parser.js
index 6359839..03ee168 100644
--- a/src/metadata/ios_parser.js
+++ b/src/metadata/ios_parser.js
@@ -19,6 +19,7 @@ module.exports = function ios_parser(project) {
     }
     this.path = project;
     this.pbxproj = path.join(this.xcodeproj, 'project.pbxproj');
+    this.config = new config_parser(path.join(this.cordovaproj, 'config.xml'));
 };
 module.exports.prototype = {
     update_from_config:function(config, callback) {
@@ -34,6 +35,18 @@ module.exports.prototype = {
         var info_contents = plist.build(infoPlist);
         info_contents = info_contents.replace(/<string>\s*<\/string>/,'<string></string>');
         fs.writeFileSync(plistFile, info_contents, 'utf-8');
+
+        // Update whitelist
+        var self = this;
+        this.config.doc.findall('access').forEach(function(a) {
+            self.config.doc.getroot().remove(0, a);
+        });
+        config.access.get().forEach(function(uri) {
+            var el = new et.Element('access');
+            el.attrib.origin = uri;
+            self.config.doc.getroot().append(el);
+        });
+        this.config.update();
         
         // Update product name
         var proj = new xcode.project(this.pbxproj);

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/src/platform.js
----------------------------------------------------------------------
diff --git a/src/platform.js b/src/platform.js
index 01d6bc3..686d3db 100644
--- a/src/platform.js
+++ b/src/platform.js
@@ -1,15 +1,15 @@
-var config_parser = require('./config_parser'),
-    cordova_util  = require('./util'),
-    util          = require('util'),
-    fs            = require('fs'),
-    path          = require('path'),
-    android_parser= require('./metadata/android_parser'),
-    blackberry_parser= require('./metadata/blackberry_parser'),
-    ios_parser    = require('./metadata/ios_parser'),
-    hooker        = require('./hooker'),
-    n             = require('ncallbacks'),
-    semver        = require('semver'),
-    shell         = require('shelljs');
+var config_parser     = require('./config_parser'),
+    cordova_util      = require('./util'),
+    util              = require('util'),
+    fs                = require('fs'),
+    path              = require('path'),
+    android_parser    = require('./metadata/android_parser'),
+    blackberry_parser = require('./metadata/blackberry_parser'),
+    ios_parser        = require('./metadata/ios_parser'),
+    hooker            = require('./hooker'),
+    n                 = require('ncallbacks'),
+    semver            = require('semver'),
+    shell             = require('shelljs');
 
 module.exports = function platform(command, targets, callback) {
     var projectRoot = cordova_util.isCordova(process.cwd());
@@ -44,61 +44,56 @@ module.exports = function platform(command, targets, callback) {
                 hooks.fire('before_platform_add');
                 var output = path.join(projectRoot, 'platforms', target);
 
-                var shell_to_cordova = function() {
-                    if (target == 'ios') {
-                        // Check xcode + version.
-                        var xcode = shell.exec('xcodebuild -version', {silent:true});
-                        if (xcode.code != 0) throw 'Xcode is not installed. Cannot add iOS platform.';
-                        var xc_version = xcode.output.split('\n')[0].split(' ')[1];
-                        var MIN_XCODE_VERSION = '4.5.x';
-                        if (semver.lt(xc_version, MIN_XCODE_VERSION)) throw ('Xcode version installed is too old. Minimum: ' + MIN_XCODE_VERSION + ', yours: ' + xc_version);
-                    }
-                    // Create a platform app using the ./bin/create scripts that exist in each repo.
-                    // TODO: eventually refactor to allow multiple versions to be created.
-                    // Check if output directory already exists.
-                    if (fs.existsSync(output)) {
-                        throw new Error('Platform "' + target + '" already exists' );
-                    }
+                if (target == 'ios') {
+                    // Check xcode + version.
+                    var xcode = shell.exec('xcodebuild -version', {silent:true});
+                    if (xcode.code != 0) throw 'Xcode is not installed. Cannot add iOS platform.';
+                    var xc_version = xcode.output.split('\n')[0].split(' ')[1];
+                    var MIN_XCODE_VERSION = '4.5.x';
+                    if (semver.lt(xc_version, MIN_XCODE_VERSION)) throw ('Xcode version installed is too old. Minimum: ' + MIN_XCODE_VERSION + ', yours: ' + xc_version);
+                }
+                // Create a platform app using the ./bin/create scripts that exist in each repo.
+                // TODO: eventually refactor to allow multiple versions to be created.
+                // Check if output directory already exists.
+                if (fs.existsSync(output)) {
+                    throw new Error('Platform "' + target + '" already exists' );
+                }
 
-                    // Run platform's create script
-                    var bin = path.join(__dirname, '..', 'lib', cordova_util.underlyingLib(target), 'bin', 'create');
-                    var pkg = cfg.packageName().replace(/[^\w.]/g,'_');
-                    var name = cfg.name().replace(/\W/g,'_');
-                    var command = util.format('"%s" "%s" "%s" "%s"', bin, output, (cordova_util.underlyingLib(target)=='blackberry'?name:pkg), name);
+                // Run platform's create script
+                var bin = path.join(cordova_util.libDirectory, 'cordova-' + target, 'bin', 'create');
+                var pkg = cfg.packageName().replace(/[^\w.]/g,'_');
+                var name = cfg.name().replace(/\W/g,'_');
+                // TODO: PLATFORM LIBRARY INCONSISTENCY: order/number of arguments to create
+                var command = util.format('"%s" "%s" "%s" "%s"', bin, output, (target=='blackberry'?name:pkg), name);
 
-                    var create = shell.exec(command, {silent:true});
-                    if (create.code > 0) {
-                        throw new Error('An error occured during creation of ' + target + ' sub-project. ' + create.output);
-                    }
+                var create = shell.exec(command, {silent:true});
+                if (create.code > 0) {
+                    throw new Error('An error occured during creation of ' + target + ' sub-project. ' + create.output);
+                }
 
-                    switch(cordova_util.underlyingLib(target)) {
-                        case 'android':
-                            var android = new android_parser(output);
-                            android.update_project(cfg);
+                switch(target) {
+                    case 'android':
+                        var android = new android_parser(output);
+                        android.update_project(cfg);
+                        hooks.fire('after_platform_add');
+                        end();
+                        break;
+                    case 'ios':
+                        var ios = new ios_parser(output);
+                        ios.update_project(cfg, function() {
                             hooks.fire('after_platform_add');
                             end();
-                            break;
-                        case 'ios':
-                            var ios = new ios_parser(output);
-                            ios.update_project(cfg, function() {
-                                hooks.fire('after_platform_add');
-                                end();
-                            });
-                            break;
-                        case 'blackberry':
-                            var bb = new blackberry_parser(output);
-                            bb.update_project(cfg, function() {
-                                hooks.fire('after_platform_add');
-                                end();
-                            });
-                            break;
-                    }
-                };
+                        });
+                        break;
+                    case 'blackberry':
+                        var bb = new blackberry_parser(output);
+                        bb.update_project(cfg, function() {
+                            hooks.fire('after_platform_add');
+                            end();
+                        });
+                        break;
+                }
 
-                // If the Cordova library for this platform is missing, get it.
-                if (!cordova_util.havePlatformLib(target)) {
-                    cordova_util.getPlatformLib(target, shell_to_cordova);
-                } else shell_to_cordova();
             });
             break;
         case 'rm':

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/src/plugin.js
----------------------------------------------------------------------
diff --git a/src/plugin.js b/src/plugin.js
index 63b1bf4..5937443 100644
--- a/src/plugin.js
+++ b/src/plugin.js
@@ -144,7 +144,7 @@ module.exports = function plugin(command, targets, callback) {
                     // Iterate over all matchin app-plugin platforms in the project and uninstall the
                     // plugin.
                     intersection.forEach(function(platform) {
-                        var cmd = util.format('%s --platform %s --project "%s" --plugin "%s" --remove', cli, platform, path.join(projectRoot, 'platforms', platform), targetPath);
+                        var cmd = util.format('%s --remove --platform %s --project "%s" --plugin "%s"', cli, platform, path.join(projectRoot, 'platforms', platform), targetPath);
                         var plugin_cli = shell.exec(cmd, {silent:true});
                         if (plugin_cli.code > 0) throw 'An error occured during plugin uninstallation for ' + platform + '. ' + plugin_cli.output;
                     });

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/src/util.js
----------------------------------------------------------------------
diff --git a/src/util.js b/src/util.js
index 6f7b2b6..c780eda 100644
--- a/src/util.js
+++ b/src/util.js
@@ -2,22 +2,23 @@ var fs         = require('fs'),
     path       = require('path'),
     util       = require('util'),
     request    = require('request'),
-    admzip     = require('adm-zip'),
-    shell      = require('shelljs');
+    n          = require('ncallbacks'),
+    shell      = require('shelljs'),
+    unzip      = require('unzip'),
+    platforms  = require('../platforms');
 
-var cordova_lib_tag = '2.3.0rc1';
-
-var repos = {
-    ios:'https://github.com/apache/cordova-ios/',
-    android:'https://github.com/apache/cordova-android/',
-    blackberry:'https://github.com/apache/cordova-blackberry/'
-};
+var cordova_lib_tag = '2.3.0';
+var libs_path = path.join(__dirname, '..', 'lib')
+var lib_path = path.join(libs_path, 'cordova-' + cordova_lib_tag);
+var archive_path = path.join(libs_path, 'cordova-' + cordova_lib_tag + '-src.zip');
+var root_url = 'http://apache.org/dist/cordova/cordova-' + cordova_lib_tag + '-src.zip';
 
 function chmod(path) {
     shell.exec('chmod +x "' + path + '"', {silent:true});
 }
 
 module.exports = {
+    libDirectory:lib_path,
     // Runs up the directory chain looking for a .cordova directory.
     // IF it is found we are in a Cordova project.
     // If not.. we're not.
@@ -36,18 +37,17 @@ module.exports = {
     },
     // Determines whether the library has a copy of the specified
     // Cordova implementation at the current proper version
-    havePlatformLib: function havePlatformLib(platform, callback) {
-        var dir = path.join(__dirname, '..', 'lib', module.exports.underlyingLib(platform));
-        if (fs.existsSync(dir)) {
-            var versionFile = path.join(dir, 'VERSION');
-            if (platform == 'ios') versionFile = path.join(dir, 'CordovaLib', 'VERSION');
-            var version = fs.readFileSync(versionFile, 'utf-8').replace(/\s/g,'');
-            if (version != cordova_lib_tag) {
-                shell.rm('-rf', dir);
-                return false;
-            } else return true;
+    havePlatformLib: function havePlatformLib(platform) {
+        if (module.exports.haveCordovaLib()) {
+            var dir = path.join(lib_path, 'cordova-' + platform);
+            if (fs.existsSync(dir)) return true;
+            else return false;
         } else return false;
     },
+    haveCordovaLib: function haveCordovaLib() {
+        if (fs.existsSync(lib_path)) return true;
+        else return false;
+    },
     /**
      * checkout a platform from the git repo
      * @param target string platform to get (enum of 'ios' or 'android' for now)
@@ -55,64 +55,69 @@ module.exports = {
      */
     getPlatformLib: function getPlatformLib(target, callback) {
         // verify platform is supported
-        target = module.exports.underlyingLib(target);
-        if (!repos[target]) {
+        if (platforms.indexOf(target) == -1) {
             throw new Error('platform "' + target + '" not found.');
         }
 
-        var outPath = path.join(__dirname, '..', 'lib', target);
-        shell.mkdir('-p', outPath);
-
-        var tempPath = path.join(__dirname, '..', 'temp');
-        shell.mkdir('-p', tempPath);
-
-        var tempFile = path.join(tempPath, target + '-' + cordova_lib_tag + '.zip');
-
-        console.log('Downloading ' + target + ' library, this may take a while...');
-        request.get(repos[target] + 'zipball/' + cordova_lib_tag, function(err) {
-            if (err) throw ('Error during download of ' + target + 'library.');
-            var zip = new admzip(tempFile);
-            var extractPoint = path.join(tempPath, target);
-            zip.extractAllTo(extractPoint);
-            var tempDir = path.join(extractPoint, fs.readdirSync(extractPoint)[0]);
-            shell.mv('-f', path.join(tempDir, '*'), outPath);
-
-            // chmod the create file
-            var create = path.join(outPath, 'bin', 'create');
-            chmod(create);
+        function movePlatform() {
+        }
 
-            // chmod executable scripts 
-            if (target == 'ios') {
-                chmod(path.join(outPath, 'bin', 'replaces'));
-                chmod(path.join(outPath, 'bin', 'update_cordova_subproject'));
-                chmod(path.join(outPath, 'bin', 'templates', 'project', 'cordova', 'build'));
-                chmod(path.join(outPath, 'bin', 'templates', 'project', 'cordova', 'run'));
-                chmod(path.join(outPath, 'bin', 'templates', 'project', 'cordova', 'release'));
-                chmod(path.join(outPath, 'bin', 'templates', 'project', 'cordova', 'emulate'));
-            } else if (target == 'android') {
-                chmod(path.join(outPath, 'bin', 'templates', 'cordova', 'cordova'));
-                chmod(path.join(outPath, 'bin', 'templates', 'cordova', 'build'));
-                chmod(path.join(outPath, 'bin', 'templates', 'cordova', 'run'));
-                chmod(path.join(outPath, 'bin', 'templates', 'cordova', 'clean'));
-                chmod(path.join(outPath, 'bin', 'templates', 'cordova', 'release'));
-            } else if (target == 'blackberry') {
-                chmod(path.join(outPath, 'bin', 'templates', 'cordova', 'debug'));
-                chmod(path.join(outPath, 'bin', 'templates', 'cordova', 'emulate'));
-            }
+        if (!module.exports.haveCordovaLib()) {
+            module.exports.getCordovaLib(movePlatform);
+        } else {
+            movePlatform();
+        }
+    },
+    extractCordovaLib:function(callback) {
+        console.log('Extracting cordova...');
+        var end = n(platforms.length, function() {
+            if (callback) callback();
+        });
 
-            // Clean up
-            shell.rm('-rf', tempFile);
-            shell.rm('-rf', extractPoint);
+        fs.createReadStream(archive_path).pipe(unzip.Extract({ path: libs_path })).on('close', function() {
+        // Extract each platform lib too
+            platforms.forEach(function(platform) {
+                var archive = path.join(lib_path, 'cordova-' + platform + '.zip');
+                var out_path = path.join(lib_path, 'cordova-' + platform);
+                shell.mkdir('-p', out_path);
+                fs.createReadStream(archive).pipe(unzip.Extract({ path:out_path  })).on('close', function() {
+                    var platform_path = path.join(lib_path, 'cordova-' + platform);
 
-            // Callback
-            if (callback) callback();
-        }).pipe(fs.createWriteStream(tempFile));
+                    // chmod the create file
+                    var create = path.join(platform_path, 'bin', 'create');
+                    chmod(create);
+                    // chmod executable scripts 
+                    if (platform == 'ios') {
+                        chmod(path.join(platform_path, 'bin', 'replaces'));
+                        chmod(path.join(platform_path, 'bin', 'update_cordova_subproject'));
+                        chmod(path.join(platform_path, 'bin', 'templates', 'project', 'cordova', 'build'));
+                        chmod(path.join(platform_path, 'bin', 'templates', 'project', 'cordova', 'run'));
+                        chmod(path.join(platform_path, 'bin', 'templates', 'project', 'cordova', 'release'));
+                        chmod(path.join(platform_path, 'bin', 'templates', 'project', 'cordova', 'emulate'));
+                    } else if (platform == 'android') {
+                        chmod(path.join(platform_path, 'bin', 'templates', 'cordova', 'cordova'));
+                        chmod(path.join(platform_path, 'bin', 'templates', 'cordova', 'build'));
+                        chmod(path.join(platform_path, 'bin', 'templates', 'cordova', 'run'));
+                        chmod(path.join(platform_path, 'bin', 'templates', 'cordova', 'clean'));
+                        chmod(path.join(platform_path, 'bin', 'templates', 'cordova', 'release'));
+                    } else if (platform == 'blackberry') {
+                        chmod(path.join(platform_path, 'bin', 'templates', 'cordova', 'debug'));
+                        chmod(path.join(platform_path, 'bin', 'templates', 'cordova', 'emulate'));
+                    }
+                    end();
+                });
+            });
+        });
     },
-    underlyingLib:function underlyingLib(name) {
-        var pos = name.indexOf('-');
-        if (pos > -1) {
-            name = name.substr(0, pos);
+    getCordovaLib:function (callback) {
+        if (!fs.existsSync(archive_path)) {
+            console.log('Downloading cordova-' + cordova_lib_tag + ', this may take a while...');
+            request.get(root_url, function(err) {
+                if (err) throw ('Error during cordova download!');
+                module.exports.extractCordovaLib(callback);
+            }).pipe(fs.createWriteStream(archive_path));
+        } else {
+            module.exports.extractCordovaLib(callback);
         }
-        return name;
     }
 };

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/5742036a/test_bootstrap.js
----------------------------------------------------------------------
diff --git a/test_bootstrap.js b/test_bootstrap.js
deleted file mode 100644
index 1d149ff..0000000
--- a/test_bootstrap.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * TEST BOOTSTRAP FILE
- * Runs through any bs to make sure the tests are good to go.
- **/
-
-var fs = require('fs'),
-    path = require('path'),
-    util = require('./src/util'),
-    ncallbacks=require('ncallbacks'),
-    platforms = require('./platforms');
-
-var end = ncallbacks(platforms.length, function() {
-    process.exit(0);
-});
-
-// If a platform library dependency does not exist, will clone it down.
-platforms.forEach(function(p) {
-    if (!util.havePlatformLib(p)) {
-        util.getPlatformLib(p, end);
-    }
-});