library InnerFrameTest;
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_config.dart';
import 'dart:html';

main() {
  if (window != window.top) {
    // Child frame.

    // The child's frame should not be able to access its parent's
    // document.

    window.onMessage.listen((Event e) {
      switch (e.data) {
      case 'frameElement': {
        // Check window.frameElement.
        try {
          var parentDocument = window.frameElement.document;
          var div = parentDocument.$dom_createElement("div");
          div.id = "illegalFrameElement";
          parentDocument.body.nodes.add(div);
          expect(false, isTrue, reason: 'Should not reach here.');
        } on NoSuchMethodError catch (e) {
          // Expected.
          window.top.postMessage('pass_frameElement', '*');
        } catch (e) {
          window.top.postMessage('fail_frameElement', '*');
        }
        return;
      }
      case 'top': {
        // Check window.top.
        try {
          final top = window.top;
          var parentDocument = top.document;
          var div = parentDocument.$dom_createElement("div");
          div.id = "illegalTop";
          parentDocument.body.nodes.add(div);
          expect(false, isTrue, reason: 'Should not reach here.');
        } on NoSuchMethodError catch (e) {
          // Expected.
          window.top.postMessage('pass_top', '*');
        } catch (e) {
          window.top.postMessage('fail_top', '*');
        }
        return;
      }
      case 'parent': {
        // Check window.parent.
        try {
          final parent = window.parent;
          var parentDocument = parent.document;
          var div = parentDocument.$dom_createElement("div");
          div.id = "illegalParent";
          parentDocument.body.nodes.add(div);
          expect(false, isTrue, reason: 'Should not reach here.');
        } on NoSuchMethodError catch (e) {
          // Expected.
          window.top.postMessage('pass_parent', '*');
        } catch (e) {
          window.top.postMessage('fail_parent', '*');
        }
        return;
      }
      }
      });
  }

  // Parent / test frame
  useHtmlConfiguration();

  final iframe = new Element.tag('iframe');
  iframe.src = window.location.href;
  var child;

  test('prepare', () {
      iframe.onLoad.listen(expectAsync1((e) { child = iframe.contentWindow;}));
      document.body.nodes.add(iframe);
    });

  final validate = (testName, verify) {
    final expectedVerify = expectAsync0(verify);
    window.onMessage.listen((e) {
      guardAsync(() {
          if (e.data == 'pass_$testName') {
            expectedVerify();
          }
          expect(e.data, isNot(equals('fail_$testName')));
        });
      });
    child.postMessage(testName, '*');
  };

  test('frameElement', () {
      validate('frameElement', () {
        var div = document.query('#illegalFrameElement');

        // Ensure that this parent frame was not modified by its child.
        expect(div, isNull);
      });
    });

  test('top', () {
      validate('top', () {
        var div = document.query('#illegalTop');

        // Ensure that this parent frame was not modified by its child.
        expect(div, isNull);
      });
    });

  test('parent', () {
      validate('parent', () {
        var div = document.query('#illegalParent');

        // Ensure that this parent frame was not modified by its child.
        expect(div, isNull);
      });
    });
}
