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

Unified Diff: chrome/browser/intranet_redirect_detector.h

Issue 525079: Add autodetection of "intranet" redirection, for ISPs etc. that send typos an... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 11 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/first_run.h ('k') | chrome/browser/intranet_redirect_detector.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « chrome/browser/first_run.h ('k') | chrome/browser/intranet_redirect_detector.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698