shouldOverrideUrlLoading бесконечно зацикливается на pepsi.com - PullRequest
0 голосов
/ 02 октября 2019

Это приложение для веб-браузера Android, которое отслеживает ваше время в сети для записей вашего работодателя. Этот веб-браузер имеет проблему с pepsi.com в том, что он проходит бесконечный цикл между функциями onPageStarted и shouldOverrideUrlLoading. Фрагмент кода ниже. Мне пришлось многое отредактировать для обеспечения конфиденциальности компании, но если вам нужно узнать больше, я могу отредактировать этот пост.

private WebViewClient mWebViewClient = new WebViewClient() {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        Logger.i(TAG, "shouldOverrideUrlLoading " + request.getUrl());
        if (!mLoadingFinished) {
            mRedirect = true;
        }

        mLoadingFinished = false;
        Uri uri = request.getUrl();
        mWebView.loadUrl(uri.toString());
        return true;
    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        Logger.i(TAG, "onPageStarted " + url);
        mLoadingFinished = false;
        updateControlBar(false);
        // Show loading
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        Logger.i(TAG, "onPageFinished " + url);
        if (!mRedirect) {
            mLoadingFinished = true;
            HistoryLog.getInstance().logHistory(url, "");
            visitPage();
            mCurrentSession.incrementPages();

            //In about:test add this javascript after loading.
            if (TESTPAGE.equalsIgnoreCase(url.trim())) {
                String javaScript = "javascript:/*REDACTED for company privacy*/
                view.evaluateJavascript(javaScript, new ValueCallback<String>() {
                        @Override
                        public void onReceiveValue(String s) { }
                });
            }
        }

        if (mLoadingFinished && !mRedirect) {
            // Hide loading
        } else {
            mRedirect = false;
        }
    }

    @Override
    public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {

        if (getActivity() != null) {
            mCurrentSession.end();
            mActiveTime.setVisibility(View.INVISIBLE);
            mElapsedTime.setVisibility(View.GONE);
            mShowTime = null;
        }

        LoginNoticeDialogFragment loginFragment = new LoginNoticeDialogFragment();
        try {
            loginFragment.passAlongParams (view, handler, host, realm);
            if (null != getFragmentManager()) {
                loginFragment.show(getFragmentManager(), "Login");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
        ErrorLog.getInstance().logError("Error loading URL " + view.getUrl());
    }
};

Ниже приведена функция updateControlBar

 private void updateControlBar(boolean upDateAddress) {
    mBack.setEnabled(mSettings.appIsEnabled() && mWebView.canGoBack());
    mForward.setEnabled(mSettings.appIsEnabled() && mWebView.canGoForward());
    mStop.setEnabled(!mLoadingFinished);

    if (upDateAddress) {
        String url = mWebView.getUrl();
        if (url != null) { // Might be null prior to reload
            if (url.equals(Config.SERVERWELCOMEPAGEURL)) {
                mAddressBar.setText(getString(R.string.web_welcome));
            } else if (url.startsWith("data:")) {
                mAddressBar.setText("");
            } else {
                mAddressBar.setText(url);
            }
        }
    }
}

Я попытался установить возвратto shouldOverrrideUrlLoading в false, обновляя shouldOverrrideUrlLoading в не осуждаемый метод, комментируя mWebView.loadUrl (uri.toString ());(это привело к остановке цикла, но браузер показал пустую страницу). Я просмотрел похожие посты на stackoverflow, но большинство проблем с зацикливанием связано с кнопкой возврата. Эта проблема возникает при переходе на pepsi.com. Это не происходит с большинством других веб-сайтов.

Целевой SDK: 29 мин. SDK: 21

...