Chromium Code Reviews| 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 |