• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2010 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/sidebar/sidebar_container.h"
6 
7 #include "chrome/browser/extensions/extension_service.h"
8 #include "chrome/browser/profiles/profile.h"
9 #include "chrome/common/extensions/extension.h"
10 #include "chrome/common/extensions/extension_resource.h"
11 #include "chrome/common/extensions/extension_sidebar_defaults.h"
12 #include "chrome/common/extensions/extension_sidebar_utils.h"
13 #include "content/browser/renderer_host/browser_render_process_host.h"
14 #include "content/browser/renderer_host/render_view_host.h"
15 #include "content/browser/tab_contents/navigation_controller.h"
16 #include "content/browser/tab_contents/navigation_entry.h"
17 #include "content/browser/tab_contents/tab_contents.h"
18 #include "content/browser/tab_contents/tab_contents_view.h"
19 #include "content/common/bindings_policy.h"
20 #include "googleurl/src/gurl.h"
21 #include "third_party/skia/include/core/SkBitmap.h"
22 
SidebarContainer(TabContents * tab,const std::string & content_id,Delegate * delegate)23 SidebarContainer::SidebarContainer(TabContents* tab,
24                                    const std::string& content_id,
25                                    Delegate* delegate)
26     : tab_(tab),
27       content_id_(content_id),
28       delegate_(delegate),
29       icon_(new SkBitmap),
30       navigate_to_default_page_on_expand_(true),
31       use_default_icon_(true) {
32   // Create TabContents for sidebar.
33   sidebar_contents_.reset(
34       new TabContents(tab->profile(), NULL, MSG_ROUTING_NONE, NULL, NULL));
35   sidebar_contents_->render_view_host()->set_is_extension_process(true);
36   const Extension* extension = GetExtension();
37   if (extension && extension->is_app()) {
38     BrowserRenderProcessHost* process = static_cast<BrowserRenderProcessHost*>(
39         sidebar_contents_->render_view_host()->process());
40     process->set_installed_app(extension);
41   }
42   sidebar_contents_->render_view_host()->AllowBindings(
43       BindingsPolicy::EXTENSION);
44   sidebar_contents_->set_delegate(this);
45 }
46 
~SidebarContainer()47 SidebarContainer::~SidebarContainer() {
48 }
49 
SidebarClosing()50 void SidebarContainer::SidebarClosing() {
51   delegate_->UpdateSidebar(this);
52 }
53 
LoadDefaults()54 void SidebarContainer::LoadDefaults() {
55   const Extension* extension = GetExtension();
56   if (!extension)
57     return;  // Can be NULL in tests.
58   const ExtensionSidebarDefaults* sidebar_defaults =
59       extension->sidebar_defaults();
60 
61   title_ = sidebar_defaults->default_title();
62 
63   if (!sidebar_defaults->default_icon_path().empty()) {
64     image_loading_tracker_.reset(new ImageLoadingTracker(this));
65     image_loading_tracker_->LoadImage(
66         extension,
67         extension->GetResource(sidebar_defaults->default_icon_path()),
68         gfx::Size(Extension::kSidebarIconMaxSize,
69                   Extension::kSidebarIconMaxSize),
70         ImageLoadingTracker::CACHE);
71   }
72 }
73 
Show()74 void SidebarContainer::Show() {
75   delegate_->UpdateSidebar(this);
76 }
77 
Expand()78 void SidebarContainer::Expand() {
79   if (navigate_to_default_page_on_expand_) {
80     navigate_to_default_page_on_expand_ = false;
81     // Check whether a default page is specified for this sidebar.
82     const Extension* extension = GetExtension();
83     if (extension) {  // Can be NULL in tests.
84       if (extension->sidebar_defaults()->default_page().is_valid())
85         Navigate(extension->sidebar_defaults()->default_page());
86     }
87   }
88 
89   delegate_->UpdateSidebar(this);
90   sidebar_contents_->view()->SetInitialFocus();
91 }
92 
Collapse()93 void SidebarContainer::Collapse() {
94   delegate_->UpdateSidebar(this);
95 }
96 
Navigate(const GURL & url)97 void SidebarContainer::Navigate(const GURL& url) {
98   // TODO(alekseys): add a progress UI.
99   navigate_to_default_page_on_expand_ = false;
100   sidebar_contents_->controller().LoadURL(
101       url, GURL(), PageTransition::START_PAGE);
102 }
103 
SetBadgeText(const string16 & badge_text)104 void SidebarContainer::SetBadgeText(const string16& badge_text) {
105   badge_text_ = badge_text;
106 }
107 
SetIcon(const SkBitmap & bitmap)108 void SidebarContainer::SetIcon(const SkBitmap& bitmap) {
109   use_default_icon_ = false;
110   *icon_ = bitmap;
111 }
112 
SetTitle(const string16 & title)113 void SidebarContainer::SetTitle(const string16& title) {
114   title_ = title;
115 }
116 
IsPopup(const TabContents * source) const117 bool SidebarContainer::IsPopup(const TabContents* source) const {
118   return false;
119 }
120 
OnImageLoaded(SkBitmap * image,const ExtensionResource & resource,int index)121 void SidebarContainer::OnImageLoaded(SkBitmap* image,
122                                      const ExtensionResource& resource,
123                                      int index) {
124   if (image && use_default_icon_) {
125     *icon_ = *image;
126      delegate_->UpdateSidebar(this);
127   }
128 }
129 
GetExtension() const130 const Extension* SidebarContainer::GetExtension() const {
131   ExtensionService* service =
132       sidebar_contents_->profile()->GetExtensionService();
133   if (!service)
134     return NULL;
135   return service->GetExtensionById(
136       extension_sidebar_utils::GetExtensionIdByContentId(content_id_), false);
137 }
138