blob: c967719edbdf1c5423f357417cd88cff14c9e1e7 [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_parser_timing.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/loader/document_loader.h"
#include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
namespace blink {
// static
const char DocumentParserTiming::kSupplementName[] = "DocumentParserTiming";
DocumentParserTiming& DocumentParserTiming::From(Document& document) {
DocumentParserTiming* timing =
Supplement<Document>::From<DocumentParserTiming>(document);
if (!timing) {
timing = MakeGarbageCollected<DocumentParserTiming>(document);
ProvideTo(document, timing);
}
return *timing;
}
void DocumentParserTiming::MarkParserStart() {
if (parser_detached_ || !parser_start_.is_null())
return;
DCHECK(parser_stop_.is_null());
parser_start_ = base::TimeTicks::Now();
NotifyDocumentParserTimingChanged();
}
void DocumentParserTiming::MarkParserStop() {
if (parser_detached_ || parser_start_.is_null() || !parser_stop_.is_null())
return;
parser_stop_ = base::TimeTicks::Now();
NotifyDocumentParserTimingChanged();
}
void DocumentParserTiming::MarkParserDetached() {
DCHECK(!parser_start_.is_null());
parser_detached_ = true;
}
void DocumentParserTiming::RecordParserBlockedOnScriptLoadDuration(
base::TimeDelta duration,
bool script_inserted_via_document_write) {
if (parser_detached_ || parser_start_.is_null() || !parser_stop_.is_null())
return;
parser_blocked_on_script_load_duration_ += duration;
if (script_inserted_via_document_write)
parser_blocked_on_script_load_from_document_write_duration_ += duration;
NotifyDocumentParserTimingChanged();
}
void DocumentParserTiming::RecordParserBlockedOnScriptExecutionDuration(
base::TimeDelta duration,
bool script_inserted_via_document_write) {
if (parser_detached_ || parser_start_.is_null() || !parser_stop_.is_null())
return;
parser_blocked_on_script_execution_duration_ += duration;
if (script_inserted_via_document_write)
parser_blocked_on_script_execution_from_document_write_duration_ +=
duration;
NotifyDocumentParserTimingChanged();
}
void DocumentParserTiming::Trace(Visitor* visitor) const {
Supplement<Document>::Trace(visitor);
}
DocumentParserTiming::DocumentParserTiming(Document& document)
: Supplement<Document>(document) {}
void DocumentParserTiming::NotifyDocumentParserTimingChanged() {
if (GetSupplementable()->Loader())
GetSupplementable()->Loader()->DidChangePerformanceTiming();
}
} // namespace blink