1// Copyright (c) 2010 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 "base/metrics/nacl_histogram.h"
6#include "chrome/browser/tabs/default_tab_handler.h"
7#include "chrome/browser/tabs/tab_strip_model.h"
8#include "chrome/browser/ui/browser.h"
9
10////////////////////////////////////////////////////////////////////////////////
11// DefaultTabHandler, public:
12
13DefaultTabHandler::DefaultTabHandler(TabHandlerDelegate* delegate)
14    : delegate_(delegate),
15      ALLOW_THIS_IN_INITIALIZER_LIST(
16          model_(new TabStripModel(this, delegate->GetProfile()))) {
17  UmaNaclHistogramEnumeration(FIRST_TAB_NACL_BASELINE);
18  model_->AddObserver(this);
19}
20
21DefaultTabHandler::~DefaultTabHandler() {
22  // The tab strip should not have any tabs at this point.
23  DCHECK(model_->empty());
24  model_->RemoveObserver(this);
25}
26
27////////////////////////////////////////////////////////////////////////////////
28// DefaultTabHandler, TabHandler implementation:
29
30TabStripModel* DefaultTabHandler::GetTabStripModel() const {
31  return model_.get();
32}
33
34////////////////////////////////////////////////////////////////////////////////
35// DefaultTabHandler, TabStripModelDelegate implementation:
36
37TabContentsWrapper* DefaultTabHandler::AddBlankTab(bool foreground) {
38  UmaNaclHistogramEnumeration(NEW_TAB_NACL_BASELINE);
39  return delegate_->AsBrowser()->AddBlankTab(foreground);
40}
41
42TabContentsWrapper* DefaultTabHandler::AddBlankTabAt(int index,
43                                                     bool foreground) {
44  return delegate_->AsBrowser()->AddBlankTabAt(index, foreground);
45}
46
47Browser* DefaultTabHandler::CreateNewStripWithContents(
48    TabContentsWrapper* detached_contents,
49    const gfx::Rect& window_bounds,
50    const DockInfo& dock_info,
51    bool maximize) {
52  return delegate_->AsBrowser()->CreateNewStripWithContents(detached_contents,
53                                                            window_bounds,
54                                                            dock_info,
55                                                            maximize);
56}
57
58int DefaultTabHandler::GetDragActions() const {
59  return delegate_->AsBrowser()->GetDragActions();
60}
61
62TabContentsWrapper* DefaultTabHandler::CreateTabContentsForURL(
63    const GURL& url,
64    const GURL& referrer,
65    Profile* profile,
66    PageTransition::Type transition,
67    bool defer_load,
68    SiteInstance* instance) const {
69  return delegate_->AsBrowser()->CreateTabContentsForURL(url,
70                                                         referrer,
71                                                         profile,
72                                                         transition,
73                                                         defer_load,
74                                                         instance);
75}
76
77bool DefaultTabHandler::CanDuplicateContentsAt(int index) {
78  return delegate_->AsBrowser()->CanDuplicateContentsAt(index);
79}
80
81void DefaultTabHandler::DuplicateContentsAt(int index) {
82  delegate_->AsBrowser()->DuplicateContentsAt(index);
83}
84
85void DefaultTabHandler::CloseFrameAfterDragSession() {
86  delegate_->AsBrowser()->CloseFrameAfterDragSession();
87}
88
89void DefaultTabHandler::CreateHistoricalTab(TabContentsWrapper* contents) {
90  delegate_->AsBrowser()->CreateHistoricalTab(contents);
91}
92
93bool DefaultTabHandler::RunUnloadListenerBeforeClosing(
94    TabContentsWrapper* contents) {
95  return delegate_->AsBrowser()->RunUnloadListenerBeforeClosing(contents);
96}
97
98bool DefaultTabHandler::CanCloseContentsAt(int index) {
99  return delegate_->AsBrowser()->CanCloseContentsAt(index);
100}
101
102bool DefaultTabHandler::CanBookmarkAllTabs() const {
103  return delegate_->AsBrowser()->CanBookmarkAllTabs();
104}
105
106void DefaultTabHandler::BookmarkAllTabs() {
107  delegate_->AsBrowser()->BookmarkAllTabs();
108}
109
110bool DefaultTabHandler::CanCloseTab() const {
111  return delegate_->AsBrowser()->CanCloseTab();
112}
113
114void DefaultTabHandler::ToggleUseVerticalTabs() {
115  delegate_->AsBrowser()->ToggleUseVerticalTabs();
116}
117
118bool DefaultTabHandler::CanRestoreTab() {
119  return delegate_->AsBrowser()->CanRestoreTab();
120}
121
122void DefaultTabHandler::RestoreTab() {
123  delegate_->AsBrowser()->RestoreTab();
124}
125
126bool DefaultTabHandler::LargeIconsPermitted() const {
127  return delegate_->AsBrowser()->LargeIconsPermitted();
128}
129
130bool DefaultTabHandler::UseVerticalTabs() const {
131  return delegate_->AsBrowser()->UseVerticalTabs();
132}
133
134////////////////////////////////////////////////////////////////////////////////
135// DefaultTabHandler, TabStripModelObserver implementation:
136
137void DefaultTabHandler::TabInsertedAt(TabContentsWrapper* contents,
138                                      int index,
139                                      bool foreground) {
140  delegate_->AsBrowser()->TabInsertedAt(contents, index, foreground);
141}
142
143void DefaultTabHandler::TabClosingAt(TabStripModel* tab_strip_model,
144                                     TabContentsWrapper* contents,
145                                     int index) {
146  delegate_->AsBrowser()->TabClosingAt(tab_strip_model, contents, index);
147}
148
149void DefaultTabHandler::TabDetachedAt(TabContentsWrapper* contents, int index) {
150  delegate_->AsBrowser()->TabDetachedAt(contents, index);
151}
152
153void DefaultTabHandler::TabDeselected(TabContentsWrapper* contents) {
154  delegate_->AsBrowser()->TabDeselected(contents);
155}
156
157void DefaultTabHandler::TabSelectedAt(TabContentsWrapper* old_contents,
158                                      TabContentsWrapper* new_contents,
159                                      int index,
160                                      bool user_gesture) {
161  delegate_->AsBrowser()->TabSelectedAt(old_contents,
162                                        new_contents,
163                                        index,
164                                        user_gesture);
165}
166
167void DefaultTabHandler::TabMoved(TabContentsWrapper* contents,
168                                 int from_index,
169                                 int to_index) {
170  delegate_->AsBrowser()->TabMoved(contents, from_index, to_index);
171}
172
173void DefaultTabHandler::TabReplacedAt(TabStripModel* tab_strip_model,
174                                      TabContentsWrapper* old_contents,
175                                      TabContentsWrapper* new_contents,
176                                      int index) {
177  delegate_->AsBrowser()->TabReplacedAt(tab_strip_model, old_contents,
178                                        new_contents, index);
179}
180
181void DefaultTabHandler::TabPinnedStateChanged(TabContentsWrapper* contents,
182                                              int index) {
183  delegate_->AsBrowser()->TabPinnedStateChanged(contents, index);
184}
185
186void DefaultTabHandler::TabStripEmpty() {
187  delegate_->AsBrowser()->TabStripEmpty();
188}
189
190////////////////////////////////////////////////////////////////////////////////
191// TabHandler, public:
192
193// static
194TabHandler* TabHandler::CreateTabHandler(TabHandlerDelegate* delegate) {
195  return new DefaultTabHandler(delegate);
196}
197
198