From 862066288bfa2871c36e3ab794fb7f6819a5cdfd Mon Sep 17 00:00:00 2001 From: "zelidrag@chromium.org" Date: Fri, 14 May 2010 05:45:26 +0000 Subject: Commiting http://codereview.chromium.org/2017007/show on behalf of rkc@chromium.org. This change hooks issue report dialog with Google Feedback backend for ChromeOS. The dialog is going to be used only for Chrome OS at the moment, the previous mechanism is kept intact for other operating systems. Image and System Info reporting is disabled at the moment; for image, we need feedback to get their changes in production, for reporting, the system scripts need to be added (basic Chrome and OS version info is being sent with the report) BUG=chromium-os:2761 TEST=none, work in progress TBR=zelidrag Review URL: http://codereview.chromium.org/2068004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@47244 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/browser/bug_report_util.cc | 174 ++++++++++++++++---------------------- 1 file changed, 75 insertions(+), 99 deletions(-) (limited to 'chrome/browser/bug_report_util.cc') diff --git a/chrome/browser/bug_report_util.cc b/chrome/browser/bug_report_util.cc index b23943e..37aa8f8 100644 --- a/chrome/browser/bug_report_util.cc +++ b/chrome/browser/bug_report_util.cc @@ -17,6 +17,8 @@ #include "grit/locale_settings.h" #include "unicode/locid.h" +#include + namespace { const int kBugReportVersion = 1; @@ -26,7 +28,17 @@ const char kReportPhishingUrl[] = // URL to post bug reports to. const char* const kBugReportPostUrl = - "http://web-bug.appspot.com/bugreport"; + "http://feedback2-dev.corp.google.com/tools/feedback/chrome/__submit"; + +const char* const kProtBufMimeType = "application/x-protobuf"; +const char* const kPngMimeType = "image/png"; + +// Tags we use in product specific data +const char* const kPageTitleTag = "PAGE TITLE"; +const char* const kProblemTypeTag = "PROBLEM TYPE"; +const char* const kChromeVersionTag = "CHROME VERSION"; +const char* const kOsVersionTag = "OS VERSION"; + } // namespace @@ -89,60 +101,59 @@ void BugReportUtil::SetOSVersion(std::string *os_version) { #endif } -// Create a MIME boundary marker (27 '-' characters followed by 16 hex digits). -void BugReportUtil::CreateMimeBoundary(std::string *out) { - int r1 = rand(); - int r2 = rand(); - SStringPrintf(out, "---------------------------%08X%08X", r1, r2); +// static +void BugReportUtil::AddFeedbackData( + userfeedback::ExternalExtensionSubmit* feedback_data, + const std::string& key, const std::string& value) { + // Create log_value object and add it to the web_data object + userfeedback::ProductSpecificData log_value; + log_value.set_key(key); + log_value.set_value(value); + userfeedback::WebData* web_data = feedback_data->mutable_web_data(); + *(web_data->add_product_specific_data()) = log_value; } // static void BugReportUtil::SendReport(Profile* profile, - std::string page_title_text, + const std::string& page_title_text, int problem_type, - std::string page_url_text, - std::string description, + const std::string& page_url_text, + const std::string& description, const char* png_data, - int png_data_length) { + int png_data_length, + int png_width, + int png_height) { GURL post_url(kBugReportPostUrl); - std::string mime_boundary; - CreateMimeBoundary(&mime_boundary); - // Create a request body and add the mandatory parameters. - std::string post_body; + // Create google feedback protocol buffer objects + userfeedback::ExternalExtensionSubmit feedback_data; + // type id set to 0, unused field but needs to be initialized to 0 + feedback_data.set_type_id(0); + + userfeedback::CommonData* common_data = feedback_data.mutable_common_data(); + userfeedback::WebData* web_data = feedback_data.mutable_web_data(); - // Add the protocol version: - post_body.append("--" + mime_boundary + "\r\n"); - post_body.append("Content-Disposition: form-data; " - "name=\"data_version\"\r\n\r\n"); - post_body.append(StringPrintf("%d\r\n", kBugReportVersion)); + // set GAIA id to 0 to indicate no username available + common_data->set_gaia_id(0); // Add the page title. - post_body.append("--" + mime_boundary + "\r\n"); - post_body.append(page_title_text + "\r\n"); - - // Add the problem type. - post_body.append("--" + mime_boundary + "\r\n"); - post_body.append("Content-Disposition: form-data; " - "name=\"problem\"\r\n\r\n"); - post_body.append(StringPrintf("%d\r\n", problem_type)); - - // Add in the URL, if we have one. - post_body.append("--" + mime_boundary + "\r\n"); - post_body.append("Content-Disposition: form-data; " - "name=\"url\"\r\n\r\n"); - - // Convert URL to UTF8. - if (page_url_text.empty()) - post_body.append("n/a\r\n"); - else - post_body.append(page_url_text + "\r\n"); - - // Add Chrome version. - post_body.append("--" + mime_boundary + "\r\n"); - post_body.append("Content-Disposition: form-data; " - "name=\"chrome_version\"\r\n\r\n"); + AddFeedbackData(&feedback_data, std::string(kPageTitleTag), + page_title_text); + AddFeedbackData(&feedback_data, std::string(kProblemTypeTag), + StringPrintf("%d\r\n", problem_type)); + + // Add the description to the feedback object + common_data->set_description(description); + + // Add the language + std::string chrome_locale = g_browser_process->GetApplicationLocale(); + common_data->set_source_descripton_language(chrome_locale); + + // Set the url + web_data->set_url(page_url_text); + + // Add the Chrome version std::string chrome_version; scoped_ptr version_info( chrome_app::GetChromeVersionInfo()); @@ -152,79 +163,45 @@ void BugReportUtil::SendReport(Profile* profile, " (" + WideToUTF8(version_info->last_change()) + ")"; } - if (chrome_version.empty()) - post_body.append("n/a\r\n"); - else - post_body.append(chrome_version + "\r\n"); + if (!chrome_version.empty()) + AddFeedbackData(&feedback_data, std::string(kChromeVersionTag), + chrome_version); // Add OS version (eg, for WinXP SP2: "5.1.2600 Service Pack 2"). std::string os_version = ""; - post_body.append("--" + mime_boundary + "\r\n"); - post_body.append("Content-Disposition: form-data; " - "name=\"os_version\"\r\n\r\n"); SetOSVersion(&os_version); - post_body.append(os_version + "\r\n"); + AddFeedbackData(&feedback_data, std::string(kOsVersionTag), os_version); - // Add locale. -#if defined(OS_MACOSX) - std::string chrome_locale = g_browser_process->GetApplicationLocale(); -#else - icu::Locale locale = icu::Locale::getDefault(); - const char *lang = locale.getLanguage(); - std::string chrome_locale = (lang)? lang:"en"; -#endif - - post_body.append("--" + mime_boundary + "\r\n"); - post_body.append("Content-Disposition: form-data; " - "name=\"chrome_locale\"\r\n\r\n"); - post_body.append(chrome_locale + "\r\n"); - - // Add a description if we have one. - post_body.append("--" + mime_boundary + "\r\n"); - post_body.append("Content-Disposition: form-data; " - "name=\"description\"\r\n\r\n"); - - if (description.empty()) - post_body.append("n/a\r\n"); - else - post_body.append(description + "\r\n"); // Include the page image if we have one. - if (png_data != NULL && png_data_length > 0) { - post_body.append("--" + mime_boundary + "\r\n"); - post_body.append("Content-Disposition: form-data; name=\"screenshot\"; " - "filename=\"screenshot.png\"\r\n"); - post_body.append("Content-Type: application/octet-stream\r\n"); - post_body.append(StringPrintf("Content-Length: %d\r\n\r\n", - png_data_length)); - post_body.append(png_data, png_data_length); - post_body.append("\r\n"); + if (png_data) { + userfeedback::PostedScreenshot screenshot; + screenshot.set_mime_type(kPngMimeType); + + // Set the dimensions of the screenshot + userfeedback::Dimensions dimensions; + dimensions.set_width(static_cast(png_width)); + dimensions.set_height(static_cast(png_height)); + *(screenshot.mutable_dimensions()) = dimensions; + screenshot.set_binary_content(std::string(png_data, png_data_length)); + + // Set the screenshot object in feedback + *(feedback_data.mutable_screenshot()) = screenshot; } // TODO(awalker): include the page source if we can get it. // if (include_page_source_checkbox_->checked()) { // } - // Terminate the body. - post_body.append("--" + mime_boundary + "--\r\n"); - // We have the body of our POST, so send it off to the server. URLFetcher* fetcher = new URLFetcher(post_url, URLFetcher::POST, new BugReportUtil::PostCleanup); fetcher->set_request_context(profile->GetRequestContext()); - std::string mime_type("multipart/form-data; boundary="); - mime_type += mime_boundary; - fetcher->set_upload_data(mime_type, post_body); - fetcher->Start(); -} -// static -std::string BugReportUtil::GetMimeType() { - std::string mime_type("multipart/form-data; boundary="); - std::string mime_boundary; - CreateMimeBoundary(&mime_boundary); - mime_type += mime_boundary; - return mime_type; + std::string post_body; + feedback_data.SerializeToString(&post_body); + fetcher->set_upload_data(std::string(kProtBufMimeType), post_body); + fetcher->Start(); } // static @@ -236,4 +213,3 @@ void BugReportUtil::ReportPhishing(TabContents* currentTab, GURL(), PageTransition::LINK); } - -- cgit v1.1