<sky>

<iframe></iframe>

<script>
import 'dart:async';
import 'dart:sky';
import 'dart:sky.internals' as internals;
import 'dart:typed_data';

import 'package:mojo/application.dart';
import 'package:mojo/bindings.dart';
import 'package:mojo/core.dart';
import 'package:mojom/mojo/shell.mojom.dart' as shell_mojom;
import 'package:mojom/mojo/input_events.mojom.dart' as input_events;
import 'package:mojom/mojo/view_manager.mojom.dart' as view_manager;

// This include is a hack which only works with sky_server.  For this to work
// in the sky_sdk, this echo_service would need to make its own dart package.
import '/gen/services/js/test/echo_service.mojom.dart' as echo_service_mojom;

class IFrameEmbed extends Application {
  IFrameEmbed.fromHandle(MojoHandle handle) : super.fromHandle(handle);
  IFrameEmbed(MojoMessagePipeEndpoint endpoint) : super(endpoint);

  void initialize(List<String> args, String url) {
    // The vmcApp provides ViewManagerClient and EchoService.
    const vmcURL =
        "http://127.0.0.1:8000/sky/tests/services/resources/iframe-vmc.js";
    final vmcAppConnection = connectToApplication(vmcURL);

    // The Promise returned by the vmcApp's echoString() method will not
    // resolve until the vmcApp's onEmbed() method runs.
    final echoService = new echo_service_mojom.EchoServiceProxy.unbound();
    vmcAppConnection.requestService(echoService);
    echoService.ptr.echoString("success").then((response) {
      internals.notifyTestComplete(response.value);
    });

    var applicationPipe = new MojoMessagePipe();
    var proxyEndpoint = applicationPipe.endpoints[0];
    var applicationEndpoint = applicationPipe.endpoints[1];
    vmcAppConnection.remoteServiceProvider.ptr.connectToService(
        view_manager.ViewManagerClientName, applicationEndpoint);
    document.querySelector("iframe").
        embedViewManagerClient(proxyEndpoint.handle.h);
  }
}

main() {
  var messagePipe = new MojoMessagePipe();
  var app = new IFrameEmbed(messagePipe.endpoints[1]);
  var shellProxy = new shell_mojom.ShellProxy.fromHandle(
      new MojoHandle(internals.takeShellProxyHandle()));
  app.initializeFromShellProxy(shellProxy, [], "");
}
</script>
</sky>
