// Copyright 2018 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 "android_webview/browser/aw_browser_context.h" #include "android_webview/browser/aw_browser_process.h" #include "android_webview/browser/network_service/aw_proxy_config_monitor.h" #include "android_webview/browser_jni_headers/AwProxyController_jni.h" #include "base/android/jni_array.h" #include "base/android/jni_string.h" #include "base/android/scoped_java_ref.h" #include "base/bind.h" #include "base/callback.h" #include "base/feature_list.h" #include "base/task/current_thread.h" #include "content/public/browser/browser_thread.h" #include "net/proxy_resolution/proxy_config_service_android.h" using base::android::AttachCurrentThread; using base::android::HasException; using base::android::JavaParamRef; using base::android::JavaRef; using base::android::ScopedJavaGlobalRef; using base::android::ScopedJavaLocalRef; using content::BrowserThread; namespace android_webview { namespace { void ProxyOverrideChanged(const JavaRef& obj, const JavaRef& listener, const JavaRef& executor) { DCHECK_CURRENTLY_ON(BrowserThread::UI); if (!listener) return; JNIEnv* env = AttachCurrentThread(); Java_AwProxyController_proxyOverrideChanged(env, obj, listener, executor); if (HasException(env)) { // Tell the chromium message loop to not perform any tasks after the current // one - we want to make sure we return to Java cleanly without first making // any new JNI calls. base::CurrentUIThread::Get()->Abort(); } } } // namespace ScopedJavaLocalRef JNI_AwProxyController_SetProxyOverride( JNIEnv* env, const JavaParamRef& obj, const base::android::JavaParamRef& jurl_schemes, const base::android::JavaParamRef& jproxy_urls, const base::android::JavaParamRef& jbypass_rules, const JavaParamRef& listener, const JavaParamRef& executor, const jboolean reverse_bypass) { std::vector url_schemes; base::android::AppendJavaStringArrayToStringVector(env, jurl_schemes, &url_schemes); std::vector proxy_urls; base::android::AppendJavaStringArrayToStringVector(env, jproxy_urls, &proxy_urls); std::vector proxy_rules; int size = url_schemes.size(); DCHECK(url_schemes.size() == proxy_urls.size()); proxy_rules.reserve(size); for (int i = 0; i < size; i++) { proxy_rules.emplace_back(url_schemes[i], proxy_urls[i]); } std::vector bypass_rules; base::android::AppendJavaStringArrayToStringVector(env, jbypass_rules, &bypass_rules); std::string result; result = AwProxyConfigMonitor::GetInstance()->SetProxyOverride( proxy_rules, bypass_rules, reverse_bypass, base::BindOnce(&ProxyOverrideChanged, ScopedJavaGlobalRef(env, obj), ScopedJavaGlobalRef(env, listener), ScopedJavaGlobalRef(env, executor))); return base::android::ConvertUTF8ToJavaString(env, result); } void JNI_AwProxyController_ClearProxyOverride( JNIEnv* env, const JavaParamRef& obj, const JavaParamRef& listener, const JavaParamRef& executor) { AwProxyConfigMonitor::GetInstance()->ClearProxyOverride(base::BindOnce( &ProxyOverrideChanged, ScopedJavaGlobalRef(env, obj), ScopedJavaGlobalRef(env, listener), ScopedJavaGlobalRef(env, executor))); } } // namespace android_webview