// 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_HISTORY_VISIT_TRACKER_H__
#define CHROME_BROWSER_HISTORY_VISIT_TRACKER_H__

#include <map>
#include <vector>

#include "base/basictypes.h"
#include "chrome/browser/history/history_types.h"

namespace history {

// Tracks history transitions between pages. The history backend uses this to
// link up page transitions to form a chain of page visits, and to set the
// transition type properly.
//
// This class is not thread safe.
class VisitTracker {
 public:
  VisitTracker();
  ~VisitTracker();

  // Notifications -------------------------------------------------------------

  void AddVisit(ContextID context_id,
                int32 page_id,
                const GURL& url,
                VisitID visit_id);

  // When a RenderProcessHost is destroyed, we want to clear out our saved
  // transitions/visit IDs for it.
  void ClearCachedDataForContextID(ContextID context_id);

  // Querying ------------------------------------------------------------------

  // Returns the visit ID for the transition given information about the visit
  // supplied by the renderer. We will return 0 if there is no appropriate
  // referring visit.
  VisitID GetLastVisit(ContextID context_id, int32 page_id, const GURL& url);

 private:
  struct Transition {
    GURL url;          // URL that the event happened to.
    int32 page_id;     // ID generated by the render process host.
    VisitID visit_id;  // Visit ID generated by history.
  };
  typedef std::vector<Transition> TransitionList;
  typedef std::map<ContextID, TransitionList*> ContextList;

  // Expires oldish items in the given transition list. This keeps the list
  // size small by removing items that are unlikely to be needed, which is
  // important for GetReferrer which does brute-force searches of this list.
  void CleanupTransitionList(TransitionList* transitions);

  // Maps render view hosts to lists of recent transitions.
  ContextList contexts_;

  DISALLOW_COPY_AND_ASSIGN(VisitTracker);
};

}  // namespace history

#endif  // CHROME_BROWSER_HISTORY_VISIT_TRACKER_H__
