Index: chrome/browser/sessions/session_service.cc |
diff --git a/chrome/browser/sessions/session_service.cc b/chrome/browser/sessions/session_service.cc |
index 229b3607b6a877472e3ac35922c596aab23e7da8..e46b4107ab62b0947d70cb592fdddd004a865154 100644 |
--- a/chrome/browser/sessions/session_service.cc |
+++ b/chrome/browser/sessions/session_service.cc |
@@ -45,6 +45,10 @@ |
#include "chrome/browser/app_controller_mac.h" |
#endif |
+#if defined(USE_ASH) |
+#include "ash/wm/window_util.h" |
+#endif |
+ |
using base::Time; |
using content::NavigationEntry; |
using content::WebContents; |
@@ -77,6 +81,7 @@ static const SessionCommand::id_type kCommandWindowClosed = 17; |
static const SessionCommand::id_type kCommandSetTabUserAgentOverride = 18; |
static const SessionCommand::id_type kCommandSessionStorageAssociated = 19; |
static const SessionCommand::id_type kCommandSetActiveWindow = 20; |
+static const SessionCommand::id_type kCommandSetWindowBounds4 = 21; |
// Every kWritesPerReset commands triggers recreating the file. |
static const int kWritesPerReset = 250; |
@@ -130,6 +135,16 @@ struct WindowBoundsPayload3 { |
int32 show_state; |
}; |
+struct WindowBoundsPayload4 { |
+ SessionID::id_type window_id; |
+ int32 x; |
+ int32 y; |
+ int32 w; |
+ int32 h; |
+ int32 show_state; |
+ bool user_has_changed_window_or_position; |
+}; |
+ |
typedef SessionID::id_type ActiveWindowPayload; |
struct IDAndIndexPayload { |
@@ -257,13 +272,18 @@ void SessionService::SetTabWindow(const SessionID& window_id, |
ScheduleCommand(CreateSetTabWindowCommand(window_id, tab_id)); |
} |
-void SessionService::SetWindowBounds(const SessionID& window_id, |
- const gfx::Rect& bounds, |
- ui::WindowShowState show_state) { |
+void SessionService::SetWindowBounds( |
+ const SessionID& window_id, |
+ const gfx::Rect& bounds, |
+ ui::WindowShowState show_state, |
+ bool user_has_changed_window_or_position) { |
if (!ShouldTrackChangesToWindow(window_id)) |
return; |
- |
- ScheduleCommand(CreateSetWindowBoundsCommand(window_id, bounds, show_state)); |
+ ScheduleCommand(CreateSetWindowBoundsCommand( |
+ window_id, |
+ bounds, |
+ show_state, |
+ user_has_changed_window_or_position)); |
} |
void SessionService::SetTabIndexInWindow(const SessionID& window_id, |
@@ -744,15 +764,18 @@ SessionCommand* SessionService::CreateSetTabWindowCommand( |
SessionCommand* SessionService::CreateSetWindowBoundsCommand( |
const SessionID& window_id, |
const gfx::Rect& bounds, |
- ui::WindowShowState show_state) { |
- WindowBoundsPayload3 payload = { 0 }; |
+ ui::WindowShowState show_state, |
+ bool user_has_changed_window_or_position) { |
+ WindowBoundsPayload4 payload = { 0 }; |
payload.window_id = window_id.id(); |
payload.x = bounds.x(); |
payload.y = bounds.y(); |
payload.w = bounds.width(); |
payload.h = bounds.height(); |
payload.show_state = AdjustShowState(show_state); |
- SessionCommand* command = new SessionCommand(kCommandSetWindowBounds3, |
+ payload.user_has_changed_window_or_position = |
+ user_has_changed_window_or_position; |
+ SessionCommand* command = new SessionCommand(kCommandSetWindowBounds4, |
sizeof(payload)); |
memcpy(command->contents(), &payload, sizeof(payload)); |
return command; |
@@ -1086,6 +1109,32 @@ bool SessionService::CreateTabsAndWindows( |
break; |
} |
+ case kCommandSetWindowBounds4: { |
+ WindowBoundsPayload4 payload; |
+ if (!command->GetPayload(&payload, sizeof(payload))) { |
+ VLOG(1) << "Failed reading command " << command->id(); |
+ return true; |
+ } |
+ GetWindow(payload.window_id, windows)->bounds.SetRect(payload.x, |
+ payload.y, |
+ payload.w, |
+ payload.h); |
+ // SHOW_STATE_INACTIVE is not persisted. |
+ ui::WindowShowState show_state = ui::SHOW_STATE_NORMAL; |
+ if (payload.show_state > ui::SHOW_STATE_DEFAULT && |
+ payload.show_state < ui::SHOW_STATE_END && |
+ payload.show_state != ui::SHOW_STATE_INACTIVE) { |
+ show_state = static_cast<ui::WindowShowState>(payload.show_state); |
+ } else { |
+ NOTREACHED(); |
+ } |
+ GetWindow(payload.window_id, windows)->show_state = show_state; |
+ GetWindow(payload.window_id, |
+ windows)->user_has_changed_window_or_position = |
+ payload.user_has_changed_window_or_position; |
+ break; |
+ } |
+ |
case kCommandSetTabIndexInWindow: { |
TabIndexInWindowPayload payload; |
if (!command->GetPayload(&payload, sizeof(payload))) { |
@@ -1374,10 +1423,17 @@ void SessionService::BuildCommandsForBrowser( |
else if (browser->window()->IsMinimized()) |
show_state = ui::SHOW_STATE_MINIMIZED; |
+ bool user_has_changed_window_or_position = false; |
+#if defined(USE_ASH) |
+ user_has_changed_window_or_position = |
+ ash::wm::HasUserChangedWindowPositionOrSize( |
+ browser->window()->GetNativeWindow()); |
+#endif |
commands->push_back( |
CreateSetWindowBoundsCommand(browser->session_id(), |
browser->window()->GetRestoredBounds(), |
- show_state)); |
+ show_state, |
+ user_has_changed_window_or_position)); |
commands->push_back(CreateSetWindowTypeCommand( |
browser->session_id(), WindowTypeForBrowserType(browser->type()))); |