Index: android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java |
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java |
index 0f8ca85b46b4b6dc8b195baf1c92a20f3a56962e..3a0eb94282590b44100b9ece9cc0be0ac7a419f9 100644 |
--- a/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java |
+++ b/android_webview/glue/java/src/com/android/webview/chromium/WebViewChromium.java |
@@ -8,6 +8,7 @@ import android.annotation.SuppressLint; |
import android.annotation.TargetApi; |
import android.content.Context; |
import android.content.Intent; |
+import android.content.pm.PackageInfo; |
import android.content.res.Configuration; |
import android.graphics.Bitmap; |
import android.graphics.Canvas; |
@@ -62,9 +63,11 @@ import org.chromium.content_public.browser.NavigationHistory; |
import java.io.BufferedWriter; |
import java.io.File; |
+import java.lang.reflect.Field; |
import java.lang.reflect.Method; |
import java.util.Map; |
import java.util.concurrent.Callable; |
+import java.util.concurrent.atomic.AtomicBoolean; |
/** |
* This class is the delegate to which WebViewProxy forwards all API calls. |
@@ -102,6 +105,8 @@ class WebViewChromium implements WebViewProvider, WebViewProvider.ScrollDelegate |
private WebViewChromiumFactoryProvider mFactory; |
+ private static volatile AtomicBoolean sShouldAvoidThreadCheckingForHtcMail; |
aelias_OOO_until_Jul13
2016/08/12 07:49:57
Reading https://docs.oracle.com/javase/7/docs/api/
Changwan Ryu
2016/08/12 08:40:30
Done.
|
+ |
private static boolean sRecordWholeDocumentEnabledByApi = false; |
static void enableSlowWholeDocumentDraw() { |
sRecordWholeDocumentEnabledByApi = true; |
@@ -135,6 +140,7 @@ class WebViewChromium implements WebViewProvider, WebViewProvider.ScrollDelegate |
@TargetApi(Build.VERSION_CODES.LOLLIPOP) |
public void init(final Map<String, Object> javaScriptInterfaces, |
final boolean privateBrowsing) { |
+ avoidThreadCheckingForHtcMail(mWebView); |
aelias_OOO_until_Jul13
2016/08/12 07:49:57
Please restructure this to look like:
sIsHtcMail.
Changwan Ryu
2016/08/12 08:40:30
Done.
|
if (privateBrowsing) { |
mFactory.startYourEngines(true); |
final String msg = "Private browsing is not supported in WebView."; |
@@ -198,6 +204,61 @@ class WebViewChromium implements WebViewProvider, WebViewProvider.ScrollDelegate |
}); |
} |
+ private boolean shouldAvoidThreadCheckingForHtcMail(View view) { |
aelias_OOO_until_Jul13
2016/08/12 07:49:57
Please rename this to isHtcMail and delete all lin
Changwan Ryu
2016/08/12 08:40:30
Done.
|
+ if (sShouldAvoidThreadCheckingForHtcMail != null) { |
+ return sShouldAvoidThreadCheckingForHtcMail.get(); |
+ } |
+ if (mAppTargetSdkVersion > Build.VERSION_CODES.M) return false; |
+ final String htcMailPackageId = "com.htc.android.mail"; |
+ if (view.getClass().getName() == null |
+ || !view.getClass().getName().startsWith(htcMailPackageId)) { |
+ sShouldAvoidThreadCheckingForHtcMail = new AtomicBoolean(false); |
+ return false; |
+ } |
+ |
+ try { |
+ PackageInfo packageInfo = |
+ view.getContext().getPackageManager().getPackageInfo(htcMailPackageId, 0); |
+ // These values are provided by HTC. |
+ if ((mAppTargetSdkVersion < Build.VERSION_CODES.M |
+ && packageInfo.versionCode < 864021756) |
+ || packageInfo.versionCode < 866001861) { |
+ sShouldAvoidThreadCheckingForHtcMail = new AtomicBoolean(true); |
+ return true; |
+ } |
+ } catch (Exception e) { |
+ e.printStackTrace(); |
+ } |
+ sShouldAvoidThreadCheckingForHtcMail = new AtomicBoolean(false); |
+ return false; |
+ } |
+ |
+ // This is a workaround for https://crbug.com/622151. |
+ // In HTC's email app, InputConnection.setComposingText() will call WebView.evaluateJavaScript, |
+ // and thread assertion will occur. We turn off WebView thread assertion for this app. |
+ private void avoidThreadCheckingForHtcMail(View view) { |
aelias_OOO_until_Jul13
2016/08/12 07:49:57
Please rename to disableThreadChecking and remove
Changwan Ryu
2016/08/12 08:40:30
Done.
|
+ if (!shouldAvoidThreadCheckingForHtcMail(view)) return; |
+ |
+ for (Class<?> webViewClass = view.getClass(); |
+ webViewClass != null; |
+ webViewClass = webViewClass.getSuperclass()) { |
+ String name = webViewClass.getName(); |
+ if (name != null && name.contains("WebView")) { |
+ try { |
+ Field field = webViewClass.getDeclaredField("sEnforceThreadChecking"); |
+ field.setAccessible(true); |
+ field.setBoolean(null, false); |
+ field.setAccessible(false); |
+ Log.w(TAG, "We are turning off thread check for this apk."); |
aelias_OOO_until_Jul13
2016/08/12 07:49:57
This log is a bit low on detail, I'd suggest print
Changwan Ryu
2016/08/12 08:40:30
Added log in isHtcMail() and removed this one.
|
+ } catch (NoSuchFieldException | IllegalAccessException |
+ | IllegalArgumentException e) { |
+ e.printStackTrace(); |
+ } |
+ return; |
+ } |
+ } |
+ } |
+ |
private void initForReal() { |
AwContentsStatics.setRecordFullDocument(sRecordWholeDocumentEnabledByApi |
|| mAppTargetSdkVersion < Build.VERSION_CODES.LOLLIPOP); |
@@ -540,7 +601,22 @@ class WebViewChromium implements WebViewProvider, WebViewProvider.ScrollDelegate |
mAwContents.loadDataWithBaseURL(baseUrl, data, mimeType, encoding, historyUrl); |
} |
- public void evaluateJavaScript(String script, ValueCallback<String> resultCallback) { |
+ public void evaluateJavaScript( |
+ final String script, final ValueCallback<String> resultCallback) { |
+ if (shouldAvoidThreadCheckingForHtcMail(mWebView)) { |
aelias_OOO_until_Jul13
2016/08/12 07:49:57
Please check sIsHtcMail.get() directly here.
Changwan Ryu
2016/08/12 08:40:30
Done.
|
+ // This is a workaround for https://crbug.com/622151. |
+ ThreadUtils.postOnUiThread(new Runnable() { |
+ @Override |
+ public void run() { |
+ evaluateJavaScriptInternal(script, resultCallback); |
+ } |
+ }); |
+ } else { |
+ evaluateJavaScriptInternal(script, resultCallback); |
+ } |
+ } |
+ |
+ private void evaluateJavaScriptInternal(String script, ValueCallback<String> resultCallback) { |
checkThread(); |
mAwContents.evaluateJavaScript(script, resultCallback); |
} |