Пользовательская вкладка Chrome получает контент и прослушиватель событий страницы - PullRequest
0 голосов
/ 30 сентября 2019

Я занимаюсь разработкой приложения для Android. В прошлых проектах я использовал WebView для отображения веб-контента. Это дало мне возможность перехватывать события, такие как загруженная страница и так далее. Важная вещь, которую я смог сделать, - получить содержимое страницы и использовать его в коде Java. Если честно, я использую трюк, но он работает. Я поместил необходимый код моего фрагмента, чтобы использовать WebView для открытия URL-адреса, что-то делать и когда пользователь заходит на определенную страницу и получает содержимое страницы (с MyJavaScriptInterface):

public class LoginFragment extends MyAppFragment {

    @BindView(R.id.webView)
    public WebView webView;


    public LoginFragment() {
    }

    @Override
    public void onResume() {
        super.onResume();

        webView.setVisibility(View.VISIBLE);
    }

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_login, container, false);
        initBinder(rootView);
        ...
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setBuiltInZoomControls(true);
        webView.getSettings().setDisplayZoomControls(false);
        webView.setWebViewClient(mWebViewClient);


        /* Register a new JavaScript interface called HTMLOUT */
        webView.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");
        webView.loadUrl(getResources().getString(R.string.url_login).trim());

        return rootView;
    }

    /* An instance of this class will be registered as a JavaScript interface */
    class MyJavaScriptInterface {
        @JavascriptInterface
        @SuppressWarnings("unused")
        public void processHTML(String token) {
            if (token.contains(URL_LANDING)) {
                ...
            }
        }
    }

    private WebViewClient mWebViewClient = new WebViewClient() {
        @Nullable
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
            Logger.info("shouldInterceptRequest " + request.getUrl().toString());
            if (URL_LANDING_SESAPP.equals(request.getUrl().toString())) {
              ...  
            } 
            return super.shouldInterceptRequest(view, request);
        }


        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            ...
            return super.shouldOverrideUrlLoading(view, request);
        }

        @Override
        public void onLoadResource(WebView view, String url) {
            ...
            super.onLoadResource(view, url);
        }

        @Override
        public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
            super.onReceivedHttpError(view, request, errorResponse);
        }

        @Override
        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
            super.onReceivedError(view, request, error);
            ...
        }


        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            ...
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);

            pageLoading = false;

            if (loginDone) {
 view.loadUrl("javascript:window.HTMLOUT.processHTML(document.getElementsByTagName('body')[0].innerHTML);")
            } 
        }

    };

}

IsЕсть ли эквивалентный способ сделать это с помощью пользовательских тегов Chrome? Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...