package com.tencent.xweb; import android.content.Context; import android.content.MutableContextWrapper; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Picture; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.net.Uri; import android.net.http.SslCertificate; import android.os.Bundle; import android.os.Looper; import android.os.Message; import android.print.PrintDocumentAdapter; import android.util.AttributeSet; import android.util.Log; import android.view.TextureView; import android.view.View; import android.view.ViewGroup; import android.view.textclassifier.TextClassifier; import android.webkit.DownloadListener; import android.webkit.ValueCallback; import android.webkit.WebBackForwardList; import android.webkit.WebMessage; import android.webkit.WebMessagePort; import android.webkit.WebView; import android.widget.FrameLayout; import com.tencent.xweb.debug.DummyDebugView; import com.tencent.xweb.debug.IDebugView; import com.tencent.xweb.internal.CommandDef; import com.tencent.xweb.internal.ConstValue; import com.tencent.xweb.internal.ICookieManager; import com.tencent.xweb.internal.IWebView; import com.tencent.xweb.internal.IWebViewProvider; import com.tencent.xweb.internal.ProxyWebViewClientExtension; import com.tencent.xweb.report.KVReportForCrash; import com.tencent.xweb.report.KVReportForWebView; import com.tencent.xweb.report.KVReportForWebViewCore; import com.tencent.xweb.updater.XWebUpdater; import com.tencent.xweb.util.AbiUtil; import com.tencent.xweb.util.CrashWatchDog; import com.tencent.xweb.util.WXWebReporter; import com.tencent.xweb.util.WebViewWrapperFactory; import com.tencent.xweb.util.XWebCoreInfo; import com.tencent.xweb.util.XWebGrayValueUtil; import com.tencent.xweb.util.XWebLog; import j30.a; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.Executor; import k30.c; import org.xwalk.core.XWalkEnvironment; public class WebView extends FrameLayout implements IWebView { private static final String TAG = "WebView"; public static final WebViewKind sDefaultWebViewKind = WebViewKind.WV_KIND_PINUS; private static boolean sIsWaitForInstallXWeb = false; private static final KVReportForWebViewCore sKVReportForWebViewCore = new KVReportForWebViewCore(); private static WebViewKind sProcessWebViewKind = WebViewKind.WV_KIND_NONE; private static String sStrModule = ""; private static boolean sXWebCoreInited = false; private byte _hellAccFlag_; private IDebugView mDebugView; private boolean mHasDestroyed; private WebViewKind mInstanceWebViewKind; private final KVReportForWebView mKVReportForWebView; private View.OnLongClickListener mOnLongClickListener; private IWebView mWebViewWrapper; public enum FullscreenVideoKind { NOT_HOOK, HOOK_NOT_EVALUTE_JS, HOOK_EVALUTE_JS } public static class HitTestResult { @Deprecated public static final int ANCHOR_TYPE = 1; public static final int EDIT_TEXT_TYPE = 9; public static final int EMAIL_TYPE = 4; public static final int GEO_TYPE = 3; @Deprecated public static final int IMAGE_ANCHOR_TYPE = 6; public static final int IMAGE_TYPE = 5; public static final int PHONE_TYPE = 2; public static final int SRC_ANCHOR_TYPE = 7; public static final int SRC_IMAGE_ANCHOR_TYPE = 8; public static final int UNKNOWN_TYPE = 0; private String mExtra; private int mType = 0; public String getExtra() { return this.mExtra; } public int getType() { return this.mType; } public void setExtra(String str) { this.mExtra = str; } public void setType(int i15) { this.mType = i15; } } public interface PreInitCallback { void onCoreInitFailed(); void onCoreInitFinished(); } public static abstract class VisualStateCallback { public abstract void onComplete(long j15); } public enum WebViewKind { WV_KIND_NONE, WV_KIND_CW, WV_KIND_X5, WV_KIND_SYS, WV_KIND_PINUS } public class WebViewTransport { private WebView mWebview; public WebViewTransport() { } public synchronized WebView getWebView() { return this.mWebview; } public synchronized void setWebView(WebView webView) { this.mWebview = webView; } } public WebView(Context context) { this(context, null); } public static void clearClientCertPreferences(Runnable runnable) { IWebViewProvider webViewProvider = WebViewWrapperFactory.getWebViewProvider(getCurrentModuleWebCoreType()); if (webViewProvider != null) { webViewProvider.clearClientCertPreferences(runnable); return; } XWebLog.e(TAG, "need init first clearClientCertPreferences error, getCurWebType:" + getCurrentModuleWebCoreType()); } private void createWebView(WebViewKind webViewKind) { XWebLog.addInitializeLog(TAG, "createWebView start, prefer type:" + getCurrentModuleWebCoreType() + ", force type:" + webViewKind); XWalkEnvironment.ensureInitEnvironment(getContext()); WebViewKind webViewKind2 = this.mInstanceWebViewKind; WebViewKind webViewKind3 = WebViewKind.WV_KIND_NONE; if (webViewKind2 != webViewKind3) { this.mKVReportForWebView.setHasInitedWebView(true); XWebLog.addInitializeLog(TAG, "createWebView, already init, webview type:" + this.mInstanceWebViewKind); return; } if (XWebChildProcessMonitor.getShouldSwitchToSys()) { WebViewKind webViewKind4 = WebViewKind.WV_KIND_SYS; this.mInstanceWebViewKind = webViewKind4; this.mKVReportForWebView.setDowngradeReason("ChildProcessMonitor"); XWebLog.addInitializeLog(TAG, "createWebView, XWebChildProcessMonitor force to use sys"); tryInitWebViewCore(getContext(), webViewKind4); } else { WebViewKind webViewKind5 = WebViewKind.WV_KIND_SYS; if (webViewKind == webViewKind5) { this.mInstanceWebViewKind = webViewKind; this.mKVReportForWebView.setDowngradeReason("WebViewParam"); XWebLog.addInitializeLog(TAG, "createWebView, force to use sys by webview param"); tryInitWebViewCore(getContext(), webViewKind5); } else if (getCurrentModuleWebCoreType() == webViewKind3) { this.mKVReportForWebView.setHasInitedWebViewCore(false); WebViewKind preferedWebviewType = getPreferedWebviewType(initModuleNameBeforeInitWebViewCore()); XWebLog.addInitializeLog(TAG, "createWebView, not init core, use prefer type:" + preferedWebviewType); if (preferedWebviewType != webViewKind3) { this.mInstanceWebViewKind = preferedWebviewType; if (tryInitWebViewCore(getContext(), this.mInstanceWebViewKind) && isXWebKernel()) { sProcessWebViewKind = this.mInstanceWebViewKind; XWebLog.i(TAG, "createWebView, sProcessWebViewKind:" + sProcessWebViewKind); } } else { this.mKVReportForWebView.setDowngradeReason("NonePreferWebViewKind"); this.mInstanceWebViewKind = webViewKind5; tryInitWebViewCore(getContext(), webViewKind5); } } else { this.mInstanceWebViewKind = getCurrentModuleWebCoreType(); } } this.mKVReportForWebView.setModule(getModuleName()); this.mKVReportForWebView.startCreatePreferredWebView(this.mInstanceWebViewKind.ordinal()); XWebLog.addInitializeLog(TAG, "createWebView, try create webview type:" + this.mInstanceWebViewKind); IWebView webView = WebViewWrapperFactory.getWebView(this.mInstanceWebViewKind, this); this.mWebViewWrapper = webView; if (webView == null) { this.mKVReportForWebView.finishCreatePreferredWebView(2); this.mKVReportForWebView.startCreateOtherWebView(); XWebLog.addInitializeLog(TAG, "createWebView failed, try other webview types"); WebViewKind[] webViewKindList = getWebViewKindList(); int i15 = 0; while (true) { if (i15 >= webViewKindList.length) { break; } if (webViewKindList[i15] != this.mInstanceWebViewKind && initWebviewCore(getContext(), webViewKindList[i15], (PreInitCallback) null, false)) { IWebView webView2 = WebViewWrapperFactory.getWebView(webViewKindList[i15], this); this.mWebViewWrapper = webView2; if (webView2 != null) { this.mInstanceWebViewKind = getCurrentModuleWebCoreType(); break; } } i15++; } if (this.mWebViewWrapper != null) { this.mKVReportForWebView.finishCreateOtherWebView(1, this.mInstanceWebViewKind.ordinal()); } else { this.mKVReportForWebView.finishCreateOtherWebView(2, 0); XWebLog.e(TAG, "createWebView failed finally"); WXWebReporter.onCreateWebviewFailedFinally(); throw new CreateWebViewException("create webview instance failed"); } } else { this.mKVReportForWebView.finishCreatePreferredWebView(1); } this.mKVReportForWebView.startInitFinalWebView(this.mInstanceWebViewKind.ordinal()); addView(this.mWebViewWrapper.getWebViewUI()); XWebLog.i(TAG, "createWebView success, webview type:" + this.mInstanceWebViewKind); this.mWebViewWrapper.getView().setOnLongClickListener(new View.OnLongClickListener() { /* class com.tencent.xweb.WebView.AnonymousClass1 */ private byte _hellAccFlag_; public boolean onLongClick(View view) { ArrayList arrayList = new ArrayList(); arrayList.add(view); Object[] array = arrayList.toArray(); arrayList.clear(); a.b("com/tencent/xweb/WebView$1", "android/view/View$OnLongClickListener", "onLongClick", "(Landroid/view/View;)Z", this, array); if (WebView.this.mOnLongClickListener != null) { boolean onLongClick = WebView.this.mOnLongClickListener.onLongClick(WebView.this); a.h(onLongClick, this, "com/tencent/xweb/WebView$1", "android/view/View$OnLongClickListener", "onLongClick", "(Landroid/view/View;)Z"); return onLongClick; } a.h(false, this, "com/tencent/xweb/WebView$1", "android/view/View$OnLongClickListener", "onLongClick", "(Landroid/view/View;)Z"); return false; } }); initDebugView(); initRemoteDebug(); if (isXWebKernel()) { Context context = getContext(); if (context instanceof WebViewContextWrapper) { ((WebViewContextWrapper) context).setBindedWebview(this.mWebViewWrapper); } } String userAgentString = getSettings().getUserAgentString(); getSettings().setUserAgentString(userAgentString + " MMWEBID/" + XWebGrayValueUtil.getGrayValue()); WebViewCounter.increase(); this.mKVReportForWebView.finishInitFinalWebView(); } public static String findAddress(String str) { IWebViewProvider webViewProvider = WebViewWrapperFactory.getWebViewProvider(getCurrentModuleWebCoreType()); if (webViewProvider != null) { return webViewProvider.findAddress(str); } XWebLog.e(TAG, "need init first findAddress error, getCurWebType:" + getCurrentModuleWebCoreType()); return ""; } private List<TextureView> getAllTextureViews(View view) { ArrayList arrayList = new ArrayList(); if (view instanceof TextureView) { arrayList.add((TextureView) view); } else if (view instanceof ViewGroup) { ViewGroup viewGroup = (ViewGroup) view; for (int i15 = 0; i15 < viewGroup.getChildCount(); i15++) { arrayList.addAll(getAllTextureViews(viewGroup.getChildAt(i15))); } } return arrayList; } public static WebViewKind getCurrentModuleWebCoreType() { return sProcessWebViewKind; } public static String getModuleName() { return sStrModule; } private static WebViewKind getPreferedWebviewType(String str) { return getPreferedWebviewType(sDefaultWebViewKind, str); } private static WebViewKind[] getWebViewKindList() { String[] split; String cmd = CommandCfg.getInstance().getCmd(CommandDef.COMMAND_WEBVIEW_KIND_LIST, getModuleName()); if (cmd == null || cmd.equalsIgnoreCase("") || (split = cmd.split(",")) == null || split.length <= 0) { return new WebViewKind[]{WebViewKind.WV_KIND_PINUS, WebViewKind.WV_KIND_SYS}; } WebViewKind[] webViewKindArr = new WebViewKind[split.length]; for (int i15 = 0; i15 < split.length; i15++) { WebViewKind convertWebType = CommandCfg.getInstance().convertWebType(split[i15]); if (convertWebType != WebViewKind.WV_KIND_NONE) { webViewKindArr[i15] = convertWebType; } else { XWebLog.w(TAG, "getWebViewKindList, error config:" + cmd); return new WebViewKind[0]; } } XWebLog.i(TAG, "getWebViewKindList:" + Arrays.toString(webViewKindArr)); return webViewKindArr; } @DeprecatedOutsideXWebSdk @Deprecated public static boolean hasInited() { if (getCurrentModuleWebCoreType() == WebViewKind.WV_KIND_NONE) { XWebLog.i(TAG, "hasInited false, current webview type is NONE"); return false; } IWebViewProvider webViewProvider = WebViewWrapperFactory.getWebViewProvider(getCurrentModuleWebCoreType()); if (webViewProvider != null) { return webViewProvider.hasInitedWebViewCore(); } XWebLog.i(TAG, "hasInited false, current webview provider is null"); return false; } private void initDebugView() { try { this.mDebugView = (IDebugView) WebViewWrapperFactory.getXWebViewProvider().execute(ConstValue.STR_CMD_GET_DEBUG_VIEW, new Object[]{this}); } catch (Throwable th5) { XWebLog.e(TAG, "initDebugView, create dummy one, error", th5); this.mDebugView = new DummyDebugView(); } } private static String initModuleName(String str) { if (str == null || str.isEmpty()) { str = "tools"; } sStrModule = str; WXWebReporter.setCurrentModule(str); return str; } private String initModuleNameBeforeInitWebViewCore() { return initModuleName(XWalkEnvironment.getSafeModuleName("tools")); } private static void initRemoteDebug() { boolean enableRemoteDebug = WebDebugCfg.getInst().getEnableRemoteDebug(); XWebLog.i(TAG, "initRemoteDebug, enableRemoteDebug:" + enableRemoteDebug + ", testMode:" + XWalkEnvironment.getBuildConfigXWebTestMode()); if (enableRemoteDebug || XWalkEnvironment.getBuildConfigXWebTestMode()) { XWebSdk.setEnableRemoteDebug(true); } } @DeprecatedOutsideXWebSdk @Deprecated public static synchronized void initWebviewCore(Context context, WebViewKind webViewKind, String str, PreInitCallback preInitCallback) { synchronized (WebView.class) { XWebLog.addInitializeLog(TAG, "initWebviewCore start, kind:" + webViewKind + ", module:" + str); if (sProcessWebViewKind != WebViewKind.WV_KIND_NONE) { if (sProcessWebViewKind != webViewKind) { XWebLog.addInitializeLog(TAG, "initWebviewCore, set invalid webview kind:" + webViewKind + ", expected:" + sProcessWebViewKind); if (preInitCallback != null) { preInitCallback.onCoreInitFailed(); } } else { XWebLog.addInitializeLog(TAG, "initWebviewCore, already init webview kind:" + webViewKind); if (preInitCallback != null) { preInitCallback.onCoreInitFinished(); } } return; } KVReportForWebViewCore kVReportForWebViewCore = sKVReportForWebViewCore; kVReportForWebViewCore.startInitWebViewCore(); String initModuleName = initModuleName(str); XWalkEnvironment.ensureInitEnvironment(context); int availableVersion = XWalkEnvironment.getAvailableVersion(); XWebLog.addInitializeLog(TAG, "initWebviewCore, availableVersion:" + availableVersion); if (availableVersion <= 0) { XWebUpdater.tryEmbedInstall(); } else { int embedCoreVersion = WebViewWrapperFactory.getEmbedCoreVersion(); XWebLog.addInitializeLog(TAG, "initWebviewCore, embedVersion:" + embedCoreVersion); if (availableVersion < embedCoreVersion) { XWebUpdater.tryEmbedInstall(); } } kVReportForWebViewCore.finishInitWebViewCore(initWebviewCore(context, getPreferedWebviewType(webViewKind, initModuleName), preInitCallback, true), sProcessWebViewKind.ordinal(), initModuleName); XWebLog.w(TAG, "###### initWebviewCore costTime:" + kVReportForWebViewCore.getInitWebViewCoreCostTime() + ", stack:" + Log.getStackTraceString(new Throwable("please ignore this exception"))); } } public static boolean isPinus() { return sProcessWebViewKind == WebViewKind.WV_KIND_PINUS; } @DeprecatedOutsideXWebSdk @Deprecated public static boolean isSys() { return sProcessWebViewKind == WebViewKind.WV_KIND_SYS; } @DeprecatedOutsideXWebSdk @Deprecated public static boolean isXWeb() { return sProcessWebViewKind == WebViewKind.WV_KIND_PINUS; } @DeprecatedOutsideXWebSdk @Deprecated public static boolean isXWebCoreInited() { return sXWebCoreInited; } @DeprecatedOutsideXWebSdk @Deprecated public static boolean needRebootProcess() { if (sIsWaitForInstallXWeb && XWebCoreInfo.getInstalledNewestVersionForCurAbi(XWalkEnvironment.getApplicationContext()) > 0) { XWebLog.i(TAG, "needRebootProcess, true because of has installed xweb core"); return true; } else if (!isXWeb() || XWalkEnvironment.getAvailableVersion() <= 0 || XWalkEnvironment.getInstalledNewstVersionForCurAbi() <= XWalkEnvironment.getAvailableVersion()) { return false; } else { XWebLog.i(TAG, "needRebootProcess, true because of has newer xweb version"); return true; } } public static void onXWebCoreInited() { sXWebCoreInited = true; } private static void reinitToPinus() { XWebLog.addInitializeLog(TAG, "reinitToPinus"); sProcessWebViewKind = WebViewKind.WV_KIND_NONE; XWalkEnvironment.refreshVersionInfo(); initWebviewCore(XWalkEnvironment.getApplicationContext(), WebViewKind.WV_KIND_PINUS, sStrModule, (PreInitCallback) null); WXWebReporter.idkeyReport(1749, 66, 1); } public static void reinitToXWeb() { WebViewKind webViewKindFromInstalledNewstVersion = XWalkEnvironment.getWebViewKindFromInstalledNewstVersion(XWalkEnvironment.getApplicationContext()); XWebLog.addInitializeLog(TAG, "reinitToXWeb, webViewKind:" + webViewKindFromInstalledNewstVersion); if (webViewKindFromInstalledNewstVersion == WebViewKind.WV_KIND_PINUS) { reinitToPinus(); } } private static Context replaceContextWrapperForWebViewConstructorIfNeed(Context context) { if (context instanceof MutableContextWrapper) { return new WebViewContextWrapper(((MutableContextWrapper) context).getBaseContext()); } return context; } private static boolean tryInitWebViewCore(Context context, WebViewKind webViewKind) { boolean z15; WebViewKind webViewKindFromAvailableVersion; XWebLog.addInitializeLog(TAG, "tryInitWebViewCore start, type:" + webViewKind); if ((webViewKind == WebViewKind.WV_KIND_CW || webViewKind == WebViewKind.WV_KIND_PINUS) && (webViewKindFromAvailableVersion = XWalkEnvironment.getWebViewKindFromAvailableVersion()) != WebViewKind.WV_KIND_NONE && webViewKind != webViewKindFromAvailableVersion) { XWebLog.addInitializeLog(TAG, "tryInitWebViewCore, type:" + webViewKind + ", but actual type:" + webViewKindFromAvailableVersion); return false; } else if (CrashWatchDog.hasRecentCrash(webViewKind)) { XWebLog.addInitializeLog(TAG, "tryInitWebViewCore, has recent crash"); WXWebReporter.onJustCrashed(webViewKind); return false; } else { CrashWatchDog instanceForCurModule = CrashWatchDog.getInstanceForCurModule(CrashWatchDog.SCENE_LOAD_CORE, webViewKind); instanceForCurModule.logStart(); try { IWebViewProvider webViewProvider = WebViewWrapperFactory.getWebViewProvider(webViewKind); if (webViewProvider != null) { z15 = webViewProvider.initWebviewCore(context, null); if (z15) { CookieManager.getInstance().setCookieManagerWrapper(webViewProvider.getCookieManager()); XWebLog.addInitializeLog(TAG, "tryInitWebViewCore success"); WXWebReporter.onWebviewCoreUsed(webViewKind); instanceForCurModule.logFinished(); return z15; } } else { z15 = false; } XWebLog.addInitializeLog(TAG, "tryInitWebViewCore failed"); return z15; } catch (Throwable th5) { WXWebReporter.onInitCoreFailed(webViewKind); String stackTraceString = Log.getStackTraceString(th5); XWebLog.addInitializeLog(TAG, "tryInitWebViewCore failed, type:" + webViewKind + ", error:" + stackTraceString); KVReportForCrash.report(1, stackTraceString, webViewKind.ordinal()); return false; } } } @Override // com.tencent.xweb.internal.IWebView public int addDocumentStartJavaScript(String str, String[] strArr) { return this.mWebViewWrapper.addDocumentStartJavaScript(str, strArr); } @Override // com.tencent.xweb.internal.IWebView public void addJavascriptInterface(Object obj, String str) { this.mWebViewWrapper.addJavascriptInterface(obj, str); } @Override // com.tencent.xweb.internal.IWebView public boolean canGoBack() { return this.mWebViewWrapper.canGoBack(); } @Override // com.tencent.xweb.internal.IWebView public boolean canGoBackOrForward(int i15) { return this.mWebViewWrapper.canGoBackOrForward(i15); } @Override // com.tencent.xweb.internal.IWebView public boolean canGoForward() { return this.mWebViewWrapper.canGoForward(); } @Deprecated public boolean canZoomIn() { return false; } @Deprecated public boolean canZoomOut() { return false; } @Override // com.tencent.xweb.internal.IWebView public void captureBitmap(IWebView.ICaptureBitmapCallback iCaptureBitmapCallback) { this.mWebViewWrapper.captureBitmap(iCaptureBitmapCallback); } @Deprecated public Picture capturePicture() { return null; } @Override // com.tencent.xweb.internal.IWebView public void clearCache(boolean z15) { this.mWebViewWrapper.clearCache(z15); } @Override // com.tencent.xweb.internal.IWebView public void clearHistory() { this.mWebViewWrapper.clearHistory(); } @Override // com.tencent.xweb.internal.IWebView public void clearMatches() { this.mWebViewWrapper.clearMatches(); } @Override // com.tencent.xweb.internal.IWebView public void clearSslPreferences() { this.mWebViewWrapper.clearSslPreferences(); } @Override // com.tencent.xweb.internal.IWebView public void clearView() { this.mWebViewWrapper.clearView(); } @Override // com.tencent.xweb.internal.IWebView public WebBackForwardList copyBackForwardList() { return this.mWebViewWrapper.copyBackForwardList(); } @Deprecated public PrintDocumentAdapter createPrintDocumentAdapter() { return null; } @Override // com.tencent.xweb.internal.IWebView public PrintDocumentAdapter createPrintDocumentAdapter(String str) { return this.mWebViewWrapper.createPrintDocumentAdapter(str); } @Override // com.tencent.xweb.internal.IWebView public WebMessagePort[] createWebMessageChannel() { return this.mWebViewWrapper.createWebMessageChannel(); } @Override // com.tencent.xweb.internal.IWebView public void destroy() { Context context = getContext(); if (context instanceof WebViewContextWrapper) { ((WebViewContextWrapper) context).setBindedWebview(null); } this.mWebViewWrapper.destroy(); if (!this.mHasDestroyed) { this.mHasDestroyed = true; WebViewCounter.decrease(); } } @Override // com.tencent.xweb.internal.IWebView public void disablePlatformNotifications() { this.mWebViewWrapper.disablePlatformNotifications(); } @Override // com.tencent.xweb.internal.IWebView public void disableVideoJsCallback(boolean z15) { this.mWebViewWrapper.disableVideoJsCallback(z15); } public void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); } @Override // com.tencent.xweb.internal.IWebView public void documentHasImages(Message message) { this.mWebViewWrapper.documentHasImages(message); } public void drawCanvas(Canvas canvas) { if (isXWebKernel()) { canvas.drawBitmap(getBitmap(), 0.0f, 0.0f, (Paint) null); } else { draw(canvas); } } public boolean drawChild(Canvas canvas, View view, long j15) { try { return super.drawChild(canvas, view, j15); } catch (Throwable th5) { XWebLog.w(TAG, "drawChild error:" + Log.getStackTraceString(th5)); return false; } } @Override // com.tencent.xweb.internal.IWebView public void enablePlatformNotifications() { this.mWebViewWrapper.enablePlatformNotifications(); } @Override // com.tencent.xweb.internal.IWebView public void evaluateJavascript(String str, ValueCallback<String> valueCallback) { this.mWebViewWrapper.evaluateJavascript(str, valueCallback); } @Deprecated public int findAll(String str) { findAllAsync(str); return 0; } @Override // com.tencent.xweb.internal.IWebView public void findAllAsync(String str) { this.mWebViewWrapper.findAllAsync(str); } @Override // com.tencent.xweb.internal.IWebView public void findNext(boolean z15) { this.mWebViewWrapper.findNext(z15); } @Override // com.tencent.xweb.internal.IWebView public void flingScroll(int i15, int i16) { this.mWebViewWrapper.flingScroll(i15, i16); } @Override // com.tencent.xweb.internal.IWebView public String getAbstractInfo() { return this.mWebViewWrapper.getAbstractInfo(); } public Bitmap getBitmap() { Bitmap createBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); if (createBitmap != null) { createBitmap.eraseColor(-1); Canvas canvas = new Canvas(createBitmap); if (isXWebKernel()) { try { Paint paint = new Paint(); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER)); for (TextureView textureView : getAllTextureViews(this)) { Bitmap bitmap = textureView.getBitmap(); if (bitmap != null) { canvas.drawBitmap(bitmap, 0.0f, 0.0f, paint); } else { XWebLog.e(TAG, "getBitmap, textureViewBitmap = null"); } } Bitmap createBitmap2 = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); getTopView().draw(new Canvas(createBitmap2)); canvas.drawBitmap(createBitmap2, 0.0f, 0.0f, paint); } catch (Throwable th5) { XWebLog.e(TAG, "getBitmap, error", th5); } } else { draw(canvas); } } return createBitmap; } @Override // com.tencent.xweb.internal.IWebView public SslCertificate getCertificate() { return this.mWebViewWrapper.getCertificate(); } @Override // com.tencent.xweb.internal.IWebView public int getContentHeight() { return this.mWebViewWrapper.getContentHeight(); } @Override // com.tencent.xweb.internal.IWebView public ICookieManager getCookieManager() { return null; } public WebViewKind getCurrentInstanceWebCoreType() { return this.mInstanceWebViewKind; } public IDebugView getDebugView() { return this.mDebugView; } @Override // com.tencent.xweb.internal.IWebView public Bitmap getFavicon() { return this.mWebViewWrapper.getFavicon(); } @Override // com.tencent.xweb.internal.IWebView public FullscreenVideoKind getFullscreenVideoKind() { return this.mWebViewWrapper.getFullscreenVideoKind(); } @Override // com.tencent.xweb.internal.IWebView public HitTestResult getHitTestResult() { return this.mWebViewWrapper.getHitTestResult(); } @Override // com.tencent.xweb.internal.IWebView public String[] getHttpAuthUsernamePassword(String str, String str2) { return this.mWebViewWrapper.getHttpAuthUsernamePassword(str, str2); } @Override // com.tencent.xweb.internal.IWebView public boolean getImageBitmapToFile(String str, String str2, String str3, GetImageBitmapToFileFinishedCallback getImageBitmapToFileFinishedCallback) { return this.mWebViewWrapper.getImageBitmapToFile(str, str2, str3, getImageBitmapToFileFinishedCallback); } @Override // com.tencent.xweb.internal.IWebView public String getOriginalUrl() { return this.mWebViewWrapper.getOriginalUrl(); } @Override // com.tencent.xweb.internal.IWebView public int getProgress() { return this.mWebViewWrapper.getProgress(); } @Override // com.tencent.xweb.internal.IWebView public float getScale() { return this.mWebViewWrapper.getScale(); } @Override // com.tencent.xweb.internal.IWebView public int getScrollHeight() { return this.mWebViewWrapper.getScrollHeight(); } @Override // com.tencent.xweb.internal.IWebView public WebSettings getSettings() { return this.mWebViewWrapper.getSettings(); } @Override // com.tencent.xweb.internal.IWebView public TextClassifier getTextClassifier() { return this.mWebViewWrapper.getTextClassifier(); } @Override // com.tencent.xweb.internal.IWebView public String getTitle() { return this.mWebViewWrapper.getTitle(); } @Override // com.tencent.xweb.internal.IWebView public ViewGroup getTopView() { return this.mWebViewWrapper.getTopView(); } @Override // com.tencent.xweb.internal.IWebView public String getUrl() { return this.mWebViewWrapper.getUrl(); } @Override // com.tencent.xweb.internal.IWebView public String getVersionInfo() { return this.mWebViewWrapper.getVersionInfo(); } @Override // com.tencent.xweb.internal.IWebView public View getView() { return this.mWebViewWrapper.getView(); } @Override // com.tencent.xweb.internal.IWebView public int getVisibleTitleHeight() { return this.mWebViewWrapper.getVisibleTitleHeight(); } @Override // com.tencent.xweb.internal.IWebView public WebChromeClient getWebChromeClient() { return this.mWebViewWrapper.getWebChromeClient(); } @Override // com.tencent.xweb.internal.IWebView public int getWebScrollX() { return this.mWebViewWrapper.getWebScrollX(); } @Override // com.tencent.xweb.internal.IWebView public int getWebScrollY() { return this.mWebViewWrapper.getWebScrollY(); } @Override // com.tencent.xweb.internal.IWebView public WebViewCallbackClient getWebViewCallbackClient() { return this.mWebViewWrapper.getWebViewCallbackClient(); } @Override // com.tencent.xweb.internal.IWebView public WebViewClient getWebViewClient() { return this.mWebViewWrapper.getWebViewClient(); } @Override // com.tencent.xweb.internal.IWebView public Looper getWebViewLooper() { return this.mWebViewWrapper.getWebViewLooper(); } @Override // com.tencent.xweb.internal.IWebView public WebViewRenderProcessClient getWebViewRenderProcessClient() { return this.mWebViewWrapper.getWebViewRenderProcessClient(); } @Override // com.tencent.xweb.internal.IWebView public View getWebViewUI() { return this.mWebViewWrapper.getWebViewUI(); } @Override // com.tencent.xweb.internal.IWebView public void goBack() { this.mWebViewWrapper.goBack(); } @Override // com.tencent.xweb.internal.IWebView public void goBackOrForward(int i15) { this.mWebViewWrapper.goBackOrForward(i15); } @Override // com.tencent.xweb.internal.IWebView public void goForward() { this.mWebViewWrapper.goForward(); } @Override // com.tencent.xweb.internal.IWebView public boolean hasEnteredFullscreen() { return this.mWebViewWrapper.hasEnteredFullscreen(); } @Override // com.tencent.xweb.internal.IWebView public Bundle invokeMiscMethod(String str, Bundle bundle) { return this.mWebViewWrapper.invokeMiscMethod(str, bundle); } @Override // com.tencent.xweb.internal.IWebView public boolean isOverScrollStart() { return this.mWebViewWrapper.isOverScrollStart(); } public boolean isSysKernel() { return this.mInstanceWebViewKind == WebViewKind.WV_KIND_SYS; } @Deprecated public boolean isXWalkKernel() { return this.mInstanceWebViewKind == WebViewKind.WV_KIND_PINUS; } public boolean isXWebKernel() { return this.mInstanceWebViewKind == WebViewKind.WV_KIND_PINUS; } @Override // com.tencent.xweb.internal.IWebView public void leaveFullscreen() { this.mWebViewWrapper.leaveFullscreen(); } @Override // com.tencent.xweb.internal.IWebView public void loadData(String str, String str2, String str3) { this.mWebViewWrapper.loadData(str, str2, str3); WXWebReporter.reportPVNew(str, this); } @Override // com.tencent.xweb.internal.IWebView public void loadDataWithBaseURL(String str, String str2, String str3, String str4, String str5) { this.mWebViewWrapper.loadDataWithBaseURL(str, str2, str3, str4, str5); WXWebReporter.reportPVNew(str, this); } @Override // com.tencent.xweb.internal.IWebView public void loadUrl(String str, Map<String, String> map) { if (this.mDebugView.onInterceptTestUrl(str)) { this.mWebViewWrapper.loadUrl("http://weixin.qq.com/"); return; } HashMap hashMap = null; if (map != null) { synchronized (map) { hashMap = new HashMap(); hashMap.putAll(map); } } this.mWebViewWrapper.loadUrl(str, hashMap); WXWebReporter.reportPVNew(str, this); } @Override // com.tencent.xweb.internal.IWebView public void onHide() { this.mWebViewWrapper.onHide(); } @Override // com.tencent.xweb.internal.IWebView public void onPause() { this.mWebViewWrapper.onPause(); } @Override // com.tencent.xweb.internal.IWebView public void onResume() { this.mWebViewWrapper.onResume(); } @Override // com.tencent.xweb.internal.IWebView public void onShow() { this.mWebViewWrapper.onShow(); } public void onVisibilityChanged(View view, int i15) { super.onVisibilityChanged(view, i15); IWebView iWebView = this.mWebViewWrapper; if (iWebView != null) { View view2 = iWebView.getView(); k30.a aVar = new k30.a(); ThreadLocal<k30.a> threadLocal = c.f244265a; aVar.c(Integer.valueOf(i15)); a.d(view2, aVar.b(), "com/tencent/xweb/WebView", "onVisibilityChanged", "(Landroid/view/View;I)V", "android/view/View_EXEC_", "setVisibility", "(I)V"); view2.setVisibility(((Integer) aVar.a(0)).intValue()); a.e(view2, "com/tencent/xweb/WebView", "onVisibilityChanged", "(Landroid/view/View;I)V", "android/view/View_EXEC_", "setVisibility", "(I)V"); } } public void onWebViewScrollChanged(int i15, int i16, int i17, int i18) { } @Override // com.tencent.xweb.internal.IWebView public boolean overlayHorizontalScrollbar() { return this.mWebViewWrapper.overlayHorizontalScrollbar(); } @Override // com.tencent.xweb.internal.IWebView public boolean overlayVerticalScrollbar() { return this.mWebViewWrapper.overlayVerticalScrollbar(); } @Override // com.tencent.xweb.internal.IWebView public boolean pageDown(boolean z15) { return this.mWebViewWrapper.pageDown(z15); } @Override // com.tencent.xweb.internal.IWebView public boolean pageUp(boolean z15) { return this.mWebViewWrapper.pageUp(z15); } @Override // com.tencent.xweb.internal.IWebView public void pauseTimers() { this.mWebViewWrapper.pauseTimers(); } @Override // com.tencent.xweb.internal.IWebView public void postUrl(String str, byte[] bArr) { this.mWebViewWrapper.postUrl(str, bArr); } @Override // com.tencent.xweb.internal.IWebView public void postVisualStateCallback(long j15, VisualStateCallback visualStateCallback) { this.mWebViewWrapper.postVisualStateCallback(j15, visualStateCallback); } @Override // com.tencent.xweb.internal.IWebView public void postWebMessage(WebMessage webMessage, Uri uri) { this.mWebViewWrapper.postWebMessage(webMessage, uri); } @Override // com.tencent.xweb.internal.IWebView public void reload() { this.mWebViewWrapper.reload(); } @Override // com.tencent.xweb.internal.IWebView public void removeDocumentStartJavaScript(int i15) { this.mWebViewWrapper.removeDocumentStartJavaScript(i15); } @Override // com.tencent.xweb.internal.IWebView public void removeJavascriptInterface(String str) { this.mWebViewWrapper.removeJavascriptInterface(str); } @Override // com.tencent.xweb.internal.IWebView public void requestFocusNodeHref(Message message) { this.mWebViewWrapper.requestFocusNodeHref(message); } @Override // com.tencent.xweb.internal.IWebView public void requestImageRef(Message message) { this.mWebViewWrapper.requestImageRef(message); } @Override // com.tencent.xweb.internal.IWebView public WebBackForwardList restoreState(Bundle bundle) { return this.mWebViewWrapper.restoreState(bundle); } @Override // com.tencent.xweb.internal.IWebView public void resumeTimers() { this.mWebViewWrapper.resumeTimers(); } @Override // com.tencent.xweb.internal.IWebView public boolean savePage(String str, String str2, int i15) { return this.mWebViewWrapper.savePage(str, str2, i15); } @Override // com.tencent.xweb.internal.IWebView public WebBackForwardList saveState(Bundle bundle) { return this.mWebViewWrapper.saveState(bundle); } @Override // com.tencent.xweb.internal.IWebView public void saveWebArchive(String str) { this.mWebViewWrapper.saveWebArchive(str); } public void setBackgroundColor(int i15) { XWebLog.i(TAG, "setBackgroundColor, color:" + Integer.toHexString(i15)); super.setBackgroundColor(i15); IWebView iWebView = this.mWebViewWrapper; if (iWebView != null) { iWebView.getWebViewUI().setBackgroundColor(i15); } } @Override // com.tencent.xweb.internal.IWebView public void setBottomHeight(int i15) { this.mWebViewWrapper.setBottomHeight(i15); } @Override // com.tencent.xweb.internal.IWebView public void setDownloadListener(DownloadListener downloadListener) { this.mWebViewWrapper.setDownloadListener(downloadListener); } @Override // com.tencent.xweb.internal.IWebView public void setFindListener(WebView.FindListener findListener) { this.mWebViewWrapper.setFindListener(findListener); } @Override // android.view.View public void setFocusable(boolean z15) { if (!z15) { setDescendantFocusability(393216); super.setFocusable(false); return; } setDescendantFocusability(131072); super.setFocusable(false); } public void setFocusableInTouchMode(boolean z15) { if (!z15) { setDescendantFocusability(393216); super.setFocusableInTouchMode(false); return; } setDescendantFocusability(131072); super.setFocusableInTouchMode(false); } @Override // com.tencent.xweb.internal.IWebView public void setHorizontalScrollBarEnabled(boolean z15) { this.mWebViewWrapper.setHorizontalScrollBarEnabled(z15); } @Override // com.tencent.xweb.internal.IWebView public void setHorizontalScrollbarOverlay(boolean z15) { this.mWebViewWrapper.setHorizontalScrollbarOverlay(z15); } @Override // com.tencent.xweb.internal.IWebView public void setHttpAuthUsernamePassword(String str, String str2, String str3, String str4) { this.mWebViewWrapper.setHttpAuthUsernamePassword(str, str2, str3, str4); } @Override // com.tencent.xweb.internal.IWebView public void setInitialScale(int i15) { this.mWebViewWrapper.setInitialScale(i15); } @Override // com.tencent.xweb.internal.IWebView public void setJSExceptionListener(WebViewJSExceptionListener webViewJSExceptionListener) { this.mWebViewWrapper.setJSExceptionListener(webViewJSExceptionListener); } @Override // com.tencent.xweb.internal.IWebView public void setNetworkAvailable(boolean z15) { this.mWebViewWrapper.setNetworkAvailable(z15); } public void setOnLongClickListener(View.OnLongClickListener onLongClickListener) { this.mOnLongClickListener = onLongClickListener; } public void setOnTouchListener(View.OnTouchListener onTouchListener) { this.mWebViewWrapper.getWebViewUI().setOnTouchListener(onTouchListener); } @Override // com.tencent.xweb.internal.IWebView @Deprecated public void setPictureListener(WebView.PictureListener pictureListener) { this.mWebViewWrapper.setPictureListener(pictureListener); } @Override // com.tencent.xweb.internal.IWebView public void setTextClassifier(TextClassifier textClassifier) { this.mWebViewWrapper.setTextClassifier(textClassifier); } @Override // com.tencent.xweb.internal.IWebView public void setVerticalScrollBarEnabled(boolean z15) { this.mWebViewWrapper.setVerticalScrollBarEnabled(z15); } @Override // com.tencent.xweb.internal.IWebView public void setVerticalScrollbarOverlay(boolean z15) { this.mWebViewWrapper.setVerticalScrollbarOverlay(z15); } @Override // com.tencent.xweb.internal.IWebView public VideoControl setVideoJsCallback(VideoJsCallback videoJsCallback) { return this.mWebViewWrapper.setVideoJsCallback(videoJsCallback); } @Override // com.tencent.xweb.internal.IWebView public void setWebChromeClient(WebChromeClient webChromeClient) { this.mWebViewWrapper.setWebChromeClient(webChromeClient); } @Override // com.tencent.xweb.internal.IWebView public void setWebContentsSize(int i15, int i16) { this.mWebViewWrapper.setWebContentsSize(i15, i16); } @Override // com.tencent.xweb.internal.IWebView public void setWebViewCallbackClient(WebViewCallbackClient webViewCallbackClient) { this.mWebViewWrapper.setWebViewCallbackClient(webViewCallbackClient); } @Override // com.tencent.xweb.internal.IWebView public void setWebViewClient(WebViewClient webViewClient) { this.mWebViewWrapper.setWebViewClient(webViewClient); } @Override // com.tencent.xweb.internal.IWebView public void setWebViewClientExtension(ProxyWebViewClientExtension proxyWebViewClientExtension) { this.mWebViewWrapper.setWebViewClientExtension(proxyWebViewClientExtension); } @Override // com.tencent.xweb.internal.IWebView public void setWebViewRenderProcessClient(Executor executor, WebViewRenderProcessClient webViewRenderProcessClient) { this.mWebViewWrapper.setWebViewRenderProcessClient(executor, webViewRenderProcessClient); } @Override // com.tencent.xweb.internal.IWebView public void setXWebKeyEventHandler(XWebKeyEventHandler xWebKeyEventHandler) { this.mWebViewWrapper.setXWebKeyEventHandler(xWebKeyEventHandler); } @Override // com.tencent.xweb.internal.IWebView public void smoothScroll(int i15, int i16, long j15) { this.mWebViewWrapper.smoothScroll(i15, i16, j15); } @Override // com.tencent.xweb.internal.IWebView public void stopLoading() { this.mWebViewWrapper.stopLoading(); } @Override // com.tencent.xweb.internal.IWebView public boolean supportFeature(int i15) { return this.mWebViewWrapper.supportFeature(i15); } @Override // com.tencent.xweb.internal.IWebView public boolean supportSetWebContentsSize() { return this.mWebViewWrapper.supportSetWebContentsSize(); } @Override // com.tencent.xweb.internal.IWebView public void zoomBy(float f15) { this.mWebViewWrapper.zoomBy(f15); } @Override // com.tencent.xweb.internal.IWebView public boolean zoomIn() { return this.mWebViewWrapper.zoomIn(); } @Override // com.tencent.xweb.internal.IWebView public boolean zoomOut() { return this.mWebViewWrapper.zoomOut(); } public WebView(Context context, AttributeSet attributeSet) { this(context, attributeSet, 0); } public static WebViewKind getPreferedWebviewType(WebViewKind webViewKind, String str) { XWebLog.addInitializeLog(TAG, "getPreferedWebviewType start, kind:" + webViewKind + ", module:" + str); WebViewKind webViewKind2 = sProcessWebViewKind; WebViewKind webViewKind3 = WebViewKind.WV_KIND_NONE; if (webViewKind2 != webViewKind3) { XWebLog.addInitializeLog(TAG, "getPreferedWebviewType end, already get webview type:" + sProcessWebViewKind); return sProcessWebViewKind; } else if (AbiUtil.isIaDevice()) { XWebLog.addInitializeLog(TAG, "getPreferedWebviewType end, x86 device, use sys"); WXWebReporter.idkeyReport(69, 1); return WebViewKind.WV_KIND_SYS; } else { WebViewKind webViewKind4 = WebDebugCfg.getInst().getWebViewKind(str); if (webViewKind4 != webViewKind3) { XWebLog.addInitializeLog(TAG, "use hard code webview type:" + webViewKind4); webViewKind = webViewKind4; } else if (XWalkEnvironment.getBuildConfigForceXWebCore()) { webViewKind = sDefaultWebViewKind; XWebLog.addInitializeLog(TAG, "use compile config force to xweb"); } else if (CommandCfg.getInstance().getWebKind(str) != webViewKind3) { webViewKind = CommandCfg.getInstance().getWebKind(str); XWebLog.addInitializeLog(TAG, "use cmd config webview type:" + webViewKind); } WXWebReporter.setMostPrefferdCore(webViewKind); if ((webViewKind == WebViewKind.WV_KIND_CW || webViewKind == WebViewKind.WV_KIND_PINUS) && !XWalkEnvironment.hasAvailableVersion()) { webViewKind = WebViewKind.WV_KIND_SYS; sIsWaitForInstallXWeb = true; XWebLog.addInitializeLog(TAG, "xweb is not available, use sys"); } XWebLog.addInitializeLog(TAG, "getPreferedWebviewType end, final webview type:" + webViewKind); return webViewKind; } } @Override // com.tencent.xweb.internal.IWebView public Bitmap captureBitmap() { return this.mWebViewWrapper.captureBitmap(); } @Override // com.tencent.xweb.internal.IWebView public void saveWebArchive(String str, boolean z15, ValueCallback<String> valueCallback) { this.mWebViewWrapper.saveWebArchive(str, z15, valueCallback); } @Override // com.tencent.xweb.internal.IWebView public void setWebViewRenderProcessClient(WebViewRenderProcessClient webViewRenderProcessClient) { this.mWebViewWrapper.setWebViewRenderProcessClient(null, webViewRenderProcessClient); } public WebView(Context context, AttributeSet attributeSet, int i15) { this(context, attributeSet, i15, WebViewKind.WV_KIND_NONE); } public WebView(Context context, AttributeSet attributeSet, int i15, WebViewKind webViewKind) { super(replaceContextWrapperForWebViewConstructorIfNeed(context), attributeSet, i15); this.mInstanceWebViewKind = WebViewKind.WV_KIND_NONE; this.mHasDestroyed = false; KVReportForWebView kVReportForWebView = new KVReportForWebView(); this.mKVReportForWebView = kVReportForWebView; kVReportForWebView.startCreateWebView(); createWebView(webViewKind); kVReportForWebView.finishCreateWebView(1); XWebLog.w(TAG, "###### createWebView costTime:" + kVReportForWebView.getCreateWebViewCostTime() + ", stack:" + Log.getStackTraceString(new Throwable("please ignore this exception"))); } @Override // com.tencent.xweb.internal.IWebView public void loadUrl(String str) { if (this.mDebugView.onInterceptTestUrl(str)) { this.mWebViewWrapper.loadUrl("http://weixin.qq.com/"); return; } this.mWebViewWrapper.loadUrl(str); WXWebReporter.reportPVNew(str, this); } public static synchronized boolean initWebviewCore(Context context, WebViewKind webViewKind, PreInitCallback preInitCallback, boolean z15) { synchronized (WebView.class) { XWebLog.addInitializeLog(TAG, "initWebviewCore, kind:" + webViewKind + ", bTryOtherWebtype:" + z15); boolean tryInitWebViewCore = tryInitWebViewCore(context, webViewKind); if (!tryInitWebViewCore && z15) { XWebLog.w(TAG, "initWebviewCore failed, type:" + webViewKind + ", try other webview types"); WebViewKind[] webViewKindList = getWebViewKindList(); int i15 = 0; while (true) { if (i15 >= webViewKindList.length) { break; } WebViewKind webViewKind2 = webViewKindList[i15]; if (webViewKind2 != webViewKind) { tryInitWebViewCore = tryInitWebViewCore(context, webViewKind2); if (tryInitWebViewCore) { sProcessWebViewKind = webViewKindList[i15]; break; } } i15++; } } else if (tryInitWebViewCore) { sProcessWebViewKind = webViewKind; } if (!tryInitWebViewCore) { XWebLog.e(TAG, "initWebviewCore failed finally"); if (preInitCallback != null) { preInitCallback.onCoreInitFailed(); } WXWebReporter.onInitCoreFailedFinally(); return false; } if (preInitCallback != null) { preInitCallback.onCoreInitFinished(); } XWebLog.addInitializeLog(TAG, "initWebviewCore success, type:" + sProcessWebViewKind + ", sdkVer:" + XWebSdk.getXWebSdkVersion() + ", apkVer:" + XWalkEnvironment.getAvailableVersion()); return true; } } }