I\'m trying to develop a custom browser
with WebView
using Android API level 10
(sdk 2.3.3), unfortunately I don\'t know how to interc
You need to take a look at this:
webView.getSettings().setSupportMultipleWindows(true);
Then onCreateWindow
will get called.
Could not find any solution other than injecting javascript code. I even tried to compile the built-in android browser code downloaded from google source repository but will not compile as I found out that uses some non public API. Dolphin browser also uses its own extented WebView so I had no luck finding out how they implement open new window request detection.
This javascript code gets all link tags on the loaded page and analyze if there is an attribute with target="_blank". For each of these links will add "newtab:" in front of the url value of the href attribute. Then in the shouldOverrideUrlLoading() method I check if url begins with "newtab:" string, in which case I open a new tab.
Here are the code snipets:
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
view.loadUrl("javascript: var allLinks = document.getElementsByTagName('a'); if (allLinks) {var i;for (i=0; i<allLinks.length; i++) {var link = allLinks[i];var target = link.getAttribute('target'); if (target && target == '_blank') {link.setAttribute('target','_self');link.href = 'newtab:'+link.href;}}}");
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String urls) {
if (urls.startsWith("newtab:")) {
addTab(); //add a new tab or window
loadNewURL(urls.substring(7)); //strip "newtab:" and load url in the webview of the newly created tab or window
}
else {
view.loadUrl(urls); //load url in current WebView
}
return true;
}
}
Make sure you set supportMultipeWindows to true. Without it the onCreateWindow of the WebChromeClient will never get called.
WebSettings settings = webView.getSettings();
settings.setSupportMultipleWindows(true);
Then register a WebChromeClient and override onCreateWindow
webView.setWebChromeClient(new WebChromeClient() {
@Override public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, Message resultMsg)
{
WebView newWebView = new WebView(getContext());
addView(newWebView);
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(newWebView);
resultMsg.sendToTarget();
return true;
}
});