Fix WebView test testAccessCertificate() to call WebView methods on UI thread

Bug: 4340864
Change-Id: I4c0fab36de8b06d9638c026004b957afa70a5775
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
index 3a1f0ee..31aa26c 100755
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
@@ -77,12 +77,19 @@
 
     private WebView mWebView;
     private CtsTestServer mWebServer;
+    private boolean mIsUiThreadDone;
 
     public WebViewTest() {
         super("com.android.cts.stub", WebViewStubActivity.class);
     }
 
     @Override
+    public void runTestOnUiThread(Runnable runnable) throws Throwable {
+        mIsUiThreadDone = false;
+        super.runTestOnUiThread(runnable);
+    }
+
+    @Override
     protected void setUp() throws Exception {
         super.setUp();
         mWebView = getActivity().getWebView();
@@ -1963,37 +1970,48 @@
     public void testAccessCertificate() throws Throwable {
         final class MockWebViewClient extends WebViewClient {
             @Override
-            public void onReceivedSslError(WebView view, SslErrorHandler handler,
-                                           SslError error) {
+            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                 handler.proceed();
             }
         }
 
+        final class LoadCompleteWebChromeClient extends WebChromeClient {
+            @Override
+            public void onProgressChanged(WebView webView, int progress) {
+                super.onProgressChanged(webView, progress);
+                if (progress == 100) {
+                    notifyUiThreadDone();
+                }
+            }
+        }
+
+        startWebServer(true);
+        final String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
         runTestOnUiThread(new Runnable() {
             public void run() {
-                mWebView = new WebView(getActivity());
-                getActivity().setContentView(mWebView);
+                // need the client to handle error
+                mWebView.setWebViewClient(new MockWebViewClient());
+                mWebView.setWebChromeClient(new LoadCompleteWebChromeClient());
+                mWebView.setCertificate(null);
+                // attempt to load the url.
+                mWebView.loadUrl(url);
             }
         });
-        getInstrumentation().waitForIdleSync();
+        waitForUiThreadDone();
 
-        // need the client to handle error
-        mWebView.setWebViewClient(new MockWebViewClient());
-
-        mWebView.setCertificate(null);
-        startWebServer(true);
-        String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
-        // attempt to load the url.
-        mWebView.loadUrl(url);
-        new DelayedCheck(TEST_TIMEOUT) {
-            @Override
-            protected boolean check() {
-                return mWebView.getCertificate() != null;
+        runTestOnUiThread(new Runnable() {
+            public void run() {
+                new DelayedCheck(TEST_TIMEOUT) {
+                    @Override
+                    protected boolean check() {
+                        return mWebView.getCertificate() != null;
+                    }
+                }.run();
+                SslCertificate cert = mWebView.getCertificate();
+                assertNotNull(cert);
+                assertEquals("Android", cert.getIssuedTo().getUName());
             }
-        }.run();
-        SslCertificate cert = mWebView.getCertificate();
-        assertNotNull(cert);
-        assertEquals("Android", cert.getIssuedTo().getUName());
+        });
     }
 
     @TestTargetNew(
@@ -2457,4 +2475,22 @@
             Log.w(LOGTAG, "waitForLoadComplete() interrupted while sleeping for layout delay.");
         }
     }
+
+    private synchronized void notifyUiThreadDone() {
+        mIsUiThreadDone = true;
+        notify();
+    }
+
+    private synchronized void waitForUiThreadDone() throws InterruptedException {
+        while (!mIsUiThreadDone) {
+            try {
+                wait(TEST_TIMEOUT);
+            } catch (InterruptedException e) {
+                continue;
+            }
+            if (!mIsUiThreadDone) {
+                Assert.fail("Unexpected timeout");
+            }
+        }
+    }
 }