A computer-implemented method for communicating data between a first execution context on a computing system and a second execution context on the computing system, wherein the first execution context executes content from a first origin, wherein the second execution context executes content from a second origin that is different from the first origin, and wherein the first execution context and the second execution context are each restricted from accessing data of the other as a result of a same-origin policy implemented by the computing system, the method comprising: establishing a bi-directional communication channel that directly connects the first execution context to the second execution context, including: receiving, in the first execution context, an initial discovery message that was transmitted from the second execution context; determining, in the first execution context and based on the initial discovery message that was transmitted from the second execution context, an identifier of the second execution context; establishing, using the identifier of the second execution context, a first uni-directional sub-channel of the bi-directional communication channel, the first uni-directional sub-channel configured to carry messages from the first execution context to the second execution context; receiving, in the second execution context, a connection broadcast message that was transmitted from the first execution context over the first uni-directional sub-channel; determining, in the second execution context and based on the connection broadcast message that was transmitted from the first execution context over the first uni-directional sub-channel, an identifier of the first execution context; and establishing, using the identifier of the first execution context, a second uni-directional sub-channel of the bi-directional communication channel, the second uni-directional sub-channel configured to carry messages from the second execution context to the first execution context; and communicating messages between the first execution context and the second execution context over the bi-directional communication channel. establishing a bi-directional communication channel that directly connects the first execution context to the second execution context, including: receiving, in the first execution context, an initial discovery message that was transmitted from the second execution context; determining, in the first execution context and based on the initial discovery message that was transmitted from the second execution context, an identifier of the second execution context; establishing, using the identifier of the second execution context, a first uni-directional sub-channel of the bi-directional communication channel, the first uni-directional sub-channel configured to carry messages from the first execution context to the second execution context; receiving, in the second execution context, a connection broadcast message that was transmitted from the first execution context over the first uni-directional sub-channel; determining, in the second execution context and based on the connection broadcast message that was transmitted from the first execution context over the first uni-directional sub-channel, an identifier of the first execution context; and establishing, using the identifier of the first execution context, a second uni-directional sub-channel of the bi-directional communication channel, the second uni-directional sub-channel configured to carry messages from the second execution context to the first execution context; and receiving, in the first execution context, an initial discovery message that was transmitted from the second execution context; determining, in the first execution context and based on the initial discovery message that was transmitted from the second execution context, an identifier of the second execution context; establishing, using the identifier of the second execution context, a first uni-directional sub-channel of the bi-directional communication channel, the first uni-directional sub-channel configured to carry messages from the first execution context to the second execution context; receiving, in the second execution context, a connection broadcast message that was transmitted from the first execution context over the first uni-directional sub-channel; determining, in the second execution context and based on the connection broadcast message that was transmitted from the first execution context over the first uni-directional sub-channel, an identifier of the first execution context; and establishing, using the identifier of the first execution context, a second uni-directional sub-channel of the bi-directional communication channel, the second uni-directional sub-channel configured to carry messages from the second execution context to the first execution context; and communicating messages between the first execution context and the second execution context over the bi-directional communication channel.