summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorandybons@chromium.org <andybons@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-02 17:29:43 +0000
committerandybons@chromium.org <andybons@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-02 17:29:43 +0000
commit8a34e660e7b6627b71a3b24e6800090f239075bb (patch)
treee76c3a12d82cd6e6d8dc467596316f0666fd1296
parent0b4158e6bc07aea93651c05c3bf26c2152bd9842 (diff)
downloadchromium_src-8a34e660e7b6627b71a3b24e6800090f239075bb.zip
chromium_src-8a34e660e7b6627b71a3b24e6800090f239075bb.tar.gz
chromium_src-8a34e660e7b6627b71a3b24e6800090f239075bb.tar.bz2
Rip out phantom tabs and corresponding unit tests.
Also get rid of the type enum passed to TabReplacedAt since it can only be one option after phantom tabs are removed. BUG=none TEST=compile? good. pass tests? good. Review URL: http://codereview.chromium.org/3539010 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@61303 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/browser.cc7
-rw-r--r--chrome/browser/browser_browsertest.cc79
-rw-r--r--chrome/browser/chromeos/tab_closeable_state_watcher.cc17
-rw-r--r--chrome/browser/cocoa/browser_window_controller.mm9
-rw-r--r--chrome/browser/cocoa/tab_controller.h2
-rw-r--r--chrome/browser/cocoa/tab_controller.mm1
-rw-r--r--chrome/browser/cocoa/tab_strip_controller.mm16
-rw-r--r--chrome/browser/cocoa/tab_view.mm5
-rw-r--r--chrome/browser/cocoa/tab_window_controller.h4
-rw-r--r--chrome/browser/defaults.cc2
-rw-r--r--chrome/browser/defaults.h3
-rw-r--r--chrome/browser/extensions/extension_browser_event_router.cc15
-rw-r--r--chrome/browser/extensions/extension_browser_event_router.h3
-rw-r--r--chrome/browser/extensions/extension_message_service.cc6
-rw-r--r--chrome/browser/extensions/extension_tabs_module.cc10
-rw-r--r--chrome/browser/extensions/extension_tabs_module_constants.cc1
-rw-r--r--chrome/browser/extensions/extension_tabs_module_constants.h1
-rw-r--r--chrome/browser/gtk/browser_window_gtk.cc2
-rw-r--r--chrome/browser/gtk/tabs/dragged_tab_controller_gtk.cc4
-rw-r--r--chrome/browser/gtk/tabs/dragged_tab_gtk.cc1
-rw-r--r--chrome/browser/gtk/tabs/tab_gtk.cc7
-rw-r--r--chrome/browser/gtk/tabs/tab_gtk.h7
-rw-r--r--chrome/browser/gtk/tabs/tab_renderer_gtk.cc9
-rw-r--r--chrome/browser/gtk/tabs/tab_renderer_gtk.h13
-rw-r--r--chrome/browser/gtk/tabs/tab_strip_gtk.cc6
-rw-r--r--chrome/browser/memory_details.cc5
-rw-r--r--chrome/browser/tab_contents/tab_contents.cc24
-rw-r--r--chrome/browser/tab_contents/tab_contents.h7
-rw-r--r--chrome/browser/tabs/default_tab_handler.cc4
-rw-r--r--chrome/browser/tabs/pinned_tab_codec.cc3
-rw-r--r--chrome/browser/tabs/tab_strip_model.cc166
-rw-r--r--chrome/browser/tabs/tab_strip_model.h59
-rw-r--r--chrome/browser/tabs/tab_strip_model_observer.cc7
-rw-r--r--chrome/browser/tabs/tab_strip_model_observer.h19
-rw-r--r--chrome/browser/tabs/tab_strip_model_order_controller.cc19
-rw-r--r--chrome/browser/tabs/tab_strip_model_order_controller.h14
-rw-r--r--chrome/browser/tabs/tab_strip_model_unittest.cc171
-rw-r--r--chrome/browser/views/frame/browser_view.cc9
-rw-r--r--chrome/browser/views/frame/browser_view.h3
-rw-r--r--chrome/browser/views/tabs/browser_tab_strip_controller.cc1
-rw-r--r--chrome/browser/views/tabs/dragged_tab_controller.cc4
-rw-r--r--chrome/browser/views/tabs/side_tab.cc18
-rw-r--r--chrome/browser/views/tabs/tab.cc16
-rw-r--r--chrome/browser/views/tabs/tab_renderer_data.h2
-rw-r--r--chrome/browser/views/tabs/tab_strip.cc58
-rw-r--r--chrome/browser/views/tabs/tab_strip.h3
46 files changed, 102 insertions, 740 deletions
diff --git a/chrome/browser/browser.cc b/chrome/browser/browser.cc
index 393d50a..b585865 100644
--- a/chrome/browser/browser.cc
+++ b/chrome/browser/browser.cc
@@ -2602,7 +2602,8 @@ void Browser::TabMoved(TabContents* contents,
}
void Browser::TabReplacedAt(TabContents* old_contents,
- TabContents* new_contents, int index) {
+ TabContents* new_contents,
+ int index) {
TabDetachedAtImpl(old_contents, index, DETACH_TYPE_REPLACE);
TabInsertedAt(new_contents, index,
(index == tab_handler_->GetTabStripModel()->selected_index()));
@@ -3261,9 +3262,7 @@ void Browser::CommitMatchPreview(TabContents* preview_contents) {
tab_contents->controller());
// TabStripModel takes ownership of preview_contents.
tab_handler_->GetTabStripModel()->ReplaceTabContentsAt(
- index,
- preview_contents,
- TabStripModelObserver::REPLACE_MATCH_PREVIEW);
+ index, preview_contents);
}
void Browser::SetSuggestedText(const string16& text) {
diff --git a/chrome/browser/browser_browsertest.cc b/chrome/browser/browser_browsertest.cc
index 1bd9a14..e63eb84 100644
--- a/chrome/browser/browser_browsertest.cc
+++ b/chrome/browser/browser_browsertest.cc
@@ -101,40 +101,6 @@ class MockTabStripModelObserver : public TabStripModelObserver {
} // namespace
class BrowserTest : public ExtensionBrowserTest {
- public:
- // Used by phantom tab tests. Creates two tabs, pins the first and makes it
- // a phantom tab (by closing it).
- void PhantomTabTest() {
- ASSERT_TRUE(test_server()->Start());
- host_resolver()->AddRule("www.example.com", "127.0.0.1");
- GURL url(test_server()->GetURL("empty.html"));
- TabStripModel* model = browser()->tabstrip_model();
-
- ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
-
- Extension* extension_app = GetExtension();
-
- ui_test_utils::NavigateToURL(browser(), url);
-
- TabContents* app_contents = new TabContents(browser()->profile(), NULL,
- MSG_ROUTING_NONE, NULL, NULL);
- app_contents->SetExtensionApp(extension_app);
-
- model->AddTabContents(app_contents, 0, 0, TabStripModel::ADD_NONE);
- model->SetTabPinned(0, true);
- ui_test_utils::NavigateToURL(browser(), url);
-
- // Close the first, which should make it a phantom.
- model->CloseTabContentsAt(0, TabStripModel::CLOSE_CREATE_HISTORICAL_TAB);
-
- // There should still be two tabs.
- ASSERT_EQ(2, browser()->tab_count());
- // The first tab should be a phantom.
- EXPECT_TRUE(model->IsPhantomTab(0));
- // And the tab contents of the first tab should have changed.
- EXPECT_TRUE(model->GetTabContentsAt(0) != app_contents);
- }
-
protected:
// In RTL locales wrap the page title with RTL embedding characters so that it
// matches the value returned by GetWindowTitle().
@@ -155,7 +121,7 @@ class BrowserTest : public ExtensionBrowserTest {
#endif
}
- // Returns the app extension installed by PhantomTabTest.
+ // Returns the app extension aptly named "App Test".
Extension* GetExtension() {
const ExtensionList* extensions =
browser()->profile()->GetExtensionsService()->extensions();
@@ -418,35 +384,6 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, FaviconChange) {
EXPECT_EQ(expected_favicon_url.spec(), entry->favicon().url().spec());
}
-// TODO(sky): get these to run on a Mac.
-#if !defined(OS_MACOSX)
-IN_PROC_BROWSER_TEST_F(BrowserTest, PhantomTab) {
- if (!browser_defaults::kPhantomTabsEnabled)
- return;
-
- PhantomTabTest();
-}
-
-IN_PROC_BROWSER_TEST_F(BrowserTest, RevivePhantomTab) {
- if (!browser_defaults::kPhantomTabsEnabled)
- return;
-
- PhantomTabTest();
-
- if (HasFatalFailure())
- return;
-
- TabStripModel* model = browser()->tabstrip_model();
-
- // Revive the phantom tab by selecting it.
- browser()->SelectTabContentsAt(0, true);
-
- // There should still be two tabs.
- ASSERT_EQ(2, browser()->tab_count());
- // The first tab should no longer be a phantom.
- EXPECT_FALSE(model->IsPhantomTab(0));
-}
-
// Makes sure TabClosing is sent when uninstalling an extension that is an app
// tab.
IN_PROC_BROWSER_TEST_F(BrowserTest, TabClosingWhenRemovingExtension) {
@@ -483,20 +420,6 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, TabClosingWhenRemovingExtension) {
ASSERT_EQ(1, browser()->tab_count());
}
-IN_PROC_BROWSER_TEST_F(BrowserTest, AppTabRemovedWhenExtensionUninstalled) {
- if (!browser_defaults::kPhantomTabsEnabled)
- return;
-
- PhantomTabTest();
-
- Extension* extension = GetExtension();
- UninstallExtension(extension->id());
-
- // The uninstall should have removed the tab.
- ASSERT_EQ(1, browser()->tab_count());
-}
-#endif // !defined(OS_MACOSX)
-
#if defined(OS_WIN)
// http://crbug.com/46198. On XP/Vista, the failure rate is 5 ~ 6%.
#define MAYBE_PageLanguageDetection FLAKY_PageLanguageDetection
diff --git a/chrome/browser/chromeos/tab_closeable_state_watcher.cc b/chrome/browser/chromeos/tab_closeable_state_watcher.cc
index 7b7f2cb..25bbf6e 100644
--- a/chrome/browser/chromeos/tab_closeable_state_watcher.cc
+++ b/chrome/browser/chromeos/tab_closeable_state_watcher.cc
@@ -43,13 +43,9 @@ void TabCloseableStateWatcher::TabStripWatcher::TabInsertedAt(
void TabCloseableStateWatcher::TabStripWatcher::TabClosingAt(
TabContents* tab_contents, int index) {
TabStripModel* tabstrip = browser_->tabstrip_model();
- if ((!browser_defaults::kPhantomTabsEnabled && tabstrip->count() == 1) ||
- (browser_defaults::kPhantomTabsEnabled &&
- tabstrip->GetNonPhantomTabCount() == 1 &&
- !tabstrip->IsTabPinned(index))) {
- // Closing last tab.
+ // Check if the last tab is closing.
+ if (tabstrip->count() == 1)
main_watcher_->OnTabStripChanged(browser_, true);
- }
}
void TabCloseableStateWatcher::TabStripWatcher::TabDetachedAt(
@@ -194,12 +190,9 @@ void TabCloseableStateWatcher::CheckAndUpdateState(
new_can_close = true;
} else {
TabStripModel* tabstrip_model = browser_to_check->tabstrip_model();
- // If NTP is the only non-phantom tab, it's not closeable.
- if (tabstrip_model->GetNonPhantomTabCount() == 1) {
- int first_non_phantom_tab = tabstrip_model->IndexOfFirstNonPhantomTab();
- new_can_close =
- tabstrip_model->GetTabContentsAt(first_non_phantom_tab)->GetURL() !=
- GURL(chrome::kChromeUINewTabURL); // Tab is not NewTabPage.
+ if (tabstrip_model->count() == 1) {
+ new_can_close = tabstrip_model->GetTabContentsAt(0)->GetURL() !=
+ GURL(chrome::kChromeUINewTabURL); // Tab is not NewTabPage.
} else {
new_can_close = true;
}
diff --git a/chrome/browser/cocoa/browser_window_controller.mm b/chrome/browser/cocoa/browser_window_controller.mm
index d33c0ca..ff95a04 100644
--- a/chrome/browser/cocoa/browser_window_controller.mm
+++ b/chrome/browser/cocoa/browser_window_controller.mm
@@ -407,8 +407,7 @@
// from this method.
- (void)windowWillClose:(NSNotification*)notification {
DCHECK_EQ([notification object], [self window]);
- DCHECK(!browser_->tabstrip_model()->HasNonPhantomTabs() ||
- !browser_->tabstrip_model()->count());
+ DCHECK(browser_->tabstrip_model()->empty());
[savedRegularWindow_ close];
// We delete statusBubble here because we need to kill off the dependency
// that its window has on our window before our window goes away.
@@ -458,7 +457,7 @@
// have to save the window position before we call orderOut:.
[self saveWindowPositionIfNeeded];
- if (browser_->tabstrip_model()->HasNonPhantomTabs()) {
+ if (!browser_->tabstrip_model()->empty()) {
// Tab strip isn't empty. Hide the frame (so it appears to have closed
// immediately) and close all the tabs, allowing the renderers to shut
// down. When the tab strip is empty we'll be called back again.
@@ -1321,12 +1320,12 @@
}
- (NSInteger)numberOfTabs {
- // count() includes pinned tabs (both live and phantom).
+ // count() includes pinned tabs.
return browser_->tabstrip_model()->count();
}
- (BOOL)hasLiveTabs {
- return browser_->tabstrip_model()->HasNonPhantomTabs();
+ return !browser_->tabstrip_model()->empty();
}
- (NSString*)selectedTabTitle {
diff --git a/chrome/browser/cocoa/tab_controller.h b/chrome/browser/cocoa/tab_controller.h
index 02190a7..5a032ba 100644
--- a/chrome/browser/cocoa/tab_controller.h
+++ b/chrome/browser/cocoa/tab_controller.h
@@ -48,7 +48,6 @@ class MenuDelegate;
BOOL app_;
BOOL mini_;
BOOL pinned_;
- BOOL phantom_;
BOOL selected_;
TabLoadingState loadingState_;
CGFloat iconTitleXOffset_; // between left edges of icon and title
@@ -65,7 +64,6 @@ class MenuDelegate;
@property(assign, nonatomic) SEL action;
@property(assign, nonatomic) BOOL app;
@property(assign, nonatomic) BOOL mini;
-@property(assign, nonatomic) BOOL phantom;
@property(assign, nonatomic) BOOL pinned;
@property(assign, nonatomic) BOOL selected;
@property(assign, nonatomic) id target;
diff --git a/chrome/browser/cocoa/tab_controller.mm b/chrome/browser/cocoa/tab_controller.mm
index 9e5403c..6c607ad 100644
--- a/chrome/browser/cocoa/tab_controller.mm
+++ b/chrome/browser/cocoa/tab_controller.mm
@@ -19,7 +19,6 @@
@synthesize app = app_;
@synthesize loadingState = loadingState_;
@synthesize mini = mini_;
-@synthesize phantom = phantom_;
@synthesize pinned = pinned_;
@synthesize target = target_;
diff --git a/chrome/browser/cocoa/tab_strip_controller.mm b/chrome/browser/cocoa/tab_strip_controller.mm
index e7fe84f..3c0e819 100644
--- a/chrome/browser/cocoa/tab_strip_controller.mm
+++ b/chrome/browser/cocoa/tab_strip_controller.mm
@@ -1036,10 +1036,6 @@ private:
[oldController willBecomeUnselectedTab];
oldContents->view()->StoreFocus();
oldContents->WasHidden();
- // If the selection changed because the tab was made phantom, update the
- // Cocoa side of the state.
- TabController* tabController = [tabArray_ objectAtIndex:oldIndex];
- [tabController setPhantom:tabStripModel_->IsPhantomTab(oldModelIndex)];
}
}
@@ -1218,15 +1214,8 @@ private:
// Take closing tabs into account.
NSInteger index = [self indexFromModelIndex:modelIndex];
-
TabController* tabController = [tabArray_ objectAtIndex:index];
- // Since the tab is loading, it cannot be phantom any more.
- if ([tabController phantom]) {
- [tabController setPhantom:NO];
- [[tabController view] setNeedsDisplay:YES];
- }
-
bool oldHasIcon = [tabController iconView] != nil;
bool newHasIcon = contents->ShouldDisplayFavIcon() ||
tabStripModel_->IsMiniTab(modelIndex); // Always show icon if mini.
@@ -1300,11 +1289,6 @@ private:
if (change != TabStripModelObserver::LOADING_ONLY)
[self setTabTitle:tabController withContents:contents];
- // See if the change was to/from phantom.
- bool isPhantom = tabStripModel_->IsPhantomTab(modelIndex);
- if (isPhantom != [tabController phantom])
- [tabController setPhantom:isPhantom];
-
[self updateFavIconForContents:contents atIndex:modelIndex];
TabContentsController* updatedController =
diff --git a/chrome/browser/cocoa/tab_view.mm b/chrome/browser/cocoa/tab_view.mm
index e2d7d49..c9674e7 100644
--- a/chrome/browser/cocoa/tab_view.mm
+++ b/chrome/browser/cocoa/tab_view.mm
@@ -619,11 +619,6 @@ const CGFloat kRapidCloseDist = 2.5;
}
- (void)drawRect:(NSRect)dirtyRect {
- // If this tab is phantom, do not draw the tab background itself. The only UI
- // element that will represent this tab is the favicon.
- if ([controller_ phantom])
- return;
-
NSGraphicsContext* context = [NSGraphicsContext currentContext];
[context saveGraphicsState];
diff --git a/chrome/browser/cocoa/tab_window_controller.h b/chrome/browser/cocoa/tab_window_controller.h
index ad0d5b7..b501548 100644
--- a/chrome/browser/cocoa/tab_window_controller.h
+++ b/chrome/browser/cocoa/tab_window_controller.h
@@ -130,8 +130,8 @@
- (NSInteger)numberOfTabs;
// YES if there are tabs in the tab strip which have content, allowing for
-// the notion of tabs in the tab strip that are placeholders, or phantoms, but
-// currently have no content.
+// the notion of tabs in the tab strip that are placeholders but currently have
+// no content.
- (BOOL)hasLiveTabs;
// Return the view of the selected tab.
diff --git a/chrome/browser/defaults.cc b/chrome/browser/defaults.cc
index f985c5f..48ad842 100644
--- a/chrome/browser/defaults.cc
+++ b/chrome/browser/defaults.cc
@@ -80,8 +80,6 @@ const bool kBrowserAliveWithNoWindows = true;
const bool kBrowserAliveWithNoWindows = false;
#endif
-const bool kPhantomTabsEnabled = false;
-
bool bookmarks_enabled = true;
} // namespace browser_defaults
diff --git a/chrome/browser/defaults.h b/chrome/browser/defaults.h
index cd635b0..6e64fe6 100644
--- a/chrome/browser/defaults.h
+++ b/chrome/browser/defaults.h
@@ -71,9 +71,6 @@ extern const bool kShowOtherBrowsersInAboutMemory;
// Should always open incognito windows when started with --incognito switch?
extern const bool kAlwaysOpenIncognitoWindow;
-// Are phantom tabs enabled?
-extern const bool kPhantomTabsEnabled;
-
//=============================================================================
// Runtime "const" - set only once after parsing command line option and should
// never be modified after that.
diff --git a/chrome/browser/extensions/extension_browser_event_router.cc b/chrome/browser/extensions/extension_browser_event_router.cc
index cae6bfd..ef10800 100644
--- a/chrome/browser/extensions/extension_browser_event_router.cc
+++ b/chrome/browser/extensions/extension_browser_event_router.cc
@@ -426,15 +426,12 @@ void ExtensionBrowserEventRouter::TabChangedAt(TabContents* contents,
void ExtensionBrowserEventRouter::TabReplacedAt(TabContents* old_contents,
TabContents* new_contents,
- int index,
- TabReplaceType type) {
- if (type == REPLACE_MATCH_PREVIEW) {
- // The ids of the two tabs should remain the same:
- DCHECK_EQ(old_contents->controller().session_id().id(),
- new_contents->controller().session_id().id());
- UnregisterForTabNotifications(old_contents);
- RegisterForTabNotifications(new_contents);
- }
+ int index) {
+ // The ids of the two tabs should remain the same:
+ DCHECK_EQ(old_contents->controller().session_id().id(),
+ new_contents->controller().session_id().id());
+ UnregisterForTabNotifications(old_contents);
+ RegisterForTabNotifications(new_contents);
}
void ExtensionBrowserEventRouter::TabStripEmpty() {}
diff --git a/chrome/browser/extensions/extension_browser_event_router.h b/chrome/browser/extensions/extension_browser_event_router.h
index 2c02a1c..c2c7ca3 100644
--- a/chrome/browser/extensions/extension_browser_event_router.h
+++ b/chrome/browser/extensions/extension_browser_event_router.h
@@ -71,8 +71,7 @@ class ExtensionBrowserEventRouter : public TabStripModelObserver,
TabChangeType change_type);
virtual void TabReplacedAt(TabContents* old_contents,
TabContents* new_contents,
- int index,
- TabReplaceType type);
+ int index);
virtual void TabStripEmpty();
// Page Action execute event.
diff --git a/chrome/browser/extensions/extension_message_service.cc b/chrome/browser/extensions/extension_message_service.cc
index 2fb59c3..40bfc32 100644
--- a/chrome/browser/extensions/extension_message_service.cc
+++ b/chrome/browser/extensions/extension_message_service.cc
@@ -247,8 +247,8 @@ void ExtensionMessageService::OpenChannelToTab(
}
if (contents && contents->controller().needs_reload()) {
- // The tab isn't loaded yet (it may be phantom). Don't attempt to connect.
- // Treat this as a disconnect.
+ // The tab isn't loaded yet. Don't attempt to connect. Treat this as a
+ // disconnect.
DispatchOnDisconnect(MessagePort(source, MSG_ROUTING_CONTROL),
GET_OPPOSITE_PORT_ID(receiver_port_id));
return;
@@ -336,7 +336,7 @@ int ExtensionMessageService::OpenSpecialChannelToTab(
DCHECK(target_tab_contents);
if (target_tab_contents->controller().needs_reload()) {
- // The tab isn't loaded yet (it may be phantom). Don't attempt to connect.
+ // The tab isn't loaded yet. Don't attempt to connect.
return -1;
}
diff --git a/chrome/browser/extensions/extension_tabs_module.cc b/chrome/browser/extensions/extension_tabs_module.cc
index 6cf9c42..016c3ec 100644
--- a/chrome/browser/extensions/extension_tabs_module.cc
+++ b/chrome/browser/extensions/extension_tabs_module.cc
@@ -800,13 +800,6 @@ bool RemoveTabFunction::RunImpl() {
&browser, NULL, &contents, NULL, &error_))
return false;
- int tab_index = browser->GetIndexOfController(&contents->controller());
- if (browser->tabstrip_model()->IsPhantomTab(tab_index)) {
- // Don't allow closing phantom tabs.
- error_ = keys::kCannotRemovePhantomTab;
- return false;
- }
-
// Close the tab in this convoluted way, since there's a chance that the tab
// is being dragged, or we're in some other nested event loop. This code path
// should ensure that the tab is safely closed under such circumstances,
@@ -1003,8 +996,7 @@ bool DetectTabLanguageFunction::RunImpl() {
}
if (contents->controller().needs_reload()) {
- // If the tab hasn't been loaded, such as happens with phantom tabs, don't
- // wait for the tab to load, instead return.
+ // If the tab hasn't been loaded, don't wait for the tab to load.
error_ = keys::kCannotDetermineLanguageOfUnloadedTab;
return false;
}
diff --git a/chrome/browser/extensions/extension_tabs_module_constants.cc b/chrome/browser/extensions/extension_tabs_module_constants.cc
index d1647f8..c7c515b 100644
--- a/chrome/browser/extensions/extension_tabs_module_constants.cc
+++ b/chrome/browser/extensions/extension_tabs_module_constants.cc
@@ -68,7 +68,6 @@ const char kMoreThanOneValuesError[] = "Code and file should not be specified "
"at the same time in the second argument.";
const char kLoadFileError[] = "Failed to load file: \"*\". ";
const char kCannotUpdatePinnedTab[] = "Cannot update pinned tabs";
-const char kCannotRemovePhantomTab[] = "Cannot remove phantom tabs";
const char kCannotDetermineLanguageOfUnloadedTab[] =
"Cannot determine language: tab not loaded";
diff --git a/chrome/browser/extensions/extension_tabs_module_constants.h b/chrome/browser/extensions/extension_tabs_module_constants.h
index 3f0ddc0..79bd9a4 100644
--- a/chrome/browser/extensions/extension_tabs_module_constants.h
+++ b/chrome/browser/extensions/extension_tabs_module_constants.h
@@ -69,7 +69,6 @@ extern const char kNoCodeOrFileToExecuteError[];
extern const char kMoreThanOneValuesError[];
extern const char kLoadFileError[];
extern const char kCannotUpdatePinnedTab[];
-extern const char kCannotRemovePhantomTab[];
extern const char kCannotDetermineLanguageOfUnloadedTab[];
}; // namespace extension_tabs_module_constants
diff --git a/chrome/browser/gtk/browser_window_gtk.cc b/chrome/browser/gtk/browser_window_gtk.cc
index e6062c1..58b1db5 100644
--- a/chrome/browser/gtk/browser_window_gtk.cc
+++ b/chrome/browser/gtk/browser_window_gtk.cc
@@ -1408,7 +1408,7 @@ bool BrowserWindowGtk::CanClose() const {
if (!browser_->ShouldCloseWindow())
return false;
- if (browser_->tabstrip_model()->HasNonPhantomTabs()) {
+ if (!browser_->tabstrip_model()->empty()) {
// Tab strip isn't empty. Hide the window (so it appears to have closed
// immediately) and close all the tabs, allowing the renderers to shut
// down. When the tab strip is empty we'll be called back again.
diff --git a/chrome/browser/gtk/tabs/dragged_tab_controller_gtk.cc b/chrome/browser/gtk/tabs/dragged_tab_controller_gtk.cc
index 551aeb8..5df0ea7 100644
--- a/chrome/browser/gtk/tabs/dragged_tab_controller_gtk.cc
+++ b/chrome/browser/gtk/tabs/dragged_tab_controller_gtk.cc
@@ -424,7 +424,7 @@ void DraggedTabControllerGtk::Detach() {
}
// If we've removed the last tab from the tabstrip, hide the frame now.
- if (!attached_model->HasNonPhantomTabs())
+ if (attached_model->empty())
HideWindow();
// Update the dragged tab. This NULL check is necessary apparently in some
@@ -736,7 +736,7 @@ void DraggedTabControllerGtk::ShowWindow() {
void DraggedTabControllerGtk::CleanUpHiddenFrame() {
// If the model we started dragging from is now empty, we must ask the
// delegate to close the frame.
- if (!source_tabstrip_->model()->HasNonPhantomTabs())
+ if (source_tabstrip_->model()->empty())
source_tabstrip_->model()->delegate()->CloseFrameAfterDragSession();
}
diff --git a/chrome/browser/gtk/tabs/dragged_tab_gtk.cc b/chrome/browser/gtk/tabs/dragged_tab_gtk.cc
index 27a1846..9929f10 100644
--- a/chrome/browser/gtk/tabs/dragged_tab_gtk.cc
+++ b/chrome/browser/gtk/tabs/dragged_tab_gtk.cc
@@ -55,7 +55,6 @@ DraggedTabGtk::DraggedTabGtk(TabContents* datasource,
contents_size_(contents_size),
close_animation_(this) {
renderer_->UpdateData(datasource,
- false, // phantom
datasource->is_app(),
false); // loading_only
renderer_->set_mini(mini);
diff --git a/chrome/browser/gtk/tabs/tab_gtk.cc b/chrome/browser/gtk/tabs/tab_gtk.cc
index 148e7ea..3d1eb07 100644
--- a/chrome/browser/gtk/tabs/tab_gtk.cc
+++ b/chrome/browser/gtk/tabs/tab_gtk.cc
@@ -315,11 +315,8 @@ void TabGtk::CloseButtonClicked() {
delegate_->CloseTab(this);
}
-void TabGtk::UpdateData(TabContents* contents,
- bool phantom,
- bool app,
- bool loading_only) {
- TabRendererGtk::UpdateData(contents, phantom, app, loading_only);
+void TabGtk::UpdateData(TabContents* contents, bool app, bool loading_only) {
+ TabRendererGtk::UpdateData(contents, app, loading_only);
// Cache the title width so we don't recalculate it every time the tab is
// resized.
title_width_ = GetTitleWidth(title_font(), GetTitle());
diff --git a/chrome/browser/gtk/tabs/tab_gtk.h b/chrome/browser/gtk/tabs/tab_gtk.h
index 64c5513..586e306 100644
--- a/chrome/browser/gtk/tabs/tab_gtk.h
+++ b/chrome/browser/gtk/tabs/tab_gtk.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -99,10 +99,7 @@ class TabGtk : public TabRendererGtk,
virtual bool IsVisible() const;
virtual void SetVisible(bool visible) const;
virtual void CloseButtonClicked();
- virtual void UpdateData(TabContents* contents,
- bool phantom,
- bool app,
- bool loading_only);
+ virtual void UpdateData(TabContents* contents, bool app, bool loading_only);
virtual void SetBounds(const gfx::Rect& bounds);
private:
diff --git a/chrome/browser/gtk/tabs/tab_renderer_gtk.cc b/chrome/browser/gtk/tabs/tab_renderer_gtk.cc
index 4dc40a7..51c71cc 100644
--- a/chrome/browser/gtk/tabs/tab_renderer_gtk.cc
+++ b/chrome/browser/gtk/tabs/tab_renderer_gtk.cc
@@ -275,7 +275,6 @@ TabRendererGtk::~TabRendererGtk() {
}
void TabRendererGtk::UpdateData(TabContents* contents,
- bool phantom,
bool app,
bool loading_only) {
DCHECK(contents);
@@ -292,7 +291,6 @@ void TabRendererGtk::UpdateData(TabContents* contents,
else
data_.favicon = contents->GetFavIcon();
- data_.phantom = phantom;
data_.app = app;
// This is kind of a hacky way to determine whether our icon is the default
// favicon. But the plumbing that would be necessary to do it right would
@@ -612,12 +610,7 @@ void TabRendererGtk::Paint(gfx::Canvas* canvas) {
show_close_button != showing_close_button_)
Layout();
- if (!phantom()) {
- // TODO: this isn't quite right. To match the Windows side we need to render
- // phantom tabs to a separate layer than alpha composite that. This will do
- // for now though.
- PaintTabBackground(canvas);
- }
+ PaintTabBackground(canvas);
if (!mini() || width() > kMiniTabRendererAsNormalTabWidth)
PaintTitle(canvas);
diff --git a/chrome/browser/gtk/tabs/tab_renderer_gtk.h b/chrome/browser/gtk/tabs/tab_renderer_gtk.h
index 092843d..f3a9763 100644
--- a/chrome/browser/gtk/tabs/tab_renderer_gtk.h
+++ b/chrome/browser/gtk/tabs/tab_renderer_gtk.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -105,10 +105,7 @@ class TabRendererGtk : public AnimationDelegate,
// TabContents. If only the loading state was updated, the loading_only flag
// should be specified. If other things change, set this flag to false to
// update everything.
- virtual void UpdateData(TabContents* contents,
- bool phantom,
- bool app,
- bool loading_only);
+ virtual void UpdateData(TabContents* contents, bool app, bool loading_only);
// Sets the blocked state of the tab.
void SetBlocked(bool pinned);
@@ -118,10 +115,6 @@ class TabRendererGtk : public AnimationDelegate,
void set_mini(bool mini) { data_.mini = mini; }
bool mini() const { return data_.mini; }
- // Sets the phantom state of the tab.
- void set_phantom(bool phantom) { data_.phantom = phantom; }
- bool phantom() const { return data_.phantom; }
-
// Sets the app state of the tab.
void set_app(bool app) { data_.app = app; }
bool app() const { return data_.app; }
@@ -264,7 +257,6 @@ class TabRendererGtk : public AnimationDelegate,
mini(false),
blocked(false),
animating_mini_change(false),
- phantom(false),
app(false) {
}
@@ -278,7 +270,6 @@ class TabRendererGtk : public AnimationDelegate,
bool mini;
bool blocked;
bool animating_mini_change;
- bool phantom;
bool app;
};
diff --git a/chrome/browser/gtk/tabs/tab_strip_gtk.cc b/chrome/browser/gtk/tabs/tab_strip_gtk.cc
index 88ef6a8..3d026b1 100644
--- a/chrome/browser/gtk/tabs/tab_strip_gtk.cc
+++ b/chrome/browser/gtk/tabs/tab_strip_gtk.cc
@@ -961,8 +961,7 @@ void TabStripGtk::TabInsertedAt(TabContents* contents,
if (!contains_tab) {
TabData d = { tab, gfx::Rect() };
tab_data_.insert(tab_data_.begin() + index, d);
- tab->UpdateData(contents, model_->IsPhantomTab(index),
- model_->IsAppTab(index), false);
+ tab->UpdateData(contents, model_->IsAppTab(index), false);
}
tab->set_mini(model_->IsMiniTab(index));
tab->set_app(model_->IsAppTab(index));
@@ -1023,8 +1022,6 @@ void TabStripGtk::TabMoved(TabContents* contents,
tab->set_mini(model_->IsMiniTab(to_index));
tab->SetBlocked(model_->IsTabBlocked(to_index));
tab_data_.insert(tab_data_.begin() + to_index, data);
- if (tab->phantom() != model_->IsPhantomTab(to_index))
- tab->set_phantom(!tab->phantom());
GenerateIdealBounds();
StartMoveTabAnimation(from_index, to_index);
}
@@ -1041,7 +1038,6 @@ void TabStripGtk::TabChangedAt(TabContents* contents, int index,
return;
}
tab->UpdateData(contents,
- model_->IsPhantomTab(index),
model_->IsAppTab(index),
change_type == LOADING_ONLY);
tab->UpdateFromModel();
diff --git a/chrome/browser/memory_details.cc b/chrome/browser/memory_details.cc
index fa89c30..db257e0 100644
--- a/chrome/browser/memory_details.cc
+++ b/chrome/browser/memory_details.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -94,8 +94,7 @@ void MemoryDetails::CollectChildInfoOnUIThread() {
RenderProcessHost::AllHostsIterator()); !renderer_iter.IsAtEnd();
renderer_iter.Advance()) {
DCHECK(renderer_iter.GetCurrentValue());
- // Ignore processes that don't have a connection, such as crashed tabs or
- // phantom tabs.
+ // Ignore processes that don't have a connection, such as crashed tabs.
if (!renderer_iter.GetCurrentValue()->HasConnection() || process.pid !=
base::GetProcId(renderer_iter.GetCurrentValue()->GetHandle())) {
continue;
diff --git a/chrome/browser/tab_contents/tab_contents.cc b/chrome/browser/tab_contents/tab_contents.cc
index 731de0e..d37fdcc 100644
--- a/chrome/browser/tab_contents/tab_contents.cc
+++ b/chrome/browser/tab_contents/tab_contents.cc
@@ -1447,30 +1447,6 @@ bool TabContents::ShouldAcceptDragAndDrop() const {
#endif
}
-TabContents* TabContents::CloneAndMakePhantom() {
- TabNavigation tab_nav;
-
- NavigationEntry* entry = controller().GetActiveEntry();
- if (extension_app_)
- tab_nav.set_virtual_url(extension_app_->GetFullLaunchURL());
- else if (entry)
- tab_nav.SetFromNavigationEntry(*entry);
-
- std::vector<TabNavigation> navigations;
- navigations.push_back(tab_nav);
-
- TabContents* new_contents =
- new TabContents(profile(), NULL, MSG_ROUTING_NONE, NULL,
- controller_.session_storage_namespace()->Clone());
- new_contents->SetExtensionApp(extension_app_);
- new_contents->controller().RestoreFromState(navigations, 0, false);
-
- if (!extension_app_ && entry)
- new_contents->controller().GetActiveEntry()->favicon() = entry->favicon();
-
- return new_contents;
-}
-
void TabContents::UpdateHistoryForNavigation(
scoped_refptr<history::HistoryAddPageArgs> add_page_args) {
if (profile()->IsOffTheRecord())
diff --git a/chrome/browser/tab_contents/tab_contents.h b/chrome/browser/tab_contents/tab_contents.h
index be8ac99..bf0a890 100644
--- a/chrome/browser/tab_contents/tab_contents.h
+++ b/chrome/browser/tab_contents/tab_contents.h
@@ -654,13 +654,6 @@ class TabContents : public PageNavigator,
// Returns true if underlying TabContentsView should accept drag-n-drop.
bool ShouldAcceptDragAndDrop() const;
- // Creates a duplicate of this TabContents. The returned TabContents is
- // configured such that the renderer has not been loaded (it'll load the first
- // time it is selected).
- // This is intended for use with apps.
- // The caller owns the returned object.
- TabContents* CloneAndMakePhantom();
-
// Indicates if this tab was explicitly closed by the user (control-w, close
// tab menu item...). This is false for actions that indirectly close the tab,
// such as closing the window. The setter is maintained by TabStripModel, and
diff --git a/chrome/browser/tabs/default_tab_handler.cc b/chrome/browser/tabs/default_tab_handler.cc
index 5149173..dc3598b 100644
--- a/chrome/browser/tabs/default_tab_handler.cc
+++ b/chrome/browser/tabs/default_tab_handler.cc
@@ -18,8 +18,8 @@ DefaultTabHandler::DefaultTabHandler(TabHandlerDelegate* delegate)
}
DefaultTabHandler::~DefaultTabHandler() {
- // The tab strip should not have any significant tabs at this point.
- DCHECK(!model_->HasNonPhantomTabs());
+ // The tab strip should not have any tabs at this point.
+ DCHECK(model_->empty());
model_->RemoveObserver(this);
}
diff --git a/chrome/browser/tabs/pinned_tab_codec.cc b/chrome/browser/tabs/pinned_tab_codec.cc
index 6920bfa..7b9e0b3 100644
--- a/chrome/browser/tabs/pinned_tab_codec.cc
+++ b/chrome/browser/tabs/pinned_tab_codec.cc
@@ -46,10 +46,9 @@ static void EncodePinnedTab(TabStripModel* model,
Extension* extension = tab_contents->extension_app();
DCHECK(extension);
value->SetString(kAppID, extension->id());
- // For apps we use the launch url. We do this for two reasons:
+ // For apps we use the launch url. We do this for the following reason:
// . the user is effectively restarting the app, so that returning them to
// the app's launch page seems closest to what they expect.
- // . we do the same when restoring a phantom tab.
value->SetString(kURL, extension->GetFullLaunchURL().spec());
values->Append(value.release());
} else {
diff --git a/chrome/browser/tabs/tab_strip_model.cc b/chrome/browser/tabs/tab_strip_model.cc
index f27b5a8..1f7a668 100644
--- a/chrome/browser/tabs/tab_strip_model.cc
+++ b/chrome/browser/tabs/tab_strip_model.cc
@@ -75,17 +75,6 @@ TabStripModel::TabStripModel(TabStripModelDelegate* delegate, Profile* profile)
TabStripModel::~TabStripModel() {
FOR_EACH_OBSERVER(TabStripModelObserver, observers_,
TabStripModelDeleted());
-
- // Before deleting any phantom tabs remove our notification observers so that
- // we don't attempt to notify our delegate or do any processing.
- registrar_.RemoveAll();
-
- // Phantom tabs still have valid TabConents that we own and need to delete.
- for (int i = count() - 1; i >= 0; --i) {
- if (IsPhantomTab(i))
- delete contents_data_[i]->contents;
- }
-
STLDeleteContainerPointers(contents_data_.begin(), contents_data_.end());
delete order_controller_;
}
@@ -98,14 +87,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);
}
@@ -181,12 +162,9 @@ void TabStripModel::InsertTabContentsAt(int index,
ChangeSelectedContentsFrom(selected_contents, index, false);
}
-void TabStripModel::ReplaceTabContentsAt(
- int index,
- TabContents* new_contents,
- TabStripModelObserver::TabReplaceType type) {
+void TabStripModel::ReplaceTabContentsAt(int index, TabContents* new_contents) {
scoped_ptr<TabContents> old_contents(
- ReplaceTabContentsAtImpl(index, new_contents, type));
+ ReplaceTabContentsAtImpl(index, new_contents));
// When the selected tab contents is replaced send out selected notification
// too. We do this as nearly all observers need to treat a replace of the
@@ -218,20 +196,17 @@ TabContents* TabStripModel::DetachTabContentsAt(int index) {
DCHECK(ContainsIndex(index));
TabContents* removed_contents = GetContentsAt(index);
- int next_selected_index =
- order_controller_->DetermineNewSelectedIndex(index, true);
+ int next_selected_index = 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())
+ if (empty())
closing_all_ = true;
FOR_EACH_OBSERVER(TabStripModelObserver, observers_,
TabDetachedAt(removed_contents, index));
- if (!HasNonPhantomTabs()) {
+ if (empty()) {
// TabDetachedAt() might unregister observers, so send |TabStripEmtpy()| in
// a second pass.
- FOR_EACH_OBSERVER(TabStripModelObserver, observers_,
- TabStripEmpty());
+ FOR_EACH_OBSERVER(TabStripModelObserver, observers_, TabStripEmpty());
} else {
if (index == selected_index_) {
ChangeSelectedContentsFrom(removed_contents, next_selected_index, false);
@@ -343,17 +318,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;
}
@@ -365,7 +336,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;
@@ -384,10 +355,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;
}
@@ -497,11 +466,6 @@ bool TabStripModel::IsAppTab(int index) const {
return contents && contents->is_app();
}
-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;
}
@@ -520,23 +484,6 @@ int TabStripModel::ConstrainInsertionIndex(int index, bool mini_tab) {
std::min(count(), std::max(index, IndexOfFirstNonMiniTab()));
}
-int TabStripModel::IndexOfFirstNonPhantomTab() const {
- for (int i = 0; i < count(); ++i) {
- if (!IsPhantomTab(i))
- return i;
- }
- return kNoTab;
-}
-
-int TabStripModel::GetNonPhantomTabCount() const {
- int tabs = 0;
- for (int i = 0; i < count(); ++i) {
- if (!IsPhantomTab(i))
- ++tabs;
- }
- return tabs;
-}
-
void TabStripModel::AddTabContents(TabContents* contents,
int index,
PageTransition::Type transition,
@@ -734,15 +681,8 @@ void TabStripModel::ExecuteContextMenuCommand(
UserMetrics::RecordAction(
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;
}
@@ -803,13 +743,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;
}
@@ -960,79 +894,12 @@ 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));
+ index = (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 (browser_defaults::kPhantomTabsEnabled && 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;
-}
-
-void TabStripModel::MakePhantom(int index) {
- // MakePhantom is called when the TabContents is being destroyed so we don't
- // need to do anything with the returned value from ReplaceTabContentsAtImpl.
- ReplaceTabContentsAtImpl(index, GetContentsAt(index)->CloneAndMakePhantom(),
- TabStripModelObserver::REPLACE_MADE_PHANTOM);
-
- 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);
@@ -1061,8 +928,7 @@ bool TabStripModel::OpenerMatches(const TabContentsData* data,
TabContents* TabStripModel::ReplaceTabContentsAtImpl(
int index,
- TabContents* new_contents,
- TabStripModelObserver::TabReplaceType type) {
+ TabContents* new_contents) {
// TODO: this should reset group/opener of any tabs that point at
// old_contents.
DCHECK(ContainsIndex(index));
@@ -1072,6 +938,6 @@ TabContents* TabStripModel::ReplaceTabContentsAtImpl(
contents_data_[index]->contents = new_contents;
FOR_EACH_OBSERVER(TabStripModelObserver, observers_,
- TabReplacedAt(old_contents, new_contents, index, type));
+ TabReplacedAt(old_contents, new_contents, index));
return old_contents;
}
diff --git a/chrome/browser/tabs/tab_strip_model.h b/chrome/browser/tabs/tab_strip_model.h
index 003f3d6..5b58afc 100644
--- a/chrome/browser/tabs/tab_strip_model.h
+++ b/chrome/browser/tabs/tab_strip_model.h
@@ -41,18 +41,8 @@ class TabStripModelOrderController;
// . App. Corresponds to an extension that wants an app tab. App tabs are
// identified by TabContents::is_app(). App tabs are always pinneded (you
// can't unpin them).
-// . Pinned. Any tab can be pinned. A pinned tab is made phantom when closed.
-// Non-app tabs whose pinned state is changed are moved to be with other
-// mini-tabs or non-mini tabs.
-// . Phantom. Only pinned tabs may be made phantom. When a tab that can be made
-// phantom is closed the renderer is shutdown, a new
-// TabContents/NavigationController is created that has not yet loaded the
-// renderer and observers are notified via the TabReplacedAt method. When a
-// phantom tab is selected the renderer is loaded and the tab is no longer
-// phantom.
-// Phantom tabs do not prevent the tabstrip from closing, for example if the
-// tabstrip has one phantom and one non-phantom tab and the non-phantom tab is
-// closed, then the tabstrip/browser are closed.
+// . Pinned. Any tab can be pinned. Non-app tabs whose pinned state is changed
+// are moved to be with other mini-tabs or non-mini tabs.
//
// A TabStripModel has one delegate that it relies on to perform certain tasks
// like creating new TabStripModels (probably hosted in Browser windows) when
@@ -137,11 +127,6 @@ class TabStripModel : public NotificationObserver {
int count() const { return static_cast<int>(contents_data_.size()); }
bool empty() const { return contents_data_.empty(); }
- // Returns true if there are any non-phantom tabs. When there are no
- // non-phantom tabs the delegate is notified by way of TabStripEmpty and the
- // browser closes.
- bool HasNonPhantomTabs() const;
-
// Retrieve the Profile associated with this TabStripModel.
Profile* profile() const { return profile_; }
@@ -208,11 +193,9 @@ class TabStripModel : public NotificationObserver {
void ReplaceNavigationControllerAt(int index,
NavigationController* controller);
- // Replaces the tab contents at |index| with |new_contents|. |type| is passed
- // to the observer. This deletes the TabContents currently at |index|.
- void ReplaceTabContentsAt(int index,
- TabContents* new_contents,
- TabStripModelObserver::TabReplaceType type);
+ // Replaces the tab contents at |index| with |new_contents|. This deletes the
+ // TabContents currently at |index|.
+ void ReplaceTabContentsAt(int index, TabContents* new_contents);
// Detaches the TabContents at the specified index from this strip. The
// TabContents is not destroyed, just removed from display. The caller is
@@ -277,20 +260,17 @@ class TabStripModel : public NotificationObserver {
// If |use_group| is true, the group property of the tab is used instead of
// the opener to find the next tab. Under some circumstances the group
// relationship may exist but the opener may not.
- // NOTE: this skips phantom tabs.
int GetIndexOfNextTabContentsOpenedBy(const NavigationController* opener,
int start_index,
bool use_group) const;
// Returns the index of the first TabContents in the model opened by the
// specified opener.
- // NOTE: this skips phantom tabs.
int GetIndexOfFirstTabContentsOpenedBy(const NavigationController* opener,
int start_index) const;
// Returns the index of the last TabContents in the model opened by the
// specified opener, starting at |start_index|.
- // NOTE: this skips phantom tabs.
int GetIndexOfLastTabContentsOpenedBy(const NavigationController* opener,
int start_index) const;
@@ -337,11 +317,6 @@ class TabStripModel : public NotificationObserver {
// See description above class for details on app tabs.
bool IsAppTab(int index) const;
- // Returns true if the tab is a phantom tab. A phantom tab is one where the
- // renderer has not been loaded.
- // See description above class for details on phantom tabs.
- bool IsPhantomTab(int index) const;
-
// Returns true if the tab at |index| is blocked by a tab modal dialog.
bool IsTabBlocked(int index) const;
@@ -357,14 +332,6 @@ class TabStripModel : public NotificationObserver {
// is between IndexOfFirstNonMiniTab and count().
int ConstrainInsertionIndex(int index, bool mini_tab);
- // Returns the index of the first tab that is not a phantom tab. This returns
- // kNoTab if all of the tabs are phantom tabs.
- int IndexOfFirstNonPhantomTab() const;
-
- // Returns the number of non phantom tabs in the TabStripModel.
- int GetNonPhantomTabCount() const;
-
-
// Command level API /////////////////////////////////////////////////////////
// Adds a TabContents at the best position in the TabStripModel given the
@@ -481,17 +448,6 @@ class TabStripModel : public NotificationObserver {
// (|forward| is false).
void SelectRelativeTab(bool forward);
- // Returns the first non-phantom tab starting at |index|, skipping the tab at
- // |ignore_index|.
- int IndexOfNextNonPhantomTab(int index, int ignore_index);
-
- // Returns true if the tab at the specified index should be made phantom when
- // the tab is closing.
- bool ShouldMakePhantomOnClose(int index);
-
- // Makes the tab a phantom tab.
- void MakePhantom(int index);
-
// Does the work of MoveTabContentsAt. This has no checks to make sure the
// position is valid, those are done in MoveTabContentsAt.
void MoveTabContentsAtImpl(int index,
@@ -508,10 +464,7 @@ class TabStripModel : public NotificationObserver {
// Does the work for ReplaceTabContentsAt returning the old TabContents.
// The caller owns the returned TabContents.
- TabContents* ReplaceTabContentsAtImpl(
- int index,
- TabContents* new_contents,
- TabStripModelObserver::TabReplaceType type);
+ TabContents* ReplaceTabContentsAtImpl(int index, TabContents* new_contents);
// Our delegate.
TabStripModelDelegate* delegate_;
diff --git a/chrome/browser/tabs/tab_strip_model_observer.cc b/chrome/browser/tabs/tab_strip_model_observer.cc
index c3bfb9b..fa2fe8b 100644
--- a/chrome/browser/tabs/tab_strip_model_observer.cc
+++ b/chrome/browser/tabs/tab_strip_model_observer.cc
@@ -38,13 +38,6 @@ void TabStripModelObserver::TabReplacedAt(TabContents* old_contents,
int index) {
}
-void TabStripModelObserver::TabReplacedAt(TabContents* old_contents,
- TabContents* new_contents,
- int index,
- TabReplaceType type) {
- TabReplacedAt(old_contents, new_contents, index);
-}
-
void TabStripModelObserver::TabPinnedStateChanged(TabContents* contents,
int index) {
}
diff --git a/chrome/browser/tabs/tab_strip_model_observer.h b/chrome/browser/tabs/tab_strip_model_observer.h
index cfbf9e8..931497b 100644
--- a/chrome/browser/tabs/tab_strip_model_observer.h
+++ b/chrome/browser/tabs/tab_strip_model_observer.h
@@ -37,17 +37,6 @@ class TabStripModelObserver {
ALL
};
- // Enum used by ReplaceTabContentsAt.
- // TODO(sky): nuke this, pinned is being removed so there is no point in the
- // enum.
- enum TabReplaceType {
- // The replace is the result of the tab being made phantom.
- REPLACE_MADE_PHANTOM,
-
- // The replace is the result of the match preview being committed.
- REPLACE_MATCH_PREVIEW
- };
-
// A new TabContents was inserted into the TabStripModel at the specified
// index. |foreground| is whether or not it was opened in the foreground
// (selected).
@@ -100,14 +89,6 @@ class TabStripModelObserver {
TabContents* new_contents,
int index);
- // The tab contents was replaced at the specified index. |type| describes
- // the type of replace.
- // This invokes TabReplacedAt with three args.
- virtual void TabReplacedAt(TabContents* old_contents,
- TabContents* new_contents,
- int index,
- TabReplaceType type);
-
// Invoked when the pinned state of a tab changes. This is not invoked if the
// tab ends up moving as a result of the mini state changing.
// See note in TabMiniStateChanged as to how this relates to
diff --git a/chrome/browser/tabs/tab_strip_model_order_controller.cc b/chrome/browser/tabs/tab_strip_model_order_controller.cc
index a967bd9..aa66920 100644
--- a/chrome/browser/tabs/tab_strip_model_order_controller.cc
+++ b/chrome/browser/tabs/tab_strip_model_order_controller.cc
@@ -64,8 +64,7 @@ int TabStripModelOrderController::DetermineInsertionIndexForAppending() {
}
int TabStripModelOrderController::DetermineNewSelectedIndex(
- int removing_index,
- bool is_remove) const {
+ int removing_index) const {
int tab_count = tabstrip_->count();
DCHECK(removing_index >= 0 && removing_index < tab_count);
NavigationController* parent_opener =
@@ -79,7 +78,7 @@ int TabStripModelOrderController::DetermineNewSelectedIndex(
removing_index,
false);
if (index != TabStripModel::kNoTab)
- return GetValidIndex(index, removing_index, is_remove);
+ return GetValidIndex(index, removing_index);
if (parent_opener) {
// If the tab was in a group, shift selection to the next tab in the group.
@@ -87,20 +86,21 @@ int TabStripModelOrderController::DetermineNewSelectedIndex(
removing_index,
false);
if (index != TabStripModel::kNoTab)
- return GetValidIndex(index, removing_index, is_remove);
+ return GetValidIndex(index, removing_index);
// If we can't find a subsequent group member, just fall back to the
// parent_opener itself. Note that we use "group" here since opener is
// reset by select operations..
index = tabstrip_->GetIndexOfController(parent_opener);
if (index != TabStripModel::kNoTab)
- return GetValidIndex(index, removing_index, is_remove);
+ return GetValidIndex(index, removing_index);
}
// No opener set, fall through to the default handler...
int selected_index = tabstrip_->selected_index();
- if (is_remove && selected_index >= (tab_count - 1))
+ if (selected_index >= (tab_count - 1))
return selected_index - 1;
+
return selected_index;
}
@@ -132,10 +132,9 @@ void TabStripModelOrderController::TabSelectedAt(TabContents* old_contents,
///////////////////////////////////////////////////////////////////////////////
// TabStripModelOrderController, private:
-int TabStripModelOrderController::GetValidIndex(int index,
- int removing_index,
- bool is_remove) const {
- if (is_remove && removing_index < index)
+int TabStripModelOrderController::GetValidIndex(
+ int index, int removing_index) const {
+ if (removing_index < index)
index = std::max(0, index - 1);
return index;
}
diff --git a/chrome/browser/tabs/tab_strip_model_order_controller.h b/chrome/browser/tabs/tab_strip_model_order_controller.h
index b7b579c..f2c466f 100644
--- a/chrome/browser/tabs/tab_strip_model_order_controller.h
+++ b/chrome/browser/tabs/tab_strip_model_order_controller.h
@@ -39,11 +39,8 @@ class TabStripModelOrderController : public TabStripModelObserver {
// Returns the index to append tabs at.
int DetermineInsertionIndexForAppending();
- // Determine where to shift selection after a tab is closed is made phantom.
- // If |is_remove| is false, the tab is not being removed but rather made
- // phantom (see description of phantom tabs in TabStripModel).
- int DetermineNewSelectedIndex(int removed_index,
- bool is_remove) const;
+ // Determine where to shift selection after a tab is closed.
+ int DetermineNewSelectedIndex(int removed_index) const;
// Overridden from TabStripModelObserver:
virtual void TabSelectedAt(TabContents* old_contents,
@@ -53,10 +50,9 @@ class TabStripModelOrderController : public TabStripModelObserver {
private:
// Returns a valid index to be selected after the tab at |removing_index| is
- // closed. If |index| is after |removing_index| and |is_remove| is true,
- // |index| is adjusted to reflect the fact that |removing_index| is going
- // away. This also skips any phantom tabs.
- int GetValidIndex(int index, int removing_index, bool is_remove) const;
+ // closed. If |index| is after |removing_index|, |index| is adjusted to
+ // reflect the fact that |removing_index| is going away.
+ int GetValidIndex(int index, int removing_index) const;
TabStripModel* tabstrip_;
diff --git a/chrome/browser/tabs/tab_strip_model_unittest.cc b/chrome/browser/tabs/tab_strip_model_unittest.cc
index 9fabf5b..6eee910 100644
--- a/chrome/browser/tabs/tab_strip_model_unittest.cc
+++ b/chrome/browser/tabs/tab_strip_model_unittest.cc
@@ -163,9 +163,6 @@ class TabStripModelTest : public RenderViewHostTestHarness {
if (model.IsTabPinned(i))
actual += "p";
-
- if (model.IsPhantomTab(i))
- actual += "h";
}
return actual;
}
@@ -818,7 +815,6 @@ TEST_F(TabStripModelTest, TestSelectOnClose) {
EXPECT_EQ(1, tabstrip.selected_index());
tabstrip.CloseTabContentsAt(1, TabStripModel::CLOSE_NONE);
EXPECT_EQ(0, tabstrip.selected_index());
-
// Finally test that when a tab has no "siblings" that the opener is
// selected.
TabContents* other_contents = CreateTabContents();
@@ -1780,167 +1776,6 @@ TEST_F(TabStripModelTest, Pinning) {
tabstrip.CloseAllTabs();
}
-// Tests various permutations of making a tab phantom.
-TEST_F(TabStripModelTest, Phantom) {
- if (!browser_defaults::kPhantomTabsEnabled)
- return;
-
- TabStripDummyDelegate delegate(NULL);
- TabStripModel tabstrip(&delegate, profile());
- MockTabStripModelObserver observer;
- tabstrip.AddObserver(&observer);
-
- EXPECT_TRUE(tabstrip.empty());
-
- typedef MockTabStripModelObserver::State State;
-
- TabContents* contents1 = CreateTabContents();
- TabContents* contents2 = CreateTabContents();
- TabContents* contents3 = CreateTabContents();
-
- SetID(contents1, 1);
- SetID(contents2, 2);
- SetID(contents3, 3);
-
- // Note! The ordering of these tests is important, each subsequent test
- // builds on the state established in the previous. This is important if you
- // ever insert tests rather than append.
-
- // Initial state, three tabs, first selected.
- tabstrip.AppendTabContents(contents1, true);
- tabstrip.AppendTabContents(contents2, false);
- tabstrip.AppendTabContents(contents3, false);
-
- observer.ClearStates();
-
- // Pin the first tab, and make it phantom.
- {
- tabstrip.SetTabPinned(0, true);
-
- observer.ClearStates();
-
- tabstrip.CloseTabContentsAt(0, TabStripModel::CLOSE_NONE);
-
- // The tabcontents should have changed.
- TabContents* old_contents1 = contents1;
- TabContents* new_contents1 = tabstrip.GetTabContentsAt(0);
- ASSERT_TRUE(new_contents1 != contents1);
- contents1 = new_contents1;
- SetID(contents1, 1);
-
- // Verify the state.
- EXPECT_EQ("1ph 2 3", GetPinnedState(tabstrip));
-
- // We should have gotten notification of the following:
- // . tab closing.
- // . selection changed.
- // . tab replaced.
- ASSERT_EQ(3, observer.GetStateCount());
- State state(old_contents1, 0, MockTabStripModelObserver::CLOSE);
- EXPECT_TRUE(observer.StateEquals(0, state));
- state = State(contents1, 0, MockTabStripModelObserver::REPLACED);
- state.src_contents = old_contents1;
- EXPECT_TRUE(observer.StateEquals(1, state));
- state = State(contents2, 1, MockTabStripModelObserver::SELECT);
- state.src_contents = contents1;
- state.user_gesture = true;
- EXPECT_TRUE(observer.StateEquals(2, state));
-
- observer.ClearStates();
- }
-
- {
- tabstrip.SetTabPinned(1, true);
- observer.ClearStates();
-
- // Close the second tab, which should make it phantom.
- tabstrip.CloseTabContentsAt(1, TabStripModel::CLOSE_NONE);
-
- // The tabcontents should have changed.
- TabContents* new_contents2 = tabstrip.GetTabContentsAt(1);
- ASSERT_TRUE(new_contents2 != contents2);
- contents2 = new_contents2;
- SetID(contents2, 2);
-
- EXPECT_EQ("1ph 2ph 3", GetPinnedState(tabstrip));
-
- EXPECT_EQ(2, tabstrip.selected_index());
-
- contents2 = tabstrip.GetTabContentsAt(1);
-
- observer.ClearStates();
- }
-
- {
- tabstrip.SetTabPinned(2, true);
- observer.ClearStates();
-
- // Close the last tab, we should get a tabstrip empty notification.
- tabstrip.CloseTabContentsAt(2, TabStripModel::CLOSE_NONE);
-
- // The tabcontents should have changed.
- TabContents* old_contents3 = contents3;
- TabContents* new_contents3 = tabstrip.GetTabContentsAt(2);
- ASSERT_TRUE(new_contents3 != contents3);
- contents3 = new_contents3;
- SetID(contents3, 3);
-
- EXPECT_EQ("1ph 2ph 3ph", GetPinnedState(tabstrip));
-
- // We should have gotten notification of the following:
- // . tab closing.
- // . tab replaced.
- // . tabstrip empty.
- ASSERT_EQ(2, observer.GetStateCount());
- State state(old_contents3, 2, MockTabStripModelObserver::CLOSE);
- EXPECT_TRUE(observer.StateEquals(0, state));
- state = State(contents3, 2, MockTabStripModelObserver::REPLACED);
- state.src_contents = old_contents3;
- EXPECT_TRUE(observer.StateEquals(1, state));
- EXPECT_TRUE(observer.empty());
-
- observer.ClearStates();
- }
-
- // Clean up the phantom tabs.
- tabstrip.CloseAllTabs();
-}
-
-// Makes sure the TabStripModel deletes phantom TabContents from its destructor.
-TEST_F(TabStripModelTest, DeletePhantomTabContents) {
- if (!browser_defaults::kPhantomTabsEnabled)
- return;
-
- TabStripDummyDelegate delegate(NULL);
- scoped_ptr<TabStripModel> strip(new TabStripModel(&delegate, profile()));
-
- strip->AddTabContents(CreateTabContents(), -1, PageTransition::TYPED,
- TabStripModel::ADD_PINNED);
-
- // This will make the tab go phantom.
- delete strip->GetTabContentsAt(0);
-
- ASSERT_TRUE(strip->IsPhantomTab(0));
-
- NotificationRegistrar registrar;
- NotificationObserverMock notification_observer;
- MockTabStripModelObserver tabstrip_observer;
- registrar.Add(&notification_observer,
- NotificationType::TAB_CONTENTS_DESTROYED,
- NotificationService::AllSources());
- strip->AddObserver(&tabstrip_observer);
-
- // Deleting the strip should delete the phanton tabcontents and result in one
- // TAB_CONTENTS_DESTROYED.
- EXPECT_CALL(notification_observer, Observe(_, _, _)).Times(1);
-
- // Delete the tabstrip.
- strip.reset();
-
- // And there should have been no methods sent to the TabStripModelObserver.
- EXPECT_EQ(0, tabstrip_observer.GetStateCount());
-}
-
// Makes sure the TabStripModel calls the right observer methods during a
// replace.
TEST_F(TabStripModelTest, ReplaceSendsSelected) {
@@ -1957,8 +1792,7 @@ TEST_F(TabStripModelTest, ReplaceSendsSelected) {
strip.AddObserver(&tabstrip_observer);
TabContents* new_contents = CreateTabContents();
- strip.ReplaceTabContentsAt(0, new_contents,
- TabStripModelObserver::REPLACE_MATCH_PREVIEW);
+ strip.ReplaceTabContentsAt(0, new_contents);
ASSERT_EQ(2, tabstrip_observer.GetStateCount());
@@ -1982,8 +1816,7 @@ TEST_F(TabStripModelTest, ReplaceSendsSelected) {
// And replace it.
new_contents = CreateTabContents();
- strip.ReplaceTabContentsAt(1, new_contents,
- TabStripModelObserver::REPLACE_MATCH_PREVIEW);
+ strip.ReplaceTabContentsAt(1, new_contents);
ASSERT_EQ(1, tabstrip_observer.GetStateCount());
diff --git a/chrome/browser/views/frame/browser_view.cc b/chrome/browser/views/frame/browser_view.cc
index 0b668bf..a25aae0 100644
--- a/chrome/browser/views/frame/browser_view.cc
+++ b/chrome/browser/views/frame/browser_view.cc
@@ -1468,12 +1468,9 @@ void BrowserView::TabSelectedAt(TabContents* old_contents,
void BrowserView::TabReplacedAt(TabContents* old_contents,
TabContents* new_contents,
- int index,
- TabStripModelObserver::TabReplaceType type) {
- if (type != TabStripModelObserver::REPLACE_MATCH_PREVIEW ||
- index != browser_->tabstrip_model()->selected_index()) {
+ int index) {
+ if (index != browser_->tabstrip_model()->selected_index())
return;
- }
// Swap the 'active' and 'preview' and delete what was the active.
contents_->MakePreviewContentsActiveContents();
@@ -1690,7 +1687,7 @@ bool BrowserView::CanClose() const {
if (!browser_->ShouldCloseWindow())
return false;
- if (browser_->tabstrip_model()->HasNonPhantomTabs()) {
+ if (!browser_->tabstrip_model()->empty()) {
// Tab strip isn't empty. Hide the frame (so it appears to have closed
// immediately) and close all the tabs, allowing the renderers to shut
// down. When the tab strip is empty we'll be called back again.
diff --git a/chrome/browser/views/frame/browser_view.h b/chrome/browser/views/frame/browser_view.h
index 142c520..08ab3ce 100644
--- a/chrome/browser/views/frame/browser_view.h
+++ b/chrome/browser/views/frame/browser_view.h
@@ -346,8 +346,7 @@ class BrowserView : public BrowserBubbleHost,
bool user_gesture);
virtual void TabReplacedAt(TabContents* old_contents,
TabContents* new_contents,
- int index,
- TabStripModelObserver::TabReplaceType type);
+ int index);
virtual void TabStripEmpty();
// Overridden from menus::SimpleMenuModel::Delegate:
diff --git a/chrome/browser/views/tabs/browser_tab_strip_controller.cc b/chrome/browser/views/tabs/browser_tab_strip_controller.cc
index 76de3ae..52d58a8 100644
--- a/chrome/browser/views/tabs/browser_tab_strip_controller.cc
+++ b/chrome/browser/views/tabs/browser_tab_strip_controller.cc
@@ -385,7 +385,6 @@ void BrowserTabStripController::SetTabRendererDataFromModel(
data->show_icon = contents->ShouldDisplayFavIcon();
data->mini = model_->IsMiniTab(model_index);
data->blocked = model_->IsTabBlocked(model_index);
- data->phantom = model_->IsPhantomTab(model_index);
data->app = contents->is_app();
}
diff --git a/chrome/browser/views/tabs/dragged_tab_controller.cc b/chrome/browser/views/tabs/dragged_tab_controller.cc
index b0dc9e3..3798180 100644
--- a/chrome/browser/views/tabs/dragged_tab_controller.cc
+++ b/chrome/browser/views/tabs/dragged_tab_controller.cc
@@ -886,7 +886,7 @@ void DraggedTabController::Detach() {
attached_tab_ = NULL;
// If we've removed the last Tab from the TabStrip, hide the frame now.
- if (!attached_model->HasNonPhantomTabs())
+ if (attached_model->empty())
HideFrame();
// Set up the photo booth to start capturing the contents of the dragged
@@ -1287,7 +1287,7 @@ void DraggedTabController::HideFrame() {
void DraggedTabController::CleanUpHiddenFrame() {
// If the model we started dragging from is now empty, we must ask the
// delegate to close the frame.
- if (!GetModel(source_tabstrip_)->HasNonPhantomTabs())
+ if (GetModel(source_tabstrip_)->empty())
GetModel(source_tabstrip_)->delegate()->CloseFrameAfterDragSession();
}
diff --git a/chrome/browser/views/tabs/side_tab.cc b/chrome/browser/views/tabs/side_tab.cc
index a73bdee..b42bca0 100644
--- a/chrome/browser/views/tabs/side_tab.cc
+++ b/chrome/browser/views/tabs/side_tab.cc
@@ -20,16 +20,12 @@ const int kTitleCloseSpacing = 4;
const SkScalar kRoundRectRadius = 4;
const SkColor kTabBackgroundColor = SK_ColorWHITE;
const SkColor kTextColor = SK_ColorBLACK;
-const SkColor kPhantomTextColor = SK_ColorGRAY;
// Padding between the edge and the icon.
const int kIconLeftPadding = 5;
// Location the title starts at.
const int kTitleX = kIconLeftPadding + kFavIconSize + 5;
-
-// Alpha value phantom tab icons are rendered at.
-const int kPhantomTabIconAlpha = 100;
};
////////////////////////////////////////////////////////////////////////////////
@@ -99,18 +95,10 @@ void SideTab::Paint(gfx::Canvas* canvas) {
paint);
}
- if (ShouldShowIcon()) {
- if (data().phantom) {
- canvas->SaveLayerAlpha(kPhantomTabIconAlpha,
- gfx::Rect(width(), height()));
- PaintIcon(canvas, icon_bounds_.x(), icon_bounds_.y());
- canvas->Restore();
- } else {
- PaintIcon(canvas, icon_bounds_.x(), icon_bounds_.y());
- }
- }
+ if (ShouldShowIcon())
+ PaintIcon(canvas, icon_bounds_.x(), icon_bounds_.y());
- PaintTitle(canvas, data().phantom ? kPhantomTextColor : kTextColor);
+ PaintTitle(canvas, kTextColor);
}
gfx::Size SideTab::GetPreferredSize() {
diff --git a/chrome/browser/views/tabs/tab.cc b/chrome/browser/views/tabs/tab.cc
index 1f58245..dda22fb 100644
--- a/chrome/browser/views/tabs/tab.cc
+++ b/chrome/browser/views/tabs/tab.cc
@@ -177,15 +177,13 @@ int Tab::GetMiniWidth() {
// Tab, protected:
void Tab::DataChanged(const TabRendererData& old) {
- if (data().phantom)
- StopMiniTabTitleAnimation();
+ if (data().blocked == old.blocked)
+ return;
- if (data().blocked != old.blocked) {
- if (data().blocked)
- StartPulse();
- else
- StopPulse();
- }
+ if (data().blocked)
+ StartPulse();
+ else
+ StopPulse();
}
////////////////////////////////////////////////////////////////////////////////
@@ -198,7 +196,7 @@ void Tab::Paint(gfx::Canvas* canvas) {
return;
// See if the model changes whether the icons should be painted.
- const bool show_icon = ShouldShowIcon() && !data().phantom;
+ const bool show_icon = ShouldShowIcon();
const bool show_close_button = ShouldShowCloseBox();
if (show_icon != showing_icon_ || show_close_button != showing_close_button_)
Layout();
diff --git a/chrome/browser/views/tabs/tab_renderer_data.h b/chrome/browser/views/tabs/tab_renderer_data.h
index f91a3f9..31e84ed 100644
--- a/chrome/browser/views/tabs/tab_renderer_data.h
+++ b/chrome/browser/views/tabs/tab_renderer_data.h
@@ -28,7 +28,6 @@ struct TabRendererData {
show_icon(true),
mini(false),
blocked(false),
- phantom(false),
app(false) {
}
@@ -41,7 +40,6 @@ struct TabRendererData {
bool show_icon;
bool mini;
bool blocked;
- bool phantom;
bool app;
};
diff --git a/chrome/browser/views/tabs/tab_strip.cc b/chrome/browser/views/tabs/tab_strip.cc
index c408585..1a1a99e 100644
--- a/chrome/browser/views/tabs/tab_strip.cc
+++ b/chrome/browser/views/tabs/tab_strip.cc
@@ -51,12 +51,6 @@ static const int kSuspendAnimationsTimeMs = 200;
static const int kTabHOffset = -16;
static const int kTabStripAnimationVSlop = 40;
-// Alpha value phantom tabs are rendered at.
-static const int kPhantomTabAlpha = 105;
-
-// Alpha value phantom tab icons are rendered at.
-static const int kPhantomTabIconAlpha = 160;
-
// Size of the drop indicator.
static int drop_indicator_width;
static int drop_indicator_height;
@@ -280,37 +274,7 @@ BaseTab* TabStrip::CreateTabForDragging() {
void TabStrip::PaintChildren(gfx::Canvas* canvas) {
// Tabs are painted in reverse order, so they stack to the left.
- // Phantom tabs appear behind all other tabs and are rendered first. To make
- // them slightly transparent we render them to a different layer.
- if (HasPhantomTabs()) {
- gfx::Rect local_bounds = GetLocalBounds(true);
- canvas->SaveLayerAlpha(kPhantomTabAlpha, local_bounds);
- canvas->AsCanvasSkia()->drawARGB(0, 255, 255, 255, SkXfermode::kClear_Mode);
- for (int i = tab_count() - 1; i >= 0; --i) {
- Tab* tab = GetTabAtTabDataIndex(i);
- if (tab->data().phantom)
- tab->ProcessPaint(canvas);
- }
- canvas->Restore();
-
- canvas->SaveLayerAlpha(kPhantomTabIconAlpha, local_bounds);
- canvas->AsCanvasSkia()->drawARGB(0, 255, 255, 255, SkXfermode::kClear_Mode);
- for (int i = tab_count() - 1; i >= 0; --i) {
- Tab* tab = GetTabAtTabDataIndex(i);
- if (tab->data().phantom) {
- canvas->Save();
- canvas->ClipRectInt(tab->MirroredX(), tab->y(), tab->width(),
- tab->height());
- canvas->TranslateInt(tab->MirroredX(), tab->y());
- tab->PaintIcon(canvas);
- canvas->Restore();
- }
- }
- canvas->Restore();
- }
-
Tab* selected_tab = NULL;
-
Tab* dragging_tab = NULL;
for (int i = tab_count() - 1; i >= 0; --i) {
@@ -318,14 +282,12 @@ void TabStrip::PaintChildren(gfx::Canvas* canvas) {
// We must ask the _Tab's_ model, not ourselves, because in some situations
// the model will be different to this object, e.g. when a Tab is being
// removed after its TabContents has been destroyed.
- if (!tab->data().phantom) {
- if (tab->dragging()) {
- dragging_tab = tab;
- } else if (!tab->IsSelected()) {
- tab->ProcessPaint(canvas);
- } else {
- selected_tab = tab;
- }
+ if (tab->dragging()) {
+ dragging_tab = tab;
+ } else if (!tab->IsSelected()) {
+ tab->ProcessPaint(canvas);
+ } else {
+ selected_tab = tab;
}
}
@@ -1020,11 +982,3 @@ bool TabStrip::IsPointInTab(Tab* tab,
View::ConvertPointToView(this, tab, &point_in_tab_coords);
return tab->HitTest(point_in_tab_coords);
}
-
-bool TabStrip::HasPhantomTabs() const {
- for (int i = 0; i < tab_count(); ++i) {
- if (GetTabAtTabDataIndex(i)->data().phantom)
- return true;
- }
- return false;
-}
diff --git a/chrome/browser/views/tabs/tab_strip.h b/chrome/browser/views/tabs/tab_strip.h
index 64c23fe..188868d 100644
--- a/chrome/browser/views/tabs/tab_strip.h
+++ b/chrome/browser/views/tabs/tab_strip.h
@@ -234,9 +234,6 @@ class TabStrip : public BaseTabStrip,
// hit-test region of the specified Tab.
bool IsPointInTab(Tab* tab, const gfx::Point& point_in_tabstrip_coords);
- // Returns true if any of the tabs are phantom.
- bool HasPhantomTabs() const;
-
// -- Member Variables ------------------------------------------------------
// The "New Tab" button.