Add CTS test for WebView.evaluateJavascript(..)

Bug: 9814043
Change-Id: Ia4effe222b39f7eb1049722a09302532ebfdb3d3
diff --git a/tests/src/android/webkit/cts/WebViewOnUiThread.java b/tests/src/android/webkit/cts/WebViewOnUiThread.java
index f1eeeab..867bd17 100644
--- a/tests/src/android/webkit/cts/WebViewOnUiThread.java
+++ b/tests/src/android/webkit/cts/WebViewOnUiThread.java
@@ -28,6 +28,7 @@
 import android.util.DisplayMetrics;
 import android.view.View;
 import android.webkit.DownloadListener;
+import android.webkit.ValueCallback;
 import android.webkit.WebBackForwardList;
 import android.webkit.WebChromeClient;
 import android.webkit.WebSettings;
@@ -647,6 +648,15 @@
         });
     }
 
+    public void evaluateJavascript(final String script, final ValueCallback<String> result) {
+        runOnUiThread(new Runnable() {
+            @Override
+            public void run() {
+                mWebView.evaluateJavascript(script, result);
+            }
+        });
+    }
+
     /**
      * Helper for running code on the UI thread where an exception is
      * a test failure. If this is already the UI thread then it runs
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
index ce2ec51..4388f47 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
@@ -47,6 +47,7 @@
 import android.webkit.DownloadListener;
 import android.webkit.JavascriptInterface;
 import android.webkit.SslErrorHandler;
+import android.webkit.ValueCallback;
 import android.webkit.WebBackForwardList;
 import android.webkit.WebChromeClient;
 import android.webkit.WebIconDatabase;
@@ -60,7 +61,6 @@
 import android.webkit.cts.WebViewOnUiThread.WaitForProgressClient;
 import android.widget.LinearLayout;
 
-
 import junit.framework.Assert;
 
 import java.io.File;
@@ -1846,6 +1846,33 @@
         assertEquals("anchor", mOnUiThread.getTitle());
     }
 
+    public void testEvaluateJavascript() {
+        // evaluteJavaScript not supported with WebViewClassic
+        // TODO: Remove when WebViewClassic no longer in system image.
+        if (mWebView.getWebViewProvider() instanceof android.webkit.WebViewClassic) {
+            return;
+        }
+
+        mOnUiThread.getSettings().setJavaScriptEnabled(true);
+        mOnUiThread.loadUrlAndWaitForCompletion("about:blank");
+
+        EvaluateJsResultPollingCheck jsResult = new EvaluateJsResultPollingCheck("2");
+        mOnUiThread.evaluateJavascript("1+1", jsResult);
+        jsResult.run();
+
+        jsResult = new EvaluateJsResultPollingCheck("9");
+        mOnUiThread.evaluateJavascript("1+1; 4+5", jsResult);
+        jsResult.run();
+
+        final String EXPECTED_TITLE = "test";
+        mOnUiThread.evaluateJavascript("document.title='" + EXPECTED_TITLE + "';", null);
+        new PollingCheck(TEST_TIMEOUT) {
+            @Override
+            protected boolean check() {
+                return mOnUiThread.getTitle().equals(EXPECTED_TITLE);
+            }
+        }.run();
+    }
 
     @UiThreadTest
     public void testInternals() {
@@ -2029,4 +2056,24 @@
             return mErrorUrl;
         }
     }
+
+    private static class EvaluateJsResultPollingCheck  extends PollingCheck
+            implements ValueCallback<String> {
+        private String mActualResult;
+        private String mExpectedResult;
+
+        public EvaluateJsResultPollingCheck(String expected) {
+            mExpectedResult = expected;
+        }
+
+        @Override
+        public synchronized boolean check() {
+            return mExpectedResult.equals(mActualResult);
+        }
+
+        @Override
+        public synchronized void onReceiveValue(String result) {
+            mActualResult = result;
+        }
+    }
 }