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

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

Issue 1075006: Eliminate all UI thread decoding of extension images.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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/gtk/location_bar_view_gtk.h" 5 #include "chrome/browser/gtk/location_bar_view_gtk.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "app/l10n_util.h" 9 #include "app/l10n_util.h"
10 #include "app/resource_bundle.h" 10 #include "app/resource_bundle.h"
(...skipping 1039 matching lines...) Expand 10 before | Expand all | Expand 10 after
1050 //////////////////////////////////////////////////////////////////////////////// 1050 ////////////////////////////////////////////////////////////////////////////////
1051 // LocationBarViewGtk::PageActionViewGtk 1051 // LocationBarViewGtk::PageActionViewGtk
1052 1052
1053 LocationBarViewGtk::PageActionViewGtk::PageActionViewGtk( 1053 LocationBarViewGtk::PageActionViewGtk::PageActionViewGtk(
1054 LocationBarViewGtk* owner, Profile* profile, 1054 LocationBarViewGtk* owner, Profile* profile,
1055 ExtensionAction* page_action) 1055 ExtensionAction* page_action)
1056 : owner_(owner), 1056 : owner_(owner),
1057 profile_(profile), 1057 profile_(profile),
1058 page_action_(page_action), 1058 page_action_(page_action),
1059 last_icon_pixbuf_(NULL), 1059 last_icon_pixbuf_(NULL),
1060 tracker_(this),
1060 preview_enabled_(false) { 1061 preview_enabled_(false) {
1061 event_box_.Own(gtk_event_box_new()); 1062 event_box_.Own(gtk_event_box_new());
1062 gtk_widget_set_size_request(event_box_.get(), 1063 gtk_widget_set_size_request(event_box_.get(),
1063 Extension::kPageActionIconMaxSize, 1064 Extension::kPageActionIconMaxSize,
1064 Extension::kPageActionIconMaxSize); 1065 Extension::kPageActionIconMaxSize);
1065 1066
1066 // Make the event box not visible so it does not paint a background. 1067 // Make the event box not visible so it does not paint a background.
1067 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box_.get()), FALSE); 1068 gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box_.get()), FALSE);
1068 g_signal_connect(event_box_.get(), "button-press-event", 1069 g_signal_connect(event_box_.get(), "button-press-event",
1069 G_CALLBACK(&OnButtonPressedThunk), this); 1070 G_CALLBACK(&OnButtonPressedThunk), this);
1070 g_signal_connect_after(event_box_.get(), "expose-event", 1071 g_signal_connect_after(event_box_.get(), "expose-event",
1071 G_CALLBACK(OnExposeEventThunk), this); 1072 G_CALLBACK(OnExposeEventThunk), this);
1072 1073
1073 image_.Own(gtk_image_new()); 1074 image_.Own(gtk_image_new());
1074 gtk_container_add(GTK_CONTAINER(event_box_.get()), image_.get()); 1075 gtk_container_add(GTK_CONTAINER(event_box_.get()), image_.get());
1075 1076
1076 Extension* extension = profile->GetExtensionsService()->GetExtensionById( 1077 Extension* extension = profile->GetExtensionsService()->GetExtensionById(
1077 page_action->extension_id(), false); 1078 page_action->extension_id(), false);
1078 DCHECK(extension); 1079 DCHECK(extension);
1079 1080
1080 // Load all the icons declared in the manifest. This is the contents of the 1081 // Load all the icons declared in the manifest. This is the contents of the
1081 // icons array, plus the default_icon property, if any. 1082 // icons array, plus the default_icon property, if any.
1082 std::vector<std::string> icon_paths(*page_action->icon_paths()); 1083 std::vector<std::string> icon_paths(*page_action->icon_paths());
1083 if (!page_action_->default_icon_path().empty()) 1084 if (!page_action_->default_icon_path().empty())
1084 icon_paths.push_back(page_action_->default_icon_path()); 1085 icon_paths.push_back(page_action_->default_icon_path());
1085 1086
1086 tracker_ = new ImageLoadingTracker(this, icon_paths.size());
1087 for (std::vector<std::string>::iterator iter = icon_paths.begin(); 1087 for (std::vector<std::string>::iterator iter = icon_paths.begin();
1088 iter != icon_paths.end(); ++iter) { 1088 iter != icon_paths.end(); ++iter) {
1089 tracker_->PostLoadImageTask( 1089 tracker_.LoadImage(extension->GetResource(*iter),
1090 extension->GetResource(*iter), 1090 gfx::Size(Extension::kPageActionIconMaxSize,
1091 gfx::Size(Extension::kPageActionIconMaxSize, 1091 Extension::kPageActionIconMaxSize));
1092 Extension::kPageActionIconMaxSize));
1093 } 1092 }
1094 } 1093 }
1095 1094
1096 LocationBarViewGtk::PageActionViewGtk::~PageActionViewGtk() { 1095 LocationBarViewGtk::PageActionViewGtk::~PageActionViewGtk() {
1097 if (tracker_)
1098 tracker_->StopTrackingImageLoad();
1099 image_.Destroy(); 1096 image_.Destroy();
1100 event_box_.Destroy(); 1097 event_box_.Destroy();
1101 for (PixbufMap::iterator iter = pixbufs_.begin(); iter != pixbufs_.end(); 1098 for (PixbufMap::iterator iter = pixbufs_.begin(); iter != pixbufs_.end();
1102 ++iter) { 1099 ++iter) {
1103 g_object_unref(iter->second); 1100 g_object_unref(iter->second);
1104 } 1101 }
1105 if (last_icon_pixbuf_) 1102 if (last_icon_pixbuf_)
1106 g_object_unref(last_icon_pixbuf_); 1103 g_object_unref(last_icon_pixbuf_);
1107 } 1104 }
1108 1105
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1171 gtk_widget_hide_all(event_box_.get()); 1168 gtk_widget_hide_all(event_box_.get());
1172 1169
1173 if (visible != old_visible) { 1170 if (visible != old_visible) {
1174 NotificationService::current()->Notify( 1171 NotificationService::current()->Notify(
1175 NotificationType::EXTENSION_PAGE_ACTION_VISIBILITY_CHANGED, 1172 NotificationType::EXTENSION_PAGE_ACTION_VISIBILITY_CHANGED,
1176 Source<ExtensionAction>(page_action_), 1173 Source<ExtensionAction>(page_action_),
1177 Details<TabContents>(contents)); 1174 Details<TabContents>(contents));
1178 } 1175 }
1179 } 1176 }
1180 1177
1181 void LocationBarViewGtk::PageActionViewGtk::OnImageLoaded(SkBitmap* image, 1178 void LocationBarViewGtk::PageActionViewGtk::OnImageLoaded(
1182 size_t index) { 1179 SkBitmap* image, ExtensionResource resource, int index) {
1183 // We loaded icons()->size() icons, plus one extra if the page action had 1180 // We loaded icons()->size() icons, plus one extra if the page action had
1184 // a default icon. 1181 // a default icon.
1185 size_t total_icons = page_action_->icon_paths()->size(); 1182 int total_icons = static_cast<int>(page_action_->icon_paths()->size());
1186 if (!page_action_->default_icon_path().empty()) 1183 if (!page_action_->default_icon_path().empty())
1187 total_icons++; 1184 total_icons++;
1188 DCHECK(index < total_icons); 1185 DCHECK(index < total_icons);
1189 1186
1190 // Map the index of the loaded image back to its name. If we ever get an 1187 // Map the index of the loaded image back to its name. If we ever get an
1191 // index greater than the number of icons, it must be the default icon. 1188 // index greater than the number of icons, it must be the default icon.
1192 if (image) { 1189 if (image) {
1193 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(image); 1190 GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(image);
1194 if (index < page_action_->icon_paths()->size()) 1191 if (index < static_cast<int>(page_action_->icon_paths()->size()))
1195 pixbufs_[page_action_->icon_paths()->at(index)] = pixbuf; 1192 pixbufs_[page_action_->icon_paths()->at(index)] = pixbuf;
1196 else 1193 else
1197 pixbufs_[page_action_->default_icon_path()] = pixbuf; 1194 pixbufs_[page_action_->default_icon_path()] = pixbuf;
1198 } 1195 }
1199 1196
1200 // If we are done, release the tracker.
1201 if (index == (total_icons - 1))
1202 tracker_ = NULL;
1203
1204 owner_->UpdatePageActions(); 1197 owner_->UpdatePageActions();
1205 } 1198 }
1206 1199
1207 void LocationBarViewGtk::PageActionViewGtk::TestActivatePageAction() { 1200 void LocationBarViewGtk::PageActionViewGtk::TestActivatePageAction() {
1208 GdkEvent event; 1201 GdkEvent event;
1209 event.button.button = 1; 1202 event.button.button = 1;
1210 OnButtonPressed(widget(), &event); 1203 OnButtonPressed(widget(), &event);
1211 } 1204 }
1212 1205
1213 void LocationBarViewGtk::PageActionViewGtk::InspectPopup( 1206 void LocationBarViewGtk::PageActionViewGtk::InspectPopup(
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1261 1254
1262 std::string badge_text = page_action_->GetBadgeText(tab_id); 1255 std::string badge_text = page_action_->GetBadgeText(tab_id);
1263 if (badge_text.empty()) 1256 if (badge_text.empty())
1264 return FALSE; 1257 return FALSE;
1265 1258
1266 gfx::CanvasPaint canvas(event, false); 1259 gfx::CanvasPaint canvas(event, false);
1267 gfx::Rect bounding_rect(widget->allocation); 1260 gfx::Rect bounding_rect(widget->allocation);
1268 page_action_->PaintBadge(&canvas, bounding_rect, tab_id); 1261 page_action_->PaintBadge(&canvas, bounding_rect, tab_id);
1269 return FALSE; 1262 return FALSE;
1270 } 1263 }
OLDNEW
« no previous file with comments | « chrome/browser/gtk/location_bar_view_gtk.h ('k') | chrome/browser/views/browser_actions_container.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698