1bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file. 4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/sidebar/sidebar_container.h" 6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/extensions/extension_service.h" 872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/profiles/profile.h" 972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/common/extensions/extension.h" 1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/common/extensions/extension_resource.h" 1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/common/extensions/extension_sidebar_defaults.h" 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/common/extensions/extension_sidebar_utils.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/browser/renderer_host/browser_render_process_host.h" 14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h" 15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/navigation_controller.h" 16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/navigation_entry.h" 17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h" 18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents_view.h" 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/bindings_policy.h" 20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "googleurl/src/gurl.h" 21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "third_party/skia/include/core/SkBitmap.h" 22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSidebarContainer::SidebarContainer(TabContents* tab, 24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const std::string& content_id, 25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Delegate* delegate) 26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : tab_(tab), 27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen content_id_(content_id), 28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delegate_(delegate), 2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen icon_(new SkBitmap), 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen navigate_to_default_page_on_expand_(true), 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen use_default_icon_(true) { 32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // Create TabContents for sidebar. 33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen sidebar_contents_.reset( 34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen new TabContents(tab->profile(), NULL, MSG_ROUTING_NONE, NULL, NULL)); 35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen sidebar_contents_->render_view_host()->set_is_extension_process(true); 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const Extension* extension = GetExtension(); 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (extension && extension->is_app()) { 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserRenderProcessHost* process = static_cast<BrowserRenderProcessHost*>( 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sidebar_contents_->render_view_host()->process()); 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen process->set_installed_app(extension); 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen sidebar_contents_->render_view_host()->AllowBindings( 43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen BindingsPolicy::EXTENSION); 44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen sidebar_contents_->set_delegate(this); 45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenSidebarContainer::~SidebarContainer() { 48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarContainer::SidebarClosing() { 51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delegate_->UpdateSidebar(this); 52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid SidebarContainer::LoadDefaults() { 5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const Extension* extension = GetExtension(); 5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!extension) 5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return; // Can be NULL in tests. 5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const ExtensionSidebarDefaults* sidebar_defaults = 5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extension->sidebar_defaults(); 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen title_ = sidebar_defaults->default_title(); 6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!sidebar_defaults->default_icon_path().empty()) { 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen image_loading_tracker_.reset(new ImageLoadingTracker(this)); 6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen image_loading_tracker_->LoadImage( 6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extension, 6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extension->GetResource(sidebar_defaults->default_icon_path()), 6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen gfx::Size(Extension::kSidebarIconMaxSize, 6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Extension::kSidebarIconMaxSize), 7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ImageLoadingTracker::CACHE); 7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarContainer::Show() { 75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delegate_->UpdateSidebar(this); 76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarContainer::Expand() { 7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (navigate_to_default_page_on_expand_) { 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen navigate_to_default_page_on_expand_ = false; 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Check whether a default page is specified for this sidebar. 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const Extension* extension = GetExtension(); 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (extension) { // Can be NULL in tests. 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (extension->sidebar_defaults()->default_page().is_valid()) 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Navigate(extension->sidebar_defaults()->default_page()); 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delegate_->UpdateSidebar(this); 90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen sidebar_contents_->view()->SetInitialFocus(); 91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarContainer::Collapse() { 94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen delegate_->UpdateSidebar(this); 95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 97bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarContainer::Navigate(const GURL& url) { 98bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // TODO(alekseys): add a progress UI. 9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen navigate_to_default_page_on_expand_ = false; 100bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen sidebar_contents_->controller().LoadURL( 101bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen url, GURL(), PageTransition::START_PAGE); 102bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 103bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 104bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarContainer::SetBadgeText(const string16& badge_text) { 105bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen badge_text_ = badge_text; 106bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 107bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 108bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarContainer::SetIcon(const SkBitmap& bitmap) { 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen use_default_icon_ = false; 110bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen *icon_ = bitmap; 111bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 112bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 113bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenvoid SidebarContainer::SetTitle(const string16& title) { 114bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen title_ = title; 115bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 11621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 11721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool SidebarContainer::IsPopup(const TabContents* source) const { 11821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return false; 11921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 12021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid SidebarContainer::OnImageLoaded(SkBitmap* image, 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const ExtensionResource& resource, 12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int index) { 12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (image && use_default_icon_) { 12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen *icon_ = *image; 12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen delegate_->UpdateSidebar(this); 12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenconst Extension* SidebarContainer::GetExtension() const { 13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ExtensionService* service = 13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sidebar_contents_->profile()->GetExtensionService(); 13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!service) 13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return NULL; 13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return service->GetExtensionById( 13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen extension_sidebar_utils::GetExtensionIdByContentId(content_id_), false); 13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 138