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