Fix schemes that can be downloaded

Change-Id: I4a2b75a6ce923e7176f4f0b17fbaae5b1c5ef543
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 1d535a4..406c73c 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -1462,6 +1462,8 @@
             menu.setGroupVisible(R.id.ANCHOR_MENU,
                     type == WebView.HitTestResult.SRC_ANCHOR_TYPE
                             || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE);
+            menu.findItem(R.id.save_link_context_menu_id).setEnabled(
+                UrlUtils.isDownloadableScheme(extra));
         }
         // Setup custom handling depending on the type
         switch (type) {
diff --git a/src/com/android/browser/FetchUrlMimeType.java b/src/com/android/browser/FetchUrlMimeType.java
index fbd8be7..0e8398a 100644
--- a/src/com/android/browser/FetchUrlMimeType.java
+++ b/src/com/android/browser/FetchUrlMimeType.java
@@ -124,9 +124,11 @@
                 }
             }
         } catch (IllegalArgumentException ex) {
-            request.abort();
+            if (request != null)
+                request.abort();
         } catch (IOException ex) {
-            request.abort();
+            if (request != null)
+                request.abort();
         } finally {
             client.close();
         }
diff --git a/src/com/android/browser/UrlUtils.java b/src/com/android/browser/UrlUtils.java
index ff78647..d00e8c3 100755
--- a/src/com/android/browser/UrlUtils.java
+++ b/src/com/android/browser/UrlUtils.java
@@ -22,11 +22,18 @@
 
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.HashSet;
+import java.util.Arrays;
 
 /**
  * Utility methods for Url manipulation
  */
 public class UrlUtils {
+    public static final String[] DOWNLOADABLE_SCHEMES_VALUES = new String[]
+        { "data", "filesystem", "http", "https" };
+
+    private static final HashSet<String> DOWNLOADABLE_SCHEMES =
+        new HashSet<String>(Arrays.asList(DOWNLOADABLE_SCHEMES_VALUES));
 
     static final Pattern ACCEPTED_URI_SCHEMA = Pattern.compile(
             "(?i)" + // switch on case insensitive matching
@@ -89,6 +96,18 @@
         return smartUrlFilter(url, true);
     }
 
+    public static boolean isDownloadableScheme(Uri uri) {
+        return DOWNLOADABLE_SCHEMES.contains(uri.getScheme());
+    }
+
+    public static boolean isDownloadableScheme(String uri) {
+        try {
+            return isDownloadableScheme(Uri.parse(uri));
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
     /**
      * Attempts to determine whether user input is a URL or search
      * terms.  Anything with a space is passed to search if canBeSearch is true.