Home | History | Annotate | Download | only in browser
      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 
     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