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/guest_information.h"
6
7#include "base/strings/string16.h"
8#include "chrome/browser/chrome_notification_types.h"
9#include "chrome/browser/favicon/favicon_tab_helper.h"
10#include "chrome/browser/profiles/profile.h"
11#include "chrome/browser/task_manager/renderer_resource.h"
12#include "chrome/browser/task_manager/resource_provider.h"
13#include "chrome/browser/task_manager/task_manager.h"
14#include "chrome/browser/task_manager/task_manager_util.h"
15#include "chrome/grit/generated_resources.h"
16#include "content/public/browser/notification_service.h"
17#include "content/public/browser/render_frame_host.h"
18#include "content/public/browser/render_process_host.h"
19#include "content/public/browser/render_view_host.h"
20#include "content/public/browser/render_widget_host_iterator.h"
21#include "content/public/browser/site_instance.h"
22#include "content/public/browser/web_contents.h"
23#include "extensions/browser/guest_view/guest_view_base.h"
24#include "extensions/strings/grit/extensions_strings.h"
25#include "ui/base/l10n/l10n_util.h"
26#include "ui/gfx/image/image.h"
27#include "ui/gfx/image/image_skia.h"
28
29using content::RenderProcessHost;
30using content::RenderViewHost;
31using content::RenderWidgetHost;
32using content::WebContents;
33using extensions::Extension;
34
35namespace task_manager {
36
37class GuestResource : public RendererResource {
38 public:
39  explicit GuestResource(content::RenderViewHost* render_view_host);
40  virtual ~GuestResource();
41
42  // Resource methods:
43  virtual Type GetType() const OVERRIDE;
44  virtual base::string16 GetTitle() const OVERRIDE;
45  virtual gfx::ImageSkia GetIcon() const OVERRIDE;
46  virtual content::WebContents* GetWebContents() const OVERRIDE;
47
48 private:
49  DISALLOW_COPY_AND_ASSIGN(GuestResource);
50};
51
52GuestResource::GuestResource(RenderViewHost* render_view_host)
53    : RendererResource(
54          render_view_host->GetSiteInstance()->GetProcess()->GetHandle(),
55          render_view_host) {
56}
57
58GuestResource::~GuestResource() {
59}
60
61Resource::Type GuestResource::GetType() const {
62  return GUEST;
63}
64
65base::string16 GuestResource::GetTitle() const {
66  WebContents* web_contents = GetWebContents();
67  if (!web_contents) {
68    const int message_id = IDS_EXTENSION_TASK_MANAGER_WEBVIEW_TAG_PREFIX;
69    return l10n_util::GetStringFUTF16(message_id, base::string16());
70  }
71  extensions::GuestViewBase* guest =
72      extensions::GuestViewBase::FromWebContents(web_contents);
73  return l10n_util::GetStringFUTF16(
74      guest->GetTaskPrefix(),
75      util::GetTitleFromWebContents(web_contents));
76}
77
78gfx::ImageSkia GuestResource::GetIcon() const {
79  WebContents* web_contents = GetWebContents();
80  if (web_contents && FaviconTabHelper::FromWebContents(web_contents)) {
81    return FaviconTabHelper::FromWebContents(web_contents)->
82        GetFavicon().AsImageSkia();
83  }
84  return gfx::ImageSkia();
85}
86
87WebContents* GuestResource::GetWebContents() const {
88  return WebContents::FromRenderViewHost(render_view_host());
89}
90
91////////////////////////////////////////////////////////////////////////////////
92// GuestInformation class
93////////////////////////////////////////////////////////////////////////////////
94
95GuestInformation::GuestInformation() {}
96
97GuestInformation::~GuestInformation() {}
98
99bool GuestInformation::CheckOwnership(WebContents* web_contents) {
100  // Guest WebContentses are created and owned internally by the content layer.
101  return extensions::GuestViewBase::IsGuest(web_contents);
102}
103
104void GuestInformation::GetAll(const NewWebContentsCallback& callback) {
105  scoped_ptr<content::RenderWidgetHostIterator> widgets(
106      content::RenderWidgetHost::GetRenderWidgetHosts());
107  while (content::RenderWidgetHost* widget = widgets->GetNextHost()) {
108    if (widget->IsRenderView()) {
109      content::RenderViewHost* rvh = content::RenderViewHost::From(widget);
110      WebContents* web_contents = WebContents::FromRenderViewHost(rvh);
111      if (web_contents && extensions::GuestViewBase::IsGuest(web_contents))
112        callback.Run(web_contents);
113    }
114  }
115}
116
117scoped_ptr<RendererResource> GuestInformation::MakeResource(
118    WebContents* web_contents) {
119  return scoped_ptr<RendererResource>(
120      new GuestResource(web_contents->GetRenderViewHost()));
121}
122
123}  // namespace task_manager
124