• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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