Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(29)

Unified Diff: chrome/browser/task_manager/task_manager_background_resource_provider.cc

Issue 15196003: Create task_manager namespace and wrap classes related to TaskManager with it. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/task_manager/task_manager_background_resource_provider.cc
diff --git a/chrome/browser/task_manager/task_manager_background_resource_provider.cc b/chrome/browser/task_manager/task_manager_background_resource_provider.cc
deleted file mode 100644
index 6c95b90c82ab365f4f6b8bfd29f8b280e325bbdc..0000000000000000000000000000000000000000
--- a/chrome/browser/task_manager/task_manager_background_resource_provider.cc
+++ /dev/null
@@ -1,315 +0,0 @@
-// Copyright 2013 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_manager/task_manager_background_resource_provider.h"
-
-#include "base/i18n/rtl.h"
-#include "base/string16.h"
-#include "base/utf_string_conversions.h"
-#include "chrome/browser/background/background_contents_service.h"
-#include "chrome/browser/background/background_contents_service_factory.h"
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/browser/tab_contents/background_contents.h"
-#include "chrome/browser/task_manager/task_manager_render_resource.h"
-#include "chrome/common/chrome_notification_types.h"
-#include "chrome/common/extensions/extension.h"
-#include "content/public/browser/notification_service.h"
-#include "content/public/browser/render_process_host.h"
-#include "content/public/browser/render_view_host.h"
-#include "content/public/browser/web_contents.h"
-#include "grit/generated_resources.h"
-#include "grit/theme_resources.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/resource/resource_bundle.h"
-#include "ui/gfx/image/image_skia.h"
-
-using content::RenderProcessHost;
-using content::RenderViewHost;
-using content::WebContents;
-using extensions::Extension;
-
-class TaskManagerBackgroundContentsResource
- : public TaskManagerRendererResource {
- public:
- TaskManagerBackgroundContentsResource(
- BackgroundContents* background_contents,
- const string16& application_name);
- virtual ~TaskManagerBackgroundContentsResource();
-
- // TaskManager::Resource methods:
- virtual string16 GetTitle() const OVERRIDE;
- virtual string16 GetProfileName() const OVERRIDE;
- virtual gfx::ImageSkia GetIcon() const OVERRIDE;
- virtual bool IsBackground() const OVERRIDE;
-
- const string16& application_name() const { return application_name_; }
- private:
- BackgroundContents* background_contents_;
-
- string16 application_name_;
-
- // The icon painted for BackgroundContents.
- // TODO(atwilson): Use the favicon when there's a way to get the favicon for
- // BackgroundContents.
- static gfx::ImageSkia* default_icon_;
-
- DISALLOW_COPY_AND_ASSIGN(TaskManagerBackgroundContentsResource);
-};
-
-gfx::ImageSkia* TaskManagerBackgroundContentsResource::default_icon_ = NULL;
-
-// TODO(atwilson): http://crbug.com/116893
-// HACK: if the process handle is invalid, we use the current process's handle.
-// This preserves old behavior but is incorrect, and should be fixed.
-TaskManagerBackgroundContentsResource::TaskManagerBackgroundContentsResource(
- BackgroundContents* background_contents,
- const string16& application_name)
- : TaskManagerRendererResource(
- background_contents->web_contents()->GetRenderProcessHost()->
- GetHandle() ?
- background_contents->web_contents()->GetRenderProcessHost()->
- GetHandle() :
- base::Process::Current().handle(),
- background_contents->web_contents()->GetRenderViewHost()),
- background_contents_(background_contents),
- application_name_(application_name) {
- // Just use the same icon that other extension resources do.
- // TODO(atwilson): Use the favicon when that's available.
- if (!default_icon_) {
- ResourceBundle& rb = ResourceBundle::GetSharedInstance();
- default_icon_ = rb.GetImageSkiaNamed(IDR_PLUGINS_FAVICON);
- }
- // Ensure that the string has the appropriate direction markers (see comment
- // in TaskManagerTabContentsResource::GetTitle()).
- base::i18n::AdjustStringForLocaleDirection(&application_name_);
-}
-
-TaskManagerBackgroundContentsResource::~TaskManagerBackgroundContentsResource(
- ) {
-}
-
-string16 TaskManagerBackgroundContentsResource::GetTitle() const {
- string16 title = application_name_;
-
- if (title.empty()) {
- // No title (can't locate the parent app for some reason) so just display
- // the URL (properly forced to be LTR).
- title = base::i18n::GetDisplayStringInLTRDirectionality(
- UTF8ToUTF16(background_contents_->GetURL().spec()));
- }
- return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_BACKGROUND_PREFIX, title);
-}
-
-string16 TaskManagerBackgroundContentsResource::GetProfileName() const {
- return string16();
-}
-
-gfx::ImageSkia TaskManagerBackgroundContentsResource::GetIcon() const {
- return *default_icon_;
-}
-
-bool TaskManagerBackgroundContentsResource::IsBackground() const {
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// TaskManagerBackgroundContentsResourceProvider class
-////////////////////////////////////////////////////////////////////////////////
-
-TaskManagerBackgroundContentsResourceProvider::
- TaskManagerBackgroundContentsResourceProvider(TaskManager* task_manager)
- : updating_(false),
- task_manager_(task_manager) {
-}
-
-TaskManagerBackgroundContentsResourceProvider::
- ~TaskManagerBackgroundContentsResourceProvider() {
-}
-
-TaskManager::Resource*
-TaskManagerBackgroundContentsResourceProvider::GetResource(
- int origin_pid,
- int render_process_host_id,
- int routing_id) {
- // If an origin PID was specified, the request is from a plugin, not the
- // render view host process
- if (origin_pid)
- return NULL;
-
- for (Resources::iterator i = resources_.begin(); i != resources_.end(); i++) {
- WebContents* tab = i->first->web_contents();
- if (tab->GetRenderProcessHost()->GetID() == render_process_host_id
- && tab->GetRenderViewHost()->GetRoutingID() == routing_id) {
- return i->second;
- }
- }
-
- // Can happen if the page went away while a network request was being
- // performed.
- return NULL;
-}
-
-void TaskManagerBackgroundContentsResourceProvider::StartUpdating() {
- DCHECK(!updating_);
- updating_ = true;
-
- // Add all the existing BackgroundContents from every profile, including
- // incognito profiles.
- ProfileManager* profile_manager = g_browser_process->profile_manager();
- std::vector<Profile*> profiles(profile_manager->GetLoadedProfiles());
- size_t num_default_profiles = profiles.size();
- for (size_t i = 0; i < num_default_profiles; ++i) {
- if (profiles[i]->HasOffTheRecordProfile()) {
- profiles.push_back(profiles[i]->GetOffTheRecordProfile());
- }
- }
- for (size_t i = 0; i < profiles.size(); ++i) {
- BackgroundContentsService* background_contents_service =
- BackgroundContentsServiceFactory::GetForProfile(profiles[i]);
- std::vector<BackgroundContents*> contents =
- background_contents_service->GetBackgroundContents();
- ExtensionService* extension_service = profiles[i]->GetExtensionService();
- for (std::vector<BackgroundContents*>::iterator iterator = contents.begin();
- iterator != contents.end(); ++iterator) {
- string16 application_name;
- // Lookup the name from the parent extension.
- if (extension_service) {
- const string16& application_id =
- background_contents_service->GetParentApplicationId(*iterator);
- const Extension* extension = extension_service->GetExtensionById(
- UTF16ToUTF8(application_id), false);
- if (extension)
- application_name = UTF8ToUTF16(extension->name());
- }
- Add(*iterator, application_name);
- }
- }
-
- // Then we register for notifications to get new BackgroundContents.
- registrar_.Add(this, chrome::NOTIFICATION_BACKGROUND_CONTENTS_OPENED,
- content::NotificationService::AllBrowserContextsAndSources());
- registrar_.Add(this, chrome::NOTIFICATION_BACKGROUND_CONTENTS_NAVIGATED,
- content::NotificationService::AllBrowserContextsAndSources());
- registrar_.Add(this, chrome::NOTIFICATION_BACKGROUND_CONTENTS_DELETED,
- content::NotificationService::AllBrowserContextsAndSources());
-}
-
-void TaskManagerBackgroundContentsResourceProvider::StopUpdating() {
- DCHECK(updating_);
- updating_ = false;
-
- // Unregister for notifications
- registrar_.Remove(
- this, chrome::NOTIFICATION_BACKGROUND_CONTENTS_OPENED,
- content::NotificationService::AllBrowserContextsAndSources());
- registrar_.Remove(
- this, chrome::NOTIFICATION_BACKGROUND_CONTENTS_NAVIGATED,
- content::NotificationService::AllBrowserContextsAndSources());
- registrar_.Remove(
- this, chrome::NOTIFICATION_BACKGROUND_CONTENTS_DELETED,
- content::NotificationService::AllBrowserContextsAndSources());
-
- // Delete all the resources.
- STLDeleteContainerPairSecondPointers(resources_.begin(), resources_.end());
-
- resources_.clear();
-}
-
-void TaskManagerBackgroundContentsResourceProvider::AddToTaskManager(
- BackgroundContents* background_contents,
- const string16& application_name) {
- TaskManagerBackgroundContentsResource* resource =
- new TaskManagerBackgroundContentsResource(background_contents,
- application_name);
- resources_[background_contents] = resource;
- task_manager_->AddResource(resource);
-}
-
-void TaskManagerBackgroundContentsResourceProvider::Add(
- BackgroundContents* contents, const string16& application_name) {
- if (!updating_)
- return;
-
- // TODO(atwilson): http://crbug.com/116893
- // We should check that the process handle is valid here, but it won't
- // be in the case of NOTIFICATION_BACKGROUND_CONTENTS_OPENED.
-
- // Should never add the same BackgroundContents twice.
- DCHECK(resources_.find(contents) == resources_.end());
- AddToTaskManager(contents, application_name);
-}
-
-void TaskManagerBackgroundContentsResourceProvider::Remove(
- BackgroundContents* contents) {
- if (!updating_)
- return;
- Resources::iterator iter = resources_.find(contents);
- DCHECK(iter != resources_.end());
-
- // Remove the resource from the Task Manager.
- TaskManagerBackgroundContentsResource* resource = iter->second;
- task_manager_->RemoveResource(resource);
- // And from the provider.
- resources_.erase(iter);
- // Finally, delete the resource.
- delete resource;
-}
-
-void TaskManagerBackgroundContentsResourceProvider::Observe(
- int type,
- const content::NotificationSource& source,
- const content::NotificationDetails& details) {
- switch (type) {
- case chrome::NOTIFICATION_BACKGROUND_CONTENTS_OPENED: {
- // Get the name from the parent application. If no parent application is
- // found, just pass an empty string - BackgroundContentsResource::GetTitle
- // will display the URL instead in this case. This should never happen
- // except in rare cases when an extension is being unloaded or chrome is
- // exiting while the task manager is displayed.
- string16 application_name;
- ExtensionService* service =
- content::Source<Profile>(source)->GetExtensionService();
- if (service) {
- std::string application_id = UTF16ToUTF8(
- content::Details<BackgroundContentsOpenedDetails>(details)->
- application_id);
- const Extension* extension =
- service->GetExtensionById(application_id, false);
- // Extension can be NULL when running unit tests.
- if (extension)
- application_name = UTF8ToUTF16(extension->name());
- }
- Add(content::Details<BackgroundContentsOpenedDetails>(details)->contents,
- application_name);
- // Opening a new BackgroundContents needs to force the display to refresh
- // (applications may now be considered "background" that weren't before).
- task_manager_->ModelChanged();
- break;
- }
- case chrome::NOTIFICATION_BACKGROUND_CONTENTS_NAVIGATED: {
- BackgroundContents* contents =
- content::Details<BackgroundContents>(details).ptr();
- // Should never get a NAVIGATED before OPENED.
- DCHECK(resources_.find(contents) != resources_.end());
- // Preserve the application name.
- string16 application_name(
- resources_.find(contents)->second->application_name());
- Remove(contents);
- Add(contents, application_name);
- break;
- }
- case chrome::NOTIFICATION_BACKGROUND_CONTENTS_DELETED:
- Remove(content::Details<BackgroundContents>(details).ptr());
- // Closing a BackgroundContents needs to force the display to refresh
- // (applications may now be considered "foreground" that weren't before).
- task_manager_->ModelChanged();
- break;
- default:
- NOTREACHED() << "Unexpected notification.";
- return;
- }
-}

Powered by Google App Engine
This is Rietveld 408576698