OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |