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/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;
+}