// Copyright (c) 2017 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 CONTENT_PUBLIC_BROWSER_REPLACED_NAVIGATION_ENTRY_DATA_H_
#define CONTENT_PUBLIC_BROWSER_REPLACED_NAVIGATION_ENTRY_DATA_H_

#include "base/time/time.h"
#include "ui/base/page_transition_types.h"
#include "url/gurl.h"

namespace content {

// Represents a subset of NavigationEntry's fields, stored in this structure for
// the cases where a navigation has been replaced (e.g. history.replaceState())
// and the original values must be remembered. The main goal is to make sure
// important user-initiated navigations like PAGE_TRANSITION_TYPED and
// PAGE_TRANSITION_AUTO_BOOKMARK are not "lost" due to later replacements.
//
// Things worth pointing out:
// - This is the first commit that happens for a given NavigationEntry, before
//   any client redirects, location.replace() events, or history.replaceState()
//   events.
//
// - This URL might not be the same as the first entry in the original redirect
//   chain (aka original_request_url), since it represents the landing URL in
//   the original server-side redirect chain.
//
// - The value is preserved for navigations modifying history, including:
//   a) Cross-document replacement navigations which generate a new
//      NavigationEntry with replacement (e.g. client redirects and
//      location.replace()).
//   b) Same-document cases that update the existing NavigationEntry (e.g.
//      history.replaceState()).
//
// - Keeping a single value of this struct (per navigation controller index) is
//   generally sufficient because the relevant page transition that we care
//   about (PAGE_TRANSITION_TYPED and PAGE_TRANSITION_AUTO_BOOKMARK) always
//   create a new entry.
//
// The concept is valid for subframe navigations but we only need to track it
// for main frame navigations.
struct ReplacedNavigationEntryData {
  // Analogous to NavigationEntry::GetURL(), at the time of the first commit,
  // prior to any replacements. Note that, in the event of server-side
  // redirects, it stores the landing URL.
  GURL first_committed_url;
  // Analogous to NavigationEntry::GetTimestamp(), at the time of the first
  // commit, prior to any replacements. This is useful during analysis of
  // sync-ed history to distinguish whether the entry prior to being replaced
  // was sync-ed or not.
  base::Time first_timestamp;
  // Analogous to NavigationEntry::GetTransitionType(), at the time of the first
  // commit, prior to any replacements.
  ui::PageTransition first_transition_type;
};

}  // namespace content

#endif  // CONTENT_PUBLIC_BROWSER_REPLACED_NAVIGATION_ENTRY_DATA_H_
