Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(468)

Side by Side Diff: chrome/browser/sessions/session_service.cc

Issue 7621061: Restoring a session should restore window minimization state (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressing Mark's comments. Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/sessions/session_service.h" 5 #include "chrome/browser/sessions/session_service.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <set> 9 #include <set>
10 #include <vector> 10 #include <vector>
(...skipping 26 matching lines...) Expand all
37 #include "content/common/notification_service.h" 37 #include "content/common/notification_service.h"
38 38
39 #if defined(OS_MACOSX) 39 #if defined(OS_MACOSX)
40 #include "chrome/browser/app_controller_cppsafe_mac.h" 40 #include "chrome/browser/app_controller_cppsafe_mac.h"
41 #endif 41 #endif
42 42
43 using base::Time; 43 using base::Time;
44 44
45 // Identifier for commands written to file. 45 // Identifier for commands written to file.
46 static const SessionCommand::id_type kCommandSetTabWindow = 0; 46 static const SessionCommand::id_type kCommandSetTabWindow = 0;
47 // kCommandSetWindowBounds is no longer used (it's superseded by 47 // OBSOLETE Superseded by kCommandSetWindowBounds3.
48 // kCommandSetWindowBounds2). I leave it here to document what it was.
49 // static const SessionCommand::id_type kCommandSetWindowBounds = 1; 48 // static const SessionCommand::id_type kCommandSetWindowBounds = 1;
50 static const SessionCommand::id_type kCommandSetTabIndexInWindow = 2; 49 static const SessionCommand::id_type kCommandSetTabIndexInWindow = 2;
51 static const SessionCommand::id_type kCommandTabClosed = 3; 50 static const SessionCommand::id_type kCommandTabClosed = 3;
52 static const SessionCommand::id_type kCommandWindowClosed = 4; 51 static const SessionCommand::id_type kCommandWindowClosed = 4;
53 static const SessionCommand::id_type 52 static const SessionCommand::id_type
54 kCommandTabNavigationPathPrunedFromBack = 5; 53 kCommandTabNavigationPathPrunedFromBack = 5;
55 static const SessionCommand::id_type kCommandUpdateTabNavigation = 6; 54 static const SessionCommand::id_type kCommandUpdateTabNavigation = 6;
56 static const SessionCommand::id_type kCommandSetSelectedNavigationIndex = 7; 55 static const SessionCommand::id_type kCommandSetSelectedNavigationIndex = 7;
57 static const SessionCommand::id_type kCommandSetSelectedTabInIndex = 8; 56 static const SessionCommand::id_type kCommandSetSelectedTabInIndex = 8;
58 static const SessionCommand::id_type kCommandSetWindowType = 9; 57 static const SessionCommand::id_type kCommandSetWindowType = 9;
59 static const SessionCommand::id_type kCommandSetWindowBounds2 = 10; 58 // OBSOLETE Superseded by kCommandSetWindowBounds3. Except for data migration.
59 // static const SessionCommand::id_type kCommandSetWindowBounds2 = 10;
60 static const SessionCommand::id_type 60 static const SessionCommand::id_type
61 kCommandTabNavigationPathPrunedFromFront = 11; 61 kCommandTabNavigationPathPrunedFromFront = 11;
62 static const SessionCommand::id_type kCommandSetPinnedState = 12; 62 static const SessionCommand::id_type kCommandSetPinnedState = 12;
63 static const SessionCommand::id_type kCommandSetExtensionAppID = 13; 63 static const SessionCommand::id_type kCommandSetExtensionAppID = 13;
64 static const SessionCommand::id_type kCommandSetWindowBounds3 = 14;
64 65
65 // Every kWritesPerReset commands triggers recreating the file. 66 // Every kWritesPerReset commands triggers recreating the file.
66 static const int kWritesPerReset = 250; 67 static const int kWritesPerReset = 250;
67 68
68 namespace { 69 namespace {
69 70
70 // The callback from GetLastSession is internally routed to SessionService 71 // The callback from GetLastSession is internally routed to SessionService
71 // first and then the caller. This is done so that the SessionWindows can be 72 // first and then the caller. This is done so that the SessionWindows can be
72 // recreated from the SessionCommands and the SessionWindows passed to the 73 // recreated from the SessionCommands and the SessionWindows passed to the
73 // caller. The following class is used for this. 74 // caller. The following class is used for this.
(...skipping 24 matching lines...) Expand all
98 99
99 struct WindowBoundsPayload2 { 100 struct WindowBoundsPayload2 {
100 SessionID::id_type window_id; 101 SessionID::id_type window_id;
101 int32 x; 102 int32 x;
102 int32 y; 103 int32 y;
103 int32 w; 104 int32 w;
104 int32 h; 105 int32 h;
105 bool is_maximized; 106 bool is_maximized;
106 }; 107 };
107 108
109 struct WindowBoundsPayload3 {
110 SessionID::id_type window_id;
111 int32 x;
112 int32 y;
113 int32 w;
114 int32 h;
115 int32 show_state;
116 };
117
108 struct IDAndIndexPayload { 118 struct IDAndIndexPayload {
109 SessionID::id_type id; 119 SessionID::id_type id;
110 int32 index; 120 int32 index;
111 }; 121 };
112 122
113 typedef IDAndIndexPayload TabIndexInWindowPayload; 123 typedef IDAndIndexPayload TabIndexInWindowPayload;
114 124
115 typedef IDAndIndexPayload TabNavigationPathPrunedFromBackPayload; 125 typedef IDAndIndexPayload TabNavigationPathPrunedFromBackPayload;
116 126
117 typedef IDAndIndexPayload SelectedNavigationIndexPayload; 127 typedef IDAndIndexPayload SelectedNavigationIndexPayload;
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 void SessionService::SetTabWindow(const SessionID& window_id, 191 void SessionService::SetTabWindow(const SessionID& window_id,
182 const SessionID& tab_id) { 192 const SessionID& tab_id) {
183 if (!ShouldTrackChangesToWindow(window_id)) 193 if (!ShouldTrackChangesToWindow(window_id))
184 return; 194 return;
185 195
186 ScheduleCommand(CreateSetTabWindowCommand(window_id, tab_id)); 196 ScheduleCommand(CreateSetTabWindowCommand(window_id, tab_id));
187 } 197 }
188 198
189 void SessionService::SetWindowBounds(const SessionID& window_id, 199 void SessionService::SetWindowBounds(const SessionID& window_id,
190 const gfx::Rect& bounds, 200 const gfx::Rect& bounds,
191 bool is_maximized) { 201 ui::WindowShowState show_state) {
192 if (!ShouldTrackChangesToWindow(window_id)) 202 if (!ShouldTrackChangesToWindow(window_id))
193 return; 203 return;
194 204
195 ScheduleCommand(CreateSetWindowBoundsCommand(window_id, bounds, 205 ScheduleCommand(CreateSetWindowBoundsCommand(window_id, bounds, show_state));
196 is_maximized));
197 } 206 }
198 207
199 void SessionService::SetTabIndexInWindow(const SessionID& window_id, 208 void SessionService::SetTabIndexInWindow(const SessionID& window_id,
200 const SessionID& tab_id, 209 const SessionID& tab_id,
201 int new_index) { 210 int new_index) {
202 if (!ShouldTrackChangesToWindow(window_id)) 211 if (!ShouldTrackChangesToWindow(window_id))
203 return; 212 return;
204 213
205 ScheduleCommand(CreateSetTabIndexInWindowCommand(tab_id, new_index)); 214 ScheduleCommand(CreateSetTabIndexInWindowCommand(tab_id, new_index));
206 } 215 }
(...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after
660 SessionID::id_type payload[] = { window_id.id(), tab_id.id() }; 669 SessionID::id_type payload[] = { window_id.id(), tab_id.id() };
661 SessionCommand* command = 670 SessionCommand* command =
662 new SessionCommand(kCommandSetTabWindow, sizeof(payload)); 671 new SessionCommand(kCommandSetTabWindow, sizeof(payload));
663 memcpy(command->contents(), payload, sizeof(payload)); 672 memcpy(command->contents(), payload, sizeof(payload));
664 return command; 673 return command;
665 } 674 }
666 675
667 SessionCommand* SessionService::CreateSetWindowBoundsCommand( 676 SessionCommand* SessionService::CreateSetWindowBoundsCommand(
668 const SessionID& window_id, 677 const SessionID& window_id,
669 const gfx::Rect& bounds, 678 const gfx::Rect& bounds,
670 bool is_maximized) { 679 ui::WindowShowState show_state) {
671 WindowBoundsPayload2 payload = { 0 }; 680 WindowBoundsPayload3 payload = { 0 };
672 payload.window_id = window_id.id(); 681 payload.window_id = window_id.id();
673 payload.x = bounds.x(); 682 payload.x = bounds.x();
674 payload.y = bounds.y(); 683 payload.y = bounds.y();
675 payload.w = bounds.width(); 684 payload.w = bounds.width();
676 payload.h = bounds.height(); 685 payload.h = bounds.height();
677 payload.is_maximized = is_maximized; 686 payload.show_state = show_state;
678 SessionCommand* command = new SessionCommand(kCommandSetWindowBounds2, 687 SessionCommand* command = new SessionCommand(kCommandSetWindowBounds3,
679 sizeof(payload)); 688 sizeof(payload));
680 memcpy(command->contents(), &payload, sizeof(payload)); 689 memcpy(command->contents(), &payload, sizeof(payload));
681 return command; 690 return command;
682 } 691 }
683 692
684 SessionCommand* SessionService::CreateSetTabIndexInWindowCommand( 693 SessionCommand* SessionService::CreateSetTabIndexInWindowCommand(
685 const SessionID& tab_id, 694 const SessionID& tab_id,
686 int new_index) { 695 int new_index) {
687 TabIndexInWindowPayload payload = { 0 }; 696 TabIndexInWindowPayload payload = { 0 };
688 payload.id = tab_id.id(); 697 payload.id = tab_id.id();
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
918 927
919 bool SessionService::CreateTabsAndWindows( 928 bool SessionService::CreateTabsAndWindows(
920 const std::vector<SessionCommand*>& data, 929 const std::vector<SessionCommand*>& data,
921 std::map<int, SessionTab*>* tabs, 930 std::map<int, SessionTab*>* tabs,
922 std::map<int, SessionWindow*>* windows) { 931 std::map<int, SessionWindow*>* windows) {
923 // If the file is corrupt (command with wrong size, or unknown command), we 932 // If the file is corrupt (command with wrong size, or unknown command), we
924 // still return true and attempt to restore what we we can. 933 // still return true and attempt to restore what we we can.
925 934
926 for (std::vector<SessionCommand*>::const_iterator i = data.begin(); 935 for (std::vector<SessionCommand*>::const_iterator i = data.begin();
927 i != data.end(); ++i) { 936 i != data.end(); ++i) {
937 const SessionCommand::id_type kCommandSetWindowBounds2 = 10;
928 const SessionCommand* command = *i; 938 const SessionCommand* command = *i;
929 939
930 switch (command->id()) { 940 switch (command->id()) {
931 case kCommandSetTabWindow: { 941 case kCommandSetTabWindow: {
932 SessionID::id_type payload[2]; 942 SessionID::id_type payload[2];
933 if (!command->GetPayload(payload, sizeof(payload))) 943 if (!command->GetPayload(payload, sizeof(payload)))
934 return true; 944 return true;
935 GetTab(payload[1], tabs)->window_id.set_id(payload[0]); 945 GetTab(payload[1], tabs)->window_id.set_id(payload[0]);
936 break; 946 break;
937 } 947 }
938 948
949 // This is here for forward migration only. New data is saved with
950 // |kCommandSetWindowBounds3|.
939 case kCommandSetWindowBounds2: { 951 case kCommandSetWindowBounds2: {
940 WindowBoundsPayload2 payload; 952 WindowBoundsPayload2 payload;
941 if (!command->GetPayload(&payload, sizeof(payload))) 953 if (!command->GetPayload(&payload, sizeof(payload)))
942 return true; 954 return true;
943 GetWindow(payload.window_id, windows)->bounds.SetRect(payload.x, 955 GetWindow(payload.window_id, windows)->bounds.SetRect(payload.x,
944 payload.y, 956 payload.y,
945 payload.w, 957 payload.w,
946 payload.h); 958 payload.h);
947 GetWindow(payload.window_id, windows)->is_maximized = 959 GetWindow(payload.window_id, windows)->show_state =
948 payload.is_maximized; 960 payload.is_maximized ?
961 ui::SHOW_STATE_MAXIMIZED : ui::SHOW_STATE_NORMAL;
949 break; 962 break;
950 } 963 }
951 964
965 case kCommandSetWindowBounds3: {
966 WindowBoundsPayload3 payload;
967 if (!command->GetPayload(&payload, sizeof(payload)))
968 return true;
969 GetWindow(payload.window_id, windows)->bounds.SetRect(payload.x,
970 payload.y,
971 payload.w,
972 payload.h);
973 ui::WindowShowState show_state = ui::SHOW_STATE_NORMAL;
974 if (payload.show_state > ui::SHOW_STATE_DEFAULT &&
975 payload.show_state < ui::SHOW_STATE_MAX) {
976 show_state = static_cast<ui::WindowShowState>(payload.show_state);
977 } else {
978 NOTREACHED();
979 }
980 GetWindow(payload.window_id, windows)->show_state = show_state;
981 break;
982 }
983
952 case kCommandSetTabIndexInWindow: { 984 case kCommandSetTabIndexInWindow: {
953 TabIndexInWindowPayload payload; 985 TabIndexInWindowPayload payload;
954 if (!command->GetPayload(&payload, sizeof(payload))) 986 if (!command->GetPayload(&payload, sizeof(payload)))
955 return true; 987 return true;
956 GetTab(payload.id, tabs)->tab_visual_index = payload.index; 988 GetTab(payload.id, tabs)->tab_visual_index = payload.index;
957 break; 989 break;
958 } 990 }
959 991
960 case kCommandTabClosed: 992 case kCommandTabClosed:
961 case kCommandWindowClosed: { 993 case kCommandWindowClosed: {
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
1130 } 1162 }
1131 1163
1132 void SessionService::BuildCommandsForBrowser( 1164 void SessionService::BuildCommandsForBrowser(
1133 Browser* browser, 1165 Browser* browser,
1134 std::vector<SessionCommand*>* commands, 1166 std::vector<SessionCommand*>* commands,
1135 IdToRange* tab_to_available_range, 1167 IdToRange* tab_to_available_range,
1136 std::set<SessionID::id_type>* windows_to_track) { 1168 std::set<SessionID::id_type>* windows_to_track) {
1137 DCHECK(browser && commands); 1169 DCHECK(browser && commands);
1138 DCHECK(browser->session_id().id()); 1170 DCHECK(browser->session_id().id());
1139 1171
1172 ui::WindowShowState show_state = ui::SHOW_STATE_NORMAL;
1173 if (browser->window()->IsMaximized())
1174 show_state = ui::SHOW_STATE_MAXIMIZED;
1175 else if (browser->window()->IsMinimized())
1176 show_state = ui::SHOW_STATE_MINIMIZED;
1177
1140 commands->push_back( 1178 commands->push_back(
1141 CreateSetWindowBoundsCommand(browser->session_id(), 1179 CreateSetWindowBoundsCommand(browser->session_id(),
1142 browser->window()->GetRestoredBounds(), 1180 browser->window()->GetRestoredBounds(),
1143 browser->window()->IsMaximized())); 1181 show_state));
1144 1182
1145 commands->push_back(CreateSetWindowTypeCommand( 1183 commands->push_back(CreateSetWindowTypeCommand(
1146 browser->session_id(), WindowTypeForBrowserType(browser->type()))); 1184 browser->session_id(), WindowTypeForBrowserType(browser->type())));
1147 1185
1148 bool added_to_windows_to_track = false; 1186 bool added_to_windows_to_track = false;
1149 for (int i = 0; i < browser->tab_count(); ++i) { 1187 for (int i = 0; i < browser->tab_count(); ++i) {
1150 TabContentsWrapper* tab = browser->GetTabContentsWrapperAt(i); 1188 TabContentsWrapper* tab = browser->GetTabContentsWrapperAt(i);
1151 DCHECK(tab); 1189 DCHECK(tab);
1152 if (tab->profile() == profile() || profile() == NULL) { 1190 if (tab->profile() == profile() || profile() == NULL) {
1153 BuildCommandsForTab(browser->session_id(), tab, i, 1191 BuildCommandsForTab(browser->session_id(), tab, i,
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after
1476 50); 1514 50);
1477 if (use_long_period) { 1515 if (use_long_period) {
1478 std::string long_name_("SessionRestore.SaveLongPeriod"); 1516 std::string long_name_("SessionRestore.SaveLongPeriod");
1479 UMA_HISTOGRAM_CUSTOM_TIMES(long_name_, 1517 UMA_HISTOGRAM_CUSTOM_TIMES(long_name_,
1480 delta, 1518 delta,
1481 save_delay_in_mins_, 1519 save_delay_in_mins_,
1482 save_delay_in_hrs_, 1520 save_delay_in_hrs_,
1483 50); 1521 50);
1484 } 1522 }
1485 } 1523 }
OLDNEW
« no previous file with comments | « chrome/browser/sessions/session_service.h ('k') | chrome/browser/sessions/session_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698