blob: c01ef300a5c312d46af244f01b890c5e72d0a48d [file] [log] [blame]
<!DOCTYPE html>
<!--
Copyright 2016 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<link rel="import" href="/tracing/model/event_set.html">
<link rel="import" href="/tracing/value/diagnostics/diagnostic.html">
<link rel="import" href="/tracing/value/diagnostics/event_ref.html">
<script>
'use strict';
tr.exportTo('tr.v.d', function() {
/**
* @typedef {!(tr.v.d.EventRef|tr.model.Event)} EventLike
*/
/**
* A RelatedEventSet diagnostic contains references to Events
*/
class RelatedEventSet extends tr.v.d.Diagnostic {
/**
* @param {!(tr.model.EventSet|Array.<EventLike>|EventLike)=} opt_events
*/
constructor(opt_events) {
super();
this.eventsByStableId_ = new Map();
if (opt_events) {
if (opt_events instanceof tr.model.EventSet ||
opt_events instanceof Array) {
for (var event of opt_events)
this.add(event);
} else {
this.add(opt_events);
}
}
}
/**
* @param {!(tr.v.d.EventRef|tr.model.Event)} event
*/
add(event) {
this.eventsByStableId_.set(event.stableId, event);
}
/**
* @param {!(tr.v.d.EventRef|tr.model.Event)} event
* @return {boolean}
*/
has(event) {
return this.eventsByStableId_.has(event.stableId);
}
get length() {
return this.eventsByStableId_.size;
}
*[Symbol.iterator]() {
for (var [stableId, event] of this.eventsByStableId_)
yield event;
}
/**
* Resolve all EventRefs into Events by finding their stableIds in |model|.
* If a stableId cannot be found and |opt_required| is true, then throw an
* Error.
* If a stableId cannot be found and |opt_required| is false, then the
* EventRef will remain an EventRef.
*
* @param {!tr.model.Model} model
* @param {boolean=} opt_required
*/
resolve(model, opt_required) {
for (var [stableId, event] of this.eventsByStableId_) {
if (!(event instanceof tr.v.d.EventRef))
continue;
event = model.getEventByStableId(stableId);
if (event instanceof tr.model.Event)
this.eventsByStableId_.set(stableId, event);
else if (opt_required)
throw new Error('Unable to find Event ' + stableId);
}
}
asDictInto_(d) {
d.events = [];
for (var event of this) {
d.events.push({
stableId: event.stableId,
title: event.title,
start: event.start,
duration: event.duration
});
}
}
static fromDict(d) {
return new RelatedEventSet(d.events.map(
event => new tr.v.d.EventRef(event)));
}
}
tr.v.d.Diagnostic.register(RelatedEventSet, {
elementName: 'tr-v-ui-related-event-set-span'
});
return {
RelatedEventSet: RelatedEventSet
};
});
</script>