1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_SESSIONS_SESSION_TYPES_H_
6#define CHROME_BROWSER_SESSIONS_SESSION_TYPES_H_
7
8#include <algorithm>
9#include <string>
10#include <vector>
11
12#include "base/memory/scoped_ptr.h"
13#include "base/strings/string16.h"
14#include "base/time/time.h"
15#include "components/sessions/serialized_navigation_entry.h"
16#include "components/sessions/session_id.h"
17#include "sync/protocol/session_specifics.pb.h"
18#include "ui/base/ui_base_types.h"
19#include "ui/gfx/rect.h"
20#include "url/gurl.h"
21
22namespace content {
23class BrowserContext;
24class NavigationEntry;
25}
26
27// SessionTab ----------------------------------------------------------------
28
29// SessionTab corresponds to a NavigationController.
30struct SessionTab {
31  SessionTab();
32  ~SessionTab();
33
34  // Since the current_navigation_index can be larger than the index for number
35  // of navigations in the current sessions (chrome://newtab is not stored), we
36  // must perform bounds checking.
37  // Returns a normalized bounds-checked navigation_index.
38  int normalized_navigation_index() const {
39    return std::max(0, std::min(current_navigation_index,
40                                static_cast<int>(navigations.size() - 1)));
41  }
42
43  // Set all the fields of this object from the given sync data and
44  // timestamp.  Uses SerializedNavigationEntry::FromSyncData to fill
45  // |navigations|.  Note that the sync protocol buffer doesn't
46  // contain all SerializedNavigationEntry fields.
47  void SetFromSyncData(const sync_pb::SessionTab& sync_data,
48                       base::Time timestamp);
49
50  // Convert this object into its sync protocol buffer equivalent.
51  // Uses SerializedNavigationEntry::ToSyncData to convert |navigations|.  Note
52  // that the protocol buffer doesn't contain all SerializedNavigationEntry
53  // fields, and that the returned protocol buffer doesn't have any
54  // favicon data.
55  sync_pb::SessionTab ToSyncData() const;
56
57  // Unique id of the window.
58  SessionID window_id;
59
60  // Unique if of the tab.
61  SessionID tab_id;
62
63  // Visual index of the tab within its window. There may be gaps in these
64  // values.
65  //
66  // NOTE: this is really only useful for the SessionService during
67  // restore, others can likely ignore this and use the order of the
68  // tabs in SessionWindow.tabs.
69  int tab_visual_index;
70
71  // Identifies the index of the current navigation in navigations. For
72  // example, if this is 2 it means the current navigation is navigations[2].
73  //
74  // NOTE: when the service is creating SessionTabs, initially this corresponds
75  // to SerializedNavigationEntry.index, not the index in navigations. When done
76  // creating though, this is set to the index in navigations.
77  //
78  // NOTE 2: this value can be larger than the size of |navigations|, due to
79  // only valid url's being stored (ie chrome://newtab is not stored). Bounds
80  // checking must be performed before indexing into |navigations|.
81  int current_navigation_index;
82
83  // True if the tab is pinned.
84  bool pinned;
85
86  // If non-empty, this tab is an app tab and this is the id of the extension.
87  std::string extension_app_id;
88
89  // If non-empty, this string is used as the user agent whenever the tab's
90  // NavigationEntries need it overridden.
91  std::string user_agent_override;
92
93  // Timestamp for when this tab was last modified.
94  base::Time timestamp;
95
96  std::vector<sessions::SerializedNavigationEntry> navigations;
97
98  // For reassociating sessionStorage.
99  std::string session_storage_persistent_id;
100
101 private:
102  DISALLOW_COPY_AND_ASSIGN(SessionTab);
103};
104
105// SessionWindow -------------------------------------------------------------
106
107// Describes a saved window.
108struct SessionWindow {
109  SessionWindow();
110  ~SessionWindow();
111
112  // Convert this object into its sync protocol buffer equivalent. Note that
113  // not all fields are synced here, because they don't all make sense or
114  // translate when restoring a SessionWindow on another device.
115  sync_pb::SessionWindow ToSyncData() const;
116
117  // Identifier of the window.
118  SessionID window_id;
119
120  // Bounds of the window.
121  gfx::Rect bounds;
122
123  // Index of the selected tab in tabs; -1 if no tab is selected. After restore
124  // this value is guaranteed to be a valid index into tabs.
125  //
126  // NOTE: when the service is creating SessionWindows, initially this
127  // corresponds to SessionTab.tab_visual_index, not the index in
128  // tabs. When done creating though, this is set to the index in
129  // tabs.
130  int selected_tab_index;
131
132  // Type of the browser. Currently we only store browsers of type
133  // TYPE_TABBED and TYPE_POPUP.
134  // This would be Browser::Type, but that would cause a circular dependency.
135  int type;
136
137  // If true, the window is constrained.
138  //
139  // Currently SessionService prunes all constrained windows so that session
140  // restore does not attempt to restore them.
141  bool is_constrained;
142
143  // Timestamp for when this window was last modified.
144  base::Time timestamp;
145
146  // The tabs, ordered by visual order.
147  std::vector<SessionTab*> tabs;
148
149  // Is the window maximized, minimized, or normal?
150  ui::WindowShowState show_state;
151
152  std::string app_name;
153
154 private:
155  DISALLOW_COPY_AND_ASSIGN(SessionWindow);
156};
157
158#endif  // CHROME_BROWSER_SESSIONS_SESSION_TYPES_H_
159