• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 #ifndef CHROME_BROWSER_SIDEBAR_SIDEBAR_CONTAINER_H_
6 #define CHROME_BROWSER_SIDEBAR_SIDEBAR_CONTAINER_H_
7 
8 #include <string>
9 
10 #include "base/basictypes.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/string16.h"
13 #include "chrome/browser/extensions/image_loading_tracker.h"
14 #include "content/browser/tab_contents/tab_contents_delegate.h"
15 
16 class BrowserWindow;
17 class Profile;
18 class RenderViewHost;
19 class SkBitmap;
20 class TabContents;
21 
22 ///////////////////////////////////////////////////////////////////////////////
23 // SidebarContainer
24 //
25 //  Stores one particular sidebar state: sidebar's content, its content id,
26 //  tab it is linked to, mini tab icon, title etc.
27 //
28 class SidebarContainer
29     : public TabContentsDelegate,
30       private ImageLoadingTracker::Observer {
31  public:
32   // Interface to implement to listen for sidebar update notification.
33   class Delegate {
34    public:
Delegate()35     Delegate() {}
~Delegate()36     virtual ~Delegate() {}
37     virtual void UpdateSidebar(SidebarContainer* host) = 0;
38    private:
39     DISALLOW_COPY_AND_ASSIGN(Delegate);
40   };
41 
42   SidebarContainer(TabContents* tab,
43                    const std::string& content_id,
44                    Delegate* delegate);
45   virtual ~SidebarContainer();
46 
47   // Called right before destroying this sidebar.
48   // Does all the necessary cleanup.
49   void SidebarClosing();
50 
51   // Sets default sidebar parameters, as specified in extension manifest.
52   void LoadDefaults();
53 
54   // Returns sidebar's content id.
content_id()55   const std::string& content_id() const { return content_id_; }
56 
57   // Returns TabContents sidebar is linked to.
tab_contents()58   TabContents* tab_contents() const { return tab_; }
59 
60   // Returns sidebar's TabContents.
sidebar_contents()61   TabContents* sidebar_contents() const { return sidebar_contents_.get(); }
62 
63   // Accessor for the badge text.
badge_text()64   const string16& badge_text() const { return badge_text_; }
65 
66   // Accessor for the icon.
icon()67   const SkBitmap& icon() const { return *icon_; }
68 
69   // Accessor for the title.
title()70   const string16& title() const { return title_; }
71 
72   // Functions supporting chrome.experimental.sidebar API.
73 
74   // Notifies hosting window that this sidebar was expanded.
75   void Show();
76 
77   // Notifies hosting window that this sidebar was expanded.
78   void Expand();
79 
80   // Notifies hosting window that this sidebar was collapsed.
81   void Collapse();
82 
83   // Navigates sidebar contents to the |url|.
84   void Navigate(const GURL& url);
85 
86   // Changes sidebar's badge text.
87   void SetBadgeText(const string16& badge_text);
88 
89   // Changes sidebar's icon.
90   void SetIcon(const SkBitmap& bitmap);
91 
92   // Changes sidebar's title.
93   void SetTitle(const string16& title);
94 
95  private:
96   // Overridden from TabContentsDelegate.
OpenURLFromTab(TabContents * source,const GURL & url,const GURL & referrer,WindowOpenDisposition disposition,PageTransition::Type transition)97   virtual void OpenURLFromTab(TabContents* source,
98                               const GURL& url,
99                               const GURL& referrer,
100                               WindowOpenDisposition disposition,
101                               PageTransition::Type transition) {}
NavigationStateChanged(const TabContents * source,unsigned changed_flags)102   virtual void NavigationStateChanged(const TabContents* source,
103                                       unsigned changed_flags) {}
AddNewContents(TabContents * source,TabContents * new_contents,WindowOpenDisposition disposition,const gfx::Rect & initial_pos,bool user_gesture)104   virtual void AddNewContents(TabContents* source,
105                               TabContents* new_contents,
106                               WindowOpenDisposition disposition,
107                               const gfx::Rect& initial_pos,
108                               bool user_gesture) {}
ActivateContents(TabContents * contents)109   virtual void ActivateContents(TabContents* contents) {}
DeactivateContents(TabContents * contents)110   virtual void DeactivateContents(TabContents* contents) {}
LoadingStateChanged(TabContents * source)111   virtual void LoadingStateChanged(TabContents* source) {}
CloseContents(TabContents * source)112   virtual void CloseContents(TabContents* source) {}
MoveContents(TabContents * source,const gfx::Rect & pos)113   virtual void MoveContents(TabContents* source, const gfx::Rect& pos) {}
114   virtual bool IsPopup(const TabContents* source) const;
UpdateTargetURL(TabContents * source,const GURL & url)115   virtual void UpdateTargetURL(TabContents* source, const GURL& url) {}
116 
117   // Overridden from ImageLoadingTracker::Observer.
118   virtual void OnImageLoaded(SkBitmap* image,
119                              const ExtensionResource& resource,
120                              int index);
121 
122   // Returns an extension this sidebar belongs to.
123   const Extension* GetExtension() const;
124 
125   // Contents of the tab this sidebar is linked to.
126   TabContents* tab_;
127 
128   // Sidebar's content id. There might be more than one sidebar liked to each
129   // particular tab and they are identified by their unique content id.
130   const std::string content_id_;
131 
132   // Sidebar update notification listener.
133   Delegate* delegate_;
134 
135   // Sidebar contents.
136   scoped_ptr<TabContents> sidebar_contents_;
137 
138   // Badge text displayed on the sidebar's mini tab.
139   string16 badge_text_;
140 
141   // Icon displayed on the sidebar's mini tab.
142   scoped_ptr<SkBitmap> icon_;
143 
144   // Sidebar's title, displayed as a tooltip for sidebar's mini tab.
145   string16 title_;
146 
147   // On the first expand sidebar will be automatically navigated to the default
148   // page (specified in the extension manifest), but only if the extension has
149   // not explicitly navigated it yet. This variable is set to false on the first
150   // sidebar navigation.
151   bool navigate_to_default_page_on_expand_;
152   // Since the default icon (specified in the extension manifest) is loaded
153   // asynchronously, sidebar icon can already be set by the extension
154   // by the time it's loaded. This variable tracks whether the loaded default
155   // icon should be used or discarded.
156   bool use_default_icon_;
157 
158   // Helper to load icons from extension asynchronously.
159   scoped_ptr<ImageLoadingTracker> image_loading_tracker_;
160 
161   DISALLOW_COPY_AND_ASSIGN(SidebarContainer);
162 };
163 
164 #endif  // CHROME_BROWSER_SIDEBAR_SIDEBAR_CONTAINER_H_
165