OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "components/error_page/renderer/net_error_helper_core.h" | 5 #include "components/error_page/renderer/net_error_helper_core.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <set> | 8 #include <set> |
9 #include <string> | 9 #include <string> |
10 #include <utility> | 10 #include <utility> |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
187 return false; | 187 return false; |
188 } | 188 } |
189 | 189 |
190 // Creates a request body for use with the fixurl service. Sets parameters | 190 // Creates a request body for use with the fixurl service. Sets parameters |
191 // shared by all types of requests to the service. |correction_params| must | 191 // shared by all types of requests to the service. |correction_params| must |
192 // contain the parameters specific to the actual request type. | 192 // contain the parameters specific to the actual request type. |
193 std::string CreateRequestBody( | 193 std::string CreateRequestBody( |
194 const std::string& method, | 194 const std::string& method, |
195 const std::string& error_param, | 195 const std::string& error_param, |
196 const NetErrorHelperCore::NavigationCorrectionParams& correction_params, | 196 const NetErrorHelperCore::NavigationCorrectionParams& correction_params, |
197 scoped_ptr<base::DictionaryValue> params_dict) { | 197 std::unique_ptr<base::DictionaryValue> params_dict) { |
198 // Set params common to all request types. | 198 // Set params common to all request types. |
199 params_dict->SetString("key", correction_params.api_key); | 199 params_dict->SetString("key", correction_params.api_key); |
200 params_dict->SetString("clientName", "chrome"); | 200 params_dict->SetString("clientName", "chrome"); |
201 params_dict->SetString("error", error_param); | 201 params_dict->SetString("error", error_param); |
202 | 202 |
203 if (!correction_params.language.empty()) | 203 if (!correction_params.language.empty()) |
204 params_dict->SetString("language", correction_params.language); | 204 params_dict->SetString("language", correction_params.language); |
205 | 205 |
206 if (!correction_params.country_code.empty()) | 206 if (!correction_params.country_code.empty()) |
207 params_dict->SetString("originCountry", correction_params.country_code); | 207 params_dict->SetString("originCountry", correction_params.country_code); |
(...skipping 14 matching lines...) Expand all Loading... |
222 // |correction_request_body| to be the body for the correction request. | 222 // |correction_request_body| to be the body for the correction request. |
223 std::string CreateFixUrlRequestBody( | 223 std::string CreateFixUrlRequestBody( |
224 const blink::WebURLError& error, | 224 const blink::WebURLError& error, |
225 const NetErrorHelperCore::NavigationCorrectionParams& correction_params) { | 225 const NetErrorHelperCore::NavigationCorrectionParams& correction_params) { |
226 std::string error_param; | 226 std::string error_param; |
227 bool result = ShouldUseFixUrlServiceForError(error, &error_param); | 227 bool result = ShouldUseFixUrlServiceForError(error, &error_param); |
228 DCHECK(result); | 228 DCHECK(result); |
229 | 229 |
230 // TODO(mmenke): Investigate open sourcing the relevant protocol buffers and | 230 // TODO(mmenke): Investigate open sourcing the relevant protocol buffers and |
231 // using those directly instead. | 231 // using those directly instead. |
232 scoped_ptr<base::DictionaryValue> params(new base::DictionaryValue()); | 232 std::unique_ptr<base::DictionaryValue> params(new base::DictionaryValue()); |
233 params->SetString("urlQuery", PrepareUrlForUpload(error.unreachableURL)); | 233 params->SetString("urlQuery", PrepareUrlForUpload(error.unreachableURL)); |
234 return CreateRequestBody("linkdoctor.fixurl.fixurl", error_param, | 234 return CreateRequestBody("linkdoctor.fixurl.fixurl", error_param, |
235 correction_params, std::move(params)); | 235 correction_params, std::move(params)); |
236 } | 236 } |
237 | 237 |
238 std::string CreateClickTrackingUrlRequestBody( | 238 std::string CreateClickTrackingUrlRequestBody( |
239 const blink::WebURLError& error, | 239 const blink::WebURLError& error, |
240 const NetErrorHelperCore::NavigationCorrectionParams& correction_params, | 240 const NetErrorHelperCore::NavigationCorrectionParams& correction_params, |
241 const NavigationCorrectionResponse& response, | 241 const NavigationCorrectionResponse& response, |
242 const NavigationCorrection& correction) { | 242 const NavigationCorrection& correction) { |
243 std::string error_param; | 243 std::string error_param; |
244 bool result = ShouldUseFixUrlServiceForError(error, &error_param); | 244 bool result = ShouldUseFixUrlServiceForError(error, &error_param); |
245 DCHECK(result); | 245 DCHECK(result); |
246 | 246 |
247 scoped_ptr<base::DictionaryValue> params(new base::DictionaryValue()); | 247 std::unique_ptr<base::DictionaryValue> params(new base::DictionaryValue()); |
248 | 248 |
249 params->SetString("originalUrlQuery", | 249 params->SetString("originalUrlQuery", |
250 PrepareUrlForUpload(error.unreachableURL)); | 250 PrepareUrlForUpload(error.unreachableURL)); |
251 | 251 |
252 params->SetString("clickedUrlCorrection", correction.url_correction); | 252 params->SetString("clickedUrlCorrection", correction.url_correction); |
253 params->SetString("clickType", correction.click_type); | 253 params->SetString("clickType", correction.click_type); |
254 params->SetString("clickData", correction.click_data); | 254 params->SetString("clickData", correction.click_data); |
255 | 255 |
256 params->SetString("eventId", response.event_id); | 256 params->SetString("eventId", response.event_id); |
257 params->SetString("fingerprint", response.fingerprint); | 257 params->SetString("fingerprint", response.fingerprint); |
258 | 258 |
259 return CreateRequestBody("linkdoctor.fixurl.clicktracking", error_param, | 259 return CreateRequestBody("linkdoctor.fixurl.clicktracking", error_param, |
260 correction_params, std::move(params)); | 260 correction_params, std::move(params)); |
261 } | 261 } |
262 | 262 |
263 base::string16 FormatURLForDisplay(const GURL& url, bool is_rtl) { | 263 base::string16 FormatURLForDisplay(const GURL& url, bool is_rtl) { |
264 // Translate punycode into UTF8, unescape UTF8 URLs. | 264 // Translate punycode into UTF8, unescape UTF8 URLs. |
265 base::string16 url_for_display(url_formatter::FormatUrl( | 265 base::string16 url_for_display(url_formatter::FormatUrl( |
266 url, url_formatter::kFormatUrlOmitNothing, | 266 url, url_formatter::kFormatUrlOmitNothing, |
267 net::UnescapeRule::NORMAL, nullptr, nullptr, nullptr)); | 267 net::UnescapeRule::NORMAL, nullptr, nullptr, nullptr)); |
268 // URLs are always LTR. | 268 // URLs are always LTR. |
269 if (is_rtl) | 269 if (is_rtl) |
270 base::i18n::WrapStringWithLTRFormatting(&url_for_display); | 270 base::i18n::WrapStringWithLTRFormatting(&url_for_display); |
271 return url_for_display; | 271 return url_for_display; |
272 } | 272 } |
273 | 273 |
274 scoped_ptr<NavigationCorrectionResponse> ParseNavigationCorrectionResponse( | 274 std::unique_ptr<NavigationCorrectionResponse> ParseNavigationCorrectionResponse( |
275 const std::string raw_response) { | 275 const std::string raw_response) { |
276 // TODO(mmenke): Open source related protocol buffers and use them directly. | 276 // TODO(mmenke): Open source related protocol buffers and use them directly. |
277 scoped_ptr<base::Value> parsed = base::JSONReader::Read(raw_response); | 277 std::unique_ptr<base::Value> parsed = base::JSONReader::Read(raw_response); |
278 scoped_ptr<NavigationCorrectionResponse> response( | 278 std::unique_ptr<NavigationCorrectionResponse> response( |
279 new NavigationCorrectionResponse()); | 279 new NavigationCorrectionResponse()); |
280 base::JSONValueConverter<NavigationCorrectionResponse> converter; | 280 base::JSONValueConverter<NavigationCorrectionResponse> converter; |
281 if (!parsed || !converter.Convert(*parsed, response.get())) | 281 if (!parsed || !converter.Convert(*parsed, response.get())) |
282 response.reset(); | 282 response.reset(); |
283 return response; | 283 return response; |
284 } | 284 } |
285 | 285 |
286 void LogCorrectionTypeShown(int type_id) { | 286 void LogCorrectionTypeShown(int type_id) { |
287 UMA_HISTOGRAM_ENUMERATION( | 287 UMA_HISTOGRAM_ENUMERATION( |
288 "Net.ErrorPageCounts.NavigationCorrectionLinksShown", type_id, | 288 "Net.ErrorPageCounts.NavigationCorrectionLinksShown", type_id, |
289 kWebSearchQueryUMAId + 1); | 289 kWebSearchQueryUMAId + 1); |
290 } | 290 } |
291 | 291 |
292 scoped_ptr<ErrorPageParams> CreateErrorPageParams( | 292 std::unique_ptr<ErrorPageParams> CreateErrorPageParams( |
293 const NavigationCorrectionResponse& response, | 293 const NavigationCorrectionResponse& response, |
294 const blink::WebURLError& error, | 294 const blink::WebURLError& error, |
295 const NetErrorHelperCore::NavigationCorrectionParams& correction_params, | 295 const NetErrorHelperCore::NavigationCorrectionParams& correction_params, |
296 bool is_rtl) { | 296 bool is_rtl) { |
297 // Version of URL for display in suggestions. It has to be sanitized first | 297 // Version of URL for display in suggestions. It has to be sanitized first |
298 // because any received suggestions will be relative to the sanitized URL. | 298 // because any received suggestions will be relative to the sanitized URL. |
299 base::string16 original_url_for_display = | 299 base::string16 original_url_for_display = |
300 FormatURLForDisplay(SanitizeURL(GURL(error.unreachableURL)), is_rtl); | 300 FormatURLForDisplay(SanitizeURL(GURL(error.unreachableURL)), is_rtl); |
301 | 301 |
302 scoped_ptr<ErrorPageParams> params(new ErrorPageParams()); | 302 std::unique_ptr<ErrorPageParams> params(new ErrorPageParams()); |
303 params->override_suggestions.reset(new base::ListValue()); | 303 params->override_suggestions.reset(new base::ListValue()); |
304 scoped_ptr<base::ListValue> parsed_corrections(new base::ListValue()); | 304 std::unique_ptr<base::ListValue> parsed_corrections(new base::ListValue()); |
305 for (ScopedVector<NavigationCorrection>::const_iterator it = | 305 for (ScopedVector<NavigationCorrection>::const_iterator it = |
306 response.corrections.begin(); | 306 response.corrections.begin(); |
307 it != response.corrections.end(); ++it) { | 307 it != response.corrections.end(); ++it) { |
308 // Doesn't seem like a good idea to show these. | 308 // Doesn't seem like a good idea to show these. |
309 if ((*it)->is_porn || (*it)->is_soft_porn) | 309 if ((*it)->is_porn || (*it)->is_soft_porn) |
310 continue; | 310 continue; |
311 | 311 |
312 int tracking_id = it - response.corrections.begin(); | 312 int tracking_id = it - response.corrections.begin(); |
313 | 313 |
314 if ((*it)->correction_type == "reloadPage") { | 314 if ((*it)->correction_type == "reloadPage") { |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
441 // probe status. | 441 // probe status. |
442 bool needs_dns_updates; | 442 bool needs_dns_updates; |
443 | 443 |
444 // True if a blank page was loaded, and navigation corrections need to be | 444 // True if a blank page was loaded, and navigation corrections need to be |
445 // loaded to generate the real error page. | 445 // loaded to generate the real error page. |
446 bool needs_load_navigation_corrections; | 446 bool needs_load_navigation_corrections; |
447 | 447 |
448 // Navigation correction service paramers, which will be used in response to | 448 // Navigation correction service paramers, which will be used in response to |
449 // certain types of network errors. They are all stored here in case they | 449 // certain types of network errors. They are all stored here in case they |
450 // change over the course of displaying the error page. | 450 // change over the course of displaying the error page. |
451 scoped_ptr<NetErrorHelperCore::NavigationCorrectionParams> | 451 std::unique_ptr<NetErrorHelperCore::NavigationCorrectionParams> |
452 navigation_correction_params; | 452 navigation_correction_params; |
453 | 453 |
454 scoped_ptr<NavigationCorrectionResponse> navigation_correction_response; | 454 std::unique_ptr<NavigationCorrectionResponse> navigation_correction_response; |
455 | 455 |
456 // All the navigation corrections that have been clicked, for tracking | 456 // All the navigation corrections that have been clicked, for tracking |
457 // purposes. | 457 // purposes. |
458 std::set<int> clicked_corrections; | 458 std::set<int> clicked_corrections; |
459 | 459 |
460 // Track if specific buttons are included in an error page, for statistics. | 460 // Track if specific buttons are included in an error page, for statistics. |
461 bool reload_button_in_page; | 461 bool reload_button_in_page; |
462 bool show_saved_copy_button_in_page; | 462 bool show_saved_copy_button_in_page; |
463 bool show_cached_copy_button_in_page; | 463 bool show_cached_copy_button_in_page; |
464 bool show_offline_pages_button_in_page; | 464 bool show_offline_pages_button_in_page; |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
702 } else { | 702 } else { |
703 // These values do not matter, as error pages in iframes hide the buttons. | 703 // These values do not matter, as error pages in iframes hide the buttons. |
704 bool reload_button_in_page; | 704 bool reload_button_in_page; |
705 bool show_saved_copy_button_in_page; | 705 bool show_saved_copy_button_in_page; |
706 bool show_cached_copy_button_in_page; | 706 bool show_cached_copy_button_in_page; |
707 bool show_offline_pages_button_in_page; | 707 bool show_offline_pages_button_in_page; |
708 | 708 |
709 delegate_->GenerateLocalizedErrorPage( | 709 delegate_->GenerateLocalizedErrorPage( |
710 error, is_failed_post, | 710 error, is_failed_post, |
711 false /* No diagnostics dialogs allowed for subframes. */, | 711 false /* No diagnostics dialogs allowed for subframes. */, |
712 false /* No offline button provided in subframes */, | 712 false /* No offline button provided in subframes */, nullptr, |
713 scoped_ptr<ErrorPageParams>(), &reload_button_in_page, | 713 &reload_button_in_page, &show_saved_copy_button_in_page, |
714 &show_saved_copy_button_in_page, &show_cached_copy_button_in_page, | 714 &show_cached_copy_button_in_page, &show_offline_pages_button_in_page, |
715 &show_offline_pages_button_in_page, error_html); | 715 error_html); |
716 } | 716 } |
717 } | 717 } |
718 | 718 |
719 void NetErrorHelperCore::OnNetErrorInfo(DnsProbeStatus status) { | 719 void NetErrorHelperCore::OnNetErrorInfo(DnsProbeStatus status) { |
720 DCHECK_NE(DNS_PROBE_POSSIBLE, status); | 720 DCHECK_NE(DNS_PROBE_POSSIBLE, status); |
721 | 721 |
722 last_probe_status_ = status; | 722 last_probe_status_ = status; |
723 | 723 |
724 if (!committed_error_page_info_ || | 724 if (!committed_error_page_info_ || |
725 !committed_error_page_info_->needs_dns_updates || | 725 !committed_error_page_info_->needs_dns_updates || |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
773 // loading, a DNS probe status scheduled to be sent to it may be thrown | 773 // loading, a DNS probe status scheduled to be sent to it may be thrown |
774 // out, but since the new error page should trigger a new DNS probe, it | 774 // out, but since the new error page should trigger a new DNS probe, it |
775 // will just get the results for the next page load. | 775 // will just get the results for the next page load. |
776 last_probe_status_ = DNS_PROBE_POSSIBLE; | 776 last_probe_status_ = DNS_PROBE_POSSIBLE; |
777 pending_error_page_info->needs_dns_updates = true; | 777 pending_error_page_info->needs_dns_updates = true; |
778 error = GetUpdatedError(error); | 778 error = GetUpdatedError(error); |
779 } | 779 } |
780 | 780 |
781 delegate_->GenerateLocalizedErrorPage( | 781 delegate_->GenerateLocalizedErrorPage( |
782 error, pending_error_page_info->was_failed_post, | 782 error, pending_error_page_info->was_failed_post, |
783 can_show_network_diagnostics_dialog_, | 783 can_show_network_diagnostics_dialog_, HasOfflinePages(), nullptr, |
784 HasOfflinePages(), | |
785 scoped_ptr<ErrorPageParams>(), | |
786 &pending_error_page_info->reload_button_in_page, | 784 &pending_error_page_info->reload_button_in_page, |
787 &pending_error_page_info->show_saved_copy_button_in_page, | 785 &pending_error_page_info->show_saved_copy_button_in_page, |
788 &pending_error_page_info->show_cached_copy_button_in_page, | 786 &pending_error_page_info->show_cached_copy_button_in_page, |
789 &pending_error_page_info->show_offline_pages_button_in_page, | 787 &pending_error_page_info->show_offline_pages_button_in_page, error_html); |
790 error_html); | |
791 } | 788 } |
792 | 789 |
793 void NetErrorHelperCore::UpdateErrorPage() { | 790 void NetErrorHelperCore::UpdateErrorPage() { |
794 DCHECK(committed_error_page_info_->needs_dns_updates); | 791 DCHECK(committed_error_page_info_->needs_dns_updates); |
795 DCHECK(committed_error_page_info_->is_finished_loading); | 792 DCHECK(committed_error_page_info_->is_finished_loading); |
796 DCHECK_NE(DNS_PROBE_POSSIBLE, last_probe_status_); | 793 DCHECK_NE(DNS_PROBE_POSSIBLE, last_probe_status_); |
797 | 794 |
798 UMA_HISTOGRAM_ENUMERATION("DnsProbe.ErrorPageUpdateStatus", | 795 UMA_HISTOGRAM_ENUMERATION("DnsProbe.ErrorPageUpdateStatus", |
799 last_probe_status_, | 796 last_probe_status_, |
800 DNS_PROBE_MAX); | 797 DNS_PROBE_MAX); |
(...skipping 24 matching lines...) Expand all Loading... |
825 DCHECK(committed_error_page_info_->navigation_correction_params); | 822 DCHECK(committed_error_page_info_->navigation_correction_params); |
826 | 823 |
827 pending_error_page_info_.reset(new ErrorPageInfo( | 824 pending_error_page_info_.reset(new ErrorPageInfo( |
828 committed_error_page_info_->error, | 825 committed_error_page_info_->error, |
829 committed_error_page_info_->was_failed_post, | 826 committed_error_page_info_->was_failed_post, |
830 committed_error_page_info_->was_ignoring_cache)); | 827 committed_error_page_info_->was_ignoring_cache)); |
831 pending_error_page_info_->navigation_correction_response = | 828 pending_error_page_info_->navigation_correction_response = |
832 ParseNavigationCorrectionResponse(corrections); | 829 ParseNavigationCorrectionResponse(corrections); |
833 | 830 |
834 std::string error_html; | 831 std::string error_html; |
835 scoped_ptr<ErrorPageParams> params; | 832 std::unique_ptr<ErrorPageParams> params; |
836 if (pending_error_page_info_->navigation_correction_response) { | 833 if (pending_error_page_info_->navigation_correction_response) { |
837 // Copy navigation correction parameters used for the request, so tracking | 834 // Copy navigation correction parameters used for the request, so tracking |
838 // requests can still be sent if the configuration changes. | 835 // requests can still be sent if the configuration changes. |
839 pending_error_page_info_->navigation_correction_params.reset( | 836 pending_error_page_info_->navigation_correction_params.reset( |
840 new NavigationCorrectionParams( | 837 new NavigationCorrectionParams( |
841 *committed_error_page_info_->navigation_correction_params)); | 838 *committed_error_page_info_->navigation_correction_params)); |
842 params = CreateErrorPageParams( | 839 params = CreateErrorPageParams( |
843 *pending_error_page_info_->navigation_correction_response, | 840 *pending_error_page_info_->navigation_correction_response, |
844 pending_error_page_info_->error, | 841 pending_error_page_info_->error, |
845 *pending_error_page_info_->navigation_correction_params, is_rtl); | 842 *pending_error_page_info_->navigation_correction_params, is_rtl); |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1065 | 1062 |
1066 bool NetErrorHelperCore::HasOfflinePages() const { | 1063 bool NetErrorHelperCore::HasOfflinePages() const { |
1067 #if defined(OS_ANDROID) | 1064 #if defined(OS_ANDROID) |
1068 return has_offline_pages_; | 1065 return has_offline_pages_; |
1069 #else | 1066 #else |
1070 return false; | 1067 return false; |
1071 #endif // defined(OS_ANDROID) | 1068 #endif // defined(OS_ANDROID) |
1072 } | 1069 } |
1073 | 1070 |
1074 } // namespace error_page | 1071 } // namespace error_page |
OLD | NEW |