| 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 |