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

#include "content/browser/android/navigation_handle_proxy.h"

#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "base/android/scoped_java_ref.h"
#include "content/public/android/content_jni_headers/NavigationHandle_jni.h"
#include "content/public/browser/navigation_handle.h"
#include "net/http/http_response_headers.h"
#include "url/android/gurl_android.h"
#include "url/gurl.h"

using base::android::AttachCurrentThread;
using base::android::JavaParamRef;

namespace content {

NavigationHandleProxy::NavigationHandleProxy(
    NavigationHandle* cpp_navigation_handle)
    : cpp_navigation_handle_(cpp_navigation_handle) {
  JNIEnv* env = AttachCurrentThread();

  java_navigation_handle_ = Java_NavigationHandle_Constructor(env);
}

void NavigationHandleProxy::DidStart() {
  JNIEnv* env = AttachCurrentThread();

  // Set all these methods on the Java side over JNI with a new JNI method.
  Java_NavigationHandle_initialize(
      env, java_navigation_handle_, reinterpret_cast<jlong>(this),
      url::GURLAndroid::FromNativeGURL(env, cpp_navigation_handle_->GetURL()),
      url::GURLAndroid::FromNativeGURL(
          env, cpp_navigation_handle_->GetReferrer().url),
      url::GURLAndroid::FromNativeGURL(
          env, cpp_navigation_handle_->GetBaseURLForDataURL()),
      cpp_navigation_handle_->IsInPrimaryMainFrame(),
      cpp_navigation_handle_->IsSameDocument(),
      cpp_navigation_handle_->IsRendererInitiated(),
      cpp_navigation_handle_->GetInitiatorOrigin()
          ? cpp_navigation_handle_->GetInitiatorOrigin()->CreateJavaObject()
          : nullptr,
      cpp_navigation_handle_->GetPageTransition(),
      cpp_navigation_handle_->IsPost(),
      cpp_navigation_handle_->HasUserGesture(),
      cpp_navigation_handle_->WasServerRedirect(),
      cpp_navigation_handle_->IsExternalProtocol(),
      cpp_navigation_handle_->GetNavigationId(),
      cpp_navigation_handle_->IsPageActivation(),
      cpp_navigation_handle_->GetReloadType() != content::ReloadType::NONE);
}

void NavigationHandleProxy::DidRedirect() {
  JNIEnv* env = AttachCurrentThread();
  Java_NavigationHandle_didRedirect(
      env, java_navigation_handle_,
      url::GURLAndroid::FromNativeGURL(env, cpp_navigation_handle_->GetURL()),
      cpp_navigation_handle_->IsExternalProtocol());
}

void NavigationHandleProxy::DidFinish() {
  JNIEnv* env = AttachCurrentThread();
  // Matches logic in
  // components/navigation_interception/navigation_params_android.cc
  const GURL& gurl = cpp_navigation_handle_->GetBaseURLForDataURL().is_empty()
                         ? cpp_navigation_handle_->GetURL()
                         : cpp_navigation_handle_->GetBaseURLForDataURL();

  bool is_primary_main_frame_fragment_navigation =
      cpp_navigation_handle_->IsInPrimaryMainFrame() &&
      cpp_navigation_handle_->IsSameDocument();

  if (is_primary_main_frame_fragment_navigation &&
      cpp_navigation_handle_->HasCommitted()) {
    // See http://crbug.com/251330 for why it's determined this way.
    bool urls_same_ignoring_fragment =
        cpp_navigation_handle_->GetURL().EqualsIgnoringRef(
            cpp_navigation_handle_->GetPreviousPrimaryMainFrameURL());
    is_primary_main_frame_fragment_navigation = urls_same_ignoring_fragment;
  }

  bool is_valid_search_form_url =
      cpp_navigation_handle_->GetSearchableFormURL() != ""
          ? cpp_navigation_handle_->GetSearchableFormURL().is_valid()
          : false;

  Java_NavigationHandle_didFinish(
      env, java_navigation_handle_, url::GURLAndroid::FromNativeGURL(env, gurl),
      cpp_navigation_handle_->IsErrorPage(),
      cpp_navigation_handle_->HasCommitted(),
      is_primary_main_frame_fragment_navigation,
      cpp_navigation_handle_->IsDownload(), is_valid_search_form_url,
      cpp_navigation_handle_->GetPageTransition(),
      cpp_navigation_handle_->GetNetErrorCode(),
      // TODO(shaktisahu): Change default status to -1 after fixing
      // crbug/690041.
      cpp_navigation_handle_->GetResponseHeaders()
          ? cpp_navigation_handle_->GetResponseHeaders()->response_code()
          : 200,
      cpp_navigation_handle_->IsExternalProtocol());
}

NavigationHandleProxy::~NavigationHandleProxy() {
  JNIEnv* env = AttachCurrentThread();
  Java_NavigationHandle_release(env, java_navigation_handle_);
}

}  // namespace content
