Index: components/sessions/session_service_commands.cc |
diff --git a/components/sessions/session_service_commands.cc b/components/sessions/session_service_commands.cc |
deleted file mode 100644 |
index 60be71cebb405df55946e25ea7856f2508e6d4b9..0000000000000000000000000000000000000000 |
--- a/components/sessions/session_service_commands.cc |
+++ /dev/null |
@@ -1,873 +0,0 @@ |
-// Copyright 2014 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. |
- |
-#include "components/sessions/session_service_commands.h" |
- |
-#include <vector> |
- |
-#include "base/pickle.h" |
-#include "components/sessions/base_session_service_commands.h" |
-#include "components/sessions/base_session_service_delegate.h" |
-#include "components/sessions/session_command.h" |
-#include "components/sessions/session_types.h" |
- |
-namespace sessions { |
- |
-// Identifier for commands written to file. |
-static const SessionCommand::id_type kCommandSetTabWindow = 0; |
-// OBSOLETE Superseded by kCommandSetWindowBounds3. |
-// static const SessionCommand::id_type kCommandSetWindowBounds = 1; |
-static const SessionCommand::id_type kCommandSetTabIndexInWindow = 2; |
-static const SessionCommand::id_type |
- kCommandTabNavigationPathPrunedFromBack = 5; |
-static const SessionCommand::id_type kCommandUpdateTabNavigation = 6; |
-static const SessionCommand::id_type kCommandSetSelectedNavigationIndex = 7; |
-static const SessionCommand::id_type kCommandSetSelectedTabInIndex = 8; |
-static const SessionCommand::id_type kCommandSetWindowType = 9; |
-// OBSOLETE Superseded by kCommandSetWindowBounds3. Except for data migration. |
-// static const SessionCommand::id_type kCommandSetWindowBounds2 = 10; |
-static const SessionCommand::id_type |
- kCommandTabNavigationPathPrunedFromFront = 11; |
-static const SessionCommand::id_type kCommandSetPinnedState = 12; |
-static const SessionCommand::id_type kCommandSetExtensionAppID = 13; |
-static const SessionCommand::id_type kCommandSetWindowBounds3 = 14; |
-static const SessionCommand::id_type kCommandSetWindowAppName = 15; |
-static const SessionCommand::id_type kCommandTabClosed = 16; |
-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 kCommandLastActiveTime = 21; |
- |
-namespace { |
- |
-// Various payload structures. |
-struct ClosedPayload { |
- SessionID::id_type id; |
- int64 close_time; |
-}; |
- |
-struct WindowBoundsPayload2 { |
- SessionID::id_type window_id; |
- int32 x; |
- int32 y; |
- int32 w; |
- int32 h; |
- bool is_maximized; |
-}; |
- |
-struct WindowBoundsPayload3 { |
- SessionID::id_type window_id; |
- int32 x; |
- int32 y; |
- int32 w; |
- int32 h; |
- int32 show_state; |
-}; |
- |
-typedef SessionID::id_type ActiveWindowPayload; |
- |
-struct IDAndIndexPayload { |
- SessionID::id_type id; |
- int32 index; |
-}; |
- |
-typedef IDAndIndexPayload TabIndexInWindowPayload; |
- |
-typedef IDAndIndexPayload TabNavigationPathPrunedFromBackPayload; |
- |
-typedef IDAndIndexPayload SelectedNavigationIndexPayload; |
- |
-typedef IDAndIndexPayload SelectedTabInIndexPayload; |
- |
-typedef IDAndIndexPayload WindowTypePayload; |
- |
-typedef IDAndIndexPayload TabNavigationPathPrunedFromFrontPayload; |
- |
-struct PinnedStatePayload { |
- SessionID::id_type tab_id; |
- bool pinned_state; |
-}; |
- |
-struct LastActiveTimePayload { |
- SessionID::id_type tab_id; |
- int64 last_active_time; |
-}; |
- |
-// Persisted versions of ui::WindowShowState that are written to disk and can |
-// never change. |
-enum PersistedWindowShowState { |
- // SHOW_STATE_DEFAULT (0) never persisted. |
- PERSISTED_SHOW_STATE_NORMAL = 1, |
- PERSISTED_SHOW_STATE_MINIMIZED = 2, |
- PERSISTED_SHOW_STATE_MAXIMIZED = 3, |
- // SHOW_STATE_INACTIVE (4) never persisted. |
- PERSISTED_SHOW_STATE_FULLSCREEN = 5, |
- PERSISTED_SHOW_STATE_DETACHED_DEPRECATED = 6, |
- PERSISTED_SHOW_STATE_DOCKED = 7, |
- PERSISTED_SHOW_STATE_END = 7 |
-}; |
- |
-typedef std::map<SessionID::id_type, SessionTab*> IdToSessionTab; |
-typedef std::map<SessionID::id_type, SessionWindow*> IdToSessionWindow; |
- |
-// Assert to ensure PersistedWindowShowState is updated if ui::WindowShowState |
-// is changed. |
-static_assert(ui::SHOW_STATE_END == |
- static_cast<ui::WindowShowState>(PERSISTED_SHOW_STATE_END), |
- "SHOW_STATE_END must equal PERSISTED_SHOW_STATE_END"); |
- |
-// Returns the show state to store to disk based |state|. |
-PersistedWindowShowState ShowStateToPersistedShowState( |
- ui::WindowShowState state) { |
- switch (state) { |
- case ui::SHOW_STATE_NORMAL: |
- return PERSISTED_SHOW_STATE_NORMAL; |
- case ui::SHOW_STATE_MINIMIZED: |
- return PERSISTED_SHOW_STATE_MINIMIZED; |
- case ui::SHOW_STATE_MAXIMIZED: |
- return PERSISTED_SHOW_STATE_MAXIMIZED; |
- case ui::SHOW_STATE_FULLSCREEN: |
- return PERSISTED_SHOW_STATE_FULLSCREEN; |
- case ui::SHOW_STATE_DOCKED: |
- return PERSISTED_SHOW_STATE_DOCKED; |
- |
- case ui::SHOW_STATE_DEFAULT: |
- case ui::SHOW_STATE_INACTIVE: |
- return PERSISTED_SHOW_STATE_NORMAL; |
- |
- case ui::SHOW_STATE_END: |
- break; |
- } |
- NOTREACHED(); |
- return PERSISTED_SHOW_STATE_NORMAL; |
-} |
- |
-// Lints show state values when read back from persited disk. |
-ui::WindowShowState PersistedShowStateToShowState(int state) { |
- switch (state) { |
- case PERSISTED_SHOW_STATE_NORMAL: |
- return ui::SHOW_STATE_NORMAL; |
- case PERSISTED_SHOW_STATE_MINIMIZED: |
- return ui::SHOW_STATE_MINIMIZED; |
- case PERSISTED_SHOW_STATE_MAXIMIZED: |
- return ui::SHOW_STATE_MAXIMIZED; |
- case PERSISTED_SHOW_STATE_FULLSCREEN: |
- return ui::SHOW_STATE_FULLSCREEN; |
- case PERSISTED_SHOW_STATE_DOCKED: |
- return ui::SHOW_STATE_DOCKED; |
- case PERSISTED_SHOW_STATE_DETACHED_DEPRECATED: |
- return ui::SHOW_STATE_NORMAL; |
- } |
- NOTREACHED(); |
- return ui::SHOW_STATE_NORMAL; |
-} |
- |
-// Iterates through the vector updating the selected_tab_index of each |
-// SessionWindow based on the actual tabs that were restored. |
-void UpdateSelectedTabIndex(std::vector<SessionWindow*>* windows) { |
- for (std::vector<SessionWindow*>::const_iterator i = windows->begin(); |
- i != windows->end(); ++i) { |
- // See note in SessionWindow as to why we do this. |
- int new_index = 0; |
- for (std::vector<SessionTab*>::const_iterator j = (*i)->tabs.begin(); |
- j != (*i)->tabs.end(); ++j) { |
- if ((*j)->tab_visual_index == (*i)->selected_tab_index) { |
- new_index = static_cast<int>(j - (*i)->tabs.begin()); |
- break; |
- } |
- } |
- (*i)->selected_tab_index = new_index; |
- } |
-} |
- |
-// Returns the window in windows with the specified id. If a window does |
-// not exist, one is created. |
-SessionWindow* GetWindow(SessionID::id_type window_id, |
- IdToSessionWindow* windows) { |
- std::map<int, SessionWindow*>::iterator i = windows->find(window_id); |
- if (i == windows->end()) { |
- SessionWindow* window = new SessionWindow(); |
- window->window_id.set_id(window_id); |
- (*windows)[window_id] = window; |
- return window; |
- } |
- return i->second; |
-} |
- |
-// Returns the tab with the specified id in tabs. If a tab does not exist, |
-// it is created. |
-SessionTab* GetTab(SessionID::id_type tab_id, IdToSessionTab* tabs) { |
- DCHECK(tabs); |
- std::map<int, SessionTab*>::iterator i = tabs->find(tab_id); |
- if (i == tabs->end()) { |
- SessionTab* tab = new SessionTab(); |
- tab->tab_id.set_id(tab_id); |
- (*tabs)[tab_id] = tab; |
- return tab; |
- } |
- return i->second; |
-} |
- |
-// Returns an iterator into navigations pointing to the navigation whose |
-// index matches |index|. If no navigation index matches |index|, the first |
-// navigation with an index > |index| is returned. |
-// |
-// This assumes the navigations are ordered by index in ascending order. |
-std::vector<sessions::SerializedNavigationEntry>::iterator |
- FindClosestNavigationWithIndex( |
- std::vector<sessions::SerializedNavigationEntry>* navigations, |
- int index) { |
- DCHECK(navigations); |
- for (std::vector<sessions::SerializedNavigationEntry>::iterator |
- i = navigations->begin(); i != navigations->end(); ++i) { |
- if (i->index() >= index) |
- return i; |
- } |
- return navigations->end(); |
-} |
- |
-// Function used in sorting windows. Sorting is done based on window id. As |
-// window ids increment for each new window, this effectively sorts by creation |
-// time. |
-static bool WindowOrderSortFunction(const SessionWindow* w1, |
- const SessionWindow* w2) { |
- return w1->window_id.id() < w2->window_id.id(); |
-} |
- |
-// Compares the two tabs based on visual index. |
-static bool TabVisualIndexSortFunction(const SessionTab* t1, |
- const SessionTab* t2) { |
- const int delta = t1->tab_visual_index - t2->tab_visual_index; |
- return delta == 0 ? (t1->tab_id.id() < t2->tab_id.id()) : (delta < 0); |
-} |
- |
-// Does the following: |
-// . Deletes and removes any windows with no tabs. NOTE: constrained windows |
-// that have been dragged out are of type browser. As such, this preserves any |
-// dragged out constrained windows (aka popups that have been dragged out). |
-// . Sorts the tabs in windows with valid tabs based on the tabs |
-// visual order, and adds the valid windows to windows. |
-void SortTabsBasedOnVisualOrderAndPrune( |
- std::map<int, SessionWindow*>* windows, |
- std::vector<SessionWindow*>* valid_windows) { |
- std::map<int, SessionWindow*>::iterator i = windows->begin(); |
- while (i != windows->end()) { |
- SessionWindow* window = i->second; |
- if (window->tabs.empty() || window->is_constrained) { |
- delete window; |
- windows->erase(i++); |
- } else { |
- // Valid window; sort the tabs and add it to the list of valid windows. |
- std::sort(window->tabs.begin(), window->tabs.end(), |
- &TabVisualIndexSortFunction); |
- // Otherwise, add the window such that older windows appear first. |
- if (valid_windows->empty()) { |
- valid_windows->push_back(window); |
- } else { |
- valid_windows->insert( |
- std::upper_bound(valid_windows->begin(), valid_windows->end(), |
- window, &WindowOrderSortFunction), |
- window); |
- } |
- ++i; |
- } |
- } |
-} |
- |
-// Adds tabs to their parent window based on the tab's window_id. This |
-// ignores tabs with no navigations. |
-void AddTabsToWindows(std::map<int, SessionTab*>* tabs, |
- std::map<int, SessionWindow*>* windows) { |
- DVLOG(1) << "AddTabsToWindws"; |
- DVLOG(1) << "Tabs " << tabs->size() << ", windows " << windows->size(); |
- std::map<int, SessionTab*>::iterator i = tabs->begin(); |
- while (i != tabs->end()) { |
- SessionTab* tab = i->second; |
- if (tab->window_id.id() && !tab->navigations.empty()) { |
- SessionWindow* window = GetWindow(tab->window_id.id(), windows); |
- window->tabs.push_back(tab); |
- tabs->erase(i++); |
- |
- // See note in SessionTab as to why we do this. |
- std::vector<sessions::SerializedNavigationEntry>::iterator j = |
- FindClosestNavigationWithIndex(&(tab->navigations), |
- tab->current_navigation_index); |
- if (j == tab->navigations.end()) { |
- tab->current_navigation_index = |
- static_cast<int>(tab->navigations.size() - 1); |
- } else { |
- tab->current_navigation_index = |
- static_cast<int>(j - tab->navigations.begin()); |
- } |
- } else { |
- // Never got a set tab index in window, or tabs are empty, nothing |
- // to do. |
- ++i; |
- } |
- } |
-} |
- |
-// Creates tabs and windows from the commands specified in |data|. The created |
-// tabs and windows are added to |tabs| and |windows| respectively, with the |
-// id of the active window set in |active_window_id|. It is up to the caller |
-// to delete the tabs and windows added to |tabs| and |windows|. |
-// |
-// This does NOT add any created SessionTabs to SessionWindow.tabs, that is |
-// done by AddTabsToWindows. |
-bool CreateTabsAndWindows(const ScopedVector<SessionCommand>& data, |
- std::map<int, SessionTab*>* tabs, |
- std::map<int, SessionWindow*>* windows, |
- SessionID::id_type* active_window_id) { |
- // If the file is corrupt (command with wrong size, or unknown command), we |
- // still return true and attempt to restore what we we can. |
- DVLOG(1) << "CreateTabsAndWindows"; |
- |
- for (std::vector<SessionCommand*>::const_iterator i = data.begin(); |
- i != data.end(); ++i) { |
- const SessionCommand::id_type kCommandSetWindowBounds2 = 10; |
- const SessionCommand* command = *i; |
- |
- DVLOG(1) << "Read command " << (int) command->id(); |
- switch (command->id()) { |
- case kCommandSetTabWindow: { |
- SessionID::id_type payload[2]; |
- if (!command->GetPayload(payload, sizeof(payload))) { |
- DVLOG(1) << "Failed reading command " << command->id(); |
- return true; |
- } |
- GetTab(payload[1], tabs)->window_id.set_id(payload[0]); |
- break; |
- } |
- |
- // This is here for forward migration only. New data is saved with |
- // |kCommandSetWindowBounds3|. |
- case kCommandSetWindowBounds2: { |
- WindowBoundsPayload2 payload; |
- if (!command->GetPayload(&payload, sizeof(payload))) { |
- DVLOG(1) << "Failed reading command " << command->id(); |
- return true; |
- } |
- GetWindow(payload.window_id, windows)->bounds.SetRect(payload.x, |
- payload.y, |
- payload.w, |
- payload.h); |
- GetWindow(payload.window_id, windows)->show_state = |
- payload.is_maximized ? |
- ui::SHOW_STATE_MAXIMIZED : ui::SHOW_STATE_NORMAL; |
- break; |
- } |
- |
- case kCommandSetWindowBounds3: { |
- WindowBoundsPayload3 payload; |
- if (!command->GetPayload(&payload, sizeof(payload))) { |
- DVLOG(1) << "Failed reading command " << command->id(); |
- return true; |
- } |
- GetWindow(payload.window_id, windows)->bounds.SetRect(payload.x, |
- payload.y, |
- payload.w, |
- payload.h); |
- GetWindow(payload.window_id, windows)->show_state = |
- PersistedShowStateToShowState(payload.show_state); |
- break; |
- } |
- |
- case kCommandSetTabIndexInWindow: { |
- TabIndexInWindowPayload payload; |
- if (!command->GetPayload(&payload, sizeof(payload))) { |
- DVLOG(1) << "Failed reading command " << command->id(); |
- return true; |
- } |
- GetTab(payload.id, tabs)->tab_visual_index = payload.index; |
- break; |
- } |
- |
- case kCommandTabClosed: |
- case kCommandWindowClosed: { |
- ClosedPayload payload; |
- if (!command->GetPayload(&payload, sizeof(payload))) { |
- DVLOG(1) << "Failed reading command " << command->id(); |
- return true; |
- } |
- if (command->id() == kCommandTabClosed) { |
- delete GetTab(payload.id, tabs); |
- tabs->erase(payload.id); |
- } else { |
- delete GetWindow(payload.id, windows); |
- windows->erase(payload.id); |
- } |
- break; |
- } |
- |
- case kCommandTabNavigationPathPrunedFromBack: { |
- TabNavigationPathPrunedFromBackPayload payload; |
- if (!command->GetPayload(&payload, sizeof(payload))) { |
- DVLOG(1) << "Failed reading command " << command->id(); |
- return true; |
- } |
- SessionTab* tab = GetTab(payload.id, tabs); |
- tab->navigations.erase( |
- FindClosestNavigationWithIndex(&(tab->navigations), payload.index), |
- tab->navigations.end()); |
- break; |
- } |
- |
- case kCommandTabNavigationPathPrunedFromFront: { |
- TabNavigationPathPrunedFromFrontPayload payload; |
- if (!command->GetPayload(&payload, sizeof(payload)) || |
- payload.index <= 0) { |
- DVLOG(1) << "Failed reading command " << command->id(); |
- return true; |
- } |
- SessionTab* tab = GetTab(payload.id, tabs); |
- |
- // Update the selected navigation index. |
- tab->current_navigation_index = |
- std::max(-1, tab->current_navigation_index - payload.index); |
- |
- // And update the index of existing navigations. |
- for (std::vector<sessions::SerializedNavigationEntry>::iterator |
- i = tab->navigations.begin(); |
- i != tab->navigations.end();) { |
- i->set_index(i->index() - payload.index); |
- if (i->index() < 0) |
- i = tab->navigations.erase(i); |
- else |
- ++i; |
- } |
- break; |
- } |
- |
- case kCommandUpdateTabNavigation: { |
- sessions::SerializedNavigationEntry navigation; |
- SessionID::id_type tab_id; |
- if (!RestoreUpdateTabNavigationCommand(*command, |
- &navigation, |
- &tab_id)) { |
- DVLOG(1) << "Failed reading command " << command->id(); |
- return true; |
- } |
- SessionTab* tab = GetTab(tab_id, tabs); |
- std::vector<sessions::SerializedNavigationEntry>::iterator i = |
- FindClosestNavigationWithIndex(&(tab->navigations), |
- navigation.index()); |
- if (i != tab->navigations.end() && i->index() == navigation.index()) |
- *i = navigation; |
- else |
- tab->navigations.insert(i, navigation); |
- break; |
- } |
- |
- case kCommandSetSelectedNavigationIndex: { |
- SelectedNavigationIndexPayload payload; |
- if (!command->GetPayload(&payload, sizeof(payload))) { |
- DVLOG(1) << "Failed reading command " << command->id(); |
- return true; |
- } |
- GetTab(payload.id, tabs)->current_navigation_index = payload.index; |
- break; |
- } |
- |
- case kCommandSetSelectedTabInIndex: { |
- SelectedTabInIndexPayload payload; |
- if (!command->GetPayload(&payload, sizeof(payload))) { |
- DVLOG(1) << "Failed reading command " << command->id(); |
- return true; |
- } |
- GetWindow(payload.id, windows)->selected_tab_index = payload.index; |
- break; |
- } |
- |
- case kCommandSetWindowType: { |
- WindowTypePayload payload; |
- if (!command->GetPayload(&payload, sizeof(payload))) { |
- DVLOG(1) << "Failed reading command " << command->id(); |
- return true; |
- } |
- GetWindow(payload.id, windows)->is_constrained = false; |
- GetWindow(payload.id, windows)->type = |
- static_cast<SessionWindow::WindowType>(payload.index); |
- break; |
- } |
- |
- case kCommandSetPinnedState: { |
- PinnedStatePayload payload; |
- if (!command->GetPayload(&payload, sizeof(payload))) { |
- DVLOG(1) << "Failed reading command " << command->id(); |
- return true; |
- } |
- GetTab(payload.tab_id, tabs)->pinned = payload.pinned_state; |
- break; |
- } |
- |
- case kCommandSetWindowAppName: { |
- SessionID::id_type window_id; |
- std::string app_name; |
- if (!RestoreSetWindowAppNameCommand(*command, &window_id, &app_name)) |
- return true; |
- |
- GetWindow(window_id, windows)->app_name.swap(app_name); |
- break; |
- } |
- |
- case kCommandSetExtensionAppID: { |
- SessionID::id_type tab_id; |
- std::string extension_app_id; |
- if (!RestoreSetTabExtensionAppIDCommand(*command, |
- &tab_id, |
- &extension_app_id)) { |
- DVLOG(1) << "Failed reading command " << command->id(); |
- return true; |
- } |
- |
- GetTab(tab_id, tabs)->extension_app_id.swap(extension_app_id); |
- break; |
- } |
- |
- case kCommandSetTabUserAgentOverride: { |
- SessionID::id_type tab_id; |
- std::string user_agent_override; |
- if (!RestoreSetTabUserAgentOverrideCommand( |
- *command, |
- &tab_id, |
- &user_agent_override)) { |
- return true; |
- } |
- |
- GetTab(tab_id, tabs)->user_agent_override.swap(user_agent_override); |
- break; |
- } |
- |
- case kCommandSessionStorageAssociated: { |
- scoped_ptr<base::Pickle> command_pickle(command->PayloadAsPickle()); |
- SessionID::id_type command_tab_id; |
- std::string session_storage_persistent_id; |
- base::PickleIterator iter(*command_pickle.get()); |
- if (!iter.ReadInt(&command_tab_id) || |
- !iter.ReadString(&session_storage_persistent_id)) |
- return true; |
- // Associate the session storage back. |
- GetTab(command_tab_id, tabs)->session_storage_persistent_id = |
- session_storage_persistent_id; |
- break; |
- } |
- |
- case kCommandSetActiveWindow: { |
- ActiveWindowPayload payload; |
- if (!command->GetPayload(&payload, sizeof(payload))) { |
- DVLOG(1) << "Failed reading command " << command->id(); |
- return true; |
- } |
- *active_window_id = payload; |
- break; |
- } |
- |
- case kCommandLastActiveTime: { |
- LastActiveTimePayload payload; |
- if (!command->GetPayload(&payload, sizeof(payload))) { |
- DVLOG(1) << "Failed reading command " << command->id(); |
- return true; |
- } |
- SessionTab* tab = GetTab(payload.tab_id, tabs); |
- tab->last_active_time = |
- base::TimeTicks::FromInternalValue(payload.last_active_time); |
- break; |
- } |
- |
- default: |
- // TODO(skuhne): This might call back into a callback handler to extend |
- // the command set for specific implementations. |
- DVLOG(1) << "Failed reading an unknown command " << command->id(); |
- return true; |
- } |
- } |
- return true; |
-} |
- |
-} // namespace |
- |
-scoped_ptr<SessionCommand> CreateSetSelectedTabInWindowCommand( |
- const SessionID& window_id, |
- int index) { |
- SelectedTabInIndexPayload payload = { 0 }; |
- payload.id = window_id.id(); |
- payload.index = index; |
- scoped_ptr<SessionCommand> command( |
- new SessionCommand(kCommandSetSelectedTabInIndex, sizeof(payload))); |
- memcpy(command->contents(), &payload, sizeof(payload)); |
- return command; |
-} |
- |
-scoped_ptr<SessionCommand> CreateSetTabWindowCommand(const SessionID& window_id, |
- const SessionID& tab_id) { |
- SessionID::id_type payload[] = { window_id.id(), tab_id.id() }; |
- scoped_ptr<SessionCommand> command( |
- new SessionCommand(kCommandSetTabWindow, sizeof(payload))); |
- memcpy(command->contents(), payload, sizeof(payload)); |
- return command; |
-} |
- |
-scoped_ptr<SessionCommand> CreateSetWindowBoundsCommand( |
- const SessionID& window_id, |
- const gfx::Rect& bounds, |
- ui::WindowShowState show_state) { |
- WindowBoundsPayload3 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 = ShowStateToPersistedShowState(show_state); |
- scoped_ptr<SessionCommand> command( |
- new SessionCommand(kCommandSetWindowBounds3, sizeof(payload))); |
- memcpy(command->contents(), &payload, sizeof(payload)); |
- return command; |
-} |
- |
-scoped_ptr<SessionCommand> CreateSetTabIndexInWindowCommand( |
- const SessionID& tab_id, |
- int new_index) { |
- TabIndexInWindowPayload payload = { 0 }; |
- payload.id = tab_id.id(); |
- payload.index = new_index; |
- scoped_ptr<SessionCommand> command( |
- new SessionCommand(kCommandSetTabIndexInWindow, sizeof(payload))); |
- memcpy(command->contents(), &payload, sizeof(payload)); |
- return command; |
-} |
- |
-scoped_ptr<SessionCommand> CreateTabClosedCommand( |
- const SessionID::id_type tab_id) { |
- ClosedPayload payload; |
- // Because of what appears to be a compiler bug setting payload to {0} doesn't |
- // set the padding to 0, resulting in Purify reporting an UMR when we write |
- // the structure to disk. To avoid this we explicitly memset the struct. |
- memset(&payload, 0, sizeof(payload)); |
- payload.id = tab_id; |
- payload.close_time = base::Time::Now().ToInternalValue(); |
- scoped_ptr<SessionCommand> command( |
- new SessionCommand(kCommandTabClosed, sizeof(payload))); |
- memcpy(command->contents(), &payload, sizeof(payload)); |
- return command; |
-} |
- |
-scoped_ptr<SessionCommand> CreateWindowClosedCommand( |
- const SessionID::id_type window_id) { |
- ClosedPayload payload; |
- // See comment in CreateTabClosedCommand as to why we do this. |
- memset(&payload, 0, sizeof(payload)); |
- payload.id = window_id; |
- payload.close_time = base::Time::Now().ToInternalValue(); |
- scoped_ptr<SessionCommand> command( |
- new SessionCommand(kCommandWindowClosed, sizeof(payload))); |
- memcpy(command->contents(), &payload, sizeof(payload)); |
- return command; |
-} |
- |
-scoped_ptr<SessionCommand> CreateSetSelectedNavigationIndexCommand( |
- const SessionID& tab_id, |
- int index) { |
- SelectedNavigationIndexPayload payload = { 0 }; |
- payload.id = tab_id.id(); |
- payload.index = index; |
- scoped_ptr<SessionCommand> command( |
- new SessionCommand(kCommandSetSelectedNavigationIndex, sizeof(payload))); |
- memcpy(command->contents(), &payload, sizeof(payload)); |
- return command; |
-} |
- |
-scoped_ptr<SessionCommand> CreateSetWindowTypeCommand( |
- const SessionID& window_id, |
- SessionWindow::WindowType type) { |
- WindowTypePayload payload = { 0 }; |
- payload.id = window_id.id(); |
- payload.index = static_cast<int32>(type); |
- scoped_ptr<SessionCommand> command( |
- new SessionCommand( kCommandSetWindowType, sizeof(payload))); |
- memcpy(command->contents(), &payload, sizeof(payload)); |
- return command; |
-} |
- |
-scoped_ptr<SessionCommand> CreatePinnedStateCommand( |
- const SessionID& tab_id, |
- bool is_pinned) { |
- PinnedStatePayload payload = { 0 }; |
- payload.tab_id = tab_id.id(); |
- payload.pinned_state = is_pinned; |
- scoped_ptr<SessionCommand> command( |
- new SessionCommand(kCommandSetPinnedState, sizeof(payload))); |
- memcpy(command->contents(), &payload, sizeof(payload)); |
- return command; |
-} |
- |
-scoped_ptr<SessionCommand> CreateSessionStorageAssociatedCommand( |
- const SessionID& tab_id, |
- const std::string& session_storage_persistent_id) { |
- base::Pickle pickle; |
- pickle.WriteInt(tab_id.id()); |
- pickle.WriteString(session_storage_persistent_id); |
- return scoped_ptr<SessionCommand>( |
- new SessionCommand(kCommandSessionStorageAssociated, pickle)); |
-} |
- |
-scoped_ptr<SessionCommand> CreateSetActiveWindowCommand( |
- const SessionID& window_id) { |
- ActiveWindowPayload payload = 0; |
- payload = window_id.id(); |
- scoped_ptr<SessionCommand> command( |
- new SessionCommand(kCommandSetActiveWindow, sizeof(payload))); |
- memcpy(command->contents(), &payload, sizeof(payload)); |
- return command; |
-} |
- |
-scoped_ptr<SessionCommand> CreateLastActiveTimeCommand( |
- const SessionID& tab_id, |
- base::TimeTicks last_active_time) { |
- LastActiveTimePayload payload = {0}; |
- payload.tab_id = tab_id.id(); |
- payload.last_active_time = last_active_time.ToInternalValue(); |
- scoped_ptr<SessionCommand> command( |
- new SessionCommand(kCommandLastActiveTime, sizeof(payload))); |
- memcpy(command->contents(), &payload, sizeof(payload)); |
- return command; |
-} |
- |
-scoped_ptr<SessionCommand> CreateTabNavigationPathPrunedFromBackCommand( |
- const SessionID& tab_id, |
- int count) { |
- TabNavigationPathPrunedFromBackPayload payload = { 0 }; |
- payload.id = tab_id.id(); |
- payload.index = count; |
- scoped_ptr<SessionCommand> command( |
- new SessionCommand(kCommandTabNavigationPathPrunedFromBack, |
- sizeof(payload))); |
- memcpy(command->contents(), &payload, sizeof(payload)); |
- return command; |
-} |
- |
-scoped_ptr<SessionCommand> CreateTabNavigationPathPrunedFromFrontCommand( |
- const SessionID& tab_id, |
- int count) { |
- TabNavigationPathPrunedFromFrontPayload payload = { 0 }; |
- payload.id = tab_id.id(); |
- payload.index = count; |
- scoped_ptr<SessionCommand> command( |
- new SessionCommand(kCommandTabNavigationPathPrunedFromFront, |
- sizeof(payload))); |
- memcpy(command->contents(), &payload, sizeof(payload)); |
- return command; |
-} |
- |
-scoped_ptr<SessionCommand> CreateUpdateTabNavigationCommand( |
- const SessionID& tab_id, |
- const sessions::SerializedNavigationEntry& navigation) { |
- return CreateUpdateTabNavigationCommand(kCommandUpdateTabNavigation, |
- tab_id.id(), |
- navigation); |
-} |
- |
-scoped_ptr<SessionCommand> CreateSetTabExtensionAppIDCommand( |
- const SessionID& tab_id, |
- const std::string& extension_id) { |
- return CreateSetTabExtensionAppIDCommand(kCommandSetExtensionAppID, |
- tab_id.id(), |
- extension_id); |
-} |
- |
-scoped_ptr<SessionCommand> CreateSetTabUserAgentOverrideCommand( |
- const SessionID& tab_id, |
- const std::string& user_agent_override) { |
- return CreateSetTabUserAgentOverrideCommand(kCommandSetTabUserAgentOverride, |
- tab_id.id(), |
- user_agent_override); |
-} |
- |
-scoped_ptr<SessionCommand> CreateSetWindowAppNameCommand( |
- const SessionID& window_id, |
- const std::string& app_name) { |
- return CreateSetWindowAppNameCommand(kCommandSetWindowAppName, |
- window_id.id(), |
- app_name); |
-} |
- |
-bool ReplacePendingCommand(BaseSessionService* base_session_service, |
- scoped_ptr<SessionCommand>* command) { |
- // We optimize page navigations, which can happen quite frequently and |
- // is expensive. And activation is like Highlander, there can only be one! |
- if ((*command)->id() != kCommandUpdateTabNavigation && |
- (*command)->id() != kCommandSetActiveWindow) { |
- return false; |
- } |
- for (ScopedVector<SessionCommand>::const_reverse_iterator i = |
- base_session_service->pending_commands().rbegin(); |
- i != base_session_service->pending_commands().rend(); ++i) { |
- SessionCommand* existing_command = *i; |
- if ((*command)->id() == kCommandUpdateTabNavigation && |
- existing_command->id() == kCommandUpdateTabNavigation) { |
- scoped_ptr<base::Pickle> command_pickle((*command)->PayloadAsPickle()); |
- base::PickleIterator iterator(*command_pickle); |
- SessionID::id_type command_tab_id; |
- int command_nav_index; |
- if (!iterator.ReadInt(&command_tab_id) || |
- !iterator.ReadInt(&command_nav_index)) { |
- return false; |
- } |
- SessionID::id_type existing_tab_id; |
- int existing_nav_index; |
- { |
- // Creating a pickle like this means the Pickle references the data from |
- // the command. Make sure we delete the pickle before the command, else |
- // the pickle references deleted memory. |
- scoped_ptr<base::Pickle> existing_pickle( |
- existing_command->PayloadAsPickle()); |
- iterator = base::PickleIterator(*existing_pickle); |
- if (!iterator.ReadInt(&existing_tab_id) || |
- !iterator.ReadInt(&existing_nav_index)) { |
- return false; |
- } |
- } |
- if (existing_tab_id == command_tab_id && |
- existing_nav_index == command_nav_index) { |
- // existing_command is an update for the same tab/index pair. Replace |
- // it with the new one. We need to add to the end of the list just in |
- // case there is a prune command after the update command. |
- base_session_service->EraseCommand(*(i.base() - 1)); |
- base_session_service->AppendRebuildCommand((*command).Pass()); |
- return true; |
- } |
- return false; |
- } |
- if ((*command)->id() == kCommandSetActiveWindow && |
- existing_command->id() == kCommandSetActiveWindow) { |
- base_session_service->SwapCommand(existing_command, (*command).Pass()); |
- return true; |
- } |
- } |
- return false; |
-} |
- |
-bool IsClosingCommand(SessionCommand* command) { |
- return command->id() == kCommandTabClosed || |
- command->id() == kCommandWindowClosed; |
-} |
- |
-void RestoreSessionFromCommands(const ScopedVector<SessionCommand>& commands, |
- std::vector<SessionWindow*>* valid_windows, |
- SessionID::id_type* active_window_id) { |
- std::map<int, SessionTab*> tabs; |
- std::map<int, SessionWindow*> windows; |
- |
- DVLOG(1) << "RestoreSessionFromCommands " << commands.size(); |
- if (CreateTabsAndWindows(commands, &tabs, &windows, active_window_id)) { |
- AddTabsToWindows(&tabs, &windows); |
- SortTabsBasedOnVisualOrderAndPrune(&windows, valid_windows); |
- UpdateSelectedTabIndex(valid_windows); |
- } |
- STLDeleteValues(&tabs); |
- // Don't delete contents of windows, that is done by the caller as all |
- // valid windows are added to valid_windows. |
-} |
- |
-} // namespace sessions |