webview don't display javascript windows.open()
Solution 1
First of all, you need to set the following settings on your WebView
:
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setSupportMultipleWindows(true);
Then you need to attach a WebChromeClient
that overrides onCreateWindow
. Your implementation of this method can create a new web view, and display it inside a dialog:
webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
WebView newWebView = new WebView(MyActivity.this);
WebSettings webSettings = newWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
// Other configuration comes here, such as setting the WebViewClient
final Dialog dialog = new Dialog(MyActivity.this);
dialog.setContentView(newWebView);
dialog.show();
newWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onCloseWindow(WebView window) {
dialog.dismiss();
}
});
((WebView.WebViewTransport)resultMsg.obj).setWebView(newWebView);
resultMsg.sendToTarget();
return true;
}
});
Don't forget to set the new web view to the resultMsg
, send it to its target and return true, as mentioned in the API documentation.
Solution 2
Please check with adding this -
getSettings().setSupportMultipleWindows(true);
mickey
Updated on May 02, 2020Comments
-
mickey about 4 years
I have a
WebView
in which i display web content which i have no control over. The content displays fine, but have links which spawn a popup window. The javascript function that does that looks like this:function getEntry(id) { var win = window.open('', 'Booking', 'resizable=yes,scrollbars=yes,status=no,width=500,height=400'); win.document.location = '/some/url/1-' + id ; }
I can't easily change this, and if the people responsible for the page i download would change it, i guess my app would fail miserably...
My
WebView
setup in the activity looks like this:_webview = new WebView(this); setContentView(_webview); final Activity activity = this; _chromeClient = new MyChromeClient(); _webview.setWebChromeClient(_chromeClient); //I experimented with changing user agent, in case that would have any effect, it didn't... _webview.getSettings().setUserAgentString("Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1"); _webview.setWebViewClient(new MyWebViewClient()); _webview.getSettings().setJavaScriptEnabled(true); _webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); _webview.getSettings().setSupportZoom(true); _webview.getSettings().setBuiltInZoomControls(true); _webview.getSettings().setDomStorageEnabled(true); //Cache settings... _webview.getSettings().setAppCacheMaxSize(1024*1024*8); _webview.getSettings().setAppCachePath("/data/data/com.your.package.appname/cache"); _webview.getSettings().setAllowFileAccess(true); _webview.getSettings().setAppCacheEnabled(true);
MyWebClient:
private class MyWebViewClient extends WebViewClient { @Override public void onLoadResource(WebView view, String url) { Log.d("MyWebViewClient",url); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { showProgressDiag(); Log.d("MyWebViewClient","shouldOverride... : " + url); view.loadUrl(url); return true; } @Override public void onPageFinished(WebView view, String url){ hideProgressDiag(); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { if(failingUrl.equals("file:///android_asset/html/error.html")){ hideProgressDiag(); Toast.makeText(_context, "Error! Check internet connection, or try again later...", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(_context, failingUrl, Toast.LENGTH_SHORT).show(); view.loadUrl("file:///android_asset/html/error.html"); } } }
MyChromeClient:
private class MyChromeClient extends WebChromeClient{ @Override public void onProgressChanged(WebView view, int progress) { Pdiag.setProgress(progress * 100); } }
When clicking one of the links that points to the javascript function all that happens is that the
WebView
turns grey, without going throughshouldOverrideUrlLoading()
. When i hit the back key the app exits, meaning that nothing was placed in the nav history of theWebView
. Sometimes nothing happens, but then theshouldOverrideUrlLoading()
do run and from aLog.d()
i can see that the correct URL for the popup has been given to the WebView.The thing is, on very rare occasions it shows up fine, but i have no clue how to reproduce it, and wether it actually shows in a popup.
I'm lost... And quite frustrated... Thinking of watching a bad sitcom instead :(
EDIT: Actually, maybe the URL wasn't all that correct after all... In Firefox the URL ends with "X<<<<" but in my Log.d() output it ends with "X%3C%3C%3C%3C"... I'll investigate if i could change that...
EDIT 2: Nope, didn't do anything... The URL is identical to the one in Firefox...