Merge "Forbid javascript- and file-scheme intents"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index a90468b..9ea41e6 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -86,7 +86,6 @@
                 <data android:scheme="http" />
                 <data android:scheme="https" />
                 <data android:scheme="about" />
-                <data android:scheme="javascript" />
             </intent-filter>
             <!--  For these schemes where any of these particular MIME types
                   have been supplied, we are a good candidate. -->
@@ -101,16 +100,6 @@
                 <data android:mimeType="application/xhtml+xml"/>
                 <data android:mimeType="application/vnd.wap.xhtml+xml"/>
             </intent-filter>
-            <!-- For viewing saved web archives. -->
-            <intent-filter>
-                <action android:name="android.intent.action.VIEW" />
-                <category android:name="android.intent.category.BROWSABLE" />
-                <category android:name="android.intent.category.DEFAULT" />
-                <data android:scheme="http" />
-                <data android:scheme="https" />
-                <data android:scheme="file" />
-                <data android:mimeType="application/x-webarchive-xml"/>
-            </intent-filter>
             <!-- Accept inbound NFC URLs at a low priority -->
             <intent-filter android:priority="-101">
                 <action android:name="android.nfc.action.NDEF_DISCOVERED" />
diff --git a/src/com/android/browser/IntentHandler.java b/src/com/android/browser/IntentHandler.java
index 1b8dfc7..d06d34f 100644
--- a/src/com/android/browser/IntentHandler.java
+++ b/src/com/android/browser/IntentHandler.java
@@ -29,6 +29,7 @@
 import android.provider.Browser;
 import android.provider.MediaStore;
 import android.text.TextUtils;
+import android.util.Log;
 import android.util.Patterns;
 
 import com.android.browser.UI.ComboViews;
@@ -37,6 +38,7 @@
 
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.Locale;
 import java.util.Map;
 
 /**
@@ -44,6 +46,8 @@
  */
 public class IntentHandler {
 
+    private static final String TAG = "IntentHandler";
+
     // "source" parameter for Google search suggested by the browser
     final static String GOOGLE_SEARCH_SOURCE_SUGGEST = "browser-suggest";
     // "source" parameter for Google search from unknown source
@@ -51,6 +55,12 @@
 
     /* package */ static final UrlData EMPTY_URL_DATA = new UrlData(null);
 
+    private static final String[] SCHEME_WHITELIST = {
+        "http",
+        "https",
+        "about",
+    };
+
     private Activity mActivity;
     private Controller mController;
     private TabControl mTabControl;
@@ -64,6 +74,12 @@
     }
 
     void onNewIntent(Intent intent) {
+        Uri uri = intent.getData();
+        if (uri != null && isForbiddenUri(uri)) {
+            Log.e(TAG, "Aborting intent with forbidden uri, \"" + uri + "\"");
+            return;
+        }
+
         Tab current = mTabControl.getCurrentTab();
         // When a tab is closed on exit, the current tab index is set to -1.
         // Reset before proceed as Browser requires the current tab to be set.
@@ -107,33 +123,18 @@
                 urlData = new UrlData(mSettings.getHomePage());
             }
 
-            // If url is to view private data files, don't allow.
-            Uri uri = intent.getData();
-            if (uri != null && uri.getScheme().toLowerCase().startsWith("file") &&
-                uri.getPath().startsWith(mActivity.getDatabasePath("foo").getParent())) {
-                return;
-            }
-
             if (intent.getBooleanExtra(Browser.EXTRA_CREATE_NEW_TAB, false)
                   || urlData.isPreloaded()) {
                 Tab t = mController.openTab(urlData);
                 return;
             }
             /*
-             * TODO: Don't allow javascript URIs
-             * 0) If this is a javascript: URI, *always* open a new tab
-             * 1) If the URL is already opened, switch to that tab
-             * 2-phone) Reuse tab with same appId
-             * 2-tablet) Open new tab
+             * If the URL is already opened, switch to that tab
+             * phone: Reuse tab with same appId
+             * tablet: Open new tab
              */
             final String appId = intent
                     .getStringExtra(Browser.EXTRA_APPLICATION_ID);
-            if (!TextUtils.isEmpty(urlData.mUrl) &&
-                    urlData.mUrl.startsWith("javascript:")) {
-                // Always open javascript: URIs in new tabs
-                mController.openTab(urlData);
-                return;
-            }
             if (Intent.ACTION_VIEW.equals(action)
                     && (appId != null)
                     && appId.startsWith(mActivity.getPackageName())) {
@@ -314,8 +315,24 @@
         return true;
     }
 
+    private static boolean isForbiddenUri(Uri uri) {
+        String scheme = uri.getScheme();
+        // Allow URIs with no scheme
+        if (scheme == null) {
+            return false;
+        }
+
+        scheme = scheme.toLowerCase(Locale.US);
+        for (String allowed : SCHEME_WHITELIST) {
+            if (allowed.equals(scheme)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
     /**
-     * A UrlData class to abstract how the content will be set to WebView.
+     * A UrlData class to abstract how the content will be sent to WebView.
      * This base class uses loadUrl to show the content.
      */
     static class UrlData {
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index dc1944e..a4d2ce0 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -74,9 +74,7 @@
 import com.android.browser.homepages.HomeProvider;
 import com.android.browser.provider.SnapshotProvider.Snapshots;
 
-import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.io.File;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.nio.ByteBuffer;
@@ -105,8 +103,6 @@
     private static final int CAPTURE_DELAY = 100;
     private static final int INITIAL_PROGRESS = 5;
 
-    private static final String RESTRICTED = "<html><body>not allowed</body></html>";
-
     private static Bitmap sDefaultFavicon;
 
     private static Paint sAlphaPaint = new Paint();
@@ -609,27 +605,7 @@
         @Override
         public WebResourceResponse shouldInterceptRequest(WebView view,
                 String url) {
-            Uri uri = Uri.parse(url);
-            if (uri.getScheme().toLowerCase().equals("file")) {
-                File file = new File(uri.getPath());
-                try {
-                    if (file.getCanonicalPath().startsWith(
-                            mContext.getApplicationContext().getApplicationInfo().dataDir)) {
-                        return new WebResourceResponse("text/html","UTF-8",
-                                new ByteArrayInputStream(RESTRICTED.getBytes("UTF-8")));
-                    }
-                } catch (Exception ex) {
-                    Log.e(LOGTAG, "Bad canonical path" + ex.toString());
-                    try {
-                        return new WebResourceResponse("text/html","UTF-8",
-                                new ByteArrayInputStream(RESTRICTED.getBytes("UTF-8")));
-                    } catch (java.io.UnsupportedEncodingException e) {
-                    }
-                }
-            }
-            WebResourceResponse res = HomeProvider.shouldInterceptRequest(
-                    mContext, url);
-            return res;
+            return HomeProvider.shouldInterceptRequest(mContext, url);
         }
 
         @Override