Avi Drissman | 4e1b7bc3 | 2022-09-15 14:03:50 | [diff] [blame] | 1 | // Copyright 2019 The Chromium Authors |
Arthur Sonzogni | 892217ca | 2019-01-17 10:27:08 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "content/browser/android/navigation_handle_proxy.h" |
| 6 | |
arthursonzogni | d95ed0bc | 2019-02-20 10:36:52 | [diff] [blame] | 7 | #include "base/android/jni_android.h" |
| 8 | #include "base/android/jni_string.h" |
| 9 | #include "base/android/scoped_java_ref.h" |
Arthur Sonzogni | 892217ca | 2019-01-17 10:27:08 | [diff] [blame] | 10 | #include "content/public/browser/navigation_handle.h" |
Michael Thiessen | 0db91776 | 2025-01-22 16:58:46 | [diff] [blame] | 11 | #include "content/public/browser/web_contents.h" |
Min Qin | ec46b45 | 2024-08-13 17:45:57 | [diff] [blame] | 12 | #include "content/public/common/content_client.h" |
David Sanders | d0bc2c4 | 2022-02-20 15:50:23 | [diff] [blame] | 13 | #include "net/http/http_response_headers.h" |
Michael Thiessen | e9bfb1a | 2020-09-22 22:59:28 | [diff] [blame] | 14 | #include "url/android/gurl_android.h" |
| 15 | #include "url/gurl.h" |
arthursonzogni | d95ed0bc | 2019-02-20 10:36:52 | [diff] [blame] | 16 | |
Andrew Grieve | ecb885bb | 2024-05-29 18:14:19 | [diff] [blame] | 17 | // Must come after all headers that specialize FromJniType() / ToJniType(). |
| 18 | #include "content/public/android/content_jni_headers/NavigationHandle_jni.h" |
| 19 | |
arthursonzogni | d95ed0bc | 2019-02-20 10:36:52 | [diff] [blame] | 20 | using base::android::AttachCurrentThread; |
arthursonzogni | d95ed0bc | 2019-02-20 10:36:52 | [diff] [blame] | 21 | using base::android::JavaParamRef; |
Arthur Sonzogni | 892217ca | 2019-01-17 10:27:08 | [diff] [blame] | 22 | |
| 23 | namespace content { |
| 24 | |
arthursonzogni | d95ed0bc | 2019-02-20 10:36:52 | [diff] [blame] | 25 | NavigationHandleProxy::NavigationHandleProxy( |
| 26 | NavigationHandle* cpp_navigation_handle) |
| 27 | : cpp_navigation_handle_(cpp_navigation_handle) { |
| 28 | JNIEnv* env = AttachCurrentThread(); |
Michael Thiessen | d9fc066 | 2021-06-22 22:29:18 | [diff] [blame] | 29 | |
Gang Wu | 0c3ad3c | 2024-01-26 00:39:07 | [diff] [blame] | 30 | java_navigation_handle_ = Java_NavigationHandle_Constructor( |
Peter E Conn | 4e4b9cc | 2025-05-02 08:54:28 | [diff] [blame] | 31 | env, reinterpret_cast<jlong>(cpp_navigation_handle), |
| 32 | url::GURLAndroid::FromNativeGURL(env, cpp_navigation_handle_->GetURL()), |
| 33 | cpp_navigation_handle_->IsRendererInitiated(), |
| 34 | cpp_navigation_handle_->GetReloadType() != content::ReloadType::NONE, |
| 35 | cpp_navigation_handle_->IsHistory(), |
| 36 | cpp_navigation_handle_->IsHistory() && |
| 37 | cpp_navigation_handle_->GetNavigationEntryOffset() < 0, |
| 38 | cpp_navigation_handle_->IsHistory() && |
| 39 | cpp_navigation_handle_->GetNavigationEntryOffset() > 0, |
| 40 | cpp_navigation_handle_->GetRestoreType() == |
| 41 | content::RestoreType::kRestored); |
Pete Williamson | 1d87f462 | 2022-10-18 19:36:43 | [diff] [blame] | 42 | } |
| 43 | |
| 44 | void NavigationHandleProxy::DidStart() { |
| 45 | JNIEnv* env = AttachCurrentThread(); |
| 46 | |
| 47 | // Set all these methods on the Java side over JNI with a new JNI method. |
Michael Thiessen | 0db91776 | 2025-01-22 16:58:46 | [diff] [blame] | 48 | Java_NavigationHandle_didStart( |
| 49 | env, java_navigation_handle_, |
Michael Thiessen | 9fca5b9 | 2022-02-11 00:19:08 | [diff] [blame] | 50 | url::GURLAndroid::FromNativeGURL( |
| 51 | env, cpp_navigation_handle_->GetReferrer().url), |
Michael Thiessen | ca245a38 | 2022-02-21 16:11:17 | [diff] [blame] | 52 | url::GURLAndroid::FromNativeGURL( |
| 53 | env, cpp_navigation_handle_->GetBaseURLForDataURL()), |
Dave Tapuska | 421f9a3 | 2021-06-10 20:18:43 | [diff] [blame] | 54 | cpp_navigation_handle_->IsInPrimaryMainFrame(), |
arthursonzogni | d95ed0bc | 2019-02-20 10:36:52 | [diff] [blame] | 55 | cpp_navigation_handle_->IsSameDocument(), |
Michael Thiessen | d9fc066 | 2021-06-22 22:29:18 | [diff] [blame] | 56 | cpp_navigation_handle_->GetInitiatorOrigin() |
Andrew Grieve | 6a37bcd | 2024-09-26 21:47:44 | [diff] [blame] | 57 | ? cpp_navigation_handle_->GetInitiatorOrigin()->ToJavaObject(env) |
Michael Thiessen | d9fc066 | 2021-06-22 22:29:18 | [diff] [blame] | 58 | : nullptr, |
Andrew Paseltiner | 00f60aca | 2022-03-31 17:26:31 | [diff] [blame] | 59 | cpp_navigation_handle_->GetPageTransition(), |
Michael Thiessen | 9fca5b9 | 2022-02-11 00:19:08 | [diff] [blame] | 60 | cpp_navigation_handle_->IsPost(), |
| 61 | cpp_navigation_handle_->HasUserGesture(), |
| 62 | cpp_navigation_handle_->WasServerRedirect(), |
| 63 | cpp_navigation_handle_->IsExternalProtocol(), |
Michael Thiessen | 203b7afc | 2022-03-07 21:47:20 | [diff] [blame] | 64 | cpp_navigation_handle_->GetNavigationId(), |
Michael Thiessen | f6fce17 | 2022-06-07 22:15:33 | [diff] [blame] | 65 | cpp_navigation_handle_->IsPageActivation(), |
Min Qin | 9d3dca5c | 2024-05-10 16:51:51 | [diff] [blame] | 66 | cpp_navigation_handle_->IsPdf(), |
Min Qin | 3d7b0d3 | 2024-05-22 06:57:48 | [diff] [blame] | 67 | base::android::ConvertUTF8ToJavaString(env, GetMimeType()), |
Michael Thiessen | 0db91776 | 2025-01-22 16:58:46 | [diff] [blame] | 68 | cpp_navigation_handle_->GetWebContents()->GetJavaWebContents()); |
arthursonzogni | d95ed0bc | 2019-02-20 10:36:52 | [diff] [blame] | 69 | } |
| 70 | |
| 71 | void NavigationHandleProxy::DidRedirect() { |
| 72 | JNIEnv* env = AttachCurrentThread(); |
| 73 | Java_NavigationHandle_didRedirect( |
| 74 | env, java_navigation_handle_, |
Michael Thiessen | a81a10d | 2022-07-14 23:12:01 | [diff] [blame] | 75 | url::GURLAndroid::FromNativeGURL(env, cpp_navigation_handle_->GetURL()), |
| 76 | cpp_navigation_handle_->IsExternalProtocol()); |
arthursonzogni | d95ed0bc | 2019-02-20 10:36:52 | [diff] [blame] | 77 | } |
| 78 | |
| 79 | void NavigationHandleProxy::DidFinish() { |
| 80 | JNIEnv* env = AttachCurrentThread(); |
| 81 | // Matches logic in |
| 82 | // components/navigation_interception/navigation_params_android.cc |
Michael Thiessen | e9bfb1a | 2020-09-22 22:59:28 | [diff] [blame] | 83 | const GURL& gurl = cpp_navigation_handle_->GetBaseURLForDataURL().is_empty() |
| 84 | ? cpp_navigation_handle_->GetURL() |
| 85 | : cpp_navigation_handle_->GetBaseURLForDataURL(); |
arthursonzogni | d95ed0bc | 2019-02-20 10:36:52 | [diff] [blame] | 86 | |
Kevin McNee | 2c06ed36 | 2022-06-02 19:39:40 | [diff] [blame] | 87 | bool is_primary_main_frame_fragment_navigation = |
| 88 | cpp_navigation_handle_->IsInPrimaryMainFrame() && |
| 89 | cpp_navigation_handle_->IsSameDocument(); |
arthursonzogni | d95ed0bc | 2019-02-20 10:36:52 | [diff] [blame] | 90 | |
Kevin McNee | 2c06ed36 | 2022-06-02 19:39:40 | [diff] [blame] | 91 | if (is_primary_main_frame_fragment_navigation && |
| 92 | cpp_navigation_handle_->HasCommitted()) { |
arthursonzogni | d95ed0bc | 2019-02-20 10:36:52 | [diff] [blame] | 93 | // See http://crbug.com/251330 for why it's determined this way. |
arthursonzogni | d95ed0bc | 2019-02-20 10:36:52 | [diff] [blame] | 94 | bool urls_same_ignoring_fragment = |
Etienne Noel | 8e79032 | 2022-11-08 19:19:18 | [diff] [blame] | 95 | cpp_navigation_handle_->GetURL().EqualsIgnoringRef( |
| 96 | cpp_navigation_handle_->GetPreviousPrimaryMainFrameURL()); |
Kevin McNee | 2c06ed36 | 2022-06-02 19:39:40 | [diff] [blame] | 97 | is_primary_main_frame_fragment_navigation = urls_same_ignoring_fragment; |
arthursonzogni | d95ed0bc | 2019-02-20 10:36:52 | [diff] [blame] | 98 | } |
| 99 | |
Wei-Yin Chen (陳威尹) | 4c5bf66 | 2019-03-01 03:38:57 | [diff] [blame] | 100 | bool is_valid_search_form_url = |
Jan Wilken Dörrie | f11b4c2 | 2020-02-07 23:34:29 | [diff] [blame] | 101 | cpp_navigation_handle_->GetSearchableFormURL() != "" |
Wei-Yin Chen (陳威尹) | 4c5bf66 | 2019-03-01 03:38:57 | [diff] [blame] | 102 | ? cpp_navigation_handle_->GetSearchableFormURL().is_valid() |
| 103 | : false; |
| 104 | |
arthursonzogni | d95ed0bc | 2019-02-20 10:36:52 | [diff] [blame] | 105 | Java_NavigationHandle_didFinish( |
Michael Thiessen | e9bfb1a | 2020-09-22 22:59:28 | [diff] [blame] | 106 | env, java_navigation_handle_, url::GURLAndroid::FromNativeGURL(env, gurl), |
arthursonzogni | d95ed0bc | 2019-02-20 10:36:52 | [diff] [blame] | 107 | cpp_navigation_handle_->IsErrorPage(), |
Kevin McNee | 2c06ed36 | 2022-06-02 19:39:40 | [diff] [blame] | 108 | cpp_navigation_handle_->HasCommitted(), |
| 109 | is_primary_main_frame_fragment_navigation, |
Wei-Yin Chen (陳威尹) | 4c5bf66 | 2019-03-01 03:38:57 | [diff] [blame] | 110 | cpp_navigation_handle_->IsDownload(), is_valid_search_form_url, |
Michael Thiessen | 6e40296d | 2022-02-02 16:39:36 | [diff] [blame] | 111 | cpp_navigation_handle_->GetPageTransition(), |
arthursonzogni | d95ed0bc | 2019-02-20 10:36:52 | [diff] [blame] | 112 | cpp_navigation_handle_->GetNetErrorCode(), |
| 113 | // TODO(shaktisahu): Change default status to -1 after fixing |
| 114 | // crbug/690041. |
| 115 | cpp_navigation_handle_->GetResponseHeaders() |
| 116 | ? cpp_navigation_handle_->GetResponseHeaders()->response_code() |
Michael Thiessen | a81a10d | 2022-07-14 23:12:01 | [diff] [blame] | 117 | : 200, |
Shu Yang | 59ad37be | 2024-03-19 17:54:38 | [diff] [blame] | 118 | cpp_navigation_handle_->IsExternalProtocol(), |
Min Qin | 9d3dca5c | 2024-05-10 16:51:51 | [diff] [blame] | 119 | cpp_navigation_handle_->IsPdf(), |
Min Qin | 3d7b0d3 | 2024-05-22 06:57:48 | [diff] [blame] | 120 | base::android::ConvertUTF8ToJavaString(env, GetMimeType()), |
Rakina Zata Amni | 65a5dc4 | 2025-03-03 02:51:55 | [diff] [blame] | 121 | cpp_navigation_handle_->GetWebContents()->GetPrimaryPage().GetJavaPage()); |
arthursonzogni | d95ed0bc | 2019-02-20 10:36:52 | [diff] [blame] | 122 | } |
| 123 | |
| 124 | NavigationHandleProxy::~NavigationHandleProxy() { |
| 125 | JNIEnv* env = AttachCurrentThread(); |
| 126 | Java_NavigationHandle_release(env, java_navigation_handle_); |
| 127 | } |
| 128 | |
Min Qin | 9d3dca5c | 2024-05-10 16:51:51 | [diff] [blame] | 129 | std::string NavigationHandleProxy::GetMimeType() const { |
| 130 | std::string mime_type; |
| 131 | if (cpp_navigation_handle_->GetResponseHeaders()) { |
| 132 | cpp_navigation_handle_->GetResponseHeaders()->GetMimeType(&mime_type); |
| 133 | } |
| 134 | return mime_type; |
| 135 | } |
| 136 | |
Arthur Sonzogni | 892217ca | 2019-01-17 10:27:08 | [diff] [blame] | 137 | } // namespace content |