// Copyright 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 COMPONENTS_SESSIONS_SERIALIZED_NAVIGATION_ENTRY_H_
#define COMPONENTS_SESSIONS_SERIALIZED_NAVIGATION_ENTRY_H_
#include <set>
#include <string>
#include <vector>
#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
#include "base/strings/string16.h"
#include "base/time/time.h"
#include "components/sessions/sessions_export.h"
#include "content/public/common/page_state.h"
#include "content/public/common/page_transition_types.h"
#include "content/public/common/referrer.h"
#include "url/gurl.h"
class Pickle;
class PickleIterator;
namespace content {
class BrowserContext;
class NavigationEntry;
}
namespace sync_pb {
class TabNavigation;
}
namespace sessions {
class SerializedNavigationEntryTestHelper;
// The key used to store search terms data in the NavigationEntry.
SESSIONS_EXPORT extern const char kSearchTermsKey[];
// SerializedNavigationEntry is a "freeze-dried" version of NavigationEntry. It
// contains the data needed to restore a NavigationEntry during session restore
// and tab restore, and it can also be pickled and unpickled. It is also
// convertible to a sync protocol buffer for session syncing.
//
// Default copy constructor and assignment operator welcome.
class SESSIONS_EXPORT SerializedNavigationEntry {
public:
enum BlockedState {
STATE_INVALID = 0,
STATE_ALLOWED = 1,
STATE_BLOCKED = 2,
};
// Creates an invalid (index < 0) SerializedNavigationEntry.
SerializedNavigationEntry();
~SerializedNavigationEntry();
// Construct a SerializedNavigationEntry for a particular index from the given
// NavigationEntry.
static SerializedNavigationEntry FromNavigationEntry(
int index,
const content::NavigationEntry& entry);
// Construct a SerializedNavigationEntry for a particular index from a sync
// protocol buffer. Note that the sync protocol buffer doesn't contain all
// SerializedNavigationEntry fields. Also, the timestamp of the returned
// SerializedNavigationEntry is nulled out, as we assume that the protocol
// buffer is from a foreign session.
static SerializedNavigationEntry FromSyncData(
int index,
const sync_pb::TabNavigation& sync_data);
// Note that not all SerializedNavigationEntry fields are preserved.
// |max_size| is the max number of bytes to write.
void WriteToPickle(int max_size, Pickle* pickle) const;
bool ReadFromPickle(PickleIterator* iterator);
// Convert this SerializedNavigationEntry into a NavigationEntry with the
// given page ID and context. The NavigationEntry will have a transition type
// of PAGE_TRANSITION_RELOAD and a new unique ID.
scoped_ptr<content::NavigationEntry> ToNavigationEntry(
int page_id,
content::BrowserContext* browser_context) const;
// Convert this navigation into its sync protocol buffer equivalent. Note
// that the protocol buffer doesn't contain all SerializedNavigationEntry
// fields.
sync_pb::TabNavigation ToSyncData() const;
// The index in the NavigationController. This SerializedNavigationEntry is
// valid only when the index is non-negative.
int index() const { return index_; }
void set_index(int index) { index_ = index; }
// Accessors for some fields taken from NavigationEntry.
int unique_id() const { return unique_id_; }
const GURL& virtual_url() const { return virtual_url_; }
const base::string16& title() const { return title_; }
const content::PageState& page_state() const { return page_state_; }
const base::string16& search_terms() const { return search_terms_; }
const GURL& favicon_url() const { return favicon_url_; }
int http_status_code() const { return http_status_code_; }
const content::Referrer& referrer() const { return referrer_; }
content::PageTransition transition_type() const {
return transition_type_;
}
bool has_post_data() const { return has_post_data_; }
int64 post_id() const { return post_id_; }
const GURL& original_request_url() const { return original_request_url_; }
bool is_overriding_user_agent() const { return is_overriding_user_agent_; }
base::Time timestamp() const { return timestamp_; }
BlockedState blocked_state() { return blocked_state_; }
void set_blocked_state(BlockedState blocked_state) {
blocked_state_ = blocked_state;
}
std::set<std::string> content_pack_categories() {
return content_pack_categories_;
}
void set_content_pack_categories(
const std::set<std::string>& content_pack_categories) {
content_pack_categories_ = content_pack_categories;
}
// Converts a set of SerializedNavigationEntrys into a list of
// NavigationEntrys with sequential page IDs and the given context. The caller
// owns the returned NavigationEntrys.
static std::vector<content::NavigationEntry*> ToNavigationEntries(
const std::vector<SerializedNavigationEntry>& navigations,
content::BrowserContext* browser_context);
private:
friend class SerializedNavigationEntryTestHelper;
// Index in the NavigationController.
int index_;
// Member variables corresponding to NavigationEntry fields.
int unique_id_;
content::Referrer referrer_;
GURL virtual_url_;
base::string16 title_;
content::PageState page_state_;
content::PageTransition transition_type_;
bool has_post_data_;
int64 post_id_;
GURL original_request_url_;
bool is_overriding_user_agent_;
base::Time timestamp_;
base::string16 search_terms_;
GURL favicon_url_;
int http_status_code_;
// Additional information.
BlockedState blocked_state_;
std::set<std::string> content_pack_categories_;
};
} // namespace sessions
#endif // COMPONENTS_SESSIONS_SERIALIZED_NAVIGATION_ENTRY_H_