| Index: chrome/test/live_sync/live_sessions_sync_test.h
|
| ===================================================================
|
| --- chrome/test/live_sync/live_sessions_sync_test.h (revision 70604)
|
| +++ chrome/test/live_sync/live_sessions_sync_test.h (working copy)
|
| @@ -92,24 +92,25 @@
|
| // Internal method used in the callback to obtain the current session.
|
| // Lives on and called from backend thread (file_thread).
|
| // We don't own windows so need to make a deep copy.
|
| + // In this case, we only copy those values compared against in WindowsMatch
|
| + // (number of windows, number of tabs, and navigations within tabs).
|
| void OnGotSession(int handle, std::vector<SessionWindow*>* windows) {
|
| - // Hacky. We need to make a deep copy of the session windows. One way to do
|
| - // this is to use the session model associators functionality to create
|
| - // foreign sessions, which themselves wrap a SessionWindow vector. We just
|
| - // need to make sure to destroy all the foreign sessions we created when
|
| - // we're done. That's what the foreign_sessions_ ScopedVector is for.
|
| - sync_pb::SessionSpecifics session;
|
| - profile_->GetProfileSyncService()->
|
| - GetSessionModelAssociator()->
|
| - FillSpecificsFromSessions(windows, &session);
|
| -
|
| - std::vector<ForeignSession*> foreign_sessions;
|
| - profile_->GetProfileSyncService()->
|
| - GetSessionModelAssociator()->
|
| - AppendForeignSessionFromSpecifics(&session, &foreign_sessions);
|
| - ASSERT_EQ(foreign_sessions.size(), 1U);
|
| - foreign_sessions_.push_back(foreign_sessions[0]);
|
| - windows_ = &foreign_sessions[0]->windows;
|
| + scoped_ptr<ForeignSession> foreign_session(new ForeignSession());
|
| + for (size_t w = 0; w < windows->size(); ++w) {
|
| + const SessionWindow& window = *windows->at(w);
|
| + scoped_ptr<SessionWindow> new_window(new SessionWindow());
|
| + for (size_t t = 0; t < window.tabs.size(); ++t) {
|
| + const SessionTab& tab = *window.tabs.at(t);
|
| + scoped_ptr<SessionTab> new_tab(new SessionTab());
|
| + new_tab->navigations.resize(tab.navigations.size());
|
| + std::copy(tab.navigations.begin(), tab.navigations.end(),
|
| + new_tab->navigations.begin());
|
| + new_window->tabs.push_back(new_tab.release());
|
| + }
|
| + foreign_session->windows.push_back(new_window.release());
|
| + }
|
| + windows_ = &(foreign_session->windows);
|
| + foreign_sessions_.push_back(foreign_session.release());
|
| got_windows_.Signal();
|
| }
|
|
|
| @@ -240,19 +241,19 @@
|
|
|
| // Returns number of foreign sessions for a profile.
|
| int GetNumForeignSessions(int index) {
|
| - ScopedVector<ForeignSession> sessions;
|
| + std::vector<const ForeignSession*> sessions;
|
| if (!GetProfile(index)->GetProfileSyncService()->
|
| - GetSessionModelAssociator()->GetSessionData(&sessions.get()))
|
| + GetSessionModelAssociator()->GetAllForeignSessions(&sessions))
|
| return 0;
|
| return sessions.size();
|
| }
|
|
|
| // Fills the sessions vector with the model associator's foreign session data.
|
| - // Caller owns sessions.
|
| - bool GetSessionData(int index, std::vector<ForeignSession*>* sessions)
|
| + // Caller owns |sessions|, but not ForeignSession objects within.
|
| + bool GetSessionData(int index, std::vector<const ForeignSession*>* sessions)
|
| WARN_UNUSED_RESULT {
|
| if (!GetProfile(index)->GetProfileSyncService()->
|
| - GetSessionModelAssociator()->GetSessionData(sessions))
|
| + GetSessionModelAssociator()->GetAllForeignSessions(sessions))
|
| return false;
|
| SortForeignSessions(sessions);
|
| return true;
|
| @@ -284,7 +285,9 @@
|
|
|
| // Compares a foreign session based on the first session window.
|
| // Returns true based on the comparison of the session windows.
|
| - static bool CompareForeignSessions(ForeignSession* lhs, ForeignSession* rhs) {
|
| + static bool CompareForeignSessions(
|
| + const ForeignSession* lhs,
|
| + const ForeignSession* rhs) {
|
| if (!lhs ||
|
| !rhs ||
|
| lhs->windows.size() < 1 ||
|
| @@ -297,18 +300,33 @@
|
| }
|
|
|
| // Sort a foreign session vector using our custom foreign session comparator.
|
| - void SortForeignSessions(std::vector<ForeignSession*>* sessions) {
|
| + void SortForeignSessions(std::vector<const ForeignSession*>* sessions) {
|
| std::sort(sessions->begin(), sessions->end(),
|
| LiveSessionsSyncTest::CompareForeignSessions);
|
| }
|
|
|
| + // Compares two tab navigations base on the parameters we sync.
|
| + // (Namely, we don't sync state or type mask)
|
| + bool NavigationEquals(const TabNavigation& expected,
|
| + const TabNavigation& actual) {
|
| + if (expected.virtual_url() != actual.virtual_url())
|
| + return false;
|
| + if (expected.referrer() != actual.referrer())
|
| + return false;
|
| + if (expected.title() != actual.title())
|
| + return false;
|
| + if (expected.transition() != actual.transition())
|
| + return false;
|
| + return true;
|
| + }
|
| +
|
| // Verifies that two SessionWindows match.
|
| // Returns:
|
| // - true if all the following match:
|
| - // 1. number of SessionWindows per vector,
|
| + // 1. number of SessionWindows,
|
| // 2. number of tabs per SessionWindow,
|
| - // 3. number of tab navigations per nab,
|
| - // 4. actual tab navigations
|
| + // 3. number of tab navigations per tab,
|
| + // 4. actual tab navigations contents
|
| // - false otherwise.
|
| bool WindowsMatch(const std::vector<SessionWindow*> &win1,
|
| const std::vector<SessionWindow*> &win2) WARN_UNUSED_RESULT {
|
| @@ -323,8 +341,10 @@
|
| client0_tab = win1[i]->tabs[j];
|
| client1_tab = win2[i]->tabs[j];
|
| for (size_t k = 0; k < client0_tab->navigations.size(); ++k) {
|
| - GetHelper(0)->AssertNavigationEquals(client0_tab->navigations[k],
|
| - client1_tab->navigations[k]);
|
| + if (!NavigationEquals(client0_tab->navigations[k],
|
| + client1_tab->navigations[k])) {
|
| + return false;
|
| + }
|
| }
|
| }
|
| }
|
| @@ -339,14 +359,14 @@
|
| bool CheckForeignSessionsAgainst(int index,
|
| const std::vector<std::vector<SessionWindow*>* >& windows)
|
| WARN_UNUSED_RESULT {
|
| - ScopedVector<ForeignSession> sessions;
|
| - if (!GetSessionData(index, &sessions.get()))
|
| + std::vector<const ForeignSession*> sessions;
|
| + if (!GetSessionData(index, &sessions))
|
| return false;
|
| if ((size_t)(num_clients()-1) != sessions.size())
|
| return false;
|
|
|
| int window_index = 0;
|
| - for (size_t j = 0; j < sessions->size(); ++j, ++window_index) {
|
| + for (size_t j = 0; j < sessions.size(); ++j, ++window_index) {
|
| if (window_index == index)
|
| window_index++; // Skip self.
|
| if (!WindowsMatch(sessions[j]->windows, *windows[window_index]))
|
|
|