summaryrefslogtreecommitdiffstats
path: root/chrome/browser/sessions/session_service.cc
diff options
context:
space:
mode:
authorsky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-14 20:20:09 +0000
committersky@chromium.org <sky@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-14 20:20:09 +0000
commit5c0e648d6f4ea988be36e74cae045ba5f041e5cb (patch)
treef0fb62cf06be0ef7afa2b74babb0fe0ee7c1bc02 /chrome/browser/sessions/session_service.cc
parent2e7054c0c76fe1c9a12de5925b7ad1a7aff94e45 (diff)
downloadchromium_src-5c0e648d6f4ea988be36e74cae045ba5f041e5cb.zip
chromium_src-5c0e648d6f4ea988be36e74cae045ba5f041e5cb.tar.gz
chromium_src-5c0e648d6f4ea988be36e74cae045ba5f041e5cb.tar.bz2
Wires up restoring pinned tabs for session and tab restore
services. And turns on pinned tabs by default on linux. BUG=16634 TEST=Currently this linux only. Try tab pinning and make sure it works. Review URL: http://codereview.chromium.org/149621 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@20650 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/sessions/session_service.cc')
-rw-r--r--chrome/browser/sessions/session_service.cc48
1 files changed, 45 insertions, 3 deletions
diff --git a/chrome/browser/sessions/session_service.cc b/chrome/browser/sessions/session_service.cc
index 33a5e6f..0a9c630 100644
--- a/chrome/browser/sessions/session_service.cc
+++ b/chrome/browser/sessions/session_service.cc
@@ -48,6 +48,7 @@ static const SessionCommand::id_type kCommandSetWindowType = 9;
static const SessionCommand::id_type kCommandSetWindowBounds2 = 10;
static const SessionCommand::id_type
kCommandTabNavigationPathPrunedFromFront = 11;
+static const SessionCommand::id_type kCommandSetPinnedState = 12;
// Every kWritesPerReset commands triggers recreating the file.
static const int kWritesPerReset = 250;
@@ -107,6 +108,11 @@ typedef IDAndIndexPayload WindowTypePayload;
typedef IDAndIndexPayload TabNavigationPathPrunedFromFrontPayload;
+struct PinnedStatePayload {
+ SessionID::id_type tab_id;
+ bool pinned_state;
+};
+
} // namespace
// SessionService -------------------------------------------------------------
@@ -175,6 +181,15 @@ void SessionService::SetTabIndexInWindow(const SessionID& window_id,
ScheduleCommand(CreateSetTabIndexInWindowCommand(tab_id, new_index));
}
+void SessionService::SetPinnedState(const SessionID& window_id,
+ const SessionID& tab_id,
+ bool is_pinned) {
+ if (!ShouldTrackChangesToWindow(window_id))
+ return;
+
+ ScheduleCommand(CreatePinnedStateCommand(tab_id, is_pinned));
+}
+
void SessionService::TabClosed(const SessionID& window_id,
const SessionID& tab_id) {
if (!ShouldTrackChangesToWindow(window_id))
@@ -320,12 +335,13 @@ void SessionService::UpdateTabNavigation(const SessionID& window_id,
tab_id.id(), index, entry));
}
-void SessionService::TabRestored(NavigationController* controller) {
+void SessionService::TabRestored(NavigationController* controller,
+ bool pinned) {
if (!ShouldTrackChangesToWindow(controller->window_id()))
return;
BuildCommandsForTab(controller->window_id(), controller, -1,
- &pending_commands(), NULL);
+ pinned, &pending_commands(), NULL);
StartSaveTimer();
}
@@ -562,7 +578,7 @@ SessionCommand* SessionService::CreateSetSelectedNavigationIndexCommand(
SessionCommand* SessionService::CreateSetWindowTypeCommand(
const SessionID& window_id,
Browser::Type type) {
- WindowTypePayload payload = { 0 };
+ WindowTypePayload payload = { 0 };
payload.id = window_id.id();
payload.index = static_cast<int32>(type);
SessionCommand* command = new SessionCommand(
@@ -571,6 +587,18 @@ SessionCommand* SessionService::CreateSetWindowTypeCommand(
return command;
}
+SessionCommand* SessionService::CreatePinnedStateCommand(
+ const SessionID& tab_id,
+ bool is_pinned) {
+ PinnedStatePayload payload = { 0 };
+ payload.tab_id = tab_id.id();
+ payload.pinned_state = is_pinned;
+ SessionCommand* command =
+ new SessionCommand(kCommandSetPinnedState, sizeof(payload));
+ memcpy(command->contents(), &payload, sizeof(payload));
+ return command;
+}
+
void SessionService::OnGotLastSessionCommands(
Handle handle,
scoped_refptr<InternalGetCommandsRequest> request) {
@@ -863,6 +891,14 @@ bool SessionService::CreateTabsAndWindows(
break;
}
+ case kCommandSetPinnedState: {
+ PinnedStatePayload payload;
+ if (!command->GetPayload(&payload, sizeof(payload)))
+ return true;
+ GetTab(payload.tab_id, tabs)->pinned = payload.pinned_state;
+ break;
+ }
+
default:
return true;
}
@@ -874,6 +910,7 @@ void SessionService::BuildCommandsForTab(
const SessionID& window_id,
NavigationController* controller,
int index_in_window,
+ bool is_pinned,
std::vector<SessionCommand*>* commands,
IdToRange* tab_to_available_range) {
DCHECK(controller && commands && window_id.id());
@@ -889,6 +926,10 @@ void SessionService::BuildCommandsForTab(
(*tab_to_available_range)[controller->session_id().id()] =
std::pair<int, int>(min_index, max_index);
}
+ if (is_pinned) {
+ commands->push_back(
+ CreatePinnedStateCommand(controller->session_id(), true));
+ }
for (int i = min_index; i < max_index; ++i) {
const NavigationEntry* entry = (i == pending_index) ?
controller->pending_entry() : controller->GetEntryAtIndex(i);
@@ -934,6 +975,7 @@ void SessionService::BuildCommandsForBrowser(
DCHECK(tab);
if (tab->profile() == profile()) {
BuildCommandsForTab(browser->session_id(), &tab->controller(), i,
+ browser->tabstrip_model()->IsTabPinned(i),
commands, tab_to_available_range);
if (windows_to_track && !added_to_windows_to_track) {
windows_to_track->insert(browser->session_id().id());