Index: chrome/browser/intranet_redirect_detector.h |
=================================================================== |
--- chrome/browser/intranet_redirect_detector.h (revision 0) |
+++ chrome/browser/intranet_redirect_detector.h (revision 0) |
@@ -0,0 +1,106 @@ |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CHROME_BROWSER_INTRANET_REDIRECT_DETECTOR_H_ |
+#define CHROME_BROWSER_INTRANET_REDIRECT_DETECTOR_H_ |
+ |
+#include <set> |
+#include <string> |
+#include <vector> |
+ |
+#include "chrome/browser/net/url_fetcher.h" |
+#include "chrome/common/notification_registrar.h" |
+#include "googleurl/src/gurl.h" |
+#include "net/base/host_resolver_proc.h" |
+ |
+class PrefService; |
+ |
+// This object is responsible for determining whether the user is on a network |
+// that redirects requests for intranet hostnames to another site, and if so, |
+// tracking what that site is (including across restarts via a pref). For |
+// example, the user's ISP might convert a request for "http://query/" into a |
+// 302 redirect to "http://isp.domain.com/search?q=query" in order to display |
+// custom pages on typos, nonexistent sites, etc. |
+// |
+// We use this information in the AlternateNavURLFetcher to avoid displaying |
+// infobars for these cases. Our infobars are designed to allow users to get at |
+// intranet sites when they were erroneously taken to a search result page. In |
+// these cases, however, users would be shown a confusing and useless infobar |
+// when they really did mean to do a search. |
+// |
+// Consumers should call RedirectOrigin(), which is guaranteed to synchronously |
+// return a value at all times (even during startup or in unittest mode). If no |
+// redirection is in place, the returned GURL will be empty. |
+class IntranetRedirectDetector : public URLFetcher::Delegate, |
+ public NotificationObserver { |
+ public: |
+ // Only the main browser process loop should call this, when setting up |
+ // g_browser_process->intranet_redirect_detector_. No code other than the |
+ // IntranetRedirectDetector itself should actually use |
+ // g_browser_process->intranet_redirect_detector() (which shouldn't be hard, |
+ // since there aren't useful public functions on this object for consumers to |
+ // access anyway). |
+ IntranetRedirectDetector(); |
+ ~IntranetRedirectDetector(); |
+ |
+ // Returns the current redirect origin. This will be empty if no redirection |
+ // is in place. |
+ static GURL RedirectOrigin(); |
+ |
+ static void RegisterPrefs(PrefService* prefs); |
+ |
+ // The number of characters the fetcher will use for its randomly-generated |
+ // hostnames. |
+ static const size_t kNumCharsInHostnames; |
+ |
+ private: |
+ typedef std::set<URLFetcher*> Fetchers; |
+ |
+ // Called when the five second startup sleep has finished. Runs any pending |
+ // fetch. |
+ void FinishSleep(); |
+ |
+ // Starts the fetches to determine the redirect URL if we can currently do so. |
+ void StartFetchesIfPossible(); |
+ |
+ // URLFetcher::Delegate |
+ virtual void OnURLFetchComplete(const URLFetcher* source, |
+ const GURL& url, |
+ const URLRequestStatus& status, |
+ int response_code, |
+ const ResponseCookies& cookies, |
+ const std::string& data); |
+ |
+ // NotificationObserver |
+ virtual void Observe(NotificationType type, |
+ const NotificationSource& source, |
+ const NotificationDetails& details); |
+ |
+ NotificationRegistrar registrar_; |
+ GURL redirect_origin_; |
+ ScopedRunnableMethodFactory<IntranetRedirectDetector> fetcher_factory_; |
+ Fetchers fetchers_; |
+ std::vector<GURL> resulting_origins_; |
+ bool in_startup_sleep_; // True if we're in the seven-second "no fetching" |
+ // period that begins at browser start. |
+ bool request_context_available_; |
+ // True when the profile has been loaded and the |
+ // default request context created, so we can |
+ // actually do the fetch with the right data. |
+ |
+ DISALLOW_COPY_AND_ASSIGN(IntranetRedirectDetector); |
+}; |
+ |
+// This is for use in testing, where we don't want our fetches to actually go |
+// over the network. It captures the requests and causes them to fail. |
+class IntranetRedirectHostResolverProc : public net::HostResolverProc { |
+ public: |
+ explicit IntranetRedirectHostResolverProc(net::HostResolverProc* previous); |
+ |
+ virtual int Resolve(const std::string& host, |
+ net::AddressFamily address_family, |
+ net::AddressList* addrlist); |
+}; |
+ |
+#endif // CHROME_BROWSER_INTRANET_REDIRECT_DETECTOR_H_ |
Property changes on: chrome/browser/intranet_redirect_detector.h |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |