Index: components/error_page/renderer/net_error_helper_core.cc |
diff --git a/components/error_page/renderer/net_error_helper_core.cc b/components/error_page/renderer/net_error_helper_core.cc |
index e12030771847706372a870cfb337314abb121f9a..abd1bb10d55462a00d8cfb29f788470012c9ab4a 100644 |
--- a/components/error_page/renderer/net_error_helper_core.cc |
+++ b/components/error_page/renderer/net_error_helper_core.cc |
@@ -10,6 +10,8 @@ |
#include "base/bind.h" |
#include "base/callback.h" |
+#include "base/debug/alias.h" |
+#include "base/debug/dump_without_crashing.h" |
#include "base/i18n/rtl.h" |
#include "base/json/json_reader.h" |
#include "base/json/json_value_converter.h" |
@@ -38,6 +40,8 @@ namespace error_page { |
namespace { |
+#define MAX_DEBUG_HISTORY_EVENTS 50 |
+ |
struct CorrectionTypeToResourceTable { |
int resource_id; |
const char* correction_type; |
@@ -487,6 +491,8 @@ NetErrorHelperCore::~NetErrorHelperCore() { |
} |
void NetErrorHelperCore::CancelPendingFetches() { |
+ RecordHistoryDebugEvent(HistoryDebugEvent::CANCEL_PENDING_FETCHES); |
+ |
// Cancel loading the alternate error page, and prevent any pending error page |
// load from starting a new error page load. Swapping in the error page when |
// it's finished loading could abort the navigation, otherwise. |
@@ -500,6 +506,8 @@ void NetErrorHelperCore::CancelPendingFetches() { |
} |
void NetErrorHelperCore::OnStop() { |
+ RecordHistoryDebugEvent(HistoryDebugEvent::ON_STOP); |
+ |
if (committed_error_page_info_ && |
committed_error_page_info_->auto_reload_triggered) { |
ReportAutoReloadFailure(committed_error_page_info_->error, |
@@ -512,6 +520,8 @@ void NetErrorHelperCore::OnStop() { |
} |
void NetErrorHelperCore::OnWasShown() { |
+ RecordHistoryDebugEvent(HistoryDebugEvent::ON_WAS_SHOWN); |
+ |
visible_ = true; |
if (!auto_reload_visible_only_) |
return; |
@@ -520,6 +530,8 @@ void NetErrorHelperCore::OnWasShown() { |
} |
void NetErrorHelperCore::OnWasHidden() { |
+ RecordHistoryDebugEvent(HistoryDebugEvent::ON_WAS_HIDDEN); |
+ |
visible_ = false; |
if (!auto_reload_visible_only_) |
return; |
@@ -530,6 +542,8 @@ void NetErrorHelperCore::OnStartLoad(FrameType frame_type, PageType page_type) { |
if (frame_type != MAIN_FRAME) |
return; |
+ RecordHistoryDebugEvent(HistoryDebugEvent::ON_START_LOAD); |
+ |
uncommitted_load_started_ = true; |
// If there's no pending error page information associated with the page load, |
@@ -542,6 +556,8 @@ void NetErrorHelperCore::OnCommitLoad(FrameType frame_type, const GURL& url) { |
if (frame_type != MAIN_FRAME) |
return; |
+ RecordHistoryDebugEvent(HistoryDebugEvent::ON_COMMIT_LOAD); |
+ |
// If a page is committing, either it's an error page and autoreload will be |
// started again below, or it's a success page and we need to clear autoreload |
// state. |
@@ -580,14 +596,20 @@ void NetErrorHelperCore::OnCommitLoad(FrameType frame_type, const GURL& url) { |
} |
committed_error_page_info_.reset(pending_error_page_info_.release()); |
+ |
+ RecordHistoryDebugEvent(HistoryDebugEvent::ON_COMMIT_LOAD_END); |
} |
void NetErrorHelperCore::OnFinishLoad(FrameType frame_type) { |
if (frame_type != MAIN_FRAME) |
return; |
+ RecordHistoryDebugEvent(HistoryDebugEvent::ON_FINISH_LOAD); |
+ |
if (!committed_error_page_info_) { |
auto_reload_count_ = 0; |
+ RecordHistoryDebugEvent( |
+ HistoryDebugEvent::ON_FINISH_LOAD_END_NOT_ERROR_PAGE); |
return; |
} |
@@ -633,10 +655,12 @@ void NetErrorHelperCore::OnFinishLoad(FrameType frame_type) { |
if (!committed_error_page_info_->needs_dns_updates || |
last_probe_status_ == DNS_PROBE_POSSIBLE) { |
+ RecordHistoryDebugEvent(HistoryDebugEvent::ON_FINISH_LOAD_END_DNS_PROBE); |
return; |
} |
DVLOG(1) << "Error page finished loading; sending saved status."; |
UpdateErrorPage(); |
+ RecordHistoryDebugEvent(HistoryDebugEvent::ON_FINISH_LOAD_END_NO_DNS_PROBE); |
} |
void NetErrorHelperCore::GetErrorHTML(FrameType frame_type, |
@@ -649,6 +673,7 @@ void NetErrorHelperCore::GetErrorHTML(FrameType frame_type, |
// cancelled earlier by starting a new page load (Which has now failed). |
DCHECK(!committed_error_page_info_ || |
!committed_error_page_info_->needs_load_navigation_corrections); |
+ RecordHistoryDebugEvent(HistoryDebugEvent::GET_ERROR_HTML); |
pending_error_page_info_.reset( |
new ErrorPageInfo(error, is_failed_post, is_ignoring_cache)); |
@@ -677,6 +702,8 @@ void NetErrorHelperCore::GetErrorHTML(FrameType frame_type, |
void NetErrorHelperCore::OnNetErrorInfo(DnsProbeStatus status) { |
DCHECK_NE(DNS_PROBE_POSSIBLE, status); |
+ RecordHistoryDebugEvent(HistoryDebugEvent::NET_ERROR_INFO_RECEIVED); |
+ |
last_probe_status_ = status; |
if (!committed_error_page_info_ || |
@@ -755,6 +782,8 @@ void NetErrorHelperCore::UpdateErrorPage() { |
DCHECK(committed_error_page_info_->is_finished_loading); |
DCHECK_NE(DNS_PROBE_POSSIBLE, last_probe_status_); |
+ RecordHistoryDebugEvent(HistoryDebugEvent::UPDATE_ERROR_PAGE); |
+ |
UMA_HISTOGRAM_ENUMERATION("DnsProbe.ErrorPageUpdateStatus", |
last_probe_status_, |
DNS_PROBE_MAX); |
@@ -785,6 +814,8 @@ void NetErrorHelperCore::OnNavigationCorrectionsFetched( |
DCHECK(committed_error_page_info_->needs_load_navigation_corrections); |
DCHECK(committed_error_page_info_->navigation_correction_params); |
+ RecordHistoryDebugEvent(HistoryDebugEvent::NAVIGATION_CORRECTIONS_FETCHED); |
+ |
pending_error_page_info_.reset(new ErrorPageInfo( |
committed_error_page_info_->error, |
committed_error_page_info_->was_failed_post, |
@@ -848,6 +879,8 @@ blink::WebURLError NetErrorHelperCore::GetUpdatedError( |
} |
void NetErrorHelperCore::Reload(bool ignore_cache) { |
+ RecordHistoryDebugEvent(HistoryDebugEvent::RELOAD); |
+ |
if (!committed_error_page_info_) { |
return; |
} |
@@ -855,6 +888,8 @@ void NetErrorHelperCore::Reload(bool ignore_cache) { |
} |
bool NetErrorHelperCore::MaybeStartAutoReloadTimer() { |
+ RecordHistoryDebugEvent(HistoryDebugEvent::MAYBE_RELOAD); |
+ |
if (!committed_error_page_info_ || |
!committed_error_page_info_->is_finished_loading || |
pending_error_page_info_ || |
@@ -870,9 +905,12 @@ void NetErrorHelperCore::StartAutoReloadTimer() { |
DCHECK(committed_error_page_info_); |
DCHECK(IsReloadableError(*committed_error_page_info_)); |
+ RecordHistoryDebugEvent(HistoryDebugEvent::START_RELOAD_TIMER); |
+ |
committed_error_page_info_->auto_reload_triggered = true; |
if (!online_ || (!visible_ && auto_reload_visible_only_)) { |
+ RecordHistoryDebugEvent(HistoryDebugEvent::START_RELOAD_TIMER_PAUSED); |
auto_reload_paused_ = true; |
return; |
} |
@@ -893,12 +931,29 @@ void NetErrorHelperCore::AutoReloadTimerFired() { |
// auto-reload timer. |
DCHECK(committed_error_page_info_); |
+ RecordHistoryDebugEvent(HistoryDebugEvent::RELOAD_TIMER_FIRED); |
+ |
auto_reload_count_++; |
auto_reload_in_flight_ = true; |
+ |
+ if (!committed_error_page_info_) { |
+ HistoryDebugEvent history_debug_events[MAX_DEBUG_HISTORY_EVENTS]; |
+ size_t num_history_debug_events = history_debug_events_.size(); |
+ for (size_t i = 0; i < num_history_debug_events; ++i) { |
+ history_debug_events[i] = history_debug_events_[i]; |
+ } |
+ base::debug::Alias(history_debug_events); |
+ base::debug::Alias(&num_history_debug_events); |
+ base::debug::DumpWithoutCrashing(); |
+ return; |
+ } |
+ |
Reload(committed_error_page_info_->was_ignoring_cache); |
} |
void NetErrorHelperCore::PauseAutoReloadTimer() { |
+ RecordHistoryDebugEvent(HistoryDebugEvent::PAUSE_RELOAD_TIMER); |
+ |
if (!auto_reload_timer_->IsRunning()) |
return; |
DCHECK(committed_error_page_info_); |
@@ -909,6 +964,8 @@ void NetErrorHelperCore::PauseAutoReloadTimer() { |
} |
void NetErrorHelperCore::NetworkStateChanged(bool online) { |
+ RecordHistoryDebugEvent(HistoryDebugEvent::NETWORK_STATE_CHANGED); |
+ |
bool was_online = online_; |
online_ = online; |
if (!was_online && online) { |
@@ -929,6 +986,8 @@ bool NetErrorHelperCore::ShouldSuppressErrorPage(FrameType frame_type, |
if (frame_type != MAIN_FRAME) |
return false; |
+ RecordHistoryDebugEvent(HistoryDebugEvent::SHOULD_SUPPRESS_ERROR_PAGE); |
+ |
// If there's no auto reload attempt in flight, this error page didn't come |
// from auto reload, so don't suppress it. |
if (!auto_reload_in_flight_) |
@@ -947,6 +1006,8 @@ void NetErrorHelperCore::ExecuteButtonPress(Button button) { |
// If there's no committed error page, should not be invoked. |
DCHECK(committed_error_page_info_); |
+ RecordHistoryDebugEvent(HistoryDebugEvent::EXECUTE_BUTTON_PRESS); |
+ |
switch (button) { |
case RELOAD_BUTTON: |
RecordEvent(NETWORK_ERROR_PAGE_RELOAD_BUTTON_CLICKED); |
@@ -1039,4 +1100,16 @@ OfflinePageStatus NetErrorHelperCore::GetOfflinePageStatus() const { |
#endif // defined(OS_ANDROID) |
} |
+void NetErrorHelperCore::RecordHistoryDebugEvent( |
+ HistoryDebugEvent::EventType event_type) { |
+ if (history_debug_events_.size() > MAX_DEBUG_HISTORY_EVENTS) |
+ history_debug_events_.erase(history_debug_events_.begin()); |
+ HistoryDebugEvent event; |
+ event.event_type = event_type; |
+ event.pending_error_page_info_exists = !!pending_error_page_info_; |
+ event.committed_error_page_info_exists = !!committed_error_page_info_; |
+ event.timer_running = auto_reload_timer_->IsRunning(); |
+ history_debug_events_.push_back(event); |
+} |
+ |
} // namespace error_page |