Index: chrome/browser/bug_report_util.cc |
=================================================================== |
--- chrome/browser/bug_report_util.cc (revision 0) |
+++ chrome/browser/bug_report_util.cc (revision 0) |
@@ -0,0 +1,228 @@ |
+// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/bug_report_util.h" |
+ |
+#include "app/l10n_util.h" |
+#include "base/file_version_info.h" |
+#include "base/string_util.h" |
+#include "chrome/browser/browser_process_impl.h" |
+#include "chrome/browser/net/url_fetcher.h" |
+#include "chrome/browser/profile.h" |
+#include "chrome/browser/safe_browsing/safe_browsing_util.h" |
+#include "chrome/browser/tab_contents/tab_contents.h" |
+#include "googleurl/src/gurl.h" |
+#include "grit/locale_settings.h" |
+ |
+namespace { |
+ |
+static const int kBugReportVersion = 1; |
+ |
+static const char kReportPhishingUrl[] = |
+ "http://www.google.com/safebrowsing/report_phish/"; |
+} |
+ |
+// Simple URLFetcher::Delegate to clean up URLFetcher on completion. |
+class BugReportUtil::PostCleanup : public URLFetcher::Delegate { |
+ public: |
+ PostCleanup(); |
+ |
+ // Overridden from URLFetcher::Delegate. |
+ virtual void OnURLFetchComplete(const URLFetcher* source, |
+ const GURL& url, |
+ const URLRequestStatus& status, |
+ int response_code, |
+ const ResponseCookies& cookies, |
+ const std::string& data); |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(PostCleanup); |
+}; |
+ |
+BugReportUtil::PostCleanup::PostCleanup() { |
+} |
+ |
+void BugReportUtil::PostCleanup::OnURLFetchComplete( |
+ const URLFetcher* source, |
+ const GURL& url, |
+ const URLRequestStatus& status, |
+ int response_code, |
+ const ResponseCookies& cookies, |
+ const std::string& data) { |
+ // Delete the URLFetcher. |
+ delete source; |
+ // And then delete ourselves. |
+ delete this; |
+} |
+ |
+// static |
+void BugReportUtil::SetOSVersion(std::string *os_version) { |
+#if defined(OS_WIN) |
+ OSVERSIONINFO osvi; |
+ ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); |
+ osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); |
+ |
+ if (GetVersionEx(&osvi)) { |
+ *os_version = StringPrintf("%d.%d.%d %S", |
+ osvi.dwMajorVersion, |
+ osvi.dwMinorVersion, |
+ osvi.dwBuildNumber, |
+ osvi.szCSDVersion); |
+ } else { |
+ *os_version = "unknown"; |
+ } |
+#else |
+ // Right now, we only get the OS Version for Windows. |
+ // TODO(mirandac): make this cross-platform. |
+ *os_version = "unknown"; |
+#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::SendReport(Profile* profile, |
+ std::string page_title_text, |
+ int problem_type, |
+ std::string page_url_text, |
+ std::string description, |
+ const char* png_data, |
+ int png_data_length) { |
+ GURL post_url(WideToUTF8(l10n_util::GetString(IDS_BUGREPORT_POST_URL))); |
+ std::string mime_boundary; |
+ CreateMimeBoundary(&mime_boundary); |
+ |
+ // Create a request body and add the mandatory parameters. |
+ std::string post_body; |
+ |
+ // 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)); |
+ |
+ // 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"); |
+ |
+ std::string chrome_version; |
+ scoped_ptr<FileVersionInfo> version_info( |
+ FileVersionInfo::CreateFileVersionInfoForCurrentModule()); |
+ if (version_info.get()) { |
+ chrome_version = WideToUTF8(version_info->product_name()) + " - " + |
+ WideToUTF8(version_info->file_version()) + |
+ " (" + WideToUTF8(version_info->last_change()) + ")"; |
+ } |
+ |
+ if (chrome_version.empty()) |
+ post_body.append("n/a\r\n"); |
+ else |
+ post_body.append(chrome_version + "\r\n"); |
+ |
+ // 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"); |
+ |
+ // 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: %lu\r\n\r\n", |
+ png_data_length)); |
+ post_body.append(png_data, png_data_length); |
+ post_body.append("\r\n"); |
+ } |
+ |
+ // 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; |
+} |
+ |
+// static |
+void BugReportUtil::ReportPhishing(TabContents* currentTab, |
+ const std::string& phishing_url) { |
+ currentTab->controller().LoadURL( |
+ safe_browsing_util::GeneratePhishingReportUrl( |
+ kReportPhishingUrl, phishing_url), |
+ GURL(), |
+ PageTransition::LINK); |
+} |
+ |
Property changes on: chrome\browser\bug_report_util.cc |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |