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