diff options
author | creis@google.com <creis@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-12-05 23:20:27 +0000 |
---|---|---|
committer | creis@google.com <creis@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-12-05 23:20:27 +0000 |
commit | ffb204f2827d3ce9974c0969fc4f470ab35892aa (patch) | |
tree | ccd77a1ea80100e7c8609ce559b6714850934e4f /chrome/browser/task_manager | |
parent | d99bcaae9af32923a53f3c448cf95cbf7ad20775 (diff) | |
download | chromium_src-ffb204f2827d3ce9974c0969fc4f470ab35892aa.zip chromium_src-ffb204f2827d3ce9974c0969fc4f470ab35892aa.tar.gz chromium_src-ffb204f2827d3ce9974c0969fc4f470ab35892aa.tar.bz2 |
Show extension tabs in task manager and correctly label apps.
BUG=31526
BUG=60840
TEST=TaskManagerBrowserTest.NoticeExtensionTabs
TEST=TaskManagerBrowserTest.NoticeAppTabs
Review URL: http://codereview.chromium.org/5526002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@68324 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/task_manager')
3 files changed, 125 insertions, 15 deletions
diff --git a/chrome/browser/task_manager/task_manager_browsertest.cc b/chrome/browser/task_manager/task_manager_browsertest.cc index 64bf8ce7..d2337ed 100644 --- a/chrome/browser/task_manager/task_manager_browsertest.cc +++ b/chrome/browser/task_manager/task_manager_browsertest.cc @@ -11,6 +11,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/extensions/crashed_extension_infobar.h" #include "chrome/browser/extensions/extension_browsertest.h" +#include "chrome/browser/extensions/extensions_service.h" #include "chrome/browser/notifications/desktop_notification_service.h" #include "chrome/browser/notifications/notification.h" #include "chrome/browser/notifications/notification_test_util.h" @@ -106,6 +107,13 @@ IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, NoticeTabContentsChanges) { AddTabAtIndex(0, url, PageTransition::TYPED); WaitForResourceChange(3); + // Check that the third entry is a tab contents resource whose title starts + // starts with "Tab:". + ASSERT_TRUE(model()->GetResourceTabContents(2) != NULL); + string16 prefix = WideToUTF16Hack(l10n_util::GetStringF( + IDS_TASK_MANAGER_TAB_PREFIX, L"")); + ASSERT_TRUE(StartsWith(model()->GetResourceTitle(2), prefix, true)); + // Close the tab and verify that we notice. TabContents* first_tab = browser()->GetTabContentsAt(0); ASSERT_TRUE(first_tab); @@ -166,6 +174,78 @@ IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, MAYBE_NoticeExtensionChanges) { WaitForResourceChange(3); } +IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, NoticeExtensionTabs) { + // Show the task manager. This populates the model, and helps with debugging + // (you see the task manager). + browser()->window()->ShowTaskManager(); + + ASSERT_TRUE(LoadExtension( + test_data_dir_.AppendASCII("good").AppendASCII("Extensions") + .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") + .AppendASCII("1.0.0.0"))); + + // Browser, Extension background page, and the New Tab Page. + WaitForResourceChange(3); + + // Open a new tab to an extension URL and make sure we notice that. + GURL url("chrome-extension://behllobkkfkfnphdnhnkndlbkcpglgmj/page.html"); + AddTabAtIndex(0, url, PageTransition::TYPED); + WaitForResourceChange(4); + + // Check that the third entry (background) is an extension resource whose + // title starts with "Extension:". + ASSERT_EQ(TaskManager::Resource::EXTENSION, model()->GetResourceType(2)); + ASSERT_TRUE(model()->GetResourceTabContents(2) == NULL); + ASSERT_TRUE(model()->GetResourceExtension(2) != NULL); + string16 prefix = WideToUTF16Hack(l10n_util::GetStringF( + IDS_TASK_MANAGER_EXTENSION_PREFIX, L"")); + ASSERT_TRUE(StartsWith(model()->GetResourceTitle(2), prefix, true)); + + // Check that the fourth entry (page.html) is of type extension and has both + // a tab contents and an extension. The title should start with "Extension:". + ASSERT_EQ(TaskManager::Resource::EXTENSION, model()->GetResourceType(3)); + ASSERT_TRUE(model()->GetResourceTabContents(3) != NULL); + ASSERT_TRUE(model()->GetResourceExtension(3) != NULL); + ASSERT_TRUE(StartsWith(model()->GetResourceTitle(3), prefix, true)); + + // Unload extension to avoid crash on Windows. + UnloadExtension(last_loaded_extension_id_); + WaitForResourceChange(2); +} + +IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, NoticeAppTabs) { + // Show the task manager. This populates the model, and helps with debugging + // (you see the task manager). + browser()->window()->ShowTaskManager(); + + ASSERT_TRUE(LoadExtension( + test_data_dir_.AppendASCII("packaged_app"))); + ExtensionsService* service = browser()->profile()->GetExtensionsService(); + const Extension* extension = + service->GetExtensionById(last_loaded_extension_id_, false); + + // Browser and the New Tab Page. + WaitForResourceChange(2); + + // Open a new tab to the app's launch URL and make sure we notice that. + GURL url(extension->GetResourceURL("main.html")); + AddTabAtIndex(0, url, PageTransition::TYPED); + WaitForResourceChange(3); + + // Check that the third entry (main.html) is of type extension and has both + // a tab contents and an extension. The title should start with "App:". + ASSERT_EQ(TaskManager::Resource::EXTENSION, model()->GetResourceType(2)); + ASSERT_TRUE(model()->GetResourceTabContents(2) != NULL); + ASSERT_TRUE(model()->GetResourceExtension(2) != NULL); + string16 prefix = WideToUTF16Hack(l10n_util::GetStringF( + IDS_TASK_MANAGER_APP_PREFIX, L"")); + ASSERT_TRUE(StartsWith(model()->GetResourceTitle(2), prefix, true)); + + // Unload extension to avoid crash on Windows. + UnloadExtension(last_loaded_extension_id_); + WaitForResourceChange(2); +} + IN_PROC_BROWSER_TEST_F(TaskManagerBrowserTest, NoticeNotificationChanges) { EXPECT_EQ(0, model()->ResourceCount()); diff --git a/chrome/browser/task_manager/task_manager_resource_providers.cc b/chrome/browser/task_manager/task_manager_resource_providers.cc index f3dc3ff..e7b76e6 100644 --- a/chrome/browser/task_manager/task_manager_resource_providers.cc +++ b/chrome/browser/task_manager/task_manager_resource_providers.cc @@ -50,6 +50,24 @@ #include "gfx/icon_util.h" #endif // defined(OS_WIN) +namespace { + +// Returns the appropriate message prefix ID for tabs and extensions, +// reflecting whether they are apps or in incognito mode. +int GetMessagePrefixID(bool is_app, bool is_extension, + bool is_off_the_record) { + return is_app ? + (is_off_the_record ? + IDS_TASK_MANAGER_APP_INCOGNITO_PREFIX : + IDS_TASK_MANAGER_APP_PREFIX) : + (is_extension ? + (is_off_the_record ? + IDS_TASK_MANAGER_EXTENSION_INCOGNITO_PREFIX : + IDS_TASK_MANAGER_EXTENSION_PREFIX) : + IDS_TASK_MANAGER_TAB_PREFIX); +} + +} // namespace //////////////////////////////////////////////////////////////////////////////// // TaskManagerRendererResource class @@ -131,6 +149,10 @@ TaskManagerTabContentsResource::TaskManagerTabContentsResource( TaskManagerTabContentsResource::~TaskManagerTabContentsResource() { } +TaskManager::Resource::Type TaskManagerTabContentsResource::GetType() const { + return tab_contents_->HostsExtension() ? EXTENSION : RENDERER; +} + std::wstring TaskManagerTabContentsResource::GetTitle() const { // Fall back on the URL if there's no title. std::wstring tab_title(UTF16ToWideHack(tab_contents_->GetTitle())); @@ -152,10 +174,15 @@ std::wstring TaskManagerTabContentsResource::GetTitle() const { base::i18n::AdjustStringForLocaleDirection(&tab_title); } - return l10n_util::GetStringF(IDS_TASK_MANAGER_TAB_PREFIX, tab_title); + ExtensionsService* extensions_service = + tab_contents_->profile()->GetExtensionsService(); + int message_id = GetMessagePrefixID( + extensions_service->IsInstalledApp(tab_contents_->GetURL()), + tab_contents_->HostsExtension(), + tab_contents_->profile()->IsOffTheRecord()); + return l10n_util::GetStringF(message_id, tab_title); } - SkBitmap TaskManagerTabContentsResource::GetIcon() const { return tab_contents_->GetFavIcon(); } @@ -164,6 +191,16 @@ TabContents* TaskManagerTabContentsResource::GetTabContents() const { return static_cast<TabContents*>(tab_contents_); } +const Extension* TaskManagerTabContentsResource::GetExtension() const { + if (tab_contents_->HostsExtension()) { + ExtensionsService* extensions_service = + tab_contents_->profile()->GetExtensionsService(); + return extensions_service->GetExtensionByURL(tab_contents_->GetURL()); + } + + return NULL; +} + //////////////////////////////////////////////////////////////////////////////// // TaskManagerTabContentsResourceProvider class //////////////////////////////////////////////////////////////////////////////// @@ -267,11 +304,8 @@ void TaskManagerTabContentsResourceProvider::Add(TabContents* tab_contents) { return; // Don't add dead tabs or tabs that haven't yet connected. - // Also ignore tabs which display extension content. We collapse - // all of these into one extension row. if (!tab_contents->GetRenderProcessHost()->GetHandle() || - !tab_contents->notify_disconnection() || - tab_contents->HostsExtension()) { + !tab_contents->notify_disconnection()) { return; } @@ -826,14 +860,8 @@ TaskManagerExtensionProcessResource::TaskManagerExtensionProcessResource( std::wstring extension_name(UTF8ToWide(GetExtension()->name())); DCHECK(!extension_name.empty()); - int message_id = - GetExtension()->is_app() ? - (extension_host_->profile()->IsOffTheRecord() ? - IDS_TASK_MANAGER_APP_INCOGNITO_PREFIX : - IDS_TASK_MANAGER_APP_PREFIX) : - (extension_host_->profile()->IsOffTheRecord() ? - IDS_TASK_MANAGER_EXTENSION_INCOGNITO_PREFIX : - IDS_TASK_MANAGER_EXTENSION_PREFIX); + int message_id = GetMessagePrefixID(GetExtension()->is_app(), true, + extension_host_->profile()->IsOffTheRecord()); title_ = l10n_util::GetStringF(message_id, extension_name); } diff --git a/chrome/browser/task_manager/task_manager_resource_providers.h b/chrome/browser/task_manager/task_manager_resource_providers.h index 9c4e8c4..4c61b34 100644 --- a/chrome/browser/task_manager/task_manager_resource_providers.h +++ b/chrome/browser/task_manager/task_manager_resource_providers.h @@ -36,7 +36,7 @@ class TaskManagerRendererResource : public TaskManager::Resource { // TaskManager::Resource methods: base::ProcessHandle GetProcess() const; - Type GetType() const { return RENDERER; } + virtual Type GetType() const { return RENDERER; } virtual bool ReportsCacheStats() const { return true; } virtual WebKit::WebCache::ResourceTypeStats GetWebCoreCacheStats() const; virtual bool ReportsV8MemoryStats() const { return true; } @@ -81,9 +81,11 @@ class TaskManagerTabContentsResource : public TaskManagerRendererResource { ~TaskManagerTabContentsResource(); // TaskManager::Resource methods: + virtual Type GetType() const; virtual std::wstring GetTitle() const; virtual SkBitmap GetIcon() const; virtual TabContents* GetTabContents() const; + virtual const Extension* GetExtension() const; private: TabContents* tab_contents_; |