// Copyright 2014 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.

#include "content/shell/test_runner/web_view_test_proxy.h"

#include <stddef.h>
#include <stdint.h>

#include "content/renderer/compositor/layer_tree_view.h"
#include "content/shell/test_runner/mock_screen_orientation_client.h"
#include "content/shell/test_runner/test_common.h"
#include "content/shell/test_runner/test_interfaces.h"
#include "content/shell/test_runner/test_runner.h"
#include "content/shell/test_runner/web_test_delegate.h"
#include "content/shell/test_runner/web_test_interfaces.h"
#include "content/shell/test_runner/web_widget_test_proxy.h"
#include "third_party/blink/public/platform/web_url_request.h"
#include "third_party/blink/public/web/web_frame.h"
#include "third_party/blink/public/web/web_local_frame.h"
#include "third_party/blink/public/web/web_print_params.h"
#include "third_party/blink/public/web/web_view.h"

namespace test_runner {

void WebViewTestProxy::Initialize(WebTestInterfaces* interfaces,
                                  WebTestDelegate* delegate) {
  delegate_ = delegate;
  test_interfaces_ = interfaces->GetTestInterfaces();
  test_interfaces()->WindowOpened(this);
}

blink::WebView* WebViewTestProxy::CreateView(
    blink::WebLocalFrame* creator,
    const blink::WebURLRequest& request,
    const blink::WebWindowFeatures& features,
    const blink::WebString& frame_name,
    blink::WebNavigationPolicy policy,
    bool suppress_opener,
    blink::WebSandboxFlags sandbox_flags,
    const blink::SessionStorageNamespaceId& session_storage_namespace_id) {
  if (GetTestRunner()->shouldDumpNavigationPolicy()) {
    delegate()->PrintMessage("Default policy for createView for '" +
                             URLDescription(request.Url()) + "' is '" +
                             WebNavigationPolicyToString(policy) + "'\n");
  }

  if (!GetTestRunner()->canOpenWindows())
    return nullptr;

  if (GetTestRunner()->shouldDumpCreateView()) {
    delegate()->PrintMessage(std::string("createView(") +
                             URLDescription(request.Url()) + ")\n");
  }
  return RenderViewImpl::CreateView(creator, request, features, frame_name,
                                    policy, suppress_opener, sandbox_flags,
                                    session_storage_namespace_id);
}

void WebViewTestProxy::PrintPage(blink::WebLocalFrame* frame) {
  blink::WebSize page_size_in_pixels = GetWidget()->GetWebWidget()->Size();
  if (page_size_in_pixels.IsEmpty())
    return;
  blink::WebPrintParams print_params(page_size_in_pixels);
  frame->PrintBegin(print_params);
  frame->PrintEnd();
}

blink::WebString WebViewTestProxy::AcceptLanguages() {
  return blink::WebString::FromUTF8(GetTestRunner()->GetAcceptLanguages());
}

void WebViewTestProxy::DidFocus(blink::WebLocalFrame* calling_frame) {
  GetTestRunner()->SetFocus(webview(), true);
  RenderViewImpl::DidFocus(calling_frame);
}

blink::WebScreenInfo WebViewTestProxy::GetScreenInfo() {
  blink::WebScreenInfo info = RenderViewImpl::GetScreenInfo();

  MockScreenOrientationClient* mock_client =
      GetTestRunner()->getMockScreenOrientationClient();

  if (!mock_client->IsDisabled()) {
    // Override screen orientation information with mock data.
    info.orientation_type = mock_client->CurrentOrientationType();
    info.orientation_angle = mock_client->CurrentOrientationAngle();
  }

  return info;
}

void WebViewTestProxy::Reset() {
  accessibility_controller_.Reset();
  // text_input_controller_ doesn't have any state to reset.
  view_test_runner_.Reset();
  static_cast<WebWidgetTestProxy*>(GetWidget())->Reset();

  for (blink::WebFrame* frame = webview()->MainFrame(); frame;
       frame = frame->TraverseNext()) {
    if (frame->IsWebLocalFrame())
      delegate_->GetWebWidgetTestProxy(frame->ToWebLocalFrame())->Reset();
  }
}

void WebViewTestProxy::BindTo(blink::WebLocalFrame* frame) {
  accessibility_controller_.Install(frame);
  text_input_controller_.Install(frame);
  view_test_runner_.Install(frame);
}

WebViewTestProxy::~WebViewTestProxy() {
  test_interfaces_->WindowClosed(this);
  if (test_interfaces_->GetDelegate() == delegate_)
    test_interfaces_->SetDelegate(nullptr);
  // TODO(https://crbug.com/545684): This delegate seems unnecessarily leaked.
  // Make |delegate_| a std::unique_ptr<>?
}

TestRunner* WebViewTestProxy::GetTestRunner() {
  return test_interfaces()->GetTestRunner();
}

}  // namespace test_runner
