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: 35 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. 55 const std::string& content_id() const { return content_id_; } 56 57 // Returns TabContents sidebar is linked to. 58 TabContents* tab_contents() const { return tab_; } 59 60 // Returns sidebar's TabContents. 61 TabContents* sidebar_contents() const { return sidebar_contents_.get(); } 62 63 // Accessor for the badge text. 64 const string16& badge_text() const { return badge_text_; } 65 66 // Accessor for the icon. 67 const SkBitmap& icon() const { return *icon_; } 68 69 // Accessor for the 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. 97 virtual void OpenURLFromTab(TabContents* source, 98 const GURL& url, 99 const GURL& referrer, 100 WindowOpenDisposition disposition, 101 PageTransition::Type transition) {} 102 virtual void NavigationStateChanged(const TabContents* source, 103 unsigned changed_flags) {} 104 virtual void AddNewContents(TabContents* source, 105 TabContents* new_contents, 106 WindowOpenDisposition disposition, 107 const gfx::Rect& initial_pos, 108 bool user_gesture) {} 109 virtual void ActivateContents(TabContents* contents) {} 110 virtual void DeactivateContents(TabContents* contents) {} 111 virtual void LoadingStateChanged(TabContents* source) {} 112 virtual void CloseContents(TabContents* source) {} 113 virtual void MoveContents(TabContents* source, const gfx::Rect& pos) {} 114 virtual bool IsPopup(const TabContents* source) const; 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