Browser::Type cleanup.

BUG=None
TEST=Existing tests

[email protected],[email protected],[email protected]
Review URL: http://codereview.chromium.org/6697032

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@84303 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 1545c27c..194acffc 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -193,6 +193,14 @@
 
 extern bool g_log_bug53991;
 
+////////////////////////////////////////////////////////////////////////////////
+// Browser, CreateParams:
+
+Browser::CreateParams::CreateParams(Type type, Profile* profile)
+    : type(type),
+      profile(profile) {
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 // Browser, Constructors, Creation, Showing:
 
@@ -337,54 +345,59 @@
 
 // static
 Browser* Browser::Create(Profile* profile) {
-  Browser* browser = new Browser(TYPE_NORMAL, profile);
+  Browser* browser = new Browser(TYPE_TABBED, profile);
+  browser->InitBrowserWindow();
+  return browser;
+}
+
+// static
+Browser* Browser::CreateWithParams(const CreateParams& params) {
+  Browser* browser = new Browser(params.type, params.profile);
+  browser->app_name_ = params.app_name;
+  if (!params.initial_bounds.IsEmpty())
+    browser->set_override_bounds(params.initial_bounds);
   browser->InitBrowserWindow();
   return browser;
 }
 
 // static
 Browser* Browser::CreateForType(Type type, Profile* profile) {
-  Browser* browser = new Browser(type, profile);
-  browser->InitBrowserWindow();
-  return browser;
+  CreateParams params(type, profile);
+  return CreateWithParams(params);
 }
 
 // static
-Browser* Browser::CreateForApp(const std::string& app_name,
+Browser* Browser::CreateForApp(Type type,
+                               const std::string& app_name,
                                const gfx::Size& window_size,
-                               Profile* profile,
-                               bool is_panel) {
-  Browser::Type type = TYPE_APP;
+                               Profile* profile) {
+  DCHECK(type != TYPE_TABBED);
+  DCHECK(!app_name.empty());
 
-  if (is_panel) {
-    if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnablePanels)) {
-      type = TYPE_APP_PANEL;
-    } else {
-      // TYPE_APP_PANEL is the logical choice.  However, the panel UI
-      // is not fully implemented.  See crbug/55943.
-      type = TYPE_APP_POPUP;
-    }
+  RegisterAppPrefs(app_name, profile);
+
+#if !defined(OS_CHROMEOS)
+  if (type == TYPE_PANEL &&
+      !CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnablePanels)) {
+    // The panel UI is not fully implemented, so we default to TYPE_POPUP when
+    // the panel switch is not enabled.  See crbug/55943.
+    type = TYPE_POPUP;
   }
+#endif
 
-  Browser* browser = new Browser(type, profile);
-  browser->app_name_ = app_name;
+  CreateParams params(type, profile);
+  params.app_name = app_name;
+  if (!window_size.IsEmpty())
+    params.initial_bounds.set_size(window_size);
 
-  if (!window_size.IsEmpty()) {
-    gfx::Rect initial_pos(window_size);
-    browser->set_override_bounds(initial_pos);
-  }
-
-  browser->InitBrowserWindow();
-
-  return browser;
+  return CreateWithParams(params);
 }
 
 // static
 Browser* Browser::CreateForDevTools(Profile* profile) {
-  Browser* browser = new Browser(TYPE_DEVTOOLS, profile);
-  browser->app_name_ = DevToolsWindow::kDevToolsApp;
-  browser->InitBrowserWindow();
-  return browser;
+  CreateParams params(TYPE_POPUP, profile);
+  params.app_name = DevToolsWindow::kDevToolsApp;
+  return CreateWithParams(params);
 }
 
 void Browser::InitBrowserWindow() {
@@ -401,7 +414,7 @@
     // Set the app user model id for this application to that of the application
     // name.  See http://crbug.com/7028.
     app::win::SetAppIdForWindow(
-        type_ & TYPE_APP ?
+        is_app() ?
         ShellIntegration::GetAppId(UTF8ToWide(app_name_), profile_->GetPath()) :
         ShellIntegration::GetChromiumAppId(profile_->GetPath()),
         window()->GetNativeHandle());
@@ -472,6 +485,14 @@
   return find_bar_controller_.get() != NULL;
 }
 
+bool Browser::is_app() const {
+  return !app_name_.empty();
+}
+
+bool Browser::is_devtools() const {
+  return app_name_ == DevToolsWindow::kDevToolsApp;
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 // Browser, Creation Helpers:
 
@@ -550,17 +571,16 @@
   else
     app_name = web_app::GenerateApplicationNameFromURL(url);
 
-  RegisterAppPrefs(app_name, profile);
-
-  bool as_panel = extension && (container == extension_misc::LAUNCH_PANEL);
+  Type type = extension && (container == extension_misc::LAUNCH_PANEL) ?
+      TYPE_PANEL : TYPE_POPUP;
 
   gfx::Size window_size;
   if (extension)
     window_size.SetSize(extension->launch_width(),
                         extension->launch_height());
 
-  Browser* browser = Browser::CreateForApp(app_name, window_size, profile,
-                                           as_panel);
+  Browser* browser = Browser::CreateForApp(type, app_name, window_size,
+                                           profile);
 
   if (app_browser)
     *app_browser = browser;
@@ -608,8 +628,7 @@
 TabContents* Browser::OpenApplicationTab(Profile* profile,
                                          const Extension* extension,
                                          TabContents* existing_tab) {
-  Browser* browser =
-      BrowserList::FindBrowserWithType(profile, Browser::TYPE_NORMAL, false);
+  Browser* browser = BrowserList::FindTabbedBrowser(profile, false);
   TabContents* contents = NULL;
   if (!browser)
     return contents;
@@ -761,8 +780,18 @@
 }
 
 bool Browser::ShouldSaveWindowPlacement() const {
-  // Only save the window placement of popups if they are restored.
-  return (type() & TYPE_POPUP) == 0 || browser_defaults::kRestorePopups;
+  switch (type_) {
+    case TYPE_TABBED:
+      return true;
+    case TYPE_POPUP:
+      // Only save the window placement of popups if they are restored.
+      return browser_defaults::kRestorePopups;
+    case TYPE_PANEL:
+      // Do not save the window placement of panels.
+      return false;
+    default:
+      return false;
+  }
 }
 
 void Browser::SaveWindowPlacement(const gfx::Rect& bounds, bool maximized) {
@@ -842,7 +871,7 @@
 #else
   int string_id = IDS_BROWSER_WINDOW_TITLE_FORMAT;
   // Don't append the app name to window titles on app frames and app popups
-  if (type_ & TYPE_APP)
+  if (is_app())
     string_id = IDS_BROWSER_WINDOW_TITLE_FORMAT_NO_LOGO;
   return l10n_util::GetStringFUTF16(string_id, title);
 #endif
@@ -915,7 +944,7 @@
 
   TabRestoreService* tab_restore_service =
       TabRestoreServiceFactory::GetForProfile(profile());
-  if (tab_restore_service && type() == TYPE_NORMAL && tab_count())
+  if (tab_restore_service && is_type_tabbed() && tab_count())
     tab_restore_service->BrowserClosing(tab_restore_service_delegate());
 
   // TODO(sky): convert session/tab restore to use notification.
@@ -1142,35 +1171,34 @@
 
 void Browser::UpdateCommandsForFullscreenMode(bool is_fullscreen) {
 #if !defined(OS_MACOSX)
-  const bool show_main_ui = (type() == TYPE_NORMAL) && !is_fullscreen;
+  const bool show_main_ui = is_type_tabbed() && !is_fullscreen;
 #else
-  const bool show_main_ui = (type() == TYPE_NORMAL);
+  const bool show_main_ui = is_type_tabbed();
 #endif
 
-  bool main_not_fullscreen_or_popup =
-      show_main_ui && !is_fullscreen && (type() & TYPE_POPUP) == 0;
+  bool main_not_fullscreen = show_main_ui && !is_fullscreen;
 
   // Navigation commands
   command_updater_.UpdateCommandEnabled(IDC_OPEN_CURRENT_URL, show_main_ui);
 
   // Window management commands
   command_updater_.UpdateCommandEnabled(IDC_SHOW_AS_TAB,
-      (type() & TYPE_POPUP) && !is_fullscreen);
+      type_ != TYPE_TABBED && !is_fullscreen);
 
   // Focus various bits of UI
   command_updater_.UpdateCommandEnabled(IDC_FOCUS_TOOLBAR, show_main_ui);
   command_updater_.UpdateCommandEnabled(IDC_FOCUS_LOCATION, show_main_ui);
   command_updater_.UpdateCommandEnabled(IDC_FOCUS_SEARCH, show_main_ui);
   command_updater_.UpdateCommandEnabled(
-      IDC_FOCUS_MENU_BAR, main_not_fullscreen_or_popup);
+      IDC_FOCUS_MENU_BAR, main_not_fullscreen);
   command_updater_.UpdateCommandEnabled(
-      IDC_FOCUS_NEXT_PANE, main_not_fullscreen_or_popup);
+      IDC_FOCUS_NEXT_PANE, main_not_fullscreen);
   command_updater_.UpdateCommandEnabled(
-      IDC_FOCUS_PREVIOUS_PANE, main_not_fullscreen_or_popup);
+      IDC_FOCUS_PREVIOUS_PANE, main_not_fullscreen);
   command_updater_.UpdateCommandEnabled(
-      IDC_FOCUS_BOOKMARKS, main_not_fullscreen_or_popup);
+      IDC_FOCUS_BOOKMARKS, main_not_fullscreen);
   command_updater_.UpdateCommandEnabled(
-      IDC_FOCUS_CHROMEOS_STATUS, main_not_fullscreen_or_popup);
+      IDC_FOCUS_CHROMEOS_STATUS, main_not_fullscreen);
 
   // Show various bits of UI
   command_updater_.UpdateCommandEnabled(IDC_DEVELOPER_MENU, show_main_ui);
@@ -1242,21 +1270,20 @@
   features |= FEATURE_DOWNLOADSHELF;
 #endif  // !defined(OS_CHROMEOS)
 
-  if (type() == TYPE_NORMAL) {
+  if (is_type_tabbed())
     features |= FEATURE_BOOKMARKBAR;
-  }
 
   if (!hide_ui_for_fullscreen) {
-    if (type() != TYPE_NORMAL)
+    if (!is_type_tabbed())
       features |= FEATURE_TITLEBAR;
 
-    if (type() == TYPE_NORMAL)
+    if (is_type_tabbed())
       features |= FEATURE_TABSTRIP;
 
-    if (type() == TYPE_NORMAL)
+    if (is_type_tabbed())
       features |= FEATURE_TOOLBAR;
 
-    if ((type() & Browser::TYPE_APP) == 0)
+    if (!is_app())
       features |= FEATURE_LOCATIONBAR;
   }
   return !!(features & feature);
@@ -1408,7 +1435,7 @@
 void Browser::NewTab() {
   UserMetrics::RecordAction(UserMetricsAction("NewTab"));
 
-  if (type() == TYPE_NORMAL) {
+  if (is_type_tabbed()) {
     AddBlankTab(true);
     GetSelectedTabContentsWrapper()->view()->RestoreFocus();
   } else {
@@ -2513,7 +2540,7 @@
     dock_info.AdjustOtherWindowBounds();
 
   // Create an empty new browser window the same size as the old one.
-  Browser* browser = new Browser(TYPE_NORMAL, profile_);
+  Browser* browser = new Browser(TYPE_TABBED, profile_);
   browser->set_override_bounds(new_window_bounds);
   browser->set_maximized_state(
       maximize ? MAXIMIZED_STATE_MAXIMIZED : MAXIMIZED_STATE_UNMAXIMIZED);
@@ -2572,12 +2599,12 @@
                                                           add_types);
   } else {
     Browser* browser = NULL;
-    if (type_ & TYPE_APP) {
-      CHECK_EQ((type_ & TYPE_POPUP), 0);
-      CHECK_NE(type_, TYPE_APP_PANEL);
-      browser = Browser::CreateForApp(app_name_, gfx::Size(), profile_,
-                                      false);
-    } else if (type_ == TYPE_POPUP) {
+    if (is_app()) {
+      CHECK(!is_type_popup());
+      CHECK(!is_type_panel());
+      browser = Browser::CreateForApp(TYPE_POPUP, app_name_, gfx::Size(),
+                                      profile_);
+    } else if (is_type_popup()) {
       browser = Browser::CreateForType(TYPE_POPUP, profile_);
     }
 
@@ -2633,7 +2660,7 @@
 }
 
 bool Browser::CanReloadContents(TabContents* source) const {
-  return type() != TYPE_DEVTOOLS;
+  return !is_devtools();
 }
 
 bool Browser::CanCloseContents(std::vector<int>* indices) {
@@ -3023,7 +3050,7 @@
 }
 
 void Browser::MoveContents(TabContents* source, const gfx::Rect& pos) {
-  if ((type() & TYPE_POPUP) == 0) {
+  if (!IsPopupOrPanel(source)) {
     NOTREACHED() << "moving invalid browser type";
     return;
   }
@@ -3036,9 +3063,9 @@
     tab_handler_->GetTabStripModel()->DetachTabContentsAt(index);
 }
 
-bool Browser::IsPopup(const TabContents* source) const {
+bool Browser::IsPopupOrPanel(const TabContents* source) const {
   // A non-tabbed BROWSER is an unconstrained popup.
-  return !!(type() & TYPE_POPUP);
+  return is_type_popup() || is_type_panel();
 }
 
 void Browser::ContentsMouseEvent(
@@ -3107,17 +3134,16 @@
 }
 
 bool Browser::IsApplication() const {
-  return (type_ & TYPE_APP) != 0;
+  return is_app();
 }
 
 void Browser::ConvertContentsToApplication(TabContents* contents) {
   const GURL& url = contents->controller().GetActiveEntry()->url();
   std::string app_name = web_app::GenerateApplicationNameFromURL(url);
-  RegisterAppPrefs(app_name, contents->profile());
 
   DetachContents(contents);
   Browser* app_browser = Browser::CreateForApp(
-      app_name, gfx::Size(), profile_, false);
+      TYPE_POPUP, app_name, gfx::Size(), profile_);
   TabContentsWrapper* wrapper =
       TabContentsWrapper::GetCurrentWrapperForContents(contents);
   if (!wrapper)
@@ -3455,10 +3481,8 @@
       break;
 
     case NotificationType::EXTENSION_READY_FOR_INSTALL: {
-      // Handle EXTENSION_READY_FOR_INSTALL for last active normal browser.
-      if (BrowserList::FindBrowserWithType(profile(),
-                                           Browser::TYPE_NORMAL,
-                                           true) != this)
+      // Handle EXTENSION_READY_FOR_INSTALL for last active tabbed browser.
+      if (BrowserList::FindTabbedBrowser(profile(), true) != this)
         break;
 
       // We only want to show the loading dialog for themes, but we don't want
@@ -3514,9 +3538,9 @@
   DCHECK(profile_->GetProfileSyncService());
 
 #if !defined(OS_MACOSX)
-  const bool show_main_ui = (type() == TYPE_NORMAL) && !window_->IsFullscreen();
+  const bool show_main_ui = is_type_tabbed() && !window_->IsFullscreen();
 #else
-  const bool show_main_ui = (type() == TYPE_NORMAL);
+  const bool show_main_ui = is_type_tabbed();
 #endif
 
   command_updater_.UpdateCommandEnabled(IDC_SYNC_BOOKMARKS,
@@ -3583,7 +3607,7 @@
 // Browser, protected:
 
 BrowserWindow* Browser::CreateBrowserWindow() {
-  if (type() == Browser::TYPE_APP_PANEL &&
+  if (type_ == TYPE_PANEL &&
       CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnablePanels))
     return PanelManager::GetInstance()->CreatePanel(this);
 
@@ -3690,15 +3714,14 @@
                                         enable_extensions);
 
   // Initialize other commands based on the window type.
-  bool normal_window = type() == TYPE_NORMAL;
-  bool non_devtools_window = type() != TYPE_DEVTOOLS;
+  bool normal_window = is_type_tabbed();
 
   // Navigation commands
   command_updater_.UpdateCommandEnabled(IDC_HOME, normal_window);
 
   // Window management commands
   command_updater_.UpdateCommandEnabled(IDC_FULLSCREEN,
-      type() != TYPE_APP_PANEL);
+      !(is_type_panel() && is_app()));
   command_updater_.UpdateCommandEnabled(IDC_SELECT_NEXT_TAB, normal_window);
   command_updater_.UpdateCommandEnabled(IDC_SELECT_PREVIOUS_TAB,
                                         normal_window);
@@ -3718,16 +3741,15 @@
 #endif
 
   // Clipboard commands
-  command_updater_.UpdateCommandEnabled(IDC_COPY_URL, non_devtools_window);
+  command_updater_.UpdateCommandEnabled(IDC_COPY_URL, !is_devtools());
 
   // Find-in-page
-  command_updater_.UpdateCommandEnabled(IDC_FIND, non_devtools_window);
-  command_updater_.UpdateCommandEnabled(IDC_FIND_NEXT, non_devtools_window);
-  command_updater_.UpdateCommandEnabled(IDC_FIND_PREVIOUS, non_devtools_window);
+  command_updater_.UpdateCommandEnabled(IDC_FIND, !is_devtools());
+  command_updater_.UpdateCommandEnabled(IDC_FIND_NEXT, !is_devtools());
+  command_updater_.UpdateCommandEnabled(IDC_FIND_PREVIOUS, !is_devtools());
 
   // Autofill
-  command_updater_.UpdateCommandEnabled(IDC_AUTOFILL_DEFAULT,
-                                        non_devtools_window);
+  command_updater_.UpdateCommandEnabled(IDC_AUTOFILL_DEFAULT, !is_devtools());
 
   // Show various bits of UI
   command_updater_.UpdateCommandEnabled(IDC_CLEAR_BROWSING_DATA, normal_window);
@@ -3766,9 +3788,8 @@
                                         CanReloadContents(current_tab));
 
   // Window management commands
-  bool non_app_window = !(type() & TYPE_APP);
   command_updater_.UpdateCommandEnabled(IDC_DUPLICATE_TAB,
-      non_app_window && CanDuplicateContentsAt(active_index()));
+      !is_app() && CanDuplicateContentsAt(active_index()));
 
   // Page-related commands
   window_->SetStarredState(current_tab_wrapper->is_starred());
@@ -3847,7 +3868,7 @@
       browser_defaults::bookmarks_enabled;
 
   command_updater_.UpdateCommandEnabled(IDC_BOOKMARK_PAGE,
-      enabled && type() == TYPE_NORMAL);
+      enabled && is_type_tabbed());
   command_updater_.UpdateCommandEnabled(IDC_BOOKMARK_ALL_TABS,
       enabled && CanBookmarkAllTabs());
 }
@@ -4212,11 +4233,11 @@
   for (BrowserList::const_iterator iter = BrowserList::begin();
        iter != BrowserList::end(); ++iter) {
     // Don't count this browser window or any other in the process of closing.
-    // Only consider normal browser windows, not popups.
+    // Only consider tabbed browser windows, not popups.
     Browser* const browser = *iter;
     if (browser == this
         || browser->is_attempting_to_close_browser_
-        || browser->type() != Browser::TYPE_NORMAL)
+        || !browser->is_type_tabbed())
       continue;
 
     // Verify that this is not the last non-incognito or incognito browser,
@@ -4252,8 +4273,7 @@
 
 // static
 Browser* Browser::GetTabbedBrowser(Profile* profile, bool match_incognito) {
-  return BrowserList::FindBrowserWithType(profile, TYPE_NORMAL,
-                                          match_incognito);
+  return BrowserList::FindTabbedBrowser(profile, match_incognito);
 }
 
 // static
@@ -4332,22 +4352,13 @@
 
 // static
 void Browser::RegisterAppPrefs(const std::string& app_name, Profile* profile) {
-  // A set of apps that we've already started.
-  static std::set<std::string>* g_app_names = NULL;
-
-  if (!g_app_names)
-    g_app_names = new std::set<std::string>;
-
-  // Only register once for each app name.
-  if (g_app_names->find(app_name) != g_app_names->end())
-    return;
-  g_app_names->insert(app_name);
-
   // We need to register the window position pref.
   std::string window_pref(prefs::kBrowserWindowPlacement);
   window_pref.append("_");
   window_pref.append(app_name);
-  profile->GetPrefs()->RegisterDictionaryPref(window_pref.c_str());
+  PrefService* prefs = profile->GetPrefs();
+  if (!prefs->FindPreference(window_pref.c_str()))
+    prefs->RegisterDictionaryPref(window_pref.c_str());
 }
 
 void Browser::TabRestoreServiceChanged(TabRestoreService* service) {
@@ -4414,7 +4425,7 @@
 }
 
 void Browser::CreateInstantIfNecessary() {
-  if (type() == TYPE_NORMAL && InstantController::IsEnabled(profile()) &&
+  if (is_type_tabbed() && InstantController::IsEnabled(profile()) &&
       !profile()->IsOffTheRecord()) {
     instant_.reset(new InstantController(profile_, this));
     instant_unload_handler_.reset(new InstantUnloadHandler(this));
@@ -4467,7 +4478,7 @@
                                                           view_source_contents,
                                                           add_types);
   } else {
-    Browser* browser = Browser::CreateForType(TYPE_NORMAL, profile_);
+    Browser* browser = Browser::CreateForType(TYPE_TABBED, profile_);
 
     // Preserve the size of the original window. The new window has already
     // been given an offset by the OS, so we shouldn't copy the old bounds.