1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/ui/android/tab_model/tab_model.h"
6 #include "chrome/browser/ui/android/tab_model/tab_model_list.h"
7 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
8 #include "chrome/test/base/testing_profile.h"
9 #include "content/public/browser/web_contents.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11 
12 namespace {
13 class TabModelListTest : public ChromeRenderViewHostTestHarness {};
14 
15 class TestTabModel : public TabModel {
16  public:
TestTabModel(Profile * profile)17   explicit TestTabModel(Profile* profile)
18       : TabModel(profile, false), tab_count_(0) {}
19 
GetTabCount() const20   int GetTabCount() const override { return tab_count_; }
GetActiveIndex() const21   int GetActiveIndex() const override { return 0; }
GetWebContentsAt(int index) const22   content::WebContents* GetWebContentsAt(int index) const override {
23     return nullptr;
24   }
CreateTab(TabAndroid * parent,content::WebContents * web_contents)25   void CreateTab(TabAndroid* parent,
26                  content::WebContents* web_contents) override {}
HandlePopupNavigation(TabAndroid * parent,NavigateParams * params)27   void HandlePopupNavigation(TabAndroid* parent,
28                              NavigateParams* params) override {}
CreateNewTabForDevTools(const GURL & url)29   content::WebContents* CreateNewTabForDevTools(const GURL& url) override {
30     return nullptr;
31   }
IsSessionRestoreInProgress() const32   bool IsSessionRestoreInProgress() const override { return false; }
IsActiveModel() const33   bool IsActiveModel() const override { return false; }
GetTabAt(int index) const34   TabAndroid* GetTabAt(int index) const override { return nullptr; }
SetActiveIndex(int index)35   void SetActiveIndex(int index) override {}
CloseTabAt(int index)36   void CloseTabAt(int index) override {}
AddObserver(TabModelObserver * observer)37   void AddObserver(TabModelObserver* observer) override {}
RemoveObserver(TabModelObserver * observer)38   void RemoveObserver(TabModelObserver* observer) override {}
39 
40   // A fake value for the current number of tabs.
41   int tab_count_;
42 };
43 }  // namespace
44 
45 // Regression test for http://crbug.com/432685.
TEST_F(TabModelListTest,TestGetTabModelForWebContents)46 TEST_F(TabModelListTest, TestGetTabModelForWebContents) {
47   TestTabModel tab_model(profile());
48   TabModelList::AddTabModel(&tab_model);
49 
50   std::unique_ptr<content::WebContents> contents(CreateTestWebContents());
51 
52   // Should not crash when there are no tabs.
53   EXPECT_EQ(NULL, TabModelList::GetTabModelForWebContents(contents.get()));
54 
55   // Should not crash when there is an uninitialized tab, i.e. when
56   // TabModel::GetTabAt returns NULL.
57   tab_model.tab_count_ = 1;
58   EXPECT_EQ(NULL, TabModelList::GetTabModelForWebContents(contents.get()));
59 
60   TabModelList::RemoveTabModel(&tab_model);
61 }
62