| // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/sidebar/sidebar_container.h" |
| |
| #include "chrome/browser/extensions/extension_service.h" |
| #include "chrome/browser/profiles/profile.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 "content/browser/renderer_host/browser_render_process_host.h" |
| #include "content/browser/renderer_host/render_view_host.h" |
| #include "content/browser/tab_contents/navigation_controller.h" |
| #include "content/browser/tab_contents/navigation_entry.h" |
| #include "content/browser/tab_contents/tab_contents.h" |
| #include "content/browser/tab_contents/tab_contents_view.h" |
| #include "content/common/bindings_policy.h" |
| #include "googleurl/src/gurl.h" |
| #include "third_party/skia/include/core/SkBitmap.h" |
| |
| SidebarContainer::SidebarContainer(TabContents* tab, |
| const std::string& content_id, |
| Delegate* delegate) |
| : tab_(tab), |
| content_id_(content_id), |
| delegate_(delegate), |
| icon_(new SkBitmap), |
| navigate_to_default_page_on_expand_(true), |
| use_default_icon_(true) { |
| // Create TabContents for sidebar. |
| sidebar_contents_.reset( |
| new TabContents(tab->profile(), NULL, MSG_ROUTING_NONE, NULL, NULL)); |
| sidebar_contents_->render_view_host()->set_is_extension_process(true); |
| const Extension* extension = GetExtension(); |
| if (extension && extension->is_app()) { |
| BrowserRenderProcessHost* process = static_cast<BrowserRenderProcessHost*>( |
| sidebar_contents_->render_view_host()->process()); |
| process->set_installed_app(extension); |
| } |
| sidebar_contents_->render_view_host()->AllowBindings( |
| BindingsPolicy::EXTENSION); |
| sidebar_contents_->set_delegate(this); |
| } |
| |
| SidebarContainer::~SidebarContainer() { |
| } |
| |
| 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_page_on_expand_) { |
| navigate_to_default_page_on_expand_ = false; |
| // Check whether a default page is specified for this sidebar. |
| const Extension* extension = GetExtension(); |
| if (extension) { // Can be NULL in tests. |
| if (extension->sidebar_defaults()->default_page().is_valid()) |
| Navigate(extension->sidebar_defaults()->default_page()); |
| } |
| } |
| |
| delegate_->UpdateSidebar(this); |
| sidebar_contents_->view()->SetInitialFocus(); |
| } |
| |
| void SidebarContainer::Collapse() { |
| delegate_->UpdateSidebar(this); |
| } |
| |
| void SidebarContainer::Navigate(const GURL& url) { |
| // TODO(alekseys): add a progress UI. |
| navigate_to_default_page_on_expand_ = false; |
| sidebar_contents_->controller().LoadURL( |
| url, GURL(), PageTransition::START_PAGE); |
| } |
| |
| void SidebarContainer::SetBadgeText(const string16& badge_text) { |
| badge_text_ = badge_text; |
| } |
| |
| void SidebarContainer::SetIcon(const SkBitmap& bitmap) { |
| use_default_icon_ = false; |
| *icon_ = bitmap; |
| } |
| |
| void SidebarContainer::SetTitle(const string16& title) { |
| title_ = title; |
| } |
| |
| bool SidebarContainer::IsPopup(const TabContents* source) const { |
| return false; |
| } |
| |
| void SidebarContainer::OnImageLoaded(SkBitmap* image, |
| const 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); |
| } |