Commit ee8602d3 authored by Sigurd Schneider's avatar Sigurd Schneider Committed by Commit Bot

[coverage] Add event for coverage reporting

This CL adds a new event that enables the back-end to send coverage
updates on its own initiative. This event can be triggered via the C++
method `triggerPreciseCoverageDeltaUpdate` on the agent in a way that
causes coverage data to be immediatelly collected.

This is useful in the back-end to collect coverage at a certain point
in time, i.e. when a lifecycle event such as first contentful paint
occurs.

The previous interface could not support this, because it could not
reasonably be triggered from C++, and if triggered through the protocol,
dispatching messages added delay that invalidated the data (i.e. data
might have been taken too late to be accurate).

TBR=yangguo@chromium.org

Change-Id: I0f7201412a8d64866e6e314e5bc850354c13a9da
Bug: chromium:1022031
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1992437
Commit-Queue: Sigurd Schneider <sigurds@chromium.org>
Reviewed-by: 's avatarSimon Zünd <szuend@chromium.org>
Cr-Commit-Position: refs/heads/master@{#65864}
parent add4aa58
......@@ -888,6 +888,19 @@ domain Profiler
# Profile title passed as an argument to console.profile().
optional string title
# Reports coverage delta since the last poll (either from an event like this, or from
# `takePreciseCoverage` for the current isolate. May only be sent if precise code
# coverage has been started. This event can be trigged by the embedder to, for example,
# trigger collection of coverage data immediatelly at a certain point in time.
experimental event preciseCoverageDeltaUpdate
parameters
# Monotonically increasing time (in seconds) when the coverage update was taken in the backend.
number timestamp
# Identifier for distinguishing coverage events.
string occassion
# Coverage data for the current isolate.
array of ScriptCoverage result
# Runtime domain exposes JavaScript runtime by means of remote evaluation and mirror objects.
# Evaluation results are returned as mirror object that expose object type, string representation
# and unique identifier that can be used for further object reference. Original objects are
......
......@@ -161,6 +161,8 @@ class V8_EXPORT V8InspectorSession {
v8::Local<v8::Context>*,
std::unique_ptr<StringBuffer>* objectGroup) = 0;
virtual void releaseObjectGroup(const StringView&) = 0;
virtual void triggerPreciseCoverageDeltaUpdate(
const StringView& occassion) = 0;
};
class V8_EXPORT V8InspectorClient {
......
......@@ -464,4 +464,9 @@ V8InspectorSessionImpl::searchInTextByLines(const StringView& text,
return result;
}
void V8InspectorSessionImpl::triggerPreciseCoverageDeltaUpdate(
const StringView& occassion) {
m_profilerAgent->triggerPreciseCoverageDeltaUpdate(toString16(occassion));
}
} // namespace v8_inspector
......@@ -92,6 +92,8 @@ class V8InspectorSessionImpl : public V8InspectorSession,
V8InspectorSession::Inspectable* inspectedObject(unsigned num);
static const unsigned kInspectedObjectBufferSize = 5;
void triggerPreciseCoverageDeltaUpdate(const StringView& occassion) override;
private:
V8InspectorSessionImpl(V8InspectorImpl*, int contextGroupId, int sessionId,
V8Inspector::Channel*, const StringView& state);
......
......@@ -414,6 +414,22 @@ Response V8ProfilerAgentImpl::takePreciseCoverage(
return coverageToProtocol(m_session->inspector(), coverage, out_result);
}
void V8ProfilerAgentImpl::triggerPreciseCoverageDeltaUpdate(
const String16& occassion) {
if (!m_state->booleanProperty(ProfilerAgentState::preciseCoverageStarted,
false)) {
return;
}
v8::HandleScope handle_scope(m_isolate);
v8::debug::Coverage coverage = v8::debug::Coverage::CollectPrecise(m_isolate);
std::unique_ptr<protocol::Array<protocol::Profiler::ScriptCoverage>>
out_result;
coverageToProtocol(m_session->inspector(), coverage, &out_result);
double now =
v8::base::TimeTicks::HighResolutionNow().since_origin().InSecondsF();
m_frontend.preciseCoverageDeltaUpdate(now, occassion, std::move(out_result));
}
Response V8ProfilerAgentImpl::getBestEffortCoverage(
std::unique_ptr<protocol::Array<protocol::Profiler::ScriptCoverage>>*
out_result) {
......
......@@ -65,6 +65,8 @@ class V8ProfilerAgentImpl : public protocol::Profiler::Backend {
void consoleProfile(const String16& title);
void consoleProfileEnd(const String16& title);
void triggerPreciseCoverageDeltaUpdate(const String16& occassion);
private:
String16 nextProfileId();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment