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");
+ }
+ }
+ }
}