You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by ag...@apache.org on 2013/05/28 04:31:34 UTC

[3/5] android commit: Revert "DataRequest code cleaned up."

Revert "DataRequest code cleaned up."

This reverts commit a001d8cfb71930bf21ccc0b85715385ef409d8e0.
Reverting all DataResource changes for the 2.8.0 release.


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

Branch: refs/heads/2.8.x
Commit: 0264019c87b25481afbff54cdd4c44a62a54eb65
Parents: fbeba54
Author: Andrew Grieve <ag...@chromium.org>
Authored: Mon May 27 22:22:14 2013 -0400
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Mon May 27 22:22:14 2013 -0400

----------------------------------------------------------------------
 .../src/org/apache/cordova/CameraLauncher.java     |   12 ++--
 framework/src/org/apache/cordova/FileHelper.java   |   20 +++++---
 framework/src/org/apache/cordova/FileUtils.java    |    2 +-
 .../cordova/IceCreamCordovaWebViewClient.java      |    9 ++-
 .../src/org/apache/cordova/api/CordovaPlugin.java  |    4 +-
 .../src/org/apache/cordova/api/DataResource.java   |   37 +++++++--------
 .../apache/cordova/api/DataResourceContext.java    |    9 +++-
 .../src/org/apache/cordova/api/PluginManager.java  |    9 +--
 8 files changed, 56 insertions(+), 46 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/0264019c/framework/src/org/apache/cordova/CameraLauncher.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/CameraLauncher.java b/framework/src/org/apache/cordova/CameraLauncher.java
index 1974dd7..7597a81 100755
--- a/framework/src/org/apache/cordova/CameraLauncher.java
+++ b/framework/src/org/apache/cordova/CameraLauncher.java
@@ -342,7 +342,7 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
 
                             // 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 = dataResource.getOs();
                             bitmap.compress(Bitmap.CompressFormat.JPEG, this.mQuality, os);
                             os.close();
 
@@ -540,9 +540,9 @@ 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();
+        InputStream fis = inputDataResource.getIs();
         DataResource outDataResource = DataResource.initiateNewDataRequestForUri(uri, webView.pluginManager, cordova, "CameraLauncher.writeUncompressedImage");
-        OutputStream os = outDataResource.getOutputStream();
+        OutputStream os = outDataResource.getOs();
         if(fis == null) {
             throw new FileNotFoundException("Could not get the input file");
         } else if(os == null) {
@@ -592,13 +592,13 @@ public class CameraLauncher extends CordovaPlugin implements MediaScannerConnect
         // 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(dataResource.getIs());
         }
 
         // 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(dataResource.getIs(), null, options);
         
         //CB-2292: WTF? Why is the width null?
         if(options.outWidth == 0 || options.outHeight == 0)
@@ -612,7 +612,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(dataResource.getIs(), null, options);
         if (unscaledBitmap == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/0264019c/framework/src/org/apache/cordova/FileHelper.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/FileHelper.java b/framework/src/org/apache/cordova/FileHelper.java
index 400352c..81f32f0 100644
--- a/framework/src/org/apache/cordova/FileHelper.java
+++ b/framework/src/org/apache/cordova/FileHelper.java
@@ -122,27 +122,33 @@ public class FileHelper {
      */
     public static boolean isUriWritable(String uriString) {
         String scheme = uriString.split(":")[0];
+        String writableSchemes[] = new String[]{ "content" };
 
         if(scheme.equals("file")){
             // special case file
-            return !uriString.startsWith("file:///android_asset/");
+            if(uriString.startsWith("file:///android_asset/")){
+                return false;
+            } else {
+                return true;
+            }
         }
-        return "content".equals(scheme);
+        for(int i = writableSchemes.length - 1; i >= 0 ; i--){
+            if(writableSchemes[i].equals(scheme)){
+                return true;
+            }
+        }
+        return false;
     }
 
     /**
      * Ensures the "file://" prefix exists for the given string
-     * If the given URI string already has a scheme, it is returned unchanged
+     * If the given URI string has a "file://" prefix, 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 path;

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/0264019c/framework/src/org/apache/cordova/FileUtils.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/FileUtils.java b/framework/src/org/apache/cordova/FileUtils.java
index e62fc4a..cf0e5a4 100755
--- a/framework/src/org/apache/cordova/FileUtils.java
+++ b/framework/src/org/apache/cordova/FileUtils.java
@@ -897,7 +897,7 @@ public class FileUtils extends CordovaPlugin {
             public void run() {
                 try {
                     DataResource dataResource = DataResource.initiateNewDataRequestForUri(filename, webView.pluginManager, cordova, "FileUtils.readFileAs");
-                    byte[] bytes = readAsBinaryHelper(dataResource.getInputStream(), start, end);
+                    byte[] bytes = readAsBinaryHelper(dataResource.getIs(), start, end);
                     
                     PluginResult result;
                     switch (resultType) {

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/0264019c/framework/src/org/apache/cordova/IceCreamCordovaWebViewClient.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/IceCreamCordovaWebViewClient.java b/framework/src/org/apache/cordova/IceCreamCordovaWebViewClient.java
index d9c1cd2..3a17dc1 100644
--- a/framework/src/org/apache/cordova/IceCreamCordovaWebViewClient.java
+++ b/framework/src/org/apache/cordova/IceCreamCordovaWebViewClient.java
@@ -46,16 +46,19 @@ public class IceCreamCordovaWebViewClient extends CordovaWebViewClient {
     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");
+                new DataResourceContext("WebViewClient.shouldInterceptRequest", true /* this is from a browser request*/));
         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);
-
+//      The below bugfix is taken care of by the dataResource mechanism
+//        if(ret == null && (url.contains("?") || url.contains("#") || needsIceCreamSpaceInAssetUrlFix(url))){
+//            ret = generateWebResourceResponse(url);
+//        }
         if(ret == null) {
             try {
-                ret = new WebResourceResponse(dataResource.getMimeType(), "UTF-8", dataResource.getInputStream());
+                ret = new WebResourceResponse(dataResource.getMimeType(), "UTF-8", dataResource.getIs());
             } catch(IOException e) {
                 LOG.e("IceCreamCordovaWebViewClient", "Error occurred while loading a file.", e);
             }

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/0264019c/framework/src/org/apache/cordova/api/CordovaPlugin.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/api/CordovaPlugin.java b/framework/src/org/apache/cordova/api/CordovaPlugin.java
index 866677c..69f8fde 100644
--- a/framework/src/org/apache/cordova/api/CordovaPlugin.java
+++ b/framework/src/org/apache/cordova/api/CordovaPlugin.java
@@ -182,10 +182,10 @@ public class CordovaPlugin {
      *
      * @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.
+     * @return                      Return a new DataResource if the plugin wants o assist in loading the request or null if it doesn't.
      */
     @TargetApi(Build.VERSION_CODES.HONEYCOMB)
-    public DataResource handleDataResourceRequest(DataResource dataResource, DataResourceContext dataResourceContext) {
+    public DataResource shouldInterceptDataResourceRequest(DataResource dataResource, DataResourceContext dataResourceContext) {
         return null;
     }
 

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/0264019c/framework/src/org/apache/cordova/api/DataResource.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/api/DataResource.java b/framework/src/org/apache/cordova/api/DataResource.java
index 3e6ead8..8422b07 100644
--- a/framework/src/org/apache/cordova/api/DataResource.java
+++ b/framework/src/org/apache/cordova/api/DataResource.java
@@ -24,13 +24,10 @@ public class DataResource {
     private String mimeType;
     private Boolean writable;
     private File realFile;
-    private boolean retryIsLoad = true;
-    private boolean retryOsLoad = true;
-    private boolean retryMimeTypeLoad = true;
-    private boolean retryWritableLoad = true;
-    private boolean retryRealFileLoad = true;
+    private boolean retryLoad = true;
 
     public DataResource(CordovaInterface cordova, Uri uri) {
+        super();
         this.cordova = cordova;
         this.uri = uri;
     }
@@ -46,61 +43,61 @@ public class DataResource {
         // Uri is always provided
         return uri;
     }
-    public InputStream getInputStream() throws IOException {
-        if(is == null && retryIsLoad) {
+    public InputStream getIs() throws IOException {
+        if(is == null && retryLoad) {
             try {
                 is = FileHelper.getInputStreamFromUriString(uri.toString(), cordova);
             } finally {
                 // We failed loading once, don't try loading anymore
                 if(is == null) {
-                    retryIsLoad = false;
+                    retryLoad = false;
                 }
             }
         }
         return is;
     }
-    public OutputStream getOutputStream() throws FileNotFoundException {
-        if(os == null && retryOsLoad) {
+    public OutputStream getOs() throws FileNotFoundException {
+        if(os == null && retryLoad) {
             try {
                 os = FileHelper.getOutputStreamFromUriString(uri.toString(), cordova);
             } finally {
                 // We failed loading once, don't try loading anymore
                 if(os == null) {
-                    retryOsLoad = false;
+                    retryLoad = false;
                 }
             }
         }
         return os;
     }
     public String getMimeType() {
-        if(mimeType == null && retryMimeTypeLoad) {
+        if(mimeType == null && retryLoad) {
             try {
                 mimeType = FileHelper.getMimeType(uri.toString(), cordova);
             } finally {
                 // We failed loading once, don't try loading anymore
                 if(mimeType == null) {
-                    retryMimeTypeLoad = false;
+                    retryLoad = false;
                 }
             }
         }
         return mimeType;
     }
     public boolean isWritable() {
-        if(writable == null && retryWritableLoad) {
+        if(writable == null && retryLoad) {
             try {
                 writable = FileHelper.isUriWritable(uri.toString());
             } finally {
                 // We failed loading once, don't try loading anymore
                 if(writable == null) {
-                    retryWritableLoad = false;
+                    retryLoad = false;
                 }
             }
         }
         // default to false
-        return writable != null && writable.booleanValue();
+        return writable != null? writable.booleanValue() : false;
     }
     public File getRealFile() {
-        if(realFile == null && retryRealFileLoad) {
+        if(realFile == null && retryLoad) {
             try {
                 String realPath = FileHelper.getRealPath(uri, cordova);
                 if(realPath != null) {
@@ -109,7 +106,7 @@ public class DataResource {
             } finally {
                 // We failed loading once, don't try loading anymore
                 if(realFile == null) {
-                    retryRealFileLoad = false;
+                    retryLoad = false;
                 }
             }
         }
@@ -123,7 +120,7 @@ public class DataResource {
         return initiateNewDataRequestForUri(Uri.parse(uriString), pluginManager, cordova, requestSourceTag);
     }
     public static DataResource initiateNewDataRequestForUri(Uri uri, PluginManager pluginManager, CordovaInterface cordova, String requestSourceTag){
-        return initiateNewDataRequestForUri(uri, pluginManager, cordova, new DataResourceContext(requestSourceTag));
+        return initiateNewDataRequestForUri(uri, pluginManager, cordova, new DataResourceContext(requestSourceTag, false /* Assume, not a browser request by default */ ));
     }
     public static DataResource initiateNewDataRequestForUri(String uriString, PluginManager pluginManager, CordovaInterface cordova, DataResourceContext dataResourceContext){
      // if no protocol is specified, assume its file:
@@ -134,7 +131,7 @@ public class DataResource {
         DataResource dataResource = new DataResource(cordova, uri);
         if (pluginManager != null) {
             // get the resource as returned by plugins
-            dataResource = pluginManager.handleDataResourceRequestWithPlugins(dataResource, dataResourceContext);
+            dataResource = pluginManager.shouldInterceptDataResourceRequest(dataResource, dataResourceContext);
         }
         return dataResource;
     }

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/0264019c/framework/src/org/apache/cordova/api/DataResourceContext.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/api/DataResourceContext.java b/framework/src/org/apache/cordova/api/DataResourceContext.java
index 310586b..3c66817 100644
--- a/framework/src/org/apache/cordova/api/DataResourceContext.java
+++ b/framework/src/org/apache/cordova/api/DataResourceContext.java
@@ -12,11 +12,15 @@ public class DataResourceContext {
     // A tag associated with the source of this dataResourceContext
     private String source;
     // If needed, any data associated with core plugins can be a part of the context object
+    // This field indicates whether the request came from a browser network request
+    private boolean isFromBrowser;
     // If needed, any data associated with non core plugins  should store data in a Map so as to not clutter the context object
     private Map<String, Object> dataMap;
-    public DataResourceContext(String source) {
+    public DataResourceContext(String source, boolean isFromBrowser) {
+        super();
         this.requestId = new Random().nextInt();
         this.source = source;
+        this.isFromBrowser = isFromBrowser;
         this.dataMap = new HashMap<String, Object>();
     }
     public int getRequestId() {
@@ -25,6 +29,9 @@ public class DataResourceContext {
     public String getSource() {
         return source;
     }
+    public boolean isFromBrowser() {
+        return isFromBrowser;
+    }
     public Map<String, Object> getDataMap() {
         return dataMap;
     }

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/0264019c/framework/src/org/apache/cordova/api/PluginManager.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/api/PluginManager.java b/framework/src/org/apache/cordova/api/PluginManager.java
index e0ceabf..36ac357 100755
--- a/framework/src/org/apache/cordova/api/PluginManager.java
+++ b/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.
@@ -410,15 +409,13 @@ public class PluginManager {
      * @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;
+    public DataResource shouldInterceptDataResourceRequest(DataResource dataResource, DataResourceContext dataResourceContext){
         boolean requestModified = true;
-        while(requestModified && repetitions < MAX_REPITIONS) {
+        while(requestModified) {
             requestModified = false;
-            repetitions ++;
             for (PluginEntry entry : this.entries.values()) {
                 if (entry.plugin != null) {
-                    DataResource ret = entry.plugin.handleDataResourceRequest(dataResource, dataResourceContext);
+                    DataResource ret = entry.plugin.shouldInterceptDataResourceRequest(dataResource, dataResourceContext);
                     if(ret != null) {
                         dataResource = ret;
                         requestModified = true;