// Copyright 2016 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "cobalt/browser/web_module_stat_tracker.h"

#if defined(ENABLE_WEBDRIVER)
#include <sstream>
#endif  // ENABLE_WEBDRIVER

#include "base/stringprintf.h"
#include "cobalt/base/tokens.h"
#include "cobalt/dom/event.h"
#if defined(ENABLE_WEBDRIVER)
#include "cobalt/dom/global_stats.h"
#endif  // ENABLE_WEBDRIVER

namespace cobalt {
namespace browser {

WebModuleStatTracker::WebModuleStatTracker(const std::string& name,
                                           bool should_track_event_stats)
    : name_(name),
      should_track_event_stats_(should_track_event_stats),
      dom_stat_tracker_(new dom::DomStatTracker(name)),
      layout_stat_tracker_(new layout::LayoutStatTracker(name)),
      event_is_processing_(StringPrintf("Event.%s.IsProcessing", name.c_str()),
                           false, "Nonzero when an event is being processed."),
      current_event_type_(kEventTypeInvalid),
      current_event_dispatched_event_(nullptr) {
  if (should_track_event_stats_) {
    event_stats_list_.reserve(kNumEventTypes);
    for (int i = 0; i < kNumEventTypes; ++i) {
      EventType event_type = static_cast<EventType>(i);
      event_stats_list_.push_back(new EventStats(StringPrintf(
          "%s.%s", name.c_str(), GetEventTypeName(event_type).c_str())));
    }
  }

  stop_watches_.reserve(kNumStopWatchTypes);
  for (int i = 0; i < kNumStopWatchTypes; ++i) {
    stop_watches_.push_back(
        base::StopWatch(i, base::StopWatch::kAutoStartOff, this));
  }
  stop_watch_durations_.resize(kNumStopWatchTypes, base::TimeDelta());
}

void WebModuleStatTracker::OnStartDispatchEvent(
    const scoped_refptr<dom::Event>& event) {
  if (!should_track_event_stats_) {
    return;
  }

  // If an event is already being tracked, then don't track this event. It needs
  // to be allowed to finish.
  if (current_event_type_ != kEventTypeInvalid) {
    return;
  }

  // Determine the event type.
  if (event->type() == base::Tokens::keydown()) {
    current_event_type_ = kEventTypeKeyDown;
  } else if (event->type() == base::Tokens::keyup()) {
    current_event_type_ = kEventTypeKeyUp;
  } else if (event->type() == base::Tokens::pointerdown()) {
    current_event_type_ = kEventTypePointerDown;
  } else if (event->type() == base::Tokens::pointerup()) {
    current_event_type_ = kEventTypePointerUp;
  } else {
    current_event_type_ = kEventTypeInvalid;
  }

  // If this is a valid event type, then start tracking it.
  if (current_event_type_ != kEventTypeInvalid) {
    DCHECK(!event_is_processing_);

    event_is_processing_ = true;
    current_event_dispatched_event_ = event;
    current_event_start_time_ = base::TimeTicks::Now();
    current_event_render_tree_produced_time_ = base::TimeTicks();

    dom_stat_tracker_->StartTrackingEvent();
    layout_stat_tracker_->StartTrackingEvent();

    stop_watch_durations_[kStopWatchTypeDispatchEvent] = base::TimeDelta();
    stop_watches_[kStopWatchTypeDispatchEvent].Start();
  }
}

void WebModuleStatTracker::OnStopDispatchEvent(
    const scoped_refptr<dom::Event>& event,
    bool are_animation_frame_callbacks_pending,
    bool is_new_render_tree_pending) {
  // Verify that this dispatched event is the one currently being tracked.
  if (event != current_event_dispatched_event_) {
    return;
  }

  current_event_dispatched_event_ = nullptr;
  stop_watches_[kStopWatchTypeDispatchEvent].Stop();

  if (!are_animation_frame_callbacks_pending && !is_new_render_tree_pending &&
      current_event_render_tree_produced_time_.is_null()) {
    EndCurrentEvent(base::TimeTicks::Now());
  }
}

void WebModuleStatTracker::OnRanAnimationFrameCallbacks(
    bool is_new_render_tree_pending) {
  if (current_event_type_ == kEventTypeInvalid) {
    return;
  }

  if (!is_new_render_tree_pending &&
      current_event_render_tree_produced_time_.is_null()) {
    EndCurrentEvent(base::TimeTicks::Now());
  }
}

void WebModuleStatTracker::OnRenderTreeProduced(
    const base::TimeTicks& produced_time) {
  // Flush the periodic tracking regardless of whether or not there is a current
  // event. Periodic tracking is not tied to events.
  dom_stat_tracker_->FlushPeriodicTracking();
  layout_stat_tracker_->FlushPeriodicTracking();

  if (current_event_type_ == kEventTypeInvalid) {
    return;
  }

  // Event tracking stops when the first render tree being produced. At that
  // point, processing switches to the rasterizer thread and any subsequent
  // dom/layout work that occurs will not be associated with the event's first
  // render tree.
  if (current_event_render_tree_produced_time_.is_null()) {
    current_event_render_tree_produced_time_ = produced_time;
    dom_stat_tracker_->StopTrackingEvent();
    layout_stat_tracker_->StopTrackingEvent();
  }
}

void WebModuleStatTracker::OnRenderTreeRasterized(
    const base::TimeTicks& produced_time,
    const base::TimeTicks& rasterized_time) {
  if (current_event_type_ == kEventTypeInvalid) {
    return;
  }

  // End the event if the event's render tree has already been produced and
  // the rasterized render tree is not older than the event's render tree.
  if (!current_event_render_tree_produced_time_.is_null() &&
      produced_time >= current_event_render_tree_produced_time_) {
    EndCurrentEvent(rasterized_time);
  }
}

WebModuleStatTracker::EventStats::EventStats(const std::string& name)
    : start_time(StringPrintf("Event.Time.%s.Start", name.c_str()), 0,
          "The time that the event started."),
      produced_render_tree(
          StringPrintf("Event.%s.ProducedRenderTree", name.c_str()), false,
          "Nonzero when the event produced a render tree."),
      count_dom_html_element(
          StringPrintf("Event.Count.%s.DOM.HtmlElement", name.c_str()), 0,
          "Total number of HTML elements."),
      count_dom_html_element_created(
          StringPrintf("Event.Count.%s.DOM.HtmlElement.Created", name.c_str()),
          0, "Total number of HTML elements created."),
      count_dom_html_element_destroyed(
          StringPrintf("Event.Count.%s.DOM.HtmlElement.Destroyed",
                       name.c_str()),
          0, "Total number of HTML elements destroyed."),
      count_dom_html_element_document(
          StringPrintf("Event.Count.%s.DOM.HtmlElement.Document", name.c_str()),
          0, "Number of HTML elements in document."),
      count_dom_html_element_document_added(
          StringPrintf("Event.Count.%s.DOM.HtmlElement.Document.Added",
                       name.c_str()),
          0, "Number of HTML elements added to document."),
      count_dom_html_element_document_removed(
          StringPrintf("Event.Count.%s.DOM.HtmlElement.Document.Removed",
                       name.c_str()),
          0, "Number of HTML elements removed from document."),
      count_dom_update_matching_rules(
          StringPrintf("Event.Count.%s.DOM.HtmlElement.UpdateMatchingRules",
                       name.c_str()),
          0, "Number of HTML elements that had their matching rules updated."),
      count_dom_update_computed_style(
          StringPrintf("Event.Count.%s.DOM.HtmlElement.UpdateComputedStyle",
                       name.c_str()),
          0, "Number of HTML elements that had their computed style updated."),
      count_dom_generate_html_element_computed_style(
          StringPrintf(
              "Event.Count.%s.DOM.HtmlElement.GenerateHtmlElementComputedStyle",
              name.c_str()),
          0,
          "Number of HTML elements that had their computed style generated."),
      count_dom_generate_pseudo_element_computed_style(
          StringPrintf("Event.Count.%s.DOM.HtmlElement."
                       "GeneratePseudoElementComputedStyle",
                       name.c_str()),
          0,
          "Number of pseudo elements that had their computed style generated."),
      count_layout_box(StringPrintf("Event.Count.%s.Layout.Box", name.c_str()),
                       0, "Number of layout boxes."),
      count_layout_box_created(
          StringPrintf("Event.Count.%s.Layout.Box.Created", name.c_str()), 0,
          "Number of layout boxes created."),
      count_layout_box_destroyed(
          StringPrintf("Event.Count.%s.Layout.Box.Destroyed", name.c_str()), 0,
          "Number of layout boxes destroyed."),
      count_layout_update_size(
          StringPrintf("Event.Count.%s.Layout.Box.UpdateSize", name.c_str()), 0,
          "Number of layout boxes that had their size updated."),
      count_layout_render_and_animate(
          StringPrintf("Event.Count.%s.Layout.Box.RenderAndAnimate",
                       name.c_str()),
          0, "Number of layout boxes that had their render tree node updated."),
      count_layout_update_cross_references(
          StringPrintf("Event.Count.%s.Layout.Box.UpdateCrossReferences",
                       name.c_str()),
          0, "Number of layout boxes that had their cross references updated."),
      duration_total(StringPrintf("Event.Duration.%s", name.c_str()),
                     base::TimeDelta(),
                     "Total duration of the event (in microseconds). This is "
                     "the time elapsed from the event dispatch until the "
                     "render tree is produced."),
      duration_dom_dispatch_event(
          StringPrintf("Event.Duration.%s.DOM.DispatchEvent", name.c_str()),
          base::TimeDelta(),
          "Dispatch duration, which includes JS, for event (in "
          "microseconds). This does not include subsequent DOM and Layout "
          "processing."),
      duration_dom_run_animation_frame_callbacks(
          StringPrintf("Event.Duration.%s.DOM.RunAnimationFrameCallbacks",
                       name.c_str()),
          base::TimeDelta(),
          "Run animation frame callbacks duration for event (in "
          "microseconds)."),
      duration_dom_update_computed_style(
          StringPrintf("Event.Duration.%s.DOM.UpdateComputedStyle",
                       name.c_str()),
          base::TimeDelta(),
          "UpdateComputedStyle duration for event (in microseconds)."),
      duration_layout_box_tree(
          StringPrintf("Event.Duration.%s.Layout.BoxTree", name.c_str()),
          base::TimeDelta(),
          "Layout box tree duration for event (in microseconds)."),
      duration_layout_box_generation(
          StringPrintf("Event.Duration.%s.Layout.BoxTree.BoxGeneration",
                       name.c_str()),
          base::TimeDelta(),
          "BoxGeneration duration for event (in microseconds)."),
      duration_layout_update_used_sizes(
          StringPrintf("Event.Duration.%s.Layout.BoxTree.UpdateUsedSizes",
                       name.c_str()),
          base::TimeDelta(),
          "UpdateUsedSizes duration for event (in microseconds)."),
      duration_layout_render_and_animate(
          StringPrintf("Event.Duration.%s.Layout.RenderAndAnimate",
                       name.c_str()),
          base::TimeDelta(),
          "RenderAndAnimate duration for event (in microseconds)."),
      duration_renderer_rasterize(
          StringPrintf("Event.Duration.%s.Renderer.Rasterize", name.c_str()),
          base::TimeDelta(), "Rasterize duration for event (in microseconds).")
#if defined(ENABLE_WEBDRIVER)
      ,
      value_dictionary(
          StringPrintf("Event.%s.ValueDictionary", name.c_str()), "{}",
          "All event values represented as a dictionary in a string.")
#endif  // ENABLE_WEBDRIVER
{
}

bool WebModuleStatTracker::IsStopWatchEnabled(int /*id*/) const { return true; }

void WebModuleStatTracker::OnStopWatchStopped(int id,
                                              base::TimeDelta time_elapsed) {
  stop_watch_durations_[static_cast<size_t>(id)] += time_elapsed;
}

void WebModuleStatTracker::EndCurrentEvent(base::TimeTicks event_end_time) {
  if (current_event_type_ == kEventTypeInvalid) {
    return;
  }

  DCHECK(event_is_processing_);
  DCHECK(!current_event_start_time_.is_null());

  // If no render tree was produced by this event, then tracking stops at the
  // end of the event; otherwise, it already stopped when the render tree was
  // produced.
  if (current_event_render_tree_produced_time_.is_null()) {
    dom_stat_tracker_->StopTrackingEvent();
    layout_stat_tracker_->StopTrackingEvent();
  }

  // If a render tree was produced by this event, then the event is ending with
  // the render tree's rasterization; otherwise, there was no rasterization.
  base::TimeDelta renderer_rasterize_duration =
      !current_event_render_tree_produced_time_.is_null()
          ? event_end_time - current_event_render_tree_produced_time_
          : base::TimeDelta();

  EventStats* event_stats = event_stats_list_[current_event_type_];
  event_stats->start_time = current_event_start_time_.ToInternalValue();
  event_stats->produced_render_tree =
      !current_event_render_tree_produced_time_.is_null();

  // Update event counts
  event_stats->count_dom_html_element =
      dom_stat_tracker_->EventCountHtmlElement();
  event_stats->count_dom_html_element_created =
      dom_stat_tracker_->event_count_html_element_created();
  event_stats->count_dom_html_element_destroyed =
      dom_stat_tracker_->event_count_html_element_destroyed();
  event_stats->count_dom_html_element_document =
      dom_stat_tracker_->EventCountHtmlElementDocument();
  event_stats->count_dom_html_element_document_added =
      dom_stat_tracker_->event_count_html_element_document_added();
  event_stats->count_dom_html_element_document_removed =
      dom_stat_tracker_->event_count_html_element_document_removed();
  event_stats->count_dom_update_matching_rules =
      dom_stat_tracker_->event_count_update_matching_rules();
  event_stats->count_dom_update_computed_style =
      dom_stat_tracker_->event_count_update_computed_style();
  event_stats->count_dom_generate_html_element_computed_style =
      dom_stat_tracker_->event_count_generate_html_element_computed_style();
  event_stats->count_dom_generate_pseudo_element_computed_style =
      dom_stat_tracker_->event_count_generate_pseudo_element_computed_style();
  event_stats->count_layout_box = layout_stat_tracker_->EventCountBox();
  event_stats->count_layout_box_created =
      layout_stat_tracker_->event_count_box_created();
  event_stats->count_layout_box_destroyed =
      layout_stat_tracker_->event_count_box_destroyed();
  event_stats->count_layout_update_size =
      layout_stat_tracker_->event_count_update_size();
  event_stats->count_layout_render_and_animate =
      layout_stat_tracker_->event_count_render_and_animate();
  event_stats->count_layout_update_cross_references =
      layout_stat_tracker_->event_count_update_cross_references();

  // Update event durations
  event_stats->duration_total = event_end_time - current_event_start_time_;
  event_stats->duration_dom_dispatch_event =
      stop_watch_durations_[kStopWatchTypeDispatchEvent];
  event_stats->duration_dom_run_animation_frame_callbacks =
      dom_stat_tracker_->GetStopWatchTypeDuration(
          dom::DomStatTracker::kStopWatchTypeRunAnimationFrameCallbacks);
  event_stats->duration_dom_update_computed_style =
      dom_stat_tracker_->GetStopWatchTypeDuration(
          dom::DomStatTracker::kStopWatchTypeUpdateComputedStyle);
  event_stats->duration_layout_box_tree =
      layout_stat_tracker_->GetStopWatchTypeDuration(
          layout::LayoutStatTracker::kStopWatchTypeLayoutBoxTree);
  event_stats->duration_layout_box_generation =
      layout_stat_tracker_->GetStopWatchTypeDuration(
          layout::LayoutStatTracker::kStopWatchTypeBoxGeneration);
  event_stats->duration_layout_update_used_sizes =
      layout_stat_tracker_->GetStopWatchTypeDuration(
          layout::LayoutStatTracker::kStopWatchTypeUpdateUsedSizes);
  event_stats->duration_layout_render_and_animate =
      layout_stat_tracker_->GetStopWatchTypeDuration(
          layout::LayoutStatTracker::kStopWatchTypeRenderAndAnimate);
  event_stats->duration_renderer_rasterize = renderer_rasterize_duration;

#if defined(ENABLE_WEBDRIVER)
  // When the Webdriver is enabled, all of the event's values are stored
  // within a single string representing a dictionary of key-value pairs.
  // This allows the Webdriver to query a single CVal to retrieve all of the
  // event's values.
  std::ostringstream oss;
  oss << "{"
      << "\"StartTime\":" << current_event_start_time_.ToInternalValue() << ", "
      << "\"ProducedRenderTree\":"
      << !current_event_render_tree_produced_time_.is_null() << ", "
      << "\"CntDomEventListeners\":"
      << dom::GlobalStats::GetInstance()->GetNumEventListeners() << ", "
      << "\"CntDomNodes\":" << dom::GlobalStats::GetInstance()->GetNumNodes()
      << ", "
      << "\"CntDomHtmlElements\":" << dom_stat_tracker_->EventCountHtmlElement()
      << ", "
      << "\"CntDomDocumentHtmlElements\":"
      << dom_stat_tracker_->EventCountHtmlElementDocument() << ", "
      << "\"CntDomHtmlElementsCreated\":"
      << dom_stat_tracker_->event_count_html_element_created() << ", "
      << "\"CntDomUpdateMatchingRules\":"
      << dom_stat_tracker_->event_count_update_matching_rules() << ", "
      << "\"CntDomUpdateComputedStyle\":"
      << dom_stat_tracker_->event_count_update_computed_style() << ", "
      << "\"CntDomGenerateHtmlComputedStyle\":"
      << dom_stat_tracker_->event_count_generate_html_element_computed_style()
      << ", "
      << "\"CntDomGeneratePseudoComputedStyle\":"
      << dom_stat_tracker_->event_count_generate_pseudo_element_computed_style()
      << ", "
      << "\"CntLayoutBoxes\":" << layout_stat_tracker_->EventCountBox() << ", "
      << "\"CntLayoutBoxesCreated\":"
      << layout_stat_tracker_->event_count_box_created() << ", "
      << "\"CntLayoutUpdateSize\":"
      << layout_stat_tracker_->event_count_update_size() << ", "
      << "\"CntLayoutRenderAndAnimate\":"
      << layout_stat_tracker_->event_count_render_and_animate() << ", "
      << "\"CntLayoutUpdateCrossReferences\":"
      << layout_stat_tracker_->event_count_update_cross_references() << ", "
      << "\"DurTotalUs\":"
      << (event_end_time - current_event_start_time_).InMicroseconds() << ", "
      << "\"DurDomInjectEventUs\":"
      << stop_watch_durations_[kStopWatchTypeDispatchEvent].InMicroseconds()
      << ", "
      << "\"DurDomRunAnimationFrameCallbacksUs\":"
      << dom_stat_tracker_
             ->GetStopWatchTypeDuration(
                 dom::DomStatTracker::kStopWatchTypeRunAnimationFrameCallbacks)
             .InMicroseconds()
      << ", "
      << "\"DurDomUpdateComputedStyleUs\":"
      << dom_stat_tracker_
             ->GetStopWatchTypeDuration(
                 dom::DomStatTracker::kStopWatchTypeUpdateComputedStyle)
             .InMicroseconds()
      << ", "
      << "\"DurLayoutBoxTreeUs\":"
      << layout_stat_tracker_
             ->GetStopWatchTypeDuration(
                 layout::LayoutStatTracker::kStopWatchTypeLayoutBoxTree)
             .InMicroseconds()
      << ", "
      << "\"DurLayoutBoxTreeBoxGenerationUs\":"
      << layout_stat_tracker_
             ->GetStopWatchTypeDuration(
                 layout::LayoutStatTracker::kStopWatchTypeBoxGeneration)
             .InMicroseconds()
      << ", "
      << "\"DurLayoutBoxTreeUpdateUsedSizesUs\":"
      << layout_stat_tracker_
             ->GetStopWatchTypeDuration(
                 layout::LayoutStatTracker::kStopWatchTypeUpdateUsedSizes)
             .InMicroseconds()
      << ", "
      << "\"DurLayoutRenderAndAnimateUs\":"
      << layout_stat_tracker_
             ->GetStopWatchTypeDuration(
                 layout::LayoutStatTracker::kStopWatchTypeRenderAndAnimate)
             .InMicroseconds()
      << ", "
      << "\"DurRendererRasterizeUs\":"
      << renderer_rasterize_duration.InMicroseconds() << "}";
  event_stats->value_dictionary = oss.str();
#endif  // ENABLE_WEBDRIVER

  event_is_processing_ = false;
  current_event_type_ = kEventTypeInvalid;
}

std::string WebModuleStatTracker::GetEventTypeName(
    WebModuleStatTracker::EventType event_type) {
  switch (event_type) {
    case WebModuleStatTracker::kEventTypeKeyDown:
      return "KeyDown";
    case WebModuleStatTracker::kEventTypeKeyUp:
      return "KeyUp";
    case WebModuleStatTracker::kEventTypePointerDown:
      return "PointerDown";
    case WebModuleStatTracker::kEventTypePointerUp:
      return "PointerUp";
    case WebModuleStatTracker::kEventTypeInvalid:
    case WebModuleStatTracker::kNumEventTypes:
      break;
  }
  NOTREACHED();
  return "Invalid";
}

}  // namespace browser
}  // namespace cobalt
