// Copyright (c) 2013 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_COMMON_PAGE_STATE_H_
#define CONTENT_PUBLIC_COMMON_PAGE_STATE_H_

#include <string>
#include <vector>

#include "content/common/content_export.h"

class GURL;

namespace base {
class FilePath;
}

namespace content {

// The PageState class represents the information needed by the rendering
// engine to reconstruct a web page (and its tree of frames), including for
// example the URLs of the documents and the values of any form fields.  This
// information is used when navigating back & forward through session history.
//
// The format of the encoded data is not exposed by the content API.
class CONTENT_EXPORT PageState {
 public:
  static PageState CreateFromEncodedData(const std::string& data);
  static PageState CreateFromURL(const GURL& url);

  static PageState CreateForTesting(
      const GURL& url,
      bool body_contains_password_data,
      const char* optional_body_data,
      const base::FilePath* optional_body_file_path);

  PageState();

  bool IsValid() const;
  bool Equals(const PageState& page_state) const;
  const std::string& ToEncodedData() const;

  std::vector<base::FilePath> GetReferencedFiles() const;
  PageState RemovePasswordData() const;
  PageState RemoveScrollOffset() const;
  PageState RemoveReferrer() const;

 private:
  PageState(const std::string& data);

  std::string data_;
};

// Support DCHECK_EQ(a, b), etc.
inline bool operator==(const PageState& a, const PageState& b) {
  return a.Equals(b);
}
inline bool operator!=(const PageState& a, const PageState& b) {
  return !(a == b);
}

}  // namespace content

#endif  // CONTENT_PUBLIC_COMMON_PAGE_STATE_H_
