diff options
Diffstat (limited to 'chrome/browser/ui/gtk')
-rw-r--r-- | chrome/browser/ui/gtk/location_bar_view_gtk.cc | 163 | ||||
-rw-r--r-- | chrome/browser/ui/gtk/location_bar_view_gtk.h | 26 |
2 files changed, 105 insertions, 84 deletions
diff --git a/chrome/browser/ui/gtk/location_bar_view_gtk.cc b/chrome/browser/ui/gtk/location_bar_view_gtk.cc index f3227fe..3672740 100644 --- a/chrome/browser/ui/gtk/location_bar_view_gtk.cc +++ b/chrome/browser/ui/gtk/location_bar_view_gtk.cc @@ -26,9 +26,9 @@ #include "chrome/browser/defaults.h" #include "chrome/browser/extensions/api/commands/extension_command_service.h" #include "chrome/browser/extensions/api/commands/extension_command_service_factory.h" +#include "chrome/browser/extensions/action_box_controller.h" #include "chrome/browser/extensions/extension_browser_event_router.h" #include "chrome/browser/extensions/extension_service.h" -#include "chrome/browser/extensions/extension_tab_helper.h" #include "chrome/browser/extensions/extension_tab_util.h" #include "chrome/browser/favicon/favicon_tab_helper.h" #include "chrome/browser/instant/instant_controller.h" @@ -356,10 +356,6 @@ void LocationBarViewGtk::Init(bool popup_window_mode) { registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, content::Source<ThemeService>(theme_service_)); - registrar_.Add(this, - chrome::NOTIFICATION_EXTENSION_ACTION_BOX_UPDATED, - content::Source<Profile>(browser()->profile())); - edit_bookmarks_enabled_.Init(prefs::kEditBookmarksEnabled, profile->GetPrefs(), this); @@ -448,10 +444,16 @@ void LocationBarViewGtk::SetPreviewEnabledPageAction( ExtensionAction *page_action, bool preview_enabled) { DCHECK(page_action); - if (preview_enabled && preview_enabled_actions_.insert(page_action).second) - UpdatePageActions(); - if (!preview_enabled && preview_enabled_actions_.erase(page_action) > 0) - UpdatePageActions(); + UpdatePageActions(); + for (ScopedVector<PageActionViewGtk>::iterator iter = + page_action_views_.begin(); iter != page_action_views_.end(); + ++iter) { + if ((*iter)->page_action() == page_action) { + (*iter)->set_preview_enabled(preview_enabled); + UpdatePageActions(); + return; + } + } } GtkWidget* LocationBarViewGtk::GetPageActionWidget( @@ -683,20 +685,14 @@ void LocationBarViewGtk::UpdateContentSettingsIcons() { } void LocationBarViewGtk::UpdatePageActions() { - std::vector<ExtensionAction*> page_actions; + ActionBoxController::DataList page_actions; TabContentsWrapper* tab_contents = GetTabContentsWrapper(); if (tab_contents) { - ActionBoxController* controller = - tab_contents->extension_tab_helper()->action_box_controller(); - page_actions.swap(*controller->GetCurrentActions()); + page_actions.swap( + *tab_contents->extension_action_box_controller()->GetAllBadgeData()); } - // Add page actions for any extensions which have "preview enabled" and not - // already visible. - ActionBoxController::AddMissingActions( - preview_enabled_actions_, &page_actions); - // Initialize on the first call, or re-inialize if more extensions have been // loaded or added after startup. if (page_actions.size() != page_action_views_.size()) { @@ -704,7 +700,7 @@ void LocationBarViewGtk::UpdatePageActions() { for (size_t i = 0; i < page_actions.size(); ++i) { page_action_views_.push_back( - new PageActionViewGtk(this, page_actions[i])); + new PageActionViewGtk(this, page_actions[i].action)); gtk_box_pack_end(GTK_BOX(page_action_hbox_.get()), page_action_views_[i]->widget(), FALSE, FALSE, 0); } @@ -719,7 +715,7 @@ void LocationBarViewGtk::UpdatePageActions() { GURL url = browser()->GetSelectedWebContents()->GetURL(); for (size_t i = 0; i < page_action_views_.size(); i++) { - page_action_views_[i]->Update( + page_action_views_[i]->UpdateVisibility( toolbar_model_->input_in_progress() ? NULL : contents, url); } } @@ -782,7 +778,16 @@ ExtensionAction* LocationBarViewGtk::GetPageAction(size_t index) { } ExtensionAction* LocationBarViewGtk::GetVisiblePageAction(size_t index) { - return page_action_views_[index]->page_action(); + size_t visible_index = 0; + for (size_t i = 0; i < page_action_views_.size(); ++i) { + if (page_action_views_[i]->IsVisible()) { + if (index == visible_index++) + return page_action_views_[i]->page_action(); + } + } + + NOTREACHED(); + return NULL; } void LocationBarViewGtk::TestPageActionPressed(size_t index) { @@ -803,15 +808,6 @@ void LocationBarViewGtk::Observe(int type, return; } - if (type == chrome::NOTIFICATION_EXTENSION_ACTION_BOX_UPDATED) { - // Only update if the updated action box was for the active tab contents. - TabContentsWrapper* target_tab = - content::Details<TabContentsWrapper>(details).ptr(); - if (target_tab == GetTabContentsWrapper()) - UpdatePageActions(); - return; - } - DCHECK_EQ(type, chrome::NOTIFICATION_BROWSER_THEME_CHANGED); if (theme_service_->UsingNativeTheme()) { @@ -1507,7 +1503,8 @@ LocationBarViewGtk::PageActionViewGtk::PageActionViewGtk( tracker_(this), current_tab_id_(-1), window_(NULL), - accel_group_(NULL) { + accel_group_(NULL), + preview_enabled_(false) { event_box_.Own(gtk_event_box_new()); gtk_widget_set_size_request(event_box_.get(), Extension::kPageActionIconMaxSize, @@ -1524,7 +1521,6 @@ LocationBarViewGtk::PageActionViewGtk::PageActionViewGtk( image_.Own(gtk_image_new()); gtk_container_add(GTK_CONTAINER(event_box_.get()), image_.get()); - gtk_widget_show_all(event_box_.get()); const Extension* extension = owner->browser()->profile()-> GetExtensionService()->GetExtensionById(page_action->extension_id(), @@ -1563,56 +1559,75 @@ LocationBarViewGtk::PageActionViewGtk::~PageActionViewGtk() { g_object_unref(last_icon_pixbuf_); } -void LocationBarViewGtk::PageActionViewGtk::Update( +bool LocationBarViewGtk::PageActionViewGtk::IsVisible() { + return gtk_widget_get_visible(widget()); +} + +void LocationBarViewGtk::PageActionViewGtk::UpdateVisibility( WebContents* contents, const GURL& url) { // Save this off so we can pass it back to the extension when the action gets // executed. See PageActionImageView::OnMousePressed. current_tab_id_ = contents ? ExtensionTabUtil::GetTabId(contents) : -1; current_url_ = url; - // Set the tooltip. - gtk_widget_set_tooltip_text(event_box_.get(), - page_action_->GetTitle(current_tab_id_).c_str()); - - // Set the image. - // It can come from three places. In descending order of priority: - // - The developer can set it dynamically by path or bitmap. It will be in - // page_action_->GetIcon(). - // - The developer can set it dyanmically by index. It will be in - // page_action_->GetIconIndex(). - // - It can be set in the manifest by path. It will be in page_action_-> - // default_icon_path(). - - // First look for a dynamically set bitmap. - SkBitmap icon = page_action_->GetIcon(current_tab_id_); - GdkPixbuf* pixbuf = NULL; - - if (!icon.isNull()) { - if (icon.pixelRef() != last_icon_skbitmap_.pixelRef()) { - if (last_icon_pixbuf_) - g_object_unref(last_icon_pixbuf_); - last_icon_skbitmap_ = icon; - last_icon_pixbuf_ = gfx::GdkPixbufFromSkBitmap(&icon); - } - DCHECK(last_icon_pixbuf_); - pixbuf = last_icon_pixbuf_; - } else { - // Otherwise look for a dynamically set index, or fall back to the - // default path. - int icon_index = page_action_->GetIconIndex(current_tab_id_); - std::string icon_path = icon_index < 0 ? - page_action_->default_icon_path() : - page_action_->icon_paths()->at(icon_index); - if (!icon_path.empty()) { - PixbufMap::iterator iter = pixbufs_.find(icon_path); - if (iter != pixbufs_.end()) - pixbuf = iter->second; + bool visible = contents && + (preview_enabled_ || page_action_->GetIsVisible(current_tab_id_)); + if (visible) { + // Set the tooltip. + gtk_widget_set_tooltip_text(event_box_.get(), + page_action_->GetTitle(current_tab_id_).c_str()); + + // Set the image. + // It can come from three places. In descending order of priority: + // - The developer can set it dynamically by path or bitmap. It will be in + // page_action_->GetIcon(). + // - The developer can set it dyanmically by index. It will be in + // page_action_->GetIconIndex(). + // - It can be set in the manifest by path. It will be in page_action_-> + // default_icon_path(). + + // First look for a dynamically set bitmap. + SkBitmap icon = page_action_->GetIcon(current_tab_id_); + GdkPixbuf* pixbuf = NULL; + if (!icon.isNull()) { + if (icon.pixelRef() != last_icon_skbitmap_.pixelRef()) { + if (last_icon_pixbuf_) + g_object_unref(last_icon_pixbuf_); + last_icon_skbitmap_ = icon; + last_icon_pixbuf_ = gfx::GdkPixbufFromSkBitmap(&icon); + } + DCHECK(last_icon_pixbuf_); + pixbuf = last_icon_pixbuf_; + } else { + // Otherwise look for a dynamically set index, or fall back to the + // default path. + int icon_index = page_action_->GetIconIndex(current_tab_id_); + std::string icon_path = (icon_index < 0) ? + page_action_->default_icon_path() : + page_action_->icon_paths()->at(icon_index); + if (!icon_path.empty()) { + PixbufMap::iterator iter = pixbufs_.find(icon_path); + if (iter != pixbufs_.end()) + pixbuf = iter->second; + } } + // The pixbuf might not be loaded yet. + if (pixbuf) + gtk_image_set_from_pixbuf(GTK_IMAGE(image_.get()), pixbuf); } - // The pixbuf might not be loaded yet. - if (pixbuf) - gtk_image_set_from_pixbuf(GTK_IMAGE(image_.get()), pixbuf); + bool old_visible = IsVisible(); + if (visible) + gtk_widget_show_all(event_box_.get()); + else + gtk_widget_hide_all(event_box_.get()); + + if (visible != old_visible) { + content::NotificationService::current()->Notify( + chrome::NOTIFICATION_EXTENSION_PAGE_ACTION_VISIBILITY_CHANGED, + content::Source<ExtensionAction>(page_action_), + content::Details<WebContents>(contents)); + } } void LocationBarViewGtk::PageActionViewGtk::OnImageLoaded( @@ -1733,7 +1748,7 @@ gboolean LocationBarViewGtk::PageActionViewGtk::OnButtonPressed( return TRUE; ActionBoxController* controller = - tab_contents->extension_tab_helper()->action_box_controller(); + tab_contents->extension_action_box_controller(); switch (controller->OnClicked(extension->id(), event->button)) { case ActionBoxController::ACTION_NONE: diff --git a/chrome/browser/ui/gtk/location_bar_view_gtk.h b/chrome/browser/ui/gtk/location_bar_view_gtk.h index 3f3d4d8..4a0fbce 100644 --- a/chrome/browser/ui/gtk/location_bar_view_gtk.h +++ b/chrome/browser/ui/gtk/location_bar_view_gtk.h @@ -9,7 +9,6 @@ #include <gtk/gtk.h> #include <map> -#include <set> #include <string> #include "base/basictypes.h" @@ -19,7 +18,6 @@ #include "base/memory/weak_ptr.h" #include "chrome/browser/autocomplete/autocomplete_edit.h" #include "chrome/browser/command_updater.h" -#include "chrome/browser/extensions/action_box_controller.h" #include "chrome/browser/extensions/extension_context_menu_model.h" #include "chrome/browser/extensions/image_loading_tracker.h" #include "chrome/browser/prefs/pref_member.h" @@ -80,9 +78,10 @@ class LocationBarViewGtk : public AutocompleteEditController, // Returns the current WebContents. content::WebContents* GetWebContents() const; - // If |preview_enabled| is true, the view will display the - // This is used by the ExtensionInstalledBubbleGtk to preview what the icon + // Sets |preview_enabled| for the PageActionViewGtk associated with this + // |page_action|. If |preview_enabled| is true, the view will display the // page action's icon even though it has not been activated by the extension. + // This is used by the ExtensionInstalledBubbleGtk to preview what the icon // will look like for the user upon installation of the extension. void SetPreviewEnabledPageAction(ExtensionAction *page_action, bool preview_enabled); @@ -229,10 +228,16 @@ class LocationBarViewGtk : public AutocompleteEditController, ExtensionAction* page_action() { return page_action_; } - // Called to notify the PageAction that it should update based on the state - // of |page_action_|. |contents| is the WebContents that is active, |url| + void set_preview_enabled(bool preview_enabled) { + preview_enabled_ = preview_enabled; + } + + bool IsVisible(); + + // Called to notify the PageAction that it should determine whether to be + // visible or hidden. |contents| is the WebContents that is active, |url| // is the current page URL. - void Update(content::WebContents* contents, const GURL& url); + void UpdateVisibility(content::WebContents* contents, const GURL& url); // A callback from ImageLoadingTracker for when the image has loaded. virtual void OnImageLoaded(const gfx::Image& image, @@ -311,6 +316,10 @@ class LocationBarViewGtk : public AutocompleteEditController, // The keybinding accelerator registered to show the page action popup. scoped_ptr<ui::AcceleratorGtk> keybinding_; + // This is used for post-install visual feedback. The page_action icon + // is briefly shown even if it hasn't been enabled by its extension. + bool preview_enabled_; + // The context menu view and model for this extension action. scoped_ptr<MenuGtk> context_menu_; scoped_refptr<ExtensionContextMenuModel> context_menu_model_; @@ -484,9 +493,6 @@ class LocationBarViewGtk : public AutocompleteEditController, // Used to change the visibility of the star decoration. BooleanPrefMember edit_bookmarks_enabled_; - // The extension actions which have "preview enabled". - std::set<ExtensionAction*> preview_enabled_actions_; - DISALLOW_COPY_AND_ASSIGN(LocationBarViewGtk); }; |