Index: chrome/browser/android/offline_pages/offline_page_tab_helper.cc |
diff --git a/chrome/browser/android/offline_pages/offline_page_tab_helper.cc b/chrome/browser/android/offline_pages/offline_page_tab_helper.cc |
index 79cb4183475e93bb07135bb1cc56dc2d9b364a88..0b31e810fe92a55927db70c03a82d99744604963 100644 |
--- a/chrome/browser/android/offline_pages/offline_page_tab_helper.cc |
+++ b/chrome/browser/android/offline_pages/offline_page_tab_helper.cc |
@@ -41,10 +41,8 @@ void OfflinePageTabHelper::DidStartNavigation( |
// operations. |
weak_ptr_factory_.InvalidateWeakPtrs(); |
- // Since this is a new navigation, we will reset the cached offline page, |
- offline_page_ = nullptr; |
+ provisional_offline_page_ = nullptr; |
is_offline_preview_ = false; |
- |
reloading_url_on_net_error_ = false; |
} |
@@ -54,6 +52,16 @@ void OfflinePageTabHelper::DidFinishNavigation( |
if (!navigation_handle->IsInMainFrame()) |
return; |
+ if (!navigation_handle->HasCommitted()) |
+ return; |
+ |
+ if (navigation_handle->IsSamePage()) { |
+ return; |
+ } |
+ |
+ offline_page_ = std::move(provisional_offline_page_); |
+ provisional_offline_page_ = nullptr; |
+ |
// We might be reloading the URL in order to fetch the offline page. |
// * If successful, nothing to do. |
// * Otherwise, we're hitting error again. Bail out to avoid loop. |
@@ -121,10 +129,16 @@ void OfflinePageTabHelper::SelectPageForOnlineURLDone( |
web_contents()->GetController().LoadURLWithParams(load_params); |
} |
+// This is a callback from network request interceptor. It happens between |
+// DidStartNavigation and DidFinishNavigation calls on this tab helper. |
void OfflinePageTabHelper::SetOfflinePage(const OfflinePageItem& offline_page, |
bool is_offline_preview) { |
- offline_page_ = base::MakeUnique<OfflinePageItem>(offline_page); |
+ provisional_offline_page_ = base::MakeUnique<OfflinePageItem>(offline_page); |
is_offline_preview_ = is_offline_preview; |
} |
+const OfflinePageItem* OfflinePageTabHelper::GetOfflinePageForTest() const { |
+ return provisional_offline_page_.get(); |
+} |
+ |
} // namespace offline_pages |