Home | History | Annotate | Download | only in task_manager
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/task_manager/background_information.h"
      6 
      7 #include "base/i18n/rtl.h"
      8 #include "base/strings/string16.h"
      9 #include "base/strings/utf_string_conversions.h"
     10 #include "chrome/browser/background/background_contents_service.h"
     11 #include "chrome/browser/background/background_contents_service_factory.h"
     12 #include "chrome/browser/browser_process.h"
     13 #include "chrome/browser/chrome_notification_types.h"
     14 #include "chrome/browser/extensions/extension_service.h"
     15 #include "chrome/browser/profiles/profile.h"
     16 #include "chrome/browser/profiles/profile_manager.h"
     17 #include "chrome/browser/tab_contents/background_contents.h"
     18 #include "chrome/browser/task_manager/renderer_resource.h"
     19 #include "chrome/browser/task_manager/resource_provider.h"
     20 #include "chrome/browser/task_manager/task_manager.h"
     21 #include "content/public/browser/notification_service.h"
     22 #include "content/public/browser/render_frame_host.h"
     23 #include "content/public/browser/render_process_host.h"
     24 #include "content/public/browser/render_view_host.h"
     25 #include "content/public/browser/web_contents.h"
     26 #include "extensions/browser/view_type_utils.h"
     27 #include "extensions/common/extension.h"
     28 #include "grit/generated_resources.h"
     29 #include "grit/theme_resources.h"
     30 #include "ui/base/l10n/l10n_util.h"
     31 #include "ui/base/resource/resource_bundle.h"
     32 #include "ui/gfx/image/image_skia.h"
     33 
     34 using content::RenderProcessHost;
     35 using content::RenderViewHost;
     36 using content::WebContents;
     37 using extensions::Extension;
     38 
     39 namespace task_manager {
     40 
     41 class BackgroundContentsResource : public RendererResource {
     42  public:
     43   BackgroundContentsResource(BackgroundContents* background_contents,
     44                              const base::string16& application_name);
     45   virtual ~BackgroundContentsResource();
     46 
     47   // Resource methods:
     48   virtual base::string16 GetTitle() const OVERRIDE;
     49   virtual gfx::ImageSkia GetIcon() const OVERRIDE;
     50 
     51   const base::string16& application_name() const { return application_name_; }
     52 
     53  private:
     54   BackgroundContents* background_contents_;
     55 
     56   base::string16 application_name_;
     57 
     58   // The icon painted for BackgroundContents.
     59   // TODO(atwilson): Use the favicon when there's a way to get the favicon for
     60   // BackgroundContents.
     61   static gfx::ImageSkia* default_icon_;
     62 
     63   DISALLOW_COPY_AND_ASSIGN(BackgroundContentsResource);
     64 };
     65 
     66 gfx::ImageSkia* BackgroundContentsResource::default_icon_ = NULL;
     67 
     68 BackgroundContentsResource::BackgroundContentsResource(
     69     BackgroundContents* background_contents,
     70     const base::string16& application_name)
     71     : RendererResource(
     72           background_contents->web_contents()->GetRenderProcessHost()->
     73               GetHandle(),
     74           background_contents->web_contents()->GetRenderViewHost()),
     75       background_contents_(background_contents),
     76       application_name_(application_name) {
     77   // Just use the same icon that other extension resources do.
     78   // TODO(atwilson): Use the favicon when that's available.
     79   if (!default_icon_) {
     80     ResourceBundle& rb = ResourceBundle::GetSharedInstance();
     81     default_icon_ = rb.GetImageSkiaNamed(IDR_PLUGINS_FAVICON);
     82   }
     83   // Ensure that the string has the appropriate direction markers (see comment
     84   // in TabContentsResource::GetTitle()).
     85   base::i18n::AdjustStringForLocaleDirection(&application_name_);
     86 }
     87 
     88 BackgroundContentsResource::~BackgroundContentsResource() {}
     89 
     90 base::string16 BackgroundContentsResource::GetTitle() const {
     91   base::string16 title = application_name_;
     92 
     93   if (title.empty()) {
     94     // No title (can't locate the parent app for some reason) so just display
     95     // the URL (properly forced to be LTR).
     96     title = base::i18n::GetDisplayStringInLTRDirectionality(
     97         base::UTF8ToUTF16(background_contents_->GetURL().spec()));
     98   }
     99   return l10n_util::GetStringFUTF16(IDS_TASK_MANAGER_BACKGROUND_PREFIX, title);
    100 }
    101 
    102 gfx::ImageSkia BackgroundContentsResource::GetIcon() const {
    103   return *default_icon_;
    104 }
    105 
    106 ////////////////////////////////////////////////////////////////////////////////
    107 // BackgroundInformation class
    108 ////////////////////////////////////////////////////////////////////////////////
    109 
    110 BackgroundInformation::BackgroundInformation() {}
    111 
    112 BackgroundInformation::~BackgroundInformation() {}
    113 
    114 bool BackgroundInformation::CheckOwnership(WebContents* web_contents) {
    115   extensions::ViewType view_type = extensions::GetViewType(web_contents);
    116   return view_type == extensions::VIEW_TYPE_BACKGROUND_CONTENTS;
    117 }
    118 
    119 void BackgroundInformation::GetAll(const NewWebContentsCallback& callback) {
    120   // Add all the existing BackgroundContents from every profile, including
    121   // incognito profiles.
    122   ProfileManager* profile_manager = g_browser_process->profile_manager();
    123   std::vector<Profile*> profiles(profile_manager->GetLoadedProfiles());
    124   size_t num_default_profiles = profiles.size();
    125   for (size_t i = 0; i < num_default_profiles; ++i) {
    126     if (profiles[i]->HasOffTheRecordProfile()) {
    127       profiles.push_back(profiles[i]->GetOffTheRecordProfile());
    128     }
    129   }
    130   for (size_t i = 0; i < profiles.size(); ++i) {
    131     BackgroundContentsService* background_contents_service =
    132         BackgroundContentsServiceFactory::GetForProfile(profiles[i]);
    133     std::vector<BackgroundContents*> contents =
    134         background_contents_service->GetBackgroundContents();
    135     for (std::vector<BackgroundContents*>::iterator iterator = contents.begin();
    136          iterator != contents.end();
    137          ++iterator) {
    138       callback.Run((*iterator)->web_contents());
    139     }
    140   }
    141 }
    142 
    143 scoped_ptr<RendererResource> BackgroundInformation::MakeResource(
    144     WebContents* web_contents) {
    145   Profile* profile =
    146       Profile::FromBrowserContext(web_contents->GetBrowserContext());
    147   ExtensionService* extension_service = profile->GetExtensionService();
    148   BackgroundContentsService* background_contents_service =
    149       BackgroundContentsServiceFactory::GetForProfile(profile);
    150   std::vector<BackgroundContents*> contents =
    151       background_contents_service->GetBackgroundContents();
    152   for (std::vector<BackgroundContents*>::iterator iterator = contents.begin();
    153        iterator != contents.end();
    154        ++iterator) {
    155     if ((*iterator)->web_contents() == web_contents) {
    156       base::string16 application_name;
    157       // Lookup the name from the parent extension.
    158       if (extension_service) {
    159         const base::string16& application_id =
    160             background_contents_service->GetParentApplicationId(*iterator);
    161         const Extension* extension = extension_service->GetExtensionById(
    162             base::UTF16ToUTF8(application_id), false);
    163         if (extension)
    164           application_name = base::UTF8ToUTF16(extension->name());
    165       }
    166       return scoped_ptr<RendererResource>(
    167           new BackgroundContentsResource(*iterator, application_name));
    168     }
    169   }
    170   NOTREACHED();
    171   return scoped_ptr<RendererResource>();
    172 }
    173 
    174 }  // namespace task_manager
    175