// Copyright 2014 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.

#include "services/js/js_app_message_loop_observers.h"

namespace mojo {
namespace js {

JSAppMessageLoopObservers::JSAppMessageLoopObservers(v8::Isolate* isolate)
  : isolate_(isolate),
    task_observer_(this),
    signal_observer_(this) {
  base::MessageLoop::current()->AddTaskObserver(&task_observer_);
  common::MessagePumpMojo::current()->AddObserver(&signal_observer_);
}

JSAppMessageLoopObservers::~JSAppMessageLoopObservers() {
  base::MessageLoop::current()->RemoveTaskObserver(&task_observer_);
  common::MessagePumpMojo::current()->RemoveObserver(&signal_observer_);
}

JSAppMessageLoopObservers::TaskObserver::TaskObserver(
    JSAppMessageLoopObservers* loop_observers)
    : loop_observers_(loop_observers) {
}

void JSAppMessageLoopObservers::TaskObserver::WillProcessTask(
    const base::PendingTask& pending_task) {
}

void JSAppMessageLoopObservers::TaskObserver::DidProcessTask(
    const base::PendingTask& pending_task) {
  loop_observers_->RunMicrotasks();
}

JSAppMessageLoopObservers::SignalObserver::SignalObserver(
    JSAppMessageLoopObservers* loop_observers)
    : loop_observers_(loop_observers) {
}

void JSAppMessageLoopObservers::SignalObserver::WillSignalHandler() {
}

void JSAppMessageLoopObservers::SignalObserver::DidSignalHandler() {
  loop_observers_->RunMicrotasks();
}

void JSAppMessageLoopObservers::RunMicrotasks() {
  v8::Isolate::Scope scope(isolate_);
  isolate_->RunMicrotasks();
}

}  // namespace js
}  // namespace mojo
