aw_proxy_controller.cc 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "android_webview/browser/aw_browser_context.h"
  5. #include "android_webview/browser/aw_browser_process.h"
  6. #include "android_webview/browser/network_service/aw_proxy_config_monitor.h"
  7. #include "android_webview/browser_jni_headers/AwProxyController_jni.h"
  8. #include "base/android/jni_array.h"
  9. #include "base/android/jni_string.h"
  10. #include "base/android/scoped_java_ref.h"
  11. #include "base/bind.h"
  12. #include "base/callback.h"
  13. #include "base/feature_list.h"
  14. #include "base/task/current_thread.h"
  15. #include "content/public/browser/browser_thread.h"
  16. #include "net/proxy_resolution/proxy_config_service_android.h"
  17. using base::android::AttachCurrentThread;
  18. using base::android::HasException;
  19. using base::android::JavaParamRef;
  20. using base::android::JavaRef;
  21. using base::android::ScopedJavaGlobalRef;
  22. using base::android::ScopedJavaLocalRef;
  23. using content::BrowserThread;
  24. namespace android_webview {
  25. namespace {
  26. void ProxyOverrideChanged(const JavaRef<jobject>& obj,
  27. const JavaRef<jobject>& listener,
  28. const JavaRef<jobject>& executor) {
  29. DCHECK_CURRENTLY_ON(BrowserThread::UI);
  30. if (!listener)
  31. return;
  32. JNIEnv* env = AttachCurrentThread();
  33. Java_AwProxyController_proxyOverrideChanged(env, obj, listener, executor);
  34. if (HasException(env)) {
  35. // Tell the chromium message loop to not perform any tasks after the current
  36. // one - we want to make sure we return to Java cleanly without first making
  37. // any new JNI calls.
  38. base::CurrentUIThread::Get()->Abort();
  39. }
  40. }
  41. } // namespace
  42. ScopedJavaLocalRef<jstring> JNI_AwProxyController_SetProxyOverride(
  43. JNIEnv* env,
  44. const JavaParamRef<jobject>& obj,
  45. const base::android::JavaParamRef<jobjectArray>& jurl_schemes,
  46. const base::android::JavaParamRef<jobjectArray>& jproxy_urls,
  47. const base::android::JavaParamRef<jobjectArray>& jbypass_rules,
  48. const JavaParamRef<jobject>& listener,
  49. const JavaParamRef<jobject>& executor,
  50. const jboolean reverse_bypass) {
  51. std::vector<std::string> url_schemes;
  52. base::android::AppendJavaStringArrayToStringVector(env, jurl_schemes,
  53. &url_schemes);
  54. std::vector<std::string> proxy_urls;
  55. base::android::AppendJavaStringArrayToStringVector(env, jproxy_urls,
  56. &proxy_urls);
  57. std::vector<net::ProxyConfigServiceAndroid::ProxyOverrideRule> proxy_rules;
  58. int size = url_schemes.size();
  59. DCHECK(url_schemes.size() == proxy_urls.size());
  60. proxy_rules.reserve(size);
  61. for (int i = 0; i < size; i++) {
  62. proxy_rules.emplace_back(url_schemes[i], proxy_urls[i]);
  63. }
  64. std::vector<std::string> bypass_rules;
  65. base::android::AppendJavaStringArrayToStringVector(env, jbypass_rules,
  66. &bypass_rules);
  67. std::string result;
  68. result = AwProxyConfigMonitor::GetInstance()->SetProxyOverride(
  69. proxy_rules, bypass_rules, reverse_bypass,
  70. base::BindOnce(&ProxyOverrideChanged,
  71. ScopedJavaGlobalRef<jobject>(env, obj),
  72. ScopedJavaGlobalRef<jobject>(env, listener),
  73. ScopedJavaGlobalRef<jobject>(env, executor)));
  74. return base::android::ConvertUTF8ToJavaString(env, result);
  75. }
  76. void JNI_AwProxyController_ClearProxyOverride(
  77. JNIEnv* env,
  78. const JavaParamRef<jobject>& obj,
  79. const JavaParamRef<jobject>& listener,
  80. const JavaParamRef<jobject>& executor) {
  81. AwProxyConfigMonitor::GetInstance()->ClearProxyOverride(base::BindOnce(
  82. &ProxyOverrideChanged, ScopedJavaGlobalRef<jobject>(env, obj),
  83. ScopedJavaGlobalRef<jobject>(env, listener),
  84. ScopedJavaGlobalRef<jobject>(env, executor)));
  85. }
  86. } // namespace android_webview