// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This module provides the test page for WebUIMojoTest. Once the page is
// loaded it sends "syn" message to the native code. Once page receives "ack"
// from the native code, the page then sends "fin". Test succeeds only when
// "fin" is received by the native page. Refer to
// ios/web/webui/web_ui_mojo_inttest.mm for testing code.

var pageImpl, browserProxy;

/** @constructor */
function TestPageImpl() {
  this.binding = new mojo.Binding(TestPage, this);
}

TestPageImpl.prototype = {
  /** @override */
  handleNativeMessage: function(result) {
    if (result.message == 'ack') {
      // Native code has replied with "ack", send "fin" to complete the
      // test.
      browserProxy.handleJsMessage('fin');
    }
  },
};

/**
 * @return {!Promise} Fires when DOMContentLoaded event is received.
 */
function whenDomContentLoaded() {
  return new Promise(function(resolve, reject) {
    document.addEventListener('DOMContentLoaded', resolve);
  });
}

function main() {
  whenDomContentLoaded().then(function() {
    browserProxy = new TestUIHandlerMojoPtr();
    Mojo.bindInterface(TestUIHandlerMojo.name,
                       mojo.makeRequest(browserProxy).handle);

    pageImpl = new TestPageImpl();
    var pagePtr = new TestPagePtr();
    pageImpl.binding.bind(mojo.makeRequest(pagePtr));
    browserProxy.setClientPage(pagePtr);

    // Send "syn" so native code should reply with "ack".
    browserProxy.handleJsMessage('syn');
  });
}

main();
