<sky>

<iframe></iframe>

<script>
import 'dart:async';
import 'dart:sky';
import 'dart:sky.internals' as internals;
import 'dart:typed_data';
import '/mojo/public/dart/application.dart';
import 'mojo:bindings';
import 'mojo:core';

import 'package:mojo/public/interfaces/application/shell.mojom.dart' as shell_mojom;
import 'package:mojo/services/input_events/public/interfaces/input_events.mojom.dart' as input_events;
import 'package:mojo/services/view_manager/public/interfaces/view_manager.mojom.dart' as view_manager;
import 'package: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>
