172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file.
4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/bug_report_ui.h"
6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <algorithm>
8bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <string>
9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include <vector>
10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/callback.h"
12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/logging.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/singleton.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/weak_ptr.h"
15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/message_loop.h"
16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/string_number_conversions.h"
17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/string_piece.h"
18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/utf_string_conversions.h"
19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/values.h"
20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/bug_report_data.h"
21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/bug_report_util.h"
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/profiles/profile.h"
234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h"
244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser_list.h"
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/browser_window.h"
26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/screenshot_source.h"
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/window_snapshot/window_snapshot.h"
28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/chrome_paths.h"
29bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/jstemplate_builder.h"
30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/common/url_constants.h"
31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/browser_resources.h"
34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/chromium_strings.h"
35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/generated_resources.h"
36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "grit/locale_settings.h"
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h"
3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/rect.h"
4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_CHROMEOS)
42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/file_util.h"
43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/path_service.h"
443f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/synchronization/waitable_event.h"
45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/cros/cros_library.h"
46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/cros/syslogs_library.h"
47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/chromeos/login/user_manager.h"
48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
50201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochnamespace {
51201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
52201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst char kScreenshotBaseUrl[] = "chrome://screenshots/";
53201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst char kCurrentScreenshotUrl[] = "chrome://screenshots/current";
54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_CHROMEOS)
55201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst char kSavedScreenshotsUrl[] = "chrome://screenshots/saved/";
56201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
57201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst char kScreenshotPattern[] = "*.png";
58201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst char kScreenshotsRelativePath[] = "/Screenshots";
59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
60201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst size_t kMaxSavedScreenshots = 2;
61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_CHROMEOS)
64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid GetSavedScreenshots(std::vector<std::string>* saved_screenshots,
66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                         base::WaitableEvent* done) {
67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  saved_screenshots->clear();
68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FilePath fileshelf_path;
70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!PathService::Get(chrome::DIR_DEFAULT_DOWNLOADS,
71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                        &fileshelf_path)) {
72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    done->Signal();
73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // TODO(rkc): Change this to use FilePath.Append() once the cros
77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // issue with it is fixed
78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FilePath screenshots_path(fileshelf_path.value() +
79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                            std::string(kScreenshotsRelativePath));
80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  file_util::FileEnumerator screenshots(screenshots_path, false,
81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                        file_util::FileEnumerator::FILES,
82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                        std::string(kScreenshotPattern));
83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  FilePath screenshot = screenshots.Next();
84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  while (!screenshot.empty()) {
85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    saved_screenshots->push_back(std::string(kSavedScreenshotsUrl) +
86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                 screenshot.BaseName().value());
87201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (saved_screenshots->size() >= kMaxSavedScreenshots)
88201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      break;
89201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    screenshot = screenshots.Next();
91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  done->Signal();
93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// This fuction posts a task to the file thread to create/list all the current
96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// and saved screenshots.
97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid GetScreenshotUrls(std::vector<std::string>* saved_screenshots) {
98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  base::WaitableEvent done(true, false);
99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE,
100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                          NewRunnableFunction(&GetSavedScreenshots,
101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                              saved_screenshots, &done));
102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  done.Wait();
103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstd::string GetUserEmail() {
106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  chromeos::UserManager* manager = chromeos::UserManager::Get();
107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!manager)
108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return std::string();
109bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  else
110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return manager->logged_in_user().email();
111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
113201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
114201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Returns the index of the feedback tab if already open, -1 otherwise
115201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochint GetIndexOfFeedbackTab(Browser* browser) {
116201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  GURL bug_report_url(chrome::kChromeUIBugReportURL);
117201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (int i = 0; i < browser->tab_count(); ++i) {
118201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    TabContents* tab = browser->GetTabContentsAt(i);
119201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (tab && tab->GetURL().GetWithEmptyPath() == bug_report_url)
120201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return i;
121201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
122201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
123201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return -1;
124201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
125201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
126bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}  // namespace
127bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
128bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
129bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace browser {
130bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
131bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// TODO(rkc): Eventually find a better way to do this
132bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenstd::vector<unsigned char>* last_screenshot_png = 0;
133bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsengfx::Rect screen_size;
134bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid RefreshLastScreenshot(Browser* browser) {
136bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (last_screenshot_png)
137bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    last_screenshot_png->clear();
138bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  else
139bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    last_screenshot_png = new std::vector<unsigned char>;
140bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  gfx::NativeWindow native_window = browser->window()->GetNativeHandle();
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  screen_size = browser::GrabWindowSnapshot(native_window, last_screenshot_png);
143bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
144bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid ShowHtmlBugReportView(Browser* browser) {
146201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // First check if we're already open (we cannot depend on ShowSingletonTab
147201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // for this functionality since we need to make *sure* we never get
148201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // instantiated again while we are open - with singleton tabs, that can
149201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // happen)
150201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  int feedback_tab_index = GetIndexOfFeedbackTab(browser);
151201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (feedback_tab_index >=0) {
152201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Do not refresh screenshot, do not create a new tab
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    browser->ActivateTabAt(feedback_tab_index, true);
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return;
155201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
156bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  RefreshLastScreenshot(browser);
158201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  std::string bug_report_url = std::string(chrome::kChromeUIBugReportURL) +
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      "#" + base::IntToString(browser->active_index());
160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  browser->ShowSingletonTab(GURL(bug_report_url));
161bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
162bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
163bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}  // namespace browser
164bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
165bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
166bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenclass BugReportUIHTMLSource : public ChromeURLDataManager::DataSource {
167bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
168bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  explicit BugReportUIHTMLSource(base::StringPiece html);
169bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
170bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Called when the network layer has requested a resource underneath
171bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // the path we registered.
172bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void StartDataRequest(const std::string& path,
173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                bool is_incognito,
174bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                                int request_id);
175bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual std::string GetMimeType(const std::string&) const {
176bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return "text/html";
177bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
178bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
179bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen private:
180bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  base::StringPiece bug_report_html_;
181bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ~BugReportUIHTMLSource() {}
182bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
183bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(BugReportUIHTMLSource);
184bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
185bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
186bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// The handler for Javascript messages related to the "bug report" dialog
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass BugReportHandler : public WebUIMessageHandler,
188bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen                         public base::SupportsWeakPtr<BugReportHandler> {
189bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen public:
190bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  explicit BugReportHandler(TabContents* tab);
191bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual ~BugReportHandler();
192bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
193bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Init work after Attach.
194bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  base::StringPiece Init();
195bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // WebUIMessageHandler implementation.
19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual WebUIMessageHandler* Attach(WebUI* web_ui);
198bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  virtual void RegisterMessages();
199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick private:
201731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void HandleGetDialogDefaults(const ListValue* args);
202201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void HandleRefreshCurrentScreenshot(const ListValue* args);
203201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#if defined(OS_CHROMEOS)
204201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void HandleRefreshSavedScreenshots(const ListValue* args);
205201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#endif
206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void HandleSendReport(const ListValue* args);
207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void HandleCancel(const ListValue* args);
208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void HandleOpenSystemTab(const ListValue* args);
209bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
210bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void SetupScreenshotsSource();
211bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  void ClobberScreenshotsSource();
212731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
213513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void CancelFeedbackCollection();
214513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void CloseFeedbackTab();
215bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
216bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  TabContents* tab_;
217dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ScreenshotSource* screenshot_source_;
218bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
219513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  BugReportData* bug_report_;
220513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  std::string target_tab_url_;
221bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_CHROMEOS)
222bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Variables to track SyslogsLibrary::RequestSyslogs callback.
223bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  chromeos::SyslogsLibrary::Handle syslogs_handle_;
224bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  CancelableRequestConsumer syslogs_consumer_;
225bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
226bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
227bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(BugReportHandler);
228bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen};
229bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
230bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
231bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//
232bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// BugReportHTMLSource
233bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//
234bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
235bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
236bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenBugReportUIHTMLSource::BugReportUIHTMLSource(base::StringPiece html)
237bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    : DataSource(chrome::kChromeUIBugReportHost, MessageLoop::current()) {
238bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  bug_report_html_ = html;
239bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
240bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
241bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid BugReportUIHTMLSource::StartDataRequest(const std::string& path,
242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                             bool is_incognito,
243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                             int request_id) {
244bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  DictionaryValue localized_strings;
245bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("title"),
246bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_TITLE));
247201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  localized_strings.SetString(std::string("page-title"),
248201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      l10n_util::GetStringUTF8(IDS_BUGREPORT_REPORT_PAGE_TITLE));
249bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("issue-with"),
250bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_ISSUE_WITH));
251bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("page-url"),
252bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_REPORT_URL_LABEL));
253bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("description"),
254bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_DESCRIPTION_LABEL));
255201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  localized_strings.SetString(std::string("current-screenshot"),
256bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_SCREENSHOT_LABEL));
257201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  localized_strings.SetString(std::string("saved-screenshot"),
258201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      l10n_util::GetStringUTF8(IDS_BUGREPORT_SAVED_SCREENSHOT_LABEL));
259bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_CHROMEOS)
260bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("user-email"),
261bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_USER_EMAIL_LABEL));
262201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  localized_strings.SetString(std::string("sysinfo"),
263201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      l10n_util::GetStringUTF8(
264201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          IDS_BUGREPORT_INCLUDE_SYSTEM_INFORMATION_CHKBOX));
265201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
266bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("currentscreenshots"),
267bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_CURRENT_SCREENSHOTS));
268bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("savedscreenshots"),
269bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_SAVED_SCREENSHOTS));
270201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
271201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  localized_strings.SetString(std::string("choose-different-screenshot"),
272bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(
273201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          IDS_BUGREPORT_CHOOSE_DIFFERENT_SCREENSHOT));
274201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  localized_strings.SetString(std::string("choose-original-screenshot"),
275201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      l10n_util::GetStringUTF8(
276201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          IDS_BUGREPORT_CHOOSE_ORIGINAL_SCREENSHOT));
277bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#else
278bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("currentscreenshots"),
279bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_INCLUDE_NEW_SCREEN_IMAGE));
280bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
281bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("noscreenshot"),
282bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_INCLUDE_NO_SCREENSHOT));
283bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
284bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("send-report"),
285bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_SEND_REPORT));
286bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("cancel"),
287bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_CANCEL));
288bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
289bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Option strings for the "issue with" drop-down.
290bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("issue-choose"),
291bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_CHOOSE_ISSUE));
292bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
293bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("no-issue-selected"),
294bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_NO_ISSUE_SELECTED));
295bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
296201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  localized_strings.SetString(std::string("no-description"),
297201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      l10n_util::GetStringUTF8(IDS_BUGREPORT_NO_DESCRIPTION));
298201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
299201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  localized_strings.SetString(std::string("no-saved-screenshots"),
300201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      l10n_util::GetStringUTF8(IDS_BUGREPORT_NO_SAVED_SCREENSHOTS_HELP));
301201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
302201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  localized_strings.SetString(std::string("privacy-note"),
303201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      l10n_util::GetStringUTF8(IDS_BUGREPORT_PRIVACY_NOTE));
304bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
305bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // TODO(rkc): Find some way to ensure this order of dropdowns is in sync
306bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // with the order in the userfeedback ChromeData proto buffer
307bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_CHROMEOS)
308bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Dropdown for ChromeOS:
309bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  //
310bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Connectivity
311bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Sync
312bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Crash
313bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Page Formatting
314bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Extensions or Apps
315bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Standby or Resume
316bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Phishing Page
317bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // General Feedback/Other
318bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
319bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("issue-connectivity"),
320bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_CONNECTIVITY));
321bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("issue-sync"),
322bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_SYNC));
323bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("issue-crashes"),
324bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_CRASHES));
325bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("issue-page-formatting"),
326bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_PAGE_FORMATTING));
327bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("issue-extensions"),
328bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_EXTENSIONS));
329bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("issue-standby"),
330bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_STANDBY_RESUME));
331bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("issue-phishing"),
332bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_PHISHING_PAGE));
333bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("issue-other"),
334bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_GENERAL));
335bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#else
336bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Dropdown for Chrome:
337bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  //
338bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Page formatting or layout
339bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Pages not loading
340bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Plug-ins (e.g. Adobe Flash Player, Quicktime, etc)
341bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Tabs or windows
342bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Synced preferences
343bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Crashes
344bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Extensions or apps
345bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Phishing
346bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Other
347bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
348bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("issue-page-formatting"),
349bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_PAGE_FORMATTING));
350bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("issue-page-load"),
351bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_PAGE_LOAD));
352bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("issue-plugins"),
353bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_PLUGINS));
354bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("issue-tabs"),
355bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_TABS));
356bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("issue-sync"),
357bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_SYNC));
358bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("issue-crashes"),
359bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_CRASHES));
360bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("issue-extensions"),
361bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_EXTENSIONS));
362bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("issue-phishing"),
363bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_PHISHING_PAGE));
364bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  localized_strings.SetString(std::string("issue-other"),
365bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      l10n_util::GetStringUTF8(IDS_BUGREPORT_OTHER));
366bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
367bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
368bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SetFontAndTextDirection(&localized_strings);
369bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
370bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  const std::string full_html = jstemplate_builder::GetI18nTemplateHtml(
371bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      bug_report_html_, &localized_strings);
372bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
373bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  scoped_refptr<RefCountedBytes> html_bytes(new RefCountedBytes);
374bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  html_bytes->data.resize(full_html.size());
375bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::copy(full_html.begin(), full_html.end(), html_bytes->data.begin());
376bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
377bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SendResponse(request_id, html_bytes);
378bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
379bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
380513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
381bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
382bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//
383513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// BugReportData
384bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//
385bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
386513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BugReportData::SendReport() {
387bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_CHROMEOS)
388513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // In case we already got the syslogs and sent the report, leave
389513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (sent_report_) return;
390513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Set send_report_ so that no one else processes SendReport
391513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  sent_report_ = true;
392bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
393bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
394513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  int image_data_size = image_.size();
395513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  char* image_data = image_data_size ?
396513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      reinterpret_cast<char*>(&(image_.front())) : NULL;
397513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  BugReportUtil::SendReport(profile_
398513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                            , problem_type_
399513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                            , page_url_
400513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                            , description_
401513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                            , image_data
402513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                            , image_data_size
403513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                            , browser::screen_size.width()
404513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                            , browser::screen_size.height()
405513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#if defined(OS_CHROMEOS)
406513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                            , user_email_
407513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                            , zip_content_ ? zip_content_->c_str() : NULL
408513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                            , zip_content_ ? zip_content_->length() : 0
409513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                            , send_sys_info_ ? sys_info_ : NULL
410513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif
411513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                            );
412513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
413bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_CHROMEOS)
414731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (sys_info_) {
415731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    delete sys_info_;
416731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    sys_info_ = NULL;
417731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
418731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (zip_content_) {
419731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    delete zip_content_;
420731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    zip_content_ = NULL;
421731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
422bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
423513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
424513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Once the report has been sent, this object has no purpose in life, delete
425513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // ourselves.
426513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  delete this;
427513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
428513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
429513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
430513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch////////////////////////////////////////////////////////////////////////////////
431513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch//
432513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// BugReportHandler
433513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch//
434513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch////////////////////////////////////////////////////////////////////////////////
435513209b27ff55e2841eac0e4120199c23acce758Ben MurdochBugReportHandler::BugReportHandler(TabContents* tab)
43672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : tab_(tab),
43772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      screenshot_source_(NULL),
43872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      bug_report_(NULL)
439513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#if defined(OS_CHROMEOS)
440513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    , syslogs_handle_(0)
441513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif
442513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch{
443513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
444513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
445513209b27ff55e2841eac0e4120199c23acce758Ben MurdochBugReportHandler::~BugReportHandler() {
446513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Just in case we didn't send off bug_report_ to SendReport
447201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (bug_report_) {
448201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // If we're deleting the report object, cancel feedback collection first
449201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    CancelFeedbackCollection();
450513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    delete bug_report_;
451201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
452bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
453bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
454bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid BugReportHandler::ClobberScreenshotsSource() {
455bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Re-create our screenshots data source (this clobbers the last source)
456bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // setting the screenshot to NULL, effectively disabling the source
457bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // TODO(rkc): Once there is a method to 'remove' a source, change this code
45872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  tab_->profile()->GetChromeURLDataManager()->AddDataSource(
459dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      new ScreenshotSource(NULL));
460bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
461bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // clobber last screenshot
462bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser::last_screenshot_png)
463bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    browser::last_screenshot_png->clear();
464bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
465bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
466bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid BugReportHandler::SetupScreenshotsSource() {
467bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // If we don't already have a screenshot source object created, create one.
468bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!screenshot_source_)
469dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    screenshot_source_ = new ScreenshotSource(
470bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        browser::last_screenshot_png);
471bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
472bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Add the source to the data manager.
47372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  tab_->profile()->GetChromeURLDataManager()->AddDataSource(screenshot_source_);
474bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
475bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
47672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenWebUIMessageHandler* BugReportHandler::Attach(WebUI* web_ui) {
477bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SetupScreenshotsSource();
47872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return WebUIMessageHandler::Attach(web_ui);
479bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
480bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
481bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbase::StringPiece BugReportHandler::Init() {
482bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string page_url;
483bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (tab_->controller().GetActiveEntry()) {
484bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen     page_url = tab_->controller().GetActiveEntry()->url().spec();
485bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
486bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
487bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string params = page_url.substr(strlen(chrome::kChromeUIBugReportURL));
488bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Erase the # - the first character.
489bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (params.length())
490bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    params.erase(params.begin(), params.begin() + 1);
491bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
492bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  int index = 0;
493bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (!base::StringToInt(params, &index)) {
494bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return base::StringPiece(
495bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        ResourceBundle::GetSharedInstance().GetRawDataResource(
496bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen            IDR_BUGREPORT_HTML_INVALID));
497bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
498bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
499bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Browser* browser = BrowserList::GetLastActive();
500bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Sanity checks.
501bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (((index == 0) && (params != "0")) || !browser ||
502bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      index >= browser->tab_count()) {
503bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return base::StringPiece(
504bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen        ResourceBundle::GetSharedInstance().GetRawDataResource(
505bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen            IDR_BUGREPORT_HTML_INVALID));
506bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
507bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
508731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  TabContents* target_tab = browser->GetTabContentsAt(index);
509731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (target_tab) {
51021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    target_tab_url_ = target_tab->GetURL().spec();
511731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
512bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
513bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Setup the screenshot source after we've verified input is legit.
514bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  SetupScreenshotsSource();
515bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
516bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  return base::StringPiece(
517bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      ResourceBundle::GetSharedInstance().GetRawDataResource(
518bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen          IDR_BUGREPORT_HTML));
519bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
520bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
521bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid BugReportHandler::RegisterMessages() {
52272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("getDialogDefaults",
523bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      NewCallback(this, &BugReportHandler::HandleGetDialogDefaults));
52472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("refreshCurrentScreenshot",
525201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      NewCallback(this, &BugReportHandler::HandleRefreshCurrentScreenshot));
526201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#if defined(OS_CHROMEOS)
52772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("refreshSavedScreenshots",
528201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      NewCallback(this, &BugReportHandler::HandleRefreshSavedScreenshots));
529201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#endif
53072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("sendReport",
531bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      NewCallback(this, &BugReportHandler::HandleSendReport));
53272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("cancel",
533bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      NewCallback(this, &BugReportHandler::HandleCancel));
53472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  web_ui_->RegisterMessageCallback("openSystemTab",
535731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      NewCallback(this, &BugReportHandler::HandleOpenSystemTab));
536bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
537bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
538bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid BugReportHandler::HandleGetDialogDefaults(const ListValue*) {
539513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bug_report_ = new BugReportData();
540513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
541bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // send back values which the dialog js needs initially
542bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ListValue dialog_defaults;
543bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
544bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // 0: current url
545731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (target_tab_url_.length())
546731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    dialog_defaults.Append(new StringValue(target_tab_url_));
547bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  else
548bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    dialog_defaults.Append(new StringValue(""));
549bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
550bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_CHROMEOS)
551bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // 1: about:system
552bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  dialog_defaults.Append(new StringValue(chrome::kChromeUISystemInfoURL));
553bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Trigger the request for system information here.
554bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  chromeos::SyslogsLibrary* syslogs_lib =
555bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      chromeos::CrosLibrary::Get()->GetSyslogsLibrary();
556bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (syslogs_lib) {
557bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    syslogs_handle_ = syslogs_lib->RequestSyslogs(
558513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        true, true, &syslogs_consumer_,
559513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        NewCallback(bug_report_, &BugReportData::SyslogsComplete));
560bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
561bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // 2: user e-mail
562bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  dialog_defaults.Append(new StringValue(GetUserEmail()));
563bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
564bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
565ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  web_ui_->CallJavascriptFunction("setupDialogDefaults", dialog_defaults);
566bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
567bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
568201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid BugReportHandler::HandleRefreshCurrentScreenshot(const ListValue*) {
569201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  std::string current_screenshot(kCurrentScreenshotUrl);
570201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  StringValue screenshot(current_screenshot);
571ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  web_ui_->CallJavascriptFunction("setupCurrentScreenshot", screenshot);
572201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
573bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
574bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
575bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_CHROMEOS)
576201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid BugReportHandler::HandleRefreshSavedScreenshots(const ListValue*) {
577bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::vector<std::string> saved_screenshots;
578bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  GetScreenshotUrls(&saved_screenshots);
579bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
580201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ListValue screenshots_list;
581bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  for (size_t i = 0; i < saved_screenshots.size(); ++i)
582201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    screenshots_list.Append(new StringValue(saved_screenshots[i]));
583ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  web_ui_->CallJavascriptFunction("setupSavedScreenshots", screenshots_list);
584bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
585201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#endif
586201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
587bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
588bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid BugReportHandler::HandleSendReport(const ListValue* list_value) {
5893f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  if (!bug_report_) {
5903f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    LOG(ERROR) << "Bug report hasn't been intialized yet.";
5913f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    return;
5923f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  }
5933f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
594bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  ListValue::const_iterator i = list_value->begin();
595bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (i == list_value->end()) {
596bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    LOG(ERROR) << "Incorrect data passed to sendReport.";
597bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
598bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
599bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
600bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // #0 - Problem type.
601513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  int problem_type;
602bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string problem_type_str;
603bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  (*i)->GetAsString(&problem_type_str);
604513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!base::StringToInt(problem_type_str, &problem_type)) {
605bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    LOG(ERROR) << "Incorrect data passed to sendReport.";
606bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
607bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
608bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (++i == list_value->end()) {
609bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    LOG(ERROR) << "Incorrect data passed to sendReport.";
610bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
611bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
612bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
613bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // #1 - Page url.
614513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  std::string page_url;
615513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  (*i)->GetAsString(&page_url);
616bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (++i == list_value->end()) {
617bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    LOG(ERROR) << "Incorrect data passed to sendReport.";
618bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
619bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
620bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
621bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // #2 - Description.
622513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  std::string description;
623513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  (*i)->GetAsString(&description);
624bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (++i == list_value->end()) {
625bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    LOG(ERROR) << "Incorrect data passed to sendReport.";
626bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
627bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
628bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
629bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // #3 -  Screenshot to send.
630bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string screenshot_path;
631bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  (*i)->GetAsString(&screenshot_path);
632bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  screenshot_path.erase(0, strlen(kScreenshotBaseUrl));
633bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
634bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Get the image to send in the report.
635513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  std::vector<unsigned char> image;
636dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!screenshot_path.empty())
637513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    image = screenshot_source_->GetScreenshot(screenshot_path);
638bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
639bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_CHROMEOS)
640bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (++i == list_value->end()) {
641bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    LOG(ERROR) << "Incorrect data passed to sendReport.";
642bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
643bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
644bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
645bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // #4 - User e-mail
646513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  std::string user_email;
647513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  (*i)->GetAsString(&user_email);
648bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (++i == list_value->end()) {
649bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    LOG(ERROR) << "Incorrect data passed to sendReport.";
650bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    return;
651bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
652bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
653bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // #5 - System info checkbox.
654bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  std::string sys_info_checkbox;
655bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  (*i)->GetAsString(&sys_info_checkbox);
656513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool send_sys_info = (sys_info_checkbox == "true");
657513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
658513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // If we aren't sending the sys_info, cancel the gathering of the syslogs.
659513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!send_sys_info)
660513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    CancelFeedbackCollection();
661201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#endif
662513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
663513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Update the data in bug_report_ so it can be sent
66472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bug_report_->UpdateData(web_ui_->GetProfile()
665513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                          , target_tab_url_
666513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                          , problem_type
667513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                          , page_url
668513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                          , description
669513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                          , image
670513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#if defined(OS_CHROMEOS)
671513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                          , user_email
672513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                          , send_sys_info
673513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                          , false // sent_report
674513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif
675513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                          );
676bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
677201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#if defined(OS_CHROMEOS)
678bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // If we don't require sys_info, or we have it, or we never requested it
679bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // (because libcros failed to load), then send the report now.
680bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Otherwise, the report will get sent when we receive sys_info.
681513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (!send_sys_info || bug_report_->sys_info() != NULL ||
682513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      syslogs_handle_ == 0) {
683513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    bug_report_->SendReport();
684bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
685bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#else
686513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bug_report_->SendReport();
687bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
688513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Lose the pointer to the BugReportData object; the object will delete itself
689513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // from SendReport, whether we called it, or will be called by the log
690513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // completion routine.
691513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bug_report_ = NULL;
692513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
693513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Whether we sent the report, or if it will be sent by the Syslogs complete
694513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // function, close our feedback tab anyway, we have no more use for it.
695513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CloseFeedbackTab();
696bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
697bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
698513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BugReportHandler::HandleCancel(const ListValue*) {
699513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  CloseFeedbackTab();
700bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
701bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
702513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BugReportHandler::HandleOpenSystemTab(const ListValue* args) {
703bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#if defined(OS_CHROMEOS)
704513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  BrowserList::GetLastActive()->OpenSystemTabAndActivate();
705bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#endif
706bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
707bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
708513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BugReportHandler::CancelFeedbackCollection() {
709731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if defined(OS_CHROMEOS)
710513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (syslogs_handle_ != 0) {
711513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    chromeos::SyslogsLibrary* syslogs_lib =
712513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        chromeos::CrosLibrary::Get()->GetSyslogsLibrary();
713513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (syslogs_lib)
714513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      syslogs_lib->CancelRequest(syslogs_handle_);
715513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
716731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif
717731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
718731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
719513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid BugReportHandler::CloseFeedbackTab() {
720ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ClobberScreenshotsSource();
721ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
722bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  Browser* browser = BrowserList::GetLastActive();
723bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  if (browser) {
724bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    browser->CloseTabContents(tab_);
725bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  } else {
726bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen    LOG(FATAL) << "Failed to get last active browser.";
727bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  }
728bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
729bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
730bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
731bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//
732bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// BugReportUI
733bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen//
734bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen////////////////////////////////////////////////////////////////////////////////
735bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenBugReportUI::BugReportUI(TabContents* tab) : HtmlDialogUI(tab) {
736bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  BugReportHandler* handler = new BugReportHandler(tab);
737bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  AddMessageHandler((handler)->Attach(this));
738bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen
739bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // The handler's init will specify which html
740bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // resource we'll display to the user
741bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  BugReportUIHTMLSource* html_source =
742bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen      new BugReportUIHTMLSource(handler->Init());
743bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen  // Set up the chrome://bugreport/ source.
74472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  tab->profile()->GetChromeURLDataManager()->AddDataSource(html_source);
745bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen}
746