Android-AdvancedWebView icon indicating copy to clipboard operation
Android-AdvancedWebView copied to clipboard

shouldOverrideUrlLoading does not seem to get called properly + appreciation post

Open philippdormann opened this issue 5 years ago β€’ 4 comments

First off, thanks so much for this project! πŸ™ Saved me lots of time - wish I knew about this before ^^

During implementation of your library, I found a small problem (might as well be on my side)

When registering a WebViewClient() like this, I would normally expect the shouldOverrideUrlLoading function to be called.

wv?.webViewClient = object : WebViewClient() {
    override fun onReceivedError(view: WebView?,request: WebResourceRequest?,error: WebResourceError?) {
        // 
    }
    override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
        Log.d("LOGGER", "url-triggered")
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            if (request != null) {
                val u = request.url.toString()
                if(u.contains("keyword")) {
                    // website should not load, custom handler
                    return true
                }
            }
        }
    }
    override fun onPageFinished(view: WebView?, url: String?) {
        super.onPageFinished(view, url)
    }
    return super.shouldOverrideUrlLoading(view, request)
}

Expected

  • when loading a new url (calling wv?.loadUrl()) the shouldOverrideUrlLoading function should be called
  • as a result
    • url-triggered should be logged
    • the url should not be loaded, because of the return true

Actual

  • url gets loaded
  • shouldOverrideUrlLoading is not called; noting is logged

Possibility to Avoid this / get the expected behaviour

I would not call this a clean approach, but it works πŸ™„

  • override onPageStarted
  • check url
  • wv?.stopLoading()
  • wv?.onBackPressed()

philippdormann avatar Oct 17 '20 22:10 philippdormann

Thanks!

If you have added a restricted set of allowed hostnames, either via addPermittedHostname or via addPermittedHostnames, then that set is evaluated first. So if the hostname of your (next) URL is not in that list, the request is cancelled immediately, before your own handler is called.

Other than that, when you set up a custom WebViewClient, your own handler should be called as you expect.

But, I’m afraid you might have to override the variant of shouldOverrideUrlLoading with String url as its second parameter (yes, although it’s deprecated), not the one with WebResourceRequest request. Can you try that?

(If this works, this aspect should really be fixed or documented. Sorry for that!)

ocram avatar Oct 20 '20 15:10 ocram

Thanks for your response @ocram !

Indeed, overriding shouldOverrideUrlLoading(view: WebView?, url: String?) works. Would be awesome if you could include this in the docs (or even had a fix πŸ™‚)

Thanks again for your good work πŸ‘Œ closing

philippdormann avatar Oct 22 '20 17:10 philippdormann

Reopening until fixed.

Thanks again!

ocram avatar Dec 16 '20 14:12 ocram