Commit be96ccdf authored by Laís Minchillo's avatar Laís Minchillo Committed by Chromium LUCI CQ

[aw] Add reverse_bypass option for proxy override

Add a setProxyOverride method that takes in a boolean for
reverse_bypass. This will be exposed via androidx.webkit APIs.

Add a new test in proxy_config_service_android_unittest and in
AwProxyControllerTest to test the newly added reverse_bypass
option.

Bug: 1162255
Test: run_net_unittests -f *ProxyConfigServiceAndroidTest*
Test: run_webview_instrumentation_test_apk -f *AwProxyControllerTest*
Change-Id: Icc82656809b9237d6a8defb125b57727d59777ba
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2544645
Auto-Submit: Laís Minchillo <laisminchillo@chromium.org>
Commit-Queue: Nate Fischer <ntfschr@chromium.org>
Reviewed-by: default avatarNate Fischer <ntfschr@chromium.org>
Reviewed-by: default avatarMatt Menke <mmenke@chromium.org>
Cr-Commit-Position: refs/heads/master@{#842086}
parent ef8be161
......@@ -53,7 +53,8 @@ ScopedJavaLocalRef<jstring> JNI_AwProxyController_SetProxyOverride(
const base::android::JavaParamRef<jobjectArray>& jproxy_urls,
const base::android::JavaParamRef<jobjectArray>& jbypass_rules,
const JavaParamRef<jobject>& listener,
const JavaParamRef<jobject>& executor) {
const JavaParamRef<jobject>& executor,
const jboolean reverse_bypass) {
std::vector<std::string> url_schemes;
base::android::AppendJavaStringArrayToStringVector(env, jurl_schemes,
&url_schemes);
......@@ -72,7 +73,7 @@ ScopedJavaLocalRef<jstring> JNI_AwProxyController_SetProxyOverride(
&bypass_rules);
std::string result;
result = AwProxyConfigMonitor::GetInstance()->SetProxyOverride(
proxy_rules, bypass_rules,
proxy_rules, bypass_rules, reverse_bypass,
base::BindOnce(&ProxyOverrideChanged,
ScopedJavaGlobalRef<jobject>(env, obj),
ScopedJavaGlobalRef<jobject>(env, listener),
......
......@@ -95,9 +95,10 @@ std::string AwProxyConfigMonitor::SetProxyOverride(
const std::vector<net::ProxyConfigServiceAndroid::ProxyOverrideRule>&
proxy_rules,
const std::vector<std::string>& bypass_rules,
const bool reverse_bypass,
base::OnceClosure callback) {
return proxy_config_service_android_->SetProxyOverride(
proxy_rules, bypass_rules,
proxy_rules, bypass_rules, reverse_bypass,
base::BindOnce(&AwProxyConfigMonitor::FlushProxyConfig,
base::Unretained(this), std::move(callback)));
}
......
......@@ -31,6 +31,7 @@ class AwProxyConfigMonitor : public net::ProxyConfigService::Observer {
const std::vector<net::ProxyConfigServiceAndroid::ProxyOverrideRule>&
proxy_rules,
const std::vector<std::string>& bypass_rules,
const bool reverse_bypass,
base::OnceClosure callback);
void ClearProxyOverride(base::OnceClosure callback);
......
......@@ -46,8 +46,8 @@ public class AwProxyController {
public AwProxyController() {}
public void setProxyOverride(
String[][] proxyRules, String[] bypassRules, Runnable listener, Executor executor) {
public void setProxyOverride(String[][] proxyRules, String[] bypassRules, Runnable listener,
Executor executor, boolean reverseBypass) {
int length = (proxyRules == null ? 0 : proxyRules.length);
String[] urlSchemes = new String[length];
String[] proxyUrls = new String[length];
......@@ -96,8 +96,8 @@ public class AwProxyController {
throw new IllegalArgumentException("Executor must not be null");
}
String result = AwProxyControllerJni.get().setProxyOverride(
AwProxyController.this, urlSchemes, proxyUrls, bypassRules, listener, executor);
String result = AwProxyControllerJni.get().setProxyOverride(AwProxyController.this,
urlSchemes, proxyUrls, bypassRules, listener, executor, reverseBypass);
if (!result.isEmpty()) {
throw new IllegalArgumentException(result);
}
......@@ -156,7 +156,7 @@ public class AwProxyController {
@NativeMethods
interface Natives {
String setProxyOverride(AwProxyController caller, String[] urlSchemes, String[] proxyUrls,
String[] bypassRules, Runnable listener, Executor executor);
String[] bypassRules, Runnable listener, Executor executor, boolean reverseBypass);
void clearProxyOverride(AwProxyController caller, Runnable listener, Executor executor);
}
}
......@@ -81,7 +81,7 @@ public class AwProxyControllerTest {
// Set proxy override and load content url
// Localhost should use proxy with loopback rule
setProxyOverrideSync(
new String[][] {{MATCH_ALL_SCHEMES, mProxyUrl}}, new String[] {LOOPBACK});
new String[][] {{MATCH_ALL_SCHEMES, mProxyUrl}}, new String[] {LOOPBACK}, false);
TestAwContentsClient.OnReceivedTitleHelper onReceivedTitleHelper =
contentsClient.getOnReceivedTitleHelper();
int onReceivedTitleCallCount = onReceivedTitleHelper.getCallCount();
......@@ -118,7 +118,8 @@ public class AwProxyControllerTest {
// Set proxy override and load a local url
// Localhost should not use proxy settings
setProxyOverrideSync(new String[][] {{MATCH_ALL_SCHEMES, mProxyUrl}}, new String[] {});
setProxyOverrideSync(
new String[][] {{MATCH_ALL_SCHEMES, mProxyUrl}}, new String[] {}, false);
TestAwContentsClient.OnReceivedTitleHelper onReceivedTitleHelper =
contentsClient.getOnReceivedTitleHelper();
int onReceivedTitleCallCount = onReceivedTitleHelper.getCallCount();
......@@ -130,12 +131,43 @@ public class AwProxyControllerTest {
Assert.assertEquals(CONTENT, onReceivedTitleHelper.getTitle());
}
@Test
@SmallTest
@Feature({"AndroidWebView"})
public void testReverseBypassRules() throws Throwable {
final TestAwContentsClient contentsClient = new TestAwContentsClient();
final AwTestContainerView testContainerView =
mActivityTestRule.createAwTestContainerViewOnMainSync(contentsClient);
final AwContents awContents = testContainerView.getAwContents();
String url = "http://www.example.com/";
String bypassUrl = "www.example.com";
mProxyServer.setResponse(
url, "<html><head><title>" + PROXY + "</title></head>Page 1</html>", null);
int proxyServerRequestCount = mProxyServer.getRequestCount(url);
// Set proxy override with reverse bypass, that is, only use proxy settings
// with URLs in the bypass list
setProxyOverrideSync(
new String[][] {{MATCH_ALL_SCHEMES, mProxyUrl}}, new String[] {bypassUrl}, true);
TestAwContentsClient.OnReceivedTitleHelper onReceivedTitleHelper =
contentsClient.getOnReceivedTitleHelper();
int onReceivedTitleCallCount = onReceivedTitleHelper.getCallCount();
mActivityTestRule.loadUrlSync(awContents, contentsClient.getOnPageFinishedHelper(), url);
onReceivedTitleHelper.waitForCallback(onReceivedTitleCallCount);
proxyServerRequestCount++;
Assert.assertEquals(proxyServerRequestCount, mProxyServer.getRequestCount(url));
Assert.assertEquals(PROXY, onReceivedTitleHelper.getTitle());
}
@Test
@SmallTest
@Feature({"AndroidWebView"})
public void testCallbacks() throws Throwable {
// Test setProxyOverride's callback
setProxyOverrideSync(null, null);
setProxyOverrideSync(null, null, false);
// Test clearProxyOverride's callback with a proxy override setting
clearProxyOverrideSync();
// Test clearProxyOverride's callback without a proxy override setting
......@@ -159,7 +191,7 @@ public class AwProxyControllerTest {
{MATCH_ALL_SCHEMES, "[FE80:CD00:0:CDE:1257:0:211E:729C]"}};
String[] bypassRules = {
"www.rule.com", "*.rule.com", "*rule.com", "www.*.com", "www.rule*"};
setProxyOverrideSync(proxyRules, bypassRules);
setProxyOverrideSync(proxyRules, bypassRules, false);
// If we got to this point it means our input was accepted as expected
}
......@@ -181,7 +213,7 @@ public class AwProxyControllerTest {
for (String proxyUrl : invalidProxyUrls) {
try {
setProxyOverrideSync(new String[][] {{MATCH_ALL_SCHEMES, proxyUrl}}, null);
setProxyOverrideSync(new String[][] {{MATCH_ALL_SCHEMES, proxyUrl}}, null, false);
Assert.fail("No exception for invalid proxy url: " + proxyUrl);
} catch (IllegalArgumentException e) {
// Expected
......@@ -203,7 +235,7 @@ public class AwProxyControllerTest {
for (String bypassRule : invalidBypassRules) {
try {
setProxyOverrideSync(null, new String[] {bypassRule});
setProxyOverrideSync(null, new String[] {bypassRule}, false);
Assert.fail("No exception for invalid bypass rule: " + bypassRule);
} catch (IllegalArgumentException e) {
// Expected
......@@ -211,8 +243,8 @@ public class AwProxyControllerTest {
}
}
private void setProxyOverrideSync(String[][] proxyRules, String[] bypassRules)
throws Exception {
private void setProxyOverrideSync(
String[][] proxyRules, String[] bypassRules, boolean reverseBypass) throws Exception {
CallbackHelper ch = new CallbackHelper();
int callCount = ch.getCallCount();
runOnUiThreadBlocking(() -> {
......@@ -221,7 +253,7 @@ public class AwProxyControllerTest {
public void run() {
ch.notifyCalled();
}
}, new SynchronousExecutor());
}, new SynchronousExecutor(), reverseBypass);
});
ch.waitForCallback(callCount);
}
......
......@@ -12,5 +12,7 @@ import java.util.concurrent.Executor;
public interface ProxyControllerBoundaryInterface {
void setProxyOverride(
String[][] proxyRules, String[] bypassRules, Runnable listener, Executor executor);
void setProxyOverride(String[][] proxyRules, String[] bypassRules, Runnable listener,
Executor executor, boolean reverseBypass);
void clearProxyOverride(Runnable listener, Executor executor);
}
......@@ -135,6 +135,9 @@ public class Features {
// ProxyController.clearProxyOverride
public static final String PROXY_OVERRIDE = "PROXY_OVERRIDE:3";
// ProxyController.setProxyOverride
public static final String PROXY_OVERRIDE_REVERSE_BYPASS = "PROXY_OVERRIDE_REVERSE_BYPASS";
// WebSettingsCompat.setWillSuppressErrorPage
// WebSettingsCompat.getWillSuppressErrorPage
public static final String SUPPRESS_ERROR_PAGE = "SUPPRESS_ERROR_PAGE";
......
......@@ -31,11 +31,19 @@ public class SupportLibProxyControllerAdapter implements ProxyControllerBoundary
@Override
public void setProxyOverride(
String[][] proxyRules, String[] bypassRules, Runnable listener, Executor executor) {
recordApiCall(ApiCall.SET_PROXY_OVERRIDE);
setProxyOverride(proxyRules, bypassRules, listener, executor, false);
}
@Override
public void setProxyOverride(String[][] proxyRules, String[] bypassRules, Runnable listener,
Executor executor, boolean reverseBypass) {
recordApiCall(reverseBypass ? ApiCall.SET_PROXY_OVERRIDE
: ApiCall.SET_PROXY_OVERRIDE_REVERSE_BYPASS);
if (checkNeedsPost()) {
RuntimeException exception = mRunQueue.runOnUiThreadBlocking(() -> {
try {
mProxyController.setProxyOverride(proxyRules, bypassRules, listener, executor);
mProxyController.setProxyOverride(
proxyRules, bypassRules, listener, executor, reverseBypass);
} catch (RuntimeException e) {
return e;
}
......@@ -43,7 +51,8 @@ public class SupportLibProxyControllerAdapter implements ProxyControllerBoundary
});
maybeThrowUnwrappedException(exception);
} else {
mProxyController.setProxyOverride(proxyRules, bypassRules, listener, executor);
mProxyController.setProxyOverride(
proxyRules, bypassRules, listener, executor, reverseBypass);
}
}
......
......@@ -83,6 +83,7 @@ class SupportLibWebViewChromiumFactory implements WebViewProviderFactoryBoundary
Features.WEB_MESSAGE_LISTENER,
Features.SET_SUPPORT_LIBRARY_VERSION + Features.DEV_SUFFIX,
Features.DOCUMENT_START_SCRIPT + Features.DEV_SUFFIX,
Features.PROXY_OVERRIDE_REVERSE_BYPASS + Features.DEV_SUFFIX,
};
// These values are persisted to logs. Entries should not be renumbered and
......@@ -141,7 +142,8 @@ class SupportLibWebViewChromiumFactory implements WebViewProviderFactoryBoundary
ApiCall.WEBVIEW_RENDERER_TERMINATE,
ApiCall.ADD_DOCUMENT_START_SCRIPT,
ApiCall.REMOVE_DOCUMENT_START_SCRIPT,
ApiCall.SET_SAFE_BROWSING_ALLOWLIST})
ApiCall.SET_SAFE_BROWSING_ALLOWLIST,
ApiCall.SET_PROXY_OVERRIDE_REVERSE_BYPASS})
public @interface ApiCall {
int ADD_WEB_MESSAGE_LISTENER = 0;
int CLEAR_PROXY_OVERRIDE = 1;
......@@ -198,7 +200,8 @@ class SupportLibWebViewChromiumFactory implements WebViewProviderFactoryBoundary
int ADD_DOCUMENT_START_SCRIPT = 52;
int REMOVE_DOCUMENT_START_SCRIPT = 53;
int SET_SAFE_BROWSING_ALLOWLIST = 54;
int COUNT = 55;
int SET_PROXY_OVERRIDE_REVERSE_BYPASS = 55;
int COUNT = 56;
}
// clang-format on
......
......@@ -248,6 +248,7 @@ std::string CreateOverrideProxyConfig(
const std::vector<ProxyConfigServiceAndroid::ProxyOverrideRule>&
proxy_rules,
const std::vector<std::string>& bypass_rules,
const bool reverse_bypass,
ProxyConfigWithAnnotation* config) {
ProxyConfig proxy_config;
auto result = ParseOverrideRules(proxy_rules, &proxy_config.proxy_rules());
......@@ -255,6 +256,8 @@ std::string CreateOverrideProxyConfig(
return result;
}
proxy_config.proxy_rules().reverse_bypass = reverse_bypass;
for (const auto& bypass_rule : bypass_rules) {
if (!proxy_config.proxy_rules().bypass_rules.AddRuleFromString(
bypass_rule)) {
......@@ -370,14 +373,15 @@ class ProxyConfigServiceAndroid::Delegate
std::string SetProxyOverride(
const std::vector<ProxyOverrideRule>& proxy_rules,
const std::vector<std::string>& bypass_rules,
const bool reverse_bypass,
base::OnceClosure callback) {
DCHECK(InJNISequence());
has_proxy_override_ = true;
// Creates a new proxy config
ProxyConfigWithAnnotation proxy_config;
std::string result =
CreateOverrideProxyConfig(proxy_rules, bypass_rules, &proxy_config);
std::string result = CreateOverrideProxyConfig(
proxy_rules, bypass_rules, reverse_bypass, &proxy_config);
if (!result.empty()) {
return result;
}
......@@ -544,8 +548,9 @@ void ProxyConfigServiceAndroid::ProxySettingsChanged() {
std::string ProxyConfigServiceAndroid::SetProxyOverride(
const std::vector<ProxyOverrideRule>& proxy_rules,
const std::vector<std::string>& bypass_rules,
const bool reverse_bypass,
base::OnceClosure callback) {
return delegate_->SetProxyOverride(proxy_rules, bypass_rules,
return delegate_->SetProxyOverride(proxy_rules, bypass_rules, reverse_bypass,
std::move(callback));
}
......
......@@ -103,6 +103,7 @@ class NET_EXPORT ProxyConfigServiceAndroid : public ProxyConfigService {
std::string SetProxyOverride(
const std::vector<ProxyOverrideRule>& proxy_rules,
const std::vector<std::string>& bypass_rules,
const bool reverse_bypass,
base::OnceClosure callback);
void ClearProxyOverride(base::OnceClosure callback);
......
......@@ -123,17 +123,20 @@ class ProxyConfigServiceAndroidTestBase : public TestWithTaskEnvironment {
void SetProxyOverride(
const ProxyConfigServiceAndroid::ProxyOverrideRule& rule,
const std::vector<std::string>& bypass_rules,
const bool reverse_bypass,
base::OnceClosure callback) {
std::vector<ProxyConfigServiceAndroid::ProxyOverrideRule> rules;
rules.push_back(rule);
SetProxyOverride(rules, bypass_rules, std::move(callback));
SetProxyOverride(rules, bypass_rules, reverse_bypass, std::move(callback));
}
void SetProxyOverride(
const std::vector<ProxyConfigServiceAndroid::ProxyOverrideRule>& rules,
const std::vector<std::string>& bypass_rules,
const bool reverse_bypass,
base::OnceClosure callback) {
service_.SetProxyOverride(rules, bypass_rules, std::move(callback));
service_.SetProxyOverride(rules, bypass_rules, reverse_bypass,
std::move(callback));
base::RunLoop().RunUntilIdle();
}
......@@ -237,14 +240,14 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyOverrideSchemes) {
TestMapping("https://example.com/", "DIRECT");
TestMapping("ftp://example.com/", "DIRECT");
SetProxyOverride({"*", "httpoverrideproxy.com:200"}, bypass_rules,
SetProxyOverride({"*", "httpoverrideproxy.com:200"}, bypass_rules, false,
base::DoNothing());
TestMapping("http://example.com/", "PROXY httpoverrideproxy.com:200");
TestMapping("https://example.com/", "PROXY httpoverrideproxy.com:200");
TestMapping("ftp://example.com/", "PROXY httpoverrideproxy.com:200");
// Check that webview uses the custom proxy only for https
SetProxyOverride({"https", "httpoverrideproxy.com:200"}, bypass_rules,
SetProxyOverride({"https", "httpoverrideproxy.com:200"}, bypass_rules, false,
base::DoNothing());
TestMapping("http://example.com/", "DIRECT");
TestMapping("https://example.com/", "PROXY httpoverrideproxy.com:200");
......@@ -266,14 +269,14 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyOverridePorts) {
TestMapping("ftp://example.com/", "DIRECT");
// Check that webview uses port 80 for http proxies
SetProxyOverride({"*", "httpoverrideproxy.com"}, bypass_rules,
SetProxyOverride({"*", "httpoverrideproxy.com"}, bypass_rules, false,
base::DoNothing());
TestMapping("http://example.com:444", "PROXY httpoverrideproxy.com:80");
TestMapping("https://example.com:2222", "PROXY httpoverrideproxy.com:80");
TestMapping("ftp://example.com:15", "PROXY httpoverrideproxy.com:80");
// Check that webview uses port 443 for https proxies
SetProxyOverride({"*", "https://httpoverrideproxy.com"}, bypass_rules,
SetProxyOverride({"*", "https://httpoverrideproxy.com"}, bypass_rules, false,
base::DoNothing());
TestMapping("http://example.com:8080", "HTTPS httpoverrideproxy.com:443");
TestMapping("https://example.com:1111", "HTTPS httpoverrideproxy.com:443");
......@@ -281,7 +284,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyOverridePorts) {
// Check that webview uses custom port
SetProxyOverride({"*", "https://httpoverrideproxy.com:777"}, bypass_rules,
base::DoNothing());
false, base::DoNothing());
TestMapping("http://example.com:8080", "HTTPS httpoverrideproxy.com:777");
TestMapping("https://example.com:1111", "HTTPS httpoverrideproxy.com:777");
TestMapping("ftp://example.com:752", "HTTPS httpoverrideproxy.com:777");
......@@ -296,7 +299,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyOverrideMultipleRules) {
std::vector<ProxyConfigServiceAndroid::ProxyOverrideRule> rules;
rules.push_back({"http", "httpoverrideproxy.com"});
rules.push_back({"https", "https://httpoverrideproxy.com"});
SetProxyOverride(rules, bypass_rules, base::DoNothing());
SetProxyOverride(rules, bypass_rules, false, base::DoNothing());
TestMapping("https://example.com/", "HTTPS httpoverrideproxy.com:443");
TestMapping("http://example.com/", "PROXY httpoverrideproxy.com:80");
......@@ -304,7 +307,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyOverrideMultipleRules) {
rules.clear();
rules.push_back({"http", "overrideproxy1.com"});
rules.push_back({"*", "overrideproxy2.com"});
SetProxyOverride(rules, bypass_rules, base::DoNothing());
SetProxyOverride(rules, bypass_rules, false, base::DoNothing());
TestMapping("https://example.com/", "PROXY overrideproxy2.com:80");
TestMapping("http://example.com/", "PROXY overrideproxy1.com:80");
......@@ -320,7 +323,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyOverrideListOfRules) {
rules.push_back({"http", "httpproxy2"});
rules.push_back({"*", "fallback2"});
rules.push_back({"*", "direct://"});
SetProxyOverride(rules, bypass_rules, base::DoNothing());
SetProxyOverride(rules, bypass_rules, false, base::DoNothing());
TestMapping("http://example.com", "PROXY httpproxy1:80;PROXY httpproxy2:80");
TestMapping("https://example.com",
......@@ -335,7 +338,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestOverrideAndProxy) {
TestMapping("http://example.com/", "DIRECT");
// Check that webview uses the custom proxy
SetProxyOverride({"*", "httpoverrideproxy.com:200"}, bypass_rules,
SetProxyOverride({"*", "httpoverrideproxy.com:200"}, bypass_rules, false,
base::DoNothing());
TestMapping("http://example.com/", "PROXY httpoverrideproxy.com:200");
......@@ -362,7 +365,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestProxyAndOverride) {
TestMapping("http://example.com/", "PROXY httpsomeproxy.com:80");
// Check that webview uses the custom proxy
SetProxyOverride({"*", "httpoverrideproxy.com:200"}, bypass_rules,
SetProxyOverride({"*", "httpoverrideproxy.com:200"}, bypass_rules, false,
base::DoNothing());
TestMapping("http://example.com/", "PROXY httpoverrideproxy.com:200");
......@@ -378,7 +381,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestOverrideThenProxy) {
TestMapping("http://example.com/", "DIRECT");
// Check that webview uses the custom proxy
SetProxyOverride({"*", "httpoverrideproxy.com:200"}, bypass_rules,
SetProxyOverride({"*", "httpoverrideproxy.com:200"}, bypass_rules, false,
base::DoNothing());
TestMapping("http://example.com/", "PROXY httpoverrideproxy.com:200");
......@@ -425,7 +428,7 @@ TEST_F(ProxyConfigServiceAndroidTest, TestOverrideBypassRules) {
TestMapping("http://example.com/", "DIRECT");
// Check that webview handles the bypass rules correctly
SetProxyOverride({"*", "httpoverrideproxy.com:200"}, bypass_rules,
SetProxyOverride({"*", "httpoverrideproxy.com:200"}, bypass_rules, false,
base::DoNothing());
TestMapping("http://excluded.com/", "DIRECT");
TestMapping("http://example.com/", "PROXY httpoverrideproxy.com:200");
......@@ -446,12 +449,30 @@ TEST_F(ProxyConfigServiceAndroidTest, TestOverrideToDirect) {
// Check that webview uses no proxy
TestMapping("http://example.com/", "PROXY httpsomeproxy.com:80");
SetProxyOverride({"*", "direct://"}, bypass_rules, base::DoNothing());
SetProxyOverride({"*", "direct://"}, bypass_rules, false, base::DoNothing());
TestMapping("http://example.com/", "DIRECT");
ClearProxyOverride(base::DoNothing());
}
TEST_F(ProxyConfigServiceAndroidTest, TestReverseBypass) {
std::vector<std::string> bypass_rules;
// Check that webview uses the default proxy
TestMapping("http://example.com/", "DIRECT");
TestMapping("http://other.com/", "DIRECT");
// Use a reverse bypass list, that is, WebView will only apply the proxy
// settings to URLs in the bypass list
bypass_rules.push_back("http://example.com");
SetProxyOverride({"*", "httpoverrideproxy.com:200"}, bypass_rules, true,
base::DoNothing());
// Check that URLs in the bypass list use the proxy
TestMapping("http://example.com/", "PROXY httpoverrideproxy.com:200");
TestMapping("http://other.com/", "DIRECT");
}
// !! The following test cases are automatically generated from
// !! net/android/tools/proxy_test_cases.py.
// !! Please edit that file instead of editing the test cases below and
......
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