Commit 43f60e21 authored by Anna Malova's avatar Anna Malova Committed by Commit Bot

Allow multiple instances of AwPacProcessor.

Bug: 1085115
Change-Id: I5bce43e5538b1f7395fb094585a281848c8884f0
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2207157
Commit-Queue: Anna Malova <amalova@chromium.org>
Reviewed-by: default avatarRichard Coles <torne@chromium.org>
Cr-Commit-Position: refs/heads/master@{#772663}
parent 5416e508
...@@ -162,19 +162,39 @@ class HostResolver : public proxy_resolver::ProxyHostResolver { ...@@ -162,19 +162,39 @@ class HostResolver : public proxy_resolver::ProxyHostResolver {
class Bindings : public proxy_resolver::ProxyResolverV8Tracing::Bindings { class Bindings : public proxy_resolver::ProxyResolverV8Tracing::Bindings {
public: public:
Bindings(AwPacProcessor* processor) : processor_(processor) {}
void Alert(const base::string16& message) override {} void Alert(const base::string16& message) override {}
void OnError(int line_number, const base::string16& message) override {} void OnError(int line_number, const base::string16& message) override {}
proxy_resolver::ProxyHostResolver* GetHostResolver() override { proxy_resolver::ProxyHostResolver* GetHostResolver() override {
return AwPacProcessor::Get()->host_resolver(); return processor_->host_resolver();
} }
net::NetLogWithSource GetNetLogWithSource() override { net::NetLogWithSource GetNetLogWithSource() override {
return net::NetLogWithSource(); return net::NetLogWithSource();
} }
private:
AwPacProcessor* processor_;
}; };
scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() {
struct ThreadHolder {
base::Thread thread_;
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
ThreadHolder() : thread_("AwPacProcessor") {
thread_.Start();
task_runner_ = thread_.task_runner();
}
};
static ThreadHolder thread_holder;
return thread_holder.task_runner_;
}
} // namespace } // namespace
class Job { class Job {
...@@ -182,7 +202,7 @@ class Job { ...@@ -182,7 +202,7 @@ class Job {
virtual ~Job() = default; virtual ~Job() = default;
bool ExecSync() { bool ExecSync() {
AwPacProcessor::Get()->task_runner_->PostTask(FROM_HERE, std::move(task_)); GetTaskRunner()->PostTask(FROM_HERE, std::move(task_));
event_.Wait(); event_.Wait();
return net_error_ == net::OK; return net_error_ == net::OK;
} }
...@@ -208,10 +228,10 @@ class Job { ...@@ -208,10 +228,10 @@ class Job {
class SetProxyScriptJob : public Job { class SetProxyScriptJob : public Job {
public: public:
SetProxyScriptJob(std::string script) { SetProxyScriptJob(AwPacProcessor* processor, std::string script) {
task_ = base::BindOnce( task_ = base::BindOnce(
&AwPacProcessor::SetProxyScriptNative, &AwPacProcessor::SetProxyScriptNative, base::Unretained(processor),
base::Unretained(AwPacProcessor::Get()), &request_, std::move(script), &request_, std::move(script),
base::BindOnce(&SetProxyScriptJob::OnSignal, base::Unretained(this))); base::BindOnce(&SetProxyScriptJob::OnSignal, base::Unretained(this)));
} }
...@@ -223,11 +243,10 @@ class SetProxyScriptJob : public Job { ...@@ -223,11 +243,10 @@ class SetProxyScriptJob : public Job {
class MakeProxyRequestJob : public Job { class MakeProxyRequestJob : public Job {
public: public:
MakeProxyRequestJob(std::string url) { MakeProxyRequestJob(AwPacProcessor* processor, std::string url) {
task_ = base::BindOnce( task_ = base::BindOnce(
&AwPacProcessor::MakeProxyRequestNative, &AwPacProcessor::MakeProxyRequestNative, base::Unretained(processor),
base::Unretained(AwPacProcessor::Get()), &request_, std::move(url), &request_, std::move(url), &proxy_info_,
&proxy_info_,
base::BindOnce(&MakeProxyRequestJob::OnSignal, base::Unretained(this))); base::BindOnce(&MakeProxyRequestJob::OnSignal, base::Unretained(this)));
} }
void Cancel() override { request_.reset(); } void Cancel() override { request_.reset(); }
...@@ -238,16 +257,7 @@ class MakeProxyRequestJob : public Job { ...@@ -238,16 +257,7 @@ class MakeProxyRequestJob : public Job {
std::unique_ptr<net::ProxyResolver::Request> request_; std::unique_ptr<net::ProxyResolver::Request> request_;
}; };
// static AwPacProcessor::AwPacProcessor() {
AwPacProcessor* AwPacProcessor::Get() {
static base::NoDestructor<AwPacProcessor> instance;
return instance.get();
}
AwPacProcessor::AwPacProcessor() : thread_("AwPacResolver") {
thread_.Start();
task_runner_ = thread_.task_runner();
proxy_resolver_factory_ = proxy_resolver_factory_ =
proxy_resolver::ProxyResolverV8TracingFactory::Create(); proxy_resolver::ProxyResolverV8TracingFactory::Create();
host_resolver_ = std::make_unique<HostResolver>(); host_resolver_ = std::make_unique<HostResolver>();
...@@ -259,9 +269,9 @@ void AwPacProcessor::SetProxyScriptNative( ...@@ -259,9 +269,9 @@ void AwPacProcessor::SetProxyScriptNative(
std::unique_ptr<net::ProxyResolverFactory::Request>* request, std::unique_ptr<net::ProxyResolverFactory::Request>* request,
const std::string& script, const std::string& script,
net::CompletionOnceCallback complete) { net::CompletionOnceCallback complete) {
DCHECK(task_runner_->BelongsToCurrentThread()); DCHECK(GetTaskRunner()->BelongsToCurrentThread());
proxy_resolver_factory_->CreateProxyResolverV8Tracing( proxy_resolver_factory_->CreateProxyResolverV8Tracing(
net::PacFileData::FromUTF8(script), std::make_unique<Bindings>(), net::PacFileData::FromUTF8(script), std::make_unique<Bindings>(this),
&proxy_resolver_, std::move(complete), request); &proxy_resolver_, std::move(complete), request);
} }
...@@ -270,19 +280,19 @@ void AwPacProcessor::MakeProxyRequestNative( ...@@ -270,19 +280,19 @@ void AwPacProcessor::MakeProxyRequestNative(
const std::string& url, const std::string& url,
net::ProxyInfo* proxy_info, net::ProxyInfo* proxy_info,
net::CompletionOnceCallback complete) { net::CompletionOnceCallback complete) {
DCHECK(task_runner_->BelongsToCurrentThread()); DCHECK(GetTaskRunner()->BelongsToCurrentThread());
if (proxy_resolver_) { if (proxy_resolver_) {
proxy_resolver_->GetProxyForURL(GURL(url), net::NetworkIsolationKey(), proxy_resolver_->GetProxyForURL(GURL(url), net::NetworkIsolationKey(),
proxy_info, std::move(complete), request, proxy_info, std::move(complete), request,
std::make_unique<Bindings>()); std::make_unique<Bindings>(this));
} else { } else {
std::move(complete).Run(net::ERR_FAILED); std::move(complete).Run(net::ERR_FAILED);
} }
} }
bool AwPacProcessor::SetProxyScript(std::string script) { bool AwPacProcessor::SetProxyScript(std::string script) {
SetProxyScriptJob job(script); SetProxyScriptJob job(this, script);
bool success = job.ExecSync(); bool success = job.ExecSync();
DCHECK(proxy_resolver_); DCHECK(proxy_resolver_);
return success; return success;
...@@ -296,7 +306,7 @@ jboolean AwPacProcessor::SetProxyScript(JNIEnv* env, ...@@ -296,7 +306,7 @@ jboolean AwPacProcessor::SetProxyScript(JNIEnv* env,
} }
std::string AwPacProcessor::MakeProxyRequest(std::string url) { std::string AwPacProcessor::MakeProxyRequest(std::string url) {
MakeProxyRequestJob job(url); MakeProxyRequestJob job(this, url);
bool success = job.ExecSync(); bool success = job.ExecSync();
return success ? job.proxy_info().ToPacString() : nullptr; return success ? job.proxy_info().ToPacString() : nullptr;
} }
...@@ -309,8 +319,9 @@ ScopedJavaLocalRef<jstring> AwPacProcessor::MakeProxyRequest( ...@@ -309,8 +319,9 @@ ScopedJavaLocalRef<jstring> AwPacProcessor::MakeProxyRequest(
return ConvertUTF8ToJavaString(env, MakeProxyRequest(url)); return ConvertUTF8ToJavaString(env, MakeProxyRequest(url));
} }
static jlong JNI_AwPacProcessor_GetDefaultPacProcessor(JNIEnv* env) { static jlong JNI_AwPacProcessor_CreateNativePacProcessor(JNIEnv* env) {
return reinterpret_cast<intptr_t>(AwPacProcessor::Get()); AwPacProcessor* processor = new AwPacProcessor();
return reinterpret_cast<intptr_t>(processor);
} }
static void JNI_AwPacProcessor_InitializeEnvironment(JNIEnv* env) { static void JNI_AwPacProcessor_InitializeEnvironment(JNIEnv* env) {
......
...@@ -17,7 +17,10 @@ namespace android_webview { ...@@ -17,7 +17,10 @@ namespace android_webview {
class AwPacProcessor { class AwPacProcessor {
public: public:
static AwPacProcessor* Get(); AwPacProcessor();
AwPacProcessor(const AwPacProcessor&) = delete;
AwPacProcessor& operator=(const AwPacProcessor&) = delete;
jboolean SetProxyScript(JNIEnv* env, jboolean SetProxyScript(JNIEnv* env,
const base::android::JavaParamRef<jobject>& obj, const base::android::JavaParamRef<jobject>& obj,
const base::android::JavaParamRef<jstring>& jscript); const base::android::JavaParamRef<jstring>& jscript);
...@@ -30,11 +33,7 @@ class AwPacProcessor { ...@@ -30,11 +33,7 @@ class AwPacProcessor {
proxy_resolver::ProxyHostResolver* host_resolver() { proxy_resolver::ProxyHostResolver* host_resolver() {
return host_resolver_.get(); return host_resolver_.get();
} }
private: private:
AwPacProcessor();
AwPacProcessor(const AwPacProcessor&) = delete;
AwPacProcessor& operator=(const AwPacProcessor&) = delete;
~AwPacProcessor(); ~AwPacProcessor();
void SetProxyScriptNative( void SetProxyScriptNative(
std::unique_ptr<net::ProxyResolverFactory::Request>* request, std::unique_ptr<net::ProxyResolverFactory::Request>* request,
...@@ -50,11 +49,6 @@ class AwPacProcessor { ...@@ -50,11 +49,6 @@ class AwPacProcessor {
std::unique_ptr<proxy_resolver::ProxyResolverV8Tracing> proxy_resolver_; std::unique_ptr<proxy_resolver::ProxyResolverV8Tracing> proxy_resolver_;
std::unique_ptr<proxy_resolver::ProxyHostResolver> host_resolver_; std::unique_ptr<proxy_resolver::ProxyHostResolver> host_resolver_;
base::Thread thread_;
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
friend class base::NoDestructor<AwPacProcessor>;
friend class Job; friend class Job;
friend class SetProxyScriptJob; friend class SetProxyScriptJob;
friend class MakeProxyRequestJob; friend class MakeProxyRequestJob;
......
...@@ -30,7 +30,7 @@ class AwPacProcessorTest : public testing::Test { ...@@ -30,7 +30,7 @@ class AwPacProcessorTest : public testing::Test {
protected: protected:
base::test::TaskEnvironment task_environment_{ base::test::TaskEnvironment task_environment_{
base::test::TaskEnvironment::TimeSource::MOCK_TIME}; base::test::TaskEnvironment::TimeSource::MOCK_TIME};
AwPacProcessor* pac_processor_ = AwPacProcessor::Get(); AwPacProcessor* pac_processor_ = new AwPacProcessor();
}; };
TEST_F(AwPacProcessorTest, MakeProxyRequest) { TEST_F(AwPacProcessorTest, MakeProxyRequest) {
...@@ -45,4 +45,16 @@ TEST_F(AwPacProcessorTest, MakeProxyRequestDnsResolve) { ...@@ -45,4 +45,16 @@ TEST_F(AwPacProcessorTest, MakeProxyRequestDnsResolve) {
pac_processor_->MakeProxyRequest(kRequestUrl)); pac_processor_->MakeProxyRequest(kRequestUrl));
} }
TEST_F(AwPacProcessorTest, MultipleProxyRequest) {
AwPacProcessor* other_pac_processor_ = new AwPacProcessor();
pac_processor_->SetProxyScript(kScript);
other_pac_processor_->SetProxyScript(kScriptDnsResolve);
EXPECT_EQ("PROXY localhost:8080;PROXY localhost:8081;DIRECT",
pac_processor_->MakeProxyRequest(kRequestUrl));
EXPECT_EQ("PROXY 127.0.0.1:80",
other_pac_processor_->MakeProxyRequest(kRequestUrl));
}
} // namespace android_webview } // namespace android_webview
...@@ -14,10 +14,6 @@ import org.chromium.base.annotations.NativeMethods; ...@@ -14,10 +14,6 @@ import org.chromium.base.annotations.NativeMethods;
public class AwPacProcessor { public class AwPacProcessor {
private long mNativePacProcessor; private long mNativePacProcessor;
private AwPacProcessor() {
this.mNativePacProcessor = AwPacProcessorJni.get().getDefaultPacProcessor();
}
private static class LazyHolder { private static class LazyHolder {
static final AwPacProcessor sInstance = new AwPacProcessor(); static final AwPacProcessor sInstance = new AwPacProcessor();
} }
...@@ -26,6 +22,10 @@ public class AwPacProcessor { ...@@ -26,6 +22,10 @@ public class AwPacProcessor {
return LazyHolder.sInstance; return LazyHolder.sInstance;
} }
public AwPacProcessor() {
mNativePacProcessor = AwPacProcessorJni.get().createNativePacProcessor();
}
public boolean setProxyScript(String script) { public boolean setProxyScript(String script) {
return AwPacProcessorJni.get().setProxyScript(mNativePacProcessor, this, script); return AwPacProcessorJni.get().setProxyScript(mNativePacProcessor, this, script);
} }
...@@ -41,7 +41,7 @@ public class AwPacProcessor { ...@@ -41,7 +41,7 @@ public class AwPacProcessor {
@NativeMethods @NativeMethods
interface Natives { interface Natives {
void initializeEnvironment(); void initializeEnvironment();
long getDefaultPacProcessor(); long createNativePacProcessor();
boolean setProxyScript(long nativeAwPacProcessor, AwPacProcessor caller, String script); boolean setProxyScript(long nativeAwPacProcessor, AwPacProcessor caller, String script);
String makeProxyRequest(long nativeAwPacProcessor, AwPacProcessor caller, String url); String makeProxyRequest(long nativeAwPacProcessor, AwPacProcessor caller, String url);
} }
......
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