blob: 286cddb01b9f84965a8c5fec84635b5b391e7b31 [file] [log] [blame]
// Copyright 2019 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/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/browser/navigation_handle.h"
#include "jni/NavigationHandle_jni.h"
using base::android::AttachCurrentThread;
using base::android::ConvertUTF8ToJavaString;
using base::android::JavaParamRef;
using base::android::ScopedJavaLocalRef;
namespace content {
NavigationHandleProxy::NavigationHandleProxy(
NavigationHandle* cpp_navigation_handle)
: cpp_navigation_handle_(cpp_navigation_handle) {
JNIEnv* env = AttachCurrentThread();
java_navigation_handle_ = Java_NavigationHandle_Constructor(
env, reinterpret_cast<jlong>(this),
ConvertUTF8ToJavaString(env, cpp_navigation_handle_->GetURL().spec()),
cpp_navigation_handle_->IsInMainFrame(),
cpp_navigation_handle_->IsSameDocument(),
cpp_navigation_handle_->IsRendererInitiated());
}
void NavigationHandleProxy::DidRedirect() {
JNIEnv* env = AttachCurrentThread();
Java_NavigationHandle_didRedirect(
env, java_navigation_handle_,
ConvertUTF8ToJavaString(env, cpp_navigation_handle_->GetURL().spec()));
}
void NavigationHandleProxy::DidFinish() {
JNIEnv* env = AttachCurrentThread();
// Matches logic in
// components/navigation_interception/navigation_params_android.cc
ScopedJavaLocalRef<jstring> jstring_url(ConvertUTF8ToJavaString(
env, cpp_navigation_handle_->GetBaseURLForDataURL().is_empty()
? cpp_navigation_handle_->GetURL().spec()
: cpp_navigation_handle_->GetBaseURLForDataURL()
.possibly_invalid_spec()));
bool is_fragment_navigation = cpp_navigation_handle_->IsSameDocument();
if (cpp_navigation_handle_->HasCommitted()) {
// See http://crbug.com/251330 for why it's determined this way.
url::Replacements<char> replacements;
replacements.ClearRef();
bool urls_same_ignoring_fragment =
cpp_navigation_handle_->GetURL().ReplaceComponents(replacements) ==
cpp_navigation_handle_->GetPreviousURL().ReplaceComponents(
replacements);
is_fragment_navigation &= urls_same_ignoring_fragment;
}
Java_NavigationHandle_didFinish(
env, java_navigation_handle_, jstring_url,
cpp_navigation_handle_->IsErrorPage(),
cpp_navigation_handle_->HasCommitted(), is_fragment_navigation,
cpp_navigation_handle_->IsDownload(),
cpp_navigation_handle_->HasCommitted()
? cpp_navigation_handle_->GetPageTransition()
: -1,
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);
}
NavigationHandleProxy::~NavigationHandleProxy() {
JNIEnv* env = AttachCurrentThread();
Java_NavigationHandle_release(env, java_navigation_handle_);
}
// Called from Java.
void NavigationHandleProxy::SetRequestHeader(
JNIEnv* env,
const JavaParamRef<jobject>& obj,
const JavaParamRef<jstring>& name,
const JavaParamRef<jstring>& value) {
cpp_navigation_handle_->SetRequestHeader(ConvertJavaStringToUTF8(name),
ConvertJavaStringToUTF8(value));
}
// Called from Java.
void NavigationHandleProxy::RemoveRequestHeader(
JNIEnv* env,
const JavaParamRef<jobject>& obj,
const JavaParamRef<jstring>& name) {
cpp_navigation_handle_->RemoveRequestHeader(ConvertJavaStringToUTF8(name));
}
} // namespace content