Commit 1278739a authored by Nicolas Pena's avatar Nicolas Pena Committed by Commit Bot

Add toJSON to some performance idls

This CL adds toJSON to the following:
* PerformanceLongTaskTiming
* PerformanceResourceTiming
* TaskAttributionTiming
* Performance within workers

Link to Intent to Implement and Ship thread:
https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/ZnXvNe_wNyk

Bug: 740094
Change-Id: I54622b9bd213fd806a9108598ccf4798c2ceffa2
Reviewed-on: https://chromium-review.googlesource.com/802019Reviewed-by: default avatarJeremy Roman <jbroman@chromium.org>
Reviewed-by: default avatarPhilip Jägenstedt <foolip@chromium.org>
Reviewed-by: default avatarBo <boliu@chromium.org>
Reviewed-by: default avatarTimothy Dresser <tdresser@chromium.org>
Commit-Queue: Nicolás Peña Moreno <npm@chromium.org>
Cr-Commit-Position: refs/heads/master@{#523532}
parent b879bf58
......@@ -3218,6 +3218,7 @@ interface PerformanceResourceTiming : PerformanceEntry
getter secureConnectionStart
getter workerStart
method constructor
method toJSON
interface PerformanceTiming
getter connectEnd
getter connectStart
......
This is a testharness.js-based test.
PASS Test driver
PASS Window interface: attribute performance
PASS Window interface: window must inherit property "performance" with the proper type
PASS WorkerGlobalScope interface: existence and properties of interface object
PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object
PASS SharedWorkerGlobalScope interface: existence and properties of interface object
PASS WorkerNavigator interface: existence and properties of interface object
PASS WorkerLocation interface: existence and properties of interface object
PASS Performance interface: existence and properties of interface object
PASS Performance interface object length
PASS Performance interface object name
PASS Performance interface: existence and properties of interface prototype object
PASS Performance interface: existence and properties of interface prototype object's "constructor" property
PASS Performance interface: operation now()
PASS Performance interface: attribute timeOrigin
PASS Performance interface: operation toJSON()
PASS Performance must be primary interface of window.performance
PASS Stringification of window.performance
PASS Performance interface: window.performance must inherit property "now()" with the proper type
PASS Performance interface: window.performance must inherit property "timeOrigin" with the proper type
PASS Performance interface: window.performance must inherit property "toJSON()" with the proper type
FAIL Test default toJSON operation of Performance assert_true: property "timeOrigin" should be present in the output of Performance.prototype.toJSON() expected true got false
Harness: the test ran to completion.
This is a testharness.js-based test.
Found 51 tests; 50 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN.
PASS Performance interface: operation clearResourceTimings()
PASS Performance interface: operation setResourceTimingBufferSize(unsigned long)
PASS Performance interface: attribute onresourcetimingbufferfull
PASS Performance interface: window.performance must inherit property "clearResourceTimings()" with the proper type
PASS Performance interface: window.performance must inherit property "setResourceTimingBufferSize(unsigned long)" with the proper type
PASS Performance interface: calling setResourceTimingBufferSize(unsigned long) on window.performance with too few arguments must throw TypeError
PASS Performance interface: window.performance must inherit property "onresourcetimingbufferfull" with the proper type
PASS PerformanceResourceTiming interface: existence and properties of interface object
PASS PerformanceResourceTiming interface object length
PASS PerformanceResourceTiming interface object name
PASS PerformanceResourceTiming interface: existence and properties of interface prototype object
PASS PerformanceResourceTiming interface: existence and properties of interface prototype object's "constructor" property
PASS PerformanceResourceTiming interface: attribute initiatorType
PASS PerformanceResourceTiming interface: attribute nextHopProtocol
PASS PerformanceResourceTiming interface: attribute workerStart
PASS PerformanceResourceTiming interface: attribute redirectStart
PASS PerformanceResourceTiming interface: attribute redirectEnd
PASS PerformanceResourceTiming interface: attribute fetchStart
PASS PerformanceResourceTiming interface: attribute domainLookupStart
PASS PerformanceResourceTiming interface: attribute domainLookupEnd
PASS PerformanceResourceTiming interface: attribute connectStart
PASS PerformanceResourceTiming interface: attribute connectEnd
PASS PerformanceResourceTiming interface: attribute secureConnectionStart
PASS PerformanceResourceTiming interface: attribute requestStart
PASS PerformanceResourceTiming interface: attribute responseStart
PASS PerformanceResourceTiming interface: attribute responseEnd
PASS PerformanceResourceTiming interface: attribute transferSize
PASS PerformanceResourceTiming interface: attribute encodedBodySize
PASS PerformanceResourceTiming interface: attribute decodedBodySize
FAIL PerformanceResourceTiming interface: operation toJSON() assert_own_property: interface prototype object missing non-static operation expected property "toJSON" missing
PASS PerformanceResourceTiming must be primary interface of window.performance.getEntriesByType('resource')[0]
PASS Stringification of window.performance.getEntriesByType('resource')[0]
PASS PerformanceResourceTiming interface: window.performance.getEntriesByType('resource')[0] must inherit property "initiatorType" with the proper type
PASS PerformanceResourceTiming interface: window.performance.getEntriesByType('resource')[0] must inherit property "nextHopProtocol" with the proper type
PASS PerformanceResourceTiming interface: window.performance.getEntriesByType('resource')[0] must inherit property "workerStart" with the proper type
PASS PerformanceResourceTiming interface: window.performance.getEntriesByType('resource')[0] must inherit property "redirectStart" with the proper type
PASS PerformanceResourceTiming interface: window.performance.getEntriesByType('resource')[0] must inherit property "redirectEnd" with the proper type
PASS PerformanceResourceTiming interface: window.performance.getEntriesByType('resource')[0] must inherit property "fetchStart" with the proper type
PASS PerformanceResourceTiming interface: window.performance.getEntriesByType('resource')[0] must inherit property "domainLookupStart" with the proper type
PASS PerformanceResourceTiming interface: window.performance.getEntriesByType('resource')[0] must inherit property "domainLookupEnd" with the proper type
PASS PerformanceResourceTiming interface: window.performance.getEntriesByType('resource')[0] must inherit property "connectStart" with the proper type
PASS PerformanceResourceTiming interface: window.performance.getEntriesByType('resource')[0] must inherit property "connectEnd" with the proper type
PASS PerformanceResourceTiming interface: window.performance.getEntriesByType('resource')[0] must inherit property "secureConnectionStart" with the proper type
PASS PerformanceResourceTiming interface: window.performance.getEntriesByType('resource')[0] must inherit property "requestStart" with the proper type
PASS PerformanceResourceTiming interface: window.performance.getEntriesByType('resource')[0] must inherit property "responseStart" with the proper type
PASS PerformanceResourceTiming interface: window.performance.getEntriesByType('resource')[0] must inherit property "responseEnd" with the proper type
PASS PerformanceResourceTiming interface: window.performance.getEntriesByType('resource')[0] must inherit property "transferSize" with the proper type
PASS PerformanceResourceTiming interface: window.performance.getEntriesByType('resource')[0] must inherit property "encodedBodySize" with the proper type
PASS PerformanceResourceTiming interface: window.performance.getEntriesByType('resource')[0] must inherit property "decodedBodySize" with the proper type
PASS PerformanceResourceTiming interface: window.performance.getEntriesByType('resource')[0] must inherit property "toJSON()" with the proper type
PASS Test default toJSON operation of PerformanceResourceTiming
Harness: the test ran to completion.
......@@ -110,9 +110,9 @@ test(function testPerformanceHasNoNavigation () {
assert_equals(typeof(performance.navigation), "undefined", "performance.navigation is undefined");
}, "performance.navigation is not available in workers");
test(function testPerformanceHasNoToJSON () {
assert_equals(typeof(performance.toJSON), "undefined", "performance.toJSON is undefined");
}, "performance.toJSON is not available in workers");
test(function testPerformanceHasToJSON () {
assert_equals(typeof(performance.toJSON), "function", "performance.toJSON is a function");
}, "performance.toJSON is available in workers");
test(function testPerformanceNoNavigationEntries () {
assert_equals(performance.getEntriesByType("navigation").length, 0, "getEntriesByType(\"navigation\") returns nothing");
......
......@@ -88,6 +88,7 @@ jsonizedPerformance [object Object]
jsonizedPerformance.navigation [object Object]
jsonizedPerformance.navigation.redirectCount [number]
jsonizedPerformance.navigation.type [number]
jsonizedPerformance.timeOrigin [number]
jsonizedPerformance.timing [object Object]
jsonizedPerformance.timing.connectEnd [number]
jsonizedPerformance.timing.connectStart [number]
......
......@@ -1003,6 +1003,7 @@ interface PerformanceResourceTiming : PerformanceEntry
getter transferSize
getter workerStart
method constructor
method toJSON
interface PerformanceServerTiming
attribute @@toStringTag
getter description
......
......@@ -694,6 +694,7 @@ interface PerformanceResourceTiming : PerformanceEntry
getter transferSize
getter workerStart
method constructor
method toJSON
interface PermissionStatus : EventTarget
attribute @@toStringTag
getter onchange
......
......@@ -694,6 +694,7 @@ interface PerformanceResourceTiming : PerformanceEntry
getter transferSize
getter workerStart
method constructor
method toJSON
interface PermissionStatus : EventTarget
attribute @@toStringTag
getter onchange
......
......@@ -669,6 +669,7 @@ Starting worker: resources/global-interface-listing-worker.js
[Worker] getter transferSize
[Worker] getter workerStart
[Worker] method constructor
[Worker] method toJSON
[Worker] interface PermissionStatus : EventTarget
[Worker] attribute @@toStringTag
[Worker] getter onchange
......
......@@ -4034,6 +4034,7 @@ interface PerformanceLongTaskTiming : PerformanceEntry
attribute @@toStringTag
getter attribution
method constructor
method toJSON
interface PerformanceMark : PerformanceEntry
attribute @@toStringTag
method constructor
......@@ -4098,6 +4099,7 @@ interface PerformanceResourceTiming : PerformanceEntry
getter transferSize
getter workerStart
method constructor
method toJSON
interface PerformanceTiming
attribute @@toStringTag
getter connectEnd
......@@ -5891,6 +5893,7 @@ interface TaskAttributionTiming : PerformanceEntry
getter containerSrc
getter containerType
method constructor
method toJSON
interface Text : CharacterData
attribute @@toStringTag
getter assignedSlot
......
......@@ -664,6 +664,7 @@ Starting worker: resources/global-interface-listing-worker.js
[Worker] getter transferSize
[Worker] getter workerStart
[Worker] method constructor
[Worker] method toJSON
[Worker] interface PermissionStatus : EventTarget
[Worker] attribute @@toStringTag
[Worker] getter onchange
......
......@@ -932,6 +932,7 @@ Starting worker: resources/global-interface-listing-worker.js
[Worker] getter transferSize
[Worker] getter workerStart
[Worker] method constructor
[Worker] method toJSON
[Worker] interface PerformanceServerTiming
[Worker] attribute @@toStringTag
[Worker] getter description
......
......@@ -4910,6 +4910,7 @@ interface PerformanceLongTaskTiming : PerformanceEntry
attribute @@toStringTag
getter attribution
method constructor
method toJSON
interface PerformanceMark : PerformanceEntry
attribute @@toStringTag
method constructor
......@@ -4975,6 +4976,7 @@ interface PerformanceResourceTiming : PerformanceEntry
getter transferSize
getter workerStart
method constructor
method toJSON
interface PerformanceServerTiming
attribute @@toStringTag
getter description
......@@ -6847,6 +6849,7 @@ interface TaskAttributionTiming : PerformanceEntry
getter containerSrc
getter containerType
method constructor
method toJSON
interface Text : CharacterData
attribute @@toStringTag
getter assignedSlot
......
......@@ -927,6 +927,7 @@ Starting worker: resources/global-interface-listing-worker.js
[Worker] getter transferSize
[Worker] getter workerStart
[Worker] method constructor
[Worker] method toJSON
[Worker] interface PerformanceServerTiming
[Worker] attribute @@toStringTag
[Worker] getter description
......
......@@ -175,11 +175,11 @@ void Performance::UpdateLongTaskInstrumentation() {
}
}
ScriptValue Performance::toJSONForBinding(ScriptState* script_state) const {
V8ObjectBuilder result(script_state);
result.Add("timing", timing()->toJSONForBinding(script_state));
result.Add("navigation", navigation()->toJSONForBinding(script_state));
return result.GetScriptValue();
void Performance::BuildJSONValue(V8ObjectBuilder& builder) const {
PerformanceBase::BuildJSONValue(builder);
builder.Add("timing", timing()->toJSONForBinding(builder.GetScriptState()));
builder.Add("navigation",
navigation()->toJSONForBinding(builder.GetScriptState()));
}
void Performance::Trace(blink::Visitor* visitor) {
......
......@@ -42,9 +42,6 @@
namespace blink {
class ScriptState;
class ScriptValue;
class CORE_EXPORT Performance final : public PerformanceBase,
public PerformanceMonitor::Client,
public DOMWindowClient {
......@@ -66,8 +63,6 @@ class CORE_EXPORT Performance final : public PerformanceBase,
void UpdateLongTaskInstrumentation() override;
ScriptValue toJSONForBinding(ScriptState*) const;
void Trace(blink::Visitor*) override;
using PerformanceBase::TraceWrappers;
......@@ -89,6 +84,8 @@ class CORE_EXPORT Performance final : public PerformanceBase,
bool has_multiple_contexts,
const SubTaskAttribution::EntriesVector& sub_task_attributions) override;
void BuildJSONValue(V8ObjectBuilder&) const override;
mutable Member<PerformanceNavigation> navigation_;
mutable Member<PerformanceTiming> timing_;
};
......
......@@ -32,6 +32,7 @@
#include "core/timing/PerformanceBase.h"
#include <algorithm>
#include "bindings/core/v8/V8ObjectBuilder.h"
#include "core/dom/Document.h"
#include "core/dom/DocumentTiming.h"
#include "core/dom/events/Event.h"
......@@ -610,6 +611,17 @@ DOMHighResTimeStamp PerformanceBase::now() const {
return MonotonicTimeToDOMHighResTimeStamp(MonotonicallyIncreasingTime());
}
ScriptValue PerformanceBase::toJSONForBinding(ScriptState* script_state) const {
V8ObjectBuilder result(script_state);
BuildJSONValue(result);
return result.GetScriptValue();
}
void PerformanceBase::BuildJSONValue(V8ObjectBuilder& builder) const {
builder.AddNumber("timeOrigin", timeOrigin());
// |memory| is not part of the spec, omitted.
}
void PerformanceBase::Trace(blink::Visitor* visitor) {
visitor->Trace(frame_timing_buffer_);
visitor->Trace(resource_timing_buffer_);
......
......@@ -56,7 +56,10 @@ class ResourceResponse;
class ResourceTimingInfo;
class SecurityOrigin;
class UserTiming;
class ScriptState;
class ScriptValue;
class SubTaskAttribution;
class V8ObjectBuilder;
using PerformanceEntryVector = HeapVector<Member<PerformanceEntry>>;
......@@ -187,6 +190,8 @@ class CORE_EXPORT PerformanceBase : public EventTargetWithInlineData {
const SecurityOrigin&,
ExecutionContext*);
ScriptValue toJSONForBinding(ScriptState*) const;
void Trace(blink::Visitor*) override;
void TraceWrappers(const ScriptWrappableVisitor*) const override;
......@@ -216,6 +221,8 @@ class CORE_EXPORT PerformanceBase : public EventTargetWithInlineData {
void DeliverObservationsTimerFired(TimerBase*);
virtual void BuildJSONValue(V8ObjectBuilder&) const;
PerformanceEntryVector frame_timing_buffer_;
unsigned frame_timing_buffer_size_;
PerformanceEntryVector resource_timing_buffer_;
......
......@@ -95,12 +95,11 @@ PerformanceEntry::EntryType PerformanceEntry::ToEntryTypeEnum(
ScriptValue PerformanceEntry::toJSONForBinding(
ScriptState* script_state) const {
V8ObjectBuilder result(script_state);
BuildJSONValue(script_state, result);
BuildJSONValue(result);
return result.GetScriptValue();
}
void PerformanceEntry::BuildJSONValue(ScriptState* script_state,
V8ObjectBuilder& builder) const {
void PerformanceEntry::BuildJSONValue(V8ObjectBuilder& builder) const {
builder.AddString("name", name());
builder.AddString("entryType", entryType());
builder.AddNumber("startTime", startTime());
......
......@@ -99,7 +99,7 @@ class CORE_EXPORT PerformanceEntry : public ScriptWrappable {
const String& entry_type,
double start_time,
double finish_time);
virtual void BuildJSONValue(ScriptState*, V8ObjectBuilder&) const;
virtual void BuildJSONValue(V8ObjectBuilder&) const;
private:
const String name_;
......
......@@ -3,6 +3,8 @@
// found in the LICENSE file.
#include "core/timing/PerformanceLongTaskTiming.h"
#include "bindings/core/v8/V8ObjectBuilder.h"
#include "core/frame/DOMWindow.h"
#include "core/timing/SubTaskAttribution.h"
#include "core/timing/TaskAttributionTiming.h"
......@@ -57,6 +59,16 @@ TaskAttributionVector PerformanceLongTaskTiming::attribution() const {
return attribution_;
}
void PerformanceLongTaskTiming::BuildJSONValue(V8ObjectBuilder& builder) const {
PerformanceEntry::BuildJSONValue(builder);
Vector<ScriptValue> attribution;
for (unsigned i = 0; i < attribution_.size(); i++) {
attribution.push_back(
attribution_[i]->toJSONForBinding(builder.GetScriptState()));
}
builder.Add("attribution", attribution);
}
void PerformanceLongTaskTiming::Trace(blink::Visitor* visitor) {
visitor->Trace(attribution_);
PerformanceEntry::Trace(visitor);
......
......@@ -44,6 +44,8 @@ class PerformanceLongTaskTiming final : public PerformanceEntry {
const SubTaskAttribution::EntriesVector& sub_task_attributions);
~PerformanceLongTaskTiming() override;
void BuildJSONValue(V8ObjectBuilder&) const override;
TaskAttributionVector attribution_;
};
......
......@@ -5,4 +5,5 @@
// https://w3c.github.io/longtasks/#sec-PerformanceLongTaskTiming
interface PerformanceLongTaskTiming : PerformanceEntry {
[SameObject, SaveSameObject] readonly attribute FrozenArray<TaskAttributionTiming> attribution;
serializer = {inherit, attribute};
};
......@@ -267,9 +267,8 @@ DOMHighResTimeStamp PerformanceNavigationTiming::duration() const {
}
void PerformanceNavigationTiming::BuildJSONValue(
ScriptState* script_state,
V8ObjectBuilder& builder) const {
PerformanceResourceTiming::BuildJSONValue(script_state, builder);
PerformanceResourceTiming::BuildJSONValue(builder);
builder.AddNumber("unloadEventStart", unloadEventStart());
builder.AddNumber("unloadEventEnd", unloadEventEnd());
builder.AddNumber("domInteractive", domInteractive());
......
......@@ -61,7 +61,7 @@ class CORE_EXPORT PerformanceNavigationTiming final
virtual void Trace(blink::Visitor*);
protected:
void BuildJSONValue(ScriptState*, V8ObjectBuilder&) const override;
void BuildJSONValue(V8ObjectBuilder&) const override;
private:
~PerformanceNavigationTiming() override;
......
......@@ -318,9 +318,8 @@ PerformanceServerTimingVector PerformanceResourceTiming::serverTiming() const {
return serverTiming_;
}
void PerformanceResourceTiming::BuildJSONValue(ScriptState* script_state,
V8ObjectBuilder& builder) const {
PerformanceEntry::BuildJSONValue(script_state, builder);
void PerformanceResourceTiming::BuildJSONValue(V8ObjectBuilder& builder) const {
PerformanceEntry::BuildJSONValue(builder);
builder.AddString("initiatorType", initiatorType());
builder.AddString("nextHopProtocol", nextHopProtocol());
builder.AddNumber("workerStart", workerStart());
......@@ -341,7 +340,8 @@ void PerformanceResourceTiming::BuildJSONValue(ScriptState* script_state,
Vector<ScriptValue> serverTiming;
for (unsigned i = 0; i < serverTiming_.size(); i++) {
serverTiming.push_back(serverTiming_[i]->toJSONForBinding(script_state));
serverTiming.push_back(
serverTiming_[i]->toJSONForBinding(builder.GetScriptState()));
}
builder.Add("serverTiming", serverTiming);
}
......
......@@ -95,7 +95,7 @@ class CORE_EXPORT PerformanceResourceTiming : public PerformanceEntry {
virtual void Trace(blink::Visitor*);
protected:
void BuildJSONValue(ScriptState*, V8ObjectBuilder&) const override;
void BuildJSONValue(V8ObjectBuilder&) const override;
// This constructor is for PerformanceNavigationTiming.
// Related doc: https://goo.gl/uNecAj.
......
......@@ -50,6 +50,5 @@ interface PerformanceResourceTiming : PerformanceEntry {
[MeasureAs=PerformanceResourceTimingSizes] readonly attribute unsigned long long encodedBodySize;
[MeasureAs=PerformanceResourceTimingSizes] readonly attribute unsigned long long decodedBodySize;
[RuntimeEnabled=ServerTiming] readonly attribute FrozenArray<PerformanceServerTiming> serverTiming;
// TODO(foolip): The spec has a serializer:
// serializer = {inherit, attribute};
serializer = {inherit, attribute};
};
......@@ -4,6 +4,7 @@
#include "core/timing/TaskAttributionTiming.h"
#include "bindings/core/v8/V8ObjectBuilder.h"
#include "core/frame/DOMWindow.h"
namespace blink {
......@@ -45,6 +46,14 @@ String TaskAttributionTiming::containerName() const {
return container_name_;
}
void TaskAttributionTiming::BuildJSONValue(V8ObjectBuilder& builder) const {
PerformanceEntry::BuildJSONValue(builder);
builder.AddString("containerType", containerType());
builder.AddString("containerSrc", containerSrc());
builder.AddString("containerId", containerId());
builder.AddString("containerName", containerName());
}
void TaskAttributionTiming::Trace(blink::Visitor* visitor) {
PerformanceEntry::Trace(visitor);
}
......
......@@ -59,6 +59,8 @@ class TaskAttributionTiming final : public PerformanceEntry {
double start_time,
double finish_time,
String script_url);
void BuildJSONValue(V8ObjectBuilder&) const override;
String container_type_;
String container_src_;
String container_id_;
......
......@@ -9,4 +9,5 @@ interface TaskAttributionTiming : PerformanceEntry {
readonly attribute DOMString containerSrc;
readonly attribute DOMString containerId;
readonly attribute DOMString containerName;
serializer = {inherit, attribute};
};
......@@ -63,4 +63,6 @@
// TODO(foolip): There is no spec for the Memory Info API, see blink-dev:
// https://groups.google.com/a/chromium.org/d/msg/blink-dev/g5YRCGpC9vs/b4OJz71NmPwJ
[RuntimeEnabled=MemoryInfoInWorkers] readonly attribute MemoryInfo memory;
serializer = {attribute};
};
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