session_service_unittest.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/time.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/defaults.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_backend.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_service.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_service_test_helper.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_types.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_notification_types.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/browser_with_test_window_test.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/sessions/serialized_navigation_entry_test_helper.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/WebKit/Source/Platform/chromium/public/WebData.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/WebKit/Source/Platform/chromium/public/WebHTTPBody.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebHistoryItem.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/glue/glue_serialize.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationEntry;
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using sessions::SerializedNavigationEntry;
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using sessions::SerializedNavigationEntryTestHelper;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SessionServiceTest : public BrowserWithTestWindowTest,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           public content::NotificationObserver {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SessionServiceTest() : window_bounds(0, 1, 2, 3), sync_save_count_(0) {}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserWithTestWindowTest::SetUp();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string b = base::Int64ToString(base::Time::Now().ToInternalValue());
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path_ = temp_dir_.path().Append(FILE_PATH_LITERAL("SessionTestDirs"));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(file_util::CreateDirectory(path_));
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    path_ = path_.AppendASCII(b);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionService* session_service = new SessionService(path_);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.set_service(session_service);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service()->SetWindowType(
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_id, Browser::TYPE_TABBED, SessionService::TYPE_NORMAL);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service()->SetWindowBounds(window_id,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               window_bounds,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui::SHOW_STATE_NORMAL);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Upon notification, increment the sync_save_count variable
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Observe(int type,
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationSource& source,
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(type, chrome::NOTIFICATION_SESSION_SERVICE_SAVED);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_save_count_++;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.set_service(NULL);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserWithTestWindowTest::TearDown();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void UpdateNavigation(
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const SessionID& window_id,
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const SessionID& tab_id,
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const SerializedNavigationEntry& navigation,
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      bool select) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service()->UpdateTabNavigation(window_id, tab_id, navigation);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (select) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service()->SetSelectedNavigationIndex(
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          window_id, tab_id, navigation.index());
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadWindows(std::vector<SessionWindow*>* windows,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   SessionID::id_type* active_window_id) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Forces closing the file.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.set_service(NULL);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionService* session_service = new SessionService(path_);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.set_service(session_service);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionID::id_type* non_null_active_window_id = active_window_id;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionID::id_type dummy_active_window_id = 0;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!non_null_active_window_id)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      non_null_active_window_id = &dummy_active_window_id;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.ReadWindows(windows, non_null_active_window_id);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Configures the session service with one window with one tab and a single
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // navigation. If |pinned_state| is true or |write_always| is true, the
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pinned state of the tab is updated. The session service is then recreated
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and the pinned state of the read back tab is returned.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CreateAndWriteSessionWithOneTab(bool pinned_state, bool write_always) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionID tab_id;
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SerializedNavigationEntry nav1 =
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        SerializedNavigationEntryTestHelper::CreateNavigation(
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            "http://google.com", "abc");
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateNavigation(window_id, tab_id, nav1, true);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pinned_state || write_always)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      helper_.service()->SetPinnedState(window_id, tab_id, pinned_state);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScopedVector<SessionWindow> windows;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReadWindows(&(windows.get()), NULL);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1U, windows.size());
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (HasFatalFailure())
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1U, windows[0]->tabs.size());
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (HasFatalFailure())
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionTab* tab = windows[0]->tabs[0];
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.AssertTabEquals(window_id, tab_id, 0, 0, 1, *tab);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return tab->pinned;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateAndWriteSessionWithTwoWindows(
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const SessionID& window2_id,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const SessionID& tab1_id,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const SessionID& tab2_id,
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntry* nav1,
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntry* nav2) {
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    *nav1 = SerializedNavigationEntryTestHelper::CreateNavigation(
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "http://google.com", "abc");
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    *nav2 = SerializedNavigationEntryTestHelper::CreateNavigation(
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "http://google2.com", "abcd");
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.PrepareTabInWindow(window_id, tab1_id, 0, true);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateNavigation(window_id, tab1_id, *nav1, true);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect window2_bounds(3, 4, 5, 6);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service()->SetWindowType(
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window2_id, Browser::TYPE_TABBED, SessionService::TYPE_NORMAL);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service()->SetWindowBounds(window2_id,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               window2_bounds,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui::SHOW_STATE_MAXIMIZED);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.PrepareTabInWindow(window2_id, tab2_id, 0, true);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateNavigation(window2_id, tab2_id, *nav2, true);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionService* service() { return helper_.service(); }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionBackend* backend() { return helper_.backend(); }
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Rect window_bounds;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID window_id;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int sync_save_count_;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Path used in testing.
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path_;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionServiceTestHelper helper_;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, Basic) {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window_id.id(), tab_id.id());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntryTestHelper::SetOriginalRequestURL(
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GURL("http://original.request.com"), &nav1);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(window_bounds == windows[0]->bounds);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[0]->selected_tab_index);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs.size());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(Browser::TYPE_TABBED, windows[0]->type);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = windows[0]->tabs[0];
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab_id, 0, 0, 1, *tab);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure we persist post entries.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, PersistPostData) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window_id.id(), tab_id.id());
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntryTestHelper::SetHasPostData(true, &nav1);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertSingleWindowWithSingleTab(windows.get(), 1);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, ClosingTabStaysClosed) {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab2_id;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(tab_id.id(), tab2_id.id());
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav2 =
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google2.com", "abcd");
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab2_id, 1, false);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab2_id, nav2, true);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->TabClosed(window_id, tab2_id, false);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[0]->selected_tab_index);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs.size());
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = windows[0]->tabs[0];
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab_id, 0, 0, 1, *tab);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, Pruning) {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav2 =
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google2.com", "abcd");
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 6; ++i) {
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SerializedNavigationEntry* nav = (i % 2) == 0 ? &nav1 : &nav2;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nav->set_index(i);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateNavigation(window_id, tab_id, *nav, true);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->TabNavigationPathPrunedFromBack(window_id, tab_id, 3);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[0]->selected_tab_index);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs.size());
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = windows[0]->tabs[0];
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We left the selected index at 5, then pruned. When rereading the
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // index should get reset to last valid navigation, which is 2.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab_id, 0, 2, 3, *tab);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3u, tab->navigations.size());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav2, tab->navigations[1]);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[2]);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, TwoWindows) {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID window2_id;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab1_id;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab2_id;
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1;
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav2;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateAndWriteSessionWithTwoWindows(
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window2_id, tab1_id, tab2_id, &nav1, &nav2);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, windows.size());
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[0]->selected_tab_index);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[1]->selected_tab_index);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs.size());
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[1]->tabs.size());
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* rt1;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* rt2;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (windows[0]->window_id.id() == window_id.id()) {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(window2_id.id(), windows[1]->window_id.id());
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(ui::SHOW_STATE_NORMAL, windows[0]->show_state);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(ui::SHOW_STATE_MAXIMIZED, windows[1]->show_state);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rt1 = windows[0]->tabs[0];
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rt2 = windows[1]->tabs[0];
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(window2_id.id(), windows[0]->window_id.id());
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(window_id.id(), windows[1]->window_id.id());
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(ui::SHOW_STATE_MAXIMIZED, windows[0]->show_state);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(ui::SHOW_STATE_NORMAL, windows[1]->show_state);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rt1 = windows[1]->tabs[0];
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rt2 = windows[0]->tabs[0];
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = rt1;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab1_id, 0, 0, 1, *tab);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab = rt2;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window2_id, tab2_id, 0, 0, 1, *tab);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav2, tab->navigations[0]);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, WindowWithNoTabsGetsPruned) {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID window2_id;
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab1_id;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab2_id;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab1_id, 0, true);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab1_id, nav1, true);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Rect window2_bounds(3, 4, 5, 6);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetWindowType(
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window2_id, Browser::TYPE_TABBED, SessionService::TYPE_NORMAL);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetWindowBounds(window2_id,
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             window2_bounds,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ui::SHOW_STATE_NORMAL);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window2_id, tab2_id, 0, true);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[0]->selected_tab_index);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs.size());
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = windows[0]->tabs[0];
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab1_id, 0, 0, 1, *tab);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, ClosingWindowDoesntCloseTabs) {
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab2_id;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(tab_id.id(), tab2_id.id());
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav2 =
381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google2.com", "abcd");
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab2_id, 1, false);
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab2_id, nav2, true);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->WindowClosing(window_id);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[0]->selected_tab_index);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, windows[0]->tabs.size());
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = windows[0]->tabs[0];
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab_id, 0, 0, 1, *tab);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab = windows[0]->tabs[1];
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab2_id, 1, 0, 1, *tab);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav2, tab->navigations[0]);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, WindowCloseCommittedAfterNavigate) {
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID window2_id;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab2_id;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window2_id.id(), window_id.id());
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetWindowType(
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window2_id, Browser::TYPE_TABBED, SessionService::TYPE_NORMAL);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetWindowBounds(window2_id,
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             window_bounds,
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ui::SHOW_STATE_NORMAL);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav2 =
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google2.com", "abcd");
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window2_id, tab2_id, 0, false);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window2_id, tab2_id, nav2, true);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->WindowClosing(window2_id);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->TabClosed(window2_id, tab2_id, false);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->WindowClosed(window2_id);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[0]->selected_tab_index);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs.size());
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = windows[0]->tabs[0];
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab_id, 0, 0, 1, *tab);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure we don't track popups.
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, IgnorePopups) {
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_defaults::kRestorePopups)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;  // This test is only applicable if popups aren't restored.
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID window2_id;
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab2_id;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window2_id.id(), window_id.id());
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetWindowType(
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window2_id, Browser::TYPE_POPUP, SessionService::TYPE_NORMAL);
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetWindowBounds(window2_id,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             window_bounds,
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ui::SHOW_STATE_NORMAL);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav2 =
471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google2.com", "abcd");
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window2_id, tab2_id, 0, false);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window2_id, tab2_id, nav2, true);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[0]->selected_tab_index);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs.size());
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = windows[0]->tabs[0];
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab_id, 0, 0, 1, *tab);
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure we track popups.
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, RestorePopup) {
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!browser_defaults::kRestorePopups)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;  // This test is only applicable if popups are restored.
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID window2_id;
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab2_id;
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window2_id.id(), window_id.id());
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetWindowType(
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window2_id, Browser::TYPE_POPUP, SessionService::TYPE_NORMAL);
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetWindowBounds(window2_id,
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             window_bounds,
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ui::SHOW_STATE_NORMAL);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav2 =
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google2.com", "abcd");
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window2_id, tab2_id, 0, false);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window2_id, tab2_id, nav2, true);
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, windows.size());
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int tabbed_index = windows[0]->type == Browser::TYPE_TABBED ?
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0 : 1;
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int popup_index = tabbed_index == 0 ? 1 : 0;
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[tabbed_index]->selected_tab_index);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(window_id.id(), windows[tabbed_index]->window_id.id());
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[tabbed_index]->tabs.size());
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = windows[tabbed_index]->tabs[0];
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab_id, 0, 0, 1, *tab);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[popup_index]->selected_tab_index);
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(window2_id.id(), windows[popup_index]->window_id.id());
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[popup_index]->tabs.size());
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab = windows[popup_index]->tabs[0];
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window2_id, tab2_id, 0, 0, 1, *tab);
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav2, tab->navigations[0]);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined (OS_CHROMEOS)
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Makes sure we track apps. Only applicable on chromeos.
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, RestoreApp) {
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID window2_id;
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab2_id;
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window2_id.id(), window_id.id());
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetWindowType(
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window2_id, Browser::TYPE_POPUP, SessionService::TYPE_APP);
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetWindowBounds(window2_id,
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             window_bounds,
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ui::SHOW_STATE_NORMAL);
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetWindowAppName(window2_id, "TestApp");
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav2 =
565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google2.com", "abcd");
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window2_id, tab2_id, 0, false);
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window2_id, tab2_id, nav2, true);
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, windows.size());
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int tabbed_index = windows[0]->type == Browser::TYPE_TABBED ?
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0 : 1;
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int app_index = tabbed_index == 0 ? 1 : 0;
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[tabbed_index]->selected_tab_index);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(window_id.id(), windows[tabbed_index]->window_id.id());
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[tabbed_index]->tabs.size());
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = windows[tabbed_index]->tabs[0];
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab_id, 0, 0, 1, *tab);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[app_index]->selected_tab_index);
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(window2_id.id(), windows[app_index]->window_id.id());
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[app_index]->tabs.size());
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(windows[app_index]->type == Browser::TYPE_POPUP);
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("TestApp", windows[app_index]->app_name);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab = windows[app_index]->tabs[0];
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window2_id, tab2_id, 0, 0, 1, *tab);
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav2, tab->navigations[0]);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // defined (OS_CHROMEOS)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests pruning from the front.
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, PruneFromFront) {
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string base_url("http://google.com/");
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add 5 navigations, with the 4th selected.
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 5; ++i) {
610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SerializedNavigationEntry nav =
611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        SerializedNavigationEntryTestHelper::CreateNavigation(
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base_url + base::IntToString(i), "a");
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nav.set_index(i);
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateNavigation(window_id, tab_id, nav, (i == 3));
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prune the first two navigations from the front.
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.service()->TabNavigationPathPrunedFromFront(window_id, tab_id, 2);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Read back in.
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[0]->selected_tab_index);
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs.size());
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There shouldn't be an app id.
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(windows[0]->tabs[0]->extension_app_id.empty());
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should be left with three navigations, the 2nd selected.
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = windows[0]->tabs[0];
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, tab->current_navigation_index);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, tab->navigations.size());
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GURL(base_url + base::IntToString(2)) ==
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tab->navigations[0].virtual_url());
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GURL(base_url + base::IntToString(3)) ==
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tab->navigations[1].virtual_url());
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GURL(base_url + base::IntToString(4)) ==
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tab->navigations[2].virtual_url());
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prunes from front so that we have no entries.
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, PruneToEmpty) {
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string base_url("http://google.com/");
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add 5 navigations, with the 4th selected.
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 5; ++i) {
653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SerializedNavigationEntry nav =
654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        SerializedNavigationEntryTestHelper::CreateNavigation(
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base_url + base::IntToString(i), "a");
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nav.set_index(i);
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateNavigation(window_id, tab_id, nav, (i == 3));
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prune the first two navigations from the front.
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.service()->TabNavigationPathPrunedFromFront(window_id, tab_id, 5);
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Read back in.
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, windows.size());
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Don't set the pinned state and make sure the pinned value is false.
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, PinnedDefaultsToFalse) {
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(CreateAndWriteSessionWithOneTab(false, false));
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Explicitly set the pinned state to false and make sure we get back false.
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, PinnedFalseWhenSetToFalse) {
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(CreateAndWriteSessionWithOneTab(false, true));
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Explicitly set the pinned state to true and make sure we get back true.
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, PinnedTrue) {
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(CreateAndWriteSessionWithOneTab(true, true));
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure application extension ids are persisted.
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, PersistApplicationExtensionID) {
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window_id.id(), tab_id.id());
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string app_id("foo");
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.SetTabExtensionAppID(window_id, tab_id, app_id);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertSingleWindowWithSingleTab(windows.get(), 1);
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(app_id == windows[0]->tabs[0]->extension_app_id);
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that user agent overrides are persisted.
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, PersistUserAgentOverrides) {
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window_id.id(), tab_id.id());
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string user_agent_override = "Mozilla/5.0 (X11; Linux x86_64) "
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.45 "
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Safari/535.19";
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntryTestHelper::SetIsOverridingUserAgent(true, &nav1);
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.SetTabUserAgentOverride(window_id, tab_id, user_agent_override);
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertSingleWindowWithSingleTab(windows.get(), 1);
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = windows[0]->tabs[0];
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab_id, 0, 0, 1, *tab);
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(user_agent_override == tab->user_agent_override);
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the notification for SESSION_SERVICE_SAVED is working properly.
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, SavedSessionNotification) {
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_SESSION_SERVICE_SAVED,
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::NotificationService::AllSources());
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->Save();
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(sync_save_count_, 1);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure a tab closed by a user gesture is not restored.
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, CloseTabUserGesture) {
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window_id.id(), tab_id.id());
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->TabClosed(window_id, tab_id, true);
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(windows.empty());
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies SetWindowBounds maps SHOW_STATE_DEFAULT to SHOW_STATE_NORMAL.
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, DontPersistDefault) {
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window_id.id(), tab_id.id());
765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetWindowBounds(window_id,
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             window_bounds,
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ui::SHOW_STATE_DEFAULT);
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ui::SHOW_STATE_NORMAL, windows[0]->show_state);
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, KeepPostDataWithoutPasswords) {
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window_id.id(), tab_id.id());
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a content state representing a HTTP body without posted passwords.
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebHTTPBody http_body;
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  http_body.initialize();
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char char_data[] = "data";
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  http_body.appendData(WebKit::WebData(char_data, sizeof(char_data)-1));
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebHistoryItem history_item;
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history_item.initialize();
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history_item.setHTTPBody(http_body);
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string content_state = webkit_glue::HistoryItemToString(history_item);
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a TabNavigation containing content_state and representing a POST
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // request.
796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
797c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
798c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "title");
799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntryTestHelper::SetContentState(content_state, &nav1);
800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntryTestHelper::SetHasPostData(true, &nav1);
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a TabNavigation containing content_state and representing a normal
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // request.
804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav2 =
805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "http://google.com/nopost", "title");
807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntryTestHelper::SetContentState(content_state, &nav2);
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nav2.set_index(1);
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav2, true);
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertSingleWindowWithSingleTab(windows.get(), 2);
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expected: the content state of both navigations was saved and restored.
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, windows[0]->tabs[0]->navigations.size());
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, windows[0]->tabs[0]->navigations[0]);
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav2, windows[0]->tabs[0]->navigations[1]);
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, RemovePostDataWithPasswords) {
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window_id.id(), tab_id.id());
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a content state representing a HTTP body with posted passwords.
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebHTTPBody http_body;
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  http_body.initialize();
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char char_data[] = "data";
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  http_body.appendData(WebKit::WebData(char_data, sizeof(char_data)-1));
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  http_body.setContainsPasswordData(true);
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebHistoryItem history_item;
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history_item.initialize();
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  history_item.setHTTPBody(http_body);
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string content_state = webkit_glue::HistoryItemToString(history_item);
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a TabNavigation containing content_state and representing a POST
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // request with passwords.
842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
843c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "title");
845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntryTestHelper::SetContentState(content_state, &nav1);
846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntryTestHelper::SetHasPostData(true, &nav1);
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertSingleWindowWithSingleTab(windows.get(), 1);
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Expected: the HTTP body was removed from the content state of the POST
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // navigation with passwords.
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(content_state, windows[0]->tabs[0]->navigations[0].content_state());
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test is only applicable to chromeos.
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies migration of tab/window closed works.
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, CanOpenV1TabClosed) {
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath v1_file_path;
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &v1_file_path));
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // v1_session_file contains a tab closed command with the original id. The
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // file was generated from ClosingTabStaysClosed. If we successfully processed
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the file we'll have one tab.
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  v1_file_path =
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      v1_file_path.AppendASCII("sessions").AppendASCII("v1_session_file");
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dest_file_path(path_);
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dest_file_path = dest_file_path.AppendASCII("Current Session");
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Forces closing the file.
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.set_service(NULL);
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(file_util::CopyFile(v1_file_path, dest_file_path));
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionService* session_service = new SessionService(path_);
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.set_service(session_service);
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID::id_type active_window_id = 0;
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.ReadWindows(&(windows.get()), &active_window_id);
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, windows.size());
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, windows[0]->tabs.size());
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, ReplacePendingNavigation) {
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string base_url("http://google.com/");
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add 5 navigations, some with the same index
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 5; ++i) {
897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SerializedNavigationEntry nav =
898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        SerializedNavigationEntryTestHelper::CreateNavigation(
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base_url + base::IntToString(i), "a");
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nav.set_index(i / 2);
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateNavigation(window_id, tab_id, nav, true);
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Read back in.
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The ones with index 0, and 2 should have been replaced by 1 and 3.
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs.size());
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, windows[0]->tabs[0]->navigations.size());
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL(base_url + base::IntToString(1)),
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            windows[0]->tabs[0]->navigations[0].virtual_url());
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL(base_url + base::IntToString(3)),
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            windows[0]->tabs[0]->navigations[1].virtual_url());
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL(base_url + base::IntToString(4)),
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            windows[0]->tabs[0]->navigations[2].virtual_url());
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, ReplacePendingNavigationAndPrune) {
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string base_url("http://google.com/");
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 5; ++i) {
927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SerializedNavigationEntry nav =
928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        SerializedNavigationEntryTestHelper::CreateNavigation(
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base_url + base::IntToString(i), "a");
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nav.set_index(i);
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateNavigation(window_id, tab_id, nav, true);
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prune all those navigations.
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.service()->TabNavigationPathPrunedFromFront(window_id, tab_id, 5);
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add another navigation to replace the last one.
938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav =
939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base_url + base::IntToString(5), "a");
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nav.set_index(4);
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav, true);
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Read back in.
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should still have that last navigation at the end,
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // even though it replaced one that was set before the prune.
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs.size());
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs[0]->navigations.size());
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL(base_url + base::IntToString(5)),
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            windows[0]->tabs[0]->navigations[0].virtual_url());
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, RestoreActivation1) {
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID window2_id;
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab1_id;
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab2_id;
961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1;
962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav2;
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateAndWriteSessionWithTwoWindows(
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window2_id, tab1_id, tab2_id, &nav1, &nav2);
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->ScheduleCommand(
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service()->CreateSetActiveWindowCommand(window2_id));
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->ScheduleCommand(
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service()->CreateSetActiveWindowCommand(window_id));
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID::id_type active_window_id = 0;
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), &active_window_id);
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(window_id.id(), active_window_id);
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It's easier to have two separate tests with setup/teardown than to manualy
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reset the state for the different flavors of the test.
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, RestoreActivation2) {
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID window2_id;
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab1_id;
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab2_id;
984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1;
985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav2;
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateAndWriteSessionWithTwoWindows(
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window2_id, tab1_id, tab2_id, &nav1, &nav2);
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->ScheduleCommand(
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service()->CreateSetActiveWindowCommand(window2_id));
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->ScheduleCommand(
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service()->CreateSetActiveWindowCommand(window_id));
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->ScheduleCommand(
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service()->CreateSetActiveWindowCommand(window2_id));
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID::id_type active_window_id = 0;
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), &active_window_id);
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(window2_id.id(), active_window_id);
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1002