| Index: base/message_loop/message_pump_android.cc
|
| diff --git a/base/message_loop/message_pump_android.cc b/base/message_loop/message_pump_android.cc
|
| index 70eb6ef089e7230455cf24a25b0d8ac8ed9cdfb1..f3f1c9bcb4d83bc0f5b94312f1ef64371a4617c7 100644
|
| --- a/base/message_loop/message_pump_android.cc
|
| +++ b/base/message_loop/message_pump_android.cc
|
| @@ -21,7 +21,7 @@ using base::android::ScopedJavaLocalRef;
|
| // ----------------------------------------------------------------------------
|
| // This method can not move to anonymous namespace as it has been declared as
|
| // 'static' in system_message_handler_jni.h.
|
| -static jboolean DoRunLoopOnce(JNIEnv* env, jobject obj, jint native_delegate) {
|
| +static void DoRunLoopOnce(JNIEnv* env, jobject obj, jint native_delegate) {
|
| base::MessagePump::Delegate* delegate =
|
| reinterpret_cast<base::MessagePump::Delegate*>(native_delegate);
|
| DCHECK(delegate);
|
| @@ -31,26 +31,27 @@ static jboolean DoRunLoopOnce(JNIEnv* env, jobject obj, jint native_delegate) {
|
| // we call DoWork() / DoDelayedWork().
|
| // On Android, the java message queue may contain messages for other handlers
|
| // that will be processed before calling here again.
|
| - bool more_work_is_plausible = delegate->DoWork();
|
| + bool did_work = delegate->DoWork();
|
|
|
| // This is the time when we need to do delayed work.
|
| base::TimeTicks delayed_work_time;
|
| - more_work_is_plausible |= delegate->DoDelayedWork(&delayed_work_time);
|
| + did_work |= delegate->DoDelayedWork(&delayed_work_time);
|
| +
|
| + // Always call this if there is a delayed message waiting in the queue
|
| + // since is at most one delayed message in the Java message handler, and this
|
| + // function call may be the result of that message being handled.
|
| + if (!delayed_work_time.is_null()) {
|
| + Java_SystemMessageHandler_setDelayedTimer(env, obj,
|
| + (delayed_work_time - base::TimeTicks::Now()).InMillisecondsRoundedUp());
|
| + }
|
|
|
| // This is a major difference between android and other platforms: since we
|
| // can't inspect it and process just one single message, instead we'll yeld
|
| - // the callstack, and post a message to call us back soon.
|
| - if (more_work_is_plausible)
|
| - return true;
|
| -
|
| - more_work_is_plausible = delegate->DoIdleWork();
|
| - if (!more_work_is_plausible && !delayed_work_time.is_null()) {
|
| - // We only set the timer here as returning true would post a message.
|
| - jlong millis =
|
| - (delayed_work_time - base::TimeTicks::Now()).InMillisecondsRoundedUp();
|
| - Java_SystemMessageHandler_setDelayedTimer(env, obj, millis);
|
| - }
|
| - return more_work_is_plausible;
|
| + // the callstack.
|
| + if (did_work)
|
| + return;
|
| +
|
| + delegate->DoIdleWork();
|
| }
|
|
|
| namespace base {
|
|
|