## Timeline Code Architecture

<img src="timeline_architecture.png" width="800" />

### View

The view has no awareness of the timeline data directly. It has access to the timeline data (frames, selected event,
selected frame, cpu profile, etc.) through the `TimelineController`. The view receives updates from the
`TimelineController` via streams.

### Model

`TimelineData` stores the current data for the DevTools timeline. Its main components include `frames`, `selectedFrame`,
`selectedEvent`, `cpuProfileData`, and `traceEvents`. This data is maintained by `TimelineController`.

### Controller

The controller manages `TimelineData` and communicates with the view to give and receive data updates. It manages data
processing via protocols `TimelineProtocol` (protocol for processing trace events and composing them into
`TimelineEvent`s and `TimelineFrame`s) and `CpuProfileProtocol` (protocol for processing `CpuProfileData` and composing
it into a structured tree of `CpuStackFrame`s). The controller also communicates with `TimelineService`, which manages
interactions between the Timeline and the VmService. `TimelineController` has no dependency on `dart:html`, making it
easily testable.
