OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/dom_ui/bug_report_ui.h" | 5 #include "chrome/browser/dom_ui/bug_report_ui.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 done.Wait(); | 109 done.Wait(); |
110 } | 110 } |
111 | 111 |
112 std::string GetUserEmail() { | 112 std::string GetUserEmail() { |
113 chromeos::UserManager* manager = chromeos::UserManager::Get(); | 113 chromeos::UserManager* manager = chromeos::UserManager::Get(); |
114 if (!manager) | 114 if (!manager) |
115 return std::string(); | 115 return std::string(); |
116 else | 116 else |
117 return manager->logged_in_user().email(); | 117 return manager->logged_in_user().email(); |
118 } | 118 } |
| 119 #endif |
119 | 120 |
120 #endif | 121 // Returns the index of the feedback tab if already open, -1 otherwise |
| 122 int GetIndexOfFeedbackTab(Browser* browser) { |
| 123 GURL bug_report_url(chrome::kChromeUIBugReportURL); |
| 124 for (int i = 0; i < browser->tab_count(); ++i) { |
| 125 TabContents* tab = browser->GetTabContentsAt(i); |
| 126 if (tab && tab->GetURL().GetWithEmptyPath() == bug_report_url) |
| 127 return i; |
| 128 } |
| 129 |
| 130 return -1; |
| 131 } |
| 132 |
121 } // namespace | 133 } // namespace |
122 | 134 |
123 | 135 |
124 namespace browser { | 136 namespace browser { |
125 | 137 |
126 // TODO(rkc): Eventually find a better way to do this | 138 // TODO(rkc): Eventually find a better way to do this |
127 std::vector<unsigned char>* last_screenshot_png = 0; | 139 std::vector<unsigned char>* last_screenshot_png = 0; |
128 gfx::Rect screen_size; | 140 gfx::Rect screen_size; |
129 | 141 |
| 142 // Get bounds in different ways for different OS's; |
| 143 #if defined(TOOLKIT_VIEWS) |
| 144 // Windows/ChromeOS support Views - so we get dimensions from the |
| 145 // views::Window object |
130 void RefreshLastScreenshot(views::Window* parent) { | 146 void RefreshLastScreenshot(views::Window* parent) { |
| 147 gfx::NativeWindow window = parent->GetNativeWindow(); |
| 148 int width = parent->GetBounds().width(); |
| 149 int height = parent->GetBounds().height(); |
| 150 #elif defined(OS_LINUX) |
| 151 // Linux provides its bounds and a native window handle to the screen |
| 152 void RefreshLastScreenshot(gfx::NativeWindow window, |
| 153 const gfx::Rect& bounds) { |
| 154 int width = bounds.width(); |
| 155 int height = bounds.height(); |
| 156 #elif defined(OS_MACOSX) |
| 157 // Mac gets its bounds from the GrabWindowSnapshot function |
| 158 void RefreshLastScreenshot(NSWindow* window) { |
| 159 int width = 0; |
| 160 int height = 0; |
| 161 #endif |
| 162 |
131 // Grab an exact snapshot of the window that the user is seeing (i.e. as | 163 // Grab an exact snapshot of the window that the user is seeing (i.e. as |
132 // rendered--do not re-render, and include windowed plugins). | 164 // rendered--do not re-render, and include windowed plugins). |
133 if (last_screenshot_png) | 165 if (last_screenshot_png) |
134 last_screenshot_png->clear(); | 166 last_screenshot_png->clear(); |
135 else | 167 else |
136 last_screenshot_png = new std::vector<unsigned char>; | 168 last_screenshot_png = new std::vector<unsigned char>; |
137 | 169 |
138 #if defined(USE_X11) | 170 #if defined(USE_X11) |
139 screen_size = parent->GetBounds(); | 171 x11_util::GrabWindowSnapshot(window, last_screenshot_png); |
140 x11_util::GrabWindowSnapshot(parent->GetNativeWindow(), last_screenshot_png); | |
141 #elif defined(OS_MACOSX) | 172 #elif defined(OS_MACOSX) |
142 int width = 0, height = 0; | 173 mac_util::GrabWindowSnapshot(window, last_screenshot_png, &width, &height); |
143 mac_util::GrabWindowSnapshot(parent->GetNativeWindow(), last_screenshot_png, | |
144 &width, &height); | |
145 #elif defined(OS_WIN) | 174 #elif defined(OS_WIN) |
146 screen_size = parent->GetBounds(); | 175 win_util::GrabWindowSnapshot(window, last_screenshot_png); |
147 win_util::GrabWindowSnapshot(parent->GetNativeWindow(), last_screenshot_png); | |
148 #endif | 176 #endif |
| 177 |
| 178 screen_size.set_width(width); |
| 179 screen_size.set_height(height); |
149 } | 180 } |
150 | 181 |
151 // Global "display this dialog" function declared in browser_dialogs.h. | 182 #if defined(TOOLKIT_VIEWS) |
152 void ShowHtmlBugReportView(views::Window* parent, Browser* browser) { | 183 void ShowHtmlBugReportView(views::Window* parent, Browser* browser) { |
| 184 #elif defined(OS_LINUX) |
| 185 void ShowHtmlBugReportView(gfx::NativeWindow window, const gfx::Rect& bounds, |
| 186 Browser* browser) { |
| 187 #elif defined(OS_MACOSX) |
| 188 void ShowHtmlBugReportView(NSWindow* window, Browser* browser) { |
| 189 #endif |
| 190 |
| 191 // First check if we're already open (we cannot depend on ShowSingletonTab |
| 192 // for this functionality since we need to make *sure* we never get |
| 193 // instantiated again while we are open - with singleton tabs, that can |
| 194 // happen) |
| 195 int feedback_tab_index = GetIndexOfFeedbackTab(browser); |
| 196 if (feedback_tab_index >=0) { |
| 197 // Do not refresh screenshot, do not create a new tab |
| 198 browser->SelectTabContentsAt(feedback_tab_index, true); |
| 199 } |
| 200 |
| 201 // now for refreshing the last screenshot |
| 202 #if defined(TOOLKIT_VIEWS) |
| 203 RefreshLastScreenshot(parent); |
| 204 #elif defined(OS_LINUX) |
| 205 RefreshLastScreenshot(window, bounds); |
| 206 #elif defined(OS_MACOSX) |
| 207 RefreshLastScreenshot(window); |
| 208 #endif |
| 209 |
153 std::string bug_report_url = std::string(chrome::kChromeUIBugReportURL) + | 210 std::string bug_report_url = std::string(chrome::kChromeUIBugReportURL) + |
154 "#" + base::IntToString(browser->selected_index()); | 211 "#" + base::IntToString(browser->selected_index()); |
155 | |
156 RefreshLastScreenshot(parent); | |
157 browser->ShowSingletonTab(GURL(bug_report_url), false); | 212 browser->ShowSingletonTab(GURL(bug_report_url), false); |
158 } | 213 } |
159 | 214 |
160 } // namespace browser | 215 } // namespace browser |
161 | 216 |
162 | 217 |
163 class BugReportUIHTMLSource : public ChromeURLDataManager::DataSource { | 218 class BugReportUIHTMLSource : public ChromeURLDataManager::DataSource { |
164 public: | 219 public: |
165 explicit BugReportUIHTMLSource(base::StringPiece html); | 220 explicit BugReportUIHTMLSource(base::StringPiece html); |
166 | 221 |
(...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
655 } | 710 } |
656 | 711 |
657 // #5 - System info checkbox. | 712 // #5 - System info checkbox. |
658 std::string sys_info_checkbox; | 713 std::string sys_info_checkbox; |
659 (*i)->GetAsString(&sys_info_checkbox); | 714 (*i)->GetAsString(&sys_info_checkbox); |
660 bool send_sys_info = (sys_info_checkbox == "true"); | 715 bool send_sys_info = (sys_info_checkbox == "true"); |
661 | 716 |
662 // If we aren't sending the sys_info, cancel the gathering of the syslogs. | 717 // If we aren't sending the sys_info, cancel the gathering of the syslogs. |
663 if (!send_sys_info) | 718 if (!send_sys_info) |
664 CancelFeedbackCollection(); | 719 CancelFeedbackCollection(); |
| 720 #endif |
665 | 721 |
666 // Update the data in bug_report_ so it can be sent | 722 // Update the data in bug_report_ so it can be sent |
667 bug_report_->UpdateData(dom_ui_->GetProfile() | 723 bug_report_->UpdateData(dom_ui_->GetProfile() |
668 , target_tab_url_ | 724 , target_tab_url_ |
669 , target_tab_title_ | 725 , target_tab_title_ |
670 , problem_type | 726 , problem_type |
671 , page_url | 727 , page_url |
672 , description | 728 , description |
673 , image | 729 , image |
674 #if defined(OS_CHROMEOS) | 730 #if defined(OS_CHROMEOS) |
675 , user_email | 731 , user_email |
676 , send_sys_info | 732 , send_sys_info |
677 , false // sent_report | 733 , false // sent_report |
678 #endif | 734 #endif |
679 ); | 735 ); |
680 | 736 |
| 737 #if defined(OS_CHROMEOS) |
681 // If we don't require sys_info, or we have it, or we never requested it | 738 // If we don't require sys_info, or we have it, or we never requested it |
682 // (because libcros failed to load), then send the report now. | 739 // (because libcros failed to load), then send the report now. |
683 // Otherwise, the report will get sent when we receive sys_info. | 740 // Otherwise, the report will get sent when we receive sys_info. |
684 if (!send_sys_info || bug_report_->sys_info() != NULL || | 741 if (!send_sys_info || bug_report_->sys_info() != NULL || |
685 syslogs_handle_ == 0) { | 742 syslogs_handle_ == 0) { |
686 bug_report_->SendReport(); | 743 bug_report_->SendReport(); |
687 } | 744 } |
688 #else | 745 #else |
689 bug_report_->SendReport(); | 746 bug_report_->SendReport(); |
690 #endif | 747 #endif |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
743 BugReportUIHTMLSource* html_source = | 800 BugReportUIHTMLSource* html_source = |
744 new BugReportUIHTMLSource(handler->Init()); | 801 new BugReportUIHTMLSource(handler->Init()); |
745 // Set up the chrome://bugreport/ source. | 802 // Set up the chrome://bugreport/ source. |
746 BrowserThread::PostTask( | 803 BrowserThread::PostTask( |
747 BrowserThread::IO, FROM_HERE, | 804 BrowserThread::IO, FROM_HERE, |
748 NewRunnableMethod( | 805 NewRunnableMethod( |
749 Singleton<ChromeURLDataManager>::get(), | 806 Singleton<ChromeURLDataManager>::get(), |
750 &ChromeURLDataManager::AddDataSource, | 807 &ChromeURLDataManager::AddDataSource, |
751 make_scoped_refptr(html_source))); | 808 make_scoped_refptr(html_source))); |
752 } | 809 } |
OLD | NEW |