OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <algorithm> | 7 #include <algorithm> |
8 #include <cstdio> | 8 #include <cstdio> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 | 189 |
190 // Stringizes a V8 object by calling its toString() method. Returns true | 190 // Stringizes a V8 object by calling its toString() method. Returns true |
191 // on success. This may fail if the toString() throws an exception. | 191 // on success. This may fail if the toString() throws an exception. |
192 bool V8ObjectToUTF16String(v8::Local<v8::Value> object, | 192 bool V8ObjectToUTF16String(v8::Local<v8::Value> object, |
193 base::string16* utf16_result, | 193 base::string16* utf16_result, |
194 v8::Isolate* isolate) { | 194 v8::Isolate* isolate) { |
195 if (object.IsEmpty()) | 195 if (object.IsEmpty()) |
196 return false; | 196 return false; |
197 | 197 |
198 v8::HandleScope scope(isolate); | 198 v8::HandleScope scope(isolate); |
199 v8::Local<v8::String> str_object = object->ToString(); | 199 v8::Local<v8::String> str_object = object->ToString(isolate); |
200 if (str_object.IsEmpty()) | 200 if (str_object.IsEmpty()) |
201 return false; | 201 return false; |
202 *utf16_result = V8StringToUTF16(str_object); | 202 *utf16_result = V8StringToUTF16(str_object); |
203 return true; | 203 return true; |
204 } | 204 } |
205 | 205 |
206 // Extracts an hostname argument from |args|. On success returns true | 206 // Extracts an hostname argument from |args|. On success returns true |
207 // and fills |*hostname| with the result. | 207 // and fills |*hostname| with the result. |
208 bool GetHostnameArgument(const v8::FunctionCallbackInfo<v8::Value>& args, | 208 bool GetHostnameArgument(const v8::FunctionCallbackInfo<v8::Value>& args, |
209 std::string* hostname) { | 209 std::string* hostname) { |
210 // The first argument should be a string. | 210 // The first argument should be a string. |
211 if (args.Length() == 0 || args[0].IsEmpty() || !args[0]->IsString()) | 211 if (args.Length() == 0 || args[0].IsEmpty() || !args[0]->IsString()) |
212 return false; | 212 return false; |
213 | 213 |
214 const base::string16 hostname_utf16 = V8StringToUTF16(args[0]->ToString()); | 214 const base::string16 hostname_utf16 = |
| 215 V8StringToUTF16(v8::Local<v8::String>::Cast(args[0])); |
215 | 216 |
216 // If the hostname is already in ASCII, simply return it as is. | 217 // If the hostname is already in ASCII, simply return it as is. |
217 if (base::IsStringASCII(hostname_utf16)) { | 218 if (base::IsStringASCII(hostname_utf16)) { |
218 *hostname = base::UTF16ToASCII(hostname_utf16); | 219 *hostname = base::UTF16ToASCII(hostname_utf16); |
219 return true; | 220 return true; |
220 } | 221 } |
221 | 222 |
222 // Otherwise try to convert it from IDN to punycode. | 223 // Otherwise try to convert it from IDN to punycode. |
223 const int kInitialBufferSize = 256; | 224 const int kInitialBufferSize = 256; |
224 url::RawCanonOutputT<base::char16, kInitialBufferSize> punycode_output; | 225 url::RawCanonOutputT<base::char16, kInitialBufferSize> punycode_output; |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 HandleError(try_catch.Message()); | 387 HandleError(try_catch.Message()); |
387 return ERR_PAC_SCRIPT_FAILED; | 388 return ERR_PAC_SCRIPT_FAILED; |
388 } | 389 } |
389 | 390 |
390 if (!ret->IsString()) { | 391 if (!ret->IsString()) { |
391 js_bindings()->OnError( | 392 js_bindings()->OnError( |
392 -1, base::ASCIIToUTF16("FindProxyForURL() did not return a string.")); | 393 -1, base::ASCIIToUTF16("FindProxyForURL() did not return a string.")); |
393 return ERR_PAC_SCRIPT_FAILED; | 394 return ERR_PAC_SCRIPT_FAILED; |
394 } | 395 } |
395 | 396 |
396 base::string16 ret_str = V8StringToUTF16(ret->ToString()); | 397 base::string16 ret_str = V8StringToUTF16(v8::Local<v8::String>::Cast(ret)); |
397 | 398 |
398 if (!base::IsStringASCII(ret_str)) { | 399 if (!base::IsStringASCII(ret_str)) { |
399 // TODO(eroman): Rather than failing when a wide string is returned, we | 400 // TODO(eroman): Rather than failing when a wide string is returned, we |
400 // could extend the parsing to handle IDNA hostnames by | 401 // could extend the parsing to handle IDNA hostnames by |
401 // converting them to ASCII punycode. | 402 // converting them to ASCII punycode. |
402 // crbug.com/47234 | 403 // crbug.com/47234 |
403 base::string16 error_message = | 404 base::string16 error_message = |
404 base::ASCIIToUTF16("FindProxyForURL() returned a non-ASCII string " | 405 base::ASCIIToUTF16("FindProxyForURL() returned a non-ASCII string " |
405 "(crbug.com/47234): ") + ret_str; | 406 "(crbug.com/47234): ") + ret_str; |
406 js_bindings()->OnError(-1, error_message); | 407 js_bindings()->OnError(-1, error_message); |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
649 | 650 |
650 // V8 callback for when "sortIpAddressList()" is invoked by the PAC script. | 651 // V8 callback for when "sortIpAddressList()" is invoked by the PAC script. |
651 static void SortIpAddressListCallback( | 652 static void SortIpAddressListCallback( |
652 const v8::FunctionCallbackInfo<v8::Value>& args) { | 653 const v8::FunctionCallbackInfo<v8::Value>& args) { |
653 // We need at least one string argument. | 654 // We need at least one string argument. |
654 if (args.Length() == 0 || args[0].IsEmpty() || !args[0]->IsString()) { | 655 if (args.Length() == 0 || args[0].IsEmpty() || !args[0]->IsString()) { |
655 args.GetReturnValue().SetNull(); | 656 args.GetReturnValue().SetNull(); |
656 return; | 657 return; |
657 } | 658 } |
658 | 659 |
659 std::string ip_address_list = V8StringToUTF8(args[0]->ToString()); | 660 std::string ip_address_list = |
| 661 V8StringToUTF8(v8::Local<v8::String>::Cast(args[0])); |
660 if (!base::IsStringASCII(ip_address_list)) { | 662 if (!base::IsStringASCII(ip_address_list)) { |
661 args.GetReturnValue().SetNull(); | 663 args.GetReturnValue().SetNull(); |
662 return; | 664 return; |
663 } | 665 } |
664 std::string sorted_ip_address_list; | 666 std::string sorted_ip_address_list; |
665 bool success = SortIpAddressList(ip_address_list, &sorted_ip_address_list); | 667 bool success = SortIpAddressList(ip_address_list, &sorted_ip_address_list); |
666 if (!success) { | 668 if (!success) { |
667 args.GetReturnValue().Set(false); | 669 args.GetReturnValue().Set(false); |
668 return; | 670 return; |
669 } | 671 } |
670 args.GetReturnValue().Set( | 672 args.GetReturnValue().Set( |
671 ASCIIStringToV8String(args.GetIsolate(), sorted_ip_address_list)); | 673 ASCIIStringToV8String(args.GetIsolate(), sorted_ip_address_list)); |
672 } | 674 } |
673 | 675 |
674 // V8 callback for when "isInNetEx()" is invoked by the PAC script. | 676 // V8 callback for when "isInNetEx()" is invoked by the PAC script. |
675 static void IsInNetExCallback( | 677 static void IsInNetExCallback( |
676 const v8::FunctionCallbackInfo<v8::Value>& args) { | 678 const v8::FunctionCallbackInfo<v8::Value>& args) { |
677 // We need at least 2 string arguments. | 679 // We need at least 2 string arguments. |
678 if (args.Length() < 2 || args[0].IsEmpty() || !args[0]->IsString() || | 680 if (args.Length() < 2 || args[0].IsEmpty() || !args[0]->IsString() || |
679 args[1].IsEmpty() || !args[1]->IsString()) { | 681 args[1].IsEmpty() || !args[1]->IsString()) { |
680 args.GetReturnValue().SetNull(); | 682 args.GetReturnValue().SetNull(); |
681 return; | 683 return; |
682 } | 684 } |
683 | 685 |
684 std::string ip_address = V8StringToUTF8(args[0]->ToString()); | 686 std::string ip_address = |
| 687 V8StringToUTF8(v8::Local<v8::String>::Cast(args[0])); |
685 if (!base::IsStringASCII(ip_address)) { | 688 if (!base::IsStringASCII(ip_address)) { |
686 args.GetReturnValue().Set(false); | 689 args.GetReturnValue().Set(false); |
687 return; | 690 return; |
688 } | 691 } |
689 std::string ip_prefix = V8StringToUTF8(args[1]->ToString()); | 692 std::string ip_prefix = |
| 693 V8StringToUTF8(v8::Local<v8::String>::Cast(args[1])); |
690 if (!base::IsStringASCII(ip_prefix)) { | 694 if (!base::IsStringASCII(ip_prefix)) { |
691 args.GetReturnValue().Set(false); | 695 args.GetReturnValue().Set(false); |
692 return; | 696 return; |
693 } | 697 } |
694 args.GetReturnValue().Set(IsInNetEx(ip_address, ip_prefix)); | 698 args.GetReturnValue().Set(IsInNetEx(ip_address, ip_prefix)); |
695 } | 699 } |
696 | 700 |
697 mutable base::Lock lock_; | 701 mutable base::Lock lock_; |
698 ProxyResolverV8* parent_; | 702 ProxyResolverV8* parent_; |
699 v8::Isolate* isolate_; | 703 v8::Isolate* isolate_; |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
797 return 0; | 801 return 0; |
798 | 802 |
799 v8::Locker locked(g_proxy_resolver_isolate_->isolate()); | 803 v8::Locker locked(g_proxy_resolver_isolate_->isolate()); |
800 v8::Isolate::Scope isolate_scope(g_proxy_resolver_isolate_->isolate()); | 804 v8::Isolate::Scope isolate_scope(g_proxy_resolver_isolate_->isolate()); |
801 v8::HeapStatistics heap_statistics; | 805 v8::HeapStatistics heap_statistics; |
802 g_proxy_resolver_isolate_->isolate()->GetHeapStatistics(&heap_statistics); | 806 g_proxy_resolver_isolate_->isolate()->GetHeapStatistics(&heap_statistics); |
803 return heap_statistics.used_heap_size(); | 807 return heap_statistics.used_heap_size(); |
804 } | 808 } |
805 | 809 |
806 } // namespace net | 810 } // namespace net |
OLD | NEW |