1// Copyright (c) 2012 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#include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" 6 7#include "chrome/browser/bookmarks/bookmark_model_factory.h" 8#include "chrome/browser/defaults.h" 9#include "chrome/browser/prefs/pref_service_syncable.h" 10#include "chrome/browser/profiles/profile.h" 11#include "chrome/browser/search/search.h" 12#include "chrome/browser/ui/bookmarks/bookmark_tab_helper_delegate.h" 13#include "chrome/browser/ui/bookmarks/bookmark_utils.h" 14#include "chrome/browser/ui/sad_tab.h" 15#include "chrome/browser/ui/webui/ntp/new_tab_ui.h" 16#include "chrome/common/pref_names.h" 17#include "components/bookmarks/browser/bookmark_model.h" 18#include "content/public/browser/navigation_entry.h" 19#include "content/public/browser/web_contents.h" 20 21namespace { 22 23bool IsNTPWebUI(content::WebContents* web_contents) { 24 content::WebUI* web_ui = NULL; 25 // Use the committed entry so the bookmarks bar disappears at the same time 26 // the page does. 27 if (web_contents->GetController().GetLastCommittedEntry()) 28 web_ui = web_contents->GetCommittedWebUI(); 29 else 30 web_ui = web_contents->GetWebUI(); 31 return web_ui && NewTabUI::FromWebUIController(web_ui->GetController()); 32} 33 34bool IsInstantNTP(content::WebContents* web_contents) { 35 // Use the committed entry so the bookmarks bar disappears at the same time 36 // the page does. 37 const content::NavigationEntry* entry = 38 web_contents->GetController().GetLastCommittedEntry(); 39 if (!entry) 40 entry = web_contents->GetController().GetVisibleEntry(); 41 return chrome::NavEntryIsInstantNTP(web_contents, entry); 42} 43 44} // namespace 45 46DEFINE_WEB_CONTENTS_USER_DATA_KEY(BookmarkTabHelper); 47 48BookmarkTabHelper::~BookmarkTabHelper() { 49 if (bookmark_model_) 50 bookmark_model_->RemoveObserver(this); 51} 52 53bool BookmarkTabHelper::ShouldShowBookmarkBar() const { 54 if (web_contents()->ShowingInterstitialPage()) 55 return false; 56 57 if (chrome::SadTab::ShouldShow(web_contents()->GetCrashedStatus())) 58 return false; 59 60 if (!browser_defaults::bookmarks_enabled) 61 return false; 62 63 Profile* profile = 64 Profile::FromBrowserContext(web_contents()->GetBrowserContext()); 65 66#if !defined(OS_CHROMEOS) 67 if (profile->IsGuestSession()) 68 return false; 69#endif 70 71 PrefService* prefs = profile->GetPrefs(); 72 if (prefs->IsManagedPreference(bookmarks::prefs::kShowBookmarkBar) && 73 !prefs->GetBoolean(bookmarks::prefs::kShowBookmarkBar)) 74 return false; 75 76 return IsNTPWebUI(web_contents()) || IsInstantNTP(web_contents()); 77} 78 79BookmarkTabHelper::BookmarkTabHelper(content::WebContents* web_contents) 80 : content::WebContentsObserver(web_contents), 81 is_starred_(false), 82 bookmark_model_(NULL), 83 delegate_(NULL), 84 bookmark_drag_(NULL) { 85 Profile* profile = 86 Profile::FromBrowserContext(web_contents->GetBrowserContext()); 87 bookmark_model_= BookmarkModelFactory::GetForProfile(profile); 88 if (bookmark_model_) 89 bookmark_model_->AddObserver(this); 90} 91 92void BookmarkTabHelper::UpdateStarredStateForCurrentURL() { 93 const bool old_state = is_starred_; 94 is_starred_ = (bookmark_model_ && 95 bookmark_model_->IsBookmarked(chrome::GetURLToBookmark(web_contents()))); 96 97 if (is_starred_ != old_state && delegate_) 98 delegate_->URLStarredChanged(web_contents(), is_starred_); 99} 100 101void BookmarkTabHelper::BookmarkModelChanged() { 102} 103 104void BookmarkTabHelper::BookmarkModelLoaded(BookmarkModel* model, 105 bool ids_reassigned) { 106 UpdateStarredStateForCurrentURL(); 107} 108 109void BookmarkTabHelper::BookmarkNodeAdded(BookmarkModel* model, 110 const BookmarkNode* parent, 111 int index) { 112 UpdateStarredStateForCurrentURL(); 113} 114 115void BookmarkTabHelper::BookmarkNodeRemoved( 116 BookmarkModel* model, 117 const BookmarkNode* parent, 118 int old_index, 119 const BookmarkNode* node, 120 const std::set<GURL>& removed_urls) { 121 UpdateStarredStateForCurrentURL(); 122} 123 124void BookmarkTabHelper::BookmarkAllUserNodesRemoved( 125 BookmarkModel* model, 126 const std::set<GURL>& removed_urls) { 127 UpdateStarredStateForCurrentURL(); 128} 129 130void BookmarkTabHelper::BookmarkNodeChanged(BookmarkModel* model, 131 const BookmarkNode* node) { 132 UpdateStarredStateForCurrentURL(); 133} 134 135void BookmarkTabHelper::DidNavigateMainFrame( 136 const content::LoadCommittedDetails& /*details*/, 137 const content::FrameNavigateParams& /*params*/) { 138 UpdateStarredStateForCurrentURL(); 139} 140