1// Copyright (c) 2012 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_list.h"
6
7#include "chrome/browser/android/tab_android.h"
8#include "chrome/browser/profiles/profile.h"
9#include "chrome/browser/ui/android/tab_model/tab_model.h"
10#include "chrome/browser/ui/browser_navigator.h"
11#include "content/public/browser/web_contents.h"
12
13namespace {
14
15// Maintains and gives access to a static list of TabModel instances.
16static TabModelList::TabModelVector& tab_models() {
17  CR_DEFINE_STATIC_LOCAL(TabModelList::TabModelVector,
18                         tab_model_vector, ());
19  return tab_model_vector;
20}
21
22}  // namespace
23
24void TabModelList::AddTabModel(TabModel* tab_model) {
25  DCHECK(tab_model);
26  tab_models().push_back(tab_model);
27}
28
29void TabModelList::RemoveTabModel(TabModel* tab_model) {
30  DCHECK(tab_model);
31  TabModelList::iterator remove_tab_model =
32      std::find(tab_models().begin(), tab_models().end(), tab_model);
33
34  if (remove_tab_model != tab_models().end())
35    tab_models().erase(remove_tab_model);
36}
37
38void TabModelList::HandlePopupNavigation(chrome::NavigateParams* params) {
39  TabAndroid* tab = TabAndroid::FromWebContents(params->source_contents);
40
41  // NOTE: If this fails contact dtrainor@.
42  DCHECK(tab);
43  tab->HandlePopupNavigation(params);
44}
45
46TabModel* TabModelList::GetTabModelForWebContents(
47    content::WebContents* web_contents) {
48  if (!web_contents)
49    return NULL;
50
51  for (TabModelList::const_iterator i = TabModelList::begin();
52      i != TabModelList::end(); ++i) {
53    TabModel* model = *i;
54    for (int index = 0; index < model->GetTabCount(); index++) {
55      if (web_contents == model->GetWebContentsAt(index))
56        return model;
57    }
58  }
59
60  return NULL;
61}
62
63TabModel* TabModelList::FindTabModelWithId(
64    SessionID::id_type desired_id) {
65  for (TabModelList::const_iterator i = TabModelList::begin();
66      i != TabModelList::end(); i++) {
67    if ((*i)->GetSessionId() == desired_id)
68      return *i;
69  }
70
71  return NULL;
72}
73
74bool TabModelList::IsOffTheRecordSessionActive() {
75  for (TabModelList::const_iterator i = TabModelList::begin();
76      i != TabModelList::end(); i++) {
77    if ((*i)->IsOffTheRecord() && (*i)->GetTabCount() > 0)
78      return true;
79  }
80
81  return false;
82}
83
84TabModelList::const_iterator TabModelList::begin() {
85  return tab_models().begin();
86}
87
88TabModelList::const_iterator TabModelList::end() {
89  return tab_models().end();
90}
91
92bool TabModelList::empty() {
93  return tab_models().empty();
94}
95
96size_t TabModelList::size() {
97  return tab_models().size();
98}
99
100TabModel* TabModelList::get(size_t index) {
101  DCHECK_LT(index, size());
102  return tab_models()[index];
103}
104