Commit 39172548 authored by Laís Minchillo's avatar Laís Minchillo Committed by Commit Bot

[aw] Post proxy override methods to the UI thread

Bug: 918350
Change-Id: Ieac9c9e1590c4cfe8f39d9f9bdfd510b41be616e
Reviewed-on: https://chromium-review.googlesource.com/c/1392719Reviewed-by: default avatarTobias Sargeant <tobiasjs@chromium.org>
Commit-Queue: Laís Minchillo <laisminchillo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#619438}
parent f7bf7332
...@@ -16,7 +16,7 @@ import java.util.concurrent.Executor; ...@@ -16,7 +16,7 @@ import java.util.concurrent.Executor;
public class AwProxyController { public class AwProxyController {
public AwProxyController() {} public AwProxyController() {}
public void setProxyOverride( public String setProxyOverride(
String[][] proxyRules, String[] bypassRules, Runnable listener, Executor executor) { String[][] proxyRules, String[] bypassRules, Runnable listener, Executor executor) {
int length = (proxyRules == null ? 0 : proxyRules.length); int length = (proxyRules == null ? 0 : proxyRules.length);
String[] urlSchemes = new String[length]; String[] urlSchemes = new String[length];
...@@ -31,31 +31,29 @@ public class AwProxyController { ...@@ -31,31 +31,29 @@ public class AwProxyController {
// proxy URLs // proxy URLs
proxyUrls[i] = proxyRules[i][1]; proxyUrls[i] = proxyRules[i][1];
if (proxyUrls[i] == null) { if (proxyUrls[i] == null) {
throw new NullPointerException("Proxy rule " + i + " has a null url"); return "Proxy rule " + i + " has a null url";
} }
} }
length = (bypassRules == null ? 0 : bypassRules.length); length = (bypassRules == null ? 0 : bypassRules.length);
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++) {
if (bypassRules[i] == null) { if (bypassRules[i] == null) {
throw new NullPointerException("Bypass rule " + i + " is null"); return "Bypass rule " + i + " is null";
} }
} }
if (executor == null) { if (executor == null) {
throw new NullPointerException("Executor must not be null"); return "Executor must not be null";
} }
String result = return nativeSetProxyOverride(urlSchemes, proxyUrls, bypassRules, listener, executor);
nativeSetProxyOverride(urlSchemes, proxyUrls, bypassRules, listener, executor);
if (!result.isEmpty()) {
throw new IllegalArgumentException(result);
}
} }
public void clearProxyOverride(Runnable listener, Executor executor) { public String clearProxyOverride(Runnable listener, Executor executor) {
if (executor == null) { if (executor == null) {
throw new NullPointerException("Executor must not be null"); return "Executor must not be null";
} }
nativeClearProxyOverride(listener, executor); nativeClearProxyOverride(listener, executor);
return "";
} }
@CalledByNativeUnchecked @CalledByNativeUnchecked
...@@ -67,4 +65,4 @@ public class AwProxyController { ...@@ -67,4 +65,4 @@ public class AwProxyController {
private native String nativeSetProxyOverride(String[] urlSchemes, String[] proxyUrls, private native String nativeSetProxyOverride(String[] urlSchemes, String[] proxyUrls,
String[] bypassRules, Runnable listener, Executor executor); String[] bypassRules, Runnable listener, Executor executor);
private native void nativeClearProxyOverride(Runnable listener, Executor executor); private native void nativeClearProxyOverride(Runnable listener, Executor executor);
} }
\ No newline at end of file
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
package org.chromium.support_lib_glue; package org.chromium.support_lib_glue;
import org.chromium.android_webview.AwProxyController; import org.chromium.android_webview.AwProxyController;
import org.chromium.android_webview.WebViewChromiumRunQueue;
import org.chromium.base.ThreadUtils;
import org.chromium.support_lib_boundary.ProxyControllerBoundaryInterface; import org.chromium.support_lib_boundary.ProxyControllerBoundaryInterface;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
...@@ -13,20 +15,47 @@ import java.util.concurrent.Executor; ...@@ -13,20 +15,47 @@ import java.util.concurrent.Executor;
* Adapter between AwProxyController and ProxyControllerBoundaryInterface. * Adapter between AwProxyController and ProxyControllerBoundaryInterface.
*/ */
public class SupportLibProxyControllerAdapter implements ProxyControllerBoundaryInterface { public class SupportLibProxyControllerAdapter implements ProxyControllerBoundaryInterface {
private final WebViewChromiumRunQueue mRunQueue;
private final AwProxyController mProxyController; private final AwProxyController mProxyController;
public SupportLibProxyControllerAdapter(AwProxyController proxyController) { public SupportLibProxyControllerAdapter(
WebViewChromiumRunQueue runQueue, AwProxyController proxyController) {
mRunQueue = runQueue;
mProxyController = proxyController; mProxyController = proxyController;
} }
@Override @Override
public void setProxyOverride( public void setProxyOverride(
String[][] proxyRules, String[] bypassRules, Runnable listener, Executor executor) { String[][] proxyRules, String[] bypassRules, Runnable listener, Executor executor) {
mProxyController.setProxyOverride(proxyRules, bypassRules, listener, executor); String result;
if (checkNeedsPost()) {
result = mRunQueue.runOnUiThreadBlocking(() -> {
return mProxyController.setProxyOverride(
proxyRules, bypassRules, listener, executor);
});
} else {
result = mProxyController.setProxyOverride(proxyRules, bypassRules, listener, executor);
}
if (!result.isEmpty()) {
throw new IllegalArgumentException(result);
}
} }
@Override @Override
public void clearProxyOverride(Runnable listener, Executor executor) { public void clearProxyOverride(Runnable listener, Executor executor) {
mProxyController.clearProxyOverride(listener, executor); String result;
if (checkNeedsPost()) {
result = mRunQueue.runOnUiThreadBlocking(
() -> { return mProxyController.clearProxyOverride(listener, executor); });
} else {
result = mProxyController.clearProxyOverride(listener, executor);
}
if (!result.isEmpty()) {
throw new IllegalArgumentException(result);
}
} }
}
\ No newline at end of file private static boolean checkNeedsPost() {
return !ThreadUtils.runningOnUiThread();
}
}
...@@ -167,7 +167,8 @@ class SupportLibWebViewChromiumFactory implements WebViewProviderFactoryBoundary ...@@ -167,7 +167,8 @@ class SupportLibWebViewChromiumFactory implements WebViewProviderFactoryBoundary
synchronized (mAwInit.getLock()) { synchronized (mAwInit.getLock()) {
if (mProxyController == null) { if (mProxyController == null) {
mProxyController = BoundaryInterfaceReflectionUtil.createInvocationHandlerFor( mProxyController = BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
new SupportLibProxyControllerAdapter(mAwInit.getAwProxyController())); new SupportLibProxyControllerAdapter(
mAwInit.getRunQueue(), mAwInit.getAwProxyController()));
} }
} }
return mProxyController; return mProxyController;
......
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