| Index: net/proxy/proxy_resolver_v8.cc
|
| diff --git a/net/proxy/proxy_resolver_v8.cc b/net/proxy/proxy_resolver_v8.cc
|
| index 935072b33ea431e8e1fc55e9094e1db1244cc470..72254b318ac4ec1e21527f6a949ae4b966c6aed6 100644
|
| --- a/net/proxy/proxy_resolver_v8.cc
|
| +++ b/net/proxy/proxy_resolver_v8.cc
|
| @@ -2,8 +2,6 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#define V8_DISABLE_DEPRECATIONS 1
|
| -
|
| #include "net/proxy/proxy_resolver_v8.h"
|
|
|
| #include <algorithm>
|
| @@ -334,15 +332,17 @@ bool IsInNetEx(const std::string& ip_address, const std::string& ip_prefix) {
|
|
|
| class ProxyResolverV8::Context {
|
| public:
|
| - explicit Context(ProxyResolverV8* parent)
|
| - : parent_(parent) {
|
| + Context(ProxyResolverV8* parent, v8::Isolate* isolate)
|
| + : parent_(parent),
|
| + isolate_(isolate) {
|
| + DCHECK(isolate);
|
| }
|
|
|
| ~Context() {
|
| - v8::Locker locked;
|
| + v8::Locker locked(isolate_);
|
|
|
| - v8_this_.Dispose();
|
| - v8_context_.Dispose();
|
| + v8_this_.Dispose(isolate_);
|
| + v8_context_.Dispose(isolate_);
|
| }
|
|
|
| JSBindings* js_bindings() {
|
| @@ -350,7 +350,7 @@ class ProxyResolverV8::Context {
|
| }
|
|
|
| int ResolveProxy(const GURL& query_url, ProxyInfo* results) {
|
| - v8::Locker locked;
|
| + v8::Locker locked(isolate_);
|
| v8::HandleScope scope;
|
|
|
| v8::Context::Scope function_scope(v8_context_);
|
| @@ -401,10 +401,11 @@ class ProxyResolverV8::Context {
|
| }
|
|
|
| int InitV8(const scoped_refptr<ProxyResolverScriptData>& pac_script) {
|
| - v8::Locker locked;
|
| + v8::Locker locked(isolate_);
|
| v8::HandleScope scope;
|
|
|
| - v8_this_ = v8::Persistent<v8::External>::New(v8::External::New(this));
|
| + v8_this_ = v8::Persistent<v8::External>::New(isolate_,
|
| + v8::External::New(this));
|
| v8::Local<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New();
|
|
|
| // Attach the javascript bindings.
|
| @@ -479,7 +480,7 @@ class ProxyResolverV8::Context {
|
| }
|
|
|
| void PurgeMemory() {
|
| - v8::Locker locked;
|
| + v8::Locker locked(isolate_);
|
| v8::V8::LowMemoryNotification();
|
| }
|
|
|
| @@ -669,6 +670,7 @@ class ProxyResolverV8::Context {
|
|
|
| mutable base::Lock lock_;
|
| ProxyResolverV8* parent_;
|
| + v8::Isolate* isolate_;
|
| v8::Persistent<v8::External> v8_this_;
|
| v8::Persistent<v8::Context> v8_context_;
|
| };
|
| @@ -729,11 +731,30 @@ int ProxyResolverV8::SetPacScript(
|
| return ERR_PAC_SCRIPT_FAILED;
|
|
|
| // Try parsing the PAC script.
|
| - scoped_ptr<Context> context(new Context(this));
|
| + scoped_ptr<Context> context(new Context(this, GetDefaultIsolate()));
|
| int rv = context->InitV8(script_data);
|
| if (rv == OK)
|
| context_.reset(context.release());
|
| return rv;
|
| }
|
|
|
| +// static
|
| +void ProxyResolverV8::RememberDefaultIsolate() {
|
| + v8::Isolate* isolate = v8::Isolate::GetCurrent();
|
| + DCHECK(isolate)
|
| + << "ProxyResolverV8::RememberDefaultIsolate called on wrong thread";
|
| + DCHECK(g_default_isolate_ == NULL || g_default_isolate_ == isolate)
|
| + << "Default Isolate can not be changed";
|
| + g_default_isolate_ = isolate;
|
| +}
|
| +
|
| +// static
|
| +v8::Isolate* ProxyResolverV8::GetDefaultIsolate() {
|
| + DCHECK(g_default_isolate_)
|
| + << "Must call ProxyResolverV8::RememberDefaultIsolate() first";
|
| + return g_default_isolate_;
|
| +}
|
| +
|
| +v8::Isolate* ProxyResolverV8::g_default_isolate_ = NULL;
|
| +
|
| } // namespace net
|
|
|