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 "chrome/browser/feedback/feedback_util.h" | 5 #include "chrome/browser/feedback/feedback_util.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 const int kHttpPostSuccessNoContent = 204; | 85 const int kHttpPostSuccessNoContent = 204; |
86 const int kHttpPostFailNoConnection = -1; | 86 const int kHttpPostFailNoConnection = -1; |
87 const int kHttpPostFailClientError = 400; | 87 const int kHttpPostFailClientError = 400; |
88 const int kHttpPostFailServerError = 500; | 88 const int kHttpPostFailServerError = 500; |
89 | 89 |
90 const int64 kInitialRetryDelay = 900000; // 15 minutes | 90 const int64 kInitialRetryDelay = 900000; // 15 minutes |
91 const int64 kRetryDelayIncreaseFactor = 2; | 91 const int64 kRetryDelayIncreaseFactor = 2; |
92 const int64 kRetryDelayLimit = 14400000; // 4 hours | 92 const int64 kRetryDelayLimit = 14400000; // 4 hours |
93 | 93 |
94 const char kArbitraryMimeType[] = "application/octet-stream"; | 94 const char kArbitraryMimeType[] = "application/octet-stream"; |
| 95 const char kHistogramsAttachmentName[] = "histograms.zip"; |
95 const char kLogsAttachmentName[] = "system_logs.zip"; | 96 const char kLogsAttachmentName[] = "system_logs.zip"; |
96 | 97 |
97 #if defined(OS_CHROMEOS) | 98 #if defined(OS_CHROMEOS) |
98 const int kChromeOSProductId = 208; | 99 const int kChromeOSProductId = 208; |
99 #else | 100 #else |
100 const int kChromeBrowserProductId = 237; | 101 const int kChromeBrowserProductId = 237; |
101 #endif | 102 #endif |
102 | 103 |
103 // Simple net::URLFetcherDelegate to clean up URLFetcher on completion. | 104 // Simple net::URLFetcherDelegate to clean up URLFetcher on completion. |
104 class PostCleanup : public net::URLFetcherDelegate { | 105 class PostCleanup : public net::URLFetcherDelegate { |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 // Don't bother with empty keys or values | 211 // Don't bother with empty keys or values |
211 if (key == "" || value == "") return; | 212 if (key == "" || value == "") return; |
212 // Create log_value object and add it to the web_data object | 213 // Create log_value object and add it to the web_data object |
213 userfeedback::ProductSpecificData log_value; | 214 userfeedback::ProductSpecificData log_value; |
214 log_value.set_key(key); | 215 log_value.set_key(key); |
215 log_value.set_value(value); | 216 log_value.set_value(value); |
216 userfeedback::WebData* web_data = feedback_data->mutable_web_data(); | 217 userfeedback::WebData* web_data = feedback_data->mutable_web_data(); |
217 *(web_data->add_product_specific_data()) = log_value; | 218 *(web_data->add_product_specific_data()) = log_value; |
218 } | 219 } |
219 | 220 |
| 221 // Adds data as an attachment to feedback_data if the data is non-empty. |
| 222 void AddAttachment(userfeedback::ExtensionSubmit* feedback_data, |
| 223 const char* name, |
| 224 std::string* data) { |
| 225 if (data == NULL || data->empty()) |
| 226 return; |
| 227 |
| 228 userfeedback::ProductSpecificBinaryData* attachment = |
| 229 feedback_data->add_product_specific_binary_data(); |
| 230 attachment->set_mime_type(kArbitraryMimeType); |
| 231 attachment->set_name(name); |
| 232 attachment->set_data(*data); |
| 233 } |
| 234 |
220 } // namespace | 235 } // namespace |
221 | 236 |
222 namespace chrome { | 237 namespace chrome { |
223 | 238 |
224 const char kAppLauncherCategoryTag[] = "AppLauncher"; | 239 const char kAppLauncherCategoryTag[] = "AppLauncher"; |
225 | 240 |
226 void ShowFeedbackPage(Browser* browser, | 241 void ShowFeedbackPage(Browser* browser, |
227 const std::string& description_template, | 242 const std::string& description_template, |
228 const std::string& category_tag) { | 243 const std::string& category_tag) { |
229 GURL page_url; | 244 GURL page_url; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 web_data->mutable_navigator()->set_user_agent(content::GetUserAgent(GURL())); | 296 web_data->mutable_navigator()->set_user_agent(content::GetUserAgent(GURL())); |
282 | 297 |
283 gfx::Rect screen_size; | 298 gfx::Rect screen_size; |
284 if (data->sys_info()) { | 299 if (data->sys_info()) { |
285 for (FeedbackData::SystemLogsMap::const_iterator i = | 300 for (FeedbackData::SystemLogsMap::const_iterator i = |
286 data->sys_info()->begin(); i != data->sys_info()->end(); ++i) { | 301 data->sys_info()->begin(); i != data->sys_info()->end(); ++i) { |
287 if (FeedbackData::BelowCompressionThreshold(i->second)) | 302 if (FeedbackData::BelowCompressionThreshold(i->second)) |
288 AddFeedbackData(&feedback_data, i->first, i->second); | 303 AddFeedbackData(&feedback_data, i->first, i->second); |
289 } | 304 } |
290 | 305 |
291 if (data->compressed_logs() && data->compressed_logs()->size()) { | 306 AddAttachment(&feedback_data, kLogsAttachmentName, data->compressed_logs()); |
292 userfeedback::ProductSpecificBinaryData attachment; | |
293 attachment.set_mime_type(kArbitraryMimeType); | |
294 attachment.set_name(kLogsAttachmentName); | |
295 attachment.set_data(*(data->compressed_logs())); | |
296 *(feedback_data.add_product_specific_binary_data()) = attachment; | |
297 } | |
298 } | 307 } |
299 | 308 |
300 if (!data->attached_filename().empty() && | 309 if (data->histograms()) { |
301 data->attached_filedata() && | 310 AddAttachment(&feedback_data, |
302 !data->attached_filedata()->empty()) { | 311 kHistogramsAttachmentName, |
303 userfeedback::ProductSpecificBinaryData attached_file; | 312 data->compressed_histograms()); |
304 attached_file.set_mime_type(kArbitraryMimeType); | 313 } |
| 314 |
| 315 if (!data->attached_filename().empty()) { |
305 // We need to use the UTF8Unsafe methods here to accomodate Windows, which | 316 // We need to use the UTF8Unsafe methods here to accomodate Windows, which |
306 // uses wide strings to store filepaths. | 317 // uses wide strings to store filepaths. |
307 std::string name = base::FilePath::FromUTF8Unsafe( | 318 std::string name = base::FilePath::FromUTF8Unsafe( |
308 data->attached_filename()).BaseName().AsUTF8Unsafe(); | 319 data->attached_filename()).BaseName().AsUTF8Unsafe(); |
309 attached_file.set_name(name); | 320 AddAttachment(&feedback_data, name.c_str(), data->attached_filedata()); |
310 attached_file.set_data(*data->attached_filedata()); | |
311 *(feedback_data.add_product_specific_binary_data()) = attached_file; | |
312 } | 321 } |
313 | 322 |
314 // NOTE: Screenshot needs to be processed after system info since we'll get | 323 // NOTE: Screenshot needs to be processed after system info since we'll get |
315 // the screenshot dimensions from system info. | 324 // the screenshot dimensions from system info. |
316 if (data->image() && data->image()->size()) { | 325 if (data->image() && data->image()->size()) { |
317 userfeedback::PostedScreenshot screenshot; | 326 userfeedback::PostedScreenshot screenshot; |
318 screenshot.set_mime_type(kPngMimeType); | 327 screenshot.set_mime_type(kPngMimeType); |
319 | 328 |
320 // Set that we 'have' dimensions of the screenshot. These dimensions are | 329 // Set that we 'have' dimensions of the screenshot. These dimensions are |
321 // ignored by the server but are a 'required' field in the protobuf. | 330 // ignored by the server but are a 'required' field in the protobuf. |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 if (!zip::Zip(temp_path, zip_file, false)) | 389 if (!zip::Zip(temp_path, zip_file, false)) |
381 return false; | 390 return false; |
382 | 391 |
383 if (!base::ReadFileToString(zip_file, compressed_logs)) | 392 if (!base::ReadFileToString(zip_file, compressed_logs)) |
384 return false; | 393 return false; |
385 | 394 |
386 return true; | 395 return true; |
387 } | 396 } |
388 | 397 |
389 } // namespace feedback_util | 398 } // namespace feedback_util |
OLD | NEW |