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.

Другие вопросы по тегам