aboutsummaryrefslogtreecommitdiff
path: root/integration_tests/nativegraphics/src/test/java/org/robolectric/integrationtests/nativegraphics/testing/util/WebViewReadyHelper.java
blob: 80e96c982dd8c294d3ae83019dddd7f22ba522be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package org.robolectric.integrationtests.nativegraphics.testing.util;

import android.view.ViewTreeObserver.OnDrawListener;
import android.webkit.WebView;
import android.webkit.WebView.VisualStateCallback;
import android.webkit.WebViewClient;
import java.util.concurrent.CountDownLatch;

public final class WebViewReadyHelper {
  // Hacky quick-fix similar to DrawActivity's DrawCounterListener
  // TODO: De-dupe this against DrawCounterListener and fix this cruft
  private static final int DEBUG_REQUIRE_EXTRA_FRAMES = 1;
  private int drawCount = 0;

  private final CountDownLatch latch;
  private final WebView webView;

  public WebViewReadyHelper(WebView webView, CountDownLatch latch) {
    this.webView = webView;
    this.latch = latch;
    this.webView.setWebViewClient(client);
  }

  public void loadData(String data) {
    webView.loadData(data, null, null);
  }

  private WebViewClient client =
      new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
          webView.postVisualStateCallback(0, visualStateCallback);
        }
      };

  private VisualStateCallback visualStateCallback =
      new VisualStateCallback() {
        @Override
        public void onComplete(long requestId) {
          webView.getViewTreeObserver().addOnDrawListener(onDrawListener);
          webView.invalidate();
        }
      };

  private OnDrawListener onDrawListener =
      new OnDrawListener() {
        @Override
        public void onDraw() {
          if (++drawCount <= DEBUG_REQUIRE_EXTRA_FRAMES) {
            webView.postInvalidate();
            return;
          }

          webView.post(
              () -> {
                webView.getViewTreeObserver().removeOnDrawListener(onDrawListener);
                latch.countDown();
              });
        }
      };
}