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

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

Issue 13270005: Display DNS probe results. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 7 years, 8 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 (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/metrics/field_trial.h" 8 #include "base/metrics/field_trial.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/profiles/profile.h" 13 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/common/net/net_error_info.h" 14 #include "chrome/common/net/net_error_info.h"
15 #include "chrome/common/pref_names.h" 15 #include "chrome/common/pref_names.h"
16 #include "chrome/common/render_messages.h" 16 #include "chrome/common/render_messages.h"
17 #include "content/public/browser/browser_thread.h" 17 #include "content/public/browser/browser_thread.h"
18 #include "net/base/net_errors.h" 18 #include "net/base/net_errors.h"
19 19
20 using base::FieldTrialList; 20 using base::FieldTrialList;
21 using chrome_common_net::DnsProbeResult; 21 using chrome_common_net::DnsProbeResult;
22 using chrome_common_net::DnsProbeStatus;
22 using content::BrowserContext; 23 using content::BrowserContext;
23 using content::BrowserThread; 24 using content::BrowserThread;
24 using content::PageTransition; 25 using content::PageTransition;
25 using content::RenderViewHost; 26 using content::RenderViewHost;
26 using content::WebContents; 27 using content::WebContents;
27 using content::WebContentsObserver; 28 using content::WebContentsObserver;
28 29
29 DEFINE_WEB_CONTENTS_USER_DATA_KEY(chrome_browser_net::NetErrorTabHelper); 30 DEFINE_WEB_CONTENTS_USER_DATA_KEY(chrome_browser_net::NetErrorTabHelper);
30 31
31 namespace chrome_browser_net { 32 namespace chrome_browser_net {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 NetErrorTracker::ErrorType GetErrorType(int net_error) { 64 NetErrorTracker::ErrorType GetErrorType(int net_error) {
64 return IsDnsError(net_error) ? NetErrorTracker::ERROR_DNS 65 return IsDnsError(net_error) ? NetErrorTracker::ERROR_DNS
65 : NetErrorTracker::ERROR_OTHER; 66 : NetErrorTracker::ERROR_OTHER;
66 } 67 }
67 68
68 void OnDnsProbeFinishedOnIOThread( 69 void OnDnsProbeFinishedOnIOThread(
69 const base::Callback<void(DnsProbeResult)>& callback, 70 const base::Callback<void(DnsProbeResult)>& callback,
70 DnsProbeResult result) { 71 DnsProbeResult result) {
71 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 72 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
72 73
73 DVLOG(1) << "DNS probe finished with result " << result;
74
75 BrowserThread::PostTask( 74 BrowserThread::PostTask(
76 BrowserThread::UI, 75 BrowserThread::UI,
77 FROM_HERE, 76 FROM_HERE,
78 base::Bind(callback, result)); 77 base::Bind(callback, result));
79 } 78 }
80 79
81 // We can only access g_browser_process->io_thread() from the browser thread, 80 // We can only access g_browser_process->io_thread() from the browser thread,
82 // so we have to pass it in to the callback instead of dereferencing it here. 81 // so we have to pass it in to the callback instead of dereferencing it here.
83 void StartDnsProbeOnIOThread( 82 void StartDnsProbeOnIOThread(
84 const base::Callback<void(DnsProbeResult)>& callback, 83 const base::Callback<void(DnsProbeResult)>& callback,
85 IOThread* io_thread) { 84 IOThread* io_thread) {
86 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 85 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
87 86
88 DVLOG(1) << "Starting DNS probe";
89
90 DnsProbeService* probe_service = 87 DnsProbeService* probe_service =
91 io_thread->globals()->dns_probe_service.get(); 88 io_thread->globals()->dns_probe_service.get();
92 89
93 probe_service->ProbeDns(base::Bind(&OnDnsProbeFinishedOnIOThread, callback)); 90 probe_service->ProbeDns(base::Bind(&OnDnsProbeFinishedOnIOThread, callback));
94 } 91 }
95 92
96 } // namespace 93 } // namespace
97 94
98 NetErrorTabHelper::~NetErrorTabHelper() { 95 NetErrorTabHelper::~NetErrorTabHelper() {
99 } 96 }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 dns_error_page_state_(NetErrorTracker::DNS_ERROR_PAGE_NONE), 157 dns_error_page_state_(NetErrorTracker::DNS_ERROR_PAGE_NONE),
161 dns_probe_state_(DNS_PROBE_NONE), 158 dns_probe_state_(DNS_PROBE_NONE),
162 enabled_by_trial_(GetEnabledByTrial()) { 159 enabled_by_trial_(GetEnabledByTrial()) {
163 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 160 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
164 161
165 InitializePref(contents); 162 InitializePref(contents);
166 } 163 }
167 164
168 void NetErrorTabHelper::TrackerCallback( 165 void NetErrorTabHelper::TrackerCallback(
169 NetErrorTracker::DnsErrorPageState state) { 166 NetErrorTracker::DnsErrorPageState state) {
167 DVLOG(1) << "Tracker state " << state;
168
170 dns_error_page_state_ = state; 169 dns_error_page_state_ = state;
171 170
172 MaybePostStartDnsProbeTask(); 171 MaybePostStartDnsProbeTask();
173 MaybeSendInfo(); 172 MaybeSendStatus();
174 } 173 }
175 174
176 void NetErrorTabHelper::MaybePostStartDnsProbeTask() { 175 void NetErrorTabHelper::MaybePostStartDnsProbeTask() {
177 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 176 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
178 177
179 if (dns_error_page_state_ != NetErrorTracker::DNS_ERROR_PAGE_NONE && 178 if (dns_error_page_state_ == NetErrorTracker::DNS_ERROR_PAGE_NONE ||
180 dns_probe_state_ != DNS_PROBE_STARTED && 179 dns_probe_state_ != DNS_PROBE_NONE ||
181 ProbesAllowed()) { 180 !ProbesAllowed()) {
182 BrowserThread::PostTask( 181 return;
183 BrowserThread::IO,
184 FROM_HERE,
185 base::Bind(&StartDnsProbeOnIOThread,
186 base::Bind(&NetErrorTabHelper::OnDnsProbeFinished,
187 weak_factory_.GetWeakPtr()),
188 g_browser_process->io_thread()));
189 dns_probe_state_ = DNS_PROBE_STARTED;
190 } 182 }
183
184 DVLOG(1) << "Starting probe.";
185
186 BrowserThread::PostTask(
187 BrowserThread::IO,
188 FROM_HERE,
189 base::Bind(&StartDnsProbeOnIOThread,
190 base::Bind(&NetErrorTabHelper::OnDnsProbeFinished,
191 weak_factory_.GetWeakPtr()),
192 g_browser_process->io_thread()));
193 dns_probe_state_ = DNS_PROBE_STARTED;
191 } 194 }
192 195
193 void NetErrorTabHelper::OnDnsProbeFinished(DnsProbeResult result) { 196 void NetErrorTabHelper::OnDnsProbeFinished(DnsProbeResult result) {
194 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 197 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
195 DCHECK_EQ(DNS_PROBE_STARTED, dns_probe_state_); 198 DCHECK_EQ(DNS_PROBE_STARTED, dns_probe_state_);
196 199
200 DVLOG(1) << "Finished probe with result " << result << ".";
201
197 dns_probe_result_ = result; 202 dns_probe_result_ = result;
198 dns_probe_state_ = DNS_PROBE_FINISHED; 203 dns_probe_state_ = DNS_PROBE_FINISHED;
199 204
200 MaybeSendInfo(); 205 MaybeSendStatus();
201 } 206 }
202 207
203 void NetErrorTabHelper::MaybeSendInfo() { 208 void NetErrorTabHelper::MaybeSendStatus() {
204 if (dns_error_page_state_ == NetErrorTracker::DNS_ERROR_PAGE_LOADED && 209 if (dns_error_page_state_ != NetErrorTracker::DNS_ERROR_PAGE_LOADED)
205 dns_probe_state_ == DNS_PROBE_FINISHED) { 210 return;
206 DVLOG(1) << "Sending result " << dns_probe_result_ << " to renderer"; 211
207 Send(new ChromeViewMsg_NetErrorInfo(routing_id(), dns_probe_result_)); 212 switch (dns_probe_state_) {
213 case DNS_PROBE_STARTED:
214 DVLOG(1) << "Error page loaded; sending STARTED.";
215 SendInfo(chrome_common_net::DNS_PROBE_STARTED,
216 chrome_common_net::DNS_PROBE_UNKNOWN);
217 break;
218
219 case DNS_PROBE_FINISHED:
220 DVLOG(1) << "Error page loaded; sending FINISHED.";
221 SendInfo(chrome_common_net::DNS_PROBE_FINISHED, dns_probe_result_);
208 dns_probe_state_ = DNS_PROBE_NONE; 222 dns_probe_state_ = DNS_PROBE_NONE;
223 break;
224
225 case DNS_PROBE_NONE:
226 DVLOG(1) << "Error page loaded; sending NOT_RUN.";
227 SendInfo(chrome_common_net::DNS_PROBE_NOT_RUN,
228 chrome_common_net::DNS_PROBE_UNKNOWN);
229 break;
230
231 default:
232 NOTREACHED();
209 } 233 }
210 } 234 }
211 235
236 void NetErrorTabHelper::SendInfo(
237 DnsProbeStatus status,
238 DnsProbeResult result)
239 {
mmenke 2013/04/01 17:44:12 nit: "{" should go on previous line.
Deprecated (see juliatuttle) 2013/04/09 20:35:49 Done.
240 Send(new ChromeViewMsg_NetErrorInfo(routing_id(), status, result));
241 }
242
212 void NetErrorTabHelper::InitializePref(WebContents* contents) { 243 void NetErrorTabHelper::InitializePref(WebContents* contents) {
213 DCHECK(contents); 244 DCHECK(contents);
214 245
215 BrowserContext* browser_context = contents->GetBrowserContext(); 246 BrowserContext* browser_context = contents->GetBrowserContext();
216 Profile* profile = Profile::FromBrowserContext(browser_context); 247 Profile* profile = Profile::FromBrowserContext(browser_context);
217 resolve_errors_with_web_service_.Init( 248 resolve_errors_with_web_service_.Init(
218 prefs::kAlternateErrorPagesEnabled, 249 prefs::kAlternateErrorPagesEnabled,
219 profile->GetPrefs()); 250 profile->GetPrefs());
220 } 251 }
221 252
222 bool NetErrorTabHelper::ProbesAllowed() const { 253 bool NetErrorTabHelper::ProbesAllowed() const {
223 if (testing_state_ != TESTING_DEFAULT) 254 if (testing_state_ != TESTING_DEFAULT)
224 return testing_state_ == TESTING_FORCE_ENABLED; 255 return testing_state_ == TESTING_FORCE_ENABLED;
225 256
226 // TODO(ttuttle): Disable on mobile? 257 // TODO(ttuttle): Disable on mobile?
227 return enabled_by_trial_ && *resolve_errors_with_web_service_; 258 return enabled_by_trial_ && *resolve_errors_with_web_service_;
228 } 259 }
229 260
230 } // namespace chrome_browser_net 261 } // namespace chrome_browser_net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698