1e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// found in the LICENSE file. 4e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 5e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chrome/browser/task_manager/extension_information.h" 6e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 7e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "base/strings/string16.h" 8e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "base/strings/utf_string_conversions.h" 9e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chrome/browser/browser_process.h" 10e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chrome/browser/profiles/profile.h" 11e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chrome/browser/profiles/profile_manager.h" 12e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chrome/browser/task_manager/renderer_resource.h" 13e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chrome/browser/task_manager/task_manager_util.h" 14e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "content/public/browser/render_frame_host.h" 15e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "content/public/browser/render_process_host.h" 16e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "content/public/browser/render_view_host.h" 17e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "content/public/browser/web_contents.h" 18e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "extensions/browser/extension_system.h" 196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/browser/guest_view/guest_view_base.h" 20e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "extensions/browser/process_manager.h" 21e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "extensions/browser/view_type_utils.h" 22e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "extensions/common/extension.h" 23e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "grit/theme_resources.h" 24e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "ui/base/l10n/l10n_util.h" 25e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "ui/base/resource/resource_bundle.h" 26e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "ui/gfx/image/image_skia.h" 27e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 28e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochusing content::WebContents; 29e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochusing extensions::Extension; 30e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 31e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochnamespace { 32e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 33e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochconst Extension* GetExtensionForWebContents(WebContents* web_contents) { 34e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch Profile* profile = 35e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch Profile::FromBrowserContext(web_contents->GetBrowserContext()); 36e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch extensions::ProcessManager* process_manager = 37e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch extensions::ExtensionSystem::Get(profile)->process_manager(); 38e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return process_manager->GetExtensionForRenderViewHost( 39e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch web_contents->GetRenderViewHost()); 40e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 41e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 42e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} // namespace 43e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 44e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochnamespace task_manager { 45e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 46e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochclass ExtensionProcessResource : public RendererResource { 47e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch public: 48e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch explicit ExtensionProcessResource(const Extension* extension, 49e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch content::RenderViewHost* render_view_host); 50e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual ~ExtensionProcessResource(); 51e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 52e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Resource methods: 53e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual base::string16 GetTitle() const OVERRIDE; 54e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual gfx::ImageSkia GetIcon() const OVERRIDE; 55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch virtual Type GetType() const OVERRIDE; 56e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 57e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch private: 58e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Returns true if the associated extension has a background page. 59e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch bool IsBackground() const; 60e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 61e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // The icon painted for the extension process. 62e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch static gfx::ImageSkia* default_icon_; 63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 64e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Cached data about the extension. 65e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch base::string16 title_; 66e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 67e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DISALLOW_COPY_AND_ASSIGN(ExtensionProcessResource); 68e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch}; 69e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 70e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochgfx::ImageSkia* ExtensionProcessResource::default_icon_ = NULL; 71e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 72e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochExtensionProcessResource::ExtensionProcessResource( 73e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const Extension* extension, 74e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch content::RenderViewHost* render_view_host) 75e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch : RendererResource(render_view_host->GetProcess()->GetHandle(), 76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch render_view_host) { 77e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (!default_icon_) { 78e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 79e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch default_icon_ = rb.GetImageSkiaNamed(IDR_PLUGINS_FAVICON); 80e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 81e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch base::string16 extension_name = base::UTF8ToUTF16(extension->name()); 82e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch DCHECK(!extension_name.empty()); 83e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 84e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch Profile* profile = Profile::FromBrowserContext( 85e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch render_view_host->GetProcess()->GetBrowserContext()); 86e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch int message_id = util::GetMessagePrefixID(extension->is_app(), 87e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch true, // is_extension 88e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch profile->IsOffTheRecord(), 89e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch false, // is_prerender 90e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch IsBackground()); 91e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch title_ = l10n_util::GetStringFUTF16(message_id, extension_name); 92e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 93e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochExtensionProcessResource::~ExtensionProcessResource() {} 95e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 96e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochbase::string16 ExtensionProcessResource::GetTitle() const { return title_; } 97e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 98e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochgfx::ImageSkia ExtensionProcessResource::GetIcon() const { 99e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return *default_icon_; 100e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 101e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 102e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochResource::Type ExtensionProcessResource::GetType() const { return EXTENSION; } 103e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 104e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochbool ExtensionProcessResource::IsBackground() const { 105e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch WebContents* web_contents = 106e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch WebContents::FromRenderViewHost(render_view_host()); 107e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch extensions::ViewType view_type = extensions::GetViewType(web_contents); 108e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return view_type == extensions::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE; 109e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 110e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 111e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch//////////////////////////////////////////////////////////////////////////////// 112e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// ExtensionInformation class 113e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch//////////////////////////////////////////////////////////////////////////////// 114e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 115e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochExtensionInformation::ExtensionInformation() {} 116e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 117e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochExtensionInformation::~ExtensionInformation() {} 118e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 119e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochvoid ExtensionInformation::GetAll(const NewWebContentsCallback& callback) { 120e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Add all the existing extension views from all Profiles, including those 121e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // from incognito split mode. 122e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch ProfileManager* profile_manager = g_browser_process->profile_manager(); 123e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch std::vector<Profile*> profiles(profile_manager->GetLoadedProfiles()); 124e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch size_t num_default_profiles = profiles.size(); 125e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch for (size_t i = 0; i < num_default_profiles; ++i) { 126e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (profiles[i]->HasOffTheRecordProfile()) { 127e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch profiles.push_back(profiles[i]->GetOffTheRecordProfile()); 128e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 129e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 130e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 131e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch for (size_t i = 0; i < profiles.size(); ++i) { 132e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch extensions::ProcessManager* process_manager = 133e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch extensions::ExtensionSystem::Get(profiles[i])->process_manager(); 134e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (process_manager) { 135e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const extensions::ProcessManager::ViewSet all_views = 136e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch process_manager->GetAllViews(); 137e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch extensions::ProcessManager::ViewSet::const_iterator jt = 138e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch all_views.begin(); 139e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch for (; jt != all_views.end(); ++jt) { 140e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch WebContents* web_contents = WebContents::FromRenderViewHost(*jt); 141e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (CheckOwnership(web_contents)) 142e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch callback.Run(web_contents); 143e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 144e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 145e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 146e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 147e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 148e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochbool ExtensionInformation::CheckOwnership(WebContents* web_contents) { 149e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Don't add WebContents that belong to a guest (those are handled by 150e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // GuestInformation). Otherwise they will be added twice. 1516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (extensions::GuestViewBase::IsGuest(web_contents)) 152e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return false; 153e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 154e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Extension WebContents tracked by this class will always host extension 155e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // content. 156e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (!GetExtensionForWebContents(web_contents)) 157e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return false; 158e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 159e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch extensions::ViewType view_type = extensions::GetViewType(web_contents); 160e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 161e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Don't add tab contents (those are handled by TabContentsResourceProvider) 162e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // or background contents (handled by BackgroundInformation) or panels 163e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // (handled by PanelInformation) 164e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return (view_type != extensions::VIEW_TYPE_INVALID && 165e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch view_type != extensions::VIEW_TYPE_TAB_CONTENTS && 166e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch view_type != extensions::VIEW_TYPE_BACKGROUND_CONTENTS && 167e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch view_type != extensions::VIEW_TYPE_PANEL); 168e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 169e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 170e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochscoped_ptr<RendererResource> ExtensionInformation::MakeResource( 171e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch WebContents* web_contents) { 172e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const Extension* extension = GetExtensionForWebContents(web_contents); 173e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (!extension) { 174e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch NOTREACHED(); 175e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return scoped_ptr<RendererResource>(); 176e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 177e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return scoped_ptr<RendererResource>(new ExtensionProcessResource( 178e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch extension, web_contents->GetRenderViewHost())); 179e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 180e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 181e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} // namespace task_manager 182