JavaScriptUtils.java revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5package org.chromium.content.browser.test.util;
6
7import junit.framework.Assert;
8
9import org.chromium.base.ThreadUtils;
10import org.chromium.content.browser.ContentView;
11import org.chromium.content.browser.ContentViewCore;
12
13import java.util.concurrent.TimeUnit;
14import java.util.concurrent.TimeoutException;
15
16/**
17 * Collection of JavaScript utilities.
18 */
19public class JavaScriptUtils {
20    private static final long EVALUATION_TIMEOUT_SECONDS = 5;
21
22    /**
23     * Executes the given snippet of JavaScript code within the given ContentView.
24     * Returns the result of its execution in JSON format.
25     */
26    public static String executeJavaScriptAndWaitForResult(
27            final ContentView view, TestCallbackHelperContainer viewClient,
28            final String code) throws InterruptedException, TimeoutException {
29        return executeJavaScriptAndWaitForResult(
30                view.getContentViewCore(),
31                viewClient.getOnEvaluateJavaScriptResultHelper(),
32                code);
33    }
34
35    /**
36     * Executes the given snippet of JavaScript code within the given ContentViewCore.
37     * Does not depend on ContentView and TestCallbackHelperContainer.
38     * Returns the result of its execution in JSON format.
39     */
40    public static String executeJavaScriptAndWaitForResult(
41            final ContentViewCore viewCore,
42            final TestCallbackHelperContainer.OnEvaluateJavaScriptResultHelper helper,
43            final String code) throws InterruptedException, TimeoutException {
44        return executeJavaScriptAndWaitForResult(
45                viewCore, helper, code, EVALUATION_TIMEOUT_SECONDS, TimeUnit.SECONDS);
46    }
47
48    /**
49     * Executes the given snippet of JavaScript code within the given ContentViewCore.
50     * Does not depend on ContentView and TestCallbackHelperContainer.
51     * Returns the result of its execution in JSON format.
52     */
53    public static String executeJavaScriptAndWaitForResult(
54            final ContentViewCore viewCore,
55            final TestCallbackHelperContainer.OnEvaluateJavaScriptResultHelper helper,
56            final String code,
57            final long timeout, final TimeUnit timeoutUnits)
58                    throws InterruptedException, TimeoutException {
59        ThreadUtils.runOnUiThread(new Runnable() {
60            @Override
61            public void run() {
62                helper.evaluateJavaScript(viewCore, code);
63            }
64        });
65        helper.waitUntilHasValue(timeout, timeoutUnits);
66        Assert.assertTrue("Failed to retrieve JavaScript evaluation results.", helper.hasValue());
67        return helper.getJsonResultAndClear();
68    }
69
70    /**
71     * Executes the given snippet of JavaScript code but does not wait for the result.
72     */
73    public static void executeJavaScript(final ContentView view, final String code) {
74        ThreadUtils.runOnUiThread(new Runnable() {
75            @Override
76            public void run() {
77                view.evaluateJavaScript(code);
78            }
79        });
80    }
81}
82