diff options
author | alekseys@chromium.org <alekseys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-20 20:30:06 +0000 |
---|---|---|
committer | alekseys@chromium.org <alekseys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-01-20 20:30:06 +0000 |
commit | e2dffe003add45048a608aef0de27784efc72e34 (patch) | |
tree | 80129fa801b1e792283c971bf33f0c941a14ca0d /chrome/browser/sidebar | |
parent | 90dba0763114f7f07d24e751cfd1c6bba0480dad (diff) | |
download | chromium_src-e2dffe003add45048a608aef0de27784efc72e34.zip chromium_src-e2dffe003add45048a608aef0de27784efc72e34.tar.gz chromium_src-e2dffe003add45048a608aef0de27784efc72e34.tar.bz2 |
Add "sidebar" section to extension manifest:
"sidebar": {
"default_url": "",
"default_title": "",
"default_icon": ""
}
Allow extension to access experimental.sidebar API only in presence of this section.
BUG=51084
TEST=unit_tests, ExtensionManifestTest.Sidebar
Review URL: http://codereview.chromium.org/6321006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@71993 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/sidebar')
-rw-r--r-- | chrome/browser/sidebar/sidebar_browsertest.cc (renamed from chrome/browser/sidebar/sidebar_test.cc) | 43 | ||||
-rw-r--r-- | chrome/browser/sidebar/sidebar_container.cc | 60 | ||||
-rw-r--r-- | chrome/browser/sidebar/sidebar_container.h | 32 | ||||
-rw-r--r-- | chrome/browser/sidebar/sidebar_manager.cc | 3 | ||||
-rw-r--r-- | chrome/browser/sidebar/sidebar_manager.h | 12 |
5 files changed, 133 insertions, 17 deletions
diff --git a/chrome/browser/sidebar/sidebar_test.cc b/chrome/browser/sidebar/sidebar_browsertest.cc index 1d57333..041a683 100644 --- a/chrome/browser/sidebar/sidebar_test.cc +++ b/chrome/browser/sidebar/sidebar_browsertest.cc @@ -3,30 +3,52 @@ // found in the LICENSE file. #include "base/command_line.h" +#include "base/file_path.h" +#include "base/path_service.h" +#include "base/ref_counted.h" #include "chrome/browser/browser_window.h" +#include "chrome/browser/extensions/extension_browsertest.h" #include "chrome/browser/sidebar/sidebar_manager.h" #include "chrome/browser/tab_contents/tab_contents.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" +#include "chrome/common/extensions/extension.h" #include "chrome/test/in_process_browser_test.h" #include "chrome/test/ui_test_utils.h" #include "net/test/test_server.h" +#include "chrome/browser/extensions/extension_service.h" +#include "chrome/browser/profiles/profile.h" + namespace { -const char kSampleContentId[] = "sample_content_id"; const char kSimplePage[] = "files/sidebar/simple_page.html"; -class SidebarTest : public InProcessBrowserTest { +class SidebarTest : public ExtensionBrowserTest { public: SidebarTest() { CommandLine::ForCurrentProcess()->AppendSwitch( switches::kEnableExperimentalExtensionApis); - set_show_window(true); } protected: + // InProcessBrowserTest overrides. + virtual void SetUpOnMainThread() { + ExtensionBrowserTest::SetUpOnMainThread(); + + // Load test sidebar extension. + FilePath extension_path; + ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &extension_path)); + extension_path = extension_path.AppendASCII("sidebar"); + + ASSERT_TRUE(LoadExtension(extension_path)); + + // For now content_id == extension_id. + content_id_ = last_loaded_extension_id_; + } + void ShowSidebarForCurrentTab() { ShowSidebar(browser()->GetSelectedTabContents()); } @@ -50,10 +72,10 @@ class SidebarTest : public InProcessBrowserTest { SidebarManager* sidebar_manager = SidebarManager::GetInstance(); - sidebar_manager->NavigateSidebar(tab, kSampleContentId, url); + sidebar_manager->NavigateSidebar(tab, content_id_, url); SidebarContainer* sidebar_container = - sidebar_manager->GetSidebarContainerFor(tab, kSampleContentId); + sidebar_manager->GetSidebarContainerFor(tab, content_id_); TabContents* client_contents = sidebar_container->sidebar_contents(); ui_test_utils::WaitForNavigation(&client_contents->controller()); @@ -61,26 +83,26 @@ class SidebarTest : public InProcessBrowserTest { void ShowSidebar(TabContents* tab) { SidebarManager* sidebar_manager = SidebarManager::GetInstance(); - sidebar_manager->ShowSidebar(tab, kSampleContentId); + sidebar_manager->ShowSidebar(tab, content_id_); } void ExpandSidebar(TabContents* tab) { SidebarManager* sidebar_manager = SidebarManager::GetInstance(); - sidebar_manager->ExpandSidebar(tab, kSampleContentId); + sidebar_manager->ExpandSidebar(tab, content_id_); if (browser()->GetSelectedTabContents() == tab) EXPECT_GT(browser_view()->GetSidebarWidth(), 0); } void CollapseSidebar(TabContents* tab) { SidebarManager* sidebar_manager = SidebarManager::GetInstance(); - sidebar_manager->CollapseSidebar(tab, kSampleContentId); + sidebar_manager->CollapseSidebar(tab, content_id_); if (browser()->GetSelectedTabContents() == tab) EXPECT_EQ(0, browser_view()->GetSidebarWidth()); } void HideSidebar(TabContents* tab) { SidebarManager* sidebar_manager = SidebarManager::GetInstance(); - sidebar_manager->HideSidebar(tab, kSampleContentId); + sidebar_manager->HideSidebar(tab, content_id_); if (browser()->GetSelectedTabContents() == tab) EXPECT_EQ(0, browser_view()->GetSidebarWidth()); } @@ -92,6 +114,9 @@ class SidebarTest : public InProcessBrowserTest { BrowserView* browser_view() const { return static_cast<BrowserView*>(browser()->window()); } + + private: + std::string content_id_; }; IN_PROC_BROWSER_TEST_F(SidebarTest, OpenClose) { diff --git a/chrome/browser/sidebar/sidebar_container.cc b/chrome/browser/sidebar/sidebar_container.cc index 7112433..a28ef21 100644 --- a/chrome/browser/sidebar/sidebar_container.cc +++ b/chrome/browser/sidebar/sidebar_container.cc @@ -4,12 +4,18 @@ #include "chrome/browser/sidebar/sidebar_container.h" +#include "chrome/browser/extensions/extension_service.h" +#include "chrome/browser/profiles/profile.h" #include "chrome/browser/renderer_host/render_view_host.h" #include "chrome/browser/tab_contents/navigation_controller.h" #include "chrome/browser/tab_contents/navigation_entry.h" #include "chrome/browser/tab_contents/tab_contents.h" #include "chrome/browser/tab_contents/tab_contents_view.h" #include "chrome/common/bindings_policy.h" +#include "chrome/common/extensions/extension.h" +#include "chrome/common/extensions/extension_resource.h" +#include "chrome/common/extensions/extension_sidebar_defaults.h" +#include "chrome/common/extensions/extension_sidebar_utils.h" #include "googleurl/src/gurl.h" #include "third_party/skia/include/core/SkBitmap.h" @@ -19,7 +25,9 @@ SidebarContainer::SidebarContainer(TabContents* tab, : tab_(tab), content_id_(content_id), delegate_(delegate), - icon_(new SkBitmap) { + icon_(new SkBitmap), + navigate_to_default_url_on_expand_(true), + use_default_icon_(true) { // Create TabContents for sidebar. sidebar_contents_.reset( new TabContents(tab->profile(), NULL, MSG_ROUTING_NONE, NULL, NULL)); @@ -36,11 +44,41 @@ void SidebarContainer::SidebarClosing() { delegate_->UpdateSidebar(this); } +void SidebarContainer::LoadDefaults() { + const Extension* extension = GetExtension(); + if (!extension) + return; // Can be NULL in tests. + const ExtensionSidebarDefaults* sidebar_defaults = + extension->sidebar_defaults(); + + title_ = sidebar_defaults->default_title(); + + if (!sidebar_defaults->default_icon_path().empty()) { + image_loading_tracker_.reset(new ImageLoadingTracker(this)); + image_loading_tracker_->LoadImage( + extension, + extension->GetResource(sidebar_defaults->default_icon_path()), + gfx::Size(Extension::kSidebarIconMaxSize, + Extension::kSidebarIconMaxSize), + ImageLoadingTracker::CACHE); + } +} + void SidebarContainer::Show() { delegate_->UpdateSidebar(this); } void SidebarContainer::Expand() { + if (navigate_to_default_url_on_expand_) { + navigate_to_default_url_on_expand_ = false; + // Check whether a default URL is specified for this sidebar. + const Extension* extension = GetExtension(); + if (extension) { // Can be NULL in tests. + if (extension->sidebar_defaults()->default_url().is_valid()) + Navigate(extension->sidebar_defaults()->default_url()); + } + } + delegate_->UpdateSidebar(this); sidebar_contents_->view()->SetInitialFocus(); } @@ -50,8 +88,8 @@ void SidebarContainer::Collapse() { } void SidebarContainer::Navigate(const GURL& url) { - DCHECK(sidebar_contents_.get()); // TODO(alekseys): add a progress UI. + navigate_to_default_url_on_expand_ = false; sidebar_contents_->controller().LoadURL( url, GURL(), PageTransition::START_PAGE); } @@ -61,6 +99,7 @@ void SidebarContainer::SetBadgeText(const string16& badge_text) { } void SidebarContainer::SetIcon(const SkBitmap& bitmap) { + use_default_icon_ = false; *icon_ = bitmap; } @@ -72,3 +111,20 @@ bool SidebarContainer::IsPopup(const TabContents* source) const { return false; } +void SidebarContainer::OnImageLoaded(SkBitmap* image, + ExtensionResource resource, + int index) { + if (image && use_default_icon_) { + *icon_ = *image; + delegate_->UpdateSidebar(this); + } +} + +const Extension* SidebarContainer::GetExtension() const { + ExtensionService* service = + sidebar_contents_->profile()->GetExtensionService(); + if (!service) + return NULL; + return service->GetExtensionById( + extension_sidebar_utils::GetExtensionIdByContentId(content_id_), false); +} diff --git a/chrome/browser/sidebar/sidebar_container.h b/chrome/browser/sidebar/sidebar_container.h index b519de8..bcd5cfd 100644 --- a/chrome/browser/sidebar/sidebar_container.h +++ b/chrome/browser/sidebar/sidebar_container.h @@ -10,6 +10,7 @@ #include "base/basictypes.h" #include "base/scoped_ptr.h" #include "base/string16.h" +#include "chrome/browser/extensions/image_loading_tracker.h" #include "chrome/browser/tab_contents/tab_contents_delegate.h" class BrowserWindow; @@ -25,7 +26,8 @@ class TabContents; // tab it is linked to, mini tab icon, title etc. // class SidebarContainer - : public TabContentsDelegate { + : public TabContentsDelegate, + private ImageLoadingTracker::Observer { public: // Interface to implement to listen for sidebar update notification. class Delegate { @@ -37,7 +39,8 @@ class SidebarContainer DISALLOW_COPY_AND_ASSIGN(Delegate); }; - SidebarContainer(TabContents* tab, const std::string& content_id, + SidebarContainer(TabContents* tab, + const std::string& content_id, Delegate* delegate); virtual ~SidebarContainer(); @@ -45,6 +48,9 @@ class SidebarContainer // Does all the necessary cleanup. void SidebarClosing(); + // Sets default sidebar parameters, as specified in extension manifest. + void LoadDefaults(); + // Returns sidebar's content id. const std::string& content_id() const { return content_id_; } @@ -110,6 +116,14 @@ class SidebarContainer virtual void UpdateTargetURL(TabContents* source, const GURL& url) {} virtual void ToolbarSizeChanged(TabContents* source, bool is_animating) {} + // Overridden from ImageLoadingTracker::Observer. + virtual void OnImageLoaded(SkBitmap* image, + ExtensionResource resource, + int index); + + // Returns an extension this sidebar belongs to. + const Extension* GetExtension() const; + // Contents of the tab this sidebar is linked to. TabContents* tab_; @@ -132,6 +146,20 @@ class SidebarContainer // Sidebar's title, displayed as a tooltip for sidebar's mini tab. string16 title_; + // On the first expand sidebar will be automatically navigated to the default + // url (specified in the extension manifest), but only if the extension has + // not explicitly navigated it yet. This variable is set to false on the first + // sidebar navigation. + bool navigate_to_default_url_on_expand_; + // Since the default icon (specified in the extension manifest) is loaded + // asynchronously, sidebar icon can already be set by the extension + // by the time it's loaded. This variable tracks whether the loaded default + // icon should be used or discarded. + bool use_default_icon_; + + // Helper to load icons from extension asynchronously. + scoped_ptr<ImageLoadingTracker> image_loading_tracker_; + DISALLOW_COPY_AND_ASSIGN(SidebarContainer); }; diff --git a/chrome/browser/sidebar/sidebar_manager.cc b/chrome/browser/sidebar/sidebar_manager.cc index 7030da8..27d7e33 100644 --- a/chrome/browser/sidebar/sidebar_manager.cc +++ b/chrome/browser/sidebar/sidebar_manager.cc @@ -107,6 +107,9 @@ void SidebarManager::ShowSidebar(TabContents* tab, if (!host) { host = new SidebarContainer(tab, content_id, this); RegisterSidebarContainerFor(tab, host); + // It might trigger UpdateSidebar notification, so load them after + // the registration. + host->LoadDefaults(); } host->Show(); diff --git a/chrome/browser/sidebar/sidebar_manager.h b/chrome/browser/sidebar/sidebar_manager.h index 6f2d20b..e1a0080 100644 --- a/chrome/browser/sidebar/sidebar_manager.h +++ b/chrome/browser/sidebar/sidebar_manager.h @@ -74,19 +74,23 @@ class SidebarManager : public NotificationObserver, void HideSidebar(TabContents* tab, const std::string& content_id); // Navigates sidebar identified by |tab| and |content_id| to |url|. - void NavigateSidebar(TabContents* tab, const std::string& content_id, + void NavigateSidebar(TabContents* tab, + const std::string& content_id, const GURL& url); // Changes sidebar's badge text (displayed on the mini tab). - void SetSidebarBadgeText(TabContents* tab, const std::string& content_id, + void SetSidebarBadgeText(TabContents* tab, + const std::string& content_id, const string16& badge_text); // Changes sidebar's icon (displayed on the mini tab). - void SetSidebarIcon(TabContents* tab, const std::string& content_id, + void SetSidebarIcon(TabContents* tab, + const std::string& content_id, const SkBitmap& bitmap); // Changes sidebar's title (mini tab's tooltip). - void SetSidebarTitle(TabContents* tab, const std::string& content_id, + void SetSidebarTitle(TabContents* tab, + const std::string& content_id, const string16& title); private: |