JavaFX przestaje otwierać URL w WebView - zamiast tego otwórz przeglądarkę

Wbudowana przeglądarka WebView, której używam, wymaga specjalnej obsługi określonych adresów URL, aby otworzyć je w rodzimej domyślnej przeglądarce zamiast WebView. Rzeczywista część przeglądania działa poprawnie, ale muszę również zatrzymać wyświetlanie tej strony przez WebView. Mogę wymyślić kilka sposobów, aby to zrobić, ale żaden z nich nie działa. Oto mój kod:

this.wv.getEngine().locationProperty().addListener(new ChangeListener<String>() {
    @Override
    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue)
    {
        Desktop d = Desktop.getDesktop();
        try
        {
            URI address = new URI(observable.getValue());
            if ((address.getQuery() + "").indexOf("_openmodal=true") > -1)
            {
                // wv.getEngine().load(oldValue); // 1
                // wv.getEngine().getLoadWorker().cancel(); // 2
                // wv.getEngine().executeScript("history.back()"); // 3
                d.browse(address);
            }
        }
        catch (IOException | URISyntaxException e)
        {
            displayError(e);
        }
    }
});

Nieco więcej informacji o tym, co dzieje się w każdym z trzech przypadków

1. Ładowanie poprzedniego adresu
wv.getEngine().load(oldValue);

To zabija JVM. Co ciekawe, strona otwiera się dobrze w rodzimej przeglądarce.

# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000005b8fef38, pid=7440, tid=8000
#
# JRE version: 7.0_09-b05
# Java VM: Java HotSpot(TM) 64-Bit Server VM (23.5-b02 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C  [jfxwebkit.dll+0x2fef38]  Java_com_sun_webpane_platform_BackForwardList_bflItemGetIcon+0x184f58
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:\Users\Greg Balaga\eclipse\Companyapp\hs_err_pid7440.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
2. Anulowanie pracownika
wv.getEngine().getLoadWorker().cancel();

Nic nie robi, strona ładuje się zarówno do WebView, jak i do rodzimej przeglądarki.

3. Korzystanie z history.back ()
wv.getEngine().executeScript("history.back()");

Tak jak powyżej, bez efektu.

4. Zamiast tego reagować na zmiany na stole montażowym

Próbowałem też zamiast patrzećlocationProperty zWebEngine, posłuchaj na chenges zastateProperty zWorker i uruchom ten sam kod otwarcia, jeślinewState == State.SCHEDULED. Nie było różnicy w wynikach poprzedniej metody (poza faktem, że nie był w stanie użyć # 1).

Aktualizacja

Kod, którego używam, nadal powoduje awarię maszyny JVM:

this.wv.getEngine().locationProperty().addListener(new ChangeListener<String>() {
    @Override
    public void changed(ObservableValue<? extends String> observable, final String oldValue, String newValue)
    {
        Desktop d = Desktop.getDesktop();
        try
        {
            URI address = new URI(newValue);
            if ((address.getQuery() + "").indexOf("_openmodal=true") > -1)
            {
                Platform.runLater(new Runnable() {
                    @Override
                    public void run()
                    {
                        wv.getEngine().load(oldValue);
                    }
                });
                d.browse(address);
            }
        }
        catch (IOException | URISyntaxException e)
        {
            displayError(e);
        }
    }
});
Obejście problemu

Ok, udało mi się sprawić, żeby działało, zrywając przeglądarkę internetową i odbudowując ją.

this.wv.getEngine().locationProperty().addListener(new ChangeListener<String>() {
    @Override
    public void changed(ObservableValue<? extends String> observable, final String oldValue, String newValue)
    {
        Desktop d = Desktop.getDesktop();
        try
        {
            URI address = new URI(newValue);
            if ((address.getQuery() + "").indexOf("_openmodal=true") > -1)
            {
                Platform.runLater(new Runnable() {
                    @Override
                    public void run()
                    {
                        grid_layout.getChildren().remove(wv);
                        wv = new WebView();
                        grid_layout.add(wv, 0, 1);
                        wv.getEngine().load(oldValue);
                    }
                });
                d.browse(address);
            }
        }
        catch (IOException | URISyntaxException e)
        {
            displayError(e);
        }
    }
});

questionAnswers(8)

yourAnswerToTheQuestion