Chromium Code Reviews| Index: content/public/android/java/src/org/chromium/content/browser/LoadUrlParams.java |
| diff --git a/content/public/android/java/src/org/chromium/content/browser/LoadUrlParams.java b/content/public/android/java/src/org/chromium/content/browser/LoadUrlParams.java |
| index ba9619377f41b20f520741413c33d21838950125..457434c0844762a5e6e0988a14a1a06e8627524c 100644 |
| --- a/content/public/android/java/src/org/chromium/content/browser/LoadUrlParams.java |
| +++ b/content/public/android/java/src/org/chromium/content/browser/LoadUrlParams.java |
| @@ -39,6 +39,7 @@ public class LoadUrlParams { |
| int mUaOverrideOption; |
| private Map<String, String> mExtraHeaders; |
| byte[] mPostData; |
| + String mDataForDataUrl; |
| String mBaseUrlForDataUrl; |
| String mVirtualUrlForDataUrl; |
| boolean mCanLoadLocalResources; |
| @@ -52,6 +53,7 @@ public class LoadUrlParams { |
| mTransitionType = PageTransitionTypes.PAGE_TRANSITION_LINK; |
| mUaOverrideOption = UA_OVERRIDE_INHERIT; |
| mPostData = null; |
| + mDataForDataUrl = null; |
| mBaseUrlForDataUrl = null; |
| mVirtualUrlForDataUrl = null; |
| } |
| @@ -132,17 +134,20 @@ public class LoadUrlParams { |
| public static LoadUrlParams createLoadDataParamsWithBaseUrl( |
| String data, String mimeType, boolean isBase64Encoded, |
| String baseUrl, String historyUrl, String charset) { |
| - LoadUrlParams params = createLoadDataParams(data, mimeType, isBase64Encoded, charset); |
| - // For WebView compatibility, when the base URL has the 'data:' |
| - // scheme, we treat it as a regular data URL load and skip setting |
| - // baseUrl and historyUrl. |
| // TODO(joth): we should just append baseURL and historyURL here, and move the |
| // WebView specific transform up to a wrapper factory function in android_webview/. |
| - if (baseUrl == null || !baseUrl.toLowerCase().startsWith("data:")) { |
| + if (baseUrl == null || !isDataScheme(baseUrl)) { |
| + LoadUrlParams params = createLoadDataParams("", mimeType, isBase64Encoded, charset); |
| + params.mDataForDataUrl = data; |
| + // For WebView compatibility, when the base URL has the 'data:' |
| + // scheme, we treat it as a regular data URL load and skip setting |
| + // baseUrl and historyUrl. |
| params.setBaseUrlForDataUrl(baseUrl != null ? baseUrl : "about:blank"); |
| params.setVirtualUrlForDataUrl(historyUrl != null ? historyUrl : "about:blank"); |
| + return params; |
| + } else { |
| + return createLoadDataParams(data, mimeType, isBase64Encoded, charset); |
| } |
| - return params; |
| } |
| /** |
| @@ -280,7 +285,13 @@ public class LoadUrlParams { |
| if (mBaseUrlForDataUrl == null && mLoadUrlType == LOAD_TYPE_DATA) { |
| return true; |
| } |
| - return nativeIsDataScheme(mBaseUrlForDataUrl); |
| + return mBaseUrlForDataUrl != null && isDataScheme(mBaseUrlForDataUrl); |
| + } |
| + |
| + private static boolean isDataScheme(String url) { |
| + int start = 0; |
| + while (start < url.length() && Character.isWhitespace(url.codePointAt(start))) ++start; |
| + return url.regionMatches(true, start, "data:", 0, 5); |
|
boliu
2013/11/26 17:15:15
Scary code. Can java.net.URL do this parsing?
joth
2013/11/27 01:31:22
The snag is that data:... URLs can be super long,
joth
2013/11/27 05:46:23
OK I didn't like it in GURLUtils as it's counter t
|
| } |
| @SuppressWarnings("unused") |
| @@ -299,10 +310,4 @@ public class LoadUrlParams { |
| UA_OVERRIDE_FALSE = ua_override_false; |
| UA_OVERRIDE_TRUE = ua_override_true; |
| } |
| - |
| - /** |
| - * Parses |url| as a GURL on the native side, and |
| - * returns true if it's scheme is data:. |
| - */ |
| - private static native boolean nativeIsDataScheme(String url); |
| } |