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