Refactor ExtensionTabUtil-namespaced functions into their own file.

TEST=none; no functionality has changed.


Review URL: http://codereview.chromium.org/8037005

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@102958 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/automation/automation_provider.cc b/chrome/browser/automation/automation_provider.cc
index 9d8b3ab..fcfd0f5 100644
--- a/chrome/browser/automation/automation_provider.cc
+++ b/chrome/browser/automation/automation_provider.cc
@@ -48,7 +48,7 @@
 #include "chrome/browser/extensions/extension_install_ui.h"
 #include "chrome/browser/extensions/extension_message_service.h"
 #include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/extensions/extension_toolbar_model.h"
 #include "chrome/browser/extensions/user_script_master.h"
 #include "chrome/browser/net/url_request_mock_util.h"
diff --git a/chrome/browser/automation/automation_provider_observers.cc b/chrome/browser/automation/automation_provider_observers.cc
index be65a44..facb9cd2 100644
--- a/chrome/browser/automation/automation_provider_observers.cc
+++ b/chrome/browser/automation/automation_provider_observers.cc
@@ -13,9 +13,9 @@
 #include "base/file_util.h"
 #include "base/json/json_writer.h"
 #include "base/memory/scoped_ptr.h"
+#include "base/string_number_conversions.h"
 #include "base/string_util.h"
 #include "base/stringprintf.h"
-#include "base/string_number_conversions.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/utf_string_conversions.h"
 #include "base/values.h"
@@ -29,7 +29,7 @@
 #include "chrome/browser/extensions/extension_host.h"
 #include "chrome/browser/extensions/extension_process_manager.h"
 #include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/extensions/extension_updater.h"
 #include "chrome/browser/history/history_types.h"
 #include "chrome/browser/history/top_sites.h"
@@ -2895,4 +2895,3 @@
     NOTREACHED();
   }
 }
-
diff --git a/chrome/browser/extensions/browser_action_apitest.cc b/chrome/browser/extensions/browser_action_apitest.cc
index 4f0043b..5240aba 100644
--- a/chrome/browser/extensions/browser_action_apitest.cc
+++ b/chrome/browser/extensions/browser_action_apitest.cc
@@ -12,7 +12,7 @@
 #include "chrome/browser/extensions/extension_apitest.h"
 #include "chrome/browser/extensions/extension_browser_event_router.h"
 #include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_window.h"
diff --git a/chrome/browser/extensions/execute_code_in_tab_function.cc b/chrome/browser/extensions/execute_code_in_tab_function.cc
index 5c961959..e8645d9 100644
--- a/chrome/browser/extensions/execute_code_in_tab_function.cc
+++ b/chrome/browser/extensions/execute_code_in_tab_function.cc
@@ -7,6 +7,7 @@
 #include "base/string_util.h"
 #include "base/utf_string_conversions.h"
 #include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/extensions/extension_tabs_module.h"
 #include "chrome/browser/extensions/extension_tabs_module_constants.h"
 #include "chrome/browser/extensions/file_reader.h"
@@ -18,11 +19,11 @@
 #include "chrome/common/extensions/extension_error_utils.h"
 #include "chrome/common/extensions/extension_file_util.h"
 #include "chrome/common/extensions/extension_l10n_util.h"
-#include "chrome/common/extensions/extension_messages.h"
 #include "chrome/common/extensions/extension_message_bundle.h"
+#include "chrome/common/extensions/extension_messages.h"
+#include "content/browser/renderer_host/render_view_host.h"
 #include "content/browser/renderer_host/render_view_host.h"
 #include "content/browser/tab_contents/tab_contents.h"
-#include "content/browser/renderer_host/render_view_host.h"
 #include "content/common/notification_service.h"
 
 namespace keys = extension_tabs_module_constants;
diff --git a/chrome/browser/extensions/extension_browser_event_router.cc b/chrome/browser/extensions/extension_browser_event_router.cc
index b72f425..661cdb4 100644
--- a/chrome/browser/extensions/extension_browser_event_router.cc
+++ b/chrome/browser/extensions/extension_browser_event_router.cc
@@ -9,6 +9,7 @@
 #include "chrome/browser/extensions/extension_event_names.h"
 #include "chrome/browser/extensions/extension_event_router.h"
 #include "chrome/browser/extensions/extension_page_actions_module_constants.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/extensions/extension_tabs_module_constants.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/tabs/tab_strip_model.h"
diff --git a/chrome/browser/extensions/extension_browsertests_misc.cc b/chrome/browser/extensions/extension_browsertests_misc.cc
index 6bfae44c..d4885c67 100644
--- a/chrome/browser/extensions/extension_browsertests_misc.cc
+++ b/chrome/browser/extensions/extension_browsertests_misc.cc
@@ -12,7 +12,7 @@
 #include "chrome/browser/extensions/extension_host.h"
 #include "chrome/browser/extensions/extension_process_manager.h"
 #include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/extensions/extension_updater.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/tabs/tab_strip_model.h"
diff --git a/chrome/browser/extensions/extension_context_menu_model.cc b/chrome/browser/extensions/extension_context_menu_model.cc
index fd9207b..ba9eb11 100644
--- a/chrome/browser/extensions/extension_context_menu_model.cc
+++ b/chrome/browser/extensions/extension_context_menu_model.cc
@@ -6,7 +6,7 @@
 
 #include "base/utf_string_conversions.h"
 #include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/prefs/pref_service.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
diff --git a/chrome/browser/extensions/extension_cookies_helpers.cc b/chrome/browser/extensions/extension_cookies_helpers.cc
index 472e373..2e25e293 100644
--- a/chrome/browser/extensions/extension_cookies_helpers.cc
+++ b/chrome/browser/extensions/extension_cookies_helpers.cc
@@ -9,7 +9,7 @@
 #include "base/logging.h"
 #include "base/values.h"
 #include "chrome/browser/extensions/extension_cookies_api_constants.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/browser.h"
diff --git a/chrome/browser/extensions/extension_debugger_api.cc b/chrome/browser/extensions/extension_debugger_api.cc
index 5afef7c4..aeddcfc 100644
--- a/chrome/browser/extensions/extension_debugger_api.cc
+++ b/chrome/browser/extensions/extension_debugger_api.cc
@@ -16,15 +16,15 @@
 #include "base/values.h"
 #include "chrome/browser/extensions/extension_debugger_api_constants.h"
 #include "chrome/browser/extensions/extension_event_router.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
+#include "chrome/common/chrome_notification_types.h"
 #include "chrome/common/extensions/extension.h"
 #include "chrome/common/extensions/extension_error_utils.h"
 #include "content/browser/debugger/devtools_client_host.h"
 #include "content/browser/debugger/devtools_manager.h"
 #include "content/browser/tab_contents/tab_contents.h"
-#include "chrome/common/chrome_notification_types.h"
 #include "content/common/devtools_messages.h"
 #include "content/common/notification_service.h"
 
diff --git a/chrome/browser/extensions/extension_devtools_bridge.cc b/chrome/browser/extensions/extension_devtools_bridge.cc
index ea0bf3d..8bcc452 100644
--- a/chrome/browser/extensions/extension_devtools_bridge.cc
+++ b/chrome/browser/extensions/extension_devtools_bridge.cc
@@ -12,7 +12,7 @@
 #include "chrome/browser/extensions/extension_devtools_events.h"
 #include "chrome/browser/extensions/extension_devtools_manager.h"
 #include "chrome/browser/extensions/extension_event_router.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
 #include "content/browser/debugger/devtools_manager.h"
diff --git a/chrome/browser/extensions/extension_devtools_browsertests.cc b/chrome/browser/extensions/extension_devtools_browsertests.cc
index 4bd6823..9f220b71 100644
--- a/chrome/browser/extensions/extension_devtools_browsertests.cc
+++ b/chrome/browser/extensions/extension_devtools_browsertests.cc
@@ -9,7 +9,7 @@
 #include "chrome/browser/extensions/extension_host.h"
 #include "chrome/browser/extensions/extension_process_manager.h"
 #include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/browser_list.h"
diff --git a/chrome/browser/extensions/extension_file_browser_private_api.cc b/chrome/browser/extensions/extension_file_browser_private_api.cc
index fc884e0..91f63a0 100644
--- a/chrome/browser/extensions/extension_file_browser_private_api.cc
+++ b/chrome/browser/extensions/extension_file_browser_private_api.cc
@@ -20,7 +20,7 @@
 #include "chrome/browser/extensions/extension_function_dispatcher.h"
 #include "chrome/browser/extensions/extension_process_manager.h"
 #include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/extensions/file_manager_util.h"
 #include "chrome/browser/prefs/pref_service.h"
 #include "chrome/browser/prefs/scoped_user_pref_update.h"
diff --git a/chrome/browser/extensions/extension_host.cc b/chrome/browser/extensions/extension_host.cc
index 726ec71..3af8d58 100644
--- a/chrome/browser/extensions/extension_host.cc
+++ b/chrome/browser/extensions/extension_host.cc
@@ -13,7 +13,7 @@
 #include "base/utf_string_conversions.h"
 #include "chrome/browser/browser_shutdown.h"
 #include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/file_select_helper.h"
 #include "chrome/browser/platform_util.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/extensions/extension_infobar_module.cc b/chrome/browser/extensions/extension_infobar_module.cc
index 3b263b0..dea559f 100644
--- a/chrome/browser/extensions/extension_infobar_module.cc
+++ b/chrome/browser/extensions/extension_infobar_module.cc
@@ -10,7 +10,7 @@
 #include "chrome/browser/extensions/extension_host.h"
 #include "chrome/browser/extensions/extension_infobar_delegate.h"
 #include "chrome/browser/extensions/extension_infobar_module_constants.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/extensions/extension_tabs_module_constants.h"
 #include "chrome/browser/infobars/infobar_tab_helper.h"
 #include "chrome/browser/tab_contents/confirm_infobar_delegate.h"
diff --git a/chrome/browser/extensions/extension_menu_manager.cc b/chrome/browser/extensions/extension_menu_manager.cc
index 8cc81c2..eb2038e 100644
--- a/chrome/browser/extensions/extension_menu_manager.cc
+++ b/chrome/browser/extensions/extension_menu_manager.cc
@@ -13,7 +13,7 @@
 #include "base/utf_string_conversions.h"
 #include "base/values.h"
 #include "chrome/browser/extensions/extension_event_router.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/chrome_notification_types.h"
 #include "chrome/common/extensions/extension.h"
diff --git a/chrome/browser/extensions/extension_message_service.cc b/chrome/browser/extensions/extension_message_service.cc
index 1fe3455..e38f7ee 100644
--- a/chrome/browser/extensions/extension_message_service.cc
+++ b/chrome/browser/extensions/extension_message_service.cc
@@ -9,7 +9,7 @@
 #include "base/stl_util.h"
 #include "base/values.h"
 #include "chrome/browser/extensions/extension_process_manager.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/tab_contents/tab_util.h"
 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
diff --git a/chrome/browser/extensions/extension_page_actions_module.cc b/chrome/browser/extensions/extension_page_actions_module.cc
index bdd9c68..65d9cbbb 100644
--- a/chrome/browser/extensions/extension_page_actions_module.cc
+++ b/chrome/browser/extensions/extension_page_actions_module.cc
@@ -10,7 +10,7 @@
 #include "chrome/browser/extensions/extension_page_actions_module_constants.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/extensions/extension_tab_helper.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
diff --git a/chrome/browser/extensions/extension_processes_api.cc b/chrome/browser/extensions/extension_processes_api.cc
index 0daa174..d8794a5 100644
--- a/chrome/browser/extensions/extension_processes_api.cc
+++ b/chrome/browser/extensions/extension_processes_api.cc
@@ -14,7 +14,7 @@
 
 #include "chrome/browser/extensions/extension_event_router.h"
 #include "chrome/browser/extensions/extension_processes_api_constants.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/extensions/extension_tabs_module_constants.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/task_manager/task_manager.h"
diff --git a/chrome/browser/extensions/extension_save_page_api.cc b/chrome/browser/extensions/extension_save_page_api.cc
index 2aee2cee..03093768 100644
--- a/chrome/browser/extensions/extension_save_page_api.cc
+++ b/chrome/browser/extensions/extension_save_page_api.cc
@@ -6,7 +6,7 @@
 
 #include "base/file_util.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
 #include "content/browser/child_process_security_policy.h"
 #include "content/browser/renderer_host/render_view_host.h"
diff --git a/chrome/browser/extensions/extension_sidebar_api.cc b/chrome/browser/extensions/extension_sidebar_api.cc
index e9a209d..0b7e176f 100644
--- a/chrome/browser/extensions/extension_sidebar_api.cc
+++ b/chrome/browser/extensions/extension_sidebar_api.cc
@@ -5,13 +5,13 @@
 #include "chrome/browser/extensions/extension_sidebar_api.h"
 
 #include "base/json/json_writer.h"
+#include "base/string16.h"
 #include "base/string_number_conversions.h"
 #include "base/string_util.h"
-#include "base/string16.h"
 #include "base/values.h"
 #include "chrome/browser/extensions/extension_event_router.h"
 #include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/sidebar/sidebar_container.h"
 #include "chrome/browser/sidebar/sidebar_manager.h"
diff --git a/chrome/browser/extensions/extension_tab_util.cc b/chrome/browser/extensions/extension_tab_util.cc
new file mode 100644
index 0000000..6bf27d65
--- /dev/null
+++ b/chrome/browser/extensions/extension_tab_util.cc
@@ -0,0 +1,215 @@
+// Copyright (c) 2011 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.
+
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/tabs/tab_strip_model.h"
+#include "content/browser/tab_contents/tab_contents.h"
+#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
+#include "chrome/browser/ui/browser_window.h"
+#include "chrome/browser/ui/browser_list.h"
+#include "chrome/browser/sessions/restore_tab_helper.h"
+#include "chrome/browser/extensions/extension_tabs_module_constants.h"
+
+namespace keys = extension_tabs_module_constants;
+namespace errors = extension_manifest_errors;
+
+int ExtensionTabUtil::GetWindowId(const Browser* browser) {
+  return browser->session_id().id();
+}
+
+// TODO(sky): this function should really take a TabContentsWrapper.
+int ExtensionTabUtil::GetTabId(const TabContents* tab_contents) {
+  const TabContentsWrapper* tab =
+      TabContentsWrapper::GetCurrentWrapperForContents(tab_contents);
+  return tab ? tab->restore_tab_helper()->session_id().id() : -1;
+}
+
+std::string ExtensionTabUtil::GetTabStatusText(bool is_loading) {
+  return is_loading ? keys::kStatusValueLoading : keys::kStatusValueComplete;
+}
+
+// TODO(sky): this function should really take a TabContentsWrapper.
+int ExtensionTabUtil::GetWindowIdOfTab(const TabContents* tab_contents) {
+  const TabContentsWrapper* tab =
+      TabContentsWrapper::GetCurrentWrapperForContents(tab_contents);
+  return tab ? tab->restore_tab_helper()->window_id().id() : -1;
+}
+
+DictionaryValue* ExtensionTabUtil::CreateTabValue(
+    const TabContents* contents) {
+  // Find the tab strip and index of this guy.
+  TabStripModel* tab_strip = NULL;
+  int tab_index;
+  if (ExtensionTabUtil::GetTabStripModel(contents, &tab_strip, &tab_index))
+    return ExtensionTabUtil::CreateTabValue(contents, tab_strip, tab_index);
+
+  // Couldn't find it.  This can happen if the tab is being dragged.
+  return ExtensionTabUtil::CreateTabValue(contents, NULL, -1);
+}
+
+ListValue* ExtensionTabUtil::CreateTabList(const Browser* browser) {
+  ListValue* tab_list = new ListValue();
+  TabStripModel* tab_strip = browser->tabstrip_model();
+  for (int i = 0; i < tab_strip->count(); ++i) {
+    tab_list->Append(ExtensionTabUtil::CreateTabValue(
+        tab_strip->GetTabContentsAt(i)->tab_contents(), tab_strip, i));
+  }
+
+  return tab_list;
+}
+
+DictionaryValue* ExtensionTabUtil::CreateTabValue(const TabContents* contents,
+                                                  TabStripModel* tab_strip,
+                                                  int tab_index) {
+  DictionaryValue* result = new DictionaryValue();
+  bool is_loading = contents->IsLoading();
+  result->SetInteger(keys::kIdKey, ExtensionTabUtil::GetTabId(contents));
+  result->SetInteger(keys::kIndexKey, tab_index);
+  result->SetInteger(keys::kWindowIdKey,
+                     ExtensionTabUtil::GetWindowIdOfTab(contents));
+  result->SetString(keys::kUrlKey, contents->GetURL().spec());
+  result->SetString(keys::kStatusKey, GetTabStatusText(is_loading));
+  result->SetBoolean(keys::kSelectedKey,
+                     tab_strip && tab_index == tab_strip->active_index());
+  result->SetBoolean(keys::kPinnedKey,
+                     tab_strip && tab_strip->IsTabPinned(tab_index));
+  result->SetString(keys::kTitleKey, contents->GetTitle());
+  result->SetBoolean(keys::kIncognitoKey,
+                     contents->browser_context()->IsOffTheRecord());
+
+  if (!is_loading) {
+    NavigationEntry* entry = contents->controller().GetActiveEntry();
+    if (entry) {
+      if (entry->favicon().is_valid())
+        result->SetString(keys::kFaviconUrlKey, entry->favicon().url().spec());
+    }
+  }
+
+  return result;
+}
+
+DictionaryValue* ExtensionTabUtil::CreateTabValueActive(
+    const TabContents* contents,
+    bool active) {
+  DictionaryValue* result = ExtensionTabUtil::CreateTabValue(contents);
+  result->SetBoolean(keys::kSelectedKey, active);
+  return result;
+}
+
+// Return the type name for a browser window type.
+static std::string GetWindowTypeText(const Browser* browser) {
+  if (browser->is_type_popup())
+    return keys::kWindowTypeValuePopup;
+  if (browser->is_type_panel())
+    return keys::kWindowTypeValuePanel;
+  if (browser->is_app())
+    return keys::kWindowTypeValueApp;
+  return keys::kWindowTypeValueNormal;
+}
+
+// if |populate| is true, each window gets a list property |tabs| which contains
+// fully populated tab objects.
+DictionaryValue* ExtensionTabUtil::CreateWindowValue(const Browser* browser,
+                                                     bool populate_tabs) {
+  DCHECK(browser);
+  DCHECK(browser->window());
+  DictionaryValue* result = new DictionaryValue();
+  result->SetInteger(keys::kIdKey, ExtensionTabUtil::GetWindowId(browser));
+  result->SetBoolean(keys::kIncognitoKey,
+                     browser->profile()->IsOffTheRecord());
+  result->SetBoolean(keys::kFocusedKey, browser->window()->IsActive());
+  gfx::Rect bounds;
+  if (browser->window()->IsMaximized() || browser->window()->IsFullscreen())
+    bounds = browser->window()->GetBounds();
+  else
+    bounds = browser->window()->GetRestoredBounds();
+
+  result->SetInteger(keys::kLeftKey, bounds.x());
+  result->SetInteger(keys::kTopKey, bounds.y());
+  result->SetInteger(keys::kWidthKey, bounds.width());
+  result->SetInteger(keys::kHeightKey, bounds.height());
+  result->SetString(keys::kWindowTypeKey, GetWindowTypeText(browser));
+
+  if (populate_tabs) {
+    result->Set(keys::kTabsKey, ExtensionTabUtil::CreateTabList(browser));
+  }
+
+  return result;
+}
+
+bool ExtensionTabUtil::GetTabStripModel(const TabContents* tab_contents,
+                                        TabStripModel** tab_strip_model,
+                                        int* tab_index) {
+  DCHECK(tab_contents);
+  DCHECK(tab_strip_model);
+  DCHECK(tab_index);
+
+  for (BrowserList::const_iterator it = BrowserList::begin();
+      it != BrowserList::end(); ++it) {
+    TabStripModel* tab_strip = (*it)->tabstrip_model();
+    int index = tab_strip->GetWrapperIndex(tab_contents);
+    if (index != -1) {
+      *tab_strip_model = tab_strip;
+      *tab_index = index;
+      return true;
+    }
+  }
+
+  return false;
+}
+
+bool ExtensionTabUtil::GetDefaultTab(Browser* browser,
+                                     TabContentsWrapper** contents,
+                                     int* tab_id) {
+  DCHECK(browser);
+  DCHECK(contents);
+
+  *contents = browser->GetSelectedTabContentsWrapper();
+  if (*contents) {
+    if (tab_id)
+      *tab_id = ExtensionTabUtil::GetTabId((*contents)->tab_contents());
+    return true;
+  }
+
+  return false;
+}
+
+bool ExtensionTabUtil::GetTabById(int tab_id,
+                                  Profile* profile,
+                                  bool include_incognito,
+                                  Browser** browser,
+                                  TabStripModel** tab_strip,
+                                  TabContentsWrapper** contents,
+                                  int* tab_index) {
+  Profile* incognito_profile =
+      include_incognito && profile->HasOffTheRecordProfile() ?
+          profile->GetOffTheRecordProfile() : NULL;
+  for (BrowserList::const_iterator iter = BrowserList::begin();
+       iter != BrowserList::end(); ++iter) {
+    Browser* target_browser = *iter;
+    if (target_browser->profile() == profile ||
+        target_browser->profile() == incognito_profile) {
+      TabStripModel* target_tab_strip = target_browser->tabstrip_model();
+      for (int i = 0; i < target_tab_strip->count(); ++i) {
+        TabContentsWrapper* target_contents =
+            target_tab_strip->GetTabContentsAt(i);
+        if (target_contents->restore_tab_helper()->session_id().id() ==
+            tab_id) {
+          if (browser)
+            *browser = target_browser;
+          if (tab_strip)
+            *tab_strip = target_tab_strip;
+          if (contents)
+            *contents = target_contents;
+          if (tab_index)
+            *tab_index = i;
+          return true;
+        }
+      }
+    }
+  }
+  return false;
+}
diff --git a/chrome/browser/extensions/extension_tab_util.h b/chrome/browser/extensions/extension_tab_util.h
new file mode 100644
index 0000000..5dfb36f
--- /dev/null
+++ b/chrome/browser/extensions/extension_tab_util.h
@@ -0,0 +1,60 @@
+// Copyright (c) 2011 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.
+
+#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_TAB_UTIL_H__
+#define CHROME_BROWSER_EXTENSIONS_EXTENSION_TAB_UTIL_H__
+#pragma once
+
+#include <string>
+
+class Browser;
+class Profile;
+class TabContents;
+class TabContentsWrapper;
+class TabStripModel;
+
+namespace base {
+class DictionaryValue;
+class ListValue;
+}
+
+// Provides various utility functions that help manipulate tabs.
+class ExtensionTabUtil {
+ public:
+  static int GetWindowId(const Browser* browser);
+  static int GetTabId(const TabContents* tab_contents);
+  static bool GetTabIdFromArgument(const base::ListValue &args,
+                                   int argument_index,
+                                   int *tab_id, std::string* error_message);
+  static std::string GetTabStatusText(bool is_loading);
+  static int GetWindowIdOfTab(const TabContents* tab_contents);
+  static base::ListValue* CreateTabList(const Browser* browser);
+  static base::DictionaryValue* CreateTabValue(
+      const TabContents* tab_contents);
+  static base::DictionaryValue* CreateTabValue(const TabContents* tab_contents,
+                                               TabStripModel* tab_strip,
+                                               int tab_index);
+  // Create a tab value, overriding its kSelectedKey to the provided boolean.
+  static base::DictionaryValue* CreateTabValueActive(
+      const TabContents* tab_contents,
+      bool active);
+  static base::DictionaryValue* CreateWindowValue(const Browser* browser,
+                                                  bool populate_tabs);
+  // Gets the |tab_strip_model| and |tab_index| for the given |tab_contents|.
+  static bool GetTabStripModel(const TabContents* tab_contents,
+                               TabStripModel** tab_strip_model,
+                               int* tab_index);
+  static bool GetDefaultTab(Browser* browser,
+                            TabContentsWrapper** contents,
+                            int* tab_id);
+  // Any out parameter (|browser|, |tab_strip|, |contents|, & |tab_index|) may
+  // be NULL and will not be set within the function.
+  static bool GetTabById(int tab_id, Profile* profile, bool incognito_enabled,
+                         Browser** browser,
+                         TabStripModel** tab_strip,
+                         TabContentsWrapper** contents,
+                         int* tab_index);
+};
+
+#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_TAB_UTIL_H__
diff --git a/chrome/browser/extensions/extension_tabs_module.cc b/chrome/browser/extensions/extension_tabs_module.cc
index 901029b..7367e77 100644
--- a/chrome/browser/extensions/extension_tabs_module.cc
+++ b/chrome/browser/extensions/extension_tabs_module.cc
@@ -17,6 +17,7 @@
 #include "chrome/browser/extensions/extension_function_dispatcher.h"
 #include "chrome/browser/extensions/extension_host.h"
 #include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/extensions/extension_tabs_module_constants.h"
 #include "chrome/browser/net/url_fixer_upper.h"
 #include "chrome/browser/prefs/incognito_mode_prefs.h"
@@ -119,17 +120,6 @@
   return url;
 }
 
-// Return the type name for a browser window type.
-std::string GetWindowTypeText(const Browser* browser) {
-  if (browser->is_type_popup())
-    return keys::kWindowTypeValuePopup;
-  if (browser->is_type_panel())
-    return keys::kWindowTypeValuePanel;
-  if (browser->is_app())
-    return keys::kWindowTypeValueApp;
-  return keys::kWindowTypeValueNormal;
-}
-
 bool IsCrashURL(const GURL& url) {
   // Check a fixed-up URL, to normalize the scheme and parse hosts correctly.
   GURL fixed_url =
@@ -141,193 +131,6 @@
 
 }  // namespace
 
-int ExtensionTabUtil::GetWindowId(const Browser* browser) {
-  return browser->session_id().id();
-}
-
-// TODO(sky): this function should really take a TabContentsWrapper.
-int ExtensionTabUtil::GetTabId(const TabContents* tab_contents) {
-  const TabContentsWrapper* tab =
-      TabContentsWrapper::GetCurrentWrapperForContents(tab_contents);
-  return tab ? tab->restore_tab_helper()->session_id().id() : -1;
-}
-
-std::string ExtensionTabUtil::GetTabStatusText(bool is_loading) {
-  return is_loading ? keys::kStatusValueLoading : keys::kStatusValueComplete;
-}
-
-// TODO(sky): this function should really take a TabContentsWrapper.
-int ExtensionTabUtil::GetWindowIdOfTab(const TabContents* tab_contents) {
-  const TabContentsWrapper* tab =
-      TabContentsWrapper::GetCurrentWrapperForContents(tab_contents);
-  return tab ? tab->restore_tab_helper()->window_id().id() : -1;
-}
-
-DictionaryValue* ExtensionTabUtil::CreateTabValue(
-    const TabContents* contents) {
-  // Find the tab strip and index of this guy.
-  TabStripModel* tab_strip = NULL;
-  int tab_index;
-  if (ExtensionTabUtil::GetTabStripModel(contents, &tab_strip, &tab_index))
-    return ExtensionTabUtil::CreateTabValue(contents, tab_strip, tab_index);
-
-  // Couldn't find it.  This can happen if the tab is being dragged.
-  return ExtensionTabUtil::CreateTabValue(contents, NULL, -1);
-}
-
-ListValue* ExtensionTabUtil::CreateTabList(const Browser* browser) {
-  ListValue* tab_list = new ListValue();
-  TabStripModel* tab_strip = browser->tabstrip_model();
-  for (int i = 0; i < tab_strip->count(); ++i) {
-    tab_list->Append(ExtensionTabUtil::CreateTabValue(
-        tab_strip->GetTabContentsAt(i)->tab_contents(), tab_strip, i));
-  }
-
-  return tab_list;
-}
-
-DictionaryValue* ExtensionTabUtil::CreateTabValue(const TabContents* contents,
-                                                  TabStripModel* tab_strip,
-                                                  int tab_index) {
-  DictionaryValue* result = new DictionaryValue();
-  bool is_loading = contents->IsLoading();
-  result->SetInteger(keys::kIdKey, ExtensionTabUtil::GetTabId(contents));
-  result->SetInteger(keys::kIndexKey, tab_index);
-  result->SetInteger(keys::kWindowIdKey,
-                     ExtensionTabUtil::GetWindowIdOfTab(contents));
-  result->SetString(keys::kUrlKey, contents->GetURL().spec());
-  result->SetString(keys::kStatusKey, GetTabStatusText(is_loading));
-  result->SetBoolean(keys::kSelectedKey,
-                     tab_strip && tab_index == tab_strip->active_index());
-  result->SetBoolean(keys::kPinnedKey,
-                     tab_strip && tab_strip->IsTabPinned(tab_index));
-  result->SetString(keys::kTitleKey, contents->GetTitle());
-  result->SetBoolean(keys::kIncognitoKey,
-                     contents->browser_context()->IsOffTheRecord());
-
-  if (!is_loading) {
-    NavigationEntry* entry = contents->controller().GetActiveEntry();
-    if (entry) {
-      if (entry->favicon().is_valid())
-        result->SetString(keys::kFaviconUrlKey, entry->favicon().url().spec());
-    }
-  }
-
-  return result;
-}
-
-DictionaryValue* ExtensionTabUtil::CreateTabValueActive(
-    const TabContents* contents,
-    bool active) {
-  DictionaryValue* result = ExtensionTabUtil::CreateTabValue(contents);
-  result->SetBoolean(keys::kSelectedKey, active);
-  return result;
-}
-
-// if |populate| is true, each window gets a list property |tabs| which contains
-// fully populated tab objects.
-DictionaryValue* ExtensionTabUtil::CreateWindowValue(const Browser* browser,
-                                                     bool populate_tabs) {
-  DCHECK(browser);
-  DCHECK(browser->window());
-  DictionaryValue* result = new DictionaryValue();
-  result->SetInteger(keys::kIdKey, ExtensionTabUtil::GetWindowId(browser));
-  result->SetBoolean(keys::kIncognitoKey,
-                     browser->profile()->IsOffTheRecord());
-  result->SetBoolean(keys::kFocusedKey, browser->window()->IsActive());
-  gfx::Rect bounds;
-  if (browser->window()->IsMaximized() || browser->window()->IsFullscreen())
-    bounds = browser->window()->GetBounds();
-  else
-    bounds = browser->window()->GetRestoredBounds();
-
-  result->SetInteger(keys::kLeftKey, bounds.x());
-  result->SetInteger(keys::kTopKey, bounds.y());
-  result->SetInteger(keys::kWidthKey, bounds.width());
-  result->SetInteger(keys::kHeightKey, bounds.height());
-  result->SetString(keys::kWindowTypeKey, GetWindowTypeText(browser));
-
-  if (populate_tabs) {
-    result->Set(keys::kTabsKey, ExtensionTabUtil::CreateTabList(browser));
-  }
-
-  return result;
-}
-
-bool ExtensionTabUtil::GetTabStripModel(const TabContents* tab_contents,
-                                        TabStripModel** tab_strip_model,
-                                        int* tab_index) {
-  DCHECK(tab_contents);
-  DCHECK(tab_strip_model);
-  DCHECK(tab_index);
-
-  for (BrowserList::const_iterator it = BrowserList::begin();
-      it != BrowserList::end(); ++it) {
-    TabStripModel* tab_strip = (*it)->tabstrip_model();
-    int index = tab_strip->GetWrapperIndex(tab_contents);
-    if (index != -1) {
-      *tab_strip_model = tab_strip;
-      *tab_index = index;
-      return true;
-    }
-  }
-
-  return false;
-}
-
-bool ExtensionTabUtil::GetDefaultTab(Browser* browser,
-                                     TabContentsWrapper** contents,
-                                     int* tab_id) {
-  DCHECK(browser);
-  DCHECK(contents);
-
-  *contents = browser->GetSelectedTabContentsWrapper();
-  if (*contents) {
-    if (tab_id)
-      *tab_id = ExtensionTabUtil::GetTabId((*contents)->tab_contents());
-    return true;
-  }
-
-  return false;
-}
-
-bool ExtensionTabUtil::GetTabById(int tab_id,
-                                  Profile* profile,
-                                  bool include_incognito,
-                                  Browser** browser,
-                                  TabStripModel** tab_strip,
-                                  TabContentsWrapper** contents,
-                                  int* tab_index) {
-  Profile* incognito_profile =
-      include_incognito && profile->HasOffTheRecordProfile() ?
-          profile->GetOffTheRecordProfile() : NULL;
-  for (BrowserList::const_iterator iter = BrowserList::begin();
-       iter != BrowserList::end(); ++iter) {
-    Browser* target_browser = *iter;
-    if (target_browser->profile() == profile ||
-        target_browser->profile() == incognito_profile) {
-      TabStripModel* target_tab_strip = target_browser->tabstrip_model();
-      for (int i = 0; i < target_tab_strip->count(); ++i) {
-        TabContentsWrapper* target_contents =
-            target_tab_strip->GetTabContentsAt(i);
-        if (target_contents->restore_tab_helper()->session_id().id() ==
-            tab_id) {
-          if (browser)
-            *browser = target_browser;
-          if (tab_strip)
-            *tab_strip = target_tab_strip;
-          if (contents)
-            *contents = target_contents;
-          if (tab_index)
-            *tab_index = i;
-          return true;
-        }
-      }
-    }
-  }
-  return false;
-}
-
 // Windows ---------------------------------------------------------------------
 
 bool GetWindowFunction::RunImpl() {
diff --git a/chrome/browser/extensions/extension_tabs_module.h b/chrome/browser/extensions/extension_tabs_module.h
index 0dd8e3be..a248c47 100644
--- a/chrome/browser/extensions/extension_tabs_module.h
+++ b/chrome/browser/extensions/extension_tabs_module.h
@@ -15,47 +15,7 @@
 #include "content/common/notification_registrar.h"
 
 class BackingStore;
-class Browser;
 class SkBitmap;
-class TabContents;
-class TabContentsWrapper;
-class TabStripModel;
-
-namespace base {
-class DictionaryValue;
-class ListValue;
-}
-
-namespace ExtensionTabUtil {
-int GetWindowId(const Browser* browser);
-int GetTabId(const TabContents* tab_contents);
-std::string GetTabStatusText(bool is_loading);
-int GetWindowIdOfTab(const TabContents* tab_contents);
-base::ListValue* CreateTabList(const Browser* browser);
-base::DictionaryValue* CreateTabValue(const TabContents* tab_contents);
-base::DictionaryValue* CreateTabValue(const TabContents* tab_contents,
-                                      TabStripModel* tab_strip,
-                                      int tab_index);
-// Create a tab value, overriding its kSelectedKey to the provided boolean.
-base::DictionaryValue* CreateTabValueActive(const TabContents* tab_contents,
-                                            bool active);
-base::DictionaryValue* CreateWindowValue(const Browser* browser,
-                                         bool populate_tabs);
-// Gets the |tab_strip_model| and |tab_index| for the given |tab_contents|.
-bool GetTabStripModel(const TabContents* tab_contents,
-                      TabStripModel** tab_strip_model,
-                      int* tab_index);
-bool GetDefaultTab(Browser* browser,
-                   TabContentsWrapper** contents,
-                   int* tab_id);
-// Any out parameter (|browser|, |tab_strip|, |contents|, & |tab_index|) may
-// be NULL and will not be set within the function.
-bool GetTabById(int tab_id, Profile* profile, bool incognito_enabled,
-                Browser** browser,
-                TabStripModel** tab_strip,
-                TabContentsWrapper** contents,
-                int* tab_index);
-}
 
 // Windows
 class GetWindowFunction : public SyncExtensionFunction {
diff --git a/chrome/browser/extensions/extension_webnavigation_api.cc b/chrome/browser/extensions/extension_webnavigation_api.cc
index 84c00747..66643ee 100644
--- a/chrome/browser/extensions/extension_webnavigation_api.cc
+++ b/chrome/browser/extensions/extension_webnavigation_api.cc
@@ -12,7 +12,7 @@
 #include "base/time.h"
 #include "base/values.h"
 #include "chrome/browser/extensions/extension_event_router.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/extensions/extension_webnavigation_api_constants.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
diff --git a/chrome/browser/extensions/page_action_apitest.cc b/chrome/browser/extensions/page_action_apitest.cc
index 4ee3be1..3cb8f09c 100644
--- a/chrome/browser/extensions/page_action_apitest.cc
+++ b/chrome/browser/extensions/page_action_apitest.cc
@@ -4,16 +4,16 @@
 
 #include "chrome/browser/extensions/extension_apitest.h"
 #include "chrome/browser/extensions/extension_browser_event_router.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
 #include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/sessions/restore_tab_helper.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/omnibox/location_bar.h"
 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
-#include "chrome/common/extensions/extension_action.h"
 #include "chrome/common/extensions/extension.h"
+#include "chrome/common/extensions/extension_action.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "content/browser/tab_contents/tab_contents.h"
 
diff --git a/chrome/browser/ui/cocoa/extensions/extension_action_context_menu.mm b/chrome/browser/ui/cocoa/extensions/extension_action_context_menu.mm
index 3d8b1a0..55a0c86 100644
--- a/chrome/browser/ui/cocoa/extensions/extension_action_context_menu.mm
+++ b/chrome/browser/ui/cocoa/extensions/extension_action_context_menu.mm
@@ -7,7 +7,7 @@
 #include "base/sys_string_conversions.h"
 #include "base/task.h"
 #include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/extensions/extension_uninstall_dialog.h"
 #include "chrome/browser/prefs/pref_change_registrar.h"
 #include "chrome/browser/prefs/pref_service.h"
diff --git a/chrome/browser/ui/cocoa/location_bar/page_action_decoration.mm b/chrome/browser/ui/cocoa/location_bar/page_action_decoration.mm
index 22a86e4..40425f19 100644
--- a/chrome/browser/ui/cocoa/location_bar/page_action_decoration.mm
+++ b/chrome/browser/ui/cocoa/location_bar/page_action_decoration.mm
@@ -9,6 +9,7 @@
 #include "base/sys_string_conversions.h"
 #include "chrome/browser/extensions/extension_browser_event_router.h"
 #include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/profiles/profile.h"
 #import "chrome/browser/ui/cocoa/extensions/extension_action_context_menu.h"
 #import "chrome/browser/ui/cocoa/extensions/extension_popup_controller.h"
diff --git a/chrome/browser/ui/gtk/location_bar_view_gtk.cc b/chrome/browser/ui/gtk/location_bar_view_gtk.cc
index 1775503b..1a4e3d4 100644
--- a/chrome/browser/ui/gtk/location_bar_view_gtk.cc
+++ b/chrome/browser/ui/gtk/location_bar_view_gtk.cc
@@ -22,7 +22,7 @@
 #include "chrome/browser/defaults.h"
 #include "chrome/browser/extensions/extension_browser_event_router.h"
 #include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/favicon/favicon_tab_helper.h"
 #include "chrome/browser/instant/instant_controller.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/ui/views/location_bar/page_action_image_view.cc b/chrome/browser/ui/views/location_bar/page_action_image_view.cc
index a7fa6f03..395720a5 100644
--- a/chrome/browser/ui/views/location_bar/page_action_image_view.cc
+++ b/chrome/browser/ui/views/location_bar/page_action_image_view.cc
@@ -7,6 +7,7 @@
 #include "base/utf_string_conversions.h"
 #include "chrome/browser/extensions/extension_browser_event_router.h"
 #include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/platform_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser_list.h"
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 8076c8a..72232ac8 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -1113,6 +1113,8 @@
         'browser/extensions/extension_tab_helper.h',
         'browser/extensions/extension_tab_id_map.cc',
         'browser/extensions/extension_tab_id_map.h',
+        'browser/extensions/extension_tab_util.cc',
+        'browser/extensions/extension_tab_util.h',
         'browser/extensions/extension_tabs_module.cc',
         'browser/extensions/extension_tabs_module.h',
         'browser/extensions/extension_tabs_module_constants.cc',