1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /** 18 * Common functionality for testing the WebView's Java Bridge. 19 */ 20 21 package com.android.webviewtests; 22 23 import android.test.ActivityInstrumentationTestCase2; 24 import android.util.Log; 25 import android.webkit.WebView; 26 import android.webkit.WebViewClient; 27 28 import junit.framework.Assert; 29 30 public class JavaBridgeTestBase extends ActivityInstrumentationTestCase2<WebViewStubActivity> { 31 protected class TestWebViewClient extends WebViewClient { 32 private boolean mIsPageFinished; 33 @Override onPageFinished(WebView webView, String url)34 public synchronized void onPageFinished(WebView webView, String url) { 35 mIsPageFinished = true; 36 notify(); 37 } waitForOnPageFinished()38 public synchronized void waitForOnPageFinished() throws RuntimeException { 39 while (!mIsPageFinished) { 40 try { 41 wait(5000); 42 } catch (Exception e) { 43 continue; 44 } 45 if (!mIsPageFinished) { 46 throw new RuntimeException("Timed out waiting for onPageFinished()"); 47 } 48 } 49 mIsPageFinished = false; 50 } 51 } 52 53 protected class Controller { 54 private boolean mIsResultReady; 55 notifyResultIsReady()56 protected synchronized void notifyResultIsReady() { 57 mIsResultReady = true; 58 notify(); 59 } waitForResult()60 protected synchronized void waitForResult() { 61 while (!mIsResultReady) { 62 try { 63 wait(5000); 64 } catch (Exception e) { 65 continue; 66 } 67 if (!mIsResultReady) { 68 Assert.fail("Wait timed out"); 69 } 70 } 71 mIsResultReady = false; 72 } 73 } 74 75 protected TestWebViewClient mWebViewClient; 76 JavaBridgeTestBase()77 public JavaBridgeTestBase() { 78 super(WebViewStubActivity.class); 79 } 80 81 // Sets up the WebView and injects the supplied object. Intended to be called from setUp(). setUpWebView(final Object object, final String name)82 protected void setUpWebView(final Object object, final String name) throws Exception { 83 mWebViewClient = new TestWebViewClient(); 84 // This starts the activity, so must be called on the test thread. 85 final WebViewStubActivity activity = getActivity(); 86 // On the UI thread, load an empty page and wait for it to finish 87 // loading so that the Java object is injected. 88 try { 89 runTestOnUiThread(new Runnable() { 90 @Override 91 public void run() { 92 WebView webView = activity.getWebView(); 93 webView.addJavascriptInterface(object, name); 94 webView.getSettings().setJavaScriptEnabled(true); 95 webView.setWebViewClient(mWebViewClient); 96 webView.loadData("<!DOCTYPE html><title></title>", "text/html", null); 97 } 98 }); 99 mWebViewClient.waitForOnPageFinished(); 100 } catch (Throwable e) { 101 throw new RuntimeException("Failed to set up WebView: " + Log.getStackTraceString(e)); 102 } 103 } 104 executeJavaScript(final String script)105 protected void executeJavaScript(final String script) throws Throwable { 106 runTestOnUiThread(new Runnable() { 107 @Override 108 public void run() { 109 getWebView().loadUrl("javascript:" + script); 110 } 111 }); 112 } 113 getWebView()114 protected WebView getWebView() { 115 return getActivity().getWebView(); 116 } 117 } 118