Index: android_webview/java/src/org/chromium/android_webview/AwContents.java |
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java |
index ae5aad9aebcb620a52a0a4613e64354905056b0a..d7e2a910ea3ae252b9b04328392707d2ed3c7af8 100644 |
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java |
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java |
@@ -19,6 +19,7 @@ import android.os.Build; |
import android.os.Bundle; |
import android.os.Message; |
import android.text.TextUtils; |
+import android.util.Base64; |
joth
2013/12/02 23:21:38
not needed
|
import android.util.Log; |
import android.view.KeyEvent; |
import android.view.MotionEvent; |
@@ -867,6 +868,47 @@ public class AwContents { |
mContentsClient.getVisitedHistory(callback); |
} |
+ private static String fixupMimeType(String mimeType) { |
+ return TextUtils.isEmpty(mimeType) ? "text/html" : mimeType; |
+ } |
+ |
+ private static String fixupData(String data) { |
+ return TextUtils.isEmpty(data) ? "" : data; |
+ } |
+ |
+ private static String fixupBase(String url) { |
+ return TextUtils.isEmpty(url) ? "about:blank" : url; |
+ } |
+ |
+ private static boolean isBase64Encoded(String encoding) { |
+ return "base64".equals(encoding); |
+ } |
+ |
+ public static LoadUrlParams createLoadUrlParamsForLoadData(String data, String mimeType, |
+ String encoding) { |
+ return LoadUrlParams.createLoadDataParams( |
+ fixupData(data), fixupMimeType(mimeType), isBase64Encoded(encoding)); |
+ } |
+ |
+ public static LoadUrlParams createLoadUrlParamsForLoadDataWithBaseURL(String baseUrl, |
+ String data, String mimeType, String encoding, String historyUrl) { |
+ data = fixupData(data); |
+ mimeType = fixupMimeType(mimeType); |
+ baseUrl = fixupBase(baseUrl); |
+ historyUrl = fixupBase(historyUrl); |
+ boolean isBase64 = isBase64Encoded(encoding); |
+ |
+ // Check if the baseUrl starts with "data:", ignoring case. |
+ if (baseUrl.regionMatches(true, 0, "data:", 0, 5)) { |
+ // For backwards compatibility with WebViewClassic, we use the value of |encoding| |
+ // as the charset, as long as it's not "base64". |
+ return LoadUrlParams.createLoadDataParams(data, mimeType, isBase64, |
+ isBase64 ? null : encoding); |
+ } |
+ return LoadUrlParams.createLoadDataParamsWithBaseUrl( |
+ data, mimeType, isBase64, baseUrl, historyUrl, encoding); |
+ } |
+ |
/** |
* Load url without fixing up the url string. Consumers of ContentView are responsible for |
* ensuring the URL passed in is properly formatted (i.e. the scheme has been added if left |
@@ -876,11 +918,15 @@ public class AwContents { |
*/ |
public void loadUrl(LoadUrlParams params) { |
if (params.getLoadUrlType() == LoadUrlParams.LOAD_TYPE_DATA && |
- !params.isBaseUrlDataScheme()) { |
+ params.getBaseUrl() != null) { |
// This allows data URLs with a non-data base URL access to file:///android_asset/ and |
// file:///android_res/ URLs. If AwSettings.getAllowFileAccess permits, it will also |
// allow access to file:// URLs (subject to OS level permission checks). |
params.setCanLoadLocalResources(true); |
+ |
+ // Data url's with a base url will be resolved in Blink, and not cause an onPageStarted |
+ // event to be sent. Sending the callback directly from here. |
+ mContentsClient.getCallbackHelper().postOnPageStarted(params.getBaseUrl()); |
} |
// If we are reloading the same url, then set transition type as reload. |