Commit 591cfddd authored by Laís Minchillo's avatar Laís Minchillo Committed by Commit Bot

[aw] Implement proxy APIs in network service

Implement proxy override APIs in network service.

Bug: 902658
Test: $run_webview_instrumentation_test_apk \
Test: --enable-features="NetworkService,NetworkServiceInProcess" \
Test: -f=AwProxyControllerTest.*
Cq-Include-Trybots: luci.chromium.try:android_mojo
Change-Id: I3c445dc3f7042632799a07d775c77a43f3ebbcec
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1489672
Auto-Submit: Laís Minchillo <laisminchillo@chromium.org>
Commit-Queue: Robert Sesek <rsesek@chromium.org>
Reviewed-by: default avatarRobert Sesek <rsesek@chromium.org>
Reviewed-by: default avatarTobias Sargeant <tobiasjs@chromium.org>
Reviewed-by: default avatarJohn Abd-El-Malek <jam@chromium.org>
Cr-Commit-Position: refs/heads/master@{#646348}
parent 8e1688d0
...@@ -597,6 +597,8 @@ source_set("common") { ...@@ -597,6 +597,8 @@ source_set("common") {
"browser/net/aw_network_change_notifier_factory.h", "browser/net/aw_network_change_notifier_factory.h",
"browser/net/aw_network_delegate.cc", "browser/net/aw_network_delegate.cc",
"browser/net/aw_network_delegate.h", "browser/net/aw_network_delegate.h",
"browser/net/aw_proxy_config_monitor.cc",
"browser/net/aw_proxy_config_monitor.h",
"browser/net/aw_request_interceptor.cc", "browser/net/aw_request_interceptor.cc",
"browser/net/aw_request_interceptor.h", "browser/net/aw_request_interceptor.h",
"browser/net/aw_url_request_context_getter.cc", "browser/net/aw_url_request_context_getter.cc",
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include <vector> #include <vector>
#include "android_webview/browser/aw_ssl_host_state_delegate.h" #include "android_webview/browser/aw_ssl_host_state_delegate.h"
#include "android_webview/browser/net/aw_proxy_config_monitor.h"
#include "android_webview/browser/safe_browsing/aw_safe_browsing_ui_manager.h" #include "android_webview/browser/safe_browsing/aw_safe_browsing_ui_manager.h"
#include "base/compiler_specific.h" #include "base/compiler_specific.h"
#include "base/files/file_path.h" #include "base/files/file_path.h"
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "android_webview/browser/aw_speech_recognition_manager_delegate.h" #include "android_webview/browser/aw_speech_recognition_manager_delegate.h"
#include "android_webview/browser/aw_web_contents_view_delegate.h" #include "android_webview/browser/aw_web_contents_view_delegate.h"
#include "android_webview/browser/cookie_manager.h" #include "android_webview/browser/cookie_manager.h"
#include "android_webview/browser/net/aw_proxy_config_monitor.h"
#include "android_webview/browser/net/aw_url_request_context_getter.h" #include "android_webview/browser/net/aw_url_request_context_getter.h"
#include "android_webview/browser/network_service/aw_cookie_manager_wrapper.h" #include "android_webview/browser/network_service/aw_cookie_manager_wrapper.h"
#include "android_webview/browser/network_service/aw_proxying_url_loader_factory.h" #include "android_webview/browser/network_service/aw_proxying_url_loader_factory.h"
...@@ -359,6 +360,11 @@ AwContentBrowserClient::GetNetworkContextParams() { ...@@ -359,6 +360,11 @@ AwContentBrowserClient::GetNetworkContextParams() {
g_created_network_context_params = true; g_created_network_context_params = true;
#endif #endif
context_params->check_clear_text_permitted = g_check_cleartext_permitted; context_params->check_clear_text_permitted = g_check_cleartext_permitted;
// Add proxy settings
AwProxyConfigMonitor::GetInstance()->AddProxyToNetworkContextParams(
context_params);
return context_params; return context_params;
} }
......
...@@ -3,12 +3,26 @@ ...@@ -3,12 +3,26 @@
// found in the LICENSE file. // found in the LICENSE file.
#include "android_webview/browser/aw_content_browser_client.h" #include "android_webview/browser/aw_content_browser_client.h"
#include "android_webview/browser/aw_feature_list_creator.h" #include "android_webview/browser/aw_feature_list_creator.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/scoped_task_environment.h"
#include "mojo/core/embedder/embedder.h"
#include "services/network/public/cpp/features.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
namespace android_webview { namespace android_webview {
class AwContentBrowserClientTest : public testing::Test {}; class AwContentBrowserClientTest : public testing::Test {
protected:
void SetUp() override {
mojo::core::Init();
feature_list_.InitAndEnableFeature(network::features::kNetworkService);
}
base::test::ScopedTaskEnvironment scoped_task_environment_;
base::test::ScopedFeatureList feature_list_;
};
TEST_F(AwContentBrowserClientTest, DisableCreatingTaskScheduler) { TEST_F(AwContentBrowserClientTest, DisableCreatingTaskScheduler) {
AwFeatureListCreator aw_feature_list_creator; AwFeatureListCreator aw_feature_list_creator;
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
// found in the LICENSE file. // found in the LICENSE file.
#include "android_webview/browser/aw_browser_context.h" #include "android_webview/browser/aw_browser_context.h"
#include "android_webview/browser/net/aw_proxy_config_monitor.h"
#include "android_webview/browser/net/aw_url_request_context_getter.h" #include "android_webview/browser/net/aw_url_request_context_getter.h"
#include "base/android/jni_array.h" #include "base/android/jni_array.h"
#include "base/android/jni_string.h" #include "base/android/jni_string.h"
...@@ -70,11 +71,14 @@ ScopedJavaLocalRef<jstring> JNI_AwProxyController_SetProxyOverride( ...@@ -70,11 +71,14 @@ ScopedJavaLocalRef<jstring> JNI_AwProxyController_SetProxyOverride(
std::vector<std::string> bypass_rules; std::vector<std::string> bypass_rules;
base::android::AppendJavaStringArrayToStringVector(env, jbypass_rules, base::android::AppendJavaStringArrayToStringVector(env, jbypass_rules,
&bypass_rules); &bypass_rules);
std::string result; std::string result;
if (base::FeatureList::IsEnabled(network::features::kNetworkService)) { if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
// TODO(laisminchillo): implement the Network Service code path result = AwProxyConfigMonitor::GetInstance()->SetProxyOverride(
// (http://crbug.com/902658). proxy_rules, bypass_rules,
base::BindOnce(&ProxyOverrideChanged,
ScopedJavaGlobalRef<jobject>(env, obj),
ScopedJavaGlobalRef<jobject>(env, listener),
ScopedJavaGlobalRef<jobject>(env, executor)));
} else { } else {
result = result =
AwBrowserContext::GetDefault() AwBrowserContext::GetDefault()
...@@ -95,8 +99,10 @@ void JNI_AwProxyController_ClearProxyOverride( ...@@ -95,8 +99,10 @@ void JNI_AwProxyController_ClearProxyOverride(
const JavaParamRef<jobject>& listener, const JavaParamRef<jobject>& listener,
const JavaParamRef<jobject>& executor) { const JavaParamRef<jobject>& executor) {
if (base::FeatureList::IsEnabled(network::features::kNetworkService)) { if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
// TODO(laisminchillo): implement the Network Service code path AwProxyConfigMonitor::GetInstance()->ClearProxyOverride(base::BindOnce(
// (http://crbug.com/902658). &ProxyOverrideChanged, ScopedJavaGlobalRef<jobject>(env, obj),
ScopedJavaGlobalRef<jobject>(env, listener),
ScopedJavaGlobalRef<jobject>(env, executor)));
} else { } else {
AwBrowserContext::GetDefault() AwBrowserContext::GetDefault()
->GetAwURLRequestContext() ->GetAwURLRequestContext()
......
// 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 "android_webview/browser/net/aw_proxy_config_monitor.h"
#include <memory>
#include <utility>
#include "base/barrier_closure.h"
#include "base/bind.h"
#include "base/feature_list.h"
#include "services/network/public/cpp/features.h"
namespace android_webview {
namespace {
base::LazyInstance<AwProxyConfigMonitor>::Leaky g_instance;
} // namespace
AwProxyConfigMonitor::AwProxyConfigMonitor() {
proxy_config_service_android_ =
std::make_unique<net::ProxyConfigServiceAndroid>(
base::ThreadTaskRunnerHandle::Get(),
base::ThreadTaskRunnerHandle::Get());
proxy_config_service_android_->AddObserver(this);
}
AwProxyConfigMonitor::~AwProxyConfigMonitor() {
proxy_config_service_android_->RemoveObserver(this);
}
AwProxyConfigMonitor* AwProxyConfigMonitor::GetInstance() {
return g_instance.Pointer();
}
void AwProxyConfigMonitor::AddProxyToNetworkContextParams(
network::mojom::NetworkContextParamsPtr& network_context_params) {
network::mojom::ProxyConfigClientPtr proxy_config_client;
network_context_params->proxy_config_client_request =
mojo::MakeRequest(&proxy_config_client);
proxy_config_client_set_.AddPtr(std::move(proxy_config_client));
net::ProxyConfigWithAnnotation proxy_config;
net::ProxyConfigService::ConfigAvailability availability =
proxy_config_service_android_->GetLatestProxyConfig(&proxy_config);
if (availability == net::ProxyConfigService::CONFIG_VALID) {
network_context_params->initial_proxy_config = proxy_config;
}
}
void AwProxyConfigMonitor::OnProxyConfigChanged(
const net::ProxyConfigWithAnnotation& config,
net::ProxyConfigService::ConfigAvailability availability) {
proxy_config_client_set_.ForAllPtrs(
[config,
availability](network::mojom::ProxyConfigClient* proxy_config_client) {
switch (availability) {
case net::ProxyConfigService::CONFIG_VALID:
proxy_config_client->OnProxyConfigUpdated(config);
break;
case net::ProxyConfigService::CONFIG_UNSET:
proxy_config_client->OnProxyConfigUpdated(
net::ProxyConfigWithAnnotation::CreateDirect());
break;
case net::ProxyConfigService::CONFIG_PENDING:
NOTREACHED();
break;
}
});
}
std::string AwProxyConfigMonitor::SetProxyOverride(
const std::vector<net::ProxyConfigServiceAndroid::ProxyOverrideRule>&
proxy_rules,
const std::vector<std::string>& bypass_rules,
base::OnceClosure callback) {
return proxy_config_service_android_->SetProxyOverride(
proxy_rules, bypass_rules,
base::BindOnce(&AwProxyConfigMonitor::FlushProxyConfig,
base::Unretained(this), std::move(callback)));
}
void AwProxyConfigMonitor::ClearProxyOverride(base::OnceClosure callback) {
proxy_config_service_android_->ClearProxyOverride(
base::BindOnce(&AwProxyConfigMonitor::FlushProxyConfig,
base::Unretained(this), std::move(callback)));
}
void AwProxyConfigMonitor::FlushProxyConfig(base::OnceClosure callback) {
int count = 0;
proxy_config_client_set_.ForAllPtrs(
[&count](network::mojom::ProxyConfigClient* proxy_config_client) {
++count;
});
base::RepeatingClosure closure =
base::BarrierClosure(count, std::move(callback));
proxy_config_client_set_.ForAllPtrs(
[closure](network::mojom::ProxyConfigClient* proxy_config_client) {
proxy_config_client->FlushProxyConfig(closure);
});
}
} // namespace android_webview
// 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.
#ifndef ANDROID_WEBVIEW_BROWSER_NET_AW_PROXY_CONFIG_MONITOR_H_
#define ANDROID_WEBVIEW_BROWSER_NET_AW_PROXY_CONFIG_MONITOR_H_
#include <memory>
#include <vector>
#include "mojo/public/cpp/bindings/interface_ptr_set.h"
#include "net/proxy_resolution/proxy_config_service_android.h"
#include "net/url_request/url_request_context_builder.h"
#include "services/network/public/mojom/network_service.mojom.h"
namespace android_webview {
// This class configures proxy settings for NetworkContext if network service
// is enabled.
class AwProxyConfigMonitor : public net::ProxyConfigService::Observer {
public:
static AwProxyConfigMonitor* GetInstance();
void AddProxyToNetworkContextParams(
network::mojom::NetworkContextParamsPtr& network_context_params);
std::string SetProxyOverride(
const std::vector<net::ProxyConfigServiceAndroid::ProxyOverrideRule>&
proxy_rules,
const std::vector<std::string>& bypass_rules,
base::OnceClosure callback);
void ClearProxyOverride(base::OnceClosure callback);
private:
AwProxyConfigMonitor();
~AwProxyConfigMonitor() override;
AwProxyConfigMonitor(const AwProxyConfigMonitor&) = delete;
AwProxyConfigMonitor& operator=(const AwProxyConfigMonitor&) = delete;
friend struct base::LazyInstanceTraitsBase<AwProxyConfigMonitor>;
// net::ProxyConfigService::Observer implementation:
void OnProxyConfigChanged(
const net::ProxyConfigWithAnnotation& config,
net::ProxyConfigService::ConfigAvailability availability) override;
void FlushProxyConfig(base::OnceClosure callback);
std::unique_ptr<net::ProxyConfigServiceAndroid> proxy_config_service_android_;
mojo::InterfacePtrSet<network::mojom::ProxyConfigClient>
proxy_config_client_set_;
};
} // namespace android_webview
#endif // ANDROID_WEBVIEW_BROWSER_NET_AW_PROXY_CONFIG_MONITOR_H_
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
#include "services/network/proxy_config_service_mojo.h" #include "services/network/proxy_config_service_mojo.h"
#include <utility>
namespace network { namespace network {
ProxyConfigServiceMojo::ProxyConfigServiceMojo( ProxyConfigServiceMojo::ProxyConfigServiceMojo(
...@@ -39,6 +41,11 @@ void ProxyConfigServiceMojo::OnProxyConfigUpdated( ...@@ -39,6 +41,11 @@ void ProxyConfigServiceMojo::OnProxyConfigUpdated(
observer.OnProxyConfigChanged(config_, CONFIG_VALID); observer.OnProxyConfigChanged(config_, CONFIG_VALID);
} }
void ProxyConfigServiceMojo::FlushProxyConfig(
FlushProxyConfigCallback callback) {
std::move(callback).Run();
}
void ProxyConfigServiceMojo::AddObserver(Observer* observer) { void ProxyConfigServiceMojo::AddObserver(Observer* observer) {
observers_.AddObserver(observer); observers_.AddObserver(observer);
} }
......
...@@ -51,6 +51,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) ProxyConfigServiceMojo ...@@ -51,6 +51,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) ProxyConfigServiceMojo
// mojom::ProxyConfigClient implementation: // mojom::ProxyConfigClient implementation:
void OnProxyConfigUpdated( void OnProxyConfigUpdated(
const net::ProxyConfigWithAnnotation& proxy_config) override; const net::ProxyConfigWithAnnotation& proxy_config) override;
void FlushProxyConfig(FlushProxyConfigCallback callback) override;
mojom::ProxyConfigPollerClientPtr proxy_poller_client_; mojom::ProxyConfigPollerClientPtr proxy_poller_client_;
......
...@@ -16,6 +16,9 @@ struct ProxyConfigWithAnnotation { ...@@ -16,6 +16,9 @@ struct ProxyConfigWithAnnotation {
// Interface for pushing proxy configuration updates to a NetworkContext. // Interface for pushing proxy configuration updates to a NetworkContext.
interface ProxyConfigClient { interface ProxyConfigClient {
OnProxyConfigUpdated(ProxyConfigWithAnnotation proxy_config); OnProxyConfigUpdated(ProxyConfigWithAnnotation proxy_config);
// Flush the ProxyConfig
FlushProxyConfig() => ();
}; };
// Called periodically when the current ProxyConfig is in use, as a hint that // Called periodically when the current ProxyConfig is in use, as a hint that
......
...@@ -22,14 +22,6 @@ ...@@ -22,14 +22,6 @@
# https://crbug.com/893580 # https://crbug.com/893580
-org.chromium.android_webview.test.LoadDataWithBaseUrlTest.testLoadDataWithBaseUrlAccessingFile -org.chromium.android_webview.test.LoadDataWithBaseUrlTest.testLoadDataWithBaseUrlAccessingFile
# https://crbug.com/902658
-org.chromium.android_webview.test.AwProxyControllerTest.testProxyOverride
-org.chromium.android_webview.test.AwProxyControllerTest.testProxyOverrideLocalhost
-org.chromium.android_webview.test.AwProxyControllerTest.testCallbacks
-org.chromium.android_webview.test.AwProxyControllerTest.testValidInput
-org.chromium.android_webview.test.AwProxyControllerTest.testInvalidProxyUrls
-org.chromium.android_webview.test.AwProxyControllerTest.testInvalidBypassRules
# Flaky tests on android_mojo and android_mojo_rel bots # Flaky tests on android_mojo and android_mojo_rel bots
# https://crbug.com/936757, https://crbug.com/939355 # https://crbug.com/936757, https://crbug.com/939355
-org.chromium.android_webview.test.AwContentsClientFullScreenTest.testOnShowCustomViewAndPlayWithHtmlControl_videoInsideDiv -org.chromium.android_webview.test.AwContentsClientFullScreenTest.testOnShowCustomViewAndPlayWithHtmlControl_videoInsideDiv
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment