OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/ui/webui/settings/md_settings_ui.h" | 5 #include "chrome/browser/ui/webui/settings/md_settings_ui.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <string> | 9 #include <vector> |
10 | 10 |
| 11 #include "base/bind.h" |
11 #include "base/metrics/histogram_macros.h" | 12 #include "base/metrics/histogram_macros.h" |
| 13 #include "base/strings/string_piece.h" |
| 14 #include "base/strings/string_split.h" |
| 15 #include "base/strings/string_util.h" |
| 16 #include "base/strings/stringprintf.h" |
12 #include "chrome/browser/profiles/profile.h" | 17 #include "chrome/browser/profiles/profile.h" |
13 #include "chrome/browser/ui/webui/settings/about_handler.h" | 18 #include "chrome/browser/ui/webui/settings/about_handler.h" |
14 #include "chrome/browser/ui/webui/settings/appearance_handler.h" | 19 #include "chrome/browser/ui/webui/settings/appearance_handler.h" |
15 #include "chrome/browser/ui/webui/settings/browser_lifetime_handler.h" | 20 #include "chrome/browser/ui/webui/settings/browser_lifetime_handler.h" |
16 #include "chrome/browser/ui/webui/settings/downloads_handler.h" | 21 #include "chrome/browser/ui/webui/settings/downloads_handler.h" |
17 #include "chrome/browser/ui/webui/settings/font_handler.h" | 22 #include "chrome/browser/ui/webui/settings/font_handler.h" |
18 #include "chrome/browser/ui/webui/settings/languages_handler.h" | 23 #include "chrome/browser/ui/webui/settings/languages_handler.h" |
19 #include "chrome/browser/ui/webui/settings/md_settings_localized_strings_provide
r.h" | 24 #include "chrome/browser/ui/webui/settings/md_settings_localized_strings_provide
r.h" |
20 #include "chrome/browser/ui/webui/settings/metrics_reporting_handler.h" | 25 #include "chrome/browser/ui/webui/settings/metrics_reporting_handler.h" |
21 #include "chrome/browser/ui/webui/settings/people_handler.h" | 26 #include "chrome/browser/ui/webui/settings/people_handler.h" |
22 #include "chrome/browser/ui/webui/settings/profile_info_handler.h" | 27 #include "chrome/browser/ui/webui/settings/profile_info_handler.h" |
23 #include "chrome/browser/ui/webui/settings/protocol_handlers_handler.h" | 28 #include "chrome/browser/ui/webui/settings/protocol_handlers_handler.h" |
24 #include "chrome/browser/ui/webui/settings/reset_settings_handler.h" | 29 #include "chrome/browser/ui/webui/settings/reset_settings_handler.h" |
25 #include "chrome/browser/ui/webui/settings/search_engines_handler.h" | 30 #include "chrome/browser/ui/webui/settings/search_engines_handler.h" |
26 #include "chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.
h" | 31 #include "chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.
h" |
27 #include "chrome/browser/ui/webui/settings/settings_cookies_view_handler.h" | 32 #include "chrome/browser/ui/webui/settings/settings_cookies_view_handler.h" |
28 #include "chrome/browser/ui/webui/settings/settings_media_devices_selection_hand
ler.h" | 33 #include "chrome/browser/ui/webui/settings/settings_media_devices_selection_hand
ler.h" |
29 #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h" | 34 #include "chrome/browser/ui/webui/settings/settings_page_ui_handler.h" |
30 #include "chrome/browser/ui/webui/settings/settings_startup_pages_handler.h" | 35 #include "chrome/browser/ui/webui/settings/settings_startup_pages_handler.h" |
31 #include "chrome/browser/ui/webui/settings/site_settings_handler.h" | 36 #include "chrome/browser/ui/webui/settings/site_settings_handler.h" |
32 #include "chrome/common/url_constants.h" | 37 #include "chrome/common/url_constants.h" |
33 #include "content/public/browser/web_contents.h" | 38 #include "content/public/browser/web_contents.h" |
34 #include "content/public/browser/web_ui.h" | 39 #include "content/public/browser/web_ui.h" |
35 #include "content/public/browser/web_ui_data_source.h" | 40 |
| 41 // TODO(dbeam): make content/public interface for this. |
| 42 #include "content/browser/webui/shared_resources_data_source.h" |
| 43 |
36 #include "grit/settings_resources.h" | 44 #include "grit/settings_resources.h" |
37 #include "grit/settings_resources_map.h" | 45 #include "grit/settings_resources_map.h" |
| 46 #include "ui/base/resource/resource_bundle.h" |
38 | 47 |
39 #if defined(OS_CHROMEOS) | 48 #if defined(OS_CHROMEOS) |
40 #include "ash/common/system/chromeos/palette/palette_utils.h" | 49 #include "ash/common/system/chromeos/palette/palette_utils.h" |
41 #include "chrome/browser/chromeos/login/quick_unlock/quick_unlock_utils.h" | 50 #include "chrome/browser/chromeos/login/quick_unlock/quick_unlock_utils.h" |
42 #include "chrome/browser/ui/webui/settings/chromeos/accessibility_handler.h" | 51 #include "chrome/browser/ui/webui/settings/chromeos/accessibility_handler.h" |
43 #include "chrome/browser/ui/webui/settings/chromeos/change_picture_handler.h" | 52 #include "chrome/browser/ui/webui/settings/chromeos/change_picture_handler.h" |
44 #include "chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h" | 53 #include "chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h" |
45 #include "chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler.h" | 54 #include "chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler.h" |
46 #include "chrome/browser/ui/webui/settings/chromeos/device_pointer_handler.h" | 55 #include "chrome/browser/ui/webui/settings/chromeos/device_pointer_handler.h" |
47 #include "chrome/browser/ui/webui/settings/chromeos/easy_unlock_settings_handler
.h" | 56 #include "chrome/browser/ui/webui/settings/chromeos/easy_unlock_settings_handler
.h" |
48 #include "chrome/browser/ui/webui/settings/chromeos/internet_handler.h" | 57 #include "chrome/browser/ui/webui/settings/chromeos/internet_handler.h" |
49 #else // !defined(OS_CHROMEOS) | 58 #else // !defined(OS_CHROMEOS) |
50 #include "chrome/browser/ui/webui/settings/settings_default_browser_handler.h" | 59 #include "chrome/browser/ui/webui/settings/settings_default_browser_handler.h" |
51 #include "chrome/browser/ui/webui/settings/settings_manage_profile_handler.h" | 60 #include "chrome/browser/ui/webui/settings/settings_manage_profile_handler.h" |
52 #include "chrome/browser/ui/webui/settings/system_handler.h" | 61 #include "chrome/browser/ui/webui/settings/system_handler.h" |
53 #endif // defined(OS_CHROMEOS) | 62 #endif // defined(OS_CHROMEOS) |
54 | 63 |
55 #if defined(USE_NSS_CERTS) | 64 #if defined(USE_NSS_CERTS) |
56 #include "chrome/browser/ui/webui/settings/certificates_handler.h" | 65 #include "chrome/browser/ui/webui/settings/certificates_handler.h" |
57 #elif defined(OS_WIN) || defined(OS_MACOSX) | 66 #elif defined(OS_WIN) || defined(OS_MACOSX) |
58 #include "chrome/browser/ui/webui/settings/native_certificates_handler.h" | 67 #include "chrome/browser/ui/webui/settings/native_certificates_handler.h" |
59 #endif // defined(USE_NSS_CERTS) | 68 #endif // defined(USE_NSS_CERTS) |
60 | 69 |
| 70 #include "third_party/re2/src/re2/re2.h" |
| 71 |
61 namespace settings { | 72 namespace settings { |
62 | 73 |
63 MdSettingsUI::MdSettingsUI(content::WebUI* web_ui, const GURL& url) | 74 MdSettingsUI::MdSettingsUI(content::WebUI* web_ui, const GURL& url) |
64 : content::WebUIController(web_ui), | 75 : content::WebUIController(web_ui), |
65 WebContentsObserver(web_ui->GetWebContents()) { | 76 WebContentsObserver(web_ui->GetWebContents()), |
| 77 html_source_(nullptr) { |
| 78 // weak_ptr_factory_(this) { |
66 Profile* profile = Profile::FromWebUI(web_ui); | 79 Profile* profile = Profile::FromWebUI(web_ui); |
67 AddSettingsPageUIHandler(new AppearanceHandler(web_ui)); | 80 AddSettingsPageUIHandler(new AppearanceHandler(web_ui)); |
68 | 81 |
69 #if defined(USE_NSS_CERTS) | 82 #if defined(USE_NSS_CERTS) |
70 AddSettingsPageUIHandler(new CertificatesHandler(false)); | 83 AddSettingsPageUIHandler(new CertificatesHandler(false)); |
71 #elif defined(OS_WIN) || defined(OS_MACOSX) | 84 #elif defined(OS_WIN) || defined(OS_MACOSX) |
72 AddSettingsPageUIHandler(new NativeCertificatesHandler()); | 85 AddSettingsPageUIHandler(new NativeCertificatesHandler()); |
73 #endif // defined(USE_NSS_CERTS) | 86 #endif // defined(USE_NSS_CERTS) |
74 | 87 |
75 AddSettingsPageUIHandler(new ClearBrowsingDataHandler(web_ui)); | 88 AddSettingsPageUIHandler(new ClearBrowsingDataHandler(web_ui)); |
(...skipping 25 matching lines...) Expand all Loading... |
101 AddSettingsPageUIHandler(new DefaultBrowserHandler(web_ui)); | 114 AddSettingsPageUIHandler(new DefaultBrowserHandler(web_ui)); |
102 AddSettingsPageUIHandler(new ManageProfileHandler(profile)); | 115 AddSettingsPageUIHandler(new ManageProfileHandler(profile)); |
103 AddSettingsPageUIHandler(new SystemHandler()); | 116 AddSettingsPageUIHandler(new SystemHandler()); |
104 #endif | 117 #endif |
105 | 118 |
106 // Host must be derived from the visible URL, since this might be serving | 119 // Host must be derived from the visible URL, since this might be serving |
107 // either chrome://settings or chrome://md-settings. | 120 // either chrome://settings or chrome://md-settings. |
108 CHECK(url.GetOrigin() == GURL(chrome::kChromeUISettingsURL).GetOrigin() || | 121 CHECK(url.GetOrigin() == GURL(chrome::kChromeUISettingsURL).GetOrigin() || |
109 url.GetOrigin() == GURL(chrome::kChromeUIMdSettingsURL).GetOrigin()); | 122 url.GetOrigin() == GURL(chrome::kChromeUIMdSettingsURL).GetOrigin()); |
110 | 123 |
111 content::WebUIDataSource* html_source = | 124 html_source_ = content::WebUIDataSource::Create(url.host()); |
112 content::WebUIDataSource::Create(url.host()); | 125 html_source_->SetRequestFilter( |
| 126 base::Bind(&MdSettingsUI::RequestFilter, base::Unretained(this))); |
113 | 127 |
114 #if defined(OS_CHROMEOS) | 128 #if defined(OS_CHROMEOS) |
115 chromeos::settings::EasyUnlockSettingsHandler* easy_unlock_handler = | 129 chromeos::settings::EasyUnlockSettingsHandler* easy_unlock_handler = |
116 chromeos::settings::EasyUnlockSettingsHandler::Create(html_source, | 130 chromeos::settings::EasyUnlockSettingsHandler::Create(html_source_, |
117 profile); | 131 profile); |
118 if (easy_unlock_handler) | 132 if (easy_unlock_handler) |
119 AddSettingsPageUIHandler(easy_unlock_handler); | 133 AddSettingsPageUIHandler(easy_unlock_handler); |
120 | 134 |
121 html_source->AddBoolean("noteAllowed", ash::IsPaletteEnabled()); | 135 html_source_->AddBoolean("noteAllowed", ash::IsPaletteEnabled()); |
122 html_source->AddBoolean("quickUnlockEnabled", | 136 html_source_->AddBoolean("quickUnlockEnabled", |
123 chromeos::IsQuickUnlockEnabled()); | 137 chromeos::IsQuickUnlockEnabled()); |
124 #endif | 138 #endif |
125 | 139 |
126 AddSettingsPageUIHandler(AboutHandler::Create(html_source, profile)); | 140 AddSettingsPageUIHandler(AboutHandler::Create(html_source_, profile)); |
127 AddSettingsPageUIHandler(ResetSettingsHandler::Create(html_source, profile)); | 141 AddSettingsPageUIHandler(ResetSettingsHandler::Create(html_source_, profile)); |
128 | 142 |
129 // Add all settings resources. | 143 // Add all settings resources. |
130 for (size_t i = 0; i < kSettingsResourcesSize; ++i) { | 144 for (size_t i = 0; i < kSettingsResourcesSize; ++i) { |
131 html_source->AddResourcePath(kSettingsResources[i].name, | 145 html_source_->AddResourcePath(kSettingsResources[i].name, |
132 kSettingsResources[i].value); | 146 kSettingsResources[i].value); |
133 } | 147 } |
134 | 148 |
135 AddLocalizedStrings(html_source, profile); | 149 AddLocalizedStrings(html_source_, profile); |
136 html_source->SetDefaultResource(IDR_SETTINGS_SETTINGS_HTML); | 150 html_source_->SetDefaultResource(IDR_SETTINGS_SETTINGS_HTML); |
| 151 |
| 152 base::TimeTicks then = base::TimeTicks::Now(); |
| 153 |
| 154 std::vector<GURL> urls; |
| 155 GatherPreloadUrls(GURL("chrome://md-settings/settings.html"), &urls); |
| 156 |
| 157 for (const GURL& url : urls) { |
| 158 const std::string spec = url.spec(); |
| 159 |
| 160 std::string rel; |
| 161 std::string as; |
| 162 if (base::EndsWith(spec, ".js", base::CompareCase::INSENSITIVE_ASCII)) { |
| 163 rel = "preload"; |
| 164 as = " as=\"script\""; |
| 165 } else if (base::EndsWith(spec, ".css", |
| 166 base::CompareCase::INSENSITIVE_ASCII)) { |
| 167 rel = "preload"; |
| 168 as = " as=\"style\""; |
| 169 } else if (base::EndsWith(spec, ".html", |
| 170 base::CompareCase::INSENSITIVE_ASCII)) { |
| 171 continue; |
| 172 rel = "import"; |
| 173 // as="document" doesn't work yet. |
| 174 } |
| 175 |
| 176 preloads_.append(base::StringPrintf( |
| 177 "<link rel=\"%s\" href=\"%s\"%s>\n", |
| 178 rel.c_str(), spec.c_str(), as.c_str())); |
| 179 } |
| 180 |
| 181 LOG(ERROR) << "time gathering: " << (base::TimeTicks::Now() - then).InMillisec
onds(); |
137 | 182 |
138 content::WebUIDataSource::Add(web_ui->GetWebContents()->GetBrowserContext(), | 183 content::WebUIDataSource::Add(web_ui->GetWebContents()->GetBrowserContext(), |
139 html_source); | 184 html_source_); |
140 } | 185 } |
141 | 186 |
142 MdSettingsUI::~MdSettingsUI() { | 187 MdSettingsUI::~MdSettingsUI() { |
143 } | 188 } |
144 | 189 |
| 190 bool MdSettingsUI::RequestFilter( |
| 191 const std::string& path, |
| 192 const content::WebUIDataSource::GotDataCallback& callback) { |
| 193 if (!path.empty()) |
| 194 return false; |
| 195 |
| 196 base::StringPiece settings_html = |
| 197 ui::ResourceBundle::GetSharedInstance().GetRawDataResource( |
| 198 IDR_SETTINGS_SETTINGS_HTML); |
| 199 |
| 200 std::string preloads_placeholder("<!-- preloads -->"); |
| 201 size_t preloads_start = settings_html.find(preloads_placeholder); |
| 202 |
| 203 std::string response; |
| 204 settings_html.substr(0, preloads_start).AppendToString(&response); |
| 205 response.append(preloads_); |
| 206 settings_html.substr(preloads_start + preloads_placeholder.size()) |
| 207 .AppendToString(&response); |
| 208 |
| 209 callback.Run(base::RefCountedString::TakeString(&response)); |
| 210 return true; |
| 211 } |
| 212 |
| 213 void MdSettingsUI::GatherPreloadUrls(const GURL& url, std::vector<GURL>* urls) { |
| 214 CHECK(url.SchemeIs(content::kChromeUIScheme) && |
| 215 (url.host() == content::kChromeUIResourcesHost || |
| 216 url.host() == chrome::kChromeUISettingsHost || |
| 217 url.host() == chrome::kChromeUIMdSettingsHost)); |
| 218 |
| 219 std::string path = url.path(); |
| 220 CHECK(!path.empty()); |
| 221 |
| 222 if (path[0] == '/') |
| 223 path.erase(0, 1); |
| 224 |
| 225 int idr = -1; |
| 226 |
| 227 if (url.host() == content::kChromeUIResourcesHost) { |
| 228 const auto& map = content::SharedResourcesDataSource::GetResourcesMap(); |
| 229 auto it = map.find(path); |
| 230 if (it != map.end()) |
| 231 idr = it->second; |
| 232 } else { |
| 233 const auto& map = html_source_->path_to_idr_map(); |
| 234 auto it = map.find(path); |
| 235 if (it != map.end()) |
| 236 idr = it->second; |
| 237 } |
| 238 |
| 239 if (idr == -1) { |
| 240 LOG(ERROR) << "@@ unknown url: " << url << ", path: " << path << " @@"; |
| 241 return; |
| 242 } |
| 243 |
| 244 std::string resource = ui::ResourceBundle::GetSharedInstance() |
| 245 .GetRawDataResource(idr).as_string(); |
| 246 |
| 247 re2::StringPiece re2_resource(resource); |
| 248 |
| 249 re2::RE2 regex( |
| 250 "<link[^>]+?rel=\"import\"[^>]+?href=\"([^\"]+)\"|" |
| 251 "<link[^>]+?rel=\"stylesheet\"[^>]+?href=\"([^\"]+)\"|" |
| 252 "<script[^>]+?src=\"([^\"]+)"); |
| 253 |
| 254 re2::StringPiece html, css, js; |
| 255 |
| 256 while (re2::RE2::FindAndConsume(&re2_resource, regex, &html, &css, &js)) { |
| 257 CHECK_EQ(html.empty() + css.empty() + js.empty(), 2); |
| 258 |
| 259 std::string new_path = html.as_string() + css.as_string() + js.as_string(); |
| 260 CHECK(!new_path.empty()); |
| 261 |
| 262 GURL new_url = url.Resolve(new_path); |
| 263 |
| 264 if (std::find(urls->begin(), urls->end(), new_url) != urls->end()) |
| 265 continue; |
| 266 |
| 267 urls->push_back(new_url); |
| 268 GatherPreloadUrls(new_url, urls); |
| 269 } |
| 270 } |
| 271 |
145 void MdSettingsUI::AddSettingsPageUIHandler(SettingsPageUIHandler* handler) { | 272 void MdSettingsUI::AddSettingsPageUIHandler(SettingsPageUIHandler* handler) { |
146 DCHECK(handler); | 273 DCHECK(handler); |
147 handlers_.insert(handler); | 274 handlers_.insert(handler); |
148 web_ui()->AddMessageHandler(handler); // |handler| is owned by |web_ui()|. | 275 web_ui()->AddMessageHandler(handler); // |handler| is owned by |web_ui()|. |
149 } | 276 } |
150 | 277 |
151 void MdSettingsUI::DidStartProvisionalLoadForFrame( | 278 void MdSettingsUI::DidStartProvisionalLoadForFrame( |
152 content::RenderFrameHost* render_frame_host, | 279 content::RenderFrameHost* render_frame_host, |
153 const GURL& validated_url, | 280 const GURL& validated_url, |
154 bool is_error_page, | 281 bool is_error_page, |
155 bool is_iframe_srcdoc) { | 282 bool is_iframe_srcdoc) { |
156 load_start_time_ = base::Time::Now(); | 283 load_start_time_ = base::Time::Now(); |
157 } | 284 } |
158 | 285 |
159 void MdSettingsUI::DocumentLoadedInFrame( | 286 void MdSettingsUI::DocumentLoadedInFrame( |
160 content::RenderFrameHost* render_frame_host) { | 287 content::RenderFrameHost* render_frame_host) { |
161 UMA_HISTOGRAM_TIMES("Settings.LoadDocumentTime.MD", | 288 UMA_HISTOGRAM_TIMES("Settings.LoadDocumentTime.MD", |
162 base::Time::Now() - load_start_time_); | 289 base::Time::Now() - load_start_time_); |
163 } | 290 } |
164 | 291 |
165 void MdSettingsUI::DocumentOnLoadCompletedInMainFrame() { | 292 void MdSettingsUI::DocumentOnLoadCompletedInMainFrame() { |
166 UMA_HISTOGRAM_TIMES("Settings.LoadCompletedTime.MD", | 293 UMA_HISTOGRAM_TIMES("Settings.LoadCompletedTime.MD", |
167 base::Time::Now() - load_start_time_); | 294 base::Time::Now() - load_start_time_); |
168 } | 295 } |
169 | 296 |
170 } // namespace settings | 297 } // namespace settings |
OLD | NEW |