blob: 887ebb6b631fef5cc2ba8380f5870296d28e4afd [file] [log] [blame]
// Copyright 2015 The Chromium Authors
// 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/dom/document_timing.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/core/loader/document_loader.h"
#include "third_party/blink/renderer/core/loader/interactive_detector.h"
#include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
namespace blink {
DocumentTiming::DocumentTiming(Document& document) : document_(document) {
if (document_->GetReadyState() == Document::kLoading)
MarkDomLoading();
}
void DocumentTiming::Trace(Visitor* visitor) const {
visitor->Trace(document_);
}
LocalFrame* DocumentTiming::GetFrame() const {
return document_ ? document_->GetFrame() : nullptr;
}
void DocumentTiming::NotifyDocumentTimingChanged() {
if (document_ && document_->Loader())
document_->Loader()->DidChangePerformanceTiming();
}
void DocumentTiming::MarkDomLoading() {
dom_loading_ = base::TimeTicks::Now();
TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing,rail", "domLoading",
dom_loading_, "frame",
GetFrameIdForTracing(GetFrame()));
NotifyDocumentTimingChanged();
}
void DocumentTiming::MarkDomInteractive() {
dom_interactive_ = base::TimeTicks::Now();
TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing,rail", "domInteractive",
dom_interactive_, "frame",
GetFrameIdForTracing(GetFrame()));
NotifyDocumentTimingChanged();
}
void DocumentTiming::MarkDomContentLoadedEventStart() {
dom_content_loaded_event_start_ = base::TimeTicks::Now();
TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing,rail",
"domContentLoadedEventStart",
dom_content_loaded_event_start_, "frame",
GetFrameIdForTracing(GetFrame()));
NotifyDocumentTimingChanged();
}
void DocumentTiming::MarkDomContentLoadedEventEnd() {
dom_content_loaded_event_end_ = base::TimeTicks::Now();
TRACE_EVENT_MARK_WITH_TIMESTAMP1(
"blink.user_timing,rail", "domContentLoadedEventEnd",
dom_content_loaded_event_end_, "frame", GetFrameIdForTracing(GetFrame()));
InteractiveDetector* interactive_detector(
InteractiveDetector::From(*document_));
if (interactive_detector) {
interactive_detector->OnDomContentLoadedEnd(dom_content_loaded_event_end_);
}
NotifyDocumentTimingChanged();
}
void DocumentTiming::MarkDomComplete() {
dom_complete_ = base::TimeTicks::Now();
TRACE_EVENT_MARK_WITH_TIMESTAMP1("blink.user_timing,rail", "domComplete",
dom_complete_, "frame",
GetFrameIdForTracing(GetFrame()));
NotifyDocumentTimingChanged();
}
} // namespace blink