Index: chrome/browser/ui/webui/bug_report_ui.cc |
diff --git a/chrome/browser/ui/webui/bug_report_ui.cc b/chrome/browser/ui/webui/bug_report_ui.cc |
index 2e90b3144c362674a16ebc6866bae7c5d2fceeaa..d5511f110f5bb2516eaea166ca827093427b6cb7 100644 |
--- a/chrome/browser/ui/webui/bug_report_ui.cc |
+++ b/chrome/browser/ui/webui/bug_report_ui.cc |
@@ -127,20 +127,6 @@ int GetIndexOfFeedbackTab(Browser* browser) { |
namespace browser { |
-// TODO(rkc): Eventually find a better way to do this |
-std::vector<unsigned char>* last_screenshot_png = 0; |
-gfx::Rect screen_size; |
- |
-void RefreshLastScreenshot(Browser* browser) { |
- if (last_screenshot_png) |
- last_screenshot_png->clear(); |
- else |
- last_screenshot_png = new std::vector<unsigned char>; |
- |
- gfx::NativeWindow native_window = browser->window()->GetNativeHandle(); |
- screen_size = browser::GrabWindowSnapshot(native_window, last_screenshot_png); |
-} |
- |
void ShowHtmlBugReportView(Browser* browser, |
const std::string& description_template, |
size_t issue_type) { |
@@ -155,7 +141,14 @@ void ShowHtmlBugReportView(Browser* browser, |
return; |
} |
- RefreshLastScreenshot(browser); |
+ std::vector<unsigned char>* last_screenshot_png = |
+ BugReportUtil::GetScreenshotPng(); |
+ last_screenshot_png->clear(); |
+ |
+ gfx::NativeWindow native_window = browser->window()->GetNativeHandle(); |
+ BugReportUtil::SetScreenshotSize( |
+ browser::GrabWindowSnapshot(native_window, last_screenshot_png)); |
+ |
std::string bug_report_url = std::string(chrome::kChromeUIBugReportURL) + |
"#" + base::IntToString(browser->active_index()) + |
"?description=" + EscapeUrlEncodedData(description_template, false) + |
@@ -219,7 +212,7 @@ class BugReportHandler : public WebUIMessageHandler, |
TabContents* tab_; |
ScreenshotSource* screenshot_source_; |
- BugReportData* bug_report_; |
+ BugReportData* bug_report_data_; |
std::string target_tab_url_; |
#if defined(OS_CHROMEOS) |
// Variables to track SyslogsProvider::RequestSyslogs callback. |
@@ -386,62 +379,13 @@ void BugReportUIHTMLSource::StartDataRequest(const std::string& path, |
//////////////////////////////////////////////////////////////////////////////// |
// |
-// BugReportData |
-// |
-//////////////////////////////////////////////////////////////////////////////// |
-void BugReportData::SendReport() { |
-#if defined(OS_CHROMEOS) |
- // In case we already got the syslogs and sent the report, leave |
- if (sent_report_) return; |
- // Set send_report_ so that no one else processes SendReport |
- sent_report_ = true; |
-#endif |
- |
- int image_data_size = image_.size(); |
- char* image_data = image_data_size ? |
- reinterpret_cast<char*>(&(image_.front())) : NULL; |
- BugReportUtil::SendReport(profile_ |
- , problem_type_ |
- , page_url_ |
- , description_ |
- , image_data |
- , image_data_size |
- , browser::screen_size.width() |
- , browser::screen_size.height() |
-#if defined(OS_CHROMEOS) |
- , user_email_ |
- , zip_content_ ? zip_content_->c_str() : NULL |
- , zip_content_ ? zip_content_->length() : 0 |
- , send_sys_info_ ? sys_info_ : NULL |
-#endif |
- ); |
- |
-#if defined(OS_CHROMEOS) |
- if (sys_info_) { |
- delete sys_info_; |
- sys_info_ = NULL; |
- } |
- if (zip_content_) { |
- delete zip_content_; |
- zip_content_ = NULL; |
- } |
-#endif |
- |
- // Once the report has been sent, this object has no purpose in life, delete |
- // ourselves. |
- delete this; |
-} |
- |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// |
// BugReportHandler |
// |
//////////////////////////////////////////////////////////////////////////////// |
BugReportHandler::BugReportHandler(TabContents* tab) |
: tab_(tab), |
screenshot_source_(NULL), |
- bug_report_(NULL) |
+ bug_report_data_(NULL) |
#if defined(OS_CHROMEOS) |
, syslogs_handle_(0) |
#endif |
@@ -449,12 +393,14 @@ BugReportHandler::BugReportHandler(TabContents* tab) |
} |
BugReportHandler::~BugReportHandler() { |
- // Just in case we didn't send off bug_report_ to SendReport |
- if (bug_report_) { |
+ // Just in case we didn't send off bug_report_data_ to SendReport |
+ if (bug_report_data_) { |
// If we're deleting the report object, cancel feedback collection first |
CancelFeedbackCollection(); |
- delete bug_report_; |
+ delete bug_report_data_; |
} |
+ // Make sure we don't leave any screenshot data around. |
+ BugReportUtil::ClearScreenshotPng(); |
} |
void BugReportHandler::ClobberScreenshotsSource() { |
@@ -464,16 +410,15 @@ void BugReportHandler::ClobberScreenshotsSource() { |
Profile* profile = Profile::FromBrowserContext(tab_->browser_context()); |
profile->GetChromeURLDataManager()->AddDataSource(new ScreenshotSource(NULL)); |
- // clobber last screenshot |
- if (browser::last_screenshot_png) |
- browser::last_screenshot_png->clear(); |
+ BugReportUtil::ClearScreenshotPng(); |
} |
void BugReportHandler::SetupScreenshotsSource() { |
// If we don't already have a screenshot source object created, create one. |
- if (!screenshot_source_) |
- screenshot_source_ = new ScreenshotSource(browser::last_screenshot_png); |
- |
+ if (!screenshot_source_) { |
+ screenshot_source_ = |
+ new ScreenshotSource(BugReportUtil::GetScreenshotPng()); |
+ } |
// Add the source to the data manager. |
Profile* profile = Profile::FromBrowserContext(tab_->browser_context()); |
profile->GetChromeURLDataManager()->AddDataSource(screenshot_source_); |
@@ -546,7 +491,8 @@ void BugReportHandler::RegisterMessages() { |
} |
void BugReportHandler::HandleGetDialogDefaults(const ListValue*) { |
- bug_report_ = new BugReportData(); |
+ // Will delete itself when bug_report_data_->SendReport() is called. |
+ bug_report_data_ = new BugReportData(); |
// send back values which the dialog js needs initially |
ListValue dialog_defaults; |
@@ -568,7 +514,7 @@ void BugReportHandler::HandleGetDialogDefaults(const ListValue*) { |
true, // don't compress. |
chromeos::system::SyslogsProvider::SYSLOGS_FEEDBACK, |
&syslogs_consumer_, |
- NewCallback(bug_report_, &BugReportData::SyslogsComplete)); |
+ NewCallback(bug_report_data_, &BugReportData::SyslogsComplete)); |
} |
// 2: user e-mail |
dialog_defaults.Append(new StringValue(GetUserEmail())); |
@@ -598,7 +544,7 @@ void BugReportHandler::HandleRefreshSavedScreenshots(const ListValue*) { |
void BugReportHandler::HandleSendReport(const ListValue* list_value) { |
- if (!bug_report_) { |
+ if (!bug_report_data_) { |
LOG(ERROR) << "Bug report hasn't been intialized yet."; |
return; |
} |
@@ -672,35 +618,35 @@ void BugReportHandler::HandleSendReport(const ListValue* list_value) { |
CancelFeedbackCollection(); |
#endif |
- // Update the data in bug_report_ so it can be sent |
- bug_report_->UpdateData(web_ui_->GetProfile() |
- , target_tab_url_ |
- , problem_type |
- , page_url |
- , description |
- , image |
+ // Update the data in bug_report_data_ so it can be sent |
+ bug_report_data_->UpdateData(web_ui_->GetProfile() |
+ , target_tab_url_ |
+ , problem_type |
+ , page_url |
+ , description |
+ , image |
#if defined(OS_CHROMEOS) |
- , user_email |
- , send_sys_info |
- , false // sent_report |
+ , user_email |
+ , send_sys_info |
+ , false // sent_report |
#endif |
- ); |
+ ); |
#if defined(OS_CHROMEOS) |
// If we don't require sys_info, or we have it, or we never requested it |
// (because libcros failed to load), then send the report now. |
// Otherwise, the report will get sent when we receive sys_info. |
- if (!send_sys_info || bug_report_->sys_info() != NULL || |
+ if (!send_sys_info || bug_report_data_->sys_info() != NULL || |
syslogs_handle_ == 0) { |
- bug_report_->SendReport(); |
+ bug_report_data_->SendReport(); |
} |
#else |
- bug_report_->SendReport(); |
+ bug_report_data_->SendReport(); |
#endif |
// Lose the pointer to the BugReportData object; the object will delete itself |
// from SendReport, whether we called it, or will be called by the log |
// completion routine. |
- bug_report_ = NULL; |
+ bug_report_data_ = NULL; |
// Whether we sent the report, or if it will be sent by the Syslogs complete |
// function, close our feedback tab anyway, we have no more use for it. |