Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(138)

Side by Side Diff: net/proxy/proxy_resolver_v8.cc

Issue 2817043: Reduce the copying of string data between C++ and javascript in proxy_resolver_v8.cc. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: fix comment typo 'converts' Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/proxy/proxy_resolver_v8.h ('k') | net/proxy/proxy_resolver_v8_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/proxy/proxy_resolver_v8.h" 5 #include "net/proxy/proxy_resolver_v8.h"
6 6
7 #include "base/basictypes.h"
7 #include "base/logging.h" 8 #include "base/logging.h"
8 #include "base/string_util.h" 9 #include "base/string_util.h"
9 #include "base/utf_string_conversions.h" 10 #include "base/utf_string_conversions.h"
10 #include "googleurl/src/gurl.h" 11 #include "googleurl/src/gurl.h"
11 #include "googleurl/src/url_canon.h" 12 #include "googleurl/src/url_canon.h"
12 #include "net/base/host_cache.h" 13 #include "net/base/host_cache.h"
13 #include "net/base/net_errors.h" 14 #include "net/base/net_errors.h"
14 #include "net/base/net_log.h" 15 #include "net/base/net_log.h"
15 #include "net/proxy/proxy_info.h" 16 #include "net/proxy/proxy_info.h"
16 #include "net/proxy/proxy_resolver_js_bindings.h" 17 #include "net/proxy/proxy_resolver_js_bindings.h"
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 66
66 namespace net { 67 namespace net {
67 68
68 namespace { 69 namespace {
69 70
70 // Pseudo-name for the PAC script. 71 // Pseudo-name for the PAC script.
71 const char kPacResourceName[] = "proxy-pac-script.js"; 72 const char kPacResourceName[] = "proxy-pac-script.js";
72 // Pseudo-name for the PAC utility script. 73 // Pseudo-name for the PAC utility script.
73 const char kPacUtilityResourceName[] = "proxy-pac-utility-script.js"; 74 const char kPacUtilityResourceName[] = "proxy-pac-utility-script.js";
74 75
76 // External string wrapper so V8 can access a string16.
77 class V8ExternalString16 : public v8::String::ExternalStringResource {
78 public:
79 explicit V8ExternalString16(const string16& string) : string_(string) {}
80
81 virtual const uint16_t* data() const {
82 return reinterpret_cast<const uint16*>(string_.data());
83 }
84
85 virtual size_t length() const {
86 return string_.size();
87 }
88
89 private:
90 const string16 string_;
91 DISALLOW_COPY_AND_ASSIGN(V8ExternalString16);
92 };
93
94 // External string wrapper so V8 can access a string literal.
95 class V8ExternalASCIILiteral : public v8::String::ExternalAsciiStringResource {
96 public:
97 // |ascii| must be a NULL-terminated C string, and must remain valid
98 // throughout this object's lifetime.
99 V8ExternalASCIILiteral(const char* ascii, size_t length)
100 : ascii_(ascii), length_(length) {
101 DCHECK(IsStringASCII(ascii));
102 }
103
104 virtual const char* data() const {
105 return ascii_;
106 }
107
108 virtual size_t length() const {
109 return length_;
110 }
111
112 private:
113 const char* ascii_;
114 size_t length_;
115 DISALLOW_COPY_AND_ASSIGN(V8ExternalASCIILiteral);
116 };
117
118 // External string wrapper so V8 can access a std::string.
119 class V8ExternalASCIIString : public v8::String::ExternalAsciiStringResource {
120 public:
121 explicit V8ExternalASCIIString(const std::string& ascii)
122 : ascii_(ascii) {
123 DCHECK(IsStringASCII(ascii));
124 }
125
126 virtual const char* data() const {
127 return ascii_.data();
128 }
129
130 virtual size_t length() const {
131 return ascii_.size();
132 }
133
134 private:
135 const std::string ascii_;
136 DISALLOW_COPY_AND_ASSIGN(V8ExternalASCIIString);
137 };
138
139 // When creating a v8::String from a C++ string we have two choices: create
140 // a copy, or create a wrapper that shares the same underlying storage.
141 // For small strings it is better to just make a copy, whereas for large
142 // strings there are savings by sharing the storage. This number identifies
143 // the cutoff length for when to start wrapping rather than creating copies.
144 const size_t kMaxStringBytesForCopy = 256;
145
75 // Converts a V8 String to a UTF16 string16. 146 // Converts a V8 String to a UTF16 string16.
76 string16 V8StringToUTF16(v8::Handle<v8::String> s) { 147 string16 V8StringToUTF16(v8::Handle<v8::String> s) {
77 int len = s->Length(); 148 int len = s->Length();
78 string16 result; 149 string16 result;
79 // Note that the reinterpret cast is because on Windows string16 is an alias 150 // Note that the reinterpret cast is because on Windows string16 is an alias
80 // to wstring, and hence has character type wchar_t not uint16_t. 151 // to wstring, and hence has character type wchar_t not uint16_t.
81 s->Write(reinterpret_cast<uint16_t*>(WriteInto(&result, len + 1)), 0, len); 152 s->Write(reinterpret_cast<uint16_t*>(WriteInto(&result, len + 1)), 0, len);
82 return result; 153 return result;
83 } 154 }
84 155
85 // Converts a std::string (UTF8) to a V8 string. 156 // Converts an ASCII std::string to a V8 string.
86 v8::Local<v8::String> UTF8StdStringToV8String(const std::string& s) { 157 v8::Local<v8::String> ASCIIStringToV8String(const std::string& s) {
87 return v8::String::New(s.data(), s.size()); 158 DCHECK(IsStringASCII(s));
159 if (s.size() <= kMaxStringBytesForCopy)
160 return v8::String::New(s.data(), s.size());
161 return v8::String::NewExternal(new V8ExternalASCIIString(s));
162 }
163
164 // Converts a UTF16 string16 to a V8 string.
165 v8::Local<v8::String> UTF16StringToV8String(const string16& s) {
166 if (s.size() * 2 <= kMaxStringBytesForCopy) {
167 return v8::String::New(
168 reinterpret_cast<const uint16_t*>(s.data()), s.size());
169 }
170 return v8::String::NewExternal(new V8ExternalString16(s));
171 }
172
173 // Converts an ASCII string literal to a V8 string.
174 v8::Local<v8::String> ASCIILiteralToV8String(const char* ascii) {
175 DCHECK(IsStringASCII(ascii));
176 size_t length = strlen(ascii);
177 if (length <= kMaxStringBytesForCopy)
178 return v8::String::New(ascii, length);
179 return v8::String::NewExternal(new V8ExternalASCIILiteral(ascii, length));
88 } 180 }
89 181
90 // Stringizes a V8 object by calling its toString() method. Returns true 182 // Stringizes a V8 object by calling its toString() method. Returns true
91 // on success. This may fail if the toString() throws an exception. 183 // on success. This may fail if the toString() throws an exception.
92 bool V8ObjectToUTF16String(v8::Handle<v8::Value> object, 184 bool V8ObjectToUTF16String(v8::Handle<v8::Value> object,
93 string16* utf16_result) { 185 string16* utf16_result) {
94 if (object.IsEmpty()) 186 if (object.IsEmpty())
95 return false; 187 return false;
96 188
97 v8::HandleScope scope; 189 v8::HandleScope scope;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 v8::Context::Scope function_scope(v8_context_); 254 v8::Context::Scope function_scope(v8_context_);
163 255
164 v8::Local<v8::Value> function; 256 v8::Local<v8::Value> function;
165 if (!GetFindProxyForURL(&function)) { 257 if (!GetFindProxyForURL(&function)) {
166 js_bindings_->OnError( 258 js_bindings_->OnError(
167 -1, ASCIIToUTF16("FindProxyForURL() is undefined.")); 259 -1, ASCIIToUTF16("FindProxyForURL() is undefined."));
168 return ERR_PAC_SCRIPT_FAILED; 260 return ERR_PAC_SCRIPT_FAILED;
169 } 261 }
170 262
171 v8::Handle<v8::Value> argv[] = { 263 v8::Handle<v8::Value> argv[] = {
172 UTF8StdStringToV8String(query_url.spec()), 264 ASCIIStringToV8String(query_url.spec()),
173 UTF8StdStringToV8String(query_url.host()), 265 ASCIIStringToV8String(query_url.host()),
174 }; 266 };
175 267
176 v8::TryCatch try_catch; 268 v8::TryCatch try_catch;
177 v8::Local<v8::Value> ret = v8::Function::Cast(*function)->Call( 269 v8::Local<v8::Value> ret = v8::Function::Cast(*function)->Call(
178 v8_context_->Global(), arraysize(argv), argv); 270 v8_context_->Global(), arraysize(argv), argv);
179 271
180 if (try_catch.HasCaught()) { 272 if (try_catch.HasCaught()) {
181 HandleError(try_catch.Message()); 273 HandleError(try_catch.Message());
182 return ERR_PAC_SCRIPT_FAILED; 274 return ERR_PAC_SCRIPT_FAILED;
183 } 275 }
(...skipping 15 matching lines...) Expand all
199 ASCIIToUTF16("FindProxyForURL() returned a non-ASCII string " 291 ASCIIToUTF16("FindProxyForURL() returned a non-ASCII string "
200 "(crbug.com/47234): ") + ret_str; 292 "(crbug.com/47234): ") + ret_str;
201 js_bindings_->OnError(-1, error_message); 293 js_bindings_->OnError(-1, error_message);
202 return ERR_PAC_SCRIPT_FAILED; 294 return ERR_PAC_SCRIPT_FAILED;
203 } 295 }
204 296
205 results->UsePacString(UTF16ToASCII(ret_str)); 297 results->UsePacString(UTF16ToASCII(ret_str));
206 return OK; 298 return OK;
207 } 299 }
208 300
209 int InitV8(const std::string& pac_data_utf8) { 301 int InitV8(const string16& pac_script) {
210 v8::Locker locked; 302 v8::Locker locked;
211 v8::HandleScope scope; 303 v8::HandleScope scope;
212 304
213 v8_this_ = v8::Persistent<v8::External>::New(v8::External::New(this)); 305 v8_this_ = v8::Persistent<v8::External>::New(v8::External::New(this));
214 v8::Local<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New(); 306 v8::Local<v8::ObjectTemplate> global_template = v8::ObjectTemplate::New();
215 307
216 // Attach the javascript bindings. 308 // Attach the javascript bindings.
217 v8::Local<v8::FunctionTemplate> alert_template = 309 v8::Local<v8::FunctionTemplate> alert_template =
218 v8::FunctionTemplate::New(&AlertCallback, v8_this_); 310 v8::FunctionTemplate::New(&AlertCallback, v8_this_);
219 global_template->Set(v8::String::New("alert"), alert_template); 311 global_template->Set(ASCIILiteralToV8String("alert"), alert_template);
220 312
221 v8::Local<v8::FunctionTemplate> my_ip_address_template = 313 v8::Local<v8::FunctionTemplate> my_ip_address_template =
222 v8::FunctionTemplate::New(&MyIpAddressCallback, v8_this_); 314 v8::FunctionTemplate::New(&MyIpAddressCallback, v8_this_);
223 global_template->Set(v8::String::New("myIpAddress"), 315 global_template->Set(ASCIILiteralToV8String("myIpAddress"),
224 my_ip_address_template); 316 my_ip_address_template);
225 317
226 v8::Local<v8::FunctionTemplate> dns_resolve_template = 318 v8::Local<v8::FunctionTemplate> dns_resolve_template =
227 v8::FunctionTemplate::New(&DnsResolveCallback, v8_this_); 319 v8::FunctionTemplate::New(&DnsResolveCallback, v8_this_);
228 global_template->Set(v8::String::New("dnsResolve"), 320 global_template->Set(ASCIILiteralToV8String("dnsResolve"),
229 dns_resolve_template); 321 dns_resolve_template);
230 322
231 // Microsoft's PAC extensions (incomplete): 323 // Microsoft's PAC extensions (incomplete):
232 324
233 v8::Local<v8::FunctionTemplate> dns_resolve_ex_template = 325 v8::Local<v8::FunctionTemplate> dns_resolve_ex_template =
234 v8::FunctionTemplate::New(&DnsResolveExCallback, v8_this_); 326 v8::FunctionTemplate::New(&DnsResolveExCallback, v8_this_);
235 global_template->Set(v8::String::New("dnsResolveEx"), 327 global_template->Set(ASCIILiteralToV8String("dnsResolveEx"),
236 dns_resolve_ex_template); 328 dns_resolve_ex_template);
237 329
238 v8::Local<v8::FunctionTemplate> my_ip_address_ex_template = 330 v8::Local<v8::FunctionTemplate> my_ip_address_ex_template =
239 v8::FunctionTemplate::New(&MyIpAddressExCallback, v8_this_); 331 v8::FunctionTemplate::New(&MyIpAddressExCallback, v8_this_);
240 global_template->Set(v8::String::New("myIpAddressEx"), 332 global_template->Set(ASCIILiteralToV8String("myIpAddressEx"),
241 my_ip_address_ex_template); 333 my_ip_address_ex_template);
242 334
243 v8_context_ = v8::Context::New(NULL, global_template); 335 v8_context_ = v8::Context::New(NULL, global_template);
244 336
245 v8::Context::Scope ctx(v8_context_); 337 v8::Context::Scope ctx(v8_context_);
246 338
247 // Add the PAC utility functions to the environment. 339 // Add the PAC utility functions to the environment.
248 // (This script should never fail, as it is a string literal!) 340 // (This script should never fail, as it is a string literal!)
249 // Note that the two string literals are concatenated. 341 // Note that the two string literals are concatenated.
250 int rv = RunScript(PROXY_RESOLVER_SCRIPT 342 int rv = RunScript(
251 PROXY_RESOLVER_SCRIPT_EX, 343 ASCIILiteralToV8String(
252 kPacUtilityResourceName); 344 PROXY_RESOLVER_SCRIPT
345 PROXY_RESOLVER_SCRIPT_EX),
346 kPacUtilityResourceName);
253 if (rv != OK) { 347 if (rv != OK) {
254 NOTREACHED(); 348 NOTREACHED();
255 return rv; 349 return rv;
256 } 350 }
257 351
258 // Add the user's PAC code to the environment. 352 // Add the user's PAC code to the environment.
259 rv = RunScript(pac_data_utf8, kPacResourceName); 353 rv = RunScript(UTF16StringToV8String(pac_script), kPacResourceName);
260 if (rv != OK) 354 if (rv != OK)
261 return rv; 355 return rv;
262 356
263 // At a minimum, the FindProxyForURL() function must be defined for this 357 // At a minimum, the FindProxyForURL() function must be defined for this
264 // to be a legitimiate PAC script. 358 // to be a legitimiate PAC script.
265 v8::Local<v8::Value> function; 359 v8::Local<v8::Value> function;
266 if (!GetFindProxyForURL(&function)) 360 if (!GetFindProxyForURL(&function))
267 return ERR_PAC_SCRIPT_FAILED; 361 return ERR_PAC_SCRIPT_FAILED;
268 362
269 return OK; 363 return OK;
270 } 364 }
271 365
272 void SetCurrentRequestContext(ProxyResolverRequestContext* context) { 366 void SetCurrentRequestContext(ProxyResolverRequestContext* context) {
273 js_bindings_->set_current_request_context(context); 367 js_bindings_->set_current_request_context(context);
274 } 368 }
275 369
276 void PurgeMemory() { 370 void PurgeMemory() {
277 v8::Locker locked; 371 v8::Locker locked;
278 // Repeatedly call the V8 idle notification until it returns true ("nothing 372 // Repeatedly call the V8 idle notification until it returns true ("nothing
279 // more to free"). Note that it makes more sense to do this than to 373 // more to free"). Note that it makes more sense to do this than to
280 // implement a new "delete everything" pass because object references make 374 // implement a new "delete everything" pass because object references make
281 // it difficult to free everything possible in just one pass. 375 // it difficult to free everything possible in just one pass.
282 while (!v8::V8::IdleNotification()) 376 while (!v8::V8::IdleNotification())
283 ; 377 ;
284 } 378 }
285 379
286 private: 380 private:
287 bool GetFindProxyForURL(v8::Local<v8::Value>* function) { 381 bool GetFindProxyForURL(v8::Local<v8::Value>* function) {
288 *function = v8_context_->Global()->Get(v8::String::New("FindProxyForURL")); 382 *function = v8_context_->Global()->Get(
383 ASCIILiteralToV8String("FindProxyForURL"));
289 return (*function)->IsFunction(); 384 return (*function)->IsFunction();
290 } 385 }
291 386
292 // Handle an exception thrown by V8. 387 // Handle an exception thrown by V8.
293 void HandleError(v8::Handle<v8::Message> message) { 388 void HandleError(v8::Handle<v8::Message> message) {
294 if (message.IsEmpty()) 389 if (message.IsEmpty())
295 return; 390 return;
296 391
297 // Otherwise dispatch to the bindings. 392 // Otherwise dispatch to the bindings.
298 int line_number = message->GetLineNumber(); 393 int line_number = message->GetLineNumber();
299 string16 error_message; 394 string16 error_message;
300 V8ObjectToUTF16String(message->Get(), &error_message); 395 V8ObjectToUTF16String(message->Get(), &error_message);
301 js_bindings_->OnError(line_number, error_message); 396 js_bindings_->OnError(line_number, error_message);
302 } 397 }
303 398
304 // Compiles and runs |script_utf8| in the current V8 context. 399 // Compiles and runs |script| in the current V8 context.
305 // Returns OK on success, otherwise an error code. 400 // Returns OK on success, otherwise an error code.
306 int RunScript(const std::string& script_utf8, const char* script_name) { 401 int RunScript(v8::Handle<v8::String> script, const char* script_name) {
307 v8::TryCatch try_catch; 402 v8::TryCatch try_catch;
308 403
309 // Compile the script. 404 // Compile the script.
310 v8::Local<v8::String> text = UTF8StdStringToV8String(script_utf8); 405 v8::ScriptOrigin origin =
311 v8::ScriptOrigin origin = v8::ScriptOrigin(v8::String::New(script_name)); 406 v8::ScriptOrigin(ASCIILiteralToV8String(script_name));
312 v8::Local<v8::Script> code = v8::Script::Compile(text, &origin); 407 v8::Local<v8::Script> code = v8::Script::Compile(script, &origin);
313 408
314 // Execute. 409 // Execute.
315 if (!code.IsEmpty()) 410 if (!code.IsEmpty())
316 code->Run(); 411 code->Run();
317 412
318 // Check for errors. 413 // Check for errors.
319 if (try_catch.HasCaught()) { 414 if (try_catch.HasCaught()) {
320 HandleError(try_catch.Message()); 415 HandleError(try_catch.Message());
321 return ERR_PAC_SCRIPT_FAILED; 416 return ERR_PAC_SCRIPT_FAILED;
322 } 417 }
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 // we are. 458 // we are.
364 success = context->js_bindings_->MyIpAddress(&result); 459 success = context->js_bindings_->MyIpAddress(&result);
365 460
366 LogEventToCurrentRequest(context, 461 LogEventToCurrentRequest(context,
367 NetLog::PHASE_END, 462 NetLog::PHASE_END,
368 NetLog::TYPE_PROXY_RESOLVER_V8_MY_IP_ADDRESS, 463 NetLog::TYPE_PROXY_RESOLVER_V8_MY_IP_ADDRESS,
369 NULL); 464 NULL);
370 } 465 }
371 466
372 if (!success) 467 if (!success)
373 result = "127.0.0.1"; 468 return ASCIILiteralToV8String("127.0.0.1");
374 return UTF8StdStringToV8String(result); 469 return ASCIIStringToV8String(result);
375 } 470 }
376 471
377 // V8 callback for when "myIpAddressEx()" is invoked by the PAC script. 472 // V8 callback for when "myIpAddressEx()" is invoked by the PAC script.
378 static v8::Handle<v8::Value> MyIpAddressExCallback( 473 static v8::Handle<v8::Value> MyIpAddressExCallback(
379 const v8::Arguments& args) { 474 const v8::Arguments& args) {
380 Context* context = 475 Context* context =
381 static_cast<Context*>(v8::External::Cast(*args.Data())->Value()); 476 static_cast<Context*>(v8::External::Cast(*args.Data())->Value());
382 477
383 std::string ip_address_list; 478 std::string ip_address_list;
384 bool success; 479 bool success;
(...skipping 11 matching lines...) Expand all
396 success = context->js_bindings_->MyIpAddressEx(&ip_address_list); 491 success = context->js_bindings_->MyIpAddressEx(&ip_address_list);
397 492
398 LogEventToCurrentRequest(context, 493 LogEventToCurrentRequest(context,
399 NetLog::PHASE_END, 494 NetLog::PHASE_END,
400 NetLog::TYPE_PROXY_RESOLVER_V8_MY_IP_ADDRESS_EX, 495 NetLog::TYPE_PROXY_RESOLVER_V8_MY_IP_ADDRESS_EX,
401 NULL); 496 NULL);
402 } 497 }
403 498
404 if (!success) 499 if (!success)
405 ip_address_list = std::string(); 500 ip_address_list = std::string();
406 return UTF8StdStringToV8String(ip_address_list); 501 return ASCIIStringToV8String(ip_address_list);
407 } 502 }
408 503
409 // V8 callback for when "dnsResolve()" is invoked by the PAC script. 504 // V8 callback for when "dnsResolve()" is invoked by the PAC script.
410 static v8::Handle<v8::Value> DnsResolveCallback(const v8::Arguments& args) { 505 static v8::Handle<v8::Value> DnsResolveCallback(const v8::Arguments& args) {
411 Context* context = 506 Context* context =
412 static_cast<Context*>(v8::External::Cast(*args.Data())->Value()); 507 static_cast<Context*>(v8::External::Cast(*args.Data())->Value());
413 508
414 // We need at least one string argument. 509 // We need at least one string argument.
415 std::string hostname; 510 std::string hostname;
416 if (!GetHostnameArgument(args, &hostname)) 511 if (!GetHostnameArgument(args, &hostname))
(...skipping 11 matching lines...) Expand all
428 NULL); 523 NULL);
429 524
430 success = context->js_bindings_->DnsResolve(hostname, &ip_address); 525 success = context->js_bindings_->DnsResolve(hostname, &ip_address);
431 526
432 LogEventToCurrentRequest(context, 527 LogEventToCurrentRequest(context,
433 NetLog::PHASE_END, 528 NetLog::PHASE_END,
434 NetLog::TYPE_PROXY_RESOLVER_V8_DNS_RESOLVE, 529 NetLog::TYPE_PROXY_RESOLVER_V8_DNS_RESOLVE,
435 NULL); 530 NULL);
436 } 531 }
437 532
438 return success ? UTF8StdStringToV8String(ip_address) : v8::Null(); 533 return success ? ASCIIStringToV8String(ip_address) : v8::Null();
439 } 534 }
440 535
441 // V8 callback for when "dnsResolveEx()" is invoked by the PAC script. 536 // V8 callback for when "dnsResolveEx()" is invoked by the PAC script.
442 static v8::Handle<v8::Value> DnsResolveExCallback(const v8::Arguments& args) { 537 static v8::Handle<v8::Value> DnsResolveExCallback(const v8::Arguments& args) {
443 Context* context = 538 Context* context =
444 static_cast<Context*>(v8::External::Cast(*args.Data())->Value()); 539 static_cast<Context*>(v8::External::Cast(*args.Data())->Value());
445 540
446 // We need at least one string argument. 541 // We need at least one string argument.
447 std::string hostname; 542 std::string hostname;
448 if (!GetHostnameArgument(args, &hostname)) 543 if (!GetHostnameArgument(args, &hostname))
(...skipping 15 matching lines...) Expand all
464 559
465 LogEventToCurrentRequest(context, 560 LogEventToCurrentRequest(context,
466 NetLog::PHASE_END, 561 NetLog::PHASE_END,
467 NetLog::TYPE_PROXY_RESOLVER_V8_DNS_RESOLVE_EX, 562 NetLog::TYPE_PROXY_RESOLVER_V8_DNS_RESOLVE_EX,
468 NULL); 563 NULL);
469 } 564 }
470 565
471 if (!success) 566 if (!success)
472 ip_address_list = std::string(); 567 ip_address_list = std::string();
473 568
474 return UTF8StdStringToV8String(ip_address_list); 569 return ASCIIStringToV8String(ip_address_list);
475 } 570 }
476 571
477 static void LogEventToCurrentRequest(Context* context, 572 static void LogEventToCurrentRequest(Context* context,
478 NetLog::EventPhase phase, 573 NetLog::EventPhase phase,
479 NetLog::EventType type, 574 NetLog::EventType type,
480 NetLog::EventParameters* params) { 575 NetLog::EventParameters* params) {
481 if (context->js_bindings_->current_request_context()) { 576 if (context->js_bindings_->current_request_context()) {
482 context->js_bindings_->current_request_context()->net_log->AddEntry( 577 context->js_bindings_->current_request_context()->net_log->AddEntry(
483 type, phase, params); 578 type, phase, params);
484 } 579 }
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 void ProxyResolverV8::CancelRequest(RequestHandle request) { 628 void ProxyResolverV8::CancelRequest(RequestHandle request) {
534 // This is a synchronous ProxyResolver; no possibility for async requests. 629 // This is a synchronous ProxyResolver; no possibility for async requests.
535 NOTREACHED(); 630 NOTREACHED();
536 } 631 }
537 632
538 void ProxyResolverV8::PurgeMemory() { 633 void ProxyResolverV8::PurgeMemory() {
539 context_->PurgeMemory(); 634 context_->PurgeMemory();
540 } 635 }
541 636
542 int ProxyResolverV8::SetPacScript(const GURL& /*url*/, 637 int ProxyResolverV8::SetPacScript(const GURL& /*url*/,
543 const std::string& bytes_utf8, 638 const string16& pac_script,
544 CompletionCallback* /*callback*/) { 639 CompletionCallback* /*callback*/) {
545 context_.reset(); 640 context_.reset();
546 if (bytes_utf8.empty()) 641 if (pac_script.empty())
547 return ERR_PAC_SCRIPT_FAILED; 642 return ERR_PAC_SCRIPT_FAILED;
548 643
549 // Try parsing the PAC script. 644 // Try parsing the PAC script.
550 scoped_ptr<Context> context(new Context(js_bindings_.get())); 645 scoped_ptr<Context> context(new Context(js_bindings_.get()));
551 int rv = context->InitV8(bytes_utf8); 646 int rv = context->InitV8(pac_script);
552 if (rv == OK) 647 if (rv == OK)
553 context_.reset(context.release()); 648 context_.reset(context.release());
554 return rv; 649 return rv;
555 } 650 }
556 651
557 } // namespace net 652 } // namespace net
OLDNEW
« no previous file with comments | « net/proxy/proxy_resolver_v8.h ('k') | net/proxy/proxy_resolver_v8_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698