JavaFX WebView - Как захватить загрузку URL? - PullRequest
0 голосов
/ 28 декабря 2018

В настоящее время я разрабатываю приложение с GluonHQ (JavaFXPorts), где я использую WebView для загрузки некоторых интернет-страниц.Когда я загружаю страницу https://signin.ebay.com/, я вижу на консоли следующие сообщения

[WebEngine] I can handle this protocol for https://signin.ebay.com/
ES2ResourceFactory: Prism - createStockShader: AlphaTexture_RadialGradient.frag
[WebEngine] I can handle this protocol for https://www.ebay.com/ws/
[WebEngine] I can't handle this protocol for about:blank
[WebEngine] I can handle this protocol for https://www.ebay.com/t_n.html?org_id=usllpic0&session_id=f5b8d48d1670a9cce3431193fffe9431&suppressFlash=true
[WebEngine] I can't handle this protocol for about:blank
2018-12-28 18:49:53 Watchdog[2021:302159] WF: _userSettingsForUser mobile: {
    filterBlacklist =     (
    );
    filterWhitelist =     (
    );
    restrictWeb = 1;
    useContentFilter = 0;
    useContentFilterOverrides = 0;
    whitelistEnabled = 0;
}
2018-12-28 18:49:53 Watchdog[2021:302159] WF: _WebFilterIsActive returning: NO
2018-12-28 18:49:55 Watchdog[2021:302159] CoreAnimation: [EAGLContext renderbufferStorage:fromDrawable:] was called from a non-main thread in an implicit transaction! Note that this may be unsafe without an explicit CATransaction or a call to [CATransaction flush].
[WebEngine] I can handle this protocol for https://src.ebay-us.com/fp/top_fp.html;CIS3SID=08561C52B9A266EE68861D27BCE99A74?org_id=usllpic0&session_id=f5b8d48d1670a9cce3431193fffe9431&nonce=b6190f233a143165

Кажется, что приложение вызывает также и загрузку других сайтов, но я не могу найти способзахватывая их.Я пытался также получить местоположение, когда состояние меняется

webEngine.getLoadWorker().stateProperty().addListener((ov, oldState, newState) -> {
    System.out.println("State(" + newState + "): " + webEngine.getLocation());
}

, но безуспешно.Кажется, что местоположение пустое до тех пор, пока сайт не будет загружен в первый раз, а затем будет возвращен оригинальный URL, т.е. https://signin.ebay.com. Я считаю, что появляющиеся дополнительные «протоколы» являются частью AJAX.У кого-нибудь есть идеи о том, как реализовать слушателя, чтобы захватить их?

[WebEngine] I can handle this protocol for https://signin.ebay.com/
State(SCHEDULED): null
State(RUNNING):   null
ES2ResourceFactory: Prism - createStockShader: AlphaTexture_RadialGradient.frag
[WebEngine] I can handle this protocol for https://www.ebay.com/ws/
[WebEngine] I can't handle this protocol for about:blank
State(SCHEDULED): null
State(RUNNING):   null
State(SUCCEEDED): null
[WebEngine] I can handle this protocol for https://www.ebay.com/t_n.html?org_id=usllpic0&session_id=f5c7ab7f1670a9ccaac210b2ffe8709e&suppressFlash=true
State(SCHEDULED): https://signin.ebay.com
State(RUNNING):   https://signin.ebay.com
[WebEngine] I can't handle this protocol for about:blank
State(SCHEDULED): https://signin.ebay.com
State(RUNNING):   https://signin.ebay.com
State(SUCCEEDED): https://signin.ebay.com
2018-12-28 19:06:05 Watchdog[2050:306357] WF: _userSettingsForUser mobile: {
    filterBlacklist =     (
    );
    filterWhitelist =     (
    );
    restrictWeb = 1;
    useContentFilter = 0;
        useContentFilterOverrides = 0;
        whitelistEnabled = 0;
    }
2018-12-28 19:06:05 Watchdog[2050:306357] WF: _WebFilterIsActive returning: NO
2018-12-28 19:06:09 Watchdog[2050:306357] CoreAnimation: [EAGLContext renderbufferStorage:fromDrawable:] was called from a non-main thread in an implicit transaction! Note that this may be unsafe without an explicit CATransaction or a call to [CATransaction flush].
[WebEngine] I can handle this protocol for https://src.ebay-us.com/fp/top_fp.html;CIS3SID=D553152B77DCBE35641E606BDAB6AFDA?org_id=usllpic0&session_id=f5c7ab7f1670a9ccaac210b2ffe8709e&nonce=f3e7bb25c25eb5c1
State(SCHEDULED): https://signin.ebay.com
State(RUNNING):   https://signin.ebay.com
State(SUCCEEDED): https://signin.ebay.com

1 Ответ

0 голосов
/ 28 декабря 2018

В продолжение этого похожего вопроса , где было указано, что:

В JavaFXPorts на мобильных устройствах (как Android, так и iOS) элемент управления WebView невстроенный элемент управления JavaFX, но собственный элемент управления

Этот метод можно увидеть в собственной реализации :

- (BOOL)webView:(UIWebView *)wv shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSString *url = [[request URL] absoluteString];
    JNIEnv *env = [self getJNIEnv];
    if (env != NULL) {
        jstring jUrl = createJString(env, url);
        (*env)->CallVoidMethod(env, jObject, jmidHasAppProtocolHandler, jUrl);
    ...
}

, входящей в JavaFX WebEngine callback :

/**
 * check if there is a handler registered for dealing with this protocol.
 */
boolean hasAppProtocolHandler(String url) {
    boolean answer = false;
    try {
        URL u = newURL(null, url);
        System.out.println ("[WebEngine] I can handle this protocol for "+url);
        u.openConnection();
        // location.set(url);
        answer = true;
    }
    // catch (MalformedURLException e) {
    catch (Exception e) {
        System.out.println ("[WebEngine] I can't handle this protocol for "+url);
        // no handler known for this protocol
    }
    return answer;
}

Это объясняет распечатки консоли: когда можно открыть URL-адрес или когда есть исключение.Кажется, что все различные результаты связаны с тем, как собственный браузер обрабатывает загрузку URL, но вы получаете только эхо в слое JavaFX.

Об использовании WebEngine::getLocation, обратите внимание, что только после завершения загрузки собственного браузераURL-адрес, уведомление отправляется обратно, и местоположение установлено :

void notifyLoadFinished(String loc, String content) {
    synchronized (loadedLock) {
        this.pageContent = "<html>"+content+"</html>";
        loaded = true;
        updateProgress(1.0);
        updateState(Worker.State.SUCCEEDED);
        location.set(loc); // <--- location from native browser is set
        document.invalidate(true);
        if (pageListener != null) {
            pageListener.onLoadFinished();
        }
    }
}

Я бы посоветовал вам взглянуть на код JavaFX для WebView и WebEngine дляПлатформа iOS, чтобы увидеть, что можно и что нельзя делать.

Например, механизм сценариев может работать, поэтому вы можете выполнить некоторый сценарий, который сообщит некоторую информациюназад.

...