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/06/04 20:57:17 UTC

[1/2] updating cordova-android and cordova-ios libs to 2.8.0rc1

Updated Branches:
  refs/heads/master2 0c6c190d7 -> dfd7980f1


http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-ios/CordovaLibTests/ExifTests.m
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/CordovaLibTests/ExifTests.m b/lib/cordova-ios/CordovaLibTests/ExifTests.m
index 960ac95..dfd6da4 100644
--- a/lib/cordova-ios/CordovaLibTests/ExifTests.m
+++ b/lib/cordova-ios/CordovaLibTests/ExifTests.m
@@ -1,154 +1,171 @@
-//
-//  ExifTestTests.m
-//  ExifTestTests
-//
-//  Created by Lorin Beer on 2013-03-18.
-//
-//
+/*
+ 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.
+ */
 
 #import <SenTestingKit/SenTestingKit.h>
 
 #import "ExifTestTests.h"
 #import "../ExifTest/CDVJpegHeaderWriter.m"
 
-
 @implementation ExifTestTests
 
 - (void)setUp
 {
     [super setUp];
     testHeaderWriter = [[CDVJpegHeaderWriter alloc] init];
-    testErrorThreshhold = [NSNumber numberWithDouble: 0.000001];
-    NSLog(@"%x", ~10+1);
-    
-    
+    testErrorThreshhold = [NSNumber numberWithDouble:0.000001];
+    NSLog(@"%x", ~10 + 1);
 }
 
 - (void)tearDown
 {
     // Tear-down code here.
-    
+
     [super tearDown];
 }
 
-//==================================================================================================
+// ==================================================================================================
 // rational approximation of decimal by continued fraction tests
-//==================================================================================================
+// ==================================================================================================
 
 // tests continued fraction with random int
-- (void)testContinuedFractionWithUInt {
+- (void)testContinuedFractionWithUInt
+{
     NSLog(@"Continued Fraction Test with random int value, numerator should be generated value, denominator should be 1");
-    NSNumber * numerator = @0;
-    NSNumber * denominator = @0;
-    NSNumber * testValue = [NSNumber numberWithInt: abs(arc4random())];
-    [testHeaderWriter decimalToUnsignedRational: testValue
-                  withResultNumerator: &numerator
-                withResultDenominator: &denominator];
+    NSNumber* numerator = @0;
+    NSNumber* denominator = @0;
+    NSNumber* testValue = [NSNumber numberWithInt:abs(arc4random())];
+    [testHeaderWriter decimalToUnsignedRational:testValue
+                            withResultNumerator:&numerator
+                          withResultDenominator:&denominator];
     STAssertEquals([numerator intValue],
-                   [testValue intValue],
-                   @"Numerator did not match");
+        [testValue intValue],
+        @"Numerator did not match");
     STAssertEquals([denominator intValue],
-                   1,
-                   @"denominator was not one");
+        1,
+        @"denominator was not one");
 }
 
 // tests continued fraction with random float
-- (void)testContinuedFractionWithUFloat {
+- (void)testContinuedFractionWithUFloat
+{
     NSLog(@"Continued Fraction Test with random double value, resulting fraction should be within acceptable error threshhold");
-    NSNumber * threshhold = @0.1;
-    NSNumber * numerator = @0;
-    NSNumber * denominator = @0;
-    NSLog(@"%f",((double)arc4random() / ARC4RANDOM_MAX) * 100.0f);
-    NSNumber * testValue = [NSNumber numberWithDouble:
-                                ((double)arc4random() / ARC4RANDOM_MAX) * 100.0f];
-
-    [testHeaderWriter decimalToUnsignedRational: testValue
-                            withResultNumerator: &numerator
-                          withResultDenominator: &denominator];
-    NSLog(@"%lf, %lf",[testValue doubleValue], [numerator doubleValue]/[denominator doubleValue]);
+    NSNumber* threshhold = @0.1;
+    NSNumber* numerator = @0;
+    NSNumber* denominator = @0;
+    NSLog(@"%f", ((double)arc4random() / ARC4RANDOM_MAX) * 100.0f);
+    NSNumber* testValue = [NSNumber numberWithDouble:
+        ((double)arc4random() / ARC4RANDOM_MAX) * 100.0f];
+
+    [testHeaderWriter decimalToUnsignedRational:testValue
+                            withResultNumerator:&numerator
+                          withResultDenominator:&denominator];
+    NSLog(@"%lf, %lf", [testValue doubleValue], [numerator doubleValue] / [denominator doubleValue]);
 
     STAssertEqualsWithAccuracy([testValue doubleValue],
-                               [numerator doubleValue]/[denominator doubleValue],
-                               [threshhold doubleValue],
-                               @"rational approximation did not meet acceptable error threshhold");
-    
+        [numerator doubleValue] / [denominator doubleValue],
+        [threshhold doubleValue],
+        @"rational approximation did not meet acceptable error threshhold");
 }
 
 // tests continued fraction in sqrt(2) worst case
-- (void)testContinuedFractionsWorstCase {
+- (void)testContinuedFractionsWorstCase
+{
     NSLog(@"Continued Fraction Test with provable worst case ~sqrt(2), resulting fraction should be within acceptable error threshhold");
-    NSNumber * threshhold = @0.1;
-    NSNumber * numerator = @0;
-    NSNumber * denominator = @0;
-    NSNumber * testValue = [NSNumber numberWithDouble: sqrt(2)];
-    [testHeaderWriter decimalToUnsignedRational: testValue
-                            withResultNumerator: &numerator
-                          withResultDenominator: &denominator];
+    NSNumber* threshhold = @0.1;
+    NSNumber* numerator = @0;
+    NSNumber* denominator = @0;
+    NSNumber* testValue = [NSNumber numberWithDouble:sqrt(2)];
+    [testHeaderWriter decimalToUnsignedRational:testValue
+                            withResultNumerator:&numerator
+                          withResultDenominator:&denominator];
     STAssertEqualsWithAccuracy([testValue doubleValue],
-                               [numerator doubleValue]/[denominator doubleValue],
-                               [threshhold doubleValue],
-                               @"rational approximation did not meet acceptable error threshhold");
+        [numerator doubleValue] / [denominator doubleValue],
+        [threshhold doubleValue],
+        @"rational approximation did not meet acceptable error threshhold");
 }
 
 // tests format hex from a decimal
-- (void) testFormatHexFromDecimal {
-    NSNumber * testValue = @1;
-    NSNumber * testPlaces = @8;
-    NSString * result = nil;
-    result = [testHeaderWriter formattedHexStringFromDecimalNumber: testValue
-                                                        withPlaces: testPlaces];
+- (void)testFormatHexFromDecimal
+{
+    NSNumber* testValue = @1;
+    NSNumber* testPlaces = @8;
+    NSString* result = nil;
+
+    result = [testHeaderWriter formattedHexStringFromDecimalNumber:testValue
+                                                        withPlaces:testPlaces];
     // assert not nil
     STAssertNotNil(result, @"nil renturned from formattedHexStringFromDecimalNumber");
     // assert correct number of places
     STAssertEquals([result length], [testPlaces unsignedIntegerValue],
-                   @"returned string to wrong number of places. Should be = %i Was = %i",
-                   [testPlaces intValue],
-                   [result length]);
+        @"returned string to wrong number of places. Should be = %i Was = %i",
+        [testPlaces intValue],
+        [result length]);
     // assert correct hex representation
     STAssertTrueNoThrow([result isEqualToString:@"00000001"], @"result should be equal to @00000001");
-
 }
 
 // tests format number string with leading zeroes
-- (void) testFormatNumberWithLeadingZeroes {
-    NSString * result = nil;
-    NSNumber * testValue = @8769; // Exif SubIFD Offset Tag
-    NSNumber * testPlaces = @6;
-    result = [testHeaderWriter formatNumberWithLeadingZeroes: testValue
-                                                  withPlaces: testPlaces];
+- (void)testFormatNumberWithLeadingZeroes
+{
+    NSString* result = nil;
+    NSNumber* testValue = @8769;  // Exif SubIFD Offset Tag
+    NSNumber* testPlaces = @6;
+
+    result = [testHeaderWriter formatNumberWithLeadingZeroes:testValue
+                                                  withPlaces:testPlaces];
     STAssertNotNil(result, @"nil renturned from formattedHexStringFromDecimalNumber");
     STAssertEquals([result length],
-                   [testPlaces unsignedIntegerValue],
-                   @"returned string to wrong number of places. Should be = %i Was = %i",
-                   [testPlaces intValue],
-                   [result length]);
+        [testPlaces unsignedIntegerValue],
+        @"returned string to wrong number of places. Should be = %i Was = %i",
+        [testPlaces intValue],
+        [result length]);
     // assert correct hex representation
     STAssertTrueNoThrow([result isEqualToString:@"008769"], @"result was = %@ should be = @008769", result);
 }
 
-- (void) testUnsignedRationalToString {
-    NSString * result = nil;
-    NSNumber * numerator = @1;
-    NSNumber * denominator = @10;
-    result = [testHeaderWriter formatRationalWithNumerator: numerator
-                                           withDenominator: denominator
-                                                  asSigned: FALSE];
+- (void)testUnsignedRationalToString
+{
+    NSString* result = nil;
+    NSNumber* numerator = @1;
+    NSNumber* denominator = @10;
+
+    result = [testHeaderWriter formatRationalWithNumerator:numerator
+                                           withDenominator:denominator
+                                                  asSigned:FALSE];
     NSLog(result);
     STAssertNotNil(result, @"nil returned from testUnsignedRationalToString");
-    STAssertTrueNoThrow([result length]==16, @"returned string with wrong length. Exif rationals are 8 bytes, string has %ld bytes",[result length]/2);
+    STAssertTrueNoThrow([result length] == 16, @"returned string with wrong length. Exif rationals are 8 bytes, string has %ld bytes", [result length] / 2);
     STAssertTrueNoThrow([result isEqualToString:@"000000010000000a"], @"result was = %@ should be = @0000000100000010", result);
 }
 
-- (void) testSignedRationalToString {
-    NSString * result = nil;
-    NSNumber * numerator = @-1;
-    NSNumber * denominator = @-10;
-    result = [testHeaderWriter formatRationalWithNumerator: numerator
-                                           withDenominator: denominator
-                                                  asSigned: TRUE];
+- (void)testSignedRationalToString
+{
+    NSString* result = nil;
+    NSNumber* numerator = @ - 1;
+    NSNumber* denominator = @ - 10;
+
+    result = [testHeaderWriter formatRationalWithNumerator:numerator
+                                           withDenominator:denominator
+                                                  asSigned:TRUE];
     NSLog(result);
     STAssertNotNil(result, @"nil returned from testSignedRationalToString");
-    STAssertTrueNoThrow([result length]==16, @"returned string with wrong length. Exif rationals are 8 bytes, string has %ld bytes",[result length]/2);
+    STAssertTrueNoThrow([result length] == 16, @"returned string with wrong length. Exif rationals are 8 bytes, string has %ld bytes", [result length] / 2);
     STAssertTrueNoThrow([result isEqualToString:@"fffffffffffffff6"], @"result was = %@ should be = @000000FF000000F6", result);
 }
 

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-ios/RELEASENOTES.md
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/RELEASENOTES.md b/lib/cordova-ios/RELEASENOTES.md
index 3c2031a..9c50659 100644
--- a/lib/cordova-ios/RELEASENOTES.md
+++ b/lib/cordova-ios/RELEASENOTES.md
@@ -19,8 +19,44 @@
 #
 -->
 ## Release Notes for Cordova (iOS) ##
- 
- Cordova is a static library that enables developers to include the Cordova API in their iOS application projects easily, and also create new Cordova-based iOS application projects through the command-line.
+
+Update these notes using: git log --pretty=format:'* %s' --topo-order --no-merges origin/2.7.x...HEAD
+
+Cordova is a static library that enables developers to include the Cordova API in their iOS application projects easily, and also create new Cordova-based iOS application projects through the command-line.
+
+### 2.8.0 (201305XX) ###
+
+* [CB-2840] Nil checks to avoid crash when network disconnected
+* [CB-3416] adding empty <plugins> element during deprecation window.
+* [CB-3006] Customize InAppBrowser location bar
+* [CB-3405] InAppBrowser option to hide bottom bar with Done/History buttons
+* [CB-3394] Cordova iOS crashes when multiple access elements in config.xml
+* [CB-3166] Add deprecation notice for use of <plugin> in config.xml in iOS
+* [CB-2905] Exif geolocation meta data tag writing
+* [CB-3307] Rename cordova-ios.js -> cordova.js
+* [CB-1108] Convert <plugin> -> <feature> with <param>
+* [CB-3321] Fix bogus "failed whitelist" log messages
+* [CB-3311] add default textbox for notification prompt
+* [CB-2846] SplashScreen crashes app when image not available
+* [CB-2789] Remove CaptureOptions.mode support.
+* [CB-3295] Send InAppBrowser loadstart events when redirects occur
+* [CB-2896] added ImageIO and OpenAL system frameworks to support new exif functionality in CDVCamera
+* [CB-2896] writing data to object through CGImageDestinationRef, enables multipart exif tag writing
+* [CB-2958] simple fix, moved write to photealbum code and sourced from modified data. Photo data returned by cordova will match photo on cameraroll
+* [CB-3339] add version to command line scripts
+* [CB-3377] Remove cordova/release script
+* [CB-2974] Add a ./cordova/lib/list-devices project-level helper script to iOS
+* [CB-2951] Add a ./cordova/lib/list-emulator-images project-level helper script to iOS
+* [CB-2974] Add a ./cordova/lib/list-devices project-level helper script to iOS
+* [CB-2966] Add a ./cordova/lib/list-started-emulators as project-level helper script to iOS
+* [CB-2990] Add a ./cordova/lib/install-device project-level helper script to iOS
+* [CB-2982] Add a ./cordova/lib/install-emulator project-level helper script to iOS
+* [CB-2998] Add a ./cordova/lib/start-emulator project-level helper script to iOS
+* [CB-2916] Add a ./cordova/clean project-level script for iOS
+* [CB-2053] Update UIImagePickerController label to reflect video media type in CDVCamera
+* [CB-3530] PhoneGap app crashes on iOS with error "CDVWebViewDelegate: Navigation started when state=1"
+
+<br />
 
 ### 2.7.0 (201304XX) ###
 

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-ios/bin/templates/project/__TESTING__/config.xml
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/bin/templates/project/__TESTING__/config.xml b/lib/cordova-ios/bin/templates/project/__TESTING__/config.xml
index ca292c8..db64661 100644
--- a/lib/cordova-ios/bin/templates/project/__TESTING__/config.xml
+++ b/lib/cordova-ios/bin/templates/project/__TESTING__/config.xml
@@ -1,4 +1,22 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
 <widget xmlns     = "http://www.w3.org/ns/widgets"
         id        = "io.cordova.helloCordova"
         version   = "2.0.0">

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-ios/bin/uncrustify.cfg
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/bin/uncrustify.cfg b/lib/cordova-ios/bin/uncrustify.cfg
index d52ce33..1e3099b 100644
--- a/lib/cordova-ios/bin/uncrustify.cfg
+++ b/lib/cordova-ios/bin/uncrustify.cfg
@@ -1,4 +1,20 @@
-# Uncrustify 0.59
+# 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.
+
 # Based off of https://gist.github.com/261662/
 
 #

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-ios/guides/Cordova Plugin Upgrade Guide.md
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/guides/Cordova Plugin Upgrade Guide.md b/lib/cordova-ios/guides/Cordova Plugin Upgrade Guide.md
index 7a03bc4..8fc3776 100644
--- a/lib/cordova-ios/guides/Cordova Plugin Upgrade Guide.md	
+++ b/lib/cordova-ios/guides/Cordova Plugin Upgrade Guide.md	
@@ -22,6 +22,71 @@
 
 This document is for developers who need to upgrade their Cordova  plugins to a newer Cordova version. Starting with Cordova 1.5.0, some classes have been renamed, which will require the plugin to be upgraded. Make sure your project itself has been upgraded using the [Cordova iOS Upgrading Guide](http://cordova.apache.org/docs/en/edge/guide_upgrading_ios_index.md.html#Upgrading%20Cordova%20iOS) document.
 
+## Upgrading older Cordova plugins to 2.8.0 ##
+
+1. **Install** Cordova 2.8.0
+2. Follow the **"Upgrading older Cordova plugins to 2.7.0"** section, if necessary
+3. The &lt;plugin&gt; tag in **config.xml** has been deprecated and support will be removed in 3.0.0. To upgrade to the &lt;feature&gt; tag, see this example:
+
+        <plugins>
+            <plugin name="LocalStorage" value="CDVLocalStorage" />
+            <!-- other plugins -->
+        </plugins>
+        
+        <!-- change to: (note that a <feature> tag is on the same level as <plugins> -->
+        <feature name="LocalStorage">
+        <param name="ios-package" value="CDVLocalStorage" />
+        </feature>
+        
+
+## Upgrading older Cordova plugins to 2.7.0 ##
+
+1. **Install** Cordova 2.7.0
+2. Follow the **"Upgrading older Cordova plugins to 2.6.0"** section, if necessary
+3. The old cordova.exec signature has been deprecated since 2.1, and removed in 2.7.0. See upgrade steps below.
+
+When you use a method signature in JavaScript like this:
+
+        cordova.exec('MyService.myMethod', myArg1, myArg2, myArg3);
+
+
+The console log will ask you to upgrade it like this:
+
+        The old format of this exec call has been removed (deprecated since 2.1). 
+        Change to: cordova.exec(null, null, "MyService", "myMethod", [ myArg1, myArg2, myArg3 ]);
+
+
+But, if your corresponding Objective-C method uses the old signature like so:
+
+        - (void) myMethod:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options;
+
+
+Update it to this new signature:
+
+        - (void) myMethod:(CDVInvokedUrlCommand*)command;
+
+Also update any references to "arguments" in the method body with "command.arguments".
+
+So if your method looked like this:
+
+		- (void) myMethod:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
+		{
+			NSString* myArgs1 = [arguments objectAtIndex:0];
+			NSString* myArgs2 = [arguments objectAtIndex:1];
+			NSString* myArgs3 = [arguments objectAtIndex:2];
+		}
+
+Change it to this:
+
+		- (void) myMethod:(CDVInvokedUrlCommand*)command
+		{
+			NSString* myArgs1 = [command.arguments objectAtIndex:0];
+			NSString* myArgs2 = [command.arguments objectAtIndex:1];
+			NSString* myArgs3 = [command.arguments objectAtIndex:2];
+		}
+
+This is the easiest upgrade path. If you want to further use the more powerful callback mechanisms provided, see the [Plugin Development Guide](http://docs.phonegap.com/en/2.7.0/guide_plugin-development_ios_index.md.html#Developing%20a%20Plugin%20on%20iOS) to upgrade your plugin.
+
 ## Upgrading older Cordova plugins to 2.6.0 ##
 
 1. **Install** Cordova 2.6.0


[2/2] git commit: updating cordova-android and cordova-ios libs to 2.8.0rc1

Posted by fi...@apache.org.
updating cordova-android and cordova-ios libs to 2.8.0rc1


Project: http://git-wip-us.apache.org/repos/asf/cordova-cli/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-cli/commit/dfd7980f
Tree: http://git-wip-us.apache.org/repos/asf/cordova-cli/tree/dfd7980f
Diff: http://git-wip-us.apache.org/repos/asf/cordova-cli/diff/dfd7980f

Branch: refs/heads/master2
Commit: dfd7980f1908b4e8c8759b960c06b7959868cb43
Parents: 0c6c190
Author: Fil Maj <ma...@gmail.com>
Authored: Tue Jun 4 11:57:07 2013 -0700
Committer: Fil Maj <ma...@gmail.com>
Committed: Tue Jun 4 11:57:07 2013 -0700

----------------------------------------------------------------------
 lib/cordova-android/README.md                      |   20 ++
 lib/cordova-android/bin/check_reqs.bat             |   19 ++-
 lib/cordova-android/bin/create                     |    1 +
 .../bin/templates/cordova/build.bat                |   18 ++-
 .../bin/templates/cordova/clean.bat                |   16 ++
 .../bin/templates/cordova/cordova.bat              |    4 +-
 .../bin/templates/cordova/lib/install-device.bat   |   18 ++-
 .../bin/templates/cordova/lib/install-emulator.bat |   18 ++-
 .../bin/templates/cordova/lib/list-devices.bat     |   18 ++-
 .../templates/cordova/lib/list-emulator-images.bat |   18 ++-
 .../cordova/lib/list-started-emulators.bat         |   18 ++-
 .../bin/templates/cordova/lib/start-emulator.bat   |   18 ++-
 lib/cordova-android/bin/templates/cordova/log.bat  |   16 ++
 lib/cordova-android/bin/templates/cordova/run.bat  |   18 ++-
 lib/cordova-android/framework/project.properties   |    2 +-
 lib/cordova-android/framework/res/xml/config.xml   |   29 ++-
 .../src/org/apache/cordova/AudioHandler.java       |   13 +-
 .../src/org/apache/cordova/CameraLauncher.java     |   61 ++---
 .../framework/src/org/apache/cordova/Capture.java  |   13 +-
 .../src/org/apache/cordova/FileHelper.java         |   56 +----
 .../src/org/apache/cordova/FileUtils.java          |  121 ++++++----
 .../cordova/IceCreamCordovaWebViewClient.java      |   48 +++--
 .../src/org/apache/cordova/JSONUtils.java          |   18 ++
 .../org/apache/cordova/api/CallbackContext.java    |   18 ++
 .../src/org/apache/cordova/api/CordovaPlugin.java  |   14 -
 .../src/org/apache/cordova/api/PluginManager.java  |   29 ---
 lib/cordova-android/test/README.md                 |   20 ++
 lib/cordova-android/test/res/xml/config.xml        |   18 ++
 .../CordovaLib/Classes/CDVAvailability.h           |    3 +-
 lib/cordova-ios/CordovaLib/Classes/CDVDevice.m     |    1 -
 .../CordovaLib/Classes/CDVWebViewDelegate.m        |   15 +-
 .../CordovaLibTests/CordovaLibApp/config.xml       |   18 ++
 lib/cordova-ios/CordovaLibTests/ExifTests.h        |   45 ++--
 lib/cordova-ios/CordovaLibTests/ExifTests.m        |  195 ++++++++-------
 lib/cordova-ios/RELEASENOTES.md                    |   40 +++-
 .../bin/templates/project/__TESTING__/config.xml   |   18 ++
 lib/cordova-ios/bin/uncrustify.cfg                 |   18 ++-
 .../guides/Cordova Plugin Upgrade Guide.md         |   65 +++++
 38 files changed, 743 insertions(+), 355 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/README.md
----------------------------------------------------------------------
diff --git a/lib/cordova-android/README.md b/lib/cordova-android/README.md
index a785943..aca3242 100755
--- a/lib/cordova-android/README.md
+++ b/lib/cordova-android/README.md
@@ -1,3 +1,23 @@
+<!--
+#
+# 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.
+#
+-->
 Cordova Android
 ===
 

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/bin/check_reqs.bat
----------------------------------------------------------------------
diff --git a/lib/cordova-android/bin/check_reqs.bat b/lib/cordova-android/bin/check_reqs.bat
index 65514c8..12da1e7 100644
--- a/lib/cordova-android/bin/check_reqs.bat
+++ b/lib/cordova-android/bin/check_reqs.bat
@@ -1,3 +1,20 @@
+:: 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.
+
 @ECHO OFF
 SET full_path=%~dp0
 IF EXIST %full_path%check_reqs.js (
@@ -6,4 +23,4 @@ IF EXIST %full_path%check_reqs.js (
     ECHO.
     ECHO ERROR: Could not find 'check_reqs.js' in 'bin' folder, aborting...>&2
     EXIT /B 1
-)
\ No newline at end of file
+)

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/bin/create
----------------------------------------------------------------------
diff --git a/lib/cordova-android/bin/create b/lib/cordova-android/bin/create
index 39aff6b..b38ed51 100755
--- a/lib/cordova-android/bin/create
+++ b/lib/cordova-android/bin/create
@@ -153,6 +153,7 @@ cp "$BUILD_PATH"/bin/templates/cordova/build "$PROJECT_PATH"/cordova/build
 cp "$BUILD_PATH"/bin/templates/cordova/clean "$PROJECT_PATH"/cordova/clean
 cp "$BUILD_PATH"/bin/templates/cordova/log "$PROJECT_PATH"/cordova/log
 cp "$BUILD_PATH"/bin/templates/cordova/run "$PROJECT_PATH"/cordova/run
+cp "$BUILD_PATH"/bin/templates/cordova/version "$PROJECT_PATH"/cordova/version
 cp "$BUILD_PATH"/bin/templates/cordova/lib/cordova "$PROJECT_PATH"/cordova/lib/cordova
 cp "$BUILD_PATH"/bin/templates/cordova/lib/install-device "$PROJECT_PATH"/cordova/lib/install-device
 cp "$BUILD_PATH"/bin/templates/cordova/lib/install-emulator "$PROJECT_PATH"/cordova/lib/install-emulator

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/bin/templates/cordova/build.bat
----------------------------------------------------------------------
diff --git a/lib/cordova-android/bin/templates/cordova/build.bat b/lib/cordova-android/bin/templates/cordova/build.bat
index 7aa7c75..392f374 100644
--- a/lib/cordova-android/bin/templates/cordova/build.bat
+++ b/lib/cordova-android/bin/templates/cordova/build.bat
@@ -1,2 +1,18 @@
+:: 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.
 @ECHO OFF
-%~dp0\cordova.bat build %*
\ No newline at end of file
+%~dp0\cordova.bat build %*

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/bin/templates/cordova/clean.bat
----------------------------------------------------------------------
diff --git a/lib/cordova-android/bin/templates/cordova/clean.bat b/lib/cordova-android/bin/templates/cordova/clean.bat
index b41bdc9..643c8d5 100644
--- a/lib/cordova-android/bin/templates/cordova/clean.bat
+++ b/lib/cordova-android/bin/templates/cordova/clean.bat
@@ -1,2 +1,18 @@
+:: 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.
 @ECHO OFF
 %~dp0\cordova.bat clean %*

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/bin/templates/cordova/cordova.bat
----------------------------------------------------------------------
diff --git a/lib/cordova-android/bin/templates/cordova/cordova.bat b/lib/cordova-android/bin/templates/cordova/cordova.bat
index 9b56199..6235fdb 100644
--- a/lib/cordova-android/bin/templates/cordova/cordova.bat
+++ b/lib/cordova-android/bin/templates/cordova/cordova.bat
@@ -1,5 +1,3 @@
-@ECHO OFF
-GOTO BEGIN
 :: 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
@@ -16,7 +14,7 @@ GOTO BEGIN
 :: KIND, either express or implied.  See the License for the
 :: specific language governing permissions and limitations
 :: under the License.
-:BEGIN
+@ECHO OFF
 IF NOT DEFINED JAVA_HOME GOTO MISSING
 FOR %%X in (java.exe ant.bat android.bat) do (
     SET FOUND=%%~$PATH:X

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/bin/templates/cordova/lib/install-device.bat
----------------------------------------------------------------------
diff --git a/lib/cordova-android/bin/templates/cordova/lib/install-device.bat b/lib/cordova-android/bin/templates/cordova/lib/install-device.bat
index 52d9775..b00e757 100644
--- a/lib/cordova-android/bin/templates/cordova/lib/install-device.bat
+++ b/lib/cordova-android/bin/templates/cordova/lib/install-device.bat
@@ -1,3 +1,19 @@
+:: 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.
 @ECHO OFF
 SET full_path=%~dp0
 IF EXIST %full_path%cordova.js (
@@ -6,4 +22,4 @@ IF EXIST %full_path%cordova.js (
     ECHO. 
     ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2
     EXIT /B 1
-)
\ No newline at end of file
+)

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/bin/templates/cordova/lib/install-emulator.bat
----------------------------------------------------------------------
diff --git a/lib/cordova-android/bin/templates/cordova/lib/install-emulator.bat b/lib/cordova-android/bin/templates/cordova/lib/install-emulator.bat
index d11a7be..2b88630 100644
--- a/lib/cordova-android/bin/templates/cordova/lib/install-emulator.bat
+++ b/lib/cordova-android/bin/templates/cordova/lib/install-emulator.bat
@@ -1,3 +1,19 @@
+:: 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.
 @ECHO OFF
 SET full_path=%~dp0
 IF EXIST %full_path%cordova.js (
@@ -6,4 +22,4 @@ IF EXIST %full_path%cordova.js (
     ECHO. 
     ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2
     EXIT /B 1
-)
\ No newline at end of file
+)

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/bin/templates/cordova/lib/list-devices.bat
----------------------------------------------------------------------
diff --git a/lib/cordova-android/bin/templates/cordova/lib/list-devices.bat b/lib/cordova-android/bin/templates/cordova/lib/list-devices.bat
index c146f10..3840d12 100644
--- a/lib/cordova-android/bin/templates/cordova/lib/list-devices.bat
+++ b/lib/cordova-android/bin/templates/cordova/lib/list-devices.bat
@@ -1,3 +1,19 @@
+:: 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.
 @ECHO OFF
 SET full_path=%~dp0
 IF EXIST %full_path%cordova.js (
@@ -6,4 +22,4 @@ IF EXIST %full_path%cordova.js (
     ECHO. 
     ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2
     EXIT /B 1
-)
\ No newline at end of file
+)

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/bin/templates/cordova/lib/list-emulator-images.bat
----------------------------------------------------------------------
diff --git a/lib/cordova-android/bin/templates/cordova/lib/list-emulator-images.bat b/lib/cordova-android/bin/templates/cordova/lib/list-emulator-images.bat
index 172520b..e21aafe 100644
--- a/lib/cordova-android/bin/templates/cordova/lib/list-emulator-images.bat
+++ b/lib/cordova-android/bin/templates/cordova/lib/list-emulator-images.bat
@@ -1,3 +1,19 @@
+:: 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.
 @ECHO OFF
 SET full_path=%~dp0
 IF EXIST %full_path%cordova.js (
@@ -6,4 +22,4 @@ IF EXIST %full_path%cordova.js (
     ECHO. 
     ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2
     EXIT /B 1
-)
\ No newline at end of file
+)

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/bin/templates/cordova/lib/list-started-emulators.bat
----------------------------------------------------------------------
diff --git a/lib/cordova-android/bin/templates/cordova/lib/list-started-emulators.bat b/lib/cordova-android/bin/templates/cordova/lib/list-started-emulators.bat
index f1b3c5d..eb9f3b6 100644
--- a/lib/cordova-android/bin/templates/cordova/lib/list-started-emulators.bat
+++ b/lib/cordova-android/bin/templates/cordova/lib/list-started-emulators.bat
@@ -1,3 +1,19 @@
+:: 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.
 @ECHO OFF
 SET full_path=%~dp0
 IF EXIST %full_path%cordova.js (
@@ -6,4 +22,4 @@ IF EXIST %full_path%cordova.js (
     ECHO. 
     ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2
     EXIT /B 1
-)
\ No newline at end of file
+)

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/bin/templates/cordova/lib/start-emulator.bat
----------------------------------------------------------------------
diff --git a/lib/cordova-android/bin/templates/cordova/lib/start-emulator.bat b/lib/cordova-android/bin/templates/cordova/lib/start-emulator.bat
index 4f3fb5d..758c854 100644
--- a/lib/cordova-android/bin/templates/cordova/lib/start-emulator.bat
+++ b/lib/cordova-android/bin/templates/cordova/lib/start-emulator.bat
@@ -1,3 +1,19 @@
+:: 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.
 @ECHO OFF
 SET full_path=%~dp0
 IF EXIST %full_path%cordova.js (
@@ -6,4 +22,4 @@ IF EXIST %full_path%cordova.js (
     ECHO. 
     ECHO ERROR: Could not find 'cordova.js' in cordova/lib, aborting...>&2
     EXIT /B 1
-)
\ No newline at end of file
+)

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/bin/templates/cordova/log.bat
----------------------------------------------------------------------
diff --git a/lib/cordova-android/bin/templates/cordova/log.bat b/lib/cordova-android/bin/templates/cordova/log.bat
index 2c492e7..c259802 100644
--- a/lib/cordova-android/bin/templates/cordova/log.bat
+++ b/lib/cordova-android/bin/templates/cordova/log.bat
@@ -1,2 +1,18 @@
+:: 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.
 @ECHO OFF
 %~dp0\cordova.bat log %*

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/bin/templates/cordova/run.bat
----------------------------------------------------------------------
diff --git a/lib/cordova-android/bin/templates/cordova/run.bat b/lib/cordova-android/bin/templates/cordova/run.bat
index b1cab64..f191f67 100644
--- a/lib/cordova-android/bin/templates/cordova/run.bat
+++ b/lib/cordova-android/bin/templates/cordova/run.bat
@@ -1,2 +1,18 @@
+:: 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.
 @ECHO OFF
-%~dp0\cordova.bat run %*
\ No newline at end of file
+%~dp0\cordova.bat run %*

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/framework/project.properties
----------------------------------------------------------------------
diff --git a/lib/cordova-android/framework/project.properties b/lib/cordova-android/framework/project.properties
index 2f39d91..d556741 100644
--- a/lib/cordova-android/framework/project.properties
+++ b/lib/cordova-android/framework/project.properties
@@ -10,7 +10,7 @@
 # Indicates whether an apk should be generated for each density.
 split.density=false
 # Project target.
-target=android-17
+target=Google Inc.:Google APIs:17
 apk-configurations=
 renderscript.opt.level=O0
 android.library=true

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/framework/res/xml/config.xml
----------------------------------------------------------------------
diff --git a/lib/cordova-android/framework/res/xml/config.xml b/lib/cordova-android/framework/res/xml/config.xml
index 935eda4..5b5a270 100644
--- a/lib/cordova-android/framework/res/xml/config.xml
+++ b/lib/cordova-android/framework/res/xml/config.xml
@@ -1,18 +1,21 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-   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
-   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.
+ 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.
 -->
 <widget xmlns     = "http://www.w3.org/ns/widgets"
         id        = "io.cordova.helloCordova"

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/framework/src/org/apache/cordova/AudioHandler.java
----------------------------------------------------------------------
diff --git a/lib/cordova-android/framework/src/org/apache/cordova/AudioHandler.java b/lib/cordova-android/framework/src/org/apache/cordova/AudioHandler.java
index 20c3c4e..fd8c9df 100644
--- a/lib/cordova-android/framework/src/org/apache/cordova/AudioHandler.java
+++ b/lib/cordova-android/framework/src/org/apache/cordova/AudioHandler.java
@@ -20,7 +20,7 @@ package org.apache.cordova;
 
 import org.apache.cordova.api.CallbackContext;
 import org.apache.cordova.api.CordovaPlugin;
-import org.apache.cordova.api.DataResource;
+
 import android.content.Context;
 import android.media.AudioManager;
 
@@ -56,11 +56,6 @@ public class AudioHandler extends CordovaPlugin {
         this.pausedForPhone = new ArrayList<AudioPlayer>();
     }
 
-    public String getFilePath(String url, String source){
-        DataResource dataResource = DataResource.initiateNewDataRequestForUri(url, this.webView.pluginManager, cordova, source);
-        return dataResource.getRealFile().getPath();
-    }
-
     /**
      * Executes the request and returns PluginResult.
      * @param action 		The action to execute.
@@ -73,13 +68,13 @@ public class AudioHandler extends CordovaPlugin {
         String result = "";
 
         if (action.equals("startRecordingAudio")) {
-            this.startRecordingAudio(args.getString(0), getFilePath(args.getString(1), "AudioHandler.startRecordingAudio"));
+            this.startRecordingAudio(args.getString(0), FileHelper.stripFileProtocol(args.getString(1)));
         }
         else if (action.equals("stopRecordingAudio")) {
             this.stopRecordingAudio(args.getString(0));
         }
         else if (action.equals("startPlayingAudio")) {
-            this.startPlayingAudio(args.getString(0), getFilePath(args.getString(1), "AudioHandler.startPlayingAudio"));
+            this.startPlayingAudio(args.getString(0), FileHelper.stripFileProtocol(args.getString(1)));
         }
         else if (action.equals("seekToAudio")) {
             this.seekToAudio(args.getString(0), args.getInt(1));
@@ -107,7 +102,7 @@ public class AudioHandler extends CordovaPlugin {
         }
         else if (action.equals("create")) {
             String id = args.getString(0);
-            String src = getFilePath(args.getString(1), "AudioHandler.create");
+            String src = FileHelper.stripFileProtocol(args.getString(1));
             AudioPlayer audio = new AudioPlayer(this, id, src);
             this.players.put(id, audio);
         }

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/framework/src/org/apache/cordova/CameraLauncher.java
----------------------------------------------------------------------
diff --git a/lib/cordova-android/framework/src/org/apache/cordova/CameraLauncher.java b/lib/cordova-android/framework/src/org/apache/cordova/CameraLauncher.java
index 1974dd7..426d250 100755
--- a/lib/cordova-android/framework/src/org/apache/cordova/CameraLauncher.java
+++ b/lib/cordova-android/framework/src/org/apache/cordova/CameraLauncher.java
@@ -20,16 +20,15 @@ package org.apache.cordova;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.OutputStream;
 
 import org.apache.commons.codec.binary.Base64;
 import org.apache.cordova.api.CallbackContext;
 import org.apache.cordova.api.CordovaPlugin;
-import org.apache.cordova.api.DataResource;
 import org.apache.cordova.api.LOG;
 import org.apache.cordova.api.PluginResult;
 import org.json.JSONArray;
@@ -43,6 +42,7 @@ import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.Matrix;
 import android.graphics.Bitmap.CompressFormat;
+import android.graphics.Rect;
 import android.media.MediaScannerConnection;
 import android.media.MediaScannerConnection.MediaScannerConnectionClient;
 import android.net.Uri;
@@ -290,7 +290,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
 
                     // If sending base64 image back
                     if (destType == DATA_URL) {
-                        bitmap = getScaledBitmap(imageUri.toString());
+                        bitmap = getScaledBitmap(FileHelper.stripFileProtocol(imageUri.toString()));
                         if (bitmap == null) {
                             // Try to get the bitmap from intent.
                             bitmap = (Bitmap)intent.getExtras().get("data");
@@ -316,9 +316,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
                         if (this.saveToPhotoAlbum) {
                             Uri inputUri = getUriFromMediaStore();
                             //Just because we have a media URI doesn't mean we have a real file, we need to make it
-                            DataResource dataResource = DataResource.initiateNewDataRequestForUri(inputUri, webView.pluginManager, cordova, "CameraLauncher.CameraExitIntent");
-                            File file = dataResource.getRealFile();
-                            uri = Uri.fromFile(file);
+                            uri = Uri.fromFile(new File(FileHelper.getRealPath(inputUri, this.cordova)));
                         } else {
                             uri = Uri.fromFile(new File(DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()), System.currentTimeMillis() + ".jpg"));
                         }
@@ -334,15 +332,14 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
 
                             this.callbackContext.success(uri.toString());
                         } else {
-                            bitmap = getScaledBitmap(imageUri.toString());
+                            bitmap = getScaledBitmap(FileHelper.stripFileProtocol(imageUri.toString()));
 
                             if (rotate != 0 && this.correctOrientation) {
                                 bitmap = getRotatedBitmap(rotate, bitmap, exif);
                             }
 
                             // Add compressed version of captured image to returned media store Uri
-                            DataResource dataResource = DataResource.initiateNewDataRequestForUri(uri, webView.pluginManager, cordova, "CameraLauncher.CameraExitIntent");
-                            OutputStream os = dataResource.getOutputStream();
+                            OutputStream os = this.cordova.getActivity().getContentResolver().openOutputStream(uri);
                             bitmap.compress(Bitmap.CompressFormat.JPEG, this.mQuality, os);
                             os.close();
 
@@ -350,7 +347,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
                             if (this.encodingType == JPEG) {
                                 String exifPath;
                                 if (this.saveToPhotoAlbum) {
-                                    exifPath = dataResource.getRealFile().getPath();
+                                    exifPath = FileHelper.getRealPath(uri, this.cordova);
                                 } else {
                                     exifPath = uri.getPath();
                                 }
@@ -401,9 +398,8 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
                         this.callbackContext.success(uri.toString());
                     } else {
                         String uriString = uri.toString();
-                        DataResource dataResource = DataResource.initiateNewDataRequestForUri(uri, webView.pluginManager, cordova, "CameraLauncher.CameraExitIntent");
                         // Get the path to the image. Makes loading so much easier.
-                        String mimeType = dataResource.getMimeType();
+                        String mimeType = FileHelper.getMimeType(uriString, this.cordova);
                         // If we don't have a valid image so quit.
                         if (!("image/jpeg".equalsIgnoreCase(mimeType) || "image/png".equalsIgnoreCase(mimeType))) {
                         	Log.d(LOG_TAG, "I either have a null image path or bitmap");
@@ -444,8 +440,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
                                     // Create an ExifHelper to save the exif data that is lost during compression
                                     String resizePath = DirectoryManager.getTempDirectoryPath(this.cordova.getActivity()) + "/resize.jpg";
                                     // Some content: URIs do not map to file paths (e.g. picasa).
-                                    File realFile = DataResource.initiateNewDataRequestForUri(uri, webView.pluginManager, cordova, "CameraLauncher.CameraExitIntent").getRealFile();
-                                    String realPath = realFile != null? realFile.getPath() : null;
+                                    String realPath = FileHelper.getRealPath(uri, this.cordova);
                                     ExifHelper exif = new ExifHelper();
                                     if (realPath != null && this.encodingType == JPEG) {
                                         try {
@@ -539,15 +534,8 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
      */
     private void writeUncompressedImage(Uri uri) throws FileNotFoundException,
             IOException {
-        DataResource inputDataResource = DataResource.initiateNewDataRequestForUri(imageUri, webView.pluginManager, cordova, "CameraLauncher.writeUncompressedImage");
-        InputStream fis = inputDataResource.getInputStream();
-        DataResource outDataResource = DataResource.initiateNewDataRequestForUri(uri, webView.pluginManager, cordova, "CameraLauncher.writeUncompressedImage");
-        OutputStream os = outDataResource.getOutputStream();
-        if(fis == null) {
-            throw new FileNotFoundException("Could not get the input file");
-        } else if(os == null) {
-            throw new FileNotFoundException("Could not get the output file");
-        }
+        FileInputStream fis = new FileInputStream(FileHelper.stripFileProtocol(imageUri.toString()));
+        OutputStream os = this.cordova.getActivity().getContentResolver().openOutputStream(uri);
         byte[] buffer = new byte[4096];
         int len;
         while ((len = fis.read(buffer)) != -1) {
@@ -590,15 +578,14 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
      */
     private Bitmap getScaledBitmap(String imageUrl) throws IOException {
         // If no new width or height were specified return the original bitmap
-        DataResource dataResource = DataResource.initiateNewDataRequestForUri(imageUrl, webView.pluginManager, cordova, "CameraLauncher.getScaledBitmap");
         if (this.targetWidth <= 0 && this.targetHeight <= 0) {
-            return BitmapFactory.decodeStream(dataResource.getInputStream());
+            return BitmapFactory.decodeStream(FileHelper.getInputStreamFromUriString(imageUrl, cordova));
         }
 
         // figure out the original width and height of the image
         BitmapFactory.Options options = new BitmapFactory.Options();
         options.inJustDecodeBounds = true;
-        BitmapFactory.decodeStream(dataResource.getInputStream(), null, options);
+        BitmapFactory.decodeStream(FileHelper.getInputStreamFromUriString(imageUrl, cordova), null, options);
         
         //CB-2292: WTF? Why is the width null?
         if(options.outWidth == 0 || options.outHeight == 0)
@@ -612,7 +599,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
         // Load in the smallest bitmap possible that is closest to the size we want
         options.inJustDecodeBounds = false;
         options.inSampleSize = calculateSampleSize(options.outWidth, options.outHeight, this.targetWidth, this.targetHeight);
-        Bitmap unscaledBitmap = BitmapFactory.decodeStream(dataResource.getInputStream(), null, options);
+        Bitmap unscaledBitmap = BitmapFactory.decodeStream(FileHelper.getInputStreamFromUriString(imageUrl, cordova), null, options);
         if (unscaledBitmap == null) {
             return null;
         }
@@ -711,20 +698,16 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
             bitmap.recycle();
         }
 
-        DataResource dataResource = DataResource.initiateNewDataRequestForUri(oldImage, webView.pluginManager, cordova, "CameraLauncher.cleanup");
-        File file = dataResource.getRealFile();
-        if(file != null) {
-            // Clean up initial camera-written image file.
-            file.delete();
-
-            checkForDuplicateImage(imageType);
-            // Scan for the gallery to update pic refs in gallery
-            if (this.saveToPhotoAlbum && newImage != null) {
-                this.scanForGallery(newImage);
-            }
+        // Clean up initial camera-written image file.
+        (new File(FileHelper.stripFileProtocol(oldImage.toString()))).delete();
 
-            System.gc();
+        checkForDuplicateImage(imageType);
+        // Scan for the gallery to update pic refs in gallery
+        if (this.saveToPhotoAlbum && newImage != null) {
+            this.scanForGallery(newImage);
         }
+
+        System.gc();
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/framework/src/org/apache/cordova/Capture.java
----------------------------------------------------------------------
diff --git a/lib/cordova-android/framework/src/org/apache/cordova/Capture.java b/lib/cordova-android/framework/src/org/apache/cordova/Capture.java
index d7ad419..5f737ca 100644
--- a/lib/cordova-android/framework/src/org/apache/cordova/Capture.java
+++ b/lib/cordova-android/framework/src/org/apache/cordova/Capture.java
@@ -26,7 +26,6 @@ import java.io.OutputStream;
 import android.os.Build;
 import org.apache.cordova.api.CallbackContext;
 import org.apache.cordova.api.CordovaPlugin;
-import org.apache.cordova.api.DataResource;
 import org.apache.cordova.api.LOG;
 import org.apache.cordova.api.PluginResult;
 import org.json.JSONArray;
@@ -130,8 +129,7 @@ public class Capture extends CordovaPlugin {
         // If the mimeType isn't set the rest will fail
         // so let's see if we can determine it.
         if (mimeType == null || mimeType.equals("") || "null".equals(mimeType)) {
-            DataResource dataResource = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "Capture.dataResource");
-            mimeType = dataResource.getMimeType();
+            mimeType = FileHelper.getMimeType(filePath, cordova);
         }
         Log.d(LOG_TAG, "Mime type = " + mimeType);
 
@@ -158,8 +156,7 @@ public class Capture extends CordovaPlugin {
     private JSONObject getImageData(String filePath, JSONObject obj) throws JSONException {
         BitmapFactory.Options options = new BitmapFactory.Options();
         options.inJustDecodeBounds = true;
-        DataResource dataResource = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "Capture.getImageData");
-        BitmapFactory.decodeFile(dataResource.getRealFile().getPath(), options);
+        BitmapFactory.decodeFile(FileHelper.stripFileProtocol(filePath), options);
         obj.put("height", options.outHeight);
         obj.put("width", options.outWidth);
         return obj;
@@ -351,8 +348,7 @@ public class Capture extends CordovaPlugin {
      * @throws IOException
      */
     private JSONObject createMediaFile(Uri data) {
-        DataResource dataResource = DataResource.initiateNewDataRequestForUri(data, webView.pluginManager, cordova, "Capture.createMediaFile");
-        File fp = dataResource.getRealFile();
+        File fp = new File(FileHelper.getRealPath(data, this.cordova));
         JSONObject obj = new JSONObject();
 
         try {
@@ -362,7 +358,6 @@ public class Capture extends CordovaPlugin {
             // Because of an issue with MimeTypeMap.getMimeTypeFromExtension() all .3gpp files
             // are reported as video/3gpp. I'm doing this hacky check of the URI to see if it
             // is stored in the audio or video content store.
-
             if (fp.getAbsoluteFile().toString().endsWith(".3gp") || fp.getAbsoluteFile().toString().endsWith(".3gpp")) {
                 if (data.toString().contains("/audio/")) {
                     obj.put("type", AUDIO_3GPP);
@@ -370,7 +365,7 @@ public class Capture extends CordovaPlugin {
                     obj.put("type", VIDEO_3GPP);
                 }
             } else {
-                obj.put("type", dataResource.getMimeType());
+                obj.put("type", FileHelper.getMimeType(fp.getAbsolutePath(), cordova));
             }
 
             obj.put("lastModifiedDate", fp.lastModified());

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/framework/src/org/apache/cordova/FileHelper.java
----------------------------------------------------------------------
diff --git a/lib/cordova-android/framework/src/org/apache/cordova/FileHelper.java b/lib/cordova-android/framework/src/org/apache/cordova/FileHelper.java
index 8bc24aa..8b446b0 100644
--- a/lib/cordova-android/framework/src/org/apache/cordova/FileHelper.java
+++ b/lib/cordova-android/framework/src/org/apache/cordova/FileHelper.java
@@ -26,11 +26,10 @@ import org.apache.cordova.api.CordovaInterface;
 import org.apache.cordova.api.LOG;
 
 import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.OutputStream;
+import java.net.URLConnection;
+import java.util.Locale;
 
 public class FileHelper {
     private static final String LOG_TAG = "FileUtils";
@@ -91,63 +90,16 @@ public class FileHelper {
      * @throws IOException
      */
     public static InputStream getInputStreamFromUriString(String uriString, CordovaInterface cordova) throws IOException {
-        if (uriString.startsWith("content:")) {
+        if (uriString.startsWith("content")) {
             Uri uri = Uri.parse(uriString);
             return cordova.getActivity().getContentResolver().openInputStream(uri);
         } else if (uriString.startsWith("file:///android_asset/")) {
             Uri uri = Uri.parse(uriString);
             String relativePath = uri.getPath().substring(15);
             return cordova.getActivity().getAssets().open(relativePath);
-        } else if (uriString.startsWith("file://")) {
-            return new FileInputStream(getRealPath(uriString, cordova));
         } else {
-            return null;
-        }
-    }
-
-    public static OutputStream getOutputStreamFromUriString(String uriString, CordovaInterface cordova) throws FileNotFoundException{
-        if (uriString.startsWith("content:")) {
-            Uri uri = Uri.parse(uriString);
-            return cordova.getActivity().getContentResolver().openOutputStream(uri);
-        } else if (uriString.startsWith("file:") && !uriString.startsWith("file:///android_asset/")) {
-            String realPath = uriString.substring(7);
-            return new FileOutputStream(realPath);
-        } else {
-            return null;
-        }
-    }
-    /**
-     * Returns whether the uri can be written to by openeing a File to that uri
-     *
-     * @param the URI to test
-     * @return boolean indicating whether the uri is writable
-     */
-    public static boolean isUriWritable(String uriString) {
-        String scheme = uriString.split(":")[0];
-
-        if(scheme.equals("file")){
-            // special case file
-            return !uriString.startsWith("file:///android_asset/");
-        }
-        return "content".equals(scheme);
-    }
-
-    /**
-     * Ensures the "file://" prefix exists for the given string
-     * If the given URI string already has a scheme, it is returned unchanged
-     *
-     * @param path - the path string to operate on
-     * @return a String with the "file://" scheme set
-     */
-    public static String insertFileProtocol(String path) {
-        if(!path.matches("^[a-z0-9+.-]+:.*")){
-            //Ensure it is not a relative path
-            if(!path.startsWith("/")){
-                throw new IllegalArgumentException("Relative paths" + path + "are not allowed.");
-            }
-            path = "file://" + path;
+            return new FileInputStream(getRealPath(uriString, cordova));
         }
-        return path;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/framework/src/org/apache/cordova/FileUtils.java
----------------------------------------------------------------------
diff --git a/lib/cordova-android/framework/src/org/apache/cordova/FileUtils.java b/lib/cordova-android/framework/src/org/apache/cordova/FileUtils.java
index e62fc4a..2135be9 100755
--- a/lib/cordova-android/framework/src/org/apache/cordova/FileUtils.java
+++ b/lib/cordova-android/framework/src/org/apache/cordova/FileUtils.java
@@ -18,6 +18,8 @@
  */
 package org.apache.cordova;
 
+import android.database.Cursor;
+import android.net.Uri;
 import android.os.Environment;
 import android.provider.MediaStore;
 import android.util.Log;
@@ -25,7 +27,6 @@ import android.util.Log;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.cordova.api.CallbackContext;
 import org.apache.cordova.api.CordovaPlugin;
-import org.apache.cordova.api.DataResource;
 import org.apache.cordova.api.PluginResult;
 import org.apache.cordova.file.EncodingException;
 import org.apache.cordova.file.FileExistsException;
@@ -45,6 +46,8 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.RandomAccessFile;
 import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLDecoder;
 import java.nio.channels.FileChannel;
 
 /**
@@ -231,7 +234,7 @@ public class FileUtils extends CordovaPlugin {
      * @param filePath the path to check
      */
     private void notifyDelete(String filePath) {
-        String newFilePath = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.notifyDelete").getRealFile().getPath();
+        String newFilePath = FileHelper.getRealPath(filePath, cordova);
         try {
             this.cordova.getActivity().getContentResolver().delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                     MediaStore.Images.Media.DATA + " = ?",
@@ -253,10 +256,37 @@ public class FileUtils extends CordovaPlugin {
      * @throws IOException if the user can't read the file
      * @throws JSONException
      */
+    @SuppressWarnings("deprecation")
     private JSONObject resolveLocalFileSystemURI(String url) throws IOException, JSONException {
-        File fp = DataResource.initiateNewDataRequestForUri(url, webView.pluginManager, cordova, "FileUtils.resolveLocalFileSystemURI").getRealFile();
+        String decoded = URLDecoder.decode(url, "UTF-8");
 
-        if (fp == null || !fp.exists()) {
+        File fp = null;
+
+        // Handle the special case where you get an Android content:// uri.
+        if (decoded.startsWith("content:")) {
+            Cursor cursor = this.cordova.getActivity().managedQuery(Uri.parse(decoded), new String[] { MediaStore.Images.Media.DATA }, null, null, null);
+            // Note: MediaStore.Images/Audio/Video.Media.DATA is always "_data"
+            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
+            cursor.moveToFirst();
+            fp = new File(cursor.getString(column_index));
+        } else {
+            // Test to see if this is a valid URL first
+            @SuppressWarnings("unused")
+            URL testUrl = new URL(decoded);
+
+            if (decoded.startsWith("file://")) {
+                int questionMark = decoded.indexOf("?");
+                if (questionMark < 0) {
+                    fp = new File(decoded.substring(7, decoded.length()));
+                } else {
+                    fp = new File(decoded.substring(7, questionMark));
+                }
+            } else {
+                fp = new File(decoded);
+            }
+        }
+
+        if (!fp.exists()) {
             throw new FileNotFoundException();
         }
         if (!fp.canRead()) {
@@ -274,9 +304,9 @@ public class FileUtils extends CordovaPlugin {
      * @throws JSONException
      */
     private JSONArray readEntries(String fileName) throws FileNotFoundException, JSONException {
-        File fp = DataResource.initiateNewDataRequestForUri(fileName, webView.pluginManager, cordova, "FileUtils.readEntries").getRealFile();
+        File fp = createFileObject(fileName);
 
-        if (fp == null || !fp.exists()) {
+        if (!fp.exists()) {
             // The directory we are listing doesn't exist so we should fail.
             throw new FileNotFoundException();
         }
@@ -311,10 +341,8 @@ public class FileUtils extends CordovaPlugin {
      * @throws FileExistsException
      */
     private JSONObject transferTo(String fileName, String newParent, String newName, boolean move) throws JSONException, NoModificationAllowedException, IOException, InvalidModificationException, EncodingException, FileExistsException {
-        DataResource dataResourceFrom = DataResource.initiateNewDataRequestForUri(fileName, webView.pluginManager, cordova, "FileUtils.transferTo");
-        String newFileName = dataResourceFrom.getRealFile().getPath();
-        DataResource dataResourceTo = DataResource.initiateNewDataRequestForUri(newParent, webView.pluginManager, cordova, "FileUtils.transferTo");
-        newParent = dataResourceTo.getRealFile().getPath();
+        String newFileName = FileHelper.getRealPath(fileName, cordova);
+        newParent = FileHelper.getRealPath(newParent, cordova);
 
         // Check for invalid file name
         if (newName != null && newName.contains(":")) {
@@ -585,7 +613,7 @@ public class FileUtils extends CordovaPlugin {
      * @throws FileExistsException
      */
     private boolean removeRecursively(String filePath) throws FileExistsException {
-        File fp = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.readEntries").getRealFile();
+        File fp = createFileObject(filePath);
 
         // You can't delete the root directory.
         if (atRootDirectory(filePath)) {
@@ -626,7 +654,7 @@ public class FileUtils extends CordovaPlugin {
      * @throws InvalidModificationException
      */
     private boolean remove(String filePath) throws NoModificationAllowedException, InvalidModificationException {
-        File fp = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.readEntries").getRealFile();
+        File fp = createFileObject(filePath);
 
         // You can't delete the root directory.
         if (atRootDirectory(filePath)) {
@@ -670,8 +698,7 @@ public class FileUtils extends CordovaPlugin {
             throw new EncodingException("This file has a : in it's name");
         }
 
-        String filePath = getFullFilePath(dirPath, fileName);
-        File fp = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.getFile").getRealFile();
+        File fp = createFileObject(dirPath, fileName);
 
         if (create) {
             if (exclusive && fp.exists()) {
@@ -713,14 +740,15 @@ public class FileUtils extends CordovaPlugin {
      * @param fileName new file name
      * @return
      */
-    private String getFullFilePath(String dirPath, String fileName) {
+    private File createFileObject(String dirPath, String fileName) {
+        File fp = null;
         if (fileName.startsWith("/")) {
-            return fileName;
+            fp = new File(fileName);
         } else {
-            DataResource dataResource = DataResource.initiateNewDataRequestForUri(dirPath, webView.pluginManager, cordova, "FileUtils.getFullFilePath");
-            dirPath = dataResource.getRealFile().getPath();
-            return dirPath + File.separator + fileName;
+            dirPath = FileHelper.getRealPath(dirPath, cordova);
+            fp = new File(dirPath + File.separator + fileName);
         }
+        return fp;
     }
 
     /**
@@ -732,13 +760,12 @@ public class FileUtils extends CordovaPlugin {
      * @throws JSONException
      */
     private JSONObject getParent(String filePath) throws JSONException {
-        DataResource dataResource = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.getParent");
-        filePath = dataResource.getRealFile().getPath();
+        filePath = FileHelper.getRealPath(filePath, cordova);
 
         if (atRootDirectory(filePath)) {
             return getEntry(filePath);
         }
-        return getEntry(dataResource.getRealFile().getParent());
+        return getEntry(new File(filePath).getParent());
     }
 
     /**
@@ -749,7 +776,7 @@ public class FileUtils extends CordovaPlugin {
      * @return true if we are at the root, false otherwise.
      */
     private boolean atRootDirectory(String filePath) {
-        filePath = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.atRootDirectory").getRealFile().getPath();
+        filePath = FileHelper.getRealPath(filePath, cordova);
 
         if (filePath.equals(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + cordova.getActivity().getPackageName() + "/cache") ||
                 filePath.equals(Environment.getExternalStorageDirectory().getAbsolutePath()) ||
@@ -760,6 +787,19 @@ public class FileUtils extends CordovaPlugin {
     }
 
     /**
+     * Create a File object from the passed in path
+     *
+     * @param filePath
+     * @return
+     */
+    private File createFileObject(String filePath) {
+        filePath = FileHelper.getRealPath(filePath, cordova);
+
+        File file = new File(filePath);
+        return file;
+    }
+
+    /**
      * Look up metadata about this entry.
      *
      * @param filePath to entry
@@ -767,9 +807,9 @@ public class FileUtils extends CordovaPlugin {
      * @throws FileNotFoundException
      */
     private long getMetadata(String filePath) throws FileNotFoundException {
-        File file = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.getMetadata").getRealFile();
+        File file = createFileObject(filePath);
 
-        if (file == null || !file.exists()) {
+        if (!file.exists()) {
             throw new FileNotFoundException("Failed to find file in getMetadata");
         }
 
@@ -785,16 +825,15 @@ public class FileUtils extends CordovaPlugin {
      * @throws JSONException
      */
     private JSONObject getFileMetadata(String filePath) throws FileNotFoundException, JSONException {
-        DataResource dataResource = DataResource.initiateNewDataRequestForUri(filePath, webView.pluginManager, cordova, "FileUtils.getMetadata");
-        File file = dataResource.getRealFile();
+        File file = createFileObject(filePath);
 
-        if (file == null || !file.exists()) {
+        if (!file.exists()) {
             throw new FileNotFoundException("File: " + filePath + " does not exist.");
         }
 
         JSONObject metadata = new JSONObject();
         metadata.put("size", file.length());
-        metadata.put("type", dataResource.getMimeType());
+        metadata.put("type", FileHelper.getMimeType(filePath, cordova));
         metadata.put("name", file.getName());
         metadata.put("fullPath", filePath);
         metadata.put("lastModifiedDate", file.lastModified());
@@ -896,8 +935,7 @@ public class FileUtils extends CordovaPlugin {
         this.cordova.getThreadPool().execute(new Runnable() {
             public void run() {
                 try {
-                    DataResource dataResource = DataResource.initiateNewDataRequestForUri(filename, webView.pluginManager, cordova, "FileUtils.readFileAs");
-                    byte[] bytes = readAsBinaryHelper(dataResource.getInputStream(), start, end);
+                    byte[] bytes = readAsBinaryHelper(filename, start, end);
                     
                     PluginResult result;
                     switch (resultType) {
@@ -911,7 +949,7 @@ public class FileUtils extends CordovaPlugin {
                             result = new PluginResult(PluginResult.Status.OK, bytes, true);
                             break;
                         default: // Base64.
-                            String contentType = dataResource.getMimeType();
+                            String contentType = FileHelper.getMimeType(filename, cordova);
                             byte[] base64 = Base64.encodeBase64(bytes);
                             String s = "data:" + contentType + ";base64," + new String(base64, "US-ASCII");
                             result = new PluginResult(PluginResult.Status.OK, s);
@@ -938,9 +976,10 @@ public class FileUtils extends CordovaPlugin {
      * @return                  Contents of the file as a byte[].
      * @throws IOException
      */
-    private byte[] readAsBinaryHelper(InputStream inputStream, int start, int end) throws IOException {
+    private byte[] readAsBinaryHelper(String filename, int start, int end) throws IOException {
         int numBytesToRead = end - start;
         byte[] bytes = new byte[numBytesToRead];
+        InputStream inputStream = FileHelper.getInputStreamFromUriString(filename, cordova);
         int numBytesRead = 0;
 
         if (start > 0) {
@@ -969,8 +1008,7 @@ public class FileUtils extends CordovaPlugin {
             throw new NoModificationAllowedException("Couldn't write to file given its content URI");
         }
 
-        DataResource dataResource = DataResource.initiateNewDataRequestForUri(filename, webView.pluginManager, cordova, "FileUtils.write");
-        filename = dataResource.getRealFile().getPath();
+        filename = FileHelper.getRealPath(filename, cordova);
 
         boolean append = false;
         if (offset > 0) {
@@ -999,16 +1037,13 @@ public class FileUtils extends CordovaPlugin {
      * @throws NoModificationAllowedException
      */
     private long truncateFile(String filename, long size) throws FileNotFoundException, IOException, NoModificationAllowedException {
-        DataResource dataResource = DataResource.initiateNewDataRequestForUri(filename, webView.pluginManager, cordova, "FileUtils.truncateFile");
-        if(!dataResource.isWritable()) {
-            throw new NoModificationAllowedException("Couldn't truncate file as it is not writable");
-        }
-        File file = dataResource.getRealFile();
-        if(file == null) {
-            throw new FileNotFoundException("Couldn't get the file");
+        if (filename.startsWith("content://")) {
+            throw new NoModificationAllowedException("Couldn't truncate file given its content URI");
         }
 
-        RandomAccessFile raf = new RandomAccessFile(file, "rw");
+        filename = FileHelper.getRealPath(filename, cordova);
+
+        RandomAccessFile raf = new RandomAccessFile(filename, "rw");
         try {
             if (raf.length() >= size) {
                 FileChannel channel = raf.getChannel();

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/framework/src/org/apache/cordova/IceCreamCordovaWebViewClient.java
----------------------------------------------------------------------
diff --git a/lib/cordova-android/framework/src/org/apache/cordova/IceCreamCordovaWebViewClient.java b/lib/cordova-android/framework/src/org/apache/cordova/IceCreamCordovaWebViewClient.java
index 14c7603..847972e 100644
--- a/lib/cordova-android/framework/src/org/apache/cordova/IceCreamCordovaWebViewClient.java
+++ b/lib/cordova-android/framework/src/org/apache/cordova/IceCreamCordovaWebViewClient.java
@@ -22,8 +22,6 @@ import java.io.IOException;
 import java.io.InputStream;
 
 import org.apache.cordova.api.CordovaInterface;
-import org.apache.cordova.api.DataResource;
-import org.apache.cordova.api.DataResourceContext;
 import org.apache.cordova.api.LOG;
 
 import android.annotation.TargetApi;
@@ -45,27 +43,41 @@ public class IceCreamCordovaWebViewClient extends CordovaWebViewClient {
 
     @Override
     public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
-        // We need to support the new DataResource intercepts without breaking the shouldInterceptRequest mechanism.
-        DataResource dataResource = DataResource.initiateNewDataRequestForUri(url, this.appView.pluginManager, cordova,
-                "WebViewClient.shouldInterceptRequest");
-        url = dataResource.getUri().toString();
-
-        // This mechanism is no longer needed due to the dataResource mechanism. It would be awesome to just get rid of it.
         //Check if plugins intercept the request
         WebResourceResponse ret = super.shouldInterceptRequest(view, url);
+        if(ret == null && (url.contains("?") || url.contains("#") || needsIceCreamSpaceInAssetUrlFix(url))){
+            ret = generateWebResourceResponse(url);
+        }
+        return ret;
+    }
+
+    private WebResourceResponse generateWebResourceResponse(String url) {
+        if (url.startsWith("file:///android_asset/")) {
+            String mimetype = FileHelper.getMimeType(url, cordova);
 
-        if(ret == null) {
             try {
-                InputStream is;
-                String mimeType;
-                if((is = dataResource.getInputStream()) != null && (mimeType = dataResource.getMimeType()) != null) {
-                    // If we don't know how to open this file, let the browser continue loading
-                    ret = new WebResourceResponse(mimeType, "UTF-8", is);
-                }
-            } catch(IOException e) {
-                LOG.e("IceCreamCordovaWebViewClient", "Error occurred while loading a file.", e);
+                InputStream stream = FileHelper.getInputStreamFromUriString(url, cordova);
+                WebResourceResponse response = new WebResourceResponse(mimetype, "UTF-8", stream);
+                return response;
+            } catch (IOException e) {
+                LOG.e("generateWebResourceResponse", e.getMessage(), e);
             }
         }
-        return ret;
+        return null;
     }
+    
+    private static boolean needsIceCreamSpaceInAssetUrlFix(String url) {
+        if (!url.contains("%20")){
+            return false;
+        }
+
+        switch(android.os.Build.VERSION.SDK_INT){
+            case android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH:
+            case android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1:
+                return true;
+            default:
+                return false;
+        }
+    }
+    
 }

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/framework/src/org/apache/cordova/JSONUtils.java
----------------------------------------------------------------------
diff --git a/lib/cordova-android/framework/src/org/apache/cordova/JSONUtils.java b/lib/cordova-android/framework/src/org/apache/cordova/JSONUtils.java
index 77df876..da777c1 100644
--- a/lib/cordova-android/framework/src/org/apache/cordova/JSONUtils.java
+++ b/lib/cordova-android/framework/src/org/apache/cordova/JSONUtils.java
@@ -1,3 +1,21 @@
+/*
+       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.
+*/
 package org.apache.cordova;
 
 import java.util.ArrayList;

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/framework/src/org/apache/cordova/api/CallbackContext.java
----------------------------------------------------------------------
diff --git a/lib/cordova-android/framework/src/org/apache/cordova/api/CallbackContext.java b/lib/cordova-android/framework/src/org/apache/cordova/api/CallbackContext.java
index a5d1255..237d0f4 100644
--- a/lib/cordova-android/framework/src/org/apache/cordova/api/CallbackContext.java
+++ b/lib/cordova-android/framework/src/org/apache/cordova/api/CallbackContext.java
@@ -1,3 +1,21 @@
+/*
+       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.
+*/
 package org.apache.cordova.api;
 
 import org.json.JSONArray;

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/framework/src/org/apache/cordova/api/CordovaPlugin.java
----------------------------------------------------------------------
diff --git a/lib/cordova-android/framework/src/org/apache/cordova/api/CordovaPlugin.java b/lib/cordova-android/framework/src/org/apache/cordova/api/CordovaPlugin.java
index 866677c..2b225e6 100644
--- a/lib/cordova-android/framework/src/org/apache/cordova/api/CordovaPlugin.java
+++ b/lib/cordova-android/framework/src/org/apache/cordova/api/CordovaPlugin.java
@@ -176,20 +176,6 @@ public class CordovaPlugin {
     }
 
     /**
-     * All plugins can now choose if they want to modify any uri requests. This includes all webview requests, opening of files, content uri's etc.
-     * This mechanism allows several plugins to modify the same request
-     * @param requestSource The source of the incoming request
-     *
-     * @param dataResource          The resource to be loaded.
-     * @param dataResourceContext   Context associated with the resource load
-     * @return                      Return a new DataResource if the plugin wants to assist in loading the request or null if it doesn't.
-     */
-    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
-    public DataResource handleDataResourceRequest(DataResource dataResource, DataResourceContext dataResourceContext) {
-        return null;
-    }
-
-    /**
      * Called when the WebView does a top-level navigation or refreshes.
      *
      * Plugins should stop any long-running processes and clean up internal state.

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/framework/src/org/apache/cordova/api/PluginManager.java
----------------------------------------------------------------------
diff --git a/lib/cordova-android/framework/src/org/apache/cordova/api/PluginManager.java b/lib/cordova-android/framework/src/org/apache/cordova/api/PluginManager.java
index e0ceabf..71fc258 100755
--- a/lib/cordova-android/framework/src/org/apache/cordova/api/PluginManager.java
+++ b/lib/cordova-android/framework/src/org/apache/cordova/api/PluginManager.java
@@ -54,7 +54,6 @@ public class PluginManager {
     // Map URL schemes like foo: to plugins that want to handle those schemes
     // This would allow how all URLs are handled to be offloaded to a plugin
     protected HashMap<String, String> urlMap = new HashMap<String, String>();
-    private int MAX_REPITIONS = 1000;
 
     /**
      * Constructor.
@@ -401,32 +400,4 @@ public class PluginManager {
         LOG.e(TAG, "https://git-wip-us.apache.org/repos/asf?p=incubator-cordova-android.git;a=blob;f=framework/res/xml/plugins.xml");
         LOG.e(TAG, "=====================================================================================");
     }
-
-    /**
-     * Called when the any resource is going to be loaded - either from the webview, files or any other resource
-     *
-     *
-     * @param dataResource          The resource request to be loaded.
-     * @param dataResourceContext   The context of the dataResource request
-     * @return                      Return the resource request that will be loaded. The returned request may be modified or unchanged.
-     */
-    public DataResource handleDataResourceRequestWithPlugins(DataResource dataResource, DataResourceContext dataResourceContext){
-        int repetitions = 0;
-        boolean requestModified = true;
-        while(requestModified && repetitions < MAX_REPITIONS) {
-            requestModified = false;
-            repetitions ++;
-            for (PluginEntry entry : this.entries.values()) {
-                if (entry.plugin != null) {
-                    DataResource ret = entry.plugin.handleDataResourceRequest(dataResource, dataResourceContext);
-                    if(ret != null) {
-                        dataResource = ret;
-                        requestModified = true;
-                        break;
-                    }
-                }
-            }
-        }
-        return dataResource;
-    }
 }

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/test/README.md
----------------------------------------------------------------------
diff --git a/lib/cordova-android/test/README.md b/lib/cordova-android/test/README.md
index 79cf85f..5d86720 100755
--- a/lib/cordova-android/test/README.md
+++ b/lib/cordova-android/test/README.md
@@ -1,3 +1,23 @@
+<!--
+#
+# 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.
+#
+-->
 # Android Native Tests #
 
 These tests are designed to verify Android native features and other Android specific features.

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-android/test/res/xml/config.xml
----------------------------------------------------------------------
diff --git a/lib/cordova-android/test/res/xml/config.xml b/lib/cordova-android/test/res/xml/config.xml
index d3ea4d8..5ad2b25 100644
--- a/lib/cordova-android/test/res/xml/config.xml
+++ b/lib/cordova-android/test/res/xml/config.xml
@@ -1,4 +1,22 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
 <widget xmlns     = "http://www.w3.org/ns/widgets"
         id        = "io.cordova.helloCordova"
         version   = "2.0.0">

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-ios/CordovaLib/Classes/CDVAvailability.h
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/CordovaLib/Classes/CDVAvailability.h b/lib/cordova-ios/CordovaLib/Classes/CDVAvailability.h
index b288522..324237d 100644
--- a/lib/cordova-ios/CordovaLib/Classes/CDVAvailability.h
+++ b/lib/cordova-ios/CordovaLib/Classes/CDVAvailability.h
@@ -41,6 +41,7 @@
 #define __CORDOVA_2_5_0 20500
 #define __CORDOVA_2_6_0 20600
 #define __CORDOVA_2_7_0 20700
+#define __CORDOVA_2_8_0 20800
 #define __CORDOVA_NA 99999      /* not available */
 
 /*
@@ -51,7 +52,7 @@
  #endif
  */
 #ifndef CORDOVA_VERSION_MIN_REQUIRED
-    #define CORDOVA_VERSION_MIN_REQUIRED __CORDOVA_2_7_0
+    #define CORDOVA_VERSION_MIN_REQUIRED __CORDOVA_2_8_0
 #endif
 
 /*

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-ios/CordovaLib/Classes/CDVDevice.m
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/CordovaLib/Classes/CDVDevice.m b/lib/cordova-ios/CordovaLib/Classes/CDVDevice.m
index cc7ad89..a331b81 100644
--- a/lib/cordova-ios/CordovaLib/Classes/CDVDevice.m
+++ b/lib/cordova-ios/CordovaLib/Classes/CDVDevice.m
@@ -75,7 +75,6 @@
     [devProps setObject:@"iOS" forKey:@"platform"];
     [devProps setObject:[device systemVersion] forKey:@"version"];
     [devProps setObject:[device uniqueAppInstanceIdentifier] forKey:@"uuid"];
-    [devProps setObject:[device model] forKey:@"name"];
     [devProps setObject:[[self class] cordovaVersion] forKey:@"cordova"];
 
     NSDictionary* devReturn = [NSDictionary dictionaryWithDictionary:devProps];

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-ios/CordovaLib/Classes/CDVWebViewDelegate.m
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/CordovaLib/Classes/CDVWebViewDelegate.m b/lib/cordova-ios/CordovaLib/Classes/CDVWebViewDelegate.m
index fd9c032..1ee7aea 100644
--- a/lib/cordova-ios/CordovaLib/Classes/CDVWebViewDelegate.m
+++ b/lib/cordova-ios/CordovaLib/Classes/CDVWebViewDelegate.m
@@ -193,11 +193,16 @@ typedef enum {
                     break;
 
                 default:
-                    NSLog(@"CDVWebViewDelegate: Navigation started when state=%d", _state);
-                    _loadCount = 0;
-                    _state = STATE_WAITING_FOR_LOAD_START;
-                    if ([_delegate respondsToSelector:@selector(webView:didFailLoadWithError:)]) {
-                        [_delegate webView:webView didFailLoadWithError:nil];
+                    {
+                        NSString* description = [NSString stringWithFormat:@"CDVWebViewDelegate: Navigation started when state=%d", _state];
+                        NSLog(@"%@", description);
+                        _loadCount = 0;
+                        _state = STATE_WAITING_FOR_LOAD_START;
+                        if ([_delegate respondsToSelector:@selector(webView:didFailLoadWithError:)]) {
+                            NSDictionary* errorDictionary = @{NSLocalizedDescriptionKey : description};
+                            NSError* error = [[NSError alloc] initWithDomain:@"CDVWebViewDelegate" code:1 userInfo:errorDictionary];
+                            [_delegate webView:webView didFailLoadWithError:error];
+                        }
                     }
             }
         } else {

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-ios/CordovaLibTests/CordovaLibApp/config.xml
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/CordovaLibTests/CordovaLibApp/config.xml b/lib/cordova-ios/CordovaLibTests/CordovaLibApp/config.xml
index 3e84967..136804e 100644
--- a/lib/cordova-ios/CordovaLibTests/CordovaLibApp/config.xml
+++ b/lib/cordova-ios/CordovaLibTests/CordovaLibApp/config.xml
@@ -1,4 +1,22 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+-->
 <widget xmlns     = "http://www.w3.org/ns/widgets"
         id        = "io.cordova.helloCordova"
         version   = "2.0.0">

http://git-wip-us.apache.org/repos/asf/cordova-cli/blob/dfd7980f/lib/cordova-ios/CordovaLibTests/ExifTests.h
----------------------------------------------------------------------
diff --git a/lib/cordova-ios/CordovaLibTests/ExifTests.h b/lib/cordova-ios/CordovaLibTests/ExifTests.h
index b46241b..45e17c4 100644
--- a/lib/cordova-ios/CordovaLibTests/ExifTests.h
+++ b/lib/cordova-ios/CordovaLibTests/ExifTests.h
@@ -1,10 +1,21 @@
-//
-//  ExifTestTests.h
-//  ExifTestTests
-//
-//  Created by Lorin Beer on 2013-03-18.
-//
-//
+/*
+ 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.
+ */
 
 #import <SenTestingKit/SenTestingKit.h>
 
@@ -13,15 +24,15 @@
 #define ARC4RANDOM_MAX 0x100000000
 
 @interface ExifTestTests : SenTestCase {
-    CDVJpegHeaderWriter * testHeaderWriter;
-    NSNumber * testErrorThreshhold;
+    CDVJpegHeaderWriter* testHeaderWriter;
+    NSNumber* testErrorThreshhold;
 }
 
-- (void) testContinuedFractionWithUInt;
-- (void) testContinuedFractionWithUFloat;
-- (void) testContinuedFractionsWorstCase;
-- (void) testFormatHexFromDecimal;
-- (void) testFormatNumberWithLeadingZeroes;
-- (void) testUnsignedRationalToString;
-- (void) testSignedRationalToString;
-@end
\ No newline at end of file
+- (void)testContinuedFractionWithUInt;
+- (void)testContinuedFractionWithUFloat;
+- (void)testContinuedFractionsWorstCase;
+- (void)testFormatHexFromDecimal;
+- (void)testFormatNumberWithLeadingZeroes;
+- (void)testUnsignedRationalToString;
+- (void)testSignedRationalToString;
+@end