Webview: блокировать всплывающие окна JavaScript
Сейчас я использую эту строку кода, чтобы хотя бы попытаться заблокировать всплывающие окна JavaScript
в webview
:
webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
1) Я не понимаю, почему я должен переключить это на "правда", что это работает
2) есть ли другие методы для блокировки всплывающих окон в веб-представлении?
Помощь очень ценится.
3 ответа
преамбула
Мы находимся на WebView
установочная сторона уравнения.
На первый взгляд очевидный комментарий, но если он вам не нужен JavaScript
, не включайте JavaScript
тогда вы не получите JavaScript
всплывающие окна. Я полагаю, вам нужно JavaScript
(помните, что он может быть уязвим к XSS) и хотите сделать все возможное, чтобы отключить всплывающие окна, которые неизбежно последуют.
ИНФОРМАЦИЯ:
WebViewClient. Переопределите это поведение вашего WebView
Например, ссылки открываются внутри вашего WebView
, WebChromeClient позволяет вам обрабатывать Javascript's alert()
и другие функции.
ОП (1) setJavaScriptCanOpenWindowsAutomatically(true)
обычно блокируется только тогда, когда это делается вне обработчика событий.
OP = Исходное сообщение ; O).
Давайте настроим сенарио
Вот так я настроил свой нормальный webview
:
WebView webView = (WebView) this.findViewById(R.id.webView1);//CustomWebView ?
WebSettings webView_settings = webView.getSettings();
//by setting a WebClient to catch javascript's console messages :
WebChromeClient webChromeClient = new WebChromeClient() {
public boolean onConsoleMessage(ConsoleMessage cm) {
Log.d(TAG, cm.message() + " -- From line "
+ cm.lineNumber() + " of "
+ cm.sourceId() );
return true;
}
});
webView_settings.setDomStorageEnabled(true);
WebViewClient webViewClient = new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
setTitle(view.getTitle());
//do your stuff ...
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("file"))
{
// Keep local assets in this WebView.
return false;
}
}
});
//webView.setWebViewClient(new HelpClient(this));//
webView.setWebChromeClient(webChromeClient);
webView.setWebViewClient(webViewClient);
webView.clearCache(true);
webView.clearHistory();
webView_settings.setJavaScriptEnabled(true);//XSS vulnerable set to false ?
webView_settings.setJavaScriptCanOpenWindowsAutomatically(true);//set to false ?
webView.loadUrl("file:///android_asset/connect.php.html");//load something
ОП (2) Давайте заблокируем то, что можем
Из @markproxy Если вы продлите WebChromeClient
можете переопределить ее onJsAlert()
метод и заблокировать встроенный обработчик для оповещений. Пока вы это делаете, вы, вероятно, захотите заблокировать вызовы на confirm()
а также prompt()
:
WebChromeClient webChromeClient = new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
result.cancel();
return true;
}
@Override
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
result.cancel();
return true;
}
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
result.cancel();
return true;
}
};
webView.setWebChromeClient(webChromeClient);
Я должен был сделать это. Переопределите метод onJSAlert() в классе WebChromeClient:
MyWebChromeClient myWebChromeClient = new MyWebChromeClient();
webView.setWebChromeClient(myWebChromeClient);
MyWebChromeClient - это пользовательский класс, который наследует WebChromeClient
public class MyWebChromeClient extends WebChromeClient {
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result)
{
final JsResult finalRes = result;
new AlertDialog.Builder(view.getContext())
.setMessage(message)
.setPositiveButton(android.R.string.ok,
new AlertDialog.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which) {
finalRes.confirm();
}
})
.setCancelable(false)
.create()
.show();
return true;
}
}
Вы можете попробовать заблокировать всплывающие окна (окна) в WebChromeClient:
@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
WebView newWebView = (WebView) LayoutInflater.from(view.getContext()).inflate(R.layout.webview_custom_view, null);
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(newWebView);
resultMsg.sendToTarget();
return true;
}
Объект newWebView следует добавить в какой-то контейнер, например, в представление. Это пример создания окна (всплывающего окна) из WebView.