Index: chrome/browser/extensions/extension_tab_util_athena.cc |
diff --git a/chrome/browser/extensions/extension_tab_util_athena.cc b/chrome/browser/extensions/extension_tab_util_athena.cc |
index cdfe7a1e0cea4db76774ae3898ed58a48d354856..a8ae56e9cb9a6579032cce51c75e3ac60cbadfd5 100644 |
--- a/chrome/browser/extensions/extension_tab_util_athena.cc |
+++ b/chrome/browser/extensions/extension_tab_util_athena.cc |
@@ -7,14 +7,40 @@ |
#include "base/logging.h" |
#include "base/values.h" |
#include "chrome/browser/extensions/api/tabs/tabs_constants.h" |
+#include "chrome/browser/extensions/window_controller.h" |
+#include "chrome/browser/extensions/window_controller_list.h" |
+#include "chrome/browser/sessions/session_tab_helper.h" |
+#include "content/public/browser/browser_context.h" |
+#include "content/public/browser/favicon_status.h" |
+#include "content/public/browser/navigation_entry.h" |
+#include "extensions/browser/app_window/app_window.h" |
+#include "extensions/browser/app_window/app_window_registry.h" |
#include "url/gurl.h" |
+using content::NavigationEntry; |
using content::WebContents; |
namespace extensions { |
namespace keys = tabs_constants; |
+namespace { |
+ |
+WindowController* GetAppWindowController(const WebContents* contents) { |
+ AppWindowRegistry* registry = |
+ AppWindowRegistry::Get(contents->GetBrowserContext()); |
+ if (!registry) |
+ return NULL; |
+ AppWindow* app_window = |
+ registry->GetAppWindowForRenderViewHost(contents->GetRenderViewHost()); |
+ if (!app_window) |
+ return NULL; |
+ return WindowControllerList::GetInstance()->FindWindowById( |
+ app_window->session_id().id()); |
+} |
+ |
+} // namespace |
+ |
ExtensionTabUtil::OpenTabParams::OpenTabParams() |
: create_browser_if_needed(false) { |
} |
@@ -60,18 +86,15 @@ int ExtensionTabUtil::GetWindowIdOfTabStripModel( |
} |
int ExtensionTabUtil::GetTabId(const WebContents* web_contents) { |
- NOTIMPLEMENTED(); |
- return -1; |
+ return SessionTabHelper::IdForTab(web_contents); |
} |
std::string ExtensionTabUtil::GetTabStatusText(bool is_loading) { |
- NOTIMPLEMENTED(); |
- return keys::kStatusValueComplete; |
+ return is_loading ? keys::kStatusValueLoading : keys::kStatusValueComplete; |
} |
int ExtensionTabUtil::GetWindowIdOfTab(const WebContents* web_contents) { |
- NOTIMPLEMENTED(); |
- return -1; |
+ return SessionTabHelper::IdForWindowContainingTab(web_contents); |
} |
base::DictionaryValue* ExtensionTabUtil::CreateTabValue( |
@@ -93,8 +116,43 @@ base::DictionaryValue* ExtensionTabUtil::CreateTabValue( |
WebContents* contents, |
TabStripModel* tab_strip, |
int tab_index) { |
- NOTREACHED(); |
- return NULL; |
+ // There's no TabStrip in Athena. |
+ DCHECK(!tab_strip); |
+ |
+ // If we have a matching AppWindow with a controller, get the tab value |
+ // from its controller instead. |
+ WindowController* controller = GetAppWindowController(contents); |
+ if (controller) |
+ return controller->CreateTabValue(NULL, tab_index); |
+ |
+ base::DictionaryValue* result = new base::DictionaryValue(); |
+ bool is_loading = contents->IsLoading(); |
+ result->SetInteger(keys::kIdKey, GetTabId(contents)); |
+ result->SetInteger(keys::kIndexKey, tab_index); |
+ result->SetInteger(keys::kWindowIdKey, GetWindowIdOfTab(contents)); |
+ result->SetString(keys::kStatusKey, GetTabStatusText(is_loading)); |
+ result->SetBoolean(keys::kActiveKey, false); |
+ result->SetBoolean(keys::kSelectedKey, false); |
+ result->SetBoolean(keys::kHighlightedKey, false); |
+ result->SetBoolean(keys::kPinnedKey, false); |
+ result->SetBoolean(keys::kIncognitoKey, |
+ contents->GetBrowserContext()->IsOffTheRecord()); |
+ result->SetInteger(keys::kWidthKey, |
+ contents->GetContainerBounds().size().width()); |
+ result->SetInteger(keys::kHeightKey, |
+ contents->GetContainerBounds().size().height()); |
+ |
+ // Privacy-sensitive fields: these should be stripped off by |
+ // ScrubTabValueForExtension if the extension should not see them. |
+ result->SetString(keys::kUrlKey, contents->GetURL().spec()); |
+ result->SetString(keys::kTitleKey, contents->GetTitle()); |
+ if (!is_loading) { |
+ NavigationEntry* entry = contents->GetController().GetVisibleEntry(); |
+ if (entry && entry->GetFavicon().valid) |
+ result->SetString(keys::kFaviconUrlKey, entry->GetFavicon().url.spec()); |
+ } |
+ |
+ return result; |
} |
void ExtensionTabUtil::ScrubTabValueForExtension( |
@@ -114,6 +172,7 @@ bool ExtensionTabUtil::GetTabStripModel(const WebContents* web_contents, |
TabStripModel** tab_strip_model, |
int* tab_index) { |
NOTIMPLEMENTED(); |
+ |
return false; |
} |
@@ -168,7 +227,7 @@ WindowController* ExtensionTabUtil::GetWindowControllerOfTab( |
void ExtensionTabUtil::OpenOptionsPage(const Extension* extension, |
Browser* browser) { |
- // NOTIMPLEMENTED(); |
+ NOTIMPLEMENTED(); |
} |
} // namespace extensions |