// Copyright 2018 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 "third_party/blink/renderer/core/timing/event_timing.h"

#include "third_party/blink/renderer/core/dom/events/event.h"
#include "third_party/blink/renderer/core/events/pointer_event.h"
#include "third_party/blink/renderer/core/frame/local_dom_window.h"
#include "third_party/blink/renderer/core/timing/dom_window_performance.h"
#include "third_party/blink/renderer/core/timing/performance_event_timing.h"
#include "third_party/blink/renderer/platform/wtf/time.h"

namespace blink {

EventTiming::EventTiming(LocalDOMWindow* window) {
  performance_ = DOMWindowPerformance::performance(*window);
}

bool EventTiming::ShouldReportForEventTiming(const Event* event) const {
  return (event->IsMouseEvent() || event->IsPointerEvent() ||
          event->IsTouchEvent() || event->IsKeyboardEvent() ||
          event->IsWheelEvent() || event->IsInputEvent() ||
          event->IsCompositionEvent()) &&
         event->isTrusted();
}

void EventTiming::WillDispatchEvent(const Event* event) {
  // Assume each event can be dispatched only once.
  DCHECK(!finished_will_dispatch_event_);
  if (!performance_ || !ShouldReportForEventTiming(event))
    return;

  // Although we screen the events for timing by setting these conditions here,
  // we cannot assume that the conditions should still hold true in
  // DidDispatchEvent. These conditions have to be re-tested before an entry is
  // dispatched.
  if ((performance_->ShouldBufferEventTiming() &&
       !performance_->IsEventTimingBufferFull()) ||
      performance_->ObservingEventTimingEntries()) {
    processing_start_ = CurrentTimeTicks();
    finished_will_dispatch_event_ = true;
  }
}

void EventTiming::DidDispatchEvent(const Event* event) {
  if (!finished_will_dispatch_event_ ||
      (!event->executedListenerOrDefaultAction() && !event->DefaultHandled())) {
    return;
  }

  TimeTicks start_time;
  if (event->IsPointerEvent())
    start_time = ToPointerEvent(event)->OldestPlatformTimeStamp();
  else
    start_time = event->PlatformTimeStamp();

  performance_->RegisterEventTiming(event->type(), start_time,
                                    processing_start_, CurrentTimeTicks(),
                                    event->cancelable());
}

}  // namespace blink
