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.h" 8 #include "chrome/browser/bookmarks/bookmark_model_factory.h" 9 #include "chrome/browser/defaults.h" 10 #include "chrome/browser/prefs/pref_service_syncable.h" 11 #include "chrome/browser/profiles/profile.h" 12 #include "chrome/browser/search/search.h" 13 #include "chrome/browser/ui/bookmarks/bookmark_tab_helper_delegate.h" 14 #include "chrome/browser/ui/bookmarks/bookmark_utils.h" 15 #include "chrome/browser/ui/sad_tab.h" 16 #include "chrome/browser/ui/webui/ntp/new_tab_ui.h" 17 #include "chrome/common/pref_names.h" 18 #include "content/public/browser/navigation_entry.h" 19 #include "content/public/browser/web_contents.h" 20 21 namespace { 22 23 bool 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 34 bool 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 46 DEFINE_WEB_CONTENTS_USER_DATA_KEY(BookmarkTabHelper); 47 48 BookmarkTabHelper::~BookmarkTabHelper() { 49 if (bookmark_model_) 50 bookmark_model_->RemoveObserver(this); 51 } 52 53 bool 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 PrefService* prefs = profile->GetPrefs(); 66 if (prefs->IsManagedPreference(prefs::kShowBookmarkBar) && 67 !prefs->GetBoolean(prefs::kShowBookmarkBar)) 68 return false; 69 70 return IsNTPWebUI(web_contents()) || IsInstantNTP(web_contents()); 71 } 72 73 BookmarkTabHelper::BookmarkTabHelper(content::WebContents* web_contents) 74 : content::WebContentsObserver(web_contents), 75 is_starred_(false), 76 bookmark_model_(NULL), 77 delegate_(NULL), 78 bookmark_drag_(NULL) { 79 Profile* profile = 80 Profile::FromBrowserContext(web_contents->GetBrowserContext()); 81 bookmark_model_= BookmarkModelFactory::GetForProfile(profile); 82 if (bookmark_model_) 83 bookmark_model_->AddObserver(this); 84 } 85 86 void BookmarkTabHelper::UpdateStarredStateForCurrentURL() { 87 const bool old_state = is_starred_; 88 is_starred_ = (bookmark_model_ && 89 bookmark_model_->IsBookmarked(chrome::GetURLToBookmark(web_contents()))); 90 91 if (is_starred_ != old_state && delegate_) 92 delegate_->URLStarredChanged(web_contents(), is_starred_); 93 } 94 95 void BookmarkTabHelper::BookmarkModelChanged() { 96 } 97 98 void BookmarkTabHelper::Loaded(BookmarkModel* model, bool ids_reassigned) { 99 UpdateStarredStateForCurrentURL(); 100 } 101 102 void BookmarkTabHelper::BookmarkNodeAdded(BookmarkModel* model, 103 const BookmarkNode* parent, 104 int index) { 105 UpdateStarredStateForCurrentURL(); 106 } 107 108 void BookmarkTabHelper::BookmarkNodeRemoved(BookmarkModel* model, 109 const BookmarkNode* parent, 110 int old_index, 111 const BookmarkNode* node) { 112 UpdateStarredStateForCurrentURL(); 113 } 114 115 void BookmarkTabHelper::BookmarkAllNodesRemoved(BookmarkModel* model) { 116 UpdateStarredStateForCurrentURL(); 117 } 118 119 void BookmarkTabHelper::BookmarkNodeChanged(BookmarkModel* model, 120 const BookmarkNode* node) { 121 UpdateStarredStateForCurrentURL(); 122 } 123 124 void BookmarkTabHelper::DidNavigateMainFrame( 125 const content::LoadCommittedDetails& /*details*/, 126 const content::FrameNavigateParams& /*params*/) { 127 UpdateStarredStateForCurrentURL(); 128 } 129