summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorafakhry <afakhry@chromium.org>2015-07-09 11:46:09 -0700
committerCommit bot <commit-bot@chromium.org>2015-07-09 18:47:50 +0000
commit8394f9462845235c882e04f3a82724119c402001 (patch)
tree09e5257ec169b8988fac8c760571542477668ddc
parent8fa5a358cb32085b51daf92df8fd4a79b3931f81 (diff)
downloadchromium_src-8394f9462845235c882e04f3a82724119c402001.zip
chromium_src-8394f9462845235c882e04f3a82724119c402001.tar.gz
chromium_src-8394f9462845235c882e04f3a82724119c402001.tar.bz2
New Task Manager - Phase 1.3.2: Implement Tab Contents Task Providing
Part 3 of 3: Implementing a task-manager representation of WebContents owned by the TabStripModel. R=nick@chromium.org BUG=470990 TEST=browser_tests --gtest_filter=TabContentsTagTest.* Committed: https://crrev.com/543b07d4fb0b807639e8d29a0249794f240db091 Cr-Commit-Position: refs/heads/master@{#337936} Review URL: https://codereview.chromium.org/1212663002 Cr-Commit-Position: refs/heads/master@{#338101}
-rw-r--r--chrome/browser/prerender/prerender_browsertest.cc83
-rw-r--r--chrome/browser/task_management/providers/web_contents/background_contents_tag_browsertest.cc94
-rw-r--r--chrome/browser/task_management/providers/web_contents/devtools_tag_browsertest.cc76
-rw-r--r--chrome/browser/task_management/providers/web_contents/prerender_tag.cc1
-rw-r--r--chrome/browser/task_management/providers/web_contents/renderer_task.cc27
-rw-r--r--chrome/browser/task_management/providers/web_contents/renderer_task.h7
-rw-r--r--chrome/browser/task_management/providers/web_contents/tab_contents_tag.cc20
-rw-r--r--chrome/browser/task_management/providers/web_contents/tab_contents_tag.h30
-rw-r--r--chrome/browser/task_management/providers/web_contents/tab_contents_tag_browsertest.cc200
-rw-r--r--chrome/browser/task_management/providers/web_contents/tab_contents_task.cc75
-rw-r--r--chrome/browser/task_management/providers/web_contents/tab_contents_task.h32
-rw-r--r--chrome/browser/task_management/providers/web_contents/web_contents_tags_manager.cc6
-rw-r--r--chrome/browser/task_management/providers/web_contents/web_contents_tags_manager.h6
-rw-r--r--chrome/browser/task_management/providers/web_contents/web_contents_task_provider.cc12
-rw-r--r--chrome/browser/task_management/providers/web_contents/web_contents_task_provider.h4
-rw-r--r--chrome/browser/task_management/task_management_browsertest_util.cc39
-rw-r--r--chrome/browser/task_management/task_management_browsertest_util.h40
-rw-r--r--chrome/browser/task_management/web_contents_tags.cc12
-rw-r--r--chrome/browser/task_management/web_contents_tags.h7
-rw-r--r--chrome/browser/ui/browser.cc4
-rw-r--r--chrome/browser/ui/browser_navigator.cc4
-rw-r--r--chrome/browser/ui/browser_tab_strip_model_delegate.cc4
-rw-r--r--chrome/chrome_browser.gypi4
-rw-r--r--chrome/chrome_tests.gypi3
24 files changed, 616 insertions, 174 deletions
diff --git a/chrome/browser/prerender/prerender_browsertest.cc b/chrome/browser/prerender/prerender_browsertest.cc
index c08cfaa..7eb1e0f 100644
--- a/chrome/browser/prerender/prerender_browsertest.cc
+++ b/chrome/browser/prerender/prerender_browsertest.cc
@@ -49,9 +49,8 @@
#include "chrome/browser/safe_browsing/safe_browsing_service.h"
#include "chrome/browser/safe_browsing/safe_browsing_util.h"
#include "chrome/browser/safe_browsing/test_database_manager.h"
-#include "chrome/browser/task_management/providers/task_provider_observer.h"
#include "chrome/browser/task_management/providers/web_contents/web_contents_tags_manager.h"
-#include "chrome/browser/task_management/providers/web_contents/web_contents_task_provider.h"
+#include "chrome/browser/task_management/task_management_browsertest_util.h"
#include "chrome/browser/task_manager/task_manager.h"
#include "chrome/browser/task_manager/task_manager_browsertest_util.h"
#include "chrome/browser/ui/browser.h"
@@ -4088,92 +4087,58 @@ IN_PROC_BROWSER_TEST_F(PrerenderBrowserTestWithNaCl,
namespace {
-// Defines a test class for testing that will act as a mock task manager.
-class MockTaskManager : public task_management::TaskProviderObserver {
- public:
- MockTaskManager() {}
- ~MockTaskManager() override {}
-
- // task_management::Task_providerObserver:
- void TaskAdded(task_management::Task* task) override {
- EXPECT_FALSE(ContainsKey(provided_tasks_, task));
- provided_tasks_.insert(task);
- }
-
- void TaskRemoved(task_management::Task* task) override {
- EXPECT_TRUE(ContainsKey(provided_tasks_, task));
- provided_tasks_.erase(task);
- }
-
- base::string16 GetPrerenderTitlePrefix() const {
- return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_PRERENDER_PREFIX,
- base::string16());
- }
-
- const std::set<task_management::WebContentsTag*>& tracked_tags() const {
- return task_management::WebContentsTagsManager::GetInstance()->
- tracked_tags();
- }
-
- const std::set<task_management::Task*>& provided_tasks() const {
- return provided_tasks_;
- }
-
- private:
- std::set<task_management::Task*> provided_tasks_;
+base::string16 GetPrerenderTitlePrefix() {
+ return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_PRERENDER_PREFIX,
+ base::string16());
+}
- DISALLOW_COPY_AND_ASSIGN(MockTaskManager);
-};
+const std::vector<task_management::WebContentsTag*>& GetTrackedTags() {
+ return task_management::WebContentsTagsManager::GetInstance()->
+ tracked_tags();
+}
// Tests the correct recording of tags for the prerender WebContents.
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, TaskManagementTagsBasic) {
- MockTaskManager task_manager;
- EXPECT_TRUE(task_manager.tracked_tags().empty());
+ // Browser tests start with a single tab.
+ EXPECT_EQ(1U, GetTrackedTags().size());
// Start prerendering a page and make sure it's correctly tagged.
PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
- EXPECT_FALSE(task_manager.tracked_tags().empty());
-
- // TODO(afakhry): Once we start tagging the tab contents the below tests
- // must be changed.
- EXPECT_EQ(1U, task_manager.tracked_tags().size());
+ EXPECT_EQ(2U, GetTrackedTags().size());
// Swap in the prerendered content and make sure its tag is removed.
NavigateToDestURL();
- EXPECT_TRUE(task_manager.tracked_tags().empty());
+ EXPECT_EQ(1U, GetTrackedTags().size());
}
// Tests that the task manager will be provided by tasks that correspond to
// prerendered WebContents.
IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, TaskManagementTasksProvided) {
- MockTaskManager task_manager;
- EXPECT_TRUE(task_manager.tracked_tags().empty());
+ task_management::MockWebContentsTaskManager task_manager;
+ // Browser tests start with a single tab.
+ EXPECT_EQ(1U, GetTrackedTags().size());
- task_management::WebContentsTaskProvider provider;
- provider.SetObserver(&task_manager);
+ task_manager.StartObserving();
- // Still empty, no pre-existing tasks.
- EXPECT_TRUE(task_manager.provided_tasks().empty());
+ // The pre-existing tab is provided.
+ EXPECT_EQ(1U, task_manager.tasks().size());
// Start prerendering a page.
PrerenderTestURL("files/prerender/prerender_page.html", FINAL_STATUS_USED, 1);
- EXPECT_FALSE(task_manager.tracked_tags().empty());
- // TODO(afakhry): The below may not be true after we support more tags.
- EXPECT_EQ(1U, task_manager.tracked_tags().size());
- ASSERT_EQ(1U, task_manager.provided_tasks().size());
+ EXPECT_EQ(2U, GetTrackedTags().size());
+ ASSERT_EQ(2U, task_manager.tasks().size());
- const task_management::Task* task = *task_manager.provided_tasks().begin();
+ const task_management::Task* task = task_manager.tasks().back();
EXPECT_EQ(task_management::Task::RENDERER, task->GetType());
const base::string16 title = task->title();
- const base::string16 expected_prefix = task_manager.GetPrerenderTitlePrefix();
+ const base::string16 expected_prefix = GetPrerenderTitlePrefix();
EXPECT_TRUE(base::StartsWith(title,
expected_prefix,
base::CompareCase::INSENSITIVE_ASCII));
NavigateToDestURL();
- // TODO(afakhry): The below may not be true after we support more tags.
- EXPECT_TRUE(task_manager.provided_tasks().empty());
+ EXPECT_EQ(1U, task_manager.tasks().size());
}
} // namespace
diff --git a/chrome/browser/task_management/providers/web_contents/background_contents_tag_browsertest.cc b/chrome/browser/task_management/providers/web_contents/background_contents_tag_browsertest.cc
index c70fa3b..ec17c4d 100644
--- a/chrome/browser/task_management/providers/web_contents/background_contents_tag_browsertest.cc
+++ b/chrome/browser/task_management/providers/web_contents/background_contents_tag_browsertest.cc
@@ -4,9 +4,8 @@
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/extensions/extension_browsertest.h"
-#include "chrome/browser/task_management/providers/task_provider_observer.h"
#include "chrome/browser/task_management/providers/web_contents/web_contents_tags_manager.h"
-#include "chrome/browser/task_management/providers/web_contents/web_contents_task_provider.h"
+#include "chrome/browser/task_management/task_management_browsertest_util.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/grit/generated_resources.h"
#include "extensions/common/switches.h"
@@ -18,9 +17,7 @@ namespace task_management {
// properly and the TagsManager records these tags. It is also used to test that
// the WebContentsTaskProvider will be able to provide the appropriate
// BackgroundContentsTask.
-class BackgroundContentsTagTest
- : public ExtensionBrowserTest,
- public TaskProviderObserver {
+class BackgroundContentsTagTest : public ExtensionBrowserTest {
public:
BackgroundContentsTagTest() {}
~BackgroundContentsTagTest() override {}
@@ -37,109 +34,92 @@ class BackgroundContentsTagTest
base::UTF8ToUTF16(extension->name()));
}
- // task_management::Task_providerObserver:
- void TaskAdded(Task* task) override {
- CHECK(task);
- ASSERT_FALSE(provided_tasks_.count(task));
- provided_tasks_.insert(task);
- }
-
- void TaskRemoved(Task* task) override {
- CHECK(task);
- ASSERT_TRUE(provided_tasks_.count(task));
- provided_tasks_.erase(task);
- }
-
WebContentsTagsManager* tags_manager() const {
return WebContentsTagsManager::GetInstance();
}
- const std::set<Task*>& provided_tasks() const { return provided_tasks_; }
-
protected:
- // ExtensionApiTest:
+ // ExtensionBrowserTest:
void SetUpCommandLine(base::CommandLine* command_line) override {
// Pass flags to make testing apps easier.
ExtensionBrowserTest::SetUpCommandLine(command_line);
test_data_dir_ = test_data_dir_.AppendASCII("api_test");
- base::CommandLine::ForCurrentProcess()->AppendSwitch(
- switches::kDisablePopupBlocking);
- base::CommandLine::ForCurrentProcess()->AppendSwitch(
- extensions::switches::kAllowHTTPBackgroundPage);
+ command_line->AppendSwitch(switches::kDisableRendererBackgrounding);
+ command_line->AppendSwitch(switches::kDisablePopupBlocking);
+ command_line->AppendSwitch(extensions::switches::kAllowHTTPBackgroundPage);
}
private:
- std::set<Task*> provided_tasks_;
-
DISALLOW_COPY_AND_ASSIGN(BackgroundContentsTagTest);
};
// Tests that loading an extension that has a background contents will result in
// the tags manager recording a WebContentsTag.
IN_PROC_BROWSER_TEST_F(BackgroundContentsTagTest, TagsManagerRecordsATag) {
- EXPECT_TRUE(provided_tasks().empty());
- EXPECT_TRUE(tags_manager()->tracked_tags().empty());
- EXPECT_TRUE(LoadBackgroundExtension());
- EXPECT_FALSE(tags_manager()->tracked_tags().empty());
+ // Browser tests start with only one tab available.
+ EXPECT_EQ(1U, tags_manager()->tracked_tags().size());
+ auto extension = LoadBackgroundExtension();
+ ASSERT_NE(nullptr, extension);
+ EXPECT_EQ(2U, tags_manager()->tracked_tags().size());
+
+ // Unload the extension.
+ UnloadExtension(extension->id());
EXPECT_EQ(1U, tags_manager()->tracked_tags().size());
- EXPECT_TRUE(provided_tasks().empty());
}
// Tests that background contents creation while the provider is being observed
// will also provide tasks.
IN_PROC_BROWSER_TEST_F(BackgroundContentsTagTest, TasksProvidedWhileObserving) {
- EXPECT_TRUE(provided_tasks().empty());
- EXPECT_TRUE(tags_manager()->tracked_tags().empty());
+ MockWebContentsTaskManager task_manager;
+ EXPECT_TRUE(task_manager.tasks().empty());
+ // Browser tests start with only one tab available.
+ EXPECT_EQ(1U, tags_manager()->tracked_tags().size());
- WebContentsTaskProvider provider;
- provider.SetObserver(this);
+ task_manager.StartObserving();
- // Still empty, no pre-existing tasks.
- EXPECT_TRUE(provided_tasks().empty());
+ // The pre-existing tab is provided.
+ EXPECT_EQ(1U, task_manager.tasks().size());
auto extension = LoadBackgroundExtension();
ASSERT_NE(nullptr, extension);
- EXPECT_FALSE(tags_manager()->tracked_tags().empty());
- EXPECT_EQ(1U, tags_manager()->tracked_tags().size());
- EXPECT_FALSE(provided_tasks().empty());
- EXPECT_EQ(1U, provided_tasks().size());
+ EXPECT_EQ(2U, tags_manager()->tracked_tags().size());
+ EXPECT_EQ(2U, task_manager.tasks().size());
- // Now check the provided task.
- const Task* task = *provided_tasks().begin();
+ // Now check the newly provided task.
+ const Task* task = task_manager.tasks().back();
EXPECT_EQ(Task::RENDERER, task->GetType());
EXPECT_EQ(GetBackgroundTaskExpectedName(extension), task->title());
// Unload the extension.
UnloadExtension(extension->id());
- EXPECT_TRUE(provided_tasks().empty());
- EXPECT_TRUE(tags_manager()->tracked_tags().empty());
+ EXPECT_EQ(1U, task_manager.tasks().size());
+ EXPECT_EQ(1U, tags_manager()->tracked_tags().size());
}
// Tests providing a pre-existing background task to the observing operation.
IN_PROC_BROWSER_TEST_F(BackgroundContentsTagTest, PreExistingTasksAreProvided) {
- EXPECT_TRUE(provided_tasks().empty());
- EXPECT_TRUE(tags_manager()->tracked_tags().empty());
+ MockWebContentsTaskManager task_manager;
+ EXPECT_TRUE(task_manager.tasks().empty());
+ // Browser tests start with only one tab available.
+ EXPECT_EQ(1U, tags_manager()->tracked_tags().size());
auto extension = LoadBackgroundExtension();
ASSERT_NE(nullptr, extension);
- EXPECT_FALSE(tags_manager()->tracked_tags().empty());
- EXPECT_EQ(1U, tags_manager()->tracked_tags().size());
+ EXPECT_EQ(2U, tags_manager()->tracked_tags().size());
- WebContentsTaskProvider provider;
- provider.SetObserver(this);
+ task_manager.StartObserving();
// Pre-existing task will be provided to us.
- EXPECT_FALSE(provided_tasks().empty());
- EXPECT_EQ(1U, provided_tasks().size());
+ EXPECT_EQ(2U, task_manager.tasks().size());
// Now check the provided task.
- const Task* task = *provided_tasks().begin();
+ const Task* task = task_manager.tasks().back();
EXPECT_EQ(Task::RENDERER, task->GetType());
EXPECT_EQ(GetBackgroundTaskExpectedName(extension), task->title());
// Unload the extension.
UnloadExtension(extension->id());
- EXPECT_TRUE(provided_tasks().empty());
- EXPECT_TRUE(tags_manager()->tracked_tags().empty());
+ EXPECT_EQ(1U, task_manager.tasks().size());
+ EXPECT_EQ(1U, tags_manager()->tracked_tags().size());
}
} // namespace task_management
diff --git a/chrome/browser/task_management/providers/web_contents/devtools_tag_browsertest.cc b/chrome/browser/task_management/providers/web_contents/devtools_tag_browsertest.cc
index 68fdb7d..c009d52 100644
--- a/chrome/browser/task_management/providers/web_contents/devtools_tag_browsertest.cc
+++ b/chrome/browser/task_management/providers/web_contents/devtools_tag_browsertest.cc
@@ -3,9 +3,8 @@
// found in the LICENSE file.
#include "chrome/browser/devtools/devtools_window_testing.h"
-#include "chrome/browser/task_management/providers/task_provider_observer.h"
#include "chrome/browser/task_management/providers/web_contents/web_contents_tags_manager.h"
-#include "chrome/browser/task_management/providers/web_contents/web_contents_task_provider.h"
+#include "chrome/browser/task_management/task_management_browsertest_util.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/in_process_browser_test.h"
@@ -24,13 +23,10 @@ const char kTestPage2[] = "files/devtools/navigate_back.html";
// properly by a DevToolsTag and that the TagsManager records these tags. It
// will also test that the WebContentsTaskProvider will be able to provide the
// appropriate DevToolsTask.
-class DevToolsTagTest
- : public InProcessBrowserTest,
- public TaskProviderObserver {
+class DevToolsTagTest : public InProcessBrowserTest {
public:
DevToolsTagTest()
- : devtools_window_(nullptr),
- provided_tasks_() {
+ : devtools_window_(nullptr) {
CHECK(test_server()->Start());
}
@@ -50,28 +46,12 @@ class DevToolsTagTest
DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_window_);
}
- // task_management::Task_providerObserver:
- void TaskAdded(Task* task) override {
- CHECK(task);
- ASSERT_FALSE(provided_tasks_.count(task));
- provided_tasks_.insert(task);
- }
-
- void TaskRemoved(Task* task) override {
- CHECK(task);
- ASSERT_TRUE(provided_tasks_.count(task));
- provided_tasks_.erase(task);
- }
-
WebContentsTagsManager* tags_manager() const {
return WebContentsTagsManager::GetInstance();
}
- const std::set<Task*>& provided_tasks() const { return provided_tasks_; }
-
private:
DevToolsWindow* devtools_window_;
- std::set<Task*> provided_tasks_;
DISALLOW_COPY_AND_ASSIGN(DevToolsTagTest);
};
@@ -79,52 +59,48 @@ class DevToolsTagTest
// Tests that opening a DevToolsWindow will result in tagging its main
// WebContents and that tag will be recorded by the TagsManager.
IN_PROC_BROWSER_TEST_F(DevToolsTagTest, TagsManagerRecordsATag) {
- EXPECT_TRUE(tags_manager()->tracked_tags().empty());
+ // Browser tests start with a single tab.
+ EXPECT_EQ(1U, tags_manager()->tracked_tags().size());
- // Loading a page will not result in tagging its WebContents.
- // TODO(afakhry): Once we start tagging the tab contents, this will change.
- // Fix it.
+ // Navigating the same tab to the test page won't change the number of tracked
+ // tags. No devtools yet.
LoadTestPage(kTestPage1);
- EXPECT_TRUE(tags_manager()->tracked_tags().empty());
+ EXPECT_EQ(1U, tags_manager()->tracked_tags().size());
// Test both docked and undocked devtools.
OpenDevToolsWindow(true);
- EXPECT_FALSE(tags_manager()->tracked_tags().empty());
- EXPECT_EQ(1U, tags_manager()->tracked_tags().size());
+ EXPECT_EQ(2U, tags_manager()->tracked_tags().size());
CloseDevToolsWindow();
- EXPECT_TRUE(tags_manager()->tracked_tags().empty());
+ EXPECT_EQ(1U, tags_manager()->tracked_tags().size());
// For the undocked devtools there will be two tags one for the main contents
// and one for the toolbox contents
OpenDevToolsWindow(false);
- EXPECT_FALSE(tags_manager()->tracked_tags().empty());
- EXPECT_EQ(2U, tags_manager()->tracked_tags().size());
+ EXPECT_EQ(3U, tags_manager()->tracked_tags().size());
CloseDevToolsWindow();
- EXPECT_TRUE(tags_manager()->tracked_tags().empty());
+ EXPECT_EQ(1U, tags_manager()->tracked_tags().size());
}
IN_PROC_BROWSER_TEST_F(DevToolsTagTest, DevToolsTaskIsProvided) {
- EXPECT_TRUE(provided_tasks().empty());
- EXPECT_TRUE(tags_manager()->tracked_tags().empty());
+ MockWebContentsTaskManager task_manager;
+ EXPECT_TRUE(task_manager.tasks().empty());
+ // Browser tests start with a single tab.
+ EXPECT_EQ(1U, tags_manager()->tracked_tags().size());
- WebContentsTaskProvider provider;
- provider.SetObserver(this);
+ task_manager.StartObserving();
- // Still empty, no pre-existing tasks.
- EXPECT_TRUE(provided_tasks().empty());
+ // The pre-existing tab is provided.
+ EXPECT_EQ(1U, task_manager.tasks().size());
LoadTestPage(kTestPage1);
- // TODO(afakhry): This will change soon.
- EXPECT_TRUE(provided_tasks().empty());
- EXPECT_TRUE(tags_manager()->tracked_tags().empty());
+ EXPECT_EQ(1U, tags_manager()->tracked_tags().size());
+ EXPECT_EQ(1U, task_manager.tasks().size());
OpenDevToolsWindow(true);
- EXPECT_FALSE(tags_manager()->tracked_tags().empty());
- EXPECT_EQ(1U, tags_manager()->tracked_tags().size());
- EXPECT_FALSE(provided_tasks().empty());
- EXPECT_EQ(1U, provided_tasks().size());
+ EXPECT_EQ(2U, tags_manager()->tracked_tags().size());
+ EXPECT_EQ(2U, task_manager.tasks().size());
- const Task* task = *provided_tasks().begin();
+ const Task* task = task_manager.tasks().back();
EXPECT_EQ(Task::RENDERER, task->GetType());
// Navigating to a new page will not change the title of the devtools main
@@ -135,8 +111,8 @@ IN_PROC_BROWSER_TEST_F(DevToolsTagTest, DevToolsTaskIsProvided) {
EXPECT_EQ(title1, title2);
CloseDevToolsWindow();
- EXPECT_TRUE(provided_tasks().empty());
- EXPECT_TRUE(tags_manager()->tracked_tags().empty());
+ EXPECT_EQ(1U, tags_manager()->tracked_tags().size());
+ EXPECT_EQ(1U, task_manager.tasks().size());
}
} // namespace task_management
diff --git a/chrome/browser/task_management/providers/web_contents/prerender_tag.cc b/chrome/browser/task_management/providers/web_contents/prerender_tag.cc
index 6e6ae3d..499756c 100644
--- a/chrome/browser/task_management/providers/web_contents/prerender_tag.cc
+++ b/chrome/browser/task_management/providers/web_contents/prerender_tag.cc
@@ -3,7 +3,6 @@
// found in the LICENSE file.
#include "chrome/browser/task_management/providers/web_contents/prerender_tag.h"
-#include "chrome/browser/task_management/providers/web_contents/web_contents_tags_manager.h"
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 33cef0e..32acdb1 100644
--- a/chrome/browser/task_management/providers/web_contents/renderer_task.cc
+++ b/chrome/browser/task_management/providers/web_contents/renderer_task.cc
@@ -11,9 +11,11 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_info_cache.h"
#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/grit/generated_resources.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_delegate.h"
+#include "ui/base/l10n/l10n_util.h"
namespace task_management {
@@ -141,4 +143,29 @@ const gfx::ImageSkia* RendererTask::GetFaviconFromWebContents(
return image.ToImageSkia();
}
+// static
+const base::string16 RendererTask::PrefixRendererTitle(
+ const base::string16& title,
+ bool is_app,
+ bool is_extension,
+ bool is_incognito) {
+ 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)
+ message_id = IDS_TASK_MANAGER_APP_INCOGNITO_PREFIX;
+ else
+ message_id = IDS_TASK_MANAGER_APP_PREFIX;
+ } else if (is_extension) {
+ if (is_incognito)
+ message_id = IDS_TASK_MANAGER_EXTENSION_INCOGNITO_PREFIX;
+ else
+ message_id = IDS_TASK_MANAGER_EXTENSION_PREFIX;
+ }
+
+ return l10n_util::GetStringFUTF16(message_id, title);
+}
+
} // namespace task_management
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 5fcb445..ed88fd0 100644
--- a/chrome/browser/task_management/providers/web_contents/renderer_task.h
+++ b/chrome/browser/task_management/providers/web_contents/renderer_task.h
@@ -55,6 +55,13 @@ class RendererTask : public Task {
static const gfx::ImageSkia* GetFaviconFromWebContents(
content::WebContents* web_contents);
+ // Prefixes the given renderer |title| with the appropriate string based on
+ // whether it's an app, an extension, or incognito.
+ static const base::string16 PrefixRendererTitle(const base::string16& title,
+ bool is_app,
+ bool is_extension,
+ bool is_incognito);
+
content::WebContents* web_contents() const { return web_contents_; }
private:
diff --git a/chrome/browser/task_management/providers/web_contents/tab_contents_tag.cc b/chrome/browser/task_management/providers/web_contents/tab_contents_tag.cc
new file mode 100644
index 0000000..9ac341c
--- /dev/null
+++ b/chrome/browser/task_management/providers/web_contents/tab_contents_tag.cc
@@ -0,0 +1,20 @@
+// 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/tab_contents_tag.h"
+
+namespace task_management {
+
+TabContentsTask* TabContentsTag::CreateTask() const {
+ return new TabContentsTask(web_contents());
+}
+
+TabContentsTag::TabContentsTag(content::WebContents* web_contents)
+ : WebContentsTag(web_contents) {
+}
+
+TabContentsTag::~TabContentsTag() {
+}
+
+} // namespace task_management
diff --git a/chrome/browser/task_management/providers/web_contents/tab_contents_tag.h b/chrome/browser/task_management/providers/web_contents/tab_contents_tag.h
new file mode 100644
index 0000000..777a62f
--- /dev/null
+++ b/chrome/browser/task_management/providers/web_contents/tab_contents_tag.h
@@ -0,0 +1,30 @@
+// 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_TAB_CONTENTS_TAG_H_
+#define CHROME_BROWSER_TASK_MANAGEMENT_PROVIDERS_WEB_CONTENTS_TAB_CONTENTS_TAG_H_
+
+#include "chrome/browser/task_management/providers/web_contents/tab_contents_task.h"
+#include "chrome/browser/task_management/providers/web_contents/web_contents_tag.h"
+
+namespace task_management {
+
+// Defines a concrete UserData type for WebContents owned by the TabStripModel.
+class TabContentsTag : public WebContentsTag {
+ public:
+ // task_management::WebContentsTag:
+ TabContentsTask* CreateTask() const override;
+
+ private:
+ friend class WebContentsTags;
+
+ explicit TabContentsTag(content::WebContents* web_contents);
+ ~TabContentsTag() override;
+
+ DISALLOW_COPY_AND_ASSIGN(TabContentsTag);
+};
+
+} // namespace task_management
+
+#endif // CHROME_BROWSER_TASK_MANAGEMENT_PROVIDERS_WEB_CONTENTS_TAB_CONTENTS_TAG_H_
diff --git a/chrome/browser/task_management/providers/web_contents/tab_contents_tag_browsertest.cc b/chrome/browser/task_management/providers/web_contents/tab_contents_tag_browsertest.cc
new file mode 100644
index 0000000..77ea415
--- /dev/null
+++ b/chrome/browser/task_management/providers/web_contents/tab_contents_tag_browsertest.cc
@@ -0,0 +1,200 @@
+// 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/task_management/providers/web_contents/web_contents_tags_manager.h"
+#include "chrome/browser/task_management/task_management_browsertest_util.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/grit/generated_resources.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/page_transition_types.h"
+
+namespace task_management {
+
+namespace {
+
+// Defines a test page file path along with its expected task manager reported
+// values.
+struct TestPageData {
+ const char* page_file;
+ const char* title;
+ Task::Type task_type;
+ int expected_prefix_message;
+};
+
+// The below test files are available in src/chrome/test/data/
+// TODO(afakhry): Add more test pages here as needed (e.g. pages that are hosted
+// in the tabs as apps or extensions).
+const TestPageData kTestPages[] = {
+ {
+ "/title1.html",
+ "",
+ Task::RENDERER,
+ IDS_TASK_MANAGER_TAB_PREFIX
+ },
+ {
+ "/title2.html",
+ "Title Of Awesomeness",
+ Task::RENDERER,
+ IDS_TASK_MANAGER_TAB_PREFIX
+ },
+ {
+ "/title3.html",
+ "Title Of More Awesomeness",
+ Task::RENDERER,
+ IDS_TASK_MANAGER_TAB_PREFIX
+ },
+};
+
+const size_t kTestPagesLength = arraysize(kTestPages);
+
+} // namespace
+
+// Defines a browser test class for testing the task manager tracking of tab
+// contents.
+class TabContentsTagTest : public InProcessBrowserTest {
+ public:
+ TabContentsTagTest() {
+ EXPECT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
+ }
+ ~TabContentsTagTest() override {}
+
+ void AddNewTestTabAt(int index, const char* test_page_file) {
+ int tabs_count_before = tabs_count();
+ GURL url = GetUrlOfFile(test_page_file);
+ AddTabAtIndex(index, url, ui::PAGE_TRANSITION_TYPED);
+ EXPECT_EQ(++tabs_count_before, tabs_count());
+ }
+
+ void NavigateToUrl(const char* test_page_file) {
+ ui_test_utils::NavigateToURL(browser(), GetUrlOfFile(test_page_file));
+ }
+
+ void CloseTabAt(int index) {
+ browser()->tab_strip_model()->CloseWebContentsAt(index,
+ TabStripModel::CLOSE_NONE);
+ }
+
+ base::string16 GetTestPageExpectedTitle(const TestPageData& page_data) const {
+ // Pages with no title should fall back to their URL.
+ base::string16 title = base::UTF8ToUTF16(page_data.title);
+ if (title.empty()) {
+ GURL url = GetUrlOfFile(page_data.page_file);
+ title = base::UTF8ToUTF16(url.spec());
+ }
+ return l10n_util::GetStringFUTF16(page_data.expected_prefix_message, title);
+ }
+
+ base::string16 GetAboutBlankExpectedTitle() const {
+ return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_TAB_PREFIX,
+ base::UTF8ToUTF16("about:blank"));
+ }
+
+ int tabs_count() const { return browser()->tab_strip_model()->count(); }
+
+ const std::vector<WebContentsTag*>& tracked_tags() const {
+ return WebContentsTagsManager::GetInstance()->tracked_tags();
+ }
+
+ private:
+ GURL GetUrlOfFile(const char* test_page_file) const {
+ return embedded_test_server()->GetURL(test_page_file);
+ }
+
+ DISALLOW_COPY_AND_ASSIGN(TabContentsTagTest);
+};
+
+// Tests that TabContentsTags are being recorded correctly by the
+// WebContentsTagsManager.
+IN_PROC_BROWSER_TEST_F(TabContentsTagTest, BasicTagsTracking) {
+ // Browser tests start with a single tab.
+ EXPECT_EQ(1, tabs_count());
+ EXPECT_EQ(1U, tracked_tags().size());
+
+ // Add a bunch of tabs and make sure we're tracking them.
+ AddNewTestTabAt(0, kTestPages[0].page_file);
+ EXPECT_EQ(2, tabs_count());
+ EXPECT_EQ(2U, tracked_tags().size());
+
+ AddNewTestTabAt(1, kTestPages[1].page_file);
+ EXPECT_EQ(3, tabs_count());
+ EXPECT_EQ(3U, tracked_tags().size());
+
+ // Navigating the selected tab doesn't change the number of tabs nor the
+ // number of tags.
+ NavigateToUrl(kTestPages[2].page_file);
+ EXPECT_EQ(3, tabs_count());
+ EXPECT_EQ(3U, tracked_tags().size());
+
+ // Close a bunch of tabs and make sure we can notice that.
+ CloseTabAt(0);
+ CloseTabAt(0);
+ EXPECT_EQ(1, tabs_count());
+ EXPECT_EQ(1U, tracked_tags().size());
+}
+
+// Tests that the pre-task-manager-existing tabs are given to the task manager
+// once it starts observing.
+IN_PROC_BROWSER_TEST_F(TabContentsTagTest, PreExistingTaskProviding) {
+ // We start with the "about:blank" tab.
+ EXPECT_EQ(1, tabs_count());
+ EXPECT_EQ(1U, tracked_tags().size());
+
+ // Add a bunch of tabs and make sure when the task manager is created and
+ // starts observing sees those pre-existing tabs.
+ AddNewTestTabAt(0, kTestPages[0].page_file);
+ EXPECT_EQ(2, tabs_count());
+ EXPECT_EQ(2U, tracked_tags().size());
+ AddNewTestTabAt(1, kTestPages[1].page_file);
+ EXPECT_EQ(3, tabs_count());
+ EXPECT_EQ(3U, tracked_tags().size());
+
+ MockWebContentsTaskManager task_manager;
+ EXPECT_TRUE(task_manager.tasks().empty());
+ task_manager.StartObserving();
+ EXPECT_EQ(3U, task_manager.tasks().size());
+}
+
+// Tests that the task manager sees the correct tabs with their correct
+// corresponding tasks data.
+IN_PROC_BROWSER_TEST_F(TabContentsTagTest, PostExistingTaskProviding) {
+ // We start with the "about:blank" tab.
+ EXPECT_EQ(1, tabs_count());
+ EXPECT_EQ(1U, tracked_tags().size());
+
+ MockWebContentsTaskManager task_manager;
+ EXPECT_TRUE(task_manager.tasks().empty());
+ task_manager.StartObserving();
+ EXPECT_EQ(1U, task_manager.tasks().size());
+
+ const Task* first_tab_task = task_manager.tasks()[0];
+ EXPECT_EQ(Task::RENDERER, first_tab_task->GetType());
+ EXPECT_EQ(GetAboutBlankExpectedTitle(), first_tab_task->title());
+
+ // Add the test pages in order and test the provided tasks.
+ for (auto& test_page_data : kTestPages) {
+ AddNewTestTabAt(0, test_page_data.page_file);
+
+ const Task* task = task_manager.tasks().back();
+ EXPECT_EQ(test_page_data.task_type, task->GetType());
+ EXPECT_EQ(GetTestPageExpectedTitle(test_page_data), task->title());
+ }
+
+ EXPECT_EQ(1 + kTestPagesLength, task_manager.tasks().size());
+
+ // Close the last tab that was added. Make sure it doesn't show up in the
+ // task manager.
+ CloseTabAt(0);
+ EXPECT_EQ(kTestPagesLength, task_manager.tasks().size());
+ const base::string16 closed_tab_title =
+ GetTestPageExpectedTitle(kTestPages[kTestPagesLength - 1]);
+ for (auto& task : task_manager.tasks())
+ EXPECT_NE(closed_tab_title, task->title());
+}
+
+} // namespace task_management
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
new file mode 100644
index 0000000..fdca98d
--- /dev/null
+++ b/chrome/browser/task_management/providers/web_contents/tab_contents_task.cc
@@ -0,0 +1,75 @@
+// 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/tab_contents_task.h"
+
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/profiles/profile.h"
+#include "content/public/browser/web_contents.h"
+#include "extensions/browser/extension_registry.h"
+#include "extensions/browser/process_map.h"
+#include "extensions/common/constants.h"
+
+namespace task_management {
+
+namespace {
+
+bool HostsExtension(content::WebContents* web_contents) {
+ DCHECK(web_contents);
+ return web_contents->GetURL().SchemeIs(extensions::kExtensionScheme);
+}
+
+} // namespace
+
+
+TabContentsTask::TabContentsTask(content::WebContents* web_contents)
+ : RendererTask(base::string16(),
+ RendererTask::GetFaviconFromWebContents(web_contents),
+ web_contents) {
+ set_title(GetCurrentTitle());
+}
+
+TabContentsTask::~TabContentsTask() {
+}
+
+void TabContentsTask::OnTitleChanged(content::NavigationEntry* entry) {
+ set_title(GetCurrentTitle());
+}
+
+void TabContentsTask::OnFaviconChanged() {
+ set_icon(*RendererTask::GetFaviconFromWebContents(web_contents()));
+}
+
+Task::Type TabContentsTask::GetType() const {
+ // A tab that loads an extension URL is considered to be an extension even
+ // though it's tracked as a TabContentsTask.
+ return HostsExtension(web_contents()) ? Task::EXTENSION : Task::RENDERER;
+}
+
+base::string16 TabContentsTask::GetCurrentTitle() const {
+ // Check if the URL is an app and if the tab is hoisting an extension.
+ Profile* profile =
+ Profile::FromBrowserContext(web_contents()->GetBrowserContext());
+ extensions::ProcessMap* process_map = extensions::ProcessMap::Get(profile);
+ extensions::ExtensionRegistry* extension_registry =
+ extensions::ExtensionRegistry::Get(profile);
+ GURL url = web_contents()->GetURL();
+ base::string16 url_spec = base::UTF8ToUTF16(url.spec());
+
+ bool is_app = process_map->Contains(process_id()) &&
+ extension_registry->enabled_extensions().GetAppByURL(url) != nullptr;
+ bool is_extension = HostsExtension(web_contents());
+ bool is_incognito = profile->IsOffTheRecord();
+
+ base::string16 tab_title =
+ RendererTask::GetTitleFromWebContents(web_contents());
+
+ // Fall back to the URL if the title is empty.
+ return PrefixRendererTitle(tab_title.empty() ? url_spec : tab_title,
+ is_app,
+ is_extension,
+ is_incognito);
+}
+
+} // namespace task_management
diff --git a/chrome/browser/task_management/providers/web_contents/tab_contents_task.h b/chrome/browser/task_management/providers/web_contents/tab_contents_task.h
new file mode 100644
index 0000000..2005967
--- /dev/null
+++ b/chrome/browser/task_management/providers/web_contents/tab_contents_task.h
@@ -0,0 +1,32 @@
+// 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_TAB_CONTENTS_TASK_H_
+#define CHROME_BROWSER_TASK_MANAGEMENT_PROVIDERS_WEB_CONTENTS_TAB_CONTENTS_TASK_H_
+
+#include "chrome/browser/task_management/providers/web_contents/renderer_task.h"
+
+namespace task_management {
+
+// Defines a task manager representation of WebContents owned by the
+// TabStripModel.
+class TabContentsTask : public RendererTask {
+ public:
+ explicit TabContentsTask(content::WebContents* web_contents);
+ ~TabContentsTask() override;
+
+ // task_management::RendererTask:
+ void OnTitleChanged(content::NavigationEntry* entry) override;
+ void OnFaviconChanged() override;
+ Type GetType() const override;
+
+ private:
+ base::string16 GetCurrentTitle() const;
+
+ DISALLOW_COPY_AND_ASSIGN(TabContentsTask);
+};
+
+} // namespace task_management
+
+#endif // CHROME_BROWSER_TASK_MANAGEMENT_PROVIDERS_WEB_CONTENTS_TAB_CONTENTS_TASK_H_
diff --git a/chrome/browser/task_management/providers/web_contents/web_contents_tags_manager.cc b/chrome/browser/task_management/providers/web_contents/web_contents_tags_manager.cc
index 44d0c64..8c13df2 100644
--- a/chrome/browser/task_management/providers/web_contents/web_contents_tags_manager.cc
+++ b/chrome/browser/task_management/providers/web_contents/web_contents_tags_manager.cc
@@ -16,7 +16,7 @@ WebContentsTagsManager* WebContentsTagsManager::GetInstance() {
void WebContentsTagsManager::AddTag(WebContentsTag* tag) {
DCHECK(tag);
- tracked_tags_.insert(tag);
+ tracked_tags_.push_back(tag);
if (provider_)
provider_->OnWebContentsTagCreated(tag);
@@ -24,7 +24,9 @@ void WebContentsTagsManager::AddTag(WebContentsTag* tag) {
void WebContentsTagsManager::RemoveTag(WebContentsTag* tag) {
DCHECK(tag);
- tracked_tags_.erase(tag);
+ tracked_tags_.erase(std::find(tracked_tags_.begin(),
+ tracked_tags_.end(),
+ tag));
// No need to inform the provider here. The provider will create an entry
// for each WebContents it's tracking which is a WebContentsObserver and
diff --git a/chrome/browser/task_management/providers/web_contents/web_contents_tags_manager.h b/chrome/browser/task_management/providers/web_contents/web_contents_tags_manager.h
index da4a315..81aaa91 100644
--- a/chrome/browser/task_management/providers/web_contents/web_contents_tags_manager.h
+++ b/chrome/browser/task_management/providers/web_contents/web_contents_tags_manager.h
@@ -5,7 +5,7 @@
#ifndef CHROME_BROWSER_TASK_MANAGEMENT_PROVIDERS_WEB_CONTENTS_WEB_CONTENTS_TAGS_MANAGER_H_
#define CHROME_BROWSER_TASK_MANAGEMENT_PROVIDERS_WEB_CONTENTS_WEB_CONTENTS_TAGS_MANAGER_H_
-#include <set>
+#include <vector>
#include "chrome/browser/task_management/providers/web_contents/web_contents_tag.h"
@@ -39,7 +39,7 @@ class WebContentsTagsManager {
// or else the corresponding task for the |tag| will continue to exist.
void ClearFromProvider(const WebContentsTag* tag);
- const std::set<WebContentsTag*>& tracked_tags() const {
+ const std::vector<WebContentsTag*>& tracked_tags() const {
return tracked_tags_;
}
@@ -53,7 +53,7 @@ class WebContentsTagsManager {
WebContentsTaskProvider* provider_;
// A set of all the WebContentsTags seen so far.
- std::set<WebContentsTag*> tracked_tags_;
+ std::vector<WebContentsTag*> tracked_tags_;
DISALLOW_COPY_AND_ASSIGN(WebContentsTagsManager);
};
diff --git a/chrome/browser/task_management/providers/web_contents/web_contents_task_provider.cc b/chrome/browser/task_management/providers/web_contents/web_contents_task_provider.cc
index 4c24931..fa93a16 100644
--- a/chrome/browser/task_management/providers/web_contents/web_contents_task_provider.cc
+++ b/chrome/browser/task_management/providers/web_contents/web_contents_task_provider.cc
@@ -255,11 +255,15 @@ void WebContentsEntry::ClearTaskForFrame(RenderFrameHost* render_frame_host) {
////////////////////////////////////////////////////////////////////////////////
-WebContentsTaskProvider::WebContentsTaskProvider() : entries_map_() {
+WebContentsTaskProvider::WebContentsTaskProvider()
+ : entries_map_(),
+ is_updating_(false) {
}
WebContentsTaskProvider::~WebContentsTaskProvider() {
- STLDeleteValues(&entries_map_);
+ if (is_updating_) {
+ StopUpdating();
+ }
}
void WebContentsTaskProvider::OnWebContentsTagCreated(
@@ -328,6 +332,8 @@ bool WebContentsTaskProvider::HasWebContents(
}
void WebContentsTaskProvider::StartUpdating() {
+ is_updating_ = true;
+
// 1- Collect all pre-existing WebContents from the WebContentsTagsManager.
WebContentsTagsManager* tags_manager = WebContentsTagsManager::GetInstance();
for (auto& tag : tags_manager->tracked_tags())
@@ -338,6 +344,8 @@ void WebContentsTaskProvider::StartUpdating() {
}
void WebContentsTaskProvider::StopUpdating() {
+ is_updating_ = false;
+
// 1- Stop observing.
WebContentsTagsManager::GetInstance()->ClearProvider();
diff --git a/chrome/browser/task_management/providers/web_contents/web_contents_task_provider.h b/chrome/browser/task_management/providers/web_contents/web_contents_task_provider.h
index cc9c7f3..aeff7cc 100644
--- a/chrome/browser/task_management/providers/web_contents/web_contents_task_provider.h
+++ b/chrome/browser/task_management/providers/web_contents/web_contents_task_provider.h
@@ -58,6 +58,10 @@ class WebContentsTaskProvider : public TaskProvider {
typedef std::map<content::WebContents*, WebContentsEntry*> EntryMap;
EntryMap entries_map_;
+ // True if this provider is listening to WebContentsTags and updating its
+ // observers, false otherwise.
+ bool is_updating_;
+
DISALLOW_COPY_AND_ASSIGN(WebContentsTaskProvider);
};
diff --git a/chrome/browser/task_management/task_management_browsertest_util.cc b/chrome/browser/task_management/task_management_browsertest_util.cc
new file mode 100644
index 0000000..a644a57
--- /dev/null
+++ b/chrome/browser/task_management/task_management_browsertest_util.cc
@@ -0,0 +1,39 @@
+// 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/task_management_browsertest_util.h"
+
+#include "base/stl_util.h"
+
+namespace task_management {
+
+MockWebContentsTaskManager::MockWebContentsTaskManager()
+ : tasks_(),
+ provider_() {
+}
+
+MockWebContentsTaskManager::~MockWebContentsTaskManager() {
+}
+
+void MockWebContentsTaskManager::TaskAdded(Task* task) {
+ DCHECK(task);
+ DCHECK(!ContainsValue(tasks_, task));
+ tasks_.push_back(task);
+}
+
+void MockWebContentsTaskManager::TaskRemoved(Task* task) {
+ DCHECK(task);
+ DCHECK(ContainsValue(tasks_, task));
+ tasks_.erase(std::find(tasks_.begin(), tasks_.end(), task));
+}
+
+void MockWebContentsTaskManager::StartObserving() {
+ provider_.SetObserver(this);
+}
+
+void MockWebContentsTaskManager::StopObserving() {
+ provider_.ClearObserver();
+}
+
+} // namespace task_management
diff --git a/chrome/browser/task_management/task_management_browsertest_util.h b/chrome/browser/task_management/task_management_browsertest_util.h
new file mode 100644
index 0000000..6ba4855
--- /dev/null
+++ b/chrome/browser/task_management/task_management_browsertest_util.h
@@ -0,0 +1,40 @@
+// 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_TASK_MANAGEMENT_BROWSERTEST_UTIL_H_
+#define CHROME_BROWSER_TASK_MANAGEMENT_TASK_MANAGEMENT_BROWSERTEST_UTIL_H_
+
+#include "chrome/browser/task_management/providers/task_provider_observer.h"
+#include "chrome/browser/task_management/providers/web_contents/web_contents_tags_manager.h"
+#include "chrome/browser/task_management/providers/web_contents/web_contents_task_provider.h"
+
+namespace task_management {
+
+// Defines a test class that will act as a task manager that is designed to
+// only observe the WebContents-based tasks.
+class MockWebContentsTaskManager : public TaskProviderObserver {
+ public:
+ MockWebContentsTaskManager();
+ ~MockWebContentsTaskManager() override;
+
+ // task_management::TaskProviderObserver:
+ void TaskAdded(Task* task) override;
+ void TaskRemoved(Task* task) override;
+
+ // Start / Stop observing the WebContentsTaskProvider.
+ void StartObserving();
+ void StopObserving();
+
+ const std::vector<Task*>& tasks() const { return tasks_; }
+
+ private:
+ std::vector<Task*> tasks_;
+ WebContentsTaskProvider provider_;
+
+ DISALLOW_COPY_AND_ASSIGN(MockWebContentsTaskManager);
+};
+
+} // namespace task_management
+
+#endif // CHROME_BROWSER_TASK_MANAGEMENT_TASK_MANAGEMENT_BROWSERTEST_UTIL_H_
diff --git a/chrome/browser/task_management/web_contents_tags.cc b/chrome/browser/task_management/web_contents_tags.cc
index 9371a0d..1e5a720 100644
--- a/chrome/browser/task_management/web_contents_tags.cc
+++ b/chrome/browser/task_management/web_contents_tags.cc
@@ -7,6 +7,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/prerender_tag.h"
+#include "chrome/browser/task_management/providers/web_contents/tab_contents_tag.h"
#include "chrome/browser/task_management/providers/web_contents/web_contents_tags_manager.h"
#include "content/public/browser/web_contents.h"
@@ -70,6 +71,17 @@ void WebContentsTags::CreateForPrerenderContents(
}
// static
+void WebContentsTags::CreateForTabContents(content::WebContents* web_contents) {
+#if defined(ENABLE_TASK_MANAGER)
+ if (!WebContentsTag::FromWebContents(web_contents)) {
+ TagWebContents(web_contents,
+ new TabContentsTag(web_contents),
+ WebContentsTag::kTagKey);
+ }
+#endif // defined(ENABLE_TASK_MANAGER)
+}
+
+// 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 3c92939..c2794f6 100644
--- a/chrome/browser/task_management/web_contents_tags.h
+++ b/chrome/browser/task_management/web_contents_tags.h
@@ -46,6 +46,13 @@ class WebContentsTags {
// owned by |web_contents|.
static void CreateForPrerenderContents(content::WebContents* web_contents);
+ // Tag a WebContents owned by the TabStripModel so that it shows up in the
+ // task manager. Calling this function creates a TabContentsTag, 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|.
+ static void CreateForTabContents(content::WebContents* web_contents);
+
// 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/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 8805274..242f79b 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -84,6 +84,7 @@
#include "chrome/browser/sync/sync_ui_util.h"
#include "chrome/browser/tab_contents/retargeting_details.h"
#include "chrome/browser/tab_contents/tab_util.h"
+#include "chrome/browser/task_management/web_contents_tags.h"
#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/themes/theme_service_factory.h"
#include "chrome/browser/translate/chrome_translate_client.h"
@@ -1691,6 +1692,9 @@ void Browser::WebContentsCreated(WebContents* source_contents,
// AddNewContents.
TabHelpers::AttachTabHelpers(new_contents);
+ // Make the tab show up in the task manager.
+ task_management::WebContentsTags::CreateForTabContents(new_contents);
+
// Notify.
RetargetingDetails details;
details.source_web_contents = source_contents;
diff --git a/chrome/browser/ui/browser_navigator.cc b/chrome/browser/ui/browser_navigator.cc
index 7be37f7..fbd9415 100644
--- a/chrome/browser/ui/browser_navigator.cc
+++ b/chrome/browser/ui/browser_navigator.cc
@@ -17,6 +17,7 @@
#include "chrome/browser/prerender/prerender_manager_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/tab_contents/tab_util.h"
+#include "chrome/browser/task_management/web_contents_tags.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_instant_controller.h"
@@ -59,6 +60,9 @@ class BrowserNavigatorWebContentsAdoption {
public:
static void AttachTabHelpers(content::WebContents* contents) {
TabHelpers::AttachTabHelpers(contents);
+
+ // Make the tab show up in the task manager.
+ task_management::WebContentsTags::CreateForTabContents(contents);
}
};
diff --git a/chrome/browser/ui/browser_tab_strip_model_delegate.cc b/chrome/browser/ui/browser_tab_strip_model_delegate.cc
index 3fcd438..dcf1492 100644
--- a/chrome/browser/ui/browser_tab_strip_model_delegate.cc
+++ b/chrome/browser/ui/browser_tab_strip_model_delegate.cc
@@ -10,6 +10,7 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sessions/tab_restore_service.h"
#include "chrome/browser/sessions/tab_restore_service_factory.h"
+#include "chrome/browser/task_management/web_contents_tags.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_navigator.h"
@@ -85,6 +86,9 @@ Browser* BrowserTabStripModelDelegate::CreateNewStripWithContents(
void BrowserTabStripModelDelegate::WillAddWebContents(
content::WebContents* contents) {
TabHelpers::AttachTabHelpers(contents);
+
+ // Make the tab show up in the task manager.
+ task_management::WebContentsTags::CreateForTabContents(contents);
}
int BrowserTabStripModelDelegate::GetDragActions() const {
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index d05eee0..9a22d16 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -3019,6 +3019,10 @@
'browser/task_management/providers/web_contents/renderer_task.h',
'browser/task_management/providers/web_contents/subframe_task.cc',
'browser/task_management/providers/web_contents/subframe_task.h',
+ 'browser/task_management/providers/web_contents/tab_contents_tag.cc',
+ 'browser/task_management/providers/web_contents/tab_contents_tag.h',
+ 'browser/task_management/providers/web_contents/tab_contents_task.cc',
+ 'browser/task_management/providers/web_contents/tab_contents_task.h',
'browser/task_management/providers/web_contents/web_contents_tag.cc',
'browser/task_management/providers/web_contents/web_contents_tag.h',
'browser/task_management/providers/web_contents/web_contents_tags_manager.cc',
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index f5c869f..142639a 100644
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -406,6 +406,9 @@
'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/tab_contents_tag_browsertest.cc',
+ 'browser/task_management/task_management_browsertest_util.cc',
+ 'browser/task_management/task_management_browsertest_util.h',
'browser/task_manager/task_manager_browsertest.cc',
'browser/task_manager/task_manager_browsertest_util.cc',
'browser/task_manager/task_manager_browsertest_util.h',