Index: content/test/browser_test_message_pump_android.cc |
diff --git a/content/test/browser_test_message_pump_android.cc b/content/test/browser_test_message_pump_android.cc |
index 7d46058d62abbade6914decc7e189adc3d3a1ca3..b20b491cc22c69d3048438affab4d178c6f36997 100644 |
--- a/content/test/browser_test_message_pump_android.cc |
+++ b/content/test/browser_test_message_pump_android.cc |
@@ -4,9 +4,21 @@ |
#include "content/test/browser_test_message_pump_android.h" |
+#include "base/android/jni_android.h" |
+#include "base/android/scoped_java_ref.h" |
+#include "base/lazy_instance.h" |
#include "base/logging.h" |
#include "base/synchronization/waitable_event.h" |
#include "base/time.h" |
+#include "jni/BrowserTestSystemMessageHandler_jni.h" |
+ |
+namespace { |
+ |
+base::LazyInstance<base::android::ScopedJavaGlobalRef<jobject> > |
+ g_message_handler_obj = LAZY_INSTANCE_INITIALIZER; |
+ |
+} // namespace |
+ |
namespace content { |
@@ -46,6 +58,14 @@ void BrowserTestMessagePumpAndroid::Run(Delegate* delegate) { |
state_ = &state; |
DCHECK(state_->run_depth <= 1) << "Only one level nested loops supported"; |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
+ DCHECK(env); |
+ |
+ // Need to cap the wait time to allow task processing on the java |
+ // side. Otherwise, a long wait time on the native will starve java |
+ // tasks. |
+ base::TimeDelta max_delay = base::TimeDelta::FromMilliseconds(100); |
+ |
for (;;) { |
if (state_->should_quit) |
break; |
@@ -69,11 +89,20 @@ void BrowserTestMessagePumpAndroid::Run(Delegate* delegate) { |
if (did_work) |
continue; |
+ // No native tasks to process right now. Process tasks from the Java |
+ // System message handler. This will return when the java message queue |
+ // is idle. |
+ bool ret = Java_BrowserTestSystemMessageHandler_runNestedLoopTillIdle(env, |
+ g_message_handler_obj.Get().obj()); |
+ CHECK(ret) << "Error running java message loop, tests will likely fail."; |
+ |
if (state_->delayed_work_time.is_null()) { |
- state_->waitable_event.Wait(); |
+ state_->waitable_event.TimedWait(max_delay); |
} else { |
base::TimeDelta delay = |
state_->delayed_work_time - base::TimeTicks::Now(); |
+ if (delay > max_delay) |
+ delay = max_delay; |
if (delay > base::TimeDelta()) { |
state_->waitable_event.TimedWait(delay); |
} else { |
@@ -87,13 +116,22 @@ void BrowserTestMessagePumpAndroid::Run(Delegate* delegate) { |
state_ = previous_state; |
} |
+void BrowserTestMessagePumpAndroid::Start( |
+ base::MessagePump::Delegate* delegate) { |
+ JNIEnv* env = base::android::AttachCurrentThread(); |
+ DCHECK(env); |
+ g_message_handler_obj.Get().Reset( |
+ Java_BrowserTestSystemMessageHandler_create(env)); |
+ |
+ base::MessagePumpForUI::Start(delegate); |
+} |
+ |
void BrowserTestMessagePumpAndroid::Quit() { |
if (state_) { |
state_->should_quit = true; |
state_->waitable_event.Signal(); |
return; |
} |
- |
base::MessagePumpForUI::Quit(); |
} |
@@ -119,4 +157,9 @@ void BrowserTestMessagePumpAndroid::ScheduleDelayedWork( |
base::MessagePumpForUI::ScheduleDelayedWork(delayed_work_time); |
} |
-} // namespace base |
+// static |
+bool BrowserTestMessagePumpAndroid::RegisterJni(JNIEnv* env) { |
+ return RegisterNativesImpl(env); |
+} |
+ |
+} // namespace content |