Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(74)

Side by Side Diff: chrome/browser/views/bookmark_bar_view.cc

Issue 39285: Support loading extensions into the bookmark toolbar. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/views/bookmark_bar_view.h" 5 #include "chrome/browser/views/bookmark_bar_view.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "base/string_util.h" 9 #include "base/string_util.h"
10 #include "base/base_drag_source.h" 10 #include "base/base_drag_source.h"
11 #include "chrome/browser/bookmarks/bookmark_context_menu.h" 11 #include "chrome/browser/bookmarks/bookmark_context_menu.h"
12 #include "chrome/browser/bookmarks/bookmark_utils.h" 12 #include "chrome/browser/bookmarks/bookmark_utils.h"
13 #include "chrome/browser/browser.h" 13 #include "chrome/browser/browser.h"
14 #include "chrome/browser/browser_list.h" 14 #include "chrome/browser/browser_list.h"
15 #include "chrome/browser/browser_process.h" 15 #include "chrome/browser/browser_process.h"
16 #include "chrome/browser/browser_window.h" 16 #include "chrome/browser/browser_window.h"
17 #include "chrome/browser/drag_utils.h" 17 #include "chrome/browser/drag_utils.h"
18 #include "chrome/browser/download/download_util.h" 18 #include "chrome/browser/download/download_util.h"
19 #include "chrome/browser/extensions/extension.h"
20 #include "chrome/browser/extensions/extension_view.h"
21 #include "chrome/browser/extensions/extensions_service.h"
19 #include "chrome/browser/history/history.h" 22 #include "chrome/browser/history/history.h"
20 #include "chrome/browser/metrics/user_metrics.h" 23 #include "chrome/browser/metrics/user_metrics.h"
21 #include "chrome/browser/profile.h" 24 #include "chrome/browser/profile.h"
22 #include "chrome/browser/tab_contents/page_navigator.h" 25 #include "chrome/browser/tab_contents/page_navigator.h"
23 #include "chrome/browser/tab_contents/tab_contents.h" 26 #include "chrome/browser/tab_contents/tab_contents.h"
24 #include "chrome/browser/view_ids.h" 27 #include "chrome/browser/view_ids.h"
25 #include "chrome/browser/views/bookmark_editor_view.h" 28 #include "chrome/browser/views/bookmark_editor_view.h"
26 #include "chrome/browser/views/event_utils.h" 29 #include "chrome/browser/views/event_utils.h"
27 #include "chrome/browser/views/frame/browser_view.h" 30 #include "chrome/browser/views/frame/browser_view.h"
28 #include "chrome/browser/views/input_window.h" 31 #include "chrome/browser/views/input_window.h"
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 BookmarkButton::PaintAnimation(this, canvas, 311 BookmarkButton::PaintAnimation(this, canvas,
309 show_animation_->GetCurrentValue()); 312 show_animation_->GetCurrentValue());
310 } 313 }
311 314
312 private: 315 private:
313 scoped_ptr<SlideAnimation> show_animation_; 316 scoped_ptr<SlideAnimation> show_animation_;
314 317
315 DISALLOW_COPY_AND_ASSIGN(BookmarkFolderButton); 318 DISALLOW_COPY_AND_ASSIGN(BookmarkFolderButton);
316 }; 319 };
317 320
321 // ExtensionToolstrip -------------------------------------------------------
322
323 // A simple container with a border for an ExtensionView.
324 class ExtensionToolstrip : public views::View {
325 public:
326 static const int kPadding = 2;
327
328 ExtensionToolstrip(const GURL& url, Profile* profile)
329 : view_(new ExtensionView(url, profile)) {
330 AddChildView(view_);
331 set_border(views::Border::CreateEmptyBorder(
332 kPadding, kPadding, kPadding, kPadding));
333 }
334
335 virtual gfx::Size GetPreferredSize() {
336 gfx::Size size = view_->GetPreferredSize();
337 size.Enlarge(kPadding*2, kPadding*2);
338 return size;
339 }
340
341 virtual void DidChangeBounds(const gfx::Rect& previous,
342 const gfx::Rect& current) {
343 view_->SetBounds(GetLocalBounds(false));
344 }
345
346 private:
347 ExtensionView* view_;
348
349 DISALLOW_COPY_AND_ASSIGN(ExtensionToolstrip);
350 };
351
318 // DropInfo ------------------------------------------------------------------- 352 // DropInfo -------------------------------------------------------------------
319 353
320 // Tracks drops on the BookmarkBarView. 354 // Tracks drops on the BookmarkBarView.
321 355
322 struct DropInfo { 356 struct DropInfo {
323 DropInfo() : drop_index(-1), is_menu_showing(false), valid(false) {} 357 DropInfo() : drop_index(-1), is_menu_showing(false), valid(false) {}
324 358
325 // Whether the data is valid. 359 // Whether the data is valid.
326 bool valid; 360 bool valid;
327 361
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
682 : profile_(NULL), 716 : profile_(NULL),
683 browser_(browser), 717 browser_(browser),
684 page_navigator_(NULL), 718 page_navigator_(NULL),
685 model_(NULL), 719 model_(NULL),
686 other_bookmarked_button_(NULL), 720 other_bookmarked_button_(NULL),
687 model_changed_listener_(NULL), 721 model_changed_listener_(NULL),
688 show_folder_drop_menu_task_(NULL), 722 show_folder_drop_menu_task_(NULL),
689 overflow_button_(NULL), 723 overflow_button_(NULL),
690 instructions_(NULL), 724 instructions_(NULL),
691 bookmarks_separator_view_(NULL), 725 bookmarks_separator_view_(NULL),
692 throbbing_view_(NULL) { 726 throbbing_view_(NULL),
727 num_extension_toolstrips_(0) {
693 SetID(VIEW_ID_BOOKMARK_BAR); 728 SetID(VIEW_ID_BOOKMARK_BAR);
694 Init(); 729 Init();
695 SetProfile(profile); 730 SetProfile(profile);
696 731
697 732
698 if (IsAlwaysShown()) { 733 if (IsAlwaysShown()) {
699 size_animation_->Reset(1); 734 size_animation_->Reset(1);
700 } else { 735 } else {
701 size_animation_->Reset(0); 736 size_animation_->Reset(0);
702 } 737 }
(...skipping 10 matching lines...) Expand all
713 void BookmarkBarView::SetProfile(Profile* profile) { 748 void BookmarkBarView::SetProfile(Profile* profile) {
714 DCHECK(profile); 749 DCHECK(profile);
715 if (profile_ == profile) 750 if (profile_ == profile)
716 return; 751 return;
717 752
718 StopThrobbing(true); 753 StopThrobbing(true);
719 754
720 // Cancels the current cancelable. 755 // Cancels the current cancelable.
721 NotifyModelChanged(); 756 NotifyModelChanged();
722 757
723 // Remove the current buttons. 758 // Remove the current buttons and extension toolstrips.
724 for (int i = GetBookmarkButtonCount() - 1; i >= 0; --i) { 759 for (int i = GetBookmarkButtonCount() + num_extension_toolstrips_ - 1;
760 i >= 0; --i) {
725 View* child = GetChildViewAt(i); 761 View* child = GetChildViewAt(i);
726 RemoveChildView(child); 762 RemoveChildView(child);
727 delete child; 763 delete child;
728 } 764 }
729 765
730 profile_ = profile; 766 profile_ = profile;
731 767
732 if (model_) 768 if (model_)
733 model_->RemoveObserver(this); 769 model_->RemoveObserver(this);
734 770
735 // Disable the other bookmarked button, we'll re-enable when the model is 771 // Disable the other bookmarked button, we'll re-enable when the model is
736 // loaded. 772 // loaded.
737 other_bookmarked_button_->SetEnabled(false); 773 other_bookmarked_button_->SetEnabled(false);
738 774
739 NotificationService* ns = NotificationService::current(); 775 NotificationService* ns = NotificationService::current();
740 Source<Profile> ns_source(profile_->GetOriginalProfile()); 776 Source<Profile> ns_source(profile_->GetOriginalProfile());
741 ns->AddObserver(this, NotificationType::BOOKMARK_BUBBLE_SHOWN, ns_source); 777 ns->AddObserver(this, NotificationType::BOOKMARK_BUBBLE_SHOWN, ns_source);
742 ns->AddObserver(this, NotificationType::BOOKMARK_BUBBLE_HIDDEN, ns_source); 778 ns->AddObserver(this, NotificationType::BOOKMARK_BUBBLE_HIDDEN, ns_source);
743 ns->AddObserver(this, NotificationType::BOOKMARK_BAR_VISIBILITY_PREF_CHANGED, 779 ns->AddObserver(this, NotificationType::BOOKMARK_BAR_VISIBILITY_PREF_CHANGED,
744 NotificationService::AllSources()); 780 NotificationService::AllSources());
781 ns->AddObserver(this, NotificationType::EXTENSIONS_LOADED,
782 NotificationService::AllSources());
745 783
746 model_ = profile_->GetBookmarkModel(); 784 model_ = profile_->GetBookmarkModel();
747 model_->AddObserver(this); 785 model_->AddObserver(this);
748 if (model_->IsLoaded()) 786 if (model_->IsLoaded())
749 Loaded(model_); 787 Loaded(model_);
750 // else case: we'll receive notification back from the BookmarkModel when done 788 // else case: we'll receive notification back from the BookmarkModel when done
751 // loading, then we'll populate the bar. 789 // loading, then we'll populate the bar.
752 } 790 }
753 791
754 void BookmarkBarView::SetPageNavigator(PageNavigator* navigator) { 792 void BookmarkBarView::SetPageNavigator(PageNavigator* navigator) {
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
828 for (int i = 0; i < GetBookmarkButtonCount(); ++i) { 866 for (int i = 0; i < GetBookmarkButtonCount(); ++i) {
829 views::View* child = GetChildViewAt(i); 867 views::View* child = GetChildViewAt(i);
830 gfx::Size pref = child->GetPreferredSize(); 868 gfx::Size pref = child->GetPreferredSize();
831 int next_x = x + pref.width() + kButtonPadding; 869 int next_x = x + pref.width() + kButtonPadding;
832 child->SetVisible(next_x < max_x); 870 child->SetVisible(next_x < max_x);
833 child->SetBounds(x, y, pref.width(), height); 871 child->SetBounds(x, y, pref.width(), height);
834 x = next_x; 872 x = next_x;
835 } 873 }
836 } 874 }
837 875
876 // Extension toolstrips.
877 for (int i = GetBookmarkButtonCount();
878 i < GetBookmarkButtonCount() + num_extension_toolstrips_; ++i) {
879 views::View* child = GetChildViewAt(i);
880 gfx::Size pref = child->GetPreferredSize();
881 int next_x = x + pref.width() + kButtonPadding;
882 child->SetVisible(next_x < max_x);
883 child->SetBounds(x, y, pref.width(), height);
884 x = next_x;
885 }
886
838 // Layout the right side of the bar. 887 // Layout the right side of the bar.
839 const bool all_visible = 888 const bool all_visible =
840 (GetBookmarkButtonCount() == 0 || 889 (GetBookmarkButtonCount() == 0 ||
841 GetChildViewAt(GetBookmarkButtonCount() - 1)->IsVisible()); 890 GetChildViewAt(GetBookmarkButtonCount() - 1)->IsVisible());
842 891
843 // Layout the right side buttons. 892 // Layout the right side buttons.
844 x = max_x + kButtonPadding; 893 x = max_x + kButtonPadding;
845 894
846 // The overflow button. 895 // The overflow button.
847 overflow_button_->SetBounds(x, y, overflow_pref.width(), height); 896 overflow_button_->SetBounds(x, y, overflow_pref.width(), height);
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after
1211 // text and flipping the ChromeCanvas object will break text rendering. Since 1260 // text and flipping the ChromeCanvas object will break text rendering. Since
1212 // the overflow button does not contain text, we can safely flip it. 1261 // the overflow button does not contain text, we can safely flip it.
1213 button->EnableCanvasFlippingForRTLUI(true); 1262 button->EnableCanvasFlippingForRTLUI(true);
1214 1263
1215 // Make visible as necessary. 1264 // Make visible as necessary.
1216 button->SetVisible(false); 1265 button->SetVisible(false);
1217 return button; 1266 return button;
1218 } 1267 }
1219 1268
1220 int BookmarkBarView::GetBookmarkButtonCount() { 1269 int BookmarkBarView::GetBookmarkButtonCount() {
1221 // We contain four non-bookmark button views: recently bookmarked, 1270 // We contain at least four non-bookmark button views: recently bookmarked,
1222 // bookmarks separator, chevrons (for overflow) and the instruction 1271 // bookmarks separator, chevrons (for overflow), the instruction
1223 // label. 1272 // label, as well as any ExtensionViews displaying toolstrips.
1224 return GetChildViewCount() - 4; 1273 return GetChildViewCount() - 4 - num_extension_toolstrips_;
1225 } 1274 }
1226 1275
1227 void BookmarkBarView::Loaded(BookmarkModel* model) { 1276 void BookmarkBarView::Loaded(BookmarkModel* model) {
1228 BookmarkNode* node = model_->GetBookmarkBarNode(); 1277 BookmarkNode* node = model_->GetBookmarkBarNode();
1229 DCHECK(node && model_->other_node()); 1278 DCHECK(node && model_->other_node());
1230 // Create a button for each of the children on the bookmark bar. 1279 // Create a button for each of the children on the bookmark bar.
1231 for (int i = 0; i < node->GetChildCount(); ++i) 1280 for (int i = 0; i < node->GetChildCount(); ++i)
1232 AddChildView(i, CreateBookmarkButton(node->GetChild(i))); 1281 AddChildView(i, CreateBookmarkButton(node->GetChild(i)));
1233 other_bookmarked_button_->SetEnabled(true); 1282 other_bookmarked_button_->SetEnabled(true);
1283
1284 AddExtensionToolstrips(profile_->GetExtensionsService()->extensions());
1285
1234 Layout(); 1286 Layout();
1235 SchedulePaint(); 1287 SchedulePaint();
1236 } 1288 }
1237 1289
1238 void BookmarkBarView::BookmarkModelBeingDeleted(BookmarkModel* model) { 1290 void BookmarkBarView::BookmarkModelBeingDeleted(BookmarkModel* model) {
1239 // The bookmark model should never be deleted before us. This code exists 1291 // The bookmark model should never be deleted before us. This code exists
1240 // to check for regressions in shutdown code and not crash. 1292 // to check for regressions in shutdown code and not crash.
1241 NOTREACHED(); 1293 NOTREACHED();
1242 1294
1243 // Do minimal cleanup, presumably we'll be deleted shortly. 1295 // Do minimal cleanup, presumably we'll be deleted shortly.
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
1575 case NotificationType::BOOKMARK_BUBBLE_SHOWN: 1627 case NotificationType::BOOKMARK_BUBBLE_SHOWN:
1576 StopThrobbing(true); 1628 StopThrobbing(true);
1577 bubble_url_ = *(Details<GURL>(details).ptr()); 1629 bubble_url_ = *(Details<GURL>(details).ptr());
1578 StartThrobbing(); 1630 StartThrobbing();
1579 break; 1631 break;
1580 1632
1581 case NotificationType::BOOKMARK_BUBBLE_HIDDEN: 1633 case NotificationType::BOOKMARK_BUBBLE_HIDDEN:
1582 StopThrobbing(false); 1634 StopThrobbing(false);
1583 bubble_url_ = GURL(); 1635 bubble_url_ = GURL();
1584 break; 1636 break;
1637
1638 case NotificationType::EXTENSIONS_LOADED: {
1639 const ExtensionList* extensions = Details<ExtensionList>(details).ptr();
1640 if (AddExtensionToolstrips(extensions)) {
1641 Layout();
1642 SchedulePaint();
1643 }
1644 break;
1645 }
1585 } 1646 }
1586 } 1647 }
1587 1648
1649 bool BookmarkBarView::AddExtensionToolstrips(const ExtensionList* extensions) {
1650 bool added_toolstrip = false;
1651 for (ExtensionList::const_iterator extension = extensions->begin();
1652 extension != extensions->end(); ++extension) {
1653 if (!(*extension)->toolstrip_url().is_empty()) {
1654 ExtensionToolstrip* view =
1655 new ExtensionToolstrip((*extension)->toolstrip_url(), profile_);
1656 int index = GetBookmarkButtonCount() + num_extension_toolstrips_;
1657 AddChildView(index, view);
1658 added_toolstrip = true;
1659 ++num_extension_toolstrips_;
1660 }
1661 }
1662
1663 return added_toolstrip;
1664 }
1665
1588 void BookmarkBarView::RemoveNotificationObservers() { 1666 void BookmarkBarView::RemoveNotificationObservers() {
1589 NotificationService* ns = NotificationService::current(); 1667 NotificationService* ns = NotificationService::current();
1590 Source<Profile> ns_source(profile_->GetOriginalProfile()); 1668 Source<Profile> ns_source(profile_->GetOriginalProfile());
1591 ns->RemoveObserver(this, NotificationType::BOOKMARK_BUBBLE_SHOWN, ns_source); 1669 ns->RemoveObserver(this, NotificationType::BOOKMARK_BUBBLE_SHOWN, ns_source);
1592 ns->RemoveObserver(this, NotificationType::BOOKMARK_BUBBLE_HIDDEN, ns_source); 1670 ns->RemoveObserver(this, NotificationType::BOOKMARK_BUBBLE_HIDDEN, ns_source);
1593 ns->RemoveObserver(this, 1671 ns->RemoveObserver(this,
1594 NotificationType::BOOKMARK_BAR_VISIBILITY_PREF_CHANGED, 1672 NotificationType::BOOKMARK_BAR_VISIBILITY_PREF_CHANGED,
1595 NotificationService::AllSources()); 1673 NotificationService::AllSources());
1674 ns->RemoveObserver(this, NotificationType::EXTENSIONS_LOADED,
1675 NotificationService::AllSources());
1596 } 1676 }
1597 1677
1598 void BookmarkBarView::NotifyModelChanged() { 1678 void BookmarkBarView::NotifyModelChanged() {
1599 if (model_changed_listener_) 1679 if (model_changed_listener_)
1600 model_changed_listener_->ModelChanged(); 1680 model_changed_listener_->ModelChanged();
1601 } 1681 }
1602 1682
1603 void BookmarkBarView::ShowDropFolderForNode(BookmarkNode* node) { 1683 void BookmarkBarView::ShowDropFolderForNode(BookmarkNode* node) {
1604 if (drop_menu_runner_.get() && drop_menu_runner_->GetNode() == node) { 1684 if (drop_menu_runner_.get() && drop_menu_runner_->GetNode() == node) {
1605 // Already showing for the specified node. 1685 // Already showing for the specified node.
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
1885 } 1965 }
1886 1966
1887 void BookmarkBarView::StopThrobbing(bool immediate) { 1967 void BookmarkBarView::StopThrobbing(bool immediate) {
1888 if (!throbbing_view_) 1968 if (!throbbing_view_)
1889 return; 1969 return;
1890 1970
1891 // If not immediate, cycle through 2 more complete cycles. 1971 // If not immediate, cycle through 2 more complete cycles.
1892 throbbing_view_->StartThrobbing(immediate ? 0 : 4); 1972 throbbing_view_->StartThrobbing(immediate ? 0 : 4);
1893 throbbing_view_ = NULL; 1973 throbbing_view_ = NULL;
1894 } 1974 }
OLDNEW
« no previous file with comments | « chrome/browser/views/bookmark_bar_view.h ('k') | chrome/test/data/extensions/good/extension1/1/index.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698