OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "chrome/browser/plugin_process_host.h" | 5 #include "chrome/browser/plugin_process_host.h" |
6 | 6 |
7 #include <windows.h> | 7 #include <windows.h> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 18 matching lines...) Expand all Loading... |
29 #include "chrome/common/chrome_switches.h" | 29 #include "chrome/common/chrome_switches.h" |
30 #include "chrome/common/debug_flags.h" | 30 #include "chrome/common/debug_flags.h" |
31 #include "chrome/common/ipc_logging.h" | 31 #include "chrome/common/ipc_logging.h" |
32 #include "chrome/common/logging_chrome.h" | 32 #include "chrome/common/logging_chrome.h" |
33 #include "chrome/common/notification_service.h" | 33 #include "chrome/common/notification_service.h" |
34 #include "chrome/common/plugin_messages.h" | 34 #include "chrome/common/plugin_messages.h" |
35 #include "chrome/common/process_watcher.h" | 35 #include "chrome/common/process_watcher.h" |
36 #include "chrome/common/render_messages.h" | 36 #include "chrome/common/render_messages.h" |
37 #include "chrome/common/win_util.h" | 37 #include "chrome/common/win_util.h" |
38 #include "net/base/cookie_monster.h" | 38 #include "net/base/cookie_monster.h" |
| 39 #include "net/base/io_buffer.h" |
39 #include "net/proxy/proxy_service.h" | 40 #include "net/proxy/proxy_service.h" |
40 #include "net/url_request/url_request.h" | 41 #include "net/url_request/url_request.h" |
41 #include "sandbox/src/sandbox.h" | 42 #include "sandbox/src/sandbox.h" |
42 #include "webkit/glue/plugins/plugin_constants_win.h" | 43 #include "webkit/glue/plugins/plugin_constants_win.h" |
43 | 44 |
44 static const char kDefaultPluginFinderURL[] = | 45 static const char kDefaultPluginFinderURL[] = |
45 "http://dl.google.com/chrome/plugins/plugins2.xml"; | 46 "http://dl.google.com/chrome/plugins/plugins2.xml"; |
46 | 47 |
47 // The NotificationTask is used to notify about plugin process connection/ | 48 // The NotificationTask is used to notify about plugin process connection/ |
48 // disconnection. It is needed because the notifications in the | 49 // disconnection. It is needed because the notifications in the |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 protected: | 121 protected: |
121 void DownloadCompletedHelper(bool success); | 122 void DownloadCompletedHelper(bool success); |
122 | 123 |
123 // The download file request initiated by the plugin. | 124 // The download file request initiated by the plugin. |
124 URLRequest* download_file_request_; | 125 URLRequest* download_file_request_; |
125 // Handle to the downloaded file. | 126 // Handle to the downloaded file. |
126 HANDLE download_file_; | 127 HANDLE download_file_; |
127 // The full path of the downloaded file. | 128 // The full path of the downloaded file. |
128 std::wstring download_file_path_; | 129 std::wstring download_file_path_; |
129 // The buffer passed off to URLRequest::Read. | 130 // The buffer passed off to URLRequest::Read. |
130 char download_file_buffer_[kDownloadFileBufferSize]; | 131 scoped_refptr<net::IOBuffer> download_file_buffer_; |
131 // The window handle for sending the WM_COPYDATA notification, | 132 // The window handle for sending the WM_COPYDATA notification, |
132 // indicating that the download completed. | 133 // indicating that the download completed. |
133 HWND download_file_caller_window_; | 134 HWND download_file_caller_window_; |
134 | 135 |
135 std::string download_url_; | 136 std::string download_url_; |
136 int download_source_pid_; | 137 int download_source_pid_; |
137 | 138 |
138 DISALLOW_EVIL_CONSTRUCTORS(PluginDownloadUrlHelper); | 139 DISALLOW_EVIL_CONSTRUCTORS(PluginDownloadUrlHelper); |
139 }; | 140 }; |
140 | 141 |
141 PluginDownloadUrlHelper::PluginDownloadUrlHelper( | 142 PluginDownloadUrlHelper::PluginDownloadUrlHelper( |
142 const std::string& download_url, | 143 const std::string& download_url, |
143 int source_pid, HWND caller_window) | 144 int source_pid, HWND caller_window) |
144 : download_url_(download_url), | 145 : download_url_(download_url), |
| 146 download_file_request_(NULL), |
| 147 download_file_(INVALID_HANDLE_VALUE), |
| 148 download_file_buffer_(new net::IOBuffer(kDownloadFileBufferSize)), |
145 download_file_caller_window_(caller_window), | 149 download_file_caller_window_(caller_window), |
146 download_source_pid_(source_pid), | 150 download_source_pid_(source_pid) { |
147 download_file_request_(NULL), | |
148 download_file_(INVALID_HANDLE_VALUE) { | |
149 DCHECK(::IsWindow(caller_window)); | 151 DCHECK(::IsWindow(caller_window)); |
150 memset(download_file_buffer_, 0, arraysize(download_file_buffer_)); | 152 memset(download_file_buffer_->data(), 0, kDownloadFileBufferSize); |
151 } | 153 } |
152 | 154 |
153 PluginDownloadUrlHelper::~PluginDownloadUrlHelper() { | 155 PluginDownloadUrlHelper::~PluginDownloadUrlHelper() { |
154 if (download_file_request_) { | 156 if (download_file_request_) { |
155 delete download_file_request_; | 157 delete download_file_request_; |
156 download_file_request_ = NULL; | 158 download_file_request_ = NULL; |
157 } | 159 } |
158 | 160 |
159 if (download_file_ != INVALID_HANDLE_VALUE) { | 161 if (download_file_ != INVALID_HANDLE_VALUE) { |
160 ::CloseHandle(INVALID_HANDLE_VALUE); | 162 ::CloseHandle(INVALID_HANDLE_VALUE); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 NOTREACHED(); | 205 NOTREACHED(); |
204 OnDownloadCompleted(request); | 206 OnDownloadCompleted(request); |
205 return; | 207 return; |
206 } | 208 } |
207 } | 209 } |
208 if (!request->status().is_success()) { | 210 if (!request->status().is_success()) { |
209 OnDownloadCompleted(request); | 211 OnDownloadCompleted(request); |
210 } else { | 212 } else { |
211 // Initiate a read. | 213 // Initiate a read. |
212 int bytes_read = 0; | 214 int bytes_read = 0; |
213 if (!request->Read(download_file_buffer_, arraysize(download_file_buffer_), | 215 if (!request->Read(download_file_buffer_, kDownloadFileBufferSize, |
214 &bytes_read)) { | 216 &bytes_read)) { |
215 // If the error is not an IO pending, then we're done | 217 // If the error is not an IO pending, then we're done |
216 // reading. | 218 // reading. |
217 if (!request->status().is_io_pending()) { | 219 if (!request->status().is_io_pending()) { |
218 OnDownloadCompleted(request); | 220 OnDownloadCompleted(request); |
219 } | 221 } |
220 } else if (bytes_read == 0) { | 222 } else if (bytes_read == 0) { |
221 OnDownloadCompleted(request); | 223 OnDownloadCompleted(request); |
222 } else { | 224 } else { |
223 OnReadCompleted(request, bytes_read); | 225 OnReadCompleted(request, bytes_read); |
224 } | 226 } |
225 } | 227 } |
226 } | 228 } |
227 | 229 |
228 void PluginDownloadUrlHelper::OnReadCompleted(URLRequest* request, | 230 void PluginDownloadUrlHelper::OnReadCompleted(URLRequest* request, |
229 int bytes_read) { | 231 int bytes_read) { |
230 DCHECK(download_file_ != INVALID_HANDLE_VALUE); | 232 DCHECK(download_file_ != INVALID_HANDLE_VALUE); |
231 | 233 |
232 if (bytes_read == 0) { | 234 if (bytes_read == 0) { |
233 OnDownloadCompleted(request); | 235 OnDownloadCompleted(request); |
234 return; | 236 return; |
235 } | 237 } |
236 | 238 |
237 int request_bytes_read = bytes_read; | 239 int request_bytes_read = bytes_read; |
238 | 240 |
239 while (request->status().is_success()) { | 241 while (request->status().is_success()) { |
240 unsigned long bytes_written = 0; | 242 unsigned long bytes_written = 0; |
241 BOOL write_result = WriteFile(download_file_, download_file_buffer_, | 243 BOOL write_result = WriteFile(download_file_, |
| 244 download_file_buffer_->data(), |
242 request_bytes_read, &bytes_written, NULL); | 245 request_bytes_read, &bytes_written, NULL); |
243 DCHECK(!write_result || (bytes_written == request_bytes_read)); | 246 DCHECK(!write_result || (bytes_written == request_bytes_read)); |
244 | 247 |
245 if (!write_result || (bytes_written != request_bytes_read)) { | 248 if (!write_result || (bytes_written != request_bytes_read)) { |
246 DownloadCompletedHelper(false); | 249 DownloadCompletedHelper(false); |
247 break; | 250 break; |
248 } | 251 } |
249 | 252 |
250 // Start reading | 253 // Start reading |
251 request_bytes_read = 0; | 254 request_bytes_read = 0; |
252 if (!request->Read(download_file_buffer_, arraysize(download_file_buffer_), | 255 if (!request->Read(download_file_buffer_, kDownloadFileBufferSize, |
253 &request_bytes_read)) { | 256 &request_bytes_read)) { |
254 if (!request->status().is_io_pending()) { | 257 if (!request->status().is_io_pending()) { |
255 // If the error is not an IO pending, then we're done | 258 // If the error is not an IO pending, then we're done |
256 // reading. | 259 // reading. |
257 OnDownloadCompleted(request); | 260 OnDownloadCompleted(request); |
258 } | 261 } |
259 break; | 262 break; |
260 } else if (request_bytes_read == 0) { | 263 } else if (request_bytes_read == 0) { |
261 OnDownloadCompleted(request); | 264 OnDownloadCompleted(request); |
262 break; | 265 break; |
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
931 void PluginProcessHost::OnDestroyWindow(HWND window) { | 934 void PluginProcessHost::OnDestroyWindow(HWND window) { |
932 plugin_service_->main_message_loop()->PostTask(FROM_HERE, | 935 plugin_service_->main_message_loop()->PostTask(FROM_HERE, |
933 new DestroyWindowTask(window)); | 936 new DestroyWindowTask(window)); |
934 } | 937 } |
935 | 938 |
936 void PluginProcessHost::Shutdown() { | 939 void PluginProcessHost::Shutdown() { |
937 | 940 |
938 Send(new PluginProcessMsg_BrowserShutdown); | 941 Send(new PluginProcessMsg_BrowserShutdown); |
939 } | 942 } |
940 | 943 |
OLD | NEW |