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/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 
     29 using content::RenderProcessHost;
     30 using content::RenderViewHost;
     31 using content::RenderWidgetHost;
     32 using content::WebContents;
     33 using extensions::Extension;
     34 
     35 namespace task_manager {
     36 
     37 class 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 
     52 GuestResource::GuestResource(RenderViewHost* render_view_host)
     53     : RendererResource(
     54           render_view_host->GetSiteInstance()->GetProcess()->GetHandle(),
     55           render_view_host) {
     56 }
     57 
     58 GuestResource::~GuestResource() {
     59 }
     60 
     61 Resource::Type GuestResource::GetType() const {
     62   return GUEST;
     63 }
     64 
     65 base::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 
     78 gfx::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 
     87 WebContents* GuestResource::GetWebContents() const {
     88   return WebContents::FromRenderViewHost(render_view_host());
     89 }
     90 
     91 ////////////////////////////////////////////////////////////////////////////////
     92 // GuestInformation class
     93 ////////////////////////////////////////////////////////////////////////////////
     94 
     95 GuestInformation::GuestInformation() {}
     96 
     97 GuestInformation::~GuestInformation() {}
     98 
     99 bool 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 
    104 void 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 
    117 scoped_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