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