15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_NET_DNS_PROBE_SERVICE_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_NET_DNS_PROBE_SERVICE_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/bind.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/net/dns_probe_runner.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/net/net_error_info.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/network_change_notifier.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass DnsClient; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct DnsConfig; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome_browser_net { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Probes the system and public DNS servers to determine the (probable) cause 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// of a recent DNS-related page load error. Coalesces multiple probe requests 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// (perhaps from multiple tabs) and caches the results. 287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Uses a single DNS attempt per config, and doesn't randomize source ports. 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass DnsProbeService : public net::NetworkChangeNotifier::DNSObserver { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch typedef base::Callback<void(chrome_common_net::DnsProbeStatus result)> 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ProbeCallback; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DnsProbeService(); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~DnsProbeService(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void ProbeDns(const ProbeCallback& callback); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // NetworkChangeNotifier::DNSObserver implementation: 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void OnDNSChanged() OVERRIDE; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SetSystemClientForTesting(scoped_ptr<net::DnsClient> system_client); 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SetPublicClientForTesting(scoped_ptr<net::DnsClient> public_client); 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void ClearCachedResultForTesting(); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum State { 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch STATE_NO_RESULT, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STATE_PROBE_RUNNING, 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch STATE_RESULT_CACHED, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SetSystemClientToCurrentConfig(); 557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SetPublicClientToGooglePublicDns(); 567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Starts a probe (runs system and public probes). 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartProbes(); 597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void OnProbeComplete(); 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Calls all |pending_callbacks_| with the |cached_result_|. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CallCallbacks(); 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Clears a cached probe result. 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void ClearCachedResult(); 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool CachedResultIsExpired() const; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) State state_; 687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::vector<ProbeCallback> pending_callbacks_; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Time probe_start_time_; 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch chrome_common_net::DnsProbeStatus cached_result_; 717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // DnsProbeRunners for the system DNS configuration and a public DNS server. 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DnsProbeRunner system_runner_; 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DnsProbeRunner public_runner_; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DnsProbeService); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chrome_browser_net 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_NET_DNS_PROBE_SERVICE_H_ 82