Webview: блокировать всплывающие окна JavaScript

Сейчас я использую эту строку кода, чтобы хотя бы попытаться заблокировать всплывающие окна JavaScript в webview:

webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

1) Я не понимаю, почему я должен переключить это на "true", что он работает
2) Существуют ли какие-либо другие методы блокировки всплывающих окон в webview?

Помощь очень ценится.

Ответ 1

преамбула

Мы находимся на стороне WebView установки уравнения.
На первый взгляд очевидный комментарий, но если вам не нужен JavaScript, не включить JavaScript, то вы не получите JavaScript popup's, Я предполагаю, что вы DO нуждаетесь JavaScript (помните, что это может быть XSS уязвимо) и хотите сделать что вы можете отключить всплывающие окна, которые может неизбежно следовать.

INFO

WebViewClient. Переопределите это поведение вашего WebView, например. поэтому ссылки открыты в вашем WebView. WebChromeClient позволяет обрабатывать Javascript alert() и другие функции.
OP (1) setJavaScriptCanOpenWindowsAutomatically(true) обычно заблокирован только, когда выполняется вне обработчика события /STRONG > .
OP= Оригинальное сообщение ; O).

Позвольте настроить senario

Вот как я устанавливаю свой обычный WebView:

WebView webView = (WebView) this.findViewById(R.id.webView1);//CustomWebView ?

WebSettings webView_settings = webView.getSettings();

//by setting a WebClient to catch javascript 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

OP (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);

Ответ 2

Вы можете попробовать блокировать всплывающие окна (окна) в 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 должен добавить в некоторый контейнер как view.It пример создания окна (всплывающего окна) из WebView.

Ответ 3

Я должен был это сделать. Переопределите метод 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;
    }
}