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 // This file contains an implementation of the ResourceLoaderBridge class. | 5 // This file contains an implementation of the ResourceLoaderBridge class. |
6 // The class is implemented using net::URLRequest, meaning it is a "simple" | 6 // The class is implemented using net::URLRequest, meaning it is a "simple" |
7 // version that directly issues requests. The more complicated one used in the | 7 // version that directly issues requests. The more complicated one used in the |
8 // browser uses IPC. | 8 // browser uses IPC. |
9 // | 9 // |
10 // Because net::URLRequest only provides an asynchronous resource loading API, | 10 // Because net::URLRequest only provides an asynchronous resource loading API, |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 }; | 102 }; |
103 | 103 |
104 //----------------------------------------------------------------------------- | 104 //----------------------------------------------------------------------------- |
105 | 105 |
106 bool g_accept_all_cookies = false; | 106 bool g_accept_all_cookies = false; |
107 | 107 |
108 class TestShellNetworkDelegate : public net::NetworkDelegate { | 108 class TestShellNetworkDelegate : public net::NetworkDelegate { |
109 public: | 109 public: |
110 virtual ~TestShellNetworkDelegate() {} | 110 virtual ~TestShellNetworkDelegate() {} |
111 | 111 |
112 private: | 112 protected: |
113 // net::NetworkDelegate implementation. | 113 // net::NetworkDelegate implementation. |
114 virtual int OnBeforeURLRequest(net::URLRequest* request, | 114 virtual int OnBeforeURLRequest(net::URLRequest* request, |
115 const net::CompletionCallback& callback, | 115 const net::CompletionCallback& callback, |
116 GURL* new_url) OVERRIDE { | 116 GURL* new_url) OVERRIDE { |
117 return net::OK; | 117 return net::OK; |
118 } | 118 } |
119 virtual int OnBeforeSendHeaders(net::URLRequest* request, | 119 virtual int OnBeforeSendHeaders(net::URLRequest* request, |
120 const net::CompletionCallback& callback, | 120 const net::CompletionCallback& callback, |
121 net::HttpRequestHeaders* headers) OVERRIDE { | 121 net::HttpRequestHeaders* headers) OVERRIDE { |
122 return net::OK; | 122 return net::OK; |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
188 std::string file_path_template; | 188 std::string file_path_template; |
189 GURL http_prefix; | 189 GURL http_prefix; |
190 }; | 190 }; |
191 | 191 |
192 FileOverHTTPParams* g_file_over_http_params = NULL; | 192 FileOverHTTPParams* g_file_over_http_params = NULL; |
193 | 193 |
194 //----------------------------------------------------------------------------- | 194 //----------------------------------------------------------------------------- |
195 | 195 |
196 class IOThread : public base::Thread { | 196 class IOThread : public base::Thread { |
197 public: | 197 public: |
198 IOThread() : base::Thread("IOThread") { | 198 IOThread() : base::Thread("IOThread") {} |
199 } | |
200 | 199 |
201 ~IOThread() { | 200 ~IOThread() { |
202 Stop(); | 201 Stop(); |
203 } | 202 } |
204 | 203 |
205 virtual void Init() { | 204 virtual void Init() OVERRIDE { |
206 if (g_request_context_params) { | 205 if (g_request_context_params) { |
207 g_request_context = new TestShellRequestContext( | 206 g_request_context = new TestShellRequestContext( |
208 g_request_context_params->cache_path, | 207 g_request_context_params->cache_path, |
209 g_request_context_params->cache_mode, | 208 g_request_context_params->cache_mode, |
210 g_request_context_params->no_proxy); | 209 g_request_context_params->no_proxy); |
211 delete g_request_context_params; | 210 delete g_request_context_params; |
212 g_request_context_params = NULL; | 211 g_request_context_params = NULL; |
213 } else { | 212 } else { |
214 g_request_context = new TestShellRequestContext(); | 213 g_request_context = new TestShellRequestContext(); |
215 } | 214 } |
216 | 215 |
217 g_request_context->AddRef(); | 216 g_request_context->AddRef(); |
218 | 217 |
219 g_network_delegate = new TestShellNetworkDelegate(); | 218 g_network_delegate = new TestShellNetworkDelegate(); |
220 g_request_context->set_network_delegate(g_network_delegate); | 219 g_request_context->set_network_delegate(g_network_delegate); |
221 | 220 |
222 SimpleAppCacheSystem::InitializeOnIOThread(g_request_context); | 221 SimpleAppCacheSystem::InitializeOnIOThread(g_request_context); |
223 SimpleSocketStreamBridge::InitializeOnIOThread(g_request_context); | 222 SimpleSocketStreamBridge::InitializeOnIOThread(g_request_context); |
224 SimpleFileWriter::InitializeOnIOThread(g_request_context); | 223 SimpleFileWriter::InitializeOnIOThread(g_request_context); |
225 SimpleFileSystem::InitializeOnIOThread( | 224 SimpleFileSystem::InitializeOnIOThread( |
226 g_request_context->blob_storage_controller()); | 225 g_request_context->blob_storage_controller()); |
227 TestShellWebBlobRegistryImpl::InitializeOnIOThread( | 226 TestShellWebBlobRegistryImpl::InitializeOnIOThread( |
228 g_request_context->blob_storage_controller()); | 227 g_request_context->blob_storage_controller()); |
229 } | 228 } |
230 | 229 |
231 virtual void CleanUp() { | 230 virtual void CleanUp() OVERRIDE { |
232 // In reverse order of initialization. | 231 // In reverse order of initialization. |
233 TestShellWebBlobRegistryImpl::Cleanup(); | 232 TestShellWebBlobRegistryImpl::Cleanup(); |
234 SimpleFileSystem::CleanupOnIOThread(); | 233 SimpleFileSystem::CleanupOnIOThread(); |
235 SimpleFileWriter::CleanupOnIOThread(); | 234 SimpleFileWriter::CleanupOnIOThread(); |
236 SimpleSocketStreamBridge::Cleanup(); | 235 SimpleSocketStreamBridge::Cleanup(); |
237 SimpleAppCacheSystem::CleanupOnIOThread(); | 236 SimpleAppCacheSystem::CleanupOnIOThread(); |
238 | 237 |
239 if (g_request_context) { | 238 if (g_request_context) { |
240 g_request_context->set_network_delegate(NULL); | 239 g_request_context->set_network_delegate(NULL); |
241 g_request_context->Release(); | 240 g_request_context->Release(); |
(...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
772 public: | 771 public: |
773 explicit SyncRequestProxy(ResourceLoaderBridge::SyncLoadResponse* result) | 772 explicit SyncRequestProxy(ResourceLoaderBridge::SyncLoadResponse* result) |
774 : result_(result), event_(true, false) { | 773 : result_(result), event_(true, false) { |
775 } | 774 } |
776 | 775 |
777 void WaitForCompletion() { | 776 void WaitForCompletion() { |
778 event_.Wait(); | 777 event_.Wait(); |
779 } | 778 } |
780 | 779 |
781 // -------------------------------------------------------------------------- | 780 // -------------------------------------------------------------------------- |
782 // Event hooks that run on the IO thread: | 781 // RequestProxy event hooks that run on the IO thread: |
783 | 782 |
784 virtual void OnReceivedRedirect( | 783 virtual void OnReceivedRedirect( |
785 const GURL& new_url, | 784 const GURL& new_url, |
786 const ResourceResponseInfo& info, | 785 const ResourceResponseInfo& info, |
787 bool* defer_redirect) { | 786 bool* defer_redirect) OVERRIDE { |
788 // TODO(darin): It would be much better if this could live in WebCore, but | 787 // TODO(darin): It would be much better if this could live in WebCore, but |
789 // doing so requires API changes at all levels. Similar code exists in | 788 // doing so requires API changes at all levels. Similar code exists in |
790 // WebCore/platform/network/cf/ResourceHandleCFNet.cpp :-( | 789 // WebCore/platform/network/cf/ResourceHandleCFNet.cpp :-( |
791 if (new_url.GetOrigin() != result_->url.GetOrigin()) { | 790 if (new_url.GetOrigin() != result_->url.GetOrigin()) { |
792 DLOG(WARNING) << "Cross origin redirect denied"; | 791 DLOG(WARNING) << "Cross origin redirect denied"; |
793 Cancel(); | 792 Cancel(); |
794 return; | 793 return; |
795 } | 794 } |
796 result_->url = new_url; | 795 result_->url = new_url; |
797 } | 796 } |
798 | 797 |
799 virtual void OnReceivedResponse(const ResourceResponseInfo& info) { | 798 virtual void OnReceivedResponse(const ResourceResponseInfo& info) OVERRIDE { |
800 *static_cast<ResourceResponseInfo*>(result_) = info; | 799 *static_cast<ResourceResponseInfo*>(result_) = info; |
801 } | 800 } |
802 | 801 |
803 virtual void OnReceivedData(int bytes_read) { | 802 virtual void OnReceivedData(int bytes_read) OVERRIDE { |
804 if (download_to_file_) | 803 if (download_to_file_) |
805 file_stream_.WriteSync(buf_->data(), bytes_read); | 804 file_stream_.WriteSync(buf_->data(), bytes_read); |
806 else | 805 else |
807 result_->data.append(buf_->data(), bytes_read); | 806 result_->data.append(buf_->data(), bytes_read); |
808 AsyncReadData(); // read more (may recurse) | 807 AsyncReadData(); // read more (may recurse) |
809 } | 808 } |
810 | 809 |
811 virtual void OnCompletedRequest(const net::URLRequestStatus& status, | 810 virtual void OnCompletedRequest( |
812 const std::string& security_info, | 811 const net::URLRequestStatus& status, |
813 const base::TimeTicks& complete_time) { | 812 const std::string& security_info, |
| 813 const base::TimeTicks& complete_time) OVERRIDE { |
814 if (download_to_file_) | 814 if (download_to_file_) |
815 file_stream_.CloseSync(); | 815 file_stream_.CloseSync(); |
816 result_->status = status; | 816 result_->status = status; |
817 event_.Signal(); | 817 event_.Signal(); |
818 } | 818 } |
819 | 819 |
| 820 protected: |
| 821 virtual ~SyncRequestProxy() {} |
| 822 |
820 private: | 823 private: |
821 ResourceLoaderBridge::SyncLoadResponse* result_; | 824 ResourceLoaderBridge::SyncLoadResponse* result_; |
822 base::WaitableEvent event_; | 825 base::WaitableEvent event_; |
823 }; | 826 }; |
824 | 827 |
825 //----------------------------------------------------------------------------- | 828 //----------------------------------------------------------------------------- |
826 | 829 |
827 class ResourceLoaderBridgeImpl : public ResourceLoaderBridge { | 830 class ResourceLoaderBridgeImpl : public ResourceLoaderBridge { |
828 public: | 831 public: |
829 ResourceLoaderBridgeImpl( | 832 ResourceLoaderBridgeImpl( |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
942 public: | 945 public: |
943 void Set(const GURL& url, const std::string& cookie) { | 946 void Set(const GURL& url, const std::string& cookie) { |
944 DCHECK(MessageLoop::current() == g_io_thread->message_loop()); | 947 DCHECK(MessageLoop::current() == g_io_thread->message_loop()); |
945 g_request_context->cookie_store()->SetCookieWithOptionsAsync( | 948 g_request_context->cookie_store()->SetCookieWithOptionsAsync( |
946 url, cookie, net::CookieOptions(), | 949 url, cookie, net::CookieOptions(), |
947 net::CookieStore::SetCookiesCallback()); | 950 net::CookieStore::SetCookiesCallback()); |
948 } | 951 } |
949 | 952 |
950 private: | 953 private: |
951 friend class base::RefCountedThreadSafe<CookieSetter>; | 954 friend class base::RefCountedThreadSafe<CookieSetter>; |
952 | |
953 ~CookieSetter() {} | 955 ~CookieSetter() {} |
954 }; | 956 }; |
955 | 957 |
956 class CookieGetter : public base::RefCountedThreadSafe<CookieGetter> { | 958 class CookieGetter : public base::RefCountedThreadSafe<CookieGetter> { |
957 public: | 959 public: |
958 CookieGetter() : event_(false, false) { | 960 CookieGetter() : event_(false, false) { |
959 } | 961 } |
960 | 962 |
961 void Get(const GURL& url) { | 963 void Get(const GURL& url) { |
962 g_request_context->cookie_store()->GetCookiesWithOptionsAsync( | 964 g_request_context->cookie_store()->GetCookiesWithOptionsAsync( |
963 url, net::CookieOptions(), | 965 url, net::CookieOptions(), |
964 base::Bind(&CookieGetter::OnGetCookies, this)); | 966 base::Bind(&CookieGetter::OnGetCookies, this)); |
965 } | 967 } |
966 | 968 |
967 std::string GetResult() { | 969 std::string GetResult() { |
968 event_.Wait(); | 970 event_.Wait(); |
969 return result_; | 971 return result_; |
970 } | 972 } |
971 | 973 |
972 private: | 974 private: |
| 975 friend class base::RefCountedThreadSafe<CookieGetter>; |
| 976 ~CookieGetter() {} |
| 977 |
973 void OnGetCookies(const std::string& cookie_line) { | 978 void OnGetCookies(const std::string& cookie_line) { |
974 result_ = cookie_line; | 979 result_ = cookie_line; |
975 event_.Signal(); | 980 event_.Signal(); |
976 } | 981 } |
977 friend class base::RefCountedThreadSafe<CookieGetter>; | |
978 | |
979 ~CookieGetter() {} | |
980 | 982 |
981 base::WaitableEvent event_; | 983 base::WaitableEvent event_; |
982 std::string result_; | 984 std::string result_; |
983 }; | 985 }; |
984 | 986 |
985 } // anonymous namespace | 987 } // anonymous namespace |
986 | 988 |
987 //----------------------------------------------------------------------------- | 989 //----------------------------------------------------------------------------- |
988 | 990 |
989 // static | 991 // static |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1115 (http_prefix.SchemeIs("http") || http_prefix.SchemeIs("https"))); | 1117 (http_prefix.SchemeIs("http") || http_prefix.SchemeIs("https"))); |
1116 g_file_over_http_params = new FileOverHTTPParams(file_path_template, | 1118 g_file_over_http_params = new FileOverHTTPParams(file_path_template, |
1117 http_prefix); | 1119 http_prefix); |
1118 } | 1120 } |
1119 | 1121 |
1120 // static | 1122 // static |
1121 webkit_glue::ResourceLoaderBridge* SimpleResourceLoaderBridge::Create( | 1123 webkit_glue::ResourceLoaderBridge* SimpleResourceLoaderBridge::Create( |
1122 const webkit_glue::ResourceLoaderBridge::RequestInfo& request_info) { | 1124 const webkit_glue::ResourceLoaderBridge::RequestInfo& request_info) { |
1123 return new ResourceLoaderBridgeImpl(request_info); | 1125 return new ResourceLoaderBridgeImpl(request_info); |
1124 } | 1126 } |
OLD | NEW |