#include "tests/shared/browser/main_message_loop_external_pump.h"
#include <climits>
#include "include/cef_app.h"
#include "include/wrapper/cef_helpers.h"
#include "tests/shared/browser/main_message_loop.h"
namespace client {
namespace {
const int32 kTimerDelayPlaceholder = INT_MAX;
const int64 kMaxTimerDelay = 1000 / 30;
client::MainMessageLoopExternalPump* g_external_message_pump = nullptr;
}
MainMessageLoopExternalPump::MainMessageLoopExternalPump()
: is_active_(false), reentrancy_detected_(false) {
DCHECK(!g_external_message_pump);
g_external_message_pump = this;
}
MainMessageLoopExternalPump::~MainMessageLoopExternalPump() {
g_external_message_pump = nullptr;
}
MainMessageLoopExternalPump* MainMessageLoopExternalPump::Get() {
return g_external_message_pump;
}
void MainMessageLoopExternalPump::OnScheduleWork(int64 delay_ms) {
REQUIRE_MAIN_THREAD();
if (delay_ms == kTimerDelayPlaceholder && IsTimerPending()) {
return;
}
KillTimer();
if (delay_ms <= 0) {
DoWork();
} else {
if (delay_ms > kMaxTimerDelay)
delay_ms = kMaxTimerDelay;
SetTimer(delay_ms);
}
}
void MainMessageLoopExternalPump::OnTimerTimeout() {
REQUIRE_MAIN_THREAD();
KillTimer();
DoWork();
}
void MainMessageLoopExternalPump::DoWork() {
const bool was_reentrant = PerformMessageLoopWork();
if (was_reentrant) {
OnScheduleMessagePumpWork(0);
} else if (!IsTimerPending()) {
OnScheduleMessagePumpWork(kTimerDelayPlaceholder);
}
}
bool MainMessageLoopExternalPump::PerformMessageLoopWork() {
if (is_active_) {
reentrancy_detected_ = true;
return false;
}
reentrancy_detected_ = false;
is_active_ = true;
CefDoMessageLoopWork();
is_active_ = false;
return reentrancy_detected_;
}
}