// Copyright (c) 2013, 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.

library trydart.run;

import 'dart:html' show
    Blob,
    IFrameElement,
    Url;

makeOutputFrame(String scriptUrl) {
  final String outputHtml = '''
<!DOCTYPE html>
<html lang="en">
<head>
<title>JavaScript output</title>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
</head>
<body>
<script type="application/javascript" src="$outputHelper"></script>
<script type="application/javascript" src="$scriptUrl"></script>
</body>
</html>
''';

  return new IFrameElement()
      ..src = Url.createObjectUrl(new Blob([outputHtml], "text/html"))
      ..style.width = '100%'
      ..style.height = '0px';
}

final String outputHelper =
    Url.createObjectUrl(new Blob([OUTPUT_HELPER], 'application/javascript'));

const String OUTPUT_HELPER = r'''
function dartPrint(msg) {
  window.parent.postMessage(String(msg), "*");
}

function dartMainRunner(main) {
  main();
}

window.onerror = function (message, url, lineNumber) {
  window.parent.postMessage(
      ["error", {message: message, url: url, lineNumber: lineNumber}], "*");
};

(function () {

function postScrollHeight() {
  window.parent.postMessage(
      ["scrollHeight", document.documentElement.scrollHeight], "*");
}

var observer = new (window.MutationObserver ||
                    window.WebKitMutationObserver ||
                    window.MozMutationObserver)(function(mutations) {
  postScrollHeight()
  window.setTimeout(postScrollHeight, 500);
});

observer.observe(
    document.body,
    { attributes: true,
      childList: true,
      characterData: true,
      subtree: true });
})();
''';
