【问题标题】:JavaFX WebView - How to capture the URL loading?JavaFX WebView - 如何捕获 URL 加载?
【发布时间】:2018-12-28 17:12:48
【问题描述】:

我目前正在使用 GluonHQ (JavaFXPorts) 开发一个应用程序,我正在使用 WebView 加载一些 Internet 页面。当我加载 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

【问题讨论】:

    标签: ios javafx webview gluon gluon-mobile


    【解决方案1】:

    作为类似question 的后续行动,其中声明:

    使用 JavaFXPorts,在移动设备(Android 和 iOS)上,WebView 控件不是 JavaFX 内置控件,而是本机控件

    在原生implementation中可以看到这个方法:

    - (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后,才会发回通知,location is set

    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();
            }
        }
    }
    

    我建议您查看适用于 iOS 平台的 WebViewWebEngine 的 JavaFX 代码,了解哪些可以做,哪些不能做。

    例如,脚本引擎可以工作,所以你可以execute 一些脚本,它会报告一些信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-21
      • 2019-09-03
      • 2017-03-29
      • 2019-02-13
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      • 1970-01-01
      相关资源
      最近更新 更多