| Index: chrome/browser/tabs/tab_strip_model.cc
|
| diff --git a/chrome/browser/tabs/tab_strip_model.cc b/chrome/browser/tabs/tab_strip_model.cc
|
| index 7e0bcb7ccb6722146a5330d01518bd53db455883..b033a54b6ac59d77a76ed1e8478998b80e4171bc 100644
|
| --- a/chrome/browser/tabs/tab_strip_model.cc
|
| +++ b/chrome/browser/tabs/tab_strip_model.cc
|
| @@ -80,14 +80,6 @@ void TabStripModel::RemoveObserver(TabStripModelObserver* observer) {
|
| observers_.RemoveObserver(observer);
|
| }
|
|
|
| -bool TabStripModel::HasNonPhantomTabs() const {
|
| - for (int i = 0; i < count(); i++) {
|
| - if (!IsPhantomTab(i))
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| void TabStripModel::SetInsertionPolicy(InsertionPolicy policy) {
|
| order_controller_->set_insertion_policy(policy);
|
| }
|
| @@ -173,19 +165,19 @@ TabContents* TabStripModel::DetachTabContentsAt(int index) {
|
| DCHECK(ContainsIndex(index));
|
| TabContents* removed_contents = GetContentsAt(index);
|
| int next_selected_index =
|
| - order_controller_->DetermineNewSelectedIndex(index, true);
|
| + order_controller_->DetermineNewSelectedIndex(index);
|
| delete contents_data_.at(index);
|
| contents_data_.erase(contents_data_.begin() + index);
|
| - next_selected_index = IndexOfNextNonPhantomTab(next_selected_index, -1);
|
| - if (!HasNonPhantomTabs())
|
| + next_selected_index = IndexOfNextTab(next_selected_index);
|
| + if (empty())
|
| closing_all_ = true;
|
| TabStripModelObservers::Iterator iter(observers_);
|
| while (TabStripModelObserver* obs = iter.GetNext()) {
|
| obs->TabDetachedAt(removed_contents, index);
|
| - if (!HasNonPhantomTabs())
|
| + if (empty())
|
| obs->TabStripEmpty();
|
| }
|
| - if (HasNonPhantomTabs()) {
|
| + if (!empty()) {
|
| if (index == selected_index_) {
|
| ChangeSelectedContentsFrom(removed_contents, next_selected_index, false);
|
| } else if (index < selected_index_) {
|
| @@ -296,17 +288,13 @@ int TabStripModel::GetIndexOfNextTabContentsOpenedBy(
|
|
|
| // Check tabs after start_index first.
|
| for (int i = start_index + 1; i < count(); ++i) {
|
| - if (OpenerMatches(contents_data_[i], opener, use_group) &&
|
| - !IsPhantomTab(i)) {
|
| + if (OpenerMatches(contents_data_[i], opener, use_group))
|
| return i;
|
| - }
|
| }
|
| // Then check tabs before start_index, iterating backwards.
|
| for (int i = start_index - 1; i >= 0; --i) {
|
| - if (OpenerMatches(contents_data_[i], opener, use_group) &&
|
| - !IsPhantomTab(i)) {
|
| + if (OpenerMatches(contents_data_[i], opener, use_group))
|
| return i;
|
| - }
|
| }
|
| return kNoTab;
|
| }
|
| @@ -318,7 +306,7 @@ int TabStripModel::GetIndexOfFirstTabContentsOpenedBy(
|
| DCHECK(ContainsIndex(start_index));
|
|
|
| for (int i = 0; i < start_index; ++i) {
|
| - if (contents_data_[i]->opener == opener && !IsPhantomTab(i))
|
| + if (contents_data_[i]->opener == opener)
|
| return i;
|
| }
|
| return kNoTab;
|
| @@ -337,10 +325,8 @@ int TabStripModel::GetIndexOfLastTabContentsOpenedBy(
|
| next = iter - 1;
|
| if (next == end)
|
| break;
|
| - if ((*next)->opener == opener &&
|
| - !IsPhantomTab(static_cast<int>(next - contents_data_.begin()))) {
|
| + if ((*next)->opener == opener)
|
| return static_cast<int>(next - contents_data_.begin());
|
| - }
|
| }
|
| return kNoTab;
|
| }
|
| @@ -454,11 +440,6 @@ bool TabStripModel::IsToolbarVisible(int index) const {
|
| return prefs->AreAppTabToolbarsVisible(extension_app->id());
|
| }
|
|
|
| -bool TabStripModel::IsPhantomTab(int index) const {
|
| - return IsTabPinned(index) &&
|
| - GetTabContentsAt(index)->controller().needs_reload();
|
| -}
|
| -
|
| bool TabStripModel::IsTabBlocked(int index) const {
|
| return contents_data_[index]->blocked;
|
| }
|
| @@ -694,14 +675,8 @@ void TabStripModel::ExecuteContextMenuCommand(
|
| UserMetricsAction("TabContextMenu_TogglePinned"),
|
| profile_);
|
|
|
| - if (IsPhantomTab(context_index)) {
|
| - // The tab is a phantom tab, close it.
|
| - CloseTabContentsAt(context_index,
|
| - CLOSE_USER_GESTURE | CLOSE_CREATE_HISTORICAL_TAB);
|
| - } else {
|
| - SelectTabContentsAt(context_index, true);
|
| - SetTabPinned(context_index, !IsTabPinned(context_index));
|
| - }
|
| + SelectTabContentsAt(context_index, true);
|
| + SetTabPinned(context_index, !IsTabPinned(context_index));
|
| break;
|
| }
|
| case CommandToggleToolbar: {
|
| @@ -797,13 +772,7 @@ void TabStripModel::Observe(NotificationType type,
|
| if (index != TabStripModel::kNoTab) {
|
| // Note that we only detach the contents here, not close it - it's
|
| // already been closed. We just want to undo our bookkeeping.
|
| - if (ShouldMakePhantomOnClose(index)) {
|
| - // We don't actually allow pinned tabs to close. Instead they become
|
| - // phantom.
|
| - MakePhantom(index);
|
| - } else {
|
| - DetachTabContentsAt(index);
|
| - }
|
| + DetachTabContentsAt(index);
|
| }
|
| break;
|
| }
|
| @@ -971,83 +940,16 @@ void TabStripModel::SelectRelativeTab(bool next) {
|
| if (contents_data_.empty())
|
| return;
|
|
|
| - // Skip pinned-app-phantom tabs when iterating.
|
| - int index = selected_index_;
|
| int delta = next ? 1 : -1;
|
| - do {
|
| - index = (index + count() + delta) % count();
|
| - } while (index != selected_index_ && IsPhantomTab(index));
|
| + int index = (selected_index_ + count() + delta) % count();
|
| SelectTabContentsAt(index, true);
|
| }
|
|
|
| -int TabStripModel::IndexOfNextNonPhantomTab(int index,
|
| - int ignore_index) {
|
| - if (index == kNoTab)
|
| - return kNoTab;
|
| -
|
| - if (empty())
|
| - return index;
|
| -
|
| - index = std::min(count() - 1, std::max(0, index));
|
| - int start = index;
|
| - do {
|
| - if (index != ignore_index && !IsPhantomTab(index))
|
| - return index;
|
| - index = (index + 1) % count();
|
| - } while (index != start);
|
| -
|
| - // All phantom tabs.
|
| - return start;
|
| -}
|
| -
|
| -bool TabStripModel::ShouldMakePhantomOnClose(int index) {
|
| - if (IsTabPinned(index) && !IsPhantomTab(index) && !closing_all_ &&
|
| - profile()) {
|
| - if (!IsAppTab(index))
|
| - return true; // Always make non-app tabs go phantom.
|
| -
|
| - ExtensionsService* extension_service = profile()->GetExtensionsService();
|
| - if (!extension_service)
|
| - return false;
|
| -
|
| - Extension* extension_app = GetTabContentsAt(index)->extension_app();
|
| - DCHECK(extension_app);
|
| -
|
| - // Only allow the tab to be made phantom if the extension still exists.
|
| - return extension_service->GetExtensionById(extension_app->id(),
|
| - false) != NULL;
|
| - }
|
| - return false;
|
| +int TabStripModel::IndexOfNextTab(int index) {
|
| + return (index == kNoTab || empty()) ?
|
| + index : std::min(count() - 1, std::max(0, index));
|
| }
|
|
|
| -void TabStripModel::MakePhantom(int index) {
|
| - TabContents* old_contents = GetContentsAt(index);
|
| - TabContents* new_contents = old_contents->CloneAndMakePhantom();
|
| -
|
| - contents_data_[index]->contents = new_contents;
|
| -
|
| - // And notify observers.
|
| - FOR_EACH_OBSERVER(TabStripModelObserver, observers_,
|
| - TabReplacedAt(old_contents, new_contents, index));
|
| -
|
| - if (selected_index_ == index && HasNonPhantomTabs()) {
|
| - // Change the selection, otherwise we're going to force the phantom tab
|
| - // to become selected.
|
| - // NOTE: we must do this after the call to Replace otherwise browser's
|
| - // TabSelectedAt will send out updates for the old TabContents which we've
|
| - // already told observers has been closed (we sent out TabClosing at).
|
| - int new_selected_index =
|
| - order_controller_->DetermineNewSelectedIndex(index, false);
|
| - new_selected_index = IndexOfNextNonPhantomTab(new_selected_index,
|
| - index);
|
| - SelectTabContentsAt(new_selected_index, true);
|
| - }
|
| -
|
| - if (!HasNonPhantomTabs())
|
| - FOR_EACH_OBSERVER(TabStripModelObserver, observers_, TabStripEmpty());
|
| -}
|
| -
|
| -
|
| void TabStripModel::MoveTabContentsAtImpl(int index, int to_position,
|
| bool select_after_move) {
|
| TabContentsData* moved_data = contents_data_.at(index);
|
|
|