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"
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/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"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/run_loop.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/synchronization/waitable_event.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
18e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chrome/browser/browser_process.h"
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/defaults.h"
21e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chrome/browser/profiles/profile_manager.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_backend.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_service.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_service_test_helper.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sessions/session_types.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/common/url_constants.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/browser_with_test_window_test.h"
29e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chrome/test/base/testing_browser_process.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
31e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chrome/test/base/testing_profile_manager.h"
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/sessions/serialized_navigation_entry_test_helper.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/public/common/page_state.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationEntry;
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using sessions::SerializedNavigationEntry;
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using sessions::SerializedNavigationEntryTestHelper;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SessionServiceTest : public BrowserWithTestWindowTest,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           public content::NotificationObserver {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SessionServiceTest() : window_bounds(0, 1, 2, 3), sync_save_count_(0) {}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserWithTestWindowTest::SetUp();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    profile_manager_.reset(
54e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch        new TestingProfileManager(TestingBrowserProcess::GetGlobal()));
55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    ASSERT_TRUE(profile_manager_->SetUp());
56e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    std::string b = base::Int64ToString(base::Time::Now().ToInternalValue());
58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    TestingProfile* profile = profile_manager_->CreateTestingProfile(b);
59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    SessionService* session_service = new SessionService(profile);
60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    path_ = profile->GetPath();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    helper_.SetService(session_service);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service()->SetWindowType(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window_id, Browser::TYPE_TABBED, SessionService::TYPE_NORMAL);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service()->SetWindowBounds(window_id,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               window_bounds,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui::SHOW_STATE_NORMAL);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Upon notification, increment the sync_save_count variable
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Observe(int type,
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationSource& source,
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(type, chrome::NOTIFICATION_SESSION_SERVICE_SAVED);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sync_save_count_++;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() {
80c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    helper_.SetService(NULL);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserWithTestWindowTest::TearDown();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void UpdateNavigation(
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const SessionID& window_id,
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const SessionID& tab_id,
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const SerializedNavigationEntry& navigation,
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      bool select) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service()->UpdateTabNavigation(window_id, tab_id, navigation);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (select) {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service()->SetSelectedNavigationIndex(
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          window_id, tab_id, navigation.index());
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReadWindows(std::vector<SessionWindow*>* windows,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   SessionID::id_type* active_window_id) {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Forces closing the file.
99c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    helper_.SetService(NULL);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionService* session_service = new SessionService(path_);
102c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    helper_.SetService(session_service);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionID::id_type* non_null_active_window_id = active_window_id;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionID::id_type dummy_active_window_id = 0;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!non_null_active_window_id)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      non_null_active_window_id = &dummy_active_window_id;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.ReadWindows(windows, non_null_active_window_id);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Configures the session service with one window with one tab and a single
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // navigation. If |pinned_state| is true or |write_always| is true, the
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pinned state of the tab is updated. The session service is then recreated
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and the pinned state of the read back tab is returned.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CreateAndWriteSessionWithOneTab(bool pinned_state, bool write_always) {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionID tab_id;
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SerializedNavigationEntry nav1 =
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        SerializedNavigationEntryTestHelper::CreateNavigation(
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            "http://google.com", "abc");
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateNavigation(window_id, tab_id, nav1, true);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pinned_state || write_always)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      helper_.service()->SetPinnedState(window_id, tab_id, pinned_state);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScopedVector<SessionWindow> windows;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ReadWindows(&(windows.get()), NULL);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1U, windows.size());
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (HasFatalFailure())
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1U, windows[0]->tabs.size());
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (HasFatalFailure())
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SessionTab* tab = windows[0]->tabs[0];
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.AssertTabEquals(window_id, tab_id, 0, 0, 1, *tab);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return tab->pinned;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CreateAndWriteSessionWithTwoWindows(
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const SessionID& window2_id,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const SessionID& tab1_id,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const SessionID& tab2_id,
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntry* nav1,
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntry* nav2) {
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    *nav1 = SerializedNavigationEntryTestHelper::CreateNavigation(
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "http://google.com", "abc");
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    *nav2 = SerializedNavigationEntryTestHelper::CreateNavigation(
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        "http://google2.com", "abcd");
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.PrepareTabInWindow(window_id, tab1_id, 0, true);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateNavigation(window_id, tab1_id, *nav1, true);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Rect window2_bounds(3, 4, 5, 6);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service()->SetWindowType(
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window2_id, Browser::TYPE_TABBED, SessionService::TYPE_NORMAL);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service()->SetWindowBounds(window2_id,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               window2_bounds,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               ui::SHOW_STATE_MAXIMIZED);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    helper_.PrepareTabInWindow(window2_id, tab2_id, 0, true);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateNavigation(window2_id, tab2_id, *nav2, true);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionService* service() { return helper_.service(); }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Rect window_bounds;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID window_id;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int sync_save_count_;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Path used in testing.
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path_;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionServiceTestHelper helper_;
180e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  scoped_ptr<TestingProfileManager> profile_manager_;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, Basic) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window_id.id(), tab_id.id());
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntryTestHelper::SetOriginalRequestURL(
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      GURL("http://original.request.com"), &nav1);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(window_bounds == windows[0]->bounds);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[0]->selected_tab_index);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs.size());
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(Browser::TYPE_TABBED, windows[0]->type);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = windows[0]->tabs[0];
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab_id, 0, 0, 1, *tab);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure we persist post entries.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, PersistPostData) {
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window_id.id(), tab_id.id());
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntryTestHelper::SetHasPostData(true, &nav1);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertSingleWindowWithSingleTab(windows.get(), 1);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, ClosingTabStaysClosed) {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab2_id;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(tab_id.id(), tab2_id.id());
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav2 =
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google2.com", "abcd");
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab2_id, 1, false);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab2_id, nav2, true);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->TabClosed(window_id, tab2_id, false);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[0]->selected_tab_index);
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs.size());
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = windows[0]->tabs[0];
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab_id, 0, 0, 1, *tab);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, Pruning) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav2 =
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google2.com", "abcd");
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 6; ++i) {
276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SerializedNavigationEntry* nav = (i % 2) == 0 ? &nav1 : &nav2;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nav->set_index(i);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateNavigation(window_id, tab_id, *nav, true);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->TabNavigationPathPrunedFromBack(window_id, tab_id, 3);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[0]->selected_tab_index);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs.size());
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = windows[0]->tabs[0];
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We left the selected index at 5, then pruned. When rereading the
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // index should get reset to last valid navigation, which is 2.
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab_id, 0, 2, 3, *tab);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3u, tab->navigations.size());
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav2, tab->navigations[1]);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[2]);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, TwoWindows) {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID window2_id;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab1_id;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab2_id;
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1;
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav2;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateAndWriteSessionWithTwoWindows(
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window2_id, tab1_id, tab2_id, &nav1, &nav2);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, windows.size());
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[0]->selected_tab_index);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[1]->selected_tab_index);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs.size());
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[1]->tabs.size());
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* rt1;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* rt2;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (windows[0]->window_id.id() == window_id.id()) {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(window2_id.id(), windows[1]->window_id.id());
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(ui::SHOW_STATE_NORMAL, windows[0]->show_state);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(ui::SHOW_STATE_MAXIMIZED, windows[1]->show_state);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rt1 = windows[0]->tabs[0];
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rt2 = windows[1]->tabs[0];
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(window2_id.id(), windows[0]->window_id.id());
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(window_id.id(), windows[1]->window_id.id());
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(ui::SHOW_STATE_MAXIMIZED, windows[0]->show_state);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(ui::SHOW_STATE_NORMAL, windows[1]->show_state);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rt1 = windows[1]->tabs[0];
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rt2 = windows[0]->tabs[0];
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = rt1;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab1_id, 0, 0, 1, *tab);
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab = rt2;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window2_id, tab2_id, 0, 0, 1, *tab);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav2, tab->navigations[0]);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, WindowWithNoTabsGetsPruned) {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID window2_id;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab1_id;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab2_id;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab1_id, 0, true);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab1_id, nav1, true);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Rect window2_bounds(3, 4, 5, 6);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetWindowType(
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window2_id, Browser::TYPE_TABBED, SessionService::TYPE_NORMAL);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetWindowBounds(window2_id,
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             window2_bounds,
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ui::SHOW_STATE_NORMAL);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window2_id, tab2_id, 0, true);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[0]->selected_tab_index);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs.size());
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = windows[0]->tabs[0];
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab1_id, 0, 0, 1, *tab);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, ClosingWindowDoesntCloseTabs) {
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab2_id;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(tab_id.id(), tab2_id.id());
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav2 =
386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google2.com", "abcd");
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab2_id, 1, false);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab2_id, nav2, true);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->WindowClosing(window_id);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[0]->selected_tab_index);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, windows[0]->tabs.size());
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = windows[0]->tabs[0];
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab_id, 0, 0, 1, *tab);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab = windows[0]->tabs[1];
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab2_id, 1, 0, 1, *tab);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav2, tab->navigations[0]);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
414e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochTEST_F(SessionServiceTest, LockingWindowRemembersAll) {
415e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SessionID window2_id;
416e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SessionID tab1_id;
417e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SessionID tab2_id;
418e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SerializedNavigationEntry nav1;
419e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  SerializedNavigationEntry nav2;
420e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
421e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  CreateAndWriteSessionWithTwoWindows(
422e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      window2_id, tab1_id, tab2_id, &nav1, &nav2);
423e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
424e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ASSERT_TRUE(service()->profile() != NULL);
425e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ASSERT_TRUE(g_browser_process->profile_manager() != NULL);
426e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ProfileInfoCache& profile_info =
427e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      g_browser_process->profile_manager()->GetProfileInfoCache();
428e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  size_t profile_index = profile_info.GetIndexOfProfileWithPath(
429e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      service()->profile()->GetPath());
430e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ASSERT_NE(std::string::npos, profile_index);
431e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  profile_info.SetProfileSigninRequiredAtIndex(profile_index, true);
432e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
433e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  service()->WindowClosing(window_id);
434e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  service()->WindowClosed(window_id);
435e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  service()->WindowClosing(window2_id);
436e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  service()->WindowClosed(window2_id);
437e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
438e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ScopedVector<SessionWindow> windows;
439e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ReadWindows(&(windows.get()), NULL);
440e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
441e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ASSERT_EQ(2U, windows.size());
442e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ASSERT_EQ(1U, windows[0]->tabs.size());
443e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ASSERT_EQ(1U, windows[1]->tabs.size());
444e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}
445e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, WindowCloseCommittedAfterNavigate) {
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID window2_id;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab2_id;
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window2_id.id(), window_id.id());
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetWindowType(
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window2_id, Browser::TYPE_TABBED, SessionService::TYPE_NORMAL);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetWindowBounds(window2_id,
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             window_bounds,
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ui::SHOW_STATE_NORMAL);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav2 =
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google2.com", "abcd");
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window2_id, tab2_id, 0, false);
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window2_id, tab2_id, nav2, true);
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->WindowClosing(window2_id);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->TabClosed(window2_id, tab2_id, false);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->WindowClosed(window2_id);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[0]->selected_tab_index);
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs.size());
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = windows[0]->tabs[0];
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab_id, 0, 0, 1, *tab);
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure we don't track popups.
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, IgnorePopups) {
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID window2_id;
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab2_id;
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window2_id.id(), window_id.id());
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetWindowType(
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window2_id, Browser::TYPE_POPUP, SessionService::TYPE_NORMAL);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetWindowBounds(window2_id,
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             window_bounds,
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ui::SHOW_STATE_NORMAL);
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav2 =
505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google2.com", "abcd");
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window2_id, tab2_id, 0, false);
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window2_id, tab2_id, nav2, true);
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[0]->selected_tab_index);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs.size());
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = windows[0]->tabs[0];
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab_id, 0, 0, 1, *tab);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined (OS_CHROMEOS)
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Makes sure we track apps. Only applicable on chromeos.
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, RestoreApp) {
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID window2_id;
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab2_id;
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window2_id.id(), window_id.id());
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetWindowType(
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window2_id, Browser::TYPE_POPUP, SessionService::TYPE_APP);
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetWindowBounds(window2_id,
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             window_bounds,
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ui::SHOW_STATE_NORMAL);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetWindowAppName(window2_id, "TestApp");
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav2 =
546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google2.com", "abcd");
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window2_id, tab2_id, 0, false);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window2_id, tab2_id, nav2, true);
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, windows.size());
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int tabbed_index = windows[0]->type == Browser::TYPE_TABBED ?
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0 : 1;
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int app_index = tabbed_index == 0 ? 1 : 0;
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[tabbed_index]->selected_tab_index);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(window_id.id(), windows[tabbed_index]->window_id.id());
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[tabbed_index]->tabs.size());
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = windows[tabbed_index]->tabs[0];
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab_id, 0, 0, 1, *tab);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[app_index]->selected_tab_index);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(window2_id.id(), windows[app_index]->window_id.id());
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[app_index]->tabs.size());
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(windows[app_index]->type == Browser::TYPE_POPUP);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ("TestApp", windows[app_index]->app_name);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tab = windows[app_index]->tabs[0];
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window2_id, tab2_id, 0, 0, 1, *tab);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav2, tab->navigations[0]);
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // defined (OS_CHROMEOS)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests pruning from the front.
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, PruneFromFront) {
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string base_url("http://google.com/");
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add 5 navigations, with the 4th selected.
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 5; ++i) {
591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SerializedNavigationEntry nav =
592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        SerializedNavigationEntryTestHelper::CreateNavigation(
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base_url + base::IntToString(i), "a");
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nav.set_index(i);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateNavigation(window_id, tab_id, nav, (i == 3));
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prune the first two navigations from the front.
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.service()->TabNavigationPathPrunedFromFront(window_id, tab_id, 2);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Read back in.
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, windows[0]->selected_tab_index);
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs.size());
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There shouldn't be an app id.
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(windows[0]->tabs[0]->extension_app_id.empty());
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should be left with three navigations, the 2nd selected.
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = windows[0]->tabs[0];
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, tab->current_navigation_index);
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, tab->navigations.size());
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GURL(base_url + base::IntToString(2)) ==
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tab->navigations[0].virtual_url());
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GURL(base_url + base::IntToString(3)) ==
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tab->navigations[1].virtual_url());
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(GURL(base_url + base::IntToString(4)) ==
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              tab->navigations[2].virtual_url());
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Prunes from front so that we have no entries.
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, PruneToEmpty) {
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string base_url("http://google.com/");
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add 5 navigations, with the 4th selected.
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 5; ++i) {
634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SerializedNavigationEntry nav =
635c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        SerializedNavigationEntryTestHelper::CreateNavigation(
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base_url + base::IntToString(i), "a");
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nav.set_index(i);
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateNavigation(window_id, tab_id, nav, (i == 3));
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prune the first two navigations from the front.
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.service()->TabNavigationPathPrunedFromFront(window_id, tab_id, 5);
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Read back in.
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0U, windows.size());
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Don't set the pinned state and make sure the pinned value is false.
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, PinnedDefaultsToFalse) {
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(CreateAndWriteSessionWithOneTab(false, false));
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Explicitly set the pinned state to false and make sure we get back false.
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, PinnedFalseWhenSetToFalse) {
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(CreateAndWriteSessionWithOneTab(false, true));
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Explicitly set the pinned state to true and make sure we get back true.
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, PinnedTrue) {
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(CreateAndWriteSessionWithOneTab(true, true));
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure application extension ids are persisted.
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, PersistApplicationExtensionID) {
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window_id.id(), tab_id.id());
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string app_id("foo");
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.SetTabExtensionAppID(window_id, tab_id, app_id);
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertSingleWindowWithSingleTab(windows.get(), 1);
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(app_id == windows[0]->tabs[0]->extension_app_id);
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Check that user agent overrides are persisted.
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, PersistUserAgentOverrides) {
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window_id.id(), tab_id.id());
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string user_agent_override = "Mozilla/5.0 (X11; Linux x86_64) "
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.45 "
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Safari/535.19";
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntryTestHelper::SetIsOverridingUserAgent(true, &nav1);
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.SetTabUserAgentOverride(window_id, tab_id, user_agent_override);
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertSingleWindowWithSingleTab(windows.get(), 1);
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionTab* tab = windows[0]->tabs[0];
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab_id, 0, 0, 1, *tab);
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(user_agent_override == tab->user_agent_override);
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the notification for SESSION_SERVICE_SAVED is working properly.
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, SavedSessionNotification) {
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_SESSION_SERVICE_SAVED,
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::NotificationService::AllSources());
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->Save();
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(sync_save_count_, 1);
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure a tab closed by a user gesture is not restored.
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, CloseTabUserGesture) {
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window_id.id(), tab_id.id());
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->TabClosed(window_id, tab_id, true);
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(windows.empty());
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies SetWindowBounds maps SHOW_STATE_DEFAULT to SHOW_STATE_NORMAL.
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, DontPersistDefault) {
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window_id.id(), tab_id.id());
746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "abc");
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->SetWindowBounds(window_id,
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             window_bounds,
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ui::SHOW_STATE_DEFAULT);
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ui::SHOW_STATE_NORMAL, windows[0]->show_state);
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, KeepPostDataWithoutPasswords) {
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window_id.id(), tab_id.id());
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create a page state representing a HTTP body without posted passwords.
76690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::PageState page_state =
76790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      content::PageState::CreateForTesting(GURL(), false, "data", NULL);
76890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
76990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create a TabNavigation containing page_state and representing a POST
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // request.
771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "title");
77490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SerializedNavigationEntryTestHelper::SetPageState(page_state, &nav1);
775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntryTestHelper::SetHasPostData(true, &nav1);
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create a TabNavigation containing page_state and representing a normal
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // request.
779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav2 =
780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "http://google.com/nopost", "title");
78290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SerializedNavigationEntryTestHelper::SetPageState(page_state, &nav2);
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nav2.set_index(1);
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav2, true);
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertSingleWindowWithSingleTab(windows.get(), 2);
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Expected: the page state of both navigations was saved and restored.
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, windows[0]->tabs[0]->navigations.size());
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, windows[0]->tabs[0]->navigations[0]);
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertNavigationEquals(nav2, windows[0]->tabs[0]->navigations[1]);
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, RemovePostDataWithPasswords) {
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(window_id.id(), tab_id.id());
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create a page state representing a HTTP body with posted passwords.
80590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  content::PageState page_state =
80690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      content::PageState::CreateForTesting(GURL(), true, "data", NULL);
80790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
80890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Create a TabNavigation containing page_state and representing a POST
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // request with passwords.
810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1 =
811c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          "http://google.com", "title");
81390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SerializedNavigationEntryTestHelper::SetPageState(page_state, &nav1);
814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntryTestHelper::SetHasPostData(true, &nav1);
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.AssertSingleWindowWithSingleTab(windows.get(), 1);
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Expected: the HTTP body was removed from the page state of the POST
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // navigation with passwords.
82590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_NE(page_state, windows[0]->tabs[0]->navigations[0].page_state());
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test is only applicable to chromeos.
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies migration of tab/window closed works.
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, CanOpenV1TabClosed) {
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath v1_file_path;
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &v1_file_path));
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // v1_session_file contains a tab closed command with the original id. The
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // file was generated from ClosingTabStaysClosed. If we successfully processed
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the file we'll have one tab.
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  v1_file_path =
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      v1_file_path.AppendASCII("sessions").AppendASCII("v1_session_file");
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath dest_file_path(path_);
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dest_file_path = dest_file_path.AppendASCII("Current Session");
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Forces closing the file.
843c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  helper_.SetService(NULL);
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(base::CopyFile(v1_file_path, dest_file_path));
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionService* session_service = new SessionService(path_);
848c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch  helper_.SetService(session_service);
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID::id_type active_window_id = 0;
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.ReadWindows(&(windows.get()), &active_window_id);
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, windows.size());
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1u, windows[0]->tabs.size());
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, ReplacePendingNavigation) {
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string base_url("http://google.com/");
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add 5 navigations, some with the same index
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 5; ++i) {
865c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SerializedNavigationEntry nav =
866c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        SerializedNavigationEntryTestHelper::CreateNavigation(
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base_url + base::IntToString(i), "a");
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nav.set_index(i / 2);
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateNavigation(window_id, tab_id, nav, true);
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Read back in.
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The ones with index 0, and 2 should have been replaced by 1 and 3.
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs.size());
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, windows[0]->tabs[0]->navigations.size());
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL(base_url + base::IntToString(1)),
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            windows[0]->tabs[0]->navigations[0].virtual_url());
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL(base_url + base::IntToString(3)),
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            windows[0]->tabs[0]->navigations[1].virtual_url());
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL(base_url + base::IntToString(4)),
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            windows[0]->tabs[0]->navigations[2].virtual_url());
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, ReplacePendingNavigationAndPrune) {
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string base_url("http://google.com/");
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab_id;
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 5; ++i) {
895c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SerializedNavigationEntry nav =
896c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        SerializedNavigationEntryTestHelper::CreateNavigation(
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base_url + base::IntToString(i), "a");
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    nav.set_index(i);
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UpdateNavigation(window_id, tab_id, nav, true);
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Prune all those navigations.
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper_.service()->TabNavigationPathPrunedFromFront(window_id, tab_id, 5);
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add another navigation to replace the last one.
906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav =
907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base_url + base::IntToString(5), "a");
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nav.set_index(4);
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav, true);
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Read back in.
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should still have that last navigation at the end,
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // even though it replaced one that was set before the prune.
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs.size());
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs[0]->navigations.size());
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL(base_url + base::IntToString(5)),
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            windows[0]->tabs[0]->navigations[0].virtual_url());
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, RestoreActivation1) {
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID window2_id;
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab1_id;
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab2_id;
929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1;
930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav2;
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateAndWriteSessionWithTwoWindows(
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window2_id, tab1_id, tab2_id, &nav1, &nav2);
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->ScheduleCommand(
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service()->CreateSetActiveWindowCommand(window2_id));
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->ScheduleCommand(
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service()->CreateSetActiveWindowCommand(window_id));
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID::id_type active_window_id = 0;
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), &active_window_id);
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(window_id.id(), active_window_id);
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It's easier to have two separate tests with setup/teardown than to manualy
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reset the state for the different flavors of the test.
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SessionServiceTest, RestoreActivation2) {
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID window2_id;
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab1_id;
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID tab2_id;
952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav1;
953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SerializedNavigationEntry nav2;
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateAndWriteSessionWithTwoWindows(
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window2_id, tab1_id, tab2_id, &nav1, &nav2);
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->ScheduleCommand(
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service()->CreateSetActiveWindowCommand(window2_id));
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->ScheduleCommand(
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service()->CreateSetActiveWindowCommand(window_id));
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service()->ScheduleCommand(
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      service()->CreateSetActiveWindowCommand(window2_id));
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SessionID::id_type active_window_id = 0;
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReadWindows(&(windows.get()), &active_window_id);
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(window2_id.id(), active_window_id);
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
970a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
971a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Makes sure we don't track blacklisted URLs.
972a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(SessionServiceTest, IgnoreBlacklistedUrls) {
973a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SessionID tab_id;
974a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
975a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SerializedNavigationEntry nav1 =
976a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
977a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          "http://google.com", "abc");
978a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SerializedNavigationEntry nav2 =
979a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
980a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          chrome::kChromeUIQuitURL, "quit");
981a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SerializedNavigationEntry nav3 =
982a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      SerializedNavigationEntryTestHelper::CreateNavigation(
983a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          chrome::kChromeUIRestartURL, "restart");
984a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
985a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  helper_.PrepareTabInWindow(window_id, tab_id, 0, true);
986a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav1, true);
987a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav2, true);
988a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  UpdateNavigation(window_id, tab_id, nav3, true);
989a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
990a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ScopedVector<SessionWindow> windows;
991a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ReadWindows(&(windows.get()), NULL);
992a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
993a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_EQ(1U, windows.size());
994a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_EQ(0, windows[0]->selected_tab_index);
995a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_EQ(window_id.id(), windows[0]->window_id.id());
996a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_EQ(1U, windows[0]->tabs.size());
997a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
998a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SessionTab* tab = windows[0]->tabs[0];
999a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  helper_.AssertTabEquals(window_id, tab_id, 0, 0, 1, *tab);
1000a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  helper_.AssertNavigationEquals(nav1, tab->navigations[0]);
1001a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
10021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Functions used by GetSessionsAndDestroy.
10041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace {
10051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid OnGotPreviousSession(ScopedVector<SessionWindow> windows,
10071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          SessionID::id_type ignored_active_window) {
10081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FAIL() << "SessionService was destroyed, this shouldn't be reached.";
10091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
10101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid PostBackToThread(base::MessageLoop* message_loop,
10121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      base::RunLoop* run_loop) {
10131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  message_loop->PostTask(FROM_HERE,
10141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         base::Bind(&base::RunLoop::Quit,
10151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                    base::Unretained(run_loop)));
10161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
10171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
10191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
10201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Verifies that SessionService::GetLastSession() works correctly if the
10211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// SessionService is deleted during processing. To verify the problematic case
10221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// does the following:
10231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 1. Sends a task to the background thread that blocks.
10241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 2. Asks SessionService for the last session commands. This is blocked by 1.
10251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 3. Posts another task to the background thread, this too is blocked by 1.
10261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 4. Deletes SessionService.
10271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 5. Signals the semaphore that 2 and 3 are waiting on, allowing
10281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//    GetLastSession() to continue.
10291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// 6. runs the message loop, this is quit when the task scheduled in 3 posts
10301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//    back to the ui thread to quit the run loop.
10311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The call to get the previous session should never be invoked because the
10321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// SessionService was destroyed before SessionService could process the results.
10331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(SessionServiceTest, GetSessionsAndDestroy) {
10341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::CancelableTaskTracker cancelable_task_tracker;
10351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop run_loop;
10361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::WaitableEvent event(true, false);
10371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  helper_.RunTaskOnBackendThread(FROM_HERE,
10381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 base::Bind(&base::WaitableEvent::Wait,
10391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            base::Unretained(&event)));
10401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  service()->GetLastSession(base::Bind(&OnGotPreviousSession),
10411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            &cancelable_task_tracker);
10421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  helper_.RunTaskOnBackendThread(
10431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      FROM_HERE,
10441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      base::Bind(&PostBackToThread,
10451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 base::Unretained(base::MessageLoop::current()),
10461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                 base::Unretained(&run_loop)));
10471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delete helper_.ReleaseService();
10481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  event.Signal();
10491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  run_loop.Run();
10501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1051