blob: b8148ca926597e0e6b8e6aac91c4558ff5523423 [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.android_webview.test.util;
import org.chromium.content.browser.ContentViewCore;
/**
* This class is used to be notified when a javascript event happened. It add itself as
* a javascript interface, so it could be notified by javascript when needed.
*
* 1. Call register() is to add a javascript interface into ContentViewCore.
* 2. Using waitForEnvent() to wait javascript event.
* 3. In javascript call notifyJava() when you want Java side know something is done.
*/
public class JavascriptEventObserver {
private Object mEvent = new Object();
private boolean mHappened;
/**
* Register into javascript, must be called in UI thread.
*
* @param contentViewCore
* @param name the name of object used in javascript
*/
public void register(ContentViewCore contentViewCore, String name) {
contentViewCore.addPossiblyUnsafeJavascriptInterface(this, name, null);
}
/**
* Wait for the javascript event happen for specific time, there is no timeout parameter,
* return true if the event happened.
*/
public boolean waitForEvent(long time) throws InterruptedException {
synchronized (mEvent) {
if (mHappened) return mHappened;
mEvent.wait(time);
boolean happened = mHappened;
mHappened = false;
return happened;
}
}
/**
* Wait for the javascript event happen, there is no timeout parameter, you usually
* should depend on unit test's timeout.
*/
public void waitForEvent() throws InterruptedException {
synchronized (mEvent) {
if (mHappened) return;
while (!mHappened) {
mEvent.wait();
}
mHappened = false;
}
}
/**
* Javascript should call this method by name.notifyJava, the name is the |name|
* parameter of register() method.
*/
public void notifyJava() {
synchronized (mEvent) {
mHappened = true;
mEvent.notify();
}
}
}