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

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

webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

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

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


person c1ph4    schedule 25.06.2017    source источник


Ответы (3)


преамбула

Мы находимся на стороне WebView настройки.
На первый взгляд очевидный комментарий, но если вам не нужно JavaScript, не включайте JavaScript, тогда вы не получите JavaScript всплывающих окон. Я предполагаю, что вам ДЕЙСТВИТЕЛЬНО нужно JavaScript (помните, что это может быть XSS-уязвимость) и хотите сделать все возможное, чтобы отключить всплывающие окна, которые могут< /strong> неизбежно последуют.

ИНФО:

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

Давайте настроим senario

Вот как я настраиваю свой обычный 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

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);
person Jon Goodwin    schedule 30.12.2017

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

person Djek-Grif    schedule 04.01.2018

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