summaryrefslogtreecommitdiffstats
path: root/chrome/browser/sidebar
diff options
context:
space:
mode:
authoralekseys@chromium.org <alekseys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-01-20 20:30:06 +0000
committeralekseys@chromium.org <alekseys@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-01-20 20:30:06 +0000
commite2dffe003add45048a608aef0de27784efc72e34 (patch)
tree80129fa801b1e792283c971bf33f0c941a14ca0d /chrome/browser/sidebar
parent90dba0763114f7f07d24e751cfd1c6bba0480dad (diff)
downloadchromium_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.cc60
-rw-r--r--chrome/browser/sidebar/sidebar_container.h32
-rw-r--r--chrome/browser/sidebar/sidebar_manager.cc3
-rw-r--r--chrome/browser/sidebar/sidebar_manager.h12
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: