blob: 50149ebaf54a6a02cce997870ad2768addabfd5f [file] [log] [blame]
// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:html';
import 'package:stream_channel/stream_channel.dart';
/// Constructs a [StreamChannel] wrapping `postMessage` communication with the
/// host page.
StreamChannel postMessageChannel() {
var controller = new StreamChannelController(sync: true);
window.onMessage.listen((message) {
// A message on the Window can theoretically come from any website. It's
// very unlikely that a malicious site would care about hacking someone's
// unit tests, let alone be able to find the test server while it's
// running, but it's good practice to check the origin anyway.
if (message.origin != window.location.origin) return;
message.stopPropagation();
controller.local.sink.add(message.data);
});
controller.local.stream.listen((data) {
// TODO(nweiz): Stop manually adding href here once issue 22554 is
// fixed.
window.parent.postMessage(
{"href": window.location.href, "data": data}, window.location.origin);
});
// Send a ready message once we're listening so the host knows it's safe to
// start sending events.
window.parent.postMessage(
{"href": window.location.href, "ready": true}, window.location.origin);
return controller.foreign;
}