Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(16)

Side by Side Diff: chrome/browser/ui/webui/settings/md_settings_ui.cc

Issue 2255833003: DO NOT COMMIT: hack hack hacking on preloading md-settings (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: to show dave Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
OLDNEW
« no previous file with comments | « chrome/browser/ui/webui/settings/md_settings_ui.h ('k') | content/browser/webui/shared_resources_data_source.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698