• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_ALTERNATE_NAV_URL_FETCHER_H_
6 #define CHROME_BROWSER_ALTERNATE_NAV_URL_FETCHER_H_
7 #pragma once
8 
9 #include <string>
10 
11 #include "chrome/browser/tab_contents/link_infobar_delegate.h"
12 #include "chrome/common/net/url_fetcher.h"
13 #include "content/common/notification_observer.h"
14 #include "content/common/notification_registrar.h"
15 
16 class NavigationController;
17 
18 // Attempts to get the HEAD of a host name and displays an info bar if the
19 // request was successful. This is used for single-word queries where we can't
20 // tell if the entry was a search or an intranet hostname. The autocomplete bar
21 // assumes it's a query and issues an AlternateNavURLFetcher to display a "did
22 // you mean" infobar suggesting a navigation.
23 //
24 // The memory management of this object is a bit tricky. The location bar view
25 // will create us and be responsible for us until we attach as an observer
26 // after a pending load starts (it will delete us if this doesn't happen).
27 // Once this pending load starts, we're responsible for deleting ourselves.
28 // We'll do this when the load commits, or when the navigation controller
29 // itself is deleted.
30 class AlternateNavURLFetcher : public NotificationObserver,
31                                public URLFetcher::Delegate,
32                                public LinkInfoBarDelegate {
33  public:
34   enum State {
35     NOT_STARTED,
36     IN_PROGRESS,
37     SUCCEEDED,
38     FAILED,
39   };
40 
41   explicit AlternateNavURLFetcher(const GURL& alternate_nav_url);
42   virtual ~AlternateNavURLFetcher();
43 
state()44   State state() const { return state_; }
45 
46  private:
47   // NotificationObserver
48   virtual void Observe(NotificationType type,
49                        const NotificationSource& source,
50                        const NotificationDetails& details);
51 
52   // URLFetcher::Delegate
53   virtual void OnURLFetchComplete(const URLFetcher* source,
54                                   const GURL& url,
55                                   const net::URLRequestStatus& status,
56                                   int response_code,
57                                   const ResponseCookies& cookies,
58                                   const std::string& data);
59 
60   // LinkInfoBarDelegate
61   virtual SkBitmap* GetIcon() const;
62   virtual Type GetInfoBarType() const;
63   virtual string16 GetMessageTextWithOffset(size_t* link_offset) const;
64   virtual string16 GetLinkText() const;
65   virtual bool LinkClicked(WindowOpenDisposition disposition);
66   virtual void InfoBarClosed();
67 
68   // Sets |state_| to either SUCCEEDED or FAILED depending on the result of the
69   // fetch.
70   void SetStatusFromURLFetch(const GURL& url,
71                              const net::URLRequestStatus& status,
72                              int response_code);
73 
74   // Displays the infobar if all conditions are met (the page has loaded and
75   // the fetch of the alternate URL succeeded).
76   void ShowInfobarIfPossible();
77 
78   GURL alternate_nav_url_;
79   scoped_ptr<URLFetcher> fetcher_;
80   NavigationController* controller_;
81   State state_;
82   bool navigated_to_entry_;
83 
84   // The TabContents the InfoBarDelegate was added to.
85   TabContents* infobar_contents_;
86 
87   NotificationRegistrar registrar_;
88 
89   DISALLOW_COPY_AND_ASSIGN(AlternateNavURLFetcher);
90 };
91 
92 #endif  // CHROME_BROWSER_ALTERNATE_NAV_URL_FETCHER_H_
93