| Sky's Run Loop | 
 | ============== | 
 |  | 
 | Sky's run loop consists of running the following, at 120Hz (each loop | 
 | takes 8.333ms): | 
 |  | 
 | 1. Send scroll and resize events if necessary, limiting each handler | 
 |    to 1ms, and limiting the total time spent on these handlers to 1ms. | 
 |  | 
 | 2. Fire animation frame callbacks for up to 1ms. Each callback can run | 
 |    for up to 1ms. Once 1ms has expired, throw a (catchable) | 
 |    EDeadlineExceeded exception. If it's not caught, drop subsequent | 
 |    callbacks. | 
 |  | 
 | 4. Spend up to 1ms to update the render tree, including calling | 
 |    childAdded(), childRemoved(), and getLayoutManager() as needed. | 
 |    Once 1ms has expired, throw a (catchable) EDeadlineExceeded | 
 |    exception, leaving the render tree in whatever state it has | 
 |    reached. | 
 |  | 
 | 3. Update the ElementStyleDeclarationList objects for all elements on | 
 |    the RenderTree. | 
 |  | 
 | 5. Update as much of layout as possible; after 1ms, throw a | 
 |    (catchable) EDeadlineExceeded exception, leaving the remaining | 
 |    nodes unprepared. | 
 |  | 
 | 6. Update as much of paint as possible; after 1ms, throw a (catchable) | 
 |    EDeadlineExceeded exception, leaving any remaining nodes | 
 |    unprepared. | 
 |  | 
 | 7. Send frame to GPU. | 
 |  | 
 | 8. Run pending tasks until the 8.333ms expires. Each task may only run | 
 |    for at most 1ms, after 1ms they get a (catchable) EDeadlineExceeded | 
 |    exception. While there are no pending tasks, sleep. | 
 |    Tasks are things like: | 
 |     - timers | 
 |     - updating the DOM in response to parsing | 
 |     - input events | 
 |     - mojo callbacks | 
 |  | 
 | TODO(ianh): Update the timings above to have some relationship to | 
 | reality. | 
 |  | 
 | TODO(ianh): Define an API so that the application can adjust the | 
 | budgets. | 
 |  | 
 | TODO(ianh): Define how scroll notifications get sent, or decide to | 
 | drop them entirely from this model. |