Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Unified Diff: chrome/browser/dom_ui/bug_report_ui.cc

Issue 3061044: HTML UI implementation for the Google Feedback client for Chrome/ChromeOS.... (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/dom_ui/bug_report_ui.h ('k') | chrome/browser/dom_ui/dom_ui_factory.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/dom_ui/bug_report_ui.cc
===================================================================
--- chrome/browser/dom_ui/bug_report_ui.cc (revision 0)
+++ chrome/browser/dom_ui/bug_report_ui.cc (revision 0)
@@ -0,0 +1,626 @@
+// 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/dom_ui/bug_report_ui.h"
+
+#include "app/l10n_util.h"
+#include "app/resource_bundle.h"
+#include "base/callback.h"
+#include "base/file_util.h"
+#include "base/logging.h"
+#include "base/message_loop.h"
+#include "base/path_service.h"
+#include "base/singleton.h"
+#include "base/string_piece.h"
+#include "base/string_util.h"
+#include "base/string_number_conversions.h"
+#include "base/thread.h"
+#include "base/time.h"
+#include "base/values.h"
+#include "base/weak_ptr.h"
+#include "chrome/browser/bookmarks/bookmark_model.h"
+#include "chrome/browser/browser.h"
+#include "chrome/browser/browser_list.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/browser_window.h"
+#include "chrome/browser/bug_report_util.h"
+#include "chrome/browser/chrome_thread.h"
+#include "chrome/browser/dom_ui/dom_ui_screenshot_source.h"
+#include "chrome/browser/download/download_manager.h"
+#include "chrome/browser/download/download_util.h"
+#include "chrome/browser/history/history_types.h"
+#include "chrome/browser/metrics/user_metrics.h"
+#include "chrome/browser/profile.h"
+#include "chrome/browser/tab_contents/tab_contents.h"
+#include "chrome/browser/tab_contents/thumbnail_generator.h"
+#include "chrome/common/chrome_paths.h"
+#include "chrome/common/jstemplate_builder.h"
+#include "chrome/common/time_format.h"
+#include "chrome/common/url_constants.h"
+#include "chrome/common/net/url_fetcher.h"
+#include "gfx/codec/png_codec.h"
+#include "net/base/escape.h"
+#include "views/window/window.h"
+
+#include "grit/browser_resources.h"
+#include "grit/chromium_strings.h"
+#include "grit/generated_resources.h"
+#include "grit/locale_settings.h"
+
+#if defined(OS_LINUX)
+#include "app/x11_util.h"
+#elif defined(OS_MACOSX)
+#include "base/mac_util.h"
+#else
+#include "app/win_util.h"
+#endif
+
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/cros/cros_library.h"
+#include "chrome/browser/chromeos/cros/syslogs_library.h"
+#include "chrome/browser/chromeos/login/user_manager.h"
+#endif
+
+static const char kScreenshotBaseUrl[] = "chrome://screenshots/";
+static const char kCurrentScreenshotUrl[] = "chrome://screenshots/current";
+#if defined(OS_CHROMEOS)
+static const char kSavedScreenshotsUrl[] = "chrome://screenshots/saved/";
+
+static const char kScreenshotPattern[] = "*.png";
+static const char kScreenshotsRelativePath[] = "/Screenshots";
+#endif
+
+namespace {
+#if defined(OS_CHROMEOS)
+
+void GetSavedScreenshots(std::vector<std::string>* saved_screenshots,
+ base::WaitableEvent* done) {
+ saved_screenshots->clear();
+
+ FilePath fileshelf_path;
+ if (!PathService::Get(chrome::DIR_DEFAULT_DOWNLOADS,
+ &fileshelf_path)) {
+ done->Signal();
+ return;
+ }
+
+ // TODO(rkc): Change this to use FilePath.Append() once the cros
+ // issue with it is fixed
+ FilePath screenshots_path(fileshelf_path.value() +
+ std::string(kScreenshotsRelativePath));
+ file_util::FileEnumerator screenshots(screenshots_path, false,
+ file_util::FileEnumerator::FILES,
+ std::string(kScreenshotPattern));
+ FilePath screenshot = screenshots.Next();
+ while (!screenshot.empty()) {
+ saved_screenshots->push_back(std::string(kSavedScreenshotsUrl) +
+ screenshot.BaseName().value());
+ screenshot = screenshots.Next();
+ }
+ done->Signal();
+}
+
+// This fuction posts a task to the file thread to create/list all the current
+// and saved screenshots.
+void GetScreenshotUrls(std::vector<std::string>* saved_screenshots) {
+ base::WaitableEvent done(true, false);
+ ChromeThread::PostTask(ChromeThread::FILE, FROM_HERE,
+ NewRunnableFunction(&GetSavedScreenshots,
+ saved_screenshots, &done));
+ done.Wait();
+}
+
+std::string GetUserEmail() {
+ chromeos::UserManager* manager = chromeos::UserManager::Get();
+ if (!manager)
+ return std::string();
+ else
+ return manager->logged_in_user().email();
+}
+
+chromeos::LogDictionaryType* GetSystemInformation() {
+ chromeos::LogDictionaryType* sys_info = NULL;
+ chromeos::SyslogsLibrary* syslogs_lib =
+ chromeos::CrosLibrary::Get()->GetSyslogsLibrary();
+
+ if (syslogs_lib)
+ sys_info = syslogs_lib->GetSyslogs(NULL);
+
+ return sys_info;
+}
+#endif
+
+
+} // namespace
+
+
+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(views::Window* parent) {
+ // Grab an exact snapshot of the window that the user is seeing (i.e. as
+ // rendered--do not re-render, and include windowed plugins).
+ if (last_screenshot_png)
+ last_screenshot_png->clear();
+ else
+ last_screenshot_png = new std::vector<unsigned char>;
+
+#if defined(OS_LINUX) || defined(OS_CHROMEOS)
+ screen_size = parent->GetBounds();
+ x11_util::GrabWindowSnapshot(parent->GetNativeWindow(), last_screenshot_png);
+#elif defined(OS_MACOSX)
+ int width = 0, height = 0;
+ mac_util::GrabWindowSnapshot(parent->GetNativeWindow(), last_screenshot_png,
+ &width, &height);
+#else
+ screen_size = parent->GetBounds();
+ win_util::GrabWindowSnapshot(parent->GetNativeWindow(), last_screenshot_png);
+#endif
+}
+
+// Global "display this dialog" function declared in browser_dialogs.h.
+void ShowHtmlBugReportView(views::Window* parent, Browser* browser) {
+ std::string bug_report_url = std::string(chrome::kChromeUIBugReportURL) +
+ base::IntToString(browser->selected_index());
+
+ RefreshLastScreenshot(parent);
+ browser->ShowSingletonTab(GURL(bug_report_url));
+}
+
+} // namespace browser
+
+
+class BugReportUIHTMLSource : public ChromeURLDataManager::DataSource {
+ public:
+ explicit BugReportUIHTMLSource(base::StringPiece html);
+
+ // Called when the network layer has requested a resource underneath
+ // the path we registered.
+ virtual void StartDataRequest(const std::string& path,
+ bool is_off_the_record,
+ int request_id);
+ virtual std::string GetMimeType(const std::string&) const {
+ return "text/html";
+ }
+
+ private:
+ base::StringPiece bug_report_html_;
+ ~BugReportUIHTMLSource() {}
+
+ DISALLOW_COPY_AND_ASSIGN(BugReportUIHTMLSource);
+};
+
+class TaskProxy;
+
+// The handler for Javascript messages related to the "bug report" dialog
+class BugReportHandler : public DOMMessageHandler,
+ public base::SupportsWeakPtr<BugReportHandler> {
+ public:
+ explicit BugReportHandler(TabContents* tab);
+ virtual ~BugReportHandler();
+
+ // Init work after Attach.
+ base::StringPiece Init();
+
+ // DOMMessageHandler implementation.
+ virtual DOMMessageHandler* Attach(DOMUI* dom_ui);
+ virtual void RegisterMessages();
+ void OnURLFetchComplete(const URLFetcher* source,
+ const GURL& url,
+ const URLRequestStatus& status,
+ int response_code,
+ const ResponseCookies& cookies,
+ const std::string& data);
+
+ void HandleGetDialogDefaults(const ListValue*);
+ void HandleRefreshScreenshots(const ListValue*);
+ void HandleSendReport(const ListValue* list_value);
+ void HandleCancel(const ListValue*);
+
+ void SetupScreenshotsSource();
+ void ClobberScreenshotsSource();
+
+ private:
+ Browser* browser_;
+ std::string page_url_;
+ Profile* profile_;
+ TabContents* tab_;
+ TabContents* target_tab_;
+ DOMUIScreenshotSource* screenshot_source_;
+#if defined (OS_CHROMEOS)
+ chromeos::LogDictionaryType* sys_info_;
+#endif
+
+ DISALLOW_COPY_AND_ASSIGN(BugReportHandler);
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// BugReportHTMLSource
+//
+////////////////////////////////////////////////////////////////////////////////
+
+BugReportUIHTMLSource::BugReportUIHTMLSource(base::StringPiece html)
+ : DataSource(chrome::kChromeUIBugReportHost, MessageLoop::current()) {
+ bug_report_html_ = html;
+}
+
+void BugReportUIHTMLSource::StartDataRequest(const std::string& path,
+ bool is_off_the_record,
+ int request_id) {
+ DictionaryValue localized_strings;
+ localized_strings.SetString(std::string("title"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_TITLE));
+ localized_strings.SetString(std::string("issue-with"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_ISSUE_WITH));
+ localized_strings.SetString(std::string("page-url"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_REPORT_URL_LABEL));
+ localized_strings.SetString(std::string("description"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_DESCRIPTION_LABEL));
+ localized_strings.SetString(std::string("screenshot"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_SCREENSHOT_LABEL));
+#if defined(OS_CHROMEOS)
+ localized_strings.SetString(std::string("user-email"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_USER_EMAIL_LABEL));
+ localized_strings.SetString(std::string("currentscreenshots"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_CURRENT_SCREENSHOTS));
+ localized_strings.SetString(std::string("savedscreenshots"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_SAVED_SCREENSHOTS));
+ localized_strings.SetString(std::string("sysinfo"),
+ l10n_util::GetStringUTF8(
+ IDS_BUGREPORT_INCLUDE_SYSTEM_INFORMATION_CHKBOX));
+#else
+ localized_strings.SetString(std::string("currentscreenshots"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_INCLUDE_NEW_SCREEN_IMAGE));
+#endif
+ localized_strings.SetString(std::string("noscreenshot"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_INCLUDE_NO_SCREENSHOT));
+
+ localized_strings.SetString(std::string("send-report"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_SEND_REPORT));
+ localized_strings.SetString(std::string("cancel"),
+ l10n_util::GetStringUTF8(IDS_CANCEL));
+
+ // Option strings for the "issue with" drop-down.
+ localized_strings.SetString(std::string("issue-choose"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_CHOOSE_ISSUE));
+
+ localized_strings.SetString(std::string("no-issue-selected"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_NO_ISSUE_SELECTED));
+
+
+ // TODO(rkc): Find some way to ensure this order of dropdowns is in sync
+ // with the order in the userfeedback ChromeData proto buffer
+#if defined(OS_CHROMEOS)
+ // Dropdown for ChromeOS:
+ //
+ // Connectivity
+ // Sync
+ // Crash
+ // Page Formatting
+ // Extensions or Apps
+ // Standby or Resume
+ // Phishing Page
+ // General Feedback/Other
+
+ localized_strings.SetString(std::string("issue-connectivity"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_CONNECTIVITY));
+ localized_strings.SetString(std::string("issue-sync"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_SYNC));
+ localized_strings.SetString(std::string("issue-crashes"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_CRASHES));
+ localized_strings.SetString(std::string("issue-page-formatting"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_PAGE_FORMATTING));
+ localized_strings.SetString(std::string("issue-extensions"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_EXTENSIONS));
+ localized_strings.SetString(std::string("issue-standby"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_STANDBY_RESUME));
+ localized_strings.SetString(std::string("issue-phishing"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_PHISHING_PAGE));
+ localized_strings.SetString(std::string("issue-other"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_GENERAL));
+#else
+ // Dropdown for Chrome:
+ //
+ // Page formatting or layout
+ // Pages not loading
+ // Plug-ins (e.g. Adobe Flash Player, Quicktime, etc)
+ // Tabs or windows
+ // Synced preferences
+ // Crashes
+ // Extensions or apps
+ // Phishing
+ // Other
+
+ localized_strings.SetString(std::string("issue-page-formatting"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_PAGE_FORMATTING));
+ localized_strings.SetString(std::string("issue-page-load"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_PAGE_LOAD));
+ localized_strings.SetString(std::string("issue-plugins"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_PLUGINS));
+ localized_strings.SetString(std::string("issue-tabs"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_TABS));
+ localized_strings.SetString(std::string("issue-sync"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_SYNC));
+ localized_strings.SetString(std::string("issue-crashes"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_CRASHES));
+ localized_strings.SetString(std::string("issue-extensions"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_EXTENSIONS));
+ localized_strings.SetString(std::string("issue-phishing"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_PHISHING_PAGE));
+ localized_strings.SetString(std::string("issue-other"),
+ l10n_util::GetStringUTF8(IDS_BUGREPORT_OTHER));
+#endif
+
+ SetFontAndTextDirection(&localized_strings);
+
+ const std::string full_html = jstemplate_builder::GetI18nTemplateHtml(
+ bug_report_html_, &localized_strings);
+
+ scoped_refptr<RefCountedBytes> html_bytes(new RefCountedBytes);
+ html_bytes->data.resize(full_html.size());
+ std::copy(full_html.begin(), full_html.end(), html_bytes->data.begin());
+
+ SendResponse(request_id, html_bytes);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// BugErportHandler
+//
+////////////////////////////////////////////////////////////////////////////////
+BugReportHandler::BugReportHandler(TabContents* tab)
+ : profile_(NULL), tab_(tab), screenshot_source_(NULL) {
+ browser_ = BrowserList::GetLastActive();
+}
+
+BugReportHandler::~BugReportHandler() {
+}
+
+void BugReportHandler::ClobberScreenshotsSource() {
+ // Re-create our screenshots data source (this clobbers the last source)
+ // setting the screenshot to NULL, effectively disabling the source
+ // TODO(rkc): Once there is a method to 'remove' a source, change this code
+ ChromeThread::PostTask(
+ ChromeThread::IO, FROM_HERE,
+ NewRunnableMethod(
+ Singleton<ChromeURLDataManager>::get(),
+ &ChromeURLDataManager::AddDataSource,
+ make_scoped_refptr(new DOMUIScreenshotSource(NULL))));
+
+ // clobber last screenshot
+ if (browser::last_screenshot_png)
+ browser::last_screenshot_png->clear();
+}
+
+void BugReportHandler::SetupScreenshotsSource() {
+ // If we don't already have a screenshot source object created, create one.
+ if (!screenshot_source_)
+ screenshot_source_ = new DOMUIScreenshotSource(
+ browser::last_screenshot_png);
+
+ // Add the source to the data manager.
+ ChromeThread::PostTask(
+ ChromeThread::IO, FROM_HERE,
+ NewRunnableMethod(
+ Singleton<ChromeURLDataManager>::get(),
+ &ChromeURLDataManager::AddDataSource,
+ make_scoped_refptr(screenshot_source_)));
+}
+
+DOMMessageHandler* BugReportHandler::Attach(DOMUI* dom_ui) {
+ SetupScreenshotsSource();
+ return DOMMessageHandler::Attach(dom_ui);
+}
+
+base::StringPiece BugReportHandler::Init() {
+ std::string page_url;
+ if (tab_->controller().GetActiveEntry()) {
+ page_url = tab_->controller().GetActiveEntry()->url().spec();
+ }
+
+ std::string params = page_url.substr(strlen(chrome::kChromeUIBugReportURL));
+
+ int index = 0;
+ if (!base::StringToInt(params, &index)) {
+ ClobberScreenshotsSource();
+ return base::StringPiece(
+ ResourceBundle::GetSharedInstance().GetRawDataResource(
+ IDR_BUGREPORT_HTML_INVALID));
+ }
+
+ // Sanity checks.
+ if (((index == 0) && (params != "0")) || (index >= browser_->tab_count())) {
+ ClobberScreenshotsSource();
+ return base::StringPiece(
+ ResourceBundle::GetSharedInstance().GetRawDataResource(
+ IDR_BUGREPORT_HTML_INVALID));
+ }
+
+ if (browser_)
+ target_tab_ = browser_->GetTabContentsAt(index);
+ else
+ LOG(FATAL) << "Failed to get last active browser.";
+
+ return base::StringPiece(
+ ResourceBundle::GetSharedInstance().GetRawDataResource(
+#if defined(OS_CHROMEOS)
+ IDR_BUGREPORT_HTML_CHROMEOS));
+#else
+ IDR_BUGREPORT_HTML));
+#endif
+}
+
+void BugReportHandler::RegisterMessages() {
+ dom_ui_->RegisterMessageCallback("getDialogDefaults",
+ NewCallback(this, &BugReportHandler::HandleGetDialogDefaults));
+ dom_ui_->RegisterMessageCallback("refreshScreenshots",
+ NewCallback(this, &BugReportHandler::HandleRefreshScreenshots));
+ dom_ui_->RegisterMessageCallback("sendReport",
+ NewCallback(this, &BugReportHandler::HandleSendReport));
+ dom_ui_->RegisterMessageCallback("cancel",
+ NewCallback(this, &BugReportHandler::HandleCancel));
+}
+
+void BugReportHandler::HandleGetDialogDefaults(const ListValue*) {
+ // send back values which the dialog js needs initially
+ ListValue dialog_defaults;
+
+ // 0: current url
+ if (target_tab_)
+ dialog_defaults.Append(new StringValue(
+ target_tab_->controller().GetActiveEntry()->url().spec()));
+ else
+ dialog_defaults.Append(new StringValue(""));
+
+#if defined(OS_CHROMEOS)
+ // 1: user e-mail
+ sys_info_ = GetSystemInformation();
+ dialog_defaults.Append(new StringValue(chrome::kAboutSystemURL));
+
+ // 2: user e-mail
+ dialog_defaults.Append(new StringValue(GetUserEmail()));
+#endif
+
+ dom_ui_->CallJavascriptFunction(L"setupDialogDefaults", dialog_defaults);
+}
+
+void BugReportHandler::HandleRefreshScreenshots(const ListValue*) {
+ ListValue screenshots;
+ screenshots.Append(new StringValue(std::string(kCurrentScreenshotUrl)));
+
+
+#if defined(OS_CHROMEOS)
+ std::vector<std::string> saved_screenshots;
+ GetScreenshotUrls(&saved_screenshots);
+
+ ListValue* saved_screenshot_list = new ListValue();
+ for (size_t i = 0; i < saved_screenshots.size(); ++i)
+ saved_screenshot_list->Append(new StringValue(saved_screenshots[i]));
+ screenshots.Append(saved_screenshot_list);
+#endif
+ dom_ui_->CallJavascriptFunction(L"setupScreenshots", screenshots);
+}
+
+void BugReportHandler::HandleSendReport(const ListValue* list_value) {
+ ListValue::const_iterator i = list_value->begin();
+ if (i == list_value->end()) {
+ LOG(ERROR) << "Incorrect data passed to sendReport.";
+ return;
+ }
+
+ // #0 - Problem type.
+ std::string problem_type_str;
+ int problem_type = 0;
+ (*i)->GetAsString(&problem_type_str);
+ if (!base::StringToInt(problem_type_str, &problem_type)) {
+ LOG(ERROR) << "Incorrect data passed to sendReport.";
+ return;
+ }
+ if (++i == list_value->end()) {
+ LOG(ERROR) << "Incorrect data passed to sendReport.";
+ return;
+ }
+
+ // #1 - Page url.
+ std::string page_url;
+ (*i)->GetAsString(&page_url);
+ if (++i == list_value->end()) {
+ LOG(ERROR) << "Incorrect data passed to sendReport.";
+ return;
+ }
+
+ // #2 - Description.
+ std::string description;
+ (*i)->GetAsString(&description);
+ if (++i == list_value->end()) {
+ LOG(ERROR) << "Incorrect data passed to sendReport.";
+ return;
+ }
+
+ // #3 - Screenshot to send.
+ std::string screenshot_path;
+ (*i)->GetAsString(&screenshot_path);
+ screenshot_path.erase(0, strlen(kScreenshotBaseUrl));
+#if defined(OS_CHROMEOS)
+ if (++i == list_value->end()) {
+ LOG(ERROR) << "Incorrect data passed to sendReport.";
+ return;
+ }
+
+ // #4 - User e-mail
+ std::string user_email;
+ (*i)->GetAsString(&user_email);
+ if (++i == list_value->end()) {
+ LOG(ERROR) << "Incorrect data passed to sendReport.";
+ return;
+ }
+
+ // #5 - System info checkbox.
+ std::string sys_info_checkbox;
+ (*i)->GetAsString(&sys_info_checkbox);
+#endif
+
+ // Get the image to send in the report.
+ char* image_data = NULL;
+ int image_data_size = 0;
+ // Make sure this object remains in scope till SendReport returns.
+ std::vector<unsigned char> image;
+ if (screenshot_path.size() > 0) {
+ image = screenshot_source_->GetScreenshot(screenshot_path);
+ image_data = reinterpret_cast<char*>(&(image.front()));
+ image_data_size = image.size();
+ }
+
+ BugReportUtil::SendReport(browser_->profile(),
+ UTF16ToUTF8(target_tab_->GetTitle()),
+ problem_type,
+ page_url,
+ description,
+ image_data,
+ image_data_size, browser::screen_size.width(),
+#if defined(OS_CHROMEOS)
+ browser::screen_size.height(),
+ user_email,
+ ((sys_info_checkbox == "true") ?
+ GetSystemInformation() : NULL));
+#else
+ browser::screen_size.height());
+#endif
+
+ browser_->CloseTabContents(tab_);
+ ClobberScreenshotsSource();
+}
+
+void BugReportHandler::HandleCancel(const ListValue*) {
+ browser_->CloseTabContents(tab_);
+ ClobberScreenshotsSource();
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// BugReportUI
+//
+////////////////////////////////////////////////////////////////////////////////
+BugReportUI::BugReportUI(TabContents* tab) : HtmlDialogUI(tab) {
+ BugReportHandler* handler = new BugReportHandler(tab);
+ AddMessageHandler((handler)->Attach(this));
+
+ // The handler's init will specify which html
+ // resource we'll display to the user
+ BugReportUIHTMLSource* html_source =
+ new BugReportUIHTMLSource(handler->Init());
+ // Set up the chrome://bugreport/ source.
+ ChromeThread::PostTask(
+ ChromeThread::IO, FROM_HERE,
+ NewRunnableMethod(
+ Singleton<ChromeURLDataManager>::get(),
+ &ChromeURLDataManager::AddDataSource,
+ make_scoped_refptr(html_source)));
+}
Property changes on: chrome/browser/dom_ui/bug_report_ui.cc
___________________________________________________________________
Name: svn:eol-style
+ LF
« no previous file with comments | « chrome/browser/dom_ui/bug_report_ui.h ('k') | chrome/browser/dom_ui/dom_ui_factory.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698