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 <string>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/pinned_tab_codec.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/pinned_tab_service.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/pinned_tab_service_factory.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/pinned_tab_test_utils.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/browser_with_test_window_test.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)KeyedService* BuildPinnedTabService(content::BrowserContext* profile) {
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return new PinnedTabService(static_cast<Profile*>(profile));
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PinnedTabService* BuildForProfile(Profile* profile) {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<PinnedTabService*>(
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PinnedTabServiceFactory::GetInstance()->SetTestingFactoryAndUse(
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          profile, BuildPinnedTabService));
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PinnedTabServiceTest : public BrowserWithTestWindowTest {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  PinnedTabServiceTest() : pinned_tab_service_(NULL) {}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual TestingProfile* CreateProfile() OVERRIDE {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestingProfile* profile = BrowserWithTestWindowTest::CreateProfile();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pinned_tab_service_ = BuildForProfile(profile);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return profile;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PinnedTabService* pinned_tab_service_;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PinnedTabServiceTest);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure closing a popup triggers writing pinned tabs.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(PinnedTabServiceTest, Popup) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.google.com");
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTab(browser(), url);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->tab_strip_model()->SetTabPinned(0, true);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a popup.
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser::CreateParams params(Browser::TYPE_POPUP, profile(),
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               browser()->host_desktop_type());
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Browser> popup(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::CreateBrowserWithTestWindowForParams(&params));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the browser. This should trigger saving the tabs. No need to destroy
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the browser (this happens automatically in the test destructor).
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->OnWindowClosing();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string result = PinnedTabTestUtils::TabsToString(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PinnedTabCodec::ReadPinnedTabs(profile()));
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("http://www.google.com/::pinned:", result);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the popup. This shouldn't reset the saved state.
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  popup->tab_strip_model()->CloseAllTabs();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup.reset(NULL);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the state to make sure it hasn't changed.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  result = PinnedTabTestUtils::TabsToString(
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PinnedTabCodec::ReadPinnedTabs(profile()));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("http://www.google.com/::pinned:", result);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
79