|  | // Copyright 2024 The Chromium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "android_webview/browser/prefetch/aw_preloading_utils.h" | 
|  |  | 
|  | #include "base/android/jni_array.h" | 
|  | #include "base/android/jni_string.h" | 
|  | #include "net/http/http_no_vary_search_data.h" | 
|  |  | 
|  | // Must come after all headers that specialize FromJniType() / ToJniType(). | 
|  | #include "android_webview/browser_jni_headers/AwNoVarySearchData_jni.h" | 
|  | #include "android_webview/browser_jni_headers/AwPrefetchParameters_jni.h" | 
|  |  | 
|  | namespace android_webview { | 
|  |  | 
|  | net::HttpRequestHeaders GetAdditionalHeadersFromPrefetchParameters( | 
|  | JNIEnv* env, | 
|  | const base::android::JavaRef<jobject>& prefetch_params) { | 
|  | // TODO(crbug.com/372915075): Implement tests for adding additional headers. | 
|  | net::HttpRequestHeaders additional_headers = {}; | 
|  | if (prefetch_params) { | 
|  | std::map<std::string, std::string> additional_headers_map = | 
|  | Java_AwPrefetchParameters_getAdditionalHeaders(env, prefetch_params); | 
|  |  | 
|  | for (const auto& header : additional_headers_map) { | 
|  | additional_headers.SetHeader(header.first, header.second); | 
|  | } | 
|  | } | 
|  | return additional_headers; | 
|  | } | 
|  |  | 
|  | std::optional<net::HttpNoVarySearchData> | 
|  | GetExpectedNoVarySearchFromPrefetchParameters( | 
|  | JNIEnv* env, | 
|  | const base::android::JavaRef<jobject>& prefetch_params) { | 
|  | // TODO(crbug.com/372915075): Implement tests for constructing expected no | 
|  | // vary search. | 
|  | std::optional<net::HttpNoVarySearchData> expected_no_vary_search; | 
|  | if (prefetch_params) { | 
|  | base::android::ScopedJavaLocalRef<jobject> no_vary_search_jobj = | 
|  | Java_AwPrefetchParameters_getExpectedNoVarySearch(env, prefetch_params); | 
|  |  | 
|  | if (no_vary_search_jobj) { | 
|  | const bool vary_on_key_order = static_cast<bool>( | 
|  | Java_AwNoVarySearchData_getVaryOnKeyOrder(env, no_vary_search_jobj)); | 
|  | const bool ignore_differences_in_params = static_cast<bool>( | 
|  | Java_AwNoVarySearchData_getIgnoreDifferencesInParameters( | 
|  | env, no_vary_search_jobj)); | 
|  |  | 
|  | if (ignore_differences_in_params) { | 
|  | expected_no_vary_search = | 
|  | net::HttpNoVarySearchData::CreateFromVaryParams( | 
|  | Java_AwNoVarySearchData_getConsideredQueryParameters( | 
|  | env, no_vary_search_jobj), | 
|  | vary_on_key_order); | 
|  | } else { | 
|  | expected_no_vary_search = | 
|  | net::HttpNoVarySearchData::CreateFromNoVaryParams( | 
|  | Java_AwNoVarySearchData_getIgnoredQueryParameters( | 
|  | env, no_vary_search_jobj), | 
|  | vary_on_key_order); | 
|  | } | 
|  | } | 
|  | } | 
|  | return expected_no_vary_search; | 
|  | } | 
|  |  | 
|  | bool GetIsJavaScriptEnabledFromPrefetchParameters( | 
|  | JNIEnv* env, | 
|  | const base::android::JavaRef<jobject>& prefetch_params) { | 
|  | if (!prefetch_params) { | 
|  | return false; | 
|  | } | 
|  | return Java_AwPrefetchParameters_getIsJavascriptEnabled(env, prefetch_params); | 
|  | } | 
|  |  | 
|  | }  // namespace android_webview |