summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/apps/guest_view/web_view_browsertest.cc16
-rw-r--r--chrome/browser/extensions/chrome_extensions_browser_client.cc33
-rw-r--r--chrome/browser/extensions/chrome_extensions_browser_client.h2
-rw-r--r--chrome/browser/task_management/providers/web_contents/extension_tag.cc36
-rw-r--r--chrome/browser/task_management/providers/web_contents/extension_tag.h38
-rw-r--r--chrome/browser/task_management/providers/web_contents/extension_tag_browsertest.cc95
-rw-r--r--chrome/browser/task_management/providers/web_contents/extension_task.cc83
-rw-r--r--chrome/browser/task_management/providers/web_contents/extension_task.h43
-rw-r--r--chrome/browser/task_management/providers/web_contents/panel_task.cc5
-rw-r--r--chrome/browser/task_management/providers/web_contents/renderer_task.cc7
-rw-r--r--chrome/browser/task_management/providers/web_contents/renderer_task.h6
-rw-r--r--chrome/browser/task_management/providers/web_contents/tab_contents_task.cc3
-rw-r--r--chrome/browser/task_management/web_contents_tags.cc34
-rw-r--r--chrome/browser/task_management/web_contents_tags.h11
-rw-r--r--chrome/chrome_browser.gypi4
-rw-r--r--chrome/chrome_tests.gypi1
-rw-r--r--extensions/browser/extensions_browser_client.h7
-rw-r--r--extensions/browser/view_type_utils.cc3
18 files changed, 416 insertions, 11 deletions
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: <webview> task manager test,
+ // App: <webview> 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: <webview> task manager test,
+ // App: <webview> 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<ChromeExtensionsBrowserClient>;
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<WebContentsTag*>& 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