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

Side by Side Diff: chrome/browser/net/net_error_tab_helper.cc

Issue 1442433003: Add "Show saved copy" button in dino page when there's offline copy (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address thestig's feedback Created 5 years 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/net/net_error_tab_helper.h" 5 #include "chrome/browser/net/net_error_tab_helper.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/prefs/pref_service.h" 9 #include "base/prefs/pref_service.h"
10 #include "chrome/browser/browser_process.h" 10 #include "chrome/browser/browser_process.h"
11 #include "chrome/browser/io_thread.h" 11 #include "chrome/browser/io_thread.h"
12 #include "chrome/browser/net/dns_probe_service.h" 12 #include "chrome/browser/net/dns_probe_service.h"
13 #include "chrome/browser/net/net_error_diagnostics_dialog.h" 13 #include "chrome/browser/net/net_error_diagnostics_dialog.h"
14 #include "chrome/browser/platform_util.h" 14 #include "chrome/browser/platform_util.h"
15 #include "chrome/browser/profiles/profile.h" 15 #include "chrome/browser/profiles/profile.h"
16 #include "chrome/common/localized_error.h"
16 #include "chrome/common/pref_names.h" 17 #include "chrome/common/pref_names.h"
17 #include "chrome/common/render_messages.h" 18 #include "chrome/common/render_messages.h"
18 #include "components/error_page/common/net_error_info.h" 19 #include "components/error_page/common/net_error_info.h"
19 #include "content/public/browser/browser_thread.h" 20 #include "content/public/browser/browser_thread.h"
21 #include "content/public/browser/navigation_entry.h"
22 #include "content/public/browser/navigation_handle.h"
20 #include "content/public/browser/render_frame_host.h" 23 #include "content/public/browser/render_frame_host.h"
21 #include "ipc/ipc_message_macros.h" 24 #include "ipc/ipc_message_macros.h"
22 #include "net/base/net_errors.h" 25 #include "net/base/net_errors.h"
23 #include "url/gurl.h" 26 #include "url/gurl.h"
24 27
25 #if defined(OS_ANDROID) 28 #if defined(OS_ANDROID)
29 #include "chrome/browser/android/offline_pages/offline_page_model_factory.h"
26 #include "chrome/browser/android/tab_android.h" 30 #include "chrome/browser/android/tab_android.h"
27 #endif 31 #include "components/offline_pages/offline_page_feature.h"
32 #include "components/offline_pages/offline_page_item.h"
33 #include "components/offline_pages/offline_page_model.h"
34 #endif // defined(OS_ANDROID)
28 35
29 using content::BrowserContext; 36 using content::BrowserContext;
30 using content::BrowserThread; 37 using content::BrowserThread;
31 using content::WebContents; 38 using content::WebContents;
32 using content::WebContentsObserver; 39 using content::WebContentsObserver;
33 using error_page::DnsProbeStatus; 40 using error_page::DnsProbeStatus;
34 using error_page::DnsProbeStatusToString; 41 using error_page::DnsProbeStatusToString;
42 using error_page::OfflinePageStatus;
35 using ui::PageTransition; 43 using ui::PageTransition;
36 44
37 DEFINE_WEB_CONTENTS_USER_DATA_KEY(chrome_browser_net::NetErrorTabHelper); 45 DEFINE_WEB_CONTENTS_USER_DATA_KEY(chrome_browser_net::NetErrorTabHelper);
38 46
39 namespace chrome_browser_net { 47 namespace chrome_browser_net {
40 48
41 namespace { 49 namespace {
42 50
43 static NetErrorTabHelper::TestingState testing_state_ = 51 static NetErrorTabHelper::TestingState testing_state_ =
44 NetErrorTabHelper::TESTING_DEFAULT; 52 NetErrorTabHelper::TESTING_DEFAULT;
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 bool is_error_page, 125 bool is_error_page,
118 bool is_iframe_srcdoc) { 126 bool is_iframe_srcdoc) {
119 DCHECK_CURRENTLY_ON(BrowserThread::UI); 127 DCHECK_CURRENTLY_ON(BrowserThread::UI);
120 128
121 if (render_frame_host->GetParent()) 129 if (render_frame_host->GetParent())
122 return; 130 return;
123 131
124 is_error_page_ = is_error_page; 132 is_error_page_ = is_error_page;
125 133
126 #if defined(OS_ANDROID) 134 #if defined(OS_ANDROID)
127 SetHasOfflinePages(render_frame_host); 135 SetOfflinePageInfo(render_frame_host, validated_url);
128 #endif 136 #endif // defined(OS_ANDROID)
129 } 137 }
130 138
131 void NetErrorTabHelper::DidCommitProvisionalLoadForFrame( 139 void NetErrorTabHelper::DidCommitProvisionalLoadForFrame(
132 content::RenderFrameHost* render_frame_host, 140 content::RenderFrameHost* render_frame_host,
133 const GURL& url, 141 const GURL& url,
134 PageTransition transition_type) { 142 PageTransition transition_type) {
135 DCHECK_CURRENTLY_ON(BrowserThread::UI); 143 DCHECK_CURRENTLY_ON(BrowserThread::UI);
136 144
137 if (render_frame_host->GetParent()) 145 if (render_frame_host->GetParent())
138 return; 146 return;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 178
171 bool NetErrorTabHelper::OnMessageReceived( 179 bool NetErrorTabHelper::OnMessageReceived(
172 const IPC::Message& message, 180 const IPC::Message& message,
173 content::RenderFrameHost* render_frame_host) { 181 content::RenderFrameHost* render_frame_host) {
174 bool handled = true; 182 bool handled = true;
175 IPC_BEGIN_MESSAGE_MAP(NetErrorTabHelper, message) 183 IPC_BEGIN_MESSAGE_MAP(NetErrorTabHelper, message)
176 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_RunNetworkDiagnostics, 184 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_RunNetworkDiagnostics,
177 RunNetworkDiagnostics) 185 RunNetworkDiagnostics)
178 #if defined(OS_ANDROID) 186 #if defined(OS_ANDROID)
179 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_ShowOfflinePages, ShowOfflinePages) 187 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_ShowOfflinePages, ShowOfflinePages)
180 #endif 188 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_LoadOfflineCopy, LoadOfflineCopy)
189 #endif // defined(OS_ANDROID)
181 IPC_MESSAGE_UNHANDLED(handled = false) 190 IPC_MESSAGE_UNHANDLED(handled = false)
182 IPC_END_MESSAGE_MAP() 191 IPC_END_MESSAGE_MAP()
183 192
184 return handled; 193 return handled;
185 } 194 }
186 195
187 NetErrorTabHelper::NetErrorTabHelper(WebContents* contents) 196 NetErrorTabHelper::NetErrorTabHelper(WebContents* contents)
188 : WebContentsObserver(contents), 197 : WebContentsObserver(contents),
189 is_error_page_(false), 198 is_error_page_(false),
190 dns_error_active_(false), 199 dns_error_active_(false),
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 // Sanitize URL prior to running diagnostics on it. 288 // Sanitize URL prior to running diagnostics on it.
280 RunNetworkDiagnosticsHelper(url.GetOrigin().spec()); 289 RunNetworkDiagnosticsHelper(url.GetOrigin().spec());
281 } 290 }
282 291
283 void NetErrorTabHelper::RunNetworkDiagnosticsHelper( 292 void NetErrorTabHelper::RunNetworkDiagnosticsHelper(
284 const std::string& sanitized_url) { 293 const std::string& sanitized_url) {
285 ShowNetworkDiagnosticsDialog(web_contents(), sanitized_url); 294 ShowNetworkDiagnosticsDialog(web_contents(), sanitized_url);
286 } 295 }
287 296
288 #if defined(OS_ANDROID) 297 #if defined(OS_ANDROID)
289 void NetErrorTabHelper::SetHasOfflinePages( 298 void NetErrorTabHelper::SetOfflinePageInfo(
290 content::RenderFrameHost* render_frame_host) { 299 content::RenderFrameHost* render_frame_host, const GURL& url) {
291 DCHECK(web_contents()); 300 // Bails out if offline pages not supported.
292 TabAndroid* tab = TabAndroid::FromWebContents(web_contents()); 301 if (!offline_pages::IsOfflinePagesEnabled())
293 bool has_offline_pages = tab && tab->HasOfflinePages(); 302 return;
303
304 offline_pages::OfflinePageModel* offline_page_model =
305 offline_pages::OfflinePageModelFactory::GetForBrowserContext(
Lei Zhang 2015/11/23 23:43:37 Why are we doing a BrowserContext -> Profile -> Br
jianli 2015/11/23 23:49:50 Thanks for catching this. Fixed.
306 Profile::FromBrowserContext(web_contents()->GetBrowserContext()));
307 if (!offline_page_model)
308 return;
309
310 OfflinePageStatus status = OfflinePageStatus::NONE;
311 if (offline_page_model->HasOfflinePages()) {
312 status = offline_page_model->GetPageByOnlineURL(url) ?
313 OfflinePageStatus::HAS_OFFLINE_PAGE :
314 OfflinePageStatus::HAS_OTHER_OFFLINE_PAGES;
315 }
294 render_frame_host->Send( 316 render_frame_host->Send(
295 new ChromeViewMsg_SetHasOfflinePages( 317 new ChromeViewMsg_SetOfflinePageInfo(
296 render_frame_host->GetRoutingID(), 318 render_frame_host->GetRoutingID(), status));
297 has_offline_pages));
298 } 319 }
299 320
300 void NetErrorTabHelper::ShowOfflinePages() { 321 void NetErrorTabHelper::ShowOfflinePages() {
322 // Makes sure that this is coming from from an error page.
Lei Zhang 2015/11/23 23:43:37 nit: from from, ditto elsewhere in this file.
jianli 2015/11/23 23:49:50 Done.
323 if (!IsFromErrorPage())
324 return;
325
301 DCHECK(web_contents()); 326 DCHECK(web_contents());
302 TabAndroid* tab = TabAndroid::FromWebContents(web_contents()); 327 TabAndroid* tab = TabAndroid::FromWebContents(web_contents());
303 if (tab) 328 if (tab)
304 tab->ShowOfflinePages(); 329 tab->ShowOfflinePages();
305 } 330 }
306 #endif 331
332 void NetErrorTabHelper::LoadOfflineCopy(const GURL& url) {
333 // Makes sure that this is coming from from an error page.
334 if (!IsFromErrorPage())
335 return;
336
337 GURL validated_url(url);
Lei Zhang 2015/11/23 23:43:37 Why do we need a copy of |url| ? Why not just chec
jianli 2015/11/23 23:49:50 This is introduced based on nasko's comment: Since
338 if (!validated_url.is_valid())
339 return;
340
341 DCHECK(web_contents());
Lei Zhang 2015/11/23 23:43:37 Not really needed. You'd know when the DCHECK fail
jianli 2015/11/23 23:49:50 Done.
342 if (validated_url != web_contents()->GetURL())
343 return;
344
345 TabAndroid* tab = TabAndroid::FromWebContents(web_contents());
346 if (tab)
347 tab->LoadOfflineCopy(url);
348 }
349
350 bool NetErrorTabHelper::IsFromErrorPage() const {
351 content::NavigationEntry* entry =
352 web_contents()->GetController().GetLastCommittedEntry();
353 if (!entry)
Lei Zhang 2015/11/23 23:43:37 Squish this into: return entry && (entry->GetPage
jianli 2015/11/23 23:49:50 Done.
354 return false;
355 return entry->GetPageType() == content::PAGE_TYPE_ERROR;
356 }
357
358 #endif // defined(OS_ANDROID)
307 359
308 } // namespace chrome_browser_net 360 } // namespace chrome_browser_net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698