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..2fe17d5dd02626e3689226fd933ff366b832857d 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 |
@@ -6,6 +6,7 @@ package org.chromium.content.browser; |
import org.chromium.base.CalledByNative; |
import org.chromium.base.JNINamespace; |
+import org.chromium.net.GURLUtils; |
import java.util.Map; |
@@ -39,6 +40,7 @@ public class LoadUrlParams { |
int mUaOverrideOption; |
private Map<String, String> mExtraHeaders; |
byte[] mPostData; |
+ String mDataForDataUrl; |
String mBaseUrlForDataUrl; |
String mVirtualUrlForDataUrl; |
boolean mCanLoadLocalResources; |
@@ -52,6 +54,7 @@ public class LoadUrlParams { |
mTransitionType = PageTransitionTypes.PAGE_TRANSITION_LINK; |
mUaOverrideOption = UA_OVERRIDE_INHERIT; |
mPostData = null; |
+ mDataForDataUrl = null; |
mBaseUrlForDataUrl = null; |
mVirtualUrlForDataUrl = null; |
} |
@@ -132,17 +135,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 +286,13 @@ public class LoadUrlParams { |
if (mBaseUrlForDataUrl == null && mLoadUrlType == LOAD_TYPE_DATA) { |
return true; |
} |
- return nativeIsDataScheme(mBaseUrlForDataUrl); |
+ return GURLUtils.schemeIs(mBaseUrlForDataUrl, "data"); |
+ } |
+ |
+ 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); |
} |
@SuppressWarnings("unused") |
@@ -299,10 +311,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); |
} |