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