#include "content/public/test/nested_message_pump_android.h"
#include "base/android/jni_android.h"
#include "base/auto_reset.h"
#include "content/public/test/android/test_support_content_jni_headers/NestedSystemMessageHandler_jni.h"
namespace content {
NestedMessagePumpAndroid::NestedMessagePumpAndroid() = default;
NestedMessagePumpAndroid::~NestedMessagePumpAndroid() = default;
void NestedMessagePumpAndroid::Run(base::MessagePump::Delegate* delegate) {
auto* old_delegate = SetDelegate(delegate);
bool old_quit = SetQuit(false);
ScheduleWork();
while (!ShouldQuit()) {
RunJavaSystemMessageHandler();
CHECK(!ShouldDeferWork());
auto work_type = std::exchange(deferred_work_type_, kNone);
auto do_idle_work = std::exchange(deferred_do_idle_work_, true);
switch (work_type) {
case kNone:
break;
case kDelayed:
base::MessagePumpForUI::DoDelayedLooperWork();
break;
case kNonDelayed:
base::MessagePumpForUI::DoNonDelayedLooperWork(do_idle_work);
break;
}
}
SetDelegate(old_delegate);
SetQuit(old_quit);
}
void NestedMessagePumpAndroid::Quit() {
QuitJavaSystemMessageHandler();
SetQuit(true);
}
void NestedMessagePumpAndroid::Attach(Delegate*) {}
void NestedMessagePumpAndroid::DoDelayedLooperWork() {
if (ShouldDeferWork()) {
switch (deferred_work_type_) {
case kNone:
deferred_work_type_ = kDelayed;
break;
case kDelayed:
break;
case kNonDelayed:
break;
}
QuitJavaSystemMessageHandler();
return;
}
base::MessagePumpForUI::DoDelayedLooperWork();
}
void NestedMessagePumpAndroid::DoNonDelayedLooperWork(bool do_idle_work) {
if (ShouldDeferWork()) {
deferred_work_type_ = kNonDelayed;
deferred_do_idle_work_ &= do_idle_work;
QuitJavaSystemMessageHandler();
return;
}
base::MessagePumpForUI::DoNonDelayedLooperWork(do_idle_work);
}
void NestedMessagePumpAndroid::RunJavaSystemMessageHandler() {
auto* env = base::android::AttachCurrentThread();
CHECK(!quit_message_handler_);
CHECK(!inside_run_message_handler_);
base::AutoReset<bool> auto_reset(&inside_run_message_handler_, true);
bool ret = Java_NestedSystemMessageHandler_dispatchOneMessage(env);
CHECK(ret) << "Error running java message loop, tests will likely fail.";
quit_message_handler_ = false;
}
void NestedMessagePumpAndroid::QuitJavaSystemMessageHandler() {
if (!inside_run_message_handler_ || quit_message_handler_)
return;
quit_message_handler_ = true;
auto* env = base::android::AttachCurrentThread();
Java_NestedSystemMessageHandler_postQuitMessage(env);
}
}