summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick Scott <phanna@android.com>2009-11-30 13:34:40 -0500
committerPatrick Scott <phanna@android.com>2009-12-04 13:19:52 -0500
commit7c24ed6904707ea7179cb81382b7ca8d8ce85b7f (patch)
tree321085c5eb4d429a430ab9f8860056057eccd8c6
parentd345c6acedb22c9408553ef9f38c196984177e6b (diff)
downloadframeworks_base-7c24ed6904707ea7179cb81382b7ca8d8ce85b7f.zip
frameworks_base-7c24ed6904707ea7179cb81382b7ca8d8ce85b7f.tar.gz
frameworks_base-7c24ed6904707ea7179cb81382b7ca8d8ce85b7f.tar.bz2
Check if another Activity wants to intercept an xml mime type.
WebCore treats */*+xml as content that it can render. This prevents Activities from intercepting those mime types. Check the same regular expression as DOMImplementation and then use the PackageManager to look for a matching Activity. Requires a change to webcore. Bug: 2256744
-rw-r--r--core/java/android/webkit/BrowserFrame.java7
-rw-r--r--core/java/android/webkit/LoadListener.java44
2 files changed, 45 insertions, 6 deletions
diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java
index 1496f1b..e94f485 100644
--- a/core/java/android/webkit/BrowserFrame.java
+++ b/core/java/android/webkit/BrowserFrame.java
@@ -546,6 +546,8 @@ class BrowserFrame extends Handler {
byte[] postData,
long postDataIdentifier,
int cacheMode,
+ boolean mainResource,
+ boolean userGesture,
boolean synchronous) {
PerfChecker checker = new PerfChecker();
@@ -612,13 +614,14 @@ class BrowserFrame extends Handler {
if (DebugFlags.BROWSER_FRAME) {
Log.v(LOGTAG, "startLoadingResource: url=" + url + ", method="
+ method + ", postData=" + postData + ", isMainFramePage="
- + isMainFramePage);
+ + isMainFramePage + ", mainResource=" + mainResource
+ + ", userGesture=" + userGesture);
}
// Create a LoadListener
LoadListener loadListener = LoadListener.getLoadListener(mContext,
this, url, loaderHandle, synchronous, isMainFramePage,
- postDataIdentifier);
+ mainResource, userGesture, postDataIdentifier);
mCallbackProxy.onLoadResource(url);
diff --git a/core/java/android/webkit/LoadListener.java b/core/java/android/webkit/LoadListener.java
index 938df95..863ab8c 100644
--- a/core/java/android/webkit/LoadListener.java
+++ b/core/java/android/webkit/LoadListener.java
@@ -16,9 +16,14 @@
package android.webkit;
+import android.content.ActivityNotFoundException;
import android.content.Context;
-import android.net.WebAddress;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
import android.net.ParseException;
+import android.net.Uri;
+import android.net.WebAddress;
import android.net.http.EventHandler;
import android.net.http.Headers;
import android.net.http.HttpAuthHeader;
@@ -117,6 +122,8 @@ class LoadListener extends Handler implements EventHandler {
// Does this loader correspond to the main-frame top-level page?
private boolean mIsMainPageLoader;
+ private final boolean mIsMainResourceLoader;
+ private final boolean mUserGesture;
private Headers mHeaders;
@@ -126,11 +133,12 @@ class LoadListener extends Handler implements EventHandler {
public static LoadListener getLoadListener(Context context,
BrowserFrame frame, String url, int nativeLoader,
- boolean synchronous, boolean isMainPageLoader, long postIdentifier) {
+ boolean synchronous, boolean isMainPageLoader,
+ boolean isMainResource, boolean userGesture, long postIdentifier) {
sNativeLoaderCount += 1;
return new LoadListener(context, frame, url, nativeLoader, synchronous,
- isMainPageLoader, postIdentifier);
+ isMainPageLoader, isMainResource, userGesture, postIdentifier);
}
public static int getNativeLoaderCount() {
@@ -139,7 +147,7 @@ class LoadListener extends Handler implements EventHandler {
LoadListener(Context context, BrowserFrame frame, String url,
int nativeLoader, boolean synchronous, boolean isMainPageLoader,
- long postIdentifier) {
+ boolean isMainResource, boolean userGesture, long postIdentifier) {
if (DebugFlags.LOAD_LISTENER) {
Log.v(LOGTAG, "LoadListener constructor url=" + url);
}
@@ -152,6 +160,8 @@ class LoadListener extends Handler implements EventHandler {
mMessageQueue = new Vector<Message>();
}
mIsMainPageLoader = isMainPageLoader;
+ mIsMainResourceLoader = isMainResource;
+ mUserGesture = userGesture;
mPostIdentifier = postIdentifier;
}
@@ -294,6 +304,13 @@ class LoadListener extends Handler implements EventHandler {
sendMessageInternal(obtainMessage(MSG_CONTENT_HEADERS, headers));
}
+ // This is the same regex that DOMImplementation uses to check for xml
+ // content. Use this to check if another Activity wants to handle the
+ // content before giving it to webkit.
+ private static final String XML_MIME_TYPE =
+ "^[\\w_\\-+~!$\\^{}|.%'`#&*]+/" +
+ "[\\w_\\-+~!$\\^{}|.%'`#&*]+\\+xml$";
+
// Does the header parsing work on the WebCore thread.
private void handleHeaders(Headers headers) {
if (mCancelled) return;
@@ -352,6 +369,25 @@ class LoadListener extends Handler implements EventHandler {
than the headers that are returned from the server. */
guessMimeType();
}
+ // At this point, mMimeType has been set to non-null.
+ if (mIsMainPageLoader && mIsMainResourceLoader && mUserGesture &&
+ Pattern.matches(XML_MIME_TYPE, mMimeType)) {
+ Intent i = new Intent(Intent.ACTION_VIEW);
+ i.setDataAndType(Uri.parse(url()), mMimeType);
+ ResolveInfo info = mContext.getPackageManager().resolveActivity(i,
+ PackageManager.MATCH_DEFAULT_ONLY);
+ if (info != null) {
+ // someone (other than the current activity) knows how to
+ // handle this mime type.
+ try {
+ mContext.startActivity(i);
+ mBrowserFrame.stopLoading();
+ return;
+ } catch (ActivityNotFoundException ex) {
+ // continue loading internally.
+ }
+ }
+ }
// is it an authentication request?
boolean mustAuthenticate = (mStatusCode == HTTP_AUTH ||