| The **ExecutionContextPriorityDecorator** is responsible for assigning the |
| priority of all the frames and workers in the graph. |
| |
| This is done through a system of voting where each voter can increase the |
| priority of an execution context independently, and the vote with the highest |
| priority determines which priority the given frame or worker will be assigned. |
| |
| The **RootVoteObserver** is a simple layer on top of the voting system that |
| receives the final vote for an execution context and does the actual assignment |
| to the graph node. |
| |
| Each voter tracks a single property of an execution context and casts their vote |
| via their voting channel to the **MaxVoteAggregator**. An example is the |
| **FrameAudibleVoter** class. |
| |
| It is possible to cast a "negative" vote which can reduce the priority of an |
| execution context by overriding the vote of all the other voters. An example is |
| the **AdFrameVoter** class. |
| |
| In addition, there is a **BoostingVoteAggregator**, which introduces the notion |
| of BoostingVotes. They ensure that an execution context's priority is always |
| equal or higher than the priority of another execution context, by casting a |
| vote with a matching priority. An example is the **ChildFrameBooster** class. |