Chromium Code Reviews| 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..f2abda72c6b153c4979f0762ad7350ffca564838 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 |
| @@ -62,6 +62,7 @@ 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; |
| @@ -102,6 +103,8 @@ class WebViewChromium implements WebViewProvider, WebViewProvider.ScrollDelegate |
| private WebViewChromiumFactoryProvider mFactory; |
| + private final boolean mIsHtcMail; |
| + |
| private static boolean sRecordWholeDocumentEnabledByApi = false; |
| static void enableSlowWholeDocumentDraw() { |
| sRecordWholeDocumentEnabledByApi = true; |
| @@ -110,13 +113,14 @@ class WebViewChromium implements WebViewProvider, WebViewProvider.ScrollDelegate |
| // This does not touch any global / non-threadsafe state, but note that |
| // init is ofter called right after and is NOT threadsafe. |
| public WebViewChromium(WebViewChromiumFactoryProvider factory, WebView webView, |
| - WebView.PrivateAccess webViewPrivate) { |
| + WebView.PrivateAccess webViewPrivate, boolean isHtcMail) { |
|
Torne
2016/08/16 11:45:07
Let's not call this "isHtcMail" - let's name it af
Changwan Ryu
2016/08/17 08:00:13
changed as shouldDisableThreadChecking
|
| mWebView = webView; |
| mWebViewPrivate = webViewPrivate; |
| mHitTestResult = new WebView.HitTestResult(); |
| mContext = ResourcesContextWrapperFactory.get(mWebView.getContext()); |
| mAppTargetSdkVersion = mContext.getApplicationInfo().targetSdkVersion; |
| mFactory = factory; |
| + mIsHtcMail = isHtcMail; |
| factory.getWebViewDelegate().addWebViewAssetPath(mWebView.getContext()); |
| } |
| @@ -196,6 +200,25 @@ class WebViewChromium implements WebViewProvider, WebViewProvider.ScrollDelegate |
| } |
| } |
| }); |
| + // This is called here because otherwise compiler optimization may call |
| + // disableThreadChecking before setting WebView#sEnforceThreadChecking. |
| + if (mIsHtcMail) disableThreadChecking(); |
| + } |
| + |
| + // 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 disableThreadChecking() { |
| + try { |
| + Class<?> webViewClass = Class.forName("android.webkit.WebView"); |
| + Field field = webViewClass.getDeclaredField("sEnforceThreadChecking"); |
| + field.setAccessible(true); |
| + field.setBoolean(null, false); |
| + field.setAccessible(false); |
| + } catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException |
| + | IllegalArgumentException e) { |
| + Log.w(TAG, "Failed to disable thread checking."); |
| + } |
| } |
| private void initForReal() { |
| @@ -540,9 +563,24 @@ class WebViewChromium implements WebViewProvider, WebViewProvider.ScrollDelegate |
| mAwContents.loadDataWithBaseURL(baseUrl, data, mimeType, encoding, historyUrl); |
| } |
| - public void evaluateJavaScript(String script, ValueCallback<String> resultCallback) { |
| - checkThread(); |
| - mAwContents.evaluateJavaScript(script, resultCallback); |
| + @Override |
| + public void evaluateJavaScript( |
| + final String script, final ValueCallback<String> resultCallback) { |
| + if (mIsHtcMail) { |
| + // This is a workaround for https://crbug.com/622151. |
| + if (checkNeedsPost()) { |
| + mFactory.addTask(new Runnable() { |
| + @Override |
| + public void run() { |
| + mAwContents.evaluateJavaScript(script, resultCallback); |
| + } |
| + }); |
| + return; |
| + } |
| + } else { |
| + checkThread(); |
| + mAwContents.evaluateJavaScript(script, resultCallback); |
| + } |
| } |
| @Override |
| @@ -2018,15 +2056,18 @@ class WebViewChromium implements WebViewProvider, WebViewProvider.ScrollDelegate |
| } |
| // Remove from superclass |
| + @Override |
| public void preDispatchDraw(Canvas canvas) { |
| // TODO(leandrogracia): remove this method from WebViewProvider if we think |
| // we won't need it again. |
| } |
| + @Override |
| public void onStartTemporaryDetach() { |
| mAwContents.onStartTemporaryDetach(); |
| } |
| + @Override |
| public void onFinishTemporaryDetach() { |
| mAwContents.onFinishTemporaryDetach(); |
| } |