Don't allow the user to save bookmarks with a scheme that the Browser cannot directly handle.

Change-Id: I9cbdfeaaeef4ded3dac1623854ecb9c5c603eb91
diff --git a/src/com/android/browser/AddBookmarkPage.java b/src/com/android/browser/AddBookmarkPage.java
index 81123ba..9ab8473 100644
--- a/src/com/android/browser/AddBookmarkPage.java
+++ b/src/com/android/browser/AddBookmarkPage.java
@@ -182,9 +182,14 @@
         try {
             URI uriObj = new URI(url);
             String scheme = uriObj.getScheme();
-            if (!("about".equals(scheme) || "data".equals(scheme)
-                    || "javascript".equals(scheme)
-                    || "file".equals(scheme) || "content".equals(scheme))) {
+            if (!Bookmarks.urlHasAcceptableScheme(url)) {
+                // If the scheme was non-null, let the user know that we
+                // can't save their bookmark. If it was null, we'll assume
+                // they meant http when we parse it in the WebAddress class.
+                if (scheme != null) {
+                    mAddress.setError(r.getText(R.string.bookmark_cannot_save_url));
+                    return false;
+                }
                 WebAddress address;
                 try {
                     address = new WebAddress(unfilteredUrl);
diff --git a/src/com/android/browser/Bookmarks.java b/src/com/android/browser/Bookmarks.java
index c8aaee7..8d98f89 100644
--- a/src/com/android/browser/Bookmarks.java
+++ b/src/com/android/browser/Bookmarks.java
@@ -41,6 +41,18 @@
 
     private static String[]         SELECTION_ARGS;
 
+    // We only want the user to be able to bookmark content that
+    // the browser can handle directly.
+    private static final String acceptableBookmarkSchemes[] = {
+            "http:",
+            "https:",
+            "about:",
+            "data:",
+            "javascript:",
+            "file:",
+            "content:"
+    };
+
     /**
      *  Add a bookmark to the database.
      *  @param context Context of the calling Activity.  This is used to make
@@ -214,4 +226,17 @@
         bm.compress(Bitmap.CompressFormat.PNG, 100, os);
         return os.toByteArray();
     }
+
+    /* package */ static boolean urlHasAcceptableScheme(String url) {
+        if (url == null) {
+            return false;
+        }
+
+        for (int i = 0; i < acceptableBookmarkSchemes.length; i++) {
+            if (url.startsWith(acceptableBookmarkSchemes[i])) {
+                return true;
+            }
+        }
+        return false;
+    }
 }
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 7e74262..c6f4056 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -1664,6 +1664,8 @@
                 // decide whether to show the open link in new tab option
                 menu.findItem(R.id.open_newtab_context_menu_id).setVisible(
                         mTabControl.canCreateNewTab());
+                menu.findItem(R.id.bookmark_context_menu_id).setVisible(
+                        Bookmarks.urlHasAcceptableScheme(extra));
                 PackageManager pm = getPackageManager();
                 Intent send = new Intent(Intent.ACTION_SEND);
                 send.setType("text/plain");