1

I have simple app with code:

webView.getEngine().load("classpath:data/index.html");

Custom URLStreamHandler:

public class Handler extends URLStreamHandler {
    private final ClassLoader classLoader;

    public Handler() {
        this.classLoader = getClass().getClassLoader();
    }

    public Handler(ClassLoader classLoader) {
        this.classLoader = classLoader;
    }

    @Override
    protected URLConnection openConnection(URL u) throws IOException {
        URL resourceUrl = classLoader.getResource(u.getPath());
        if(resourceUrl == null)
            throw new IOException("Resource not found: " + u);

        return resourceUrl.openConnection();
    }
}

installed by:

URL.setURLStreamHandlerFactory(protocol -> {
    if(protocol.equals("classpath")) {
        return new Handler();
    } else {
        return null;
    }
});

It load data/index.html:

<!DOCTYPE html>
<html>
<head>
    <title>Test</title>
</head>
<body>
<div>Hello, World!!!</div>
<img src="download.jpg">
</body>
</html>

but in result image doesn't appears.

What to do to allow WebView resolve relative link like "download.jpg"?

0

1 Answer 1

5

I thin I found the solution:

in Handler.openConnection(URL u) we have to add

String path = getURL().getPath().startsWith("/") ? getURL().getPath().substring(1) : getURL().getPath();
URL resourceUrl = classLoader.getResource(path);

instead of

URL resourceUrl = classLoader.getResource(u.getPath());

and to standartize URL, instead

webView.getEngine().load("classpath:data/index.html");

use

webView.getEngine().load("classpath:///data/index.html");
Sign up to request clarification or add additional context in comments.

1 Comment

how did you "install" the custom handler?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.