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

#include "src/chromium/web_runner_tests/web_context.h"

#include <lib/fdio/directory.h>
#include <lib/syslog/cpp/macros.h>
#include <zircon/status.h>

#include <gtest/gtest.h>

WebContext::WebContext(sys::ComponentContext* component_context) {
  auto web_context_provider = component_context->svc()->Connect<fuchsia::web::ContextProvider>();
  web_context_provider.set_error_handler([](zx_status_t status) {
    FAIL() << "web_context_provider: " << zx_status_get_string(status);
  });

  auto incoming_service_clone = component_context->svc()->CloneChannel();
  FX_CHECK(incoming_service_clone.is_valid());
  fuchsia::web::CreateContextParams params;
  params.set_service_directory(std::move(incoming_service_clone));

  web_context_provider->Create(std::move(params), web_context_.NewRequest());
  web_context_.set_error_handler(
      [](zx_status_t status) { FAIL() << "web_context_: " << zx_status_get_string(status); });

  web_context_->CreateFrame(web_frame_.NewRequest());
  web_frame_.set_error_handler(
      [](zx_status_t status) { FAIL() << "web_frame_: " << zx_status_get_string(status); });
}

void WebContext::Navigate(const std::string& url) {
  // By creating a new NavigationController for each Navigate() call, we
  // implicitly ensure that any preceding calls to the Frame must have executed
  // before LoadUrl() is handled.
  fuchsia::web::NavigationControllerPtr navigation;
  web_frame_->GetNavigationController(navigation.NewRequest());
  navigation->LoadUrl(url, fuchsia::web::LoadUrlParams(),
                      [](fuchsia::web::NavigationController_LoadUrl_Result) {});
}
