15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/defaults.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/pref_service_syncable.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/search/search.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/bookmarks/bookmark_tab_helper_delegate.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/bookmarks/bookmark_utils.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/sad_tab.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/ntp/new_tab_ui.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h" 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_model.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/navigation_entry.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsNTPWebUI(content::WebContents* web_contents) { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebUI* web_ui = NULL; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Use the committed entry so the bookmarks bar disappears at the same time 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the page does. 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (web_contents->GetController().GetLastCommittedEntry()) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_ui = web_contents->GetCommittedWebUI(); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_ui = web_contents->GetWebUI(); 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return web_ui && NewTabUI::FromWebUIController(web_ui->GetController()); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsInstantNTP(content::WebContents* web_contents) { 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Use the committed entry so the bookmarks bar disappears at the same time 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the page does. 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NavigationEntry* entry = 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents->GetController().GetLastCommittedEntry(); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry = web_contents->GetController().GetVisibleEntry(); 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return chrome::NavEntryIsInstantNTP(web_contents, entry); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DEFINE_WEB_CONTENTS_USER_DATA_KEY(BookmarkTabHelper); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BookmarkTabHelper::~BookmarkTabHelper() { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (bookmark_model_) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bookmark_model_->RemoveObserver(this); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool BookmarkTabHelper::ShouldShowBookmarkBar() const { 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (web_contents()->ShowingInterstitialPage()) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (chrome::SadTab::ShouldShow(web_contents()->GetCrashedStatus())) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!browser_defaults::bookmarks_enabled) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile::FromBrowserContext(web_contents()->GetBrowserContext()); 65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if !defined(OS_CHROMEOS) 67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (profile->IsGuestSession()) 68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return false; 69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif 70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrefService* prefs = profile->GetPrefs(); 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (prefs->IsManagedPreference(bookmarks::prefs::kShowBookmarkBar) && 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci !prefs->GetBoolean(bookmarks::prefs::kShowBookmarkBar)) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return IsNTPWebUI(web_contents()) || IsInstantNTP(web_contents()); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BookmarkTabHelper::BookmarkTabHelper(content::WebContents* web_contents) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : content::WebContentsObserver(web_contents), 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_starred_(false), 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bookmark_model_(NULL), 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_(NULL), 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_drag_(NULL) { 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile::FromBrowserContext(web_contents->GetBrowserContext()); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bookmark_model_= BookmarkModelFactory::GetForProfile(profile); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (bookmark_model_) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bookmark_model_->AddObserver(this); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BookmarkTabHelper::UpdateStarredStateForCurrentURL() { 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const bool old_state = is_starred_; 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_starred_ = (bookmark_model_ && 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bookmark_model_->IsBookmarked(chrome::GetURLToBookmark(web_contents()))); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_starred_ != old_state && delegate_) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate_->URLStarredChanged(web_contents(), is_starred_); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BookmarkTabHelper::BookmarkModelChanged() { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void BookmarkTabHelper::BookmarkModelLoaded(BookmarkModel* model, 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool ids_reassigned) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateStarredStateForCurrentURL(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BookmarkTabHelper::BookmarkNodeAdded(BookmarkModel* model, 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BookmarkNode* parent, 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int index) { 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateStarredStateForCurrentURL(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void BookmarkTabHelper::BookmarkNodeRemoved( 116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BookmarkModel* model, 117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const BookmarkNode* parent, 118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int old_index, 119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const BookmarkNode* node, 120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::set<GURL>& removed_urls) { 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateStarredStateForCurrentURL(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void BookmarkTabHelper::BookmarkAllUserNodesRemoved( 125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BookmarkModel* model, 126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::set<GURL>& removed_urls) { 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) UpdateStarredStateForCurrentURL(); 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BookmarkTabHelper::BookmarkNodeChanged(BookmarkModel* model, 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const BookmarkNode* node) { 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateStarredStateForCurrentURL(); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BookmarkTabHelper::DidNavigateMainFrame( 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::LoadCommittedDetails& /*details*/, 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::FrameNavigateParams& /*params*/) { 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateStarredStateForCurrentURL(); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 140