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

Side by Side Diff: chrome/browser/ui/gtk/location_bar_view_gtk.cc

Issue 10806058: Move icon fallbacks into ExtensionAction. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Move the icon cache inside ExtensionAction. Created 8 years, 4 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) 2012 The Chromium Authors. All rights reserved. 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 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/ui/gtk/location_bar_view_gtk.h" 5 #include "chrome/browser/ui/gtk/location_bar_view_gtk.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 1681 matching lines...) Expand 10 before | Expand all | Expand 10 after
1692 } 1692 }
1693 1693
1694 //////////////////////////////////////////////////////////////////////////////// 1694 ////////////////////////////////////////////////////////////////////////////////
1695 // LocationBarViewGtk::PageActionViewGtk 1695 // LocationBarViewGtk::PageActionViewGtk
1696 1696
1697 LocationBarViewGtk::PageActionViewGtk::PageActionViewGtk( 1697 LocationBarViewGtk::PageActionViewGtk::PageActionViewGtk(
1698 LocationBarViewGtk* owner, 1698 LocationBarViewGtk* owner,
1699 ExtensionAction* page_action) 1699 ExtensionAction* page_action)
1700 : owner_(NULL), 1700 : owner_(NULL),
1701 page_action_(page_action), 1701 page_action_(page_action),
1702 last_icon_pixbuf_(NULL),
1703 tracker_(this), 1702 tracker_(this),
1704 current_tab_id_(-1), 1703 current_tab_id_(-1),
1705 window_(NULL), 1704 window_(NULL),
1706 accel_group_(NULL), 1705 accel_group_(NULL),
1707 preview_enabled_(false), 1706 preview_enabled_(false),
1708 ALLOW_THIS_IN_INITIALIZER_LIST(scoped_icon_animation_observer_( 1707 ALLOW_THIS_IN_INITIALIZER_LIST(scoped_icon_animation_observer_(
1709 page_action->GetIconAnimation( 1708 page_action->GetIconAnimation(
1710 SessionID::IdForTab(owner->GetTabContents())), 1709 SessionID::IdForTab(owner->GetTabContents())),
1711 this)) { 1710 this)) {
1712 event_box_.Own(gtk_event_box_new()); 1711 event_box_.Own(gtk_event_box_new());
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1748 // We set the owner last of all so that we can determine whether we are in 1747 // We set the owner last of all so that we can determine whether we are in
1749 // the process of initializing this class or not. 1748 // the process of initializing this class or not.
1750 owner_ = owner; 1749 owner_ = owner;
1751 } 1750 }
1752 1751
1753 LocationBarViewGtk::PageActionViewGtk::~PageActionViewGtk() { 1752 LocationBarViewGtk::PageActionViewGtk::~PageActionViewGtk() {
1754 DisconnectPageActionAccelerator(); 1753 DisconnectPageActionAccelerator();
1755 1754
1756 image_.Destroy(); 1755 image_.Destroy();
1757 event_box_.Destroy(); 1756 event_box_.Destroy();
1758 for (PixbufMap::iterator iter = pixbufs_.begin(); iter != pixbufs_.end();
1759 ++iter) {
1760 g_object_unref(iter->second);
1761 }
1762 if (last_icon_pixbuf_)
1763 g_object_unref(last_icon_pixbuf_);
1764 } 1757 }
1765 1758
1766 bool LocationBarViewGtk::PageActionViewGtk::IsVisible() { 1759 bool LocationBarViewGtk::PageActionViewGtk::IsVisible() {
1767 return gtk_widget_get_visible(widget()); 1760 return gtk_widget_get_visible(widget());
1768 } 1761 }
1769 1762
1770 void LocationBarViewGtk::PageActionViewGtk::UpdateVisibility( 1763 void LocationBarViewGtk::PageActionViewGtk::UpdateVisibility(
1771 WebContents* contents, const GURL& url) { 1764 WebContents* contents, const GURL& url) {
1772 // Save this off so we can pass it back to the extension when the action gets 1765 // Save this off so we can pass it back to the extension when the action gets
1773 // executed. See PageActionImageView::OnMousePressed. 1766 // executed. See PageActionImageView::OnMousePressed.
1774 current_tab_id_ = contents ? ExtensionTabUtil::GetTabId(contents) : -1; 1767 current_tab_id_ = contents ? ExtensionTabUtil::GetTabId(contents) : -1;
1775 current_url_ = url; 1768 current_url_ = url;
1776 1769
1777 bool visible = contents && 1770 bool visible = contents &&
1778 (preview_enabled_ || page_action_->GetIsVisible(current_tab_id_)); 1771 (preview_enabled_ || page_action_->GetIsVisible(current_tab_id_));
1779 if (visible) { 1772 if (visible) {
1780 // Set the tooltip. 1773 // Set the tooltip.
1781 gtk_widget_set_tooltip_text(event_box_.get(), 1774 gtk_widget_set_tooltip_text(event_box_.get(),
1782 page_action_->GetTitle(current_tab_id_).c_str()); 1775 page_action_->GetTitle(current_tab_id_).c_str());
1783 1776
1784 // Set the image. 1777 // Set the image.
1785 // It can come from three places. In descending order of priority: 1778 gfx::Image icon = page_action_->GetIcon(current_tab_id_);
1786 // - The developer can set it dynamically by path or bitmap. It will be in 1779 if (!icon.IsEmpty()) {
1787 // page_action_->GetIcon(). 1780 GdkPixbuf* pixbuf = icon.ToGdkPixbuf();
1788 // - The developer can set it dyanmically by index. It will be in 1781 DCHECK(pixbuf);
1789 // page_action_->GetIconIndex(). 1782 gtk_image_set_from_pixbuf(GTK_IMAGE(image_.get()), pixbuf);
1790 // - It can be set in the manifest by path. It will be in page_action_->
1791 // default_icon_path().
1792
1793 // First look for a dynamically set bitmap.
1794 SkBitmap icon = page_action_->GetIcon(current_tab_id_);
1795 GdkPixbuf* pixbuf = NULL;
1796 if (!icon.isNull()) {
1797 if (icon.pixelRef() != last_icon_skbitmap_.pixelRef()) {
1798 if (last_icon_pixbuf_)
1799 g_object_unref(last_icon_pixbuf_);
1800 last_icon_skbitmap_ = icon;
1801 last_icon_pixbuf_ = gfx::GdkPixbufFromSkBitmap(icon);
1802 }
1803 DCHECK(last_icon_pixbuf_);
1804 pixbuf = last_icon_pixbuf_;
1805 } else {
1806 // Otherwise look for a dynamically set index, or fall back to the
1807 // default path.
1808 int icon_index = page_action_->GetIconIndex(current_tab_id_);
1809 std::string icon_path = (icon_index < 0) ?
1810 page_action_->default_icon_path() :
1811 page_action_->icon_paths()->at(icon_index);
1812 if (!icon_path.empty()) {
1813 PixbufMap::iterator iter = pixbufs_.find(icon_path);
1814 if (iter != pixbufs_.end())
1815 pixbuf = iter->second;
1816 }
1817 }
1818 // The pixbuf might not be loaded yet.
1819 if (pixbuf) {
1820 const ExtensionAction::IconAnimation* icon_animation =
1821 scoped_icon_animation_observer_.icon_animation();
1822 if (icon_animation) {
1823 // Draw |pixbuf| with the fade-in |icon_animation_| applied to it.
1824 // Use a temporary gfx::Image to do the conversion to/from a SkBitmap.
1825 g_object_ref(pixbuf); // don't let gfx::Image take ownership.
1826 gfx::Image animated_image(
1827 icon_animation->Apply(*gfx::Image(pixbuf).ToSkBitmap()));
1828 gtk_image_set_from_pixbuf(GTK_IMAGE(image_.get()),
1829 animated_image.ToGdkPixbuf());
1830 } else {
1831 gtk_image_set_from_pixbuf(GTK_IMAGE(image_.get()), pixbuf);
1832 }
1833 } 1783 }
1834 } 1784 }
1835 1785
1836 bool old_visible = IsVisible(); 1786 bool old_visible = IsVisible();
1837 if (visible) 1787 if (visible)
1838 gtk_widget_show_all(event_box_.get()); 1788 gtk_widget_show_all(event_box_.get());
1839 else 1789 else
1840 gtk_widget_hide_all(event_box_.get()); 1790 gtk_widget_hide_all(event_box_.get());
1841 1791
1842 if (visible != old_visible) { 1792 if (visible != old_visible) {
(...skipping 10 matching lines...) Expand all
1853 int index) { 1803 int index) {
1854 // We loaded icons()->size() icons, plus one extra if the page action had 1804 // We loaded icons()->size() icons, plus one extra if the page action had
1855 // a default icon. 1805 // a default icon.
1856 int total_icons = static_cast<int>(page_action_->icon_paths()->size()); 1806 int total_icons = static_cast<int>(page_action_->icon_paths()->size());
1857 if (!page_action_->default_icon_path().empty()) 1807 if (!page_action_->default_icon_path().empty())
1858 total_icons++; 1808 total_icons++;
1859 DCHECK(index < total_icons); 1809 DCHECK(index < total_icons);
1860 1810
1861 // Map the index of the loaded image back to its name. If we ever get an 1811 // Map the index of the loaded image back to its name. If we ever get an
1862 // index greater than the number of icons, it must be the default icon. 1812 // index greater than the number of icons, it must be the default icon.
1863 if (!image.IsEmpty()) { 1813 if (index < static_cast<int>(page_action_->icon_paths()->size()))
1864 GdkPixbuf* pixbuf = 1814 page_action_->CacheIcon(page_action_->icon_paths()->at(index), image);
1865 static_cast<GdkPixbuf*>(g_object_ref(image.ToGdkPixbuf())); 1815 else
1866 if (index < static_cast<int>(page_action_->icon_paths()->size())) 1816 page_action_->CacheIcon(page_action_->default_icon_path(), image);
1867 pixbufs_[page_action_->icon_paths()->at(index)] = pixbuf;
1868 else
1869 pixbufs_[page_action_->default_icon_path()] = pixbuf;
1870 }
1871 1817
1872 // If we have no owner, that means this class is still being constructed. 1818 // If we have no owner, that means this class is still being constructed.
1873 TabContents* tab_contents = owner_ ? owner_->GetTabContents() : NULL; 1819 TabContents* tab_contents = owner_ ? owner_->GetTabContents() : NULL;
1874 if (tab_contents) 1820 if (tab_contents)
1875 UpdateVisibility(tab_contents->web_contents(), current_url_); 1821 UpdateVisibility(tab_contents->web_contents(), current_url_);
1876 } 1822 }
1877 1823
1878 void LocationBarViewGtk::PageActionViewGtk::TestActivatePageAction() { 1824 void LocationBarViewGtk::PageActionViewGtk::TestActivatePageAction() {
1879 GdkEventButton event = {}; 1825 GdkEventButton event = {};
1880 event.button = 1; 1826 event.button = 1;
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
2050 } 1996 }
2051 1997
2052 void LocationBarViewGtk::PageActionViewGtk::InspectPopup( 1998 void LocationBarViewGtk::PageActionViewGtk::InspectPopup(
2053 ExtensionAction* action) { 1999 ExtensionAction* action) {
2054 ExtensionPopupGtk::Show( 2000 ExtensionPopupGtk::Show(
2055 action->GetPopupUrl(current_tab_id_), 2001 action->GetPopupUrl(current_tab_id_),
2056 owner_->browser_, 2002 owner_->browser_,
2057 event_box_.get(), 2003 event_box_.get(),
2058 ExtensionPopupGtk::SHOW_AND_INSPECT); 2004 ExtensionPopupGtk::SHOW_AND_INSPECT);
2059 } 2005 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698