From 31b34aacae32988cc01a0b249722973407912445 Mon Sep 17 00:00:00 2001 From: afakhry Date: Fri, 7 Aug 2015 10:55:56 -0700 Subject: New Task Manager - Phase 1.3.5: Implement Extension Task Providing CQ_INCLUDE_TRYBOTS=tryserver.chromium.linux:linux_site_isolation R=nick@chromium.org BUG=470994 TEST= Review URL: https://codereview.chromium.org/1254103002 Cr-Commit-Position: refs/heads/master@{#342377} --- .../apps/guest_view/web_view_browsertest.cc | 16 +++- .../extensions/chrome_extensions_browser_client.cc | 33 ++++++++ .../extensions/chrome_extensions_browser_client.h | 2 + .../providers/web_contents/extension_tag.cc | 36 ++++++++ .../providers/web_contents/extension_tag.h | 38 +++++++++ .../web_contents/extension_tag_browsertest.cc | 95 ++++++++++++++++++++++ .../providers/web_contents/extension_task.cc | 83 +++++++++++++++++++ .../providers/web_contents/extension_task.h | 43 ++++++++++ .../providers/web_contents/panel_task.cc | 5 +- .../providers/web_contents/renderer_task.cc | 7 +- .../providers/web_contents/renderer_task.h | 6 +- .../providers/web_contents/tab_contents_task.cc | 3 +- .../browser/task_management/web_contents_tags.cc | 34 ++++++++ chrome/browser/task_management/web_contents_tags.h | 11 +++ chrome/chrome_browser.gypi | 4 + chrome/chrome_tests.gypi | 1 + extensions/browser/extensions_browser_client.h | 7 ++ extensions/browser/view_type_utils.cc | 3 + 18 files changed, 416 insertions(+), 11 deletions(-) create mode 100644 chrome/browser/task_management/providers/web_contents/extension_tag.cc create mode 100644 chrome/browser/task_management/providers/web_contents/extension_tag.h create mode 100644 chrome/browser/task_management/providers/web_contents/extension_tag_browsertest.cc create mode 100644 chrome/browser/task_management/providers/web_contents/extension_task.cc create mode 100644 chrome/browser/task_management/providers/web_contents/extension_task.h diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc index c3e1c28..ef825f3 100644 --- a/chrome/browser/apps/guest_view/web_view_browsertest.cc +++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc @@ -2680,8 +2680,12 @@ IN_PROC_BROWSER_TEST_F(WebViewTest, TaskManagementPreExistingWebViews) { task_manager.StartObserving(); // The pre-existing tab and guest tasks are provided. - // TODO(afakhry): This will have to change once we start tracking extensions. - EXPECT_EQ(2U, task_manager.tasks().size()); + // 4 tasks expected in the following order: + // Tab: about:blank, + // Background Page: task manager test, + // App: task manager test, + // Webview: WebViewed test content. + EXPECT_EQ(4U, task_manager.tasks().size()); const task_management::Task* task = task_manager.tasks().back(); EXPECT_EQ(task_management::Task::GUEST, task->GetType()); @@ -2712,8 +2716,12 @@ IN_PROC_BROWSER_TEST_F(WebViewTest, TaskManagementPostExistingWebViews) { content::WebContents* guest_contents = LoadGuest("/extensions/platform_apps/web_view/task_manager/guest.html", "web_view/task_manager"); - // TODO(afakhry): This will have to change once we start tracking extensions. - EXPECT_EQ(2U, task_manager.tasks().size()); + // 4 tasks expected in the following order: + // Tab: about:blank, + // Background Page: task manager test, + // App: task manager test, + // Webview: WebViewed test content. + EXPECT_EQ(4U, task_manager.tasks().size()); const task_management::Task* task = task_manager.tasks().back(); EXPECT_EQ(task_management::Task::GUEST, task->GetType()); diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.cc b/chrome/browser/extensions/chrome_extensions_browser_client.cc index c19dad9..eace973 100644 --- a/chrome/browser/extensions/chrome_extensions_browser_client.cc +++ b/chrome/browser/extensions/chrome_extensions_browser_client.cc @@ -30,6 +30,7 @@ #include "chrome/browser/net/chrome_net_log.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/task_management/web_contents_tags.h" #include "chrome/common/channel_info.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" @@ -337,4 +338,36 @@ void ChromeExtensionsBrowserClient::CleanUpWebView( MenuItem::ExtensionKey("", embedder_process_id, view_instance_id)); } +void ChromeExtensionsBrowserClient::AttachExtensionTaskManagerTag( + content::WebContents* web_contents, + ViewType view_type) { + switch (view_type) { + case VIEW_TYPE_APP_WINDOW: + case VIEW_TYPE_EXTENSION_BACKGROUND_PAGE: + case VIEW_TYPE_EXTENSION_DIALOG: + case VIEW_TYPE_EXTENSION_POPUP: + case VIEW_TYPE_LAUNCHER_PAGE: + case VIEW_TYPE_VIRTUAL_KEYBOARD: + // These are the only types that are tracked by the ExtensionTag. + task_management::WebContentsTags::CreateForExtension(web_contents, + view_type); + return; + + case VIEW_TYPE_BACKGROUND_CONTENTS: + case VIEW_TYPE_PANEL: + case VIEW_TYPE_TAB_CONTENTS: + // Those types are tracked by other tags: + // BACKGROUND_CONTENTS --> task_management::BackgroundContentsTag. + // PANEL --> task_management::PanelTag. + // TAB_CONTENTS --> task_management::TabContentsTag. + // These tags are created and attached to the web_contents in other + // locations, and they must be ignored here. + return; + + case VIEW_TYPE_INVALID: + NOTREACHED(); + return; + } +} + } // namespace extensions diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.h b/chrome/browser/extensions/chrome_extensions_browser_client.h index 1ea21ee..852a27c 100644 --- a/chrome/browser/extensions/chrome_extensions_browser_client.h +++ b/chrome/browser/extensions/chrome_extensions_browser_client.h @@ -108,6 +108,8 @@ class ChromeExtensionsBrowserClient : public ExtensionsBrowserClient { void CleanUpWebView(content::BrowserContext* browser_context, int embedder_process_id, int view_instance_id) override; + void AttachExtensionTaskManagerTag(content::WebContents* web_contents, + ViewType view_type) override; private: friend struct base::DefaultLazyInstanceTraits; diff --git a/chrome/browser/task_management/providers/web_contents/extension_tag.cc b/chrome/browser/task_management/providers/web_contents/extension_tag.cc new file mode 100644 index 0000000..cf9879c --- /dev/null +++ b/chrome/browser/task_management/providers/web_contents/extension_tag.cc @@ -0,0 +1,36 @@ +// Copyright 2015 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/task_management/providers/web_contents/extension_tag.h" + +#include "content/public/browser/web_contents.h" + +#if defined(ENABLE_EXTENSIONS) +#include "extensions/browser/process_manager.h" +#endif + +namespace task_management { + +ExtensionTask* ExtensionTag::CreateTask() const { + // Upon being asked to create a task, it means that the site instance is ready + // and connected, and the render frames have been initialized. + // It's OK if the following returns nullptr, ExtensionTask will then get the + // title from the WebContents. + const extensions::Extension* extension = + extensions::ProcessManager::Get(web_contents()->GetBrowserContext())-> + GetExtensionForWebContents(web_contents()); + + return new ExtensionTask(web_contents(), extension, view_type_); +} + +ExtensionTag::ExtensionTag(content::WebContents* web_contents, + const extensions::ViewType view_type) + : WebContentsTag(web_contents), + view_type_(view_type) { +} + +ExtensionTag::~ExtensionTag() { +} + +} // namespace task_management diff --git a/chrome/browser/task_management/providers/web_contents/extension_tag.h b/chrome/browser/task_management/providers/web_contents/extension_tag.h new file mode 100644 index 0000000..6936812 --- /dev/null +++ b/chrome/browser/task_management/providers/web_contents/extension_tag.h @@ -0,0 +1,38 @@ +// Copyright 2015 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. + +#ifndef CHROME_BROWSER_TASK_MANAGEMENT_PROVIDERS_WEB_CONTENTS_EXTENSION_TAG_H_ +#define CHROME_BROWSER_TASK_MANAGEMENT_PROVIDERS_WEB_CONTENTS_EXTENSION_TAG_H_ + +#include "chrome/browser/task_management/providers/web_contents/extension_task.h" +#include "chrome/browser/task_management/providers/web_contents/web_contents_tag.h" + +namespace extensions { +class Extension; +} // namespace extensions + +namespace task_management { + +// Defines a concrete UserData type for WebContents owned by extensions. +class ExtensionTag : public WebContentsTag { + public: + // task_management::WebContentsTag: + ExtensionTask* CreateTask() const override; + + private: + friend class WebContentsTags; + + ExtensionTag(content::WebContents* web_contents, + const extensions::ViewType view_type); + ~ExtensionTag() override; + + // The ViewType of the extension WebContents this tag is attached to. + const extensions::ViewType view_type_; + + DISALLOW_COPY_AND_ASSIGN(ExtensionTag); +}; + +} // namespace task_management + +#endif // CHROME_BROWSER_TASK_MANAGEMENT_PROVIDERS_WEB_CONTENTS_EXTENSION_TAG_H_ diff --git a/chrome/browser/task_management/providers/web_contents/extension_tag_browsertest.cc b/chrome/browser/task_management/providers/web_contents/extension_tag_browsertest.cc new file mode 100644 index 0000000..6f5db81 --- /dev/null +++ b/chrome/browser/task_management/providers/web_contents/extension_tag_browsertest.cc @@ -0,0 +1,95 @@ +// Copyright 2015 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 "base/strings/utf_string_conversions.h" +#include "chrome/browser/extensions/extension_browsertest.h" +#include "chrome/browser/task_management/task_management_browsertest_util.h" +#include "chrome/common/chrome_switches.h" + +namespace task_management { + +class ExtensionTagsTest : public ExtensionBrowserTest { + public: + ExtensionTagsTest() {} + ~ExtensionTagsTest() override {} + + protected: + // ExtensionBrowserTest: + void SetUpCommandLine(base::CommandLine* command_line) override { + ExtensionBrowserTest::SetUpCommandLine(command_line); + + // Do not launch device discovery process. + command_line->AppendSwitch(switches::kDisableDeviceDiscoveryNotifications); + } + + const std::vector& tracked_tags() const { + return WebContentsTagsManager::GetInstance()->tracked_tags(); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ExtensionTagsTest); +}; + +// Tests loading, disabling, enabling and unloading extensions and how that will +// affect the recording of tags. +IN_PROC_BROWSER_TEST_F(ExtensionTagsTest, Basic) { + // Browser tests start with a single tab. + EXPECT_EQ(1U, tracked_tags().size()); + + const extensions::Extension* extension = LoadExtension( + test_data_dir_.AppendASCII("good").AppendASCII("Extensions") + .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") + .AppendASCII("1.0.0.0")); + ASSERT_TRUE(extension); + + EXPECT_EQ(2U, tracked_tags().size()); + + DisableExtension(extension->id()); + EXPECT_EQ(1U, tracked_tags().size()); + + EnableExtension(extension->id()); + EXPECT_EQ(2U, tracked_tags().size()); + + UnloadExtension(extension->id()); + EXPECT_EQ(1U, tracked_tags().size()); +} + +IN_PROC_BROWSER_TEST_F(ExtensionTagsTest, PreAndPostExistingTaskProviding) { + // Browser tests start with a single tab. + EXPECT_EQ(1U, tracked_tags().size()); + MockWebContentsTaskManager task_manager; + EXPECT_TRUE(task_manager.tasks().empty()); + + const extensions::Extension* extension = LoadExtension( + test_data_dir_.AppendASCII("good").AppendASCII("Extensions") + .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") + .AppendASCII("1.0.0.0")); + ASSERT_TRUE(extension); + + EXPECT_EQ(2U, tracked_tags().size()); + EXPECT_TRUE(task_manager.tasks().empty()); + + // Start observing, pre-existing tasks will be provided. + task_manager.StartObserving(); + EXPECT_EQ(2U, task_manager.tasks().size()); + EXPECT_EQ(Task::EXTENSION, task_manager.tasks().back()->GetType()); + + // Unload the extension and expect that the task manager now shows only the + // about:blank tab. + UnloadExtension(extension->id()); + EXPECT_EQ(1U, tracked_tags().size()); + EXPECT_EQ(1U, task_manager.tasks().size()); + const Task* about_blank_task = task_manager.tasks().back(); + EXPECT_EQ(Task::RENDERER, about_blank_task->GetType()); + EXPECT_EQ(base::UTF8ToUTF16("Tab: about:blank"), about_blank_task->title()); + + // Reload the extension, the task manager should show it again. + ReloadExtension(extension->id()); + EXPECT_EQ(2U, tracked_tags().size()); + EXPECT_EQ(2U, task_manager.tasks().size()); + EXPECT_EQ(Task::EXTENSION, task_manager.tasks().back()->GetType()); +} + +} // namespace task_management + diff --git a/chrome/browser/task_management/providers/web_contents/extension_task.cc b/chrome/browser/task_management/providers/web_contents/extension_task.cc new file mode 100644 index 0000000..acbfde1 --- /dev/null +++ b/chrome/browser/task_management/providers/web_contents/extension_task.cc @@ -0,0 +1,83 @@ +// Copyright 2015 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/task_management/providers/web_contents/extension_task.h" + +#include "base/strings/utf_string_conversions.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/web_contents.h" +#include "extensions/browser/view_type_utils.h" +#include "extensions/common/extension.h" +#include "extensions/common/view_type.h" +#include "grit/theme_resources.h" +#include "ui/base/resource/resource_bundle.h" + +namespace task_management { + +namespace { + +gfx::ImageSkia* g_default_icon = nullptr; + +gfx::ImageSkia* GetDefaultIcon() { + if (!ResourceBundle::HasSharedInstance()) + return nullptr; + + if (!g_default_icon) { + g_default_icon = ResourceBundle::GetSharedInstance().GetImageSkiaNamed( + IDR_EXTENSIONS_FAVICON); + } + + return g_default_icon; +} + +} // namespace + +ExtensionTask::ExtensionTask(content::WebContents* web_contents, + const extensions::Extension* extension, + extensions::ViewType view_type) + : RendererTask(GetExtensionTitle(web_contents, extension, view_type), + GetDefaultIcon(), + web_contents) { +} + +ExtensionTask::~ExtensionTask() { +} + +void ExtensionTask::OnTitleChanged(content::NavigationEntry* entry) { + // The title of the extension should not change as a result of title change + // in its WebContents, so we ignore this. +} + +void ExtensionTask::OnFaviconChanged() { + // For now we never change the favicon of the extension, we always use the + // default one. + // TODO(afakhry): In the future use the extensions' favicons. +} + +Task::Type ExtensionTask::GetType() const { + return Task::EXTENSION; +} + +base::string16 ExtensionTask::GetExtensionTitle( + content::WebContents* web_contents, + const extensions::Extension* extension, + extensions::ViewType view_type) const { + DCHECK(web_contents); + + base::string16 title = extension ? + base::UTF8ToUTF16(extension->name()) : + RendererTask::GetTitleFromWebContents(web_contents); + + bool is_background = + view_type == extensions::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE; + + return RendererTask::PrefixRendererTitle( + title, + extension->is_app(), + true, // is_extension + web_contents->GetBrowserContext()->IsOffTheRecord(), + is_background); +} + +} // namespace task_management diff --git a/chrome/browser/task_management/providers/web_contents/extension_task.h b/chrome/browser/task_management/providers/web_contents/extension_task.h new file mode 100644 index 0000000..9ab3ecc --- /dev/null +++ b/chrome/browser/task_management/providers/web_contents/extension_task.h @@ -0,0 +1,43 @@ +// Copyright 2015 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. + +#ifndef CHROME_BROWSER_TASK_MANAGEMENT_PROVIDERS_WEB_CONTENTS_EXTENSION_TASK_H_ +#define CHROME_BROWSER_TASK_MANAGEMENT_PROVIDERS_WEB_CONTENTS_EXTENSION_TASK_H_ + +#include "chrome/browser/task_management/providers/web_contents/renderer_task.h" +#include "extensions/common/view_type.h" + +namespace extensions { +class Extension; +} // namespace extensions + +namespace task_management { + +// Defines a task manager representation for extensions. +class ExtensionTask : public RendererTask { + public: + ExtensionTask(content::WebContents* web_contents, + const extensions::Extension* extension, + extensions::ViewType view_type); + ~ExtensionTask() override; + + // task_management::RendererTask: + void OnTitleChanged(content::NavigationEntry* entry) override; + void OnFaviconChanged() override; + Type GetType() const override; + + private: + // If |extension| is nullptr, this method will get the title from + // the |web_contents|. + base::string16 GetExtensionTitle( + content::WebContents* web_contents, + const extensions::Extension* extension, + extensions::ViewType view_type) const; + + DISALLOW_COPY_AND_ASSIGN(ExtensionTask); +}; + +} // namespace task_management + +#endif // CHROME_BROWSER_TASK_MANAGEMENT_PROVIDERS_WEB_CONTENTS_EXTENSION_TASK_H_ diff --git a/chrome/browser/task_management/providers/web_contents/panel_task.cc b/chrome/browser/task_management/providers/web_contents/panel_task.cc index e69b7f1..5198adc 100644 --- a/chrome/browser/task_management/providers/web_contents/panel_task.cc +++ b/chrome/browser/task_management/providers/web_contents/panel_task.cc @@ -53,13 +53,14 @@ base::string16 PanelTask::GetCurrentPanelTitle(Panel* panel) const { const extensions::Extension* extension = registry->enabled_extensions().GetByID(panel->extension_id()); - const bool is_app = extension ? extension->is_app() : false; + const bool is_app = extension && extension->is_app(); const bool is_incognito = panel->profile()->IsOffTheRecord(); return PrefixRendererTitle(title, is_app, true, // is_extension. - is_incognito); + is_incognito, + false); // is_background. } } // namespace task_management diff --git a/chrome/browser/task_management/providers/web_contents/renderer_task.cc b/chrome/browser/task_management/providers/web_contents/renderer_task.cc index e824955..86021b4 100644 --- a/chrome/browser/task_management/providers/web_contents/renderer_task.cc +++ b/chrome/browser/task_management/providers/web_contents/renderer_task.cc @@ -181,13 +181,16 @@ const base::string16 RendererTask::PrefixRendererTitle( const base::string16& title, bool is_app, bool is_extension, - bool is_incognito) { + bool is_incognito, + bool is_background) { int message_id = IDS_TASK_MANAGER_TAB_PREFIX; if (is_incognito && !is_app && !is_extension) { message_id = IDS_TASK_MANAGER_TAB_INCOGNITO_PREFIX; } else if (is_app) { - if (is_incognito) + if (is_background) + message_id = IDS_TASK_MANAGER_BACKGROUND_PREFIX; + else if (is_incognito) message_id = IDS_TASK_MANAGER_APP_INCOGNITO_PREFIX; else message_id = IDS_TASK_MANAGER_APP_PREFIX; diff --git a/chrome/browser/task_management/providers/web_contents/renderer_task.h b/chrome/browser/task_management/providers/web_contents/renderer_task.h index 27ad11d..74d3553 100644 --- a/chrome/browser/task_management/providers/web_contents/renderer_task.h +++ b/chrome/browser/task_management/providers/web_contents/renderer_task.h @@ -59,11 +59,13 @@ class RendererTask : public Task { content::WebContents* web_contents); // Prefixes the given renderer |title| with the appropriate string based on - // whether it's an app, an extension, or incognito. + // whether it's an app, an extension, incognito or a background page or + // contents. static const base::string16 PrefixRendererTitle(const base::string16& title, bool is_app, bool is_extension, - bool is_incognito); + bool is_incognito, + bool is_background); content::WebContents* web_contents() const { return web_contents_; } diff --git a/chrome/browser/task_management/providers/web_contents/tab_contents_task.cc b/chrome/browser/task_management/providers/web_contents/tab_contents_task.cc index fdca98d..ac8a59b 100644 --- a/chrome/browser/task_management/providers/web_contents/tab_contents_task.cc +++ b/chrome/browser/task_management/providers/web_contents/tab_contents_task.cc @@ -69,7 +69,8 @@ base::string16 TabContentsTask::GetCurrentTitle() const { return PrefixRendererTitle(tab_title.empty() ? url_spec : tab_title, is_app, is_extension, - is_incognito); + is_incognito, + false); // is_background. } } // namespace task_management diff --git a/chrome/browser/task_management/web_contents_tags.cc b/chrome/browser/task_management/web_contents_tags.cc index 3fed68a..678923f0 100644 --- a/chrome/browser/task_management/web_contents_tags.cc +++ b/chrome/browser/task_management/web_contents_tags.cc @@ -6,6 +6,7 @@ #include "chrome/browser/task_management/providers/web_contents/background_contents_tag.h" #include "chrome/browser/task_management/providers/web_contents/devtools_tag.h" +#include "chrome/browser/task_management/providers/web_contents/extension_tag.h" #include "chrome/browser/task_management/providers/web_contents/guest_tag.h" #include "chrome/browser/task_management/providers/web_contents/panel_tag.h" #include "chrome/browser/task_management/providers/web_contents/prerender_tag.h" @@ -14,9 +15,11 @@ #include "chrome/browser/task_management/providers/web_contents/web_contents_tags_manager.h" #include "components/guest_view/browser/guest_view_base.h" #include "content/public/browser/web_contents.h" +#include "extensions/browser/view_type_utils.h" #if defined(ENABLE_EXTENSIONS) #include "chrome/browser/ui/panels/panel.h" +#include "extensions/browser/process_manager.h" #endif namespace task_management { @@ -37,6 +40,23 @@ void TagWebContents(content::WebContents* contents, WebContentsTagsManager::GetInstance()->AddTag(tag); } +#if defined(ENABLE_EXTENSIONS) + +bool IsExtensionWebContents(content::WebContents* contents) { + DCHECK(contents); + + if (guest_view::GuestViewBase::IsGuest(contents)) + return false; + + extensions::ViewType view_type = extensions::GetViewType(contents); + return (view_type != extensions::VIEW_TYPE_INVALID && + view_type != extensions::VIEW_TYPE_TAB_CONTENTS && + view_type != extensions::VIEW_TYPE_BACKGROUND_CONTENTS && + view_type != extensions::VIEW_TYPE_PANEL); +} + +#endif // defined(ENABLE_EXTENSIONS) + } // namespace #endif // defined(ENABLE_TASK_MANAGER) @@ -130,6 +150,20 @@ void WebContentsTags::CreateForGuestContents( } // static +void WebContentsTags::CreateForExtension(content::WebContents* web_contents, + extensions::ViewType view_type) { +#if defined(ENABLE_TASK_MANAGER) && defined(ENABLE_EXTENSIONS) + DCHECK(IsExtensionWebContents(web_contents)); + + if (!WebContentsTag::FromWebContents(web_contents)) { + TagWebContents(web_contents, + new ExtensionTag(web_contents, view_type), + WebContentsTag::kTagKey); + } +#endif // defined(ENABLE_TASK_MANAGER) && defined(ENABLE_EXTENSIONS) +} + +// static void WebContentsTags::ClearTag(content::WebContents* web_contents) { #if defined(ENABLE_TASK_MANAGER) const WebContentsTag* tag = WebContentsTag::FromWebContents(web_contents); diff --git a/chrome/browser/task_management/web_contents_tags.h b/chrome/browser/task_management/web_contents_tags.h index 92d58f1..e170f26 100644 --- a/chrome/browser/task_management/web_contents_tags.h +++ b/chrome/browser/task_management/web_contents_tags.h @@ -6,6 +6,7 @@ #define CHROME_BROWSER_TASK_MANAGEMENT_WEB_CONTENTS_TAGS_H_ #include "base/macros.h" +#include "extensions/common/view_type.h" class BackgroundContents; class Panel; @@ -76,6 +77,16 @@ class WebContentsTags { // by |web_contents|. static void CreateForGuestContents(content::WebContents* web_contents); + // Tag a WebContents that belongs to |extension| so that it shows up in the + // task manager. Calling this function creates a ExtensionTag, and attaches + // it to |web_contents|. If an instance is already attached, this does + // nothing. The resulting tag does not have to be cleaned up by the caller, + // as it is owned by |web_contents|. + // |web_contents| must be of a non-tab, non-guest view, non-panel, or + // non-background contents Extension. + static void CreateForExtension(content::WebContents* web_contents, + extensions::ViewType view_type); + // Clears the task-manager tag, created by any of the above functions, from // the given |web_contents| if any. // Clearing the tag is necessary only when you need to re-tag an existing diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 4f4b4e7..2e94a7c 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -2991,6 +2991,10 @@ 'browser/task_management/providers/web_contents/devtools_tag.h', 'browser/task_management/providers/web_contents/devtools_task.cc', 'browser/task_management/providers/web_contents/devtools_task.h', + 'browser/task_management/providers/web_contents/extension_tag.cc', + 'browser/task_management/providers/web_contents/extension_tag.h', + 'browser/task_management/providers/web_contents/extension_task.cc', + 'browser/task_management/providers/web_contents/extension_task.h', 'browser/task_management/providers/web_contents/guest_tag.cc', 'browser/task_management/providers/web_contents/guest_tag.h', 'browser/task_management/providers/web_contents/guest_task.cc', diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index f6e7423..481c3c7 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -417,6 +417,7 @@ 'browser/tab_contents/view_source_browsertest.cc', 'browser/task_management/providers/web_contents/background_contents_tag_browsertest.cc', 'browser/task_management/providers/web_contents/devtools_tag_browsertest.cc', + 'browser/task_management/providers/web_contents/extension_tag_browsertest.cc', 'browser/task_management/providers/web_contents/tab_contents_tag_browsertest.cc', 'browser/task_manager/task_manager_browsertest.cc', 'browser/task_manager/task_manager_browsertest_util.cc', diff --git a/extensions/browser/extensions_browser_client.h b/extensions/browser/extensions_browser_client.h index 838a343..8b66051 100644 --- a/extensions/browser/extensions_browser_client.h +++ b/extensions/browser/extensions_browser_client.h @@ -11,6 +11,7 @@ #include "base/memory/scoped_ptr.h" #include "extensions/browser/extension_event_histogram_value.h" #include "extensions/browser/extension_prefs_observer.h" +#include "extensions/common/view_type.h" class ExtensionFunctionRegistry; class PrefService; @@ -226,6 +227,12 @@ class ExtensionsBrowserClient { int embedder_process_id, int view_instance_id) {} + // Attaches the task manager extension tag to |web_contents|, if needed based + // on |view_type|, so that its corresponding task shows up in the task + // manager. + virtual void AttachExtensionTaskManagerTag(content::WebContents* web_contents, + ViewType view_type) {} + // Returns the single instance of |this|. static ExtensionsBrowserClient* Get(); diff --git a/extensions/browser/view_type_utils.cc b/extensions/browser/view_type_utils.cc index ba72ceb..933d669 100644 --- a/extensions/browser/view_type_utils.cc +++ b/extensions/browser/view_type_utils.cc @@ -6,6 +6,7 @@ #include "base/lazy_instance.h" #include "content/public/browser/web_contents.h" +#include "extensions/browser/extensions_browser_client.h" using content::WebContents; @@ -39,6 +40,8 @@ ViewType GetViewType(WebContents* tab) { void SetViewType(WebContents* tab, ViewType type) { tab->SetUserData(&kViewTypeUserDataKey, new ViewTypeUserData(type)); + + ExtensionsBrowserClient::Get()->AttachExtensionTaskManagerTag(tab, type); } } // namespace extensions -- cgit v1.1