Android WebView中JavaScript覆盖层重定向显示异常排查
自定义WebView浏览器搜索结果覆盖层显示问题
我基于WebView实现了一款自定义浏览器,多数网站运行正常,但访问https://smittenkitchen.com/时出现关键问题:
- 首页加载显示正常;
- 输入搜索词(如“carrot”,对应地址
https://smittenkitchen.com/?s=carrot)后,先进入样式简陋的“搜索表单”页面,随后显示空白覆盖层(Logcat中无该覆盖层显示/重定向的记录); - 标准浏览器中执行相同操作,会在简陋搜索表单页显示0.5-2秒后,加载出填充搜索结果的覆盖层。
已排查的实现细节
我在MyWebViewClient中重写了以下方法:
onPageStartedonPageFinishedshouldOverrideUrlLoadingonPageCommitVisible
其中前3个方法仅输出Logcat日志,无自定义逻辑;仅onPageCommitVisible有自定义操作——调用WebView的loadUrl()执行一段JavaScript,将页面HTML传递给原生接口:
javascript:window.HTMLOUT.processHTML(document.getElementsByTagName('html')[0].innerHTML)
该接口通过以下代码注册:
webView.addJavascriptInterface(new MyJavascriptInterface(this, webView), "HTMLOUT");
注意:尽管页面有明显的内容切换,但Android WebView框架从未调用shouldOverrideUrlLoading(推测是客户端侧重定向,未修改URL)。
重写方法代码
@Override public void onPageStarted(WebView view, String url, Bitmap favicon) { Log.d("", "url: " + url + ", view: " + view.getUrl()); } @Override public void onPageFinished(WebView view, String url) { Log.d("", "url: " + url + ", view: " + view.getUrl()); } @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest webResourceRequest) { Log.d("", "webResourceRequest: " + webResourceRequest.getUrl() + ", view: " + view.getUrl()); return false; } @Override public void onPageCommitVisible(WebView view, String url) { super.onPageCommitVisible(view, url); view.loadUrl("javascript:window.HTMLOUT.processHTML(document.getElementsByTagName('html')[0].innerHTML)"); // convert all javascript to HTML Log.v("", "url (passed): " + url + " < view.getUrl(): " + view.getUrl()); }
WebSettings配置
已启用JavaScript,相关配置如下:
webSettings.setJavaScriptEnabled(true); webSettings.setSupportZoom(false); webSettings.setBlockNetworkLoads(false); webSettings.setDomStorageEnabled(true); webSettings.setLoadWithOverviewMode(true); webSettings.setUseWideViewPort(false); webSettings.setBuiltInZoomControls(true); webSettings.setDisplayZoomControls(false); webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
相关Logcat片段
11:12:03.716 D url: https://smittenkitchen.com/, view: https://smittenkitchen.com/ (called from: MyWebViewClient.onPageFinished) 11:12:03.988 D url: https://smittenkitchen.com/, view: https://smittenkitchen.com/ (called from: MyWebViewClient.onPageStarted) 11:12:05.646 E net::ERR_CONNECTION_REFUSED(-6) on request: https://ssc.33across.com/api/v1/hb?guid=cYCh20L9Or64olaKj0P0Le, https://smittenkitchen.com/ (called from: MyWebViewClient.onReceivedError) 11:12:05.787 MyWebView V javascript:window.HTMLOUT.processHTML(document.getElementsByTagName('html')[0].innerHTML); (called from: MyWebView.loadUrl < MyWebViewClient.onPageCommitVisible) 11:12:05.790 MyWebViewClient V url (passed): https://smittenkitchen.com/ < view.getUrl(): https://smittenkitchen.com/ (called from: MyWebViewClient.onPageCommitVisible) 11:12:08.097 D url: https://smittenkitchen.com/, view: https://smittenkitchen.com/ (called from: MyWebViewClient.onPageFinished) 11:12:23.824 D url: https://smittenkitchen.com/?s=carrot, view: https://smittenkitchen.com/?s=carrot (called from: MyWebViewClient.onPageStarted) 11:12:24.083 MyWebView V javascript:window.HTMLOUT.processHTML(document.getElementsByTagName('html')[0].innerHTML); (called from: MyWebView.loadUrl < MyWebViewClient.onPageCommitVisible) 11:12:24.085 MyWebViewClient V url (passed): https://smittenkitchen.com/?s=carrot < view.getUrl(): https://smittenkitchen.com/?s=carrot (called from: MyWebViewClient.onPageCommitVisible) 11:12:25.176 E net::ERR_CONNECTION_REFUSED(-6) on request: https://ssc.33across.com/api/v1/hb?guid=cYCh20L9Or64olaKj0P0Le, https://smittenkitchen.com/?s=carrot (called from: MyWebViewClient.onReceivedError) 11:12:26.583 D url: https://smittenkitchen.com/?s=carrot, view: https://smittenkitchen.com/?s=carrot (called from: MyWebViewClient.onPageFinished)
请问我的实现中缺失了什么,才能让基于WebView的浏览器像Chrome一样正常显示搜索结果覆盖层?
内容的提问来源于stack exchange,提问作者Introspective
相关产品推荐
相关产品推荐

