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..06919370e147bf0a4fbbedf7ac11e65c4778e6d8 100644 |
--- a/chrome/browser/extensions/extension_tab_util_athena.cc |
+++ b/chrome/browser/extensions/extension_tab_util_athena.cc |
@@ -7,14 +7,41 @@ |
#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 "chrome/browser/ui/tabs/tab_strip_model.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 +87,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 +117,53 @@ base::DictionaryValue* ExtensionTabUtil::CreateTabValue( |
WebContents* contents, |
TabStripModel* tab_strip, |
oshima
2014/10/27 13:44:38
do you know who/where creates tab_strip on athea?
Nikita (slow)
2014/10/27 15:07:27
It's actually passed as NULL.
|
int tab_index) { |
- NOTREACHED(); |
- return NULL; |
+ // 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); |
+ |
+ if (!tab_strip) |
+ ExtensionTabUtil::GetTabStripModel(contents, &tab_strip, &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, |
+ tab_strip && tab_index == tab_strip->active_index()); |
+ result->SetBoolean(keys::kSelectedKey, |
+ tab_strip && tab_index == tab_strip->active_index()); |
+ result->SetBoolean(keys::kHighlightedKey, |
+ tab_strip && tab_strip->IsTabSelected(tab_index)); |
+ result->SetBoolean(keys::kPinnedKey, |
+ tab_strip && tab_strip->IsTabPinned(tab_index)); |
+ 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()); |
+ } |
+ |
+ if (tab_strip) { |
+ WebContents* opener = tab_strip->GetOpenerOfWebContentsAt(tab_index); |
+ if (opener) |
+ result->SetInteger(keys::kOpenerTabIdKey, GetTabId(opener)); |
+ } |
+ |
+ return result; |
} |
void ExtensionTabUtil::ScrubTabValueForExtension( |
@@ -114,6 +183,7 @@ bool ExtensionTabUtil::GetTabStripModel(const WebContents* web_contents, |
TabStripModel** tab_strip_model, |
int* tab_index) { |
NOTIMPLEMENTED(); |
+ |
return false; |
} |
@@ -168,7 +238,7 @@ WindowController* ExtensionTabUtil::GetWindowControllerOfTab( |
void ExtensionTabUtil::OpenOptionsPage(const Extension* extension, |
Browser* browser) { |
- // NOTIMPLEMENTED(); |
+ NOTIMPLEMENTED(); |
} |
} // namespace extensions |