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 2015/03/18 16:03:18 UTC

android commit: CB-8702 Add API for plugins to override `shouldInterceptRequest` with a stream

Repository: cordova-android
Updated Branches:
  refs/heads/master 15530a482 -> 8d5cb00be


CB-8702 Add API for plugins to override `shouldInterceptRequest` with a stream


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

Branch: refs/heads/master
Commit: 8d5cb00bec3f3cac28ed9a30cba2fedac7a0a317
Parents: 15530a4
Author: Andrew Grieve <ag...@chromium.org>
Authored: Wed Mar 18 11:02:27 2015 -0400
Committer: Andrew Grieve <ag...@chromium.org>
Committed: Wed Mar 18 11:02:27 2015 -0400

----------------------------------------------------------------------
 .../src/org/apache/cordova/CordovaPlugin.java   | 47 +++++++++++++++++++-
 .../org/apache/cordova/CordovaResourceApi.java  | 18 +++++++-
 .../cordova/test/CordovaResourceApiTest.java    | 22 +++++++++
 3 files changed, 84 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-android/blob/8d5cb00b/framework/src/org/apache/cordova/CordovaPlugin.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/CordovaPlugin.java b/framework/src/org/apache/cordova/CordovaPlugin.java
index ee111bc..95a39c7 100644
--- a/framework/src/org/apache/cordova/CordovaPlugin.java
+++ b/framework/src/org/apache/cordova/CordovaPlugin.java
@@ -28,6 +28,9 @@ import org.json.JSONException;
 import android.content.Intent;
 import android.net.Uri;
 
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
 /**
  * Plugins must extend this class and override one of the execute methods.
  */
@@ -249,11 +252,53 @@ public class CordovaPlugin {
 
     /**
      * Hook for redirecting requests. Applies to WebView requests as well as requests made by plugins.
+     * To handle the request directly, return a URI in the form:
+     *
+     *    cdvplugin://pluginId/...
+     *
+     * And implement handleOpenForRead().
+     * To make this easier, use the toPluginUri() and fromPluginUri() helpers:
+     *
+     *     public Uri remapUri(Uri uri) { return toPluginUri(uri); }
+     *
+     *     public CordovaResourceApi.OpenForReadResult handleOpenForRead(Uri uri) throws IOException {
+     *         Uri origUri = fromPluginUri(uri);
+     *         ...
+     *     }
      */
     public Uri remapUri(Uri uri) {
         return null;
     }
-    
+
+    /**
+     * Called to handle CordovaResourceApi.openForRead() calls for a cdvplugin://pluginId/ URL.
+     * Should never return null.
+     * Added in cordova-android@4.0.0
+     */
+    public CordovaResourceApi.OpenForReadResult handleOpenForRead(Uri uri) throws IOException {
+        throw new FileNotFoundException("Plugin can't handle uri: " + uri);
+    }
+
+    /**
+     * Refer to remapUri()
+     * Added in cordova-android@4.0.0
+     */
+    protected Uri toPluginUri(Uri origUri) {
+        return new Uri.Builder()
+            .scheme(CordovaResourceApi.PLUGIN_URI_SCHEME)
+            .authority(serviceName)
+            .appendQueryParameter("origUri", origUri.toString())
+            .build();
+    }
+
+    /**
+     * Refer to remapUri()
+     * Added in cordova-android@4.0.0
+     */
+    protected Uri fromPluginUri(Uri pluginUri) {
+        return Uri.parse(pluginUri.getQueryParameter("origUri"));
+    }
+
     /**
      * Called when the WebView does a top-level navigation or refreshes.
      *

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/8d5cb00b/framework/src/org/apache/cordova/CordovaResourceApi.java
----------------------------------------------------------------------
diff --git a/framework/src/org/apache/cordova/CordovaResourceApi.java b/framework/src/org/apache/cordova/CordovaResourceApi.java
index 47f936e..274e9a1 100644
--- a/framework/src/org/apache/cordova/CordovaResourceApi.java
+++ b/framework/src/org/apache/cordova/CordovaResourceApi.java
@@ -72,8 +72,11 @@ public class CordovaResourceApi {
     public static final int URI_TYPE_DATA = 4;
     public static final int URI_TYPE_HTTP = 5;
     public static final int URI_TYPE_HTTPS = 6;
+    public static final int URI_TYPE_PLUGIN = 7;
     public static final int URI_TYPE_UNKNOWN = -1;
-    
+
+    public static final String PLUGIN_URI_SCHEME = "cdvplugin";
+
     private static final String[] LOCAL_FILE_PROJECTION = { "_data" };
     
     public static Thread jsThread;
@@ -123,6 +126,9 @@ public class CordovaResourceApi {
         if ("https".equals(scheme)) {
             return URI_TYPE_HTTPS;
         }
+        if (PLUGIN_URI_SCHEME.equals(scheme)) {
+            return URI_TYPE_PLUGIN;
+        }
         return URI_TYPE_UNKNOWN;
     }
     
@@ -282,6 +288,14 @@ public class CordovaResourceApi {
                 InputStream inputStream = conn.getInputStream();
                 return new OpenForReadResult(uri, inputStream, mimeType, length, null);
             }
+            case URI_TYPE_PLUGIN: {
+                String pluginId = uri.getHost();
+                CordovaPlugin plugin = pluginManager.getPlugin(pluginId);
+                if (plugin == null) {
+                    throw new FileNotFoundException("Invalid plugin ID in URI: " + uri);
+                }
+                return plugin.handleOpenForRead(uri);
+            }
         }
         throw new FileNotFoundException("URI not supported by CordovaResourceApi: " + uri);
     }
@@ -431,7 +445,7 @@ public class CordovaResourceApi {
         public final long length;
         public final AssetFileDescriptor assetFd;
         
-        OpenForReadResult(Uri uri, InputStream inputStream, String mimeType, long length, AssetFileDescriptor assetFd) {
+        public OpenForReadResult(Uri uri, InputStream inputStream, String mimeType, long length, AssetFileDescriptor assetFd) {
             this.uri = uri;
             this.inputStream = inputStream;
             this.mimeType = mimeType;

http://git-wip-us.apache.org/repos/asf/cordova-android/blob/8d5cb00b/test/androidTest/src/org/apache/cordova/test/CordovaResourceApiTest.java
----------------------------------------------------------------------
diff --git a/test/androidTest/src/org/apache/cordova/test/CordovaResourceApiTest.java b/test/androidTest/src/org/apache/cordova/test/CordovaResourceApiTest.java
index 73aa066..7295987 100644
--- a/test/androidTest/src/org/apache/cordova/test/CordovaResourceApiTest.java
+++ b/test/androidTest/src/org/apache/cordova/test/CordovaResourceApiTest.java
@@ -36,9 +36,11 @@ import org.apache.cordova.PluginEntry;
 import org.json.JSONArray;
 import org.json.JSONException;
 
+import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
 import java.util.Scanner;
 
 public class CordovaResourceApiTest extends BaseCordovaIntegrationTest {
@@ -58,8 +60,18 @@ public class CordovaResourceApiTest extends BaseCordovaIntegrationTest {
                     return cordovaWebView.getResourceApi().remapUri(
                             Uri.parse("data:text/plain;charset=utf-8,pass"));
                 }
+                if (uri.getQuery() != null && uri.getQuery().contains("pluginUri")) {
+                    return toPluginUri(uri);
+                }
                 return null;
             }
+            @Override
+            public OpenForReadResult handleOpenForRead(Uri uri) throws IOException {
+                Uri orig = fromPluginUri(uri);
+                ByteArrayInputStream retStream = new ByteArrayInputStream(orig.toString().getBytes(StandardCharsets.UTF_8));
+                return new OpenForReadResult(uri, retStream, "text/plain", retStream.available(), null);
+            }
+            @Override
             public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
                 synchronized (CordovaResourceApiTest.this) {
                     execPayload = args.getString(0);
@@ -214,6 +226,16 @@ public class CordovaResourceApiTest extends BaseCordovaIntegrationTest {
             String data = new Scanner(readResult.inputStream, "UTF-8").useDelimiter("\\A").next();
             assertEquals("pass", data);
         }
+        // testPluginUris
+        {
+            String origUri = "http://orig/foo?pluginUri";
+            Uri uri = resourceApi.remapUri(Uri.parse(origUri));
+            OpenForReadResult readResult = resourceApi.openForRead(uri);
+            assertEquals("openForRead mime-type", "text/plain", readResult.mimeType);
+            String data = new Scanner(readResult.inputStream, "UTF-8").useDelimiter("\\A").next();
+            assertEquals(origUri, data);
+            assertEquals(origUri.length(), readResult.length);
+        }
     }
     
     public void testWebViewRequestIntercept() throws Throwable


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cordova.apache.org
For additional commands, e-mail: commits-help@cordova.apache.org