OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/browser_about_handler.h" | 5 #include "chrome/browser/ui/webui/about_ui.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "base/bind_helpers.h" | 12 #include "base/bind_helpers.h" |
13 #include "base/callback.h" | 13 #include "base/callback.h" |
14 #include "base/command_line.h" | 14 #include "base/command_line.h" |
15 #include "base/file_util.h" | 15 #include "base/file_util.h" |
16 #include "base/i18n/number_formatting.h" | 16 #include "base/i18n/number_formatting.h" |
17 #include "base/json/json_writer.h" | 17 #include "base/json/json_writer.h" |
18 #include "base/memory/singleton.h" | 18 #include "base/memory/singleton.h" |
19 #include "base/metrics/histogram.h" | 19 #include "base/metrics/histogram.h" |
20 #include "base/metrics/stats_table.h" | 20 #include "base/metrics/stats_table.h" |
21 #include "base/path_service.h" | 21 #include "base/path_service.h" |
22 #include "base/string_number_conversions.h" | 22 #include "base/string_number_conversions.h" |
23 #include "base/string_piece.h" | 23 #include "base/string_piece.h" |
24 #include "base/string_util.h" | 24 #include "base/string_util.h" |
25 #include "base/stringprintf.h" | 25 #include "base/stringprintf.h" |
26 #include "base/threading/thread.h" | 26 #include "base/threading/thread.h" |
27 #include "base/utf_string_conversions.h" | 27 #include "base/utf_string_conversions.h" |
28 #include "base/values.h" | 28 #include "base/values.h" |
29 #include "chrome/browser/about_flags.h" | 29 #include "chrome/browser/about_flags.h" |
| 30 #include "chrome/browser/browser_about_handler.h" |
30 #include "chrome/browser/browser_process.h" | 31 #include "chrome/browser/browser_process.h" |
31 #include "chrome/browser/defaults.h" | 32 #include "chrome/browser/defaults.h" |
32 #include "chrome/browser/memory_details.h" | 33 #include "chrome/browser/memory_details.h" |
33 #include "chrome/browser/metrics/histogram_synchronizer.h" | 34 #include "chrome/browser/metrics/histogram_synchronizer.h" |
34 #include "chrome/browser/net/predictor.h" | 35 #include "chrome/browser/net/predictor.h" |
35 #include "chrome/browser/net/url_fixer_upper.h" | 36 #include "chrome/browser/net/url_fixer_upper.h" |
36 #include "chrome/browser/plugin_prefs.h" | 37 #include "chrome/browser/plugin_prefs.h" |
37 #include "chrome/browser/profiles/profile.h" | 38 #include "chrome/browser/profiles/profile.h" |
38 #include "chrome/browser/profiles/profile_manager.h" | 39 #include "chrome/browser/profiles/profile_manager.h" |
39 #include "chrome/browser/ui/browser_dialogs.h" | 40 #include "chrome/browser/ui/browser_dialogs.h" |
40 #include "chrome/browser/ui/webui/chrome_url_data_manager.h" | 41 #include "chrome/browser/ui/webui/chrome_url_data_manager.h" |
41 #include "chrome/common/about_handler.h" | 42 #include "chrome/common/about_handler.h" |
42 #include "chrome/common/chrome_paths.h" | 43 #include "chrome/common/chrome_paths.h" |
43 #include "chrome/common/chrome_version_info.h" | 44 #include "chrome/common/chrome_version_info.h" |
44 #include "chrome/common/jstemplate_builder.h" | 45 #include "chrome/common/jstemplate_builder.h" |
45 #include "chrome/common/net/gaia/google_service_auth_error.h" | 46 #include "chrome/common/net/gaia/google_service_auth_error.h" |
46 #include "chrome/common/render_messages.h" | 47 #include "chrome/common/render_messages.h" |
47 #include "chrome/common/url_constants.h" | 48 #include "chrome/common/url_constants.h" |
48 #include "content/browser/gpu/gpu_process_host_ui_shim.h" | 49 #include "content/browser/gpu/gpu_process_host_ui_shim.h" |
49 #include "content/browser/plugin_service.h" | 50 #include "content/browser/plugin_service.h" |
50 #include "content/browser/renderer_host/render_view_host.h" | 51 #include "content/browser/renderer_host/render_view_host.h" |
51 #include "content/browser/sensors/sensors_provider.h" | 52 #include "content/browser/sensors/sensors_provider.h" |
| 53 #include "content/browser/tab_contents/tab_contents.h" |
52 #include "content/public/browser/browser_thread.h" | 54 #include "content/public/browser/browser_thread.h" |
53 #include "content/public/browser/render_process_host.h" | 55 #include "content/public/browser/render_process_host.h" |
54 #include "content/public/common/content_client.h" | 56 #include "content/public/common/content_client.h" |
55 #include "crypto/nss_util.h" | 57 #include "crypto/nss_util.h" |
56 #include "googleurl/src/gurl.h" | 58 #include "googleurl/src/gurl.h" |
57 #include "grit/browser_resources.h" | 59 #include "grit/browser_resources.h" |
58 #include "grit/chromium_strings.h" | 60 #include "grit/chromium_strings.h" |
59 #include "grit/generated_resources.h" | 61 #include "grit/generated_resources.h" |
60 #include "grit/locale_settings.h" | 62 #include "grit/locale_settings.h" |
61 #include "net/base/escape.h" | 63 #include "net/base/escape.h" |
(...skipping 21 matching lines...) Expand all Loading... |
83 #endif | 85 #endif |
84 | 86 |
85 #if defined(USE_TCMALLOC) | 87 #if defined(USE_TCMALLOC) |
86 #include "third_party/tcmalloc/chromium/src/google/malloc_extension.h" | 88 #include "third_party/tcmalloc/chromium/src/google/malloc_extension.h" |
87 #endif | 89 #endif |
88 | 90 |
89 using base::Time; | 91 using base::Time; |
90 using base::TimeDelta; | 92 using base::TimeDelta; |
91 using content::BrowserThread; | 93 using content::BrowserThread; |
92 | 94 |
93 #if defined(USE_TCMALLOC) | |
94 // static | |
95 AboutTcmallocOutputs* AboutTcmallocOutputs::GetInstance() { | |
96 return Singleton<AboutTcmallocOutputs>::get(); | |
97 } | |
98 | |
99 AboutTcmallocOutputs::AboutTcmallocOutputs() {} | |
100 | |
101 AboutTcmallocOutputs::~AboutTcmallocOutputs() {} | |
102 | |
103 // Glue between the callback task and the method in the singleton. | |
104 void AboutTcmallocRendererCallback(base::ProcessId pid, | |
105 const std::string& output) { | |
106 AboutTcmallocOutputs::GetInstance()->RendererCallback(pid, output); | |
107 } | |
108 #endif | |
109 | |
110 namespace { | 95 namespace { |
111 | 96 |
112 // Add paths here to be included in chrome://chrome-urls (about:about). | |
113 // These paths will also be suggested by BuiltinProvider. | |
114 const char* const kChromePaths[] = { | |
115 chrome::kChromeUIAppCacheInternalsHost, | |
116 chrome::kChromeUIBlobInternalsHost, | |
117 chrome::kChromeUIBookmarksHost, | |
118 chrome::kChromeUICacheHost, | |
119 chrome::kChromeUIChromeURLsHost, | |
120 chrome::kChromeUICrashesHost, | |
121 chrome::kChromeUICreditsHost, | |
122 chrome::kChromeUIDNSHost, | |
123 chrome::kChromeUIDownloadsHost, | |
124 chrome::kChromeUIExtensionsHost, | |
125 chrome::kChromeUIFlagsHost, | |
126 chrome::kChromeUIFlashHost, | |
127 chrome::kChromeUIGpuInternalsHost, | |
128 chrome::kChromeUIHistogramsHost, | |
129 chrome::kChromeUIHistoryHost, | |
130 chrome::kChromeUIIPCHost, | |
131 chrome::kChromeUIMediaInternalsHost, | |
132 chrome::kChromeUIMemoryHost, | |
133 chrome::kChromeUINetInternalsHost, | |
134 chrome::kChromeUINetworkViewCacheHost, | |
135 chrome::kChromeUINewTabHost, | |
136 chrome::kChromeUIPluginsHost, | |
137 chrome::kChromeUIPrintHost, | |
138 chrome::kChromeUIProfilerHost, | |
139 chrome::kChromeUIQuotaInternalsHost, | |
140 chrome::kChromeUISessionsHost, | |
141 chrome::kChromeUISettingsHost, | |
142 chrome::kChromeUIStatsHost, | |
143 chrome::kChromeUISyncInternalsHost, | |
144 chrome::kChromeUITaskManagerHost, | |
145 chrome::kChromeUITCMallocHost, | |
146 chrome::kChromeUITermsHost, | |
147 chrome::kChromeUITracingHost, | |
148 chrome::kChromeUIVersionHost, | |
149 chrome::kChromeUIWorkersHost, | |
150 #if defined(OS_WIN) | |
151 chrome::kChromeUIConflictsHost, | |
152 #endif | |
153 #if defined(OS_LINUX) || defined(OS_OPENBSD) | |
154 chrome::kChromeUILinuxProxyConfigHost, | |
155 chrome::kChromeUISandboxHost, | |
156 #endif | |
157 #if defined(OS_CHROMEOS) | |
158 chrome::kChromeUIActiveDownloadsHost, | |
159 chrome::kChromeUIChooseMobileNetworkHost, | |
160 chrome::kChromeUICryptohomeHost, | |
161 chrome::kChromeUIDiscardsHost, | |
162 chrome::kChromeUIImageBurnerHost, | |
163 chrome::kChromeUIKeyboardOverlayHost, | |
164 chrome::kChromeUILoginHost, | |
165 chrome::kChromeUINetworkHost, | |
166 chrome::kChromeUIOobeHost, | |
167 chrome::kChromeUIOSCreditsHost, | |
168 chrome::kChromeUIProxySettingsHost, | |
169 chrome::kChromeUISystemInfoHost, | |
170 #endif | |
171 }; | |
172 | |
173 // AboutSource handles these chrome:// paths. | |
174 const char* const kAboutSourceNames[] = { | |
175 chrome::kChromeUIChromeURLsHost, | |
176 chrome::kChromeUICreditsHost, | |
177 chrome::kChromeUIDNSHost, | |
178 chrome::kChromeUIHistogramsHost, | |
179 chrome::kChromeUIMemoryHost, | |
180 chrome::kChromeUIMemoryRedirectHost, | |
181 chrome::kChromeUIStatsHost, | |
182 chrome::kChromeUITaskManagerHost, | |
183 chrome::kChromeUITermsHost, | |
184 chrome::kChromeUIVersionHost, | |
185 #if defined(USE_TCMALLOC) | |
186 chrome::kChromeUITCMallocHost, | |
187 #endif | |
188 #if defined(OS_LINUX) || defined(OS_OPENBSD) | |
189 chrome::kChromeUILinuxProxyConfigHost, | |
190 chrome::kChromeUISandboxHost, | |
191 #endif | |
192 #if defined(OS_CHROMEOS) | |
193 chrome::kChromeUICryptohomeHost, | |
194 chrome::kChromeUIDiscardsHost, | |
195 chrome::kChromeUINetworkHost, | |
196 chrome::kChromeUIOSCreditsHost, | |
197 #endif | |
198 }; | |
199 | |
200 const char kCreditsJsPath[] = "credits.js"; | 97 const char kCreditsJsPath[] = "credits.js"; |
201 const char kMemoryJsPath[] = "memory.js"; | 98 const char kMemoryJsPath[] = "memory.js"; |
202 const char kStatsJsPath[] = "stats.js"; | 99 const char kStatsJsPath[] = "stats.js"; |
203 const char kStringsJsPath[] = "strings.js"; | 100 const char kStringsJsPath[] = "strings.js"; |
204 const char kVersionJsPath[] = "version.js"; | 101 const char kVersionJsPath[] = "version.js"; |
205 | 102 |
206 class AboutSource : public ChromeURLDataManager::DataSource { | 103 class AboutSource : public ChromeURLDataManager::DataSource { |
207 public: | 104 public: |
208 // Construct a data source for the specified |source_name|. | 105 // Construct a data source for the specified |source_name|. |
209 AboutSource(const std::string& source_name, Profile* profile); | 106 AboutSource(const std::string& source_name, Profile* profile); |
(...skipping 23 matching lines...) Expand all Loading... |
233 // redirects you to the final page. This avoids the problem where typing | 130 // redirects you to the final page. This avoids the problem where typing |
234 // "about:memory" on the new tab page or any other page where a process | 131 // "about:memory" on the new tab page or any other page where a process |
235 // transition would occur to the about URL will cause some confusion. | 132 // transition would occur to the about URL will cause some confusion. |
236 // | 133 // |
237 // The problem is that during the processing of the memory page, there are two | 134 // The problem is that during the processing of the memory page, there are two |
238 // processes active, the original and the destination one. This can create the | 135 // processes active, the original and the destination one. This can create the |
239 // impression that we're using more resources than we actually are. This | 136 // impression that we're using more resources than we actually are. This |
240 // redirect solves the problem by eliminating the process transition during the | 137 // redirect solves the problem by eliminating the process transition during the |
241 // time that about memory is being computed. | 138 // time that about memory is being computed. |
242 std::string GetAboutMemoryRedirectResponse(Profile* profile) { | 139 std::string GetAboutMemoryRedirectResponse(Profile* profile) { |
243 InitializeAboutDataSource(chrome::kChromeUIMemoryRedirectHost, profile); | |
244 return StringPrintf("<meta http-equiv=\"refresh\" content=\"0;%s\">", | 140 return StringPrintf("<meta http-equiv=\"refresh\" content=\"0;%s\">", |
245 chrome::kChromeUIMemoryRedirectURL); | 141 chrome::kChromeUIMemoryRedirectURL); |
246 } | 142 } |
247 | 143 |
248 // Handling about:memory is complicated enough to encapsulate its related | 144 // Handling about:memory is complicated enough to encapsulate its related |
249 // methods into a single class. The user should create it (on the heap) and call | 145 // methods into a single class. The user should create it (on the heap) and call |
250 // its |StartFetch()| method. | 146 // its |StartFetch()| method. |
251 class AboutMemoryHandler : public MemoryDetails { | 147 class AboutMemoryHandler : public MemoryDetails { |
252 public: | 148 public: |
253 AboutMemoryHandler(AboutSource* source, int request_id) | 149 AboutMemoryHandler(AboutSource* source, int request_id) |
(...skipping 1238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1492 if (path == kCreditsJsPath || | 1388 if (path == kCreditsJsPath || |
1493 path == kStatsJsPath || | 1389 path == kStatsJsPath || |
1494 path == kStringsJsPath || | 1390 path == kStringsJsPath || |
1495 path == kVersionJsPath || | 1391 path == kVersionJsPath || |
1496 path == kMemoryJsPath) { | 1392 path == kMemoryJsPath) { |
1497 return "application/javascript"; | 1393 return "application/javascript"; |
1498 } | 1394 } |
1499 return "text/html"; | 1395 return "text/html"; |
1500 } | 1396 } |
1501 | 1397 |
1502 // ----------------------------------------------------------------------------- | 1398 AboutUI::AboutUI(TabContents* contents, const std::string& name) |
1503 | 1399 : ChromeWebUI(contents) { |
1504 void InitializeAboutDataSource(const std::string& name, | 1400 Profile* profile = Profile::FromBrowserContext(contents->browser_context()); |
1505 content::BrowserContext* browser_context) { | 1401 ChromeURLDataManager::DataSource* source = new AboutSource(name, profile); |
1506 Profile* profile = static_cast<Profile*>(browser_context); | 1402 if (source) |
1507 ChromeURLDataManager* manager = profile->GetChromeURLDataManager(); | 1403 profile->GetChromeURLDataManager()->AddDataSource(source); |
1508 for (size_t i = 0; i < arraysize(kAboutSourceNames); i++) { | |
1509 if (name == kAboutSourceNames[i]) { | |
1510 manager->AddDataSource(new AboutSource(name, profile)); | |
1511 return; | |
1512 } | |
1513 } | |
1514 } | 1404 } |
1515 | |
1516 bool WillHandleBrowserAboutURL(GURL* url, | |
1517 content::BrowserContext* browser_context) { | |
1518 // TODO(msw): Eliminate "about:*" constants and literals from code and tests, | |
1519 // then hopefully we can remove this forced fixup. | |
1520 *url = URLFixerUpper::FixupURL(url->possibly_invalid_spec(), std::string()); | |
1521 | |
1522 // Check that about: URLs are fixed up to chrome: by URLFixerUpper::FixupURL. | |
1523 DCHECK((*url == GURL(chrome::kAboutBlankURL)) || | |
1524 !url->SchemeIs(chrome::kAboutScheme)); | |
1525 | |
1526 // Only handle chrome://foo/, URLFixerUpper::FixupURL translates about:foo. | |
1527 // TAB_CONTENTS_WEB handles about:blank, which frames are allowed to access. | |
1528 if (!url->SchemeIs(chrome::kChromeUIScheme)) | |
1529 return false; | |
1530 | |
1531 // Circumvent processing URLs that the renderer process will handle. | |
1532 if (chrome_about_handler::WillHandle(*url)) | |
1533 return false; | |
1534 | |
1535 std::string host(url->host()); | |
1536 std::string path; | |
1537 // Replace about with chrome-urls. | |
1538 if (host == chrome::kChromeUIAboutHost) | |
1539 host = chrome::kChromeUIChromeURLsHost; | |
1540 // Replace cache with view-http-cache. | |
1541 if (host == chrome::kChromeUICacheHost) { | |
1542 host = chrome::kChromeUINetworkViewCacheHost; | |
1543 // Replace gpu with gpu-internals. | |
1544 } else if (host == chrome::kChromeUIGpuHost) { | |
1545 host = chrome::kChromeUIGpuInternalsHost; | |
1546 // Replace sync with sync-internals (for legacy reasons). | |
1547 } else if (host == chrome::kChromeUISyncHost) { | |
1548 host = chrome::kChromeUISyncInternalsHost; | |
1549 // Redirect chrome://extensions to chrome://settings/extensions. | |
1550 } else if (host == chrome::kChromeUIExtensionsHost) { | |
1551 host = chrome::kChromeUISettingsHost; | |
1552 path = chrome::kExtensionsSubPage; | |
1553 } | |
1554 GURL::Replacements replacements; | |
1555 replacements.SetHostStr(host); | |
1556 if (!path.empty()) | |
1557 replacements.SetPathStr(path); | |
1558 *url = url->ReplaceComponents(replacements); | |
1559 | |
1560 // Handle URLs to crash the browser or wreck the gpu process. | |
1561 if (host == chrome::kChromeUIBrowserCrashHost) { | |
1562 // Induce an intentional crash in the browser process. | |
1563 CHECK(false); | |
1564 } else if (host == chrome::kChromeUIGpuCleanHost) { | |
1565 GpuProcessHostUIShim* shim = GpuProcessHostUIShim::FromID(0); | |
1566 if (shim) | |
1567 shim->SimulateRemoveAllContext(); | |
1568 } else if (host == chrome::kChromeUIGpuCrashHost) { | |
1569 GpuProcessHostUIShim* shim = GpuProcessHostUIShim::FromID(0); | |
1570 if (shim) | |
1571 shim->SimulateCrash(); | |
1572 } else if (host == chrome::kChromeUIGpuHangHost) { | |
1573 GpuProcessHostUIShim* shim = GpuProcessHostUIShim::FromID(0); | |
1574 if (shim) | |
1575 shim->SimulateHang(); | |
1576 #if defined(OS_CHROMEOS) | |
1577 } else if (host == chrome::kChromeUIRotateHost) { | |
1578 sensors::ScreenOrientation change; | |
1579 std::string query(url->query()); | |
1580 if (query == "left") { | |
1581 change.upward = sensors::ScreenOrientation::LEFT; | |
1582 } else if (query == "right") { | |
1583 change.upward = sensors::ScreenOrientation::RIGHT; | |
1584 } else if (query == "top") { | |
1585 change.upward = sensors::ScreenOrientation::TOP; | |
1586 } else if (query == "bottom") { | |
1587 change.upward = sensors::ScreenOrientation::BOTTOM; | |
1588 } else { | |
1589 NOTREACHED() << "Unknown orientation"; | |
1590 } | |
1591 sensors::Provider::GetInstance()->ScreenOrientationChanged(change); | |
1592 // Nothing to communicate to the user, so show a blank page. | |
1593 host = chrome::kChromeUIBlankHost; | |
1594 *url = GURL(chrome::kChromeUIBlankHost); | |
1595 #endif | |
1596 } | |
1597 | |
1598 // Initialize any potentially corresponding AboutSource handler. | |
1599 InitializeAboutDataSource(host, browser_context); | |
1600 return true; | |
1601 } | |
1602 | |
1603 bool HandleNonNavigationAboutURL(const GURL& url) { | |
1604 // chrome://ipc/ is currently buggy, so we disable it for official builds. | |
1605 #if !defined(OFFICIAL_BUILD) | |
1606 | |
1607 #if (defined(OS_MACOSX) || defined(OS_WIN)) && defined(IPC_MESSAGE_LOG_ENABLED) | |
1608 if (LowerCaseEqualsASCII(url.spec(), chrome::kChromeUIIPCURL)) { | |
1609 // Run the dialog. This will re-use the existing one if it's already up. | |
1610 browser::ShowAboutIPCDialog(); | |
1611 return true; | |
1612 } | |
1613 #endif | |
1614 | |
1615 #endif // OFFICIAL_BUILD | |
1616 | |
1617 return false; | |
1618 } | |
1619 | |
1620 std::vector<std::string> ChromePaths() { | |
1621 std::vector<std::string> paths; | |
1622 paths.reserve(arraysize(kChromePaths)); | |
1623 for (size_t i = 0; i < arraysize(kChromePaths); i++) | |
1624 paths.push_back(kChromePaths[i]); | |
1625 return paths; | |
1626 } | |
OLD | NEW |