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

Side by Side Diff: chrome/browser/views/browser_actions_container.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/views/browser_actions_container.h" 5 #include "chrome/browser/views/browser_actions_container.h"
6 6
7 #include "app/l10n_util.h" 7 #include "app/l10n_util.h"
8 #include "app/resource_bundle.h" 8 #include "app/resource_bundle.h"
9 #include "app/slide_animation.h" 9 #include "app/slide_animation.h"
10 #include "base/stl_util-inl.h" 10 #include "base/stl_util-inl.h"
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 bool BrowserActionsContainer::disable_animations_during_testing_ = false; 91 bool BrowserActionsContainer::disable_animations_during_testing_ = false;
92 92
93 //////////////////////////////////////////////////////////////////////////////// 93 ////////////////////////////////////////////////////////////////////////////////
94 // BrowserActionButton 94 // BrowserActionButton
95 95
96 BrowserActionButton::BrowserActionButton(Extension* extension, 96 BrowserActionButton::BrowserActionButton(Extension* extension,
97 BrowserActionsContainer* panel) 97 BrowserActionsContainer* panel)
98 : ALLOW_THIS_IN_INITIALIZER_LIST(MenuButton(this, L"", NULL, false)), 98 : ALLOW_THIS_IN_INITIALIZER_LIST(MenuButton(this, L"", NULL, false)),
99 browser_action_(extension->browser_action()), 99 browser_action_(extension->browser_action()),
100 extension_(extension), 100 extension_(extension),
101 tracker_(NULL), 101 ALLOW_THIS_IN_INITIALIZER_LIST(tracker_(this)),
102 showing_context_menu_(false), 102 showing_context_menu_(false),
103 panel_(panel) { 103 panel_(panel) {
104 set_alignment(TextButton::ALIGN_CENTER); 104 set_alignment(TextButton::ALIGN_CENTER);
105 105
106 // No UpdateState() here because View hierarchy not setup yet. Our parent 106 // No UpdateState() here because View hierarchy not setup yet. Our parent
107 // should call UpdateState() after creation. 107 // should call UpdateState() after creation.
108 108
109 registrar_.Add(this, NotificationType::EXTENSION_BROWSER_ACTION_UPDATED, 109 registrar_.Add(this, NotificationType::EXTENSION_BROWSER_ACTION_UPDATED,
110 Source<ExtensionAction>(browser_action_)); 110 Source<ExtensionAction>(browser_action_));
111 111
112 // The Browser Action API does not allow the default icon path to be changed 112 // The Browser Action API does not allow the default icon path to be changed
113 // at runtime, so we can load this now and cache it. 113 // at runtime, so we can load this now and cache it.
114 std::string relative_path = browser_action_->default_icon_path(); 114 std::string relative_path = browser_action_->default_icon_path();
115 if (relative_path.empty()) 115 if (relative_path.empty())
116 return; 116 return;
117 117
118 // This is a bit sketchy because if ImageLoadingTracker calls 118 // This is a bit sketchy because if ImageLoadingTracker calls
119 // ::OnImageLoaded() before our creator appends up to the view hierarchy, we 119 // ::OnImageLoaded() before our creator appends up to the view hierarchy, we
120 // will crash. But since we know that ImageLoadingTracker is asynchronous, 120 // will crash. But since we know that ImageLoadingTracker is asynchronous,
121 // this should be OK. And doing this in the constructor means that we don't 121 // this should be OK. And doing this in the constructor means that we don't
122 // have to protect against it getting done multiple times. 122 // have to protect against it getting done multiple times.
123 tracker_ = new ImageLoadingTracker(this, 1); 123 tracker_.PostLoadImageTask(
124 tracker_->PostLoadImageTask(
125 extension->GetResource(relative_path), 124 extension->GetResource(relative_path),
126 gfx::Size(Extension::kBrowserActionIconMaxSize, 125 gfx::Size(Extension::kBrowserActionIconMaxSize,
127 Extension::kBrowserActionIconMaxSize)); 126 Extension::kBrowserActionIconMaxSize),
127 0); // |index| == 0, since we only ever load one image.
128 } 128 }
129 129
130 BrowserActionButton::~BrowserActionButton() { 130 BrowserActionButton::~BrowserActionButton() {
131 if (tracker_)
132 tracker_->StopTrackingImageLoad();
133 } 131 }
134 132
135 gfx::Insets BrowserActionButton::GetInsets() const { 133 gfx::Insets BrowserActionButton::GetInsets() const {
136 static gfx::Insets zero_inset; 134 static gfx::Insets zero_inset;
137 return zero_inset; 135 return zero_inset;
138 } 136 }
139 137
140 void BrowserActionButton::ButtonPressed(views::Button* sender, 138 void BrowserActionButton::ButtonPressed(views::Button* sender,
141 const views::Event& event) { 139 const views::Event& event) {
142 panel_->OnBrowserActionExecuted(this, false); // inspect_with_devtools 140 panel_->OnBrowserActionExecuted(this, false); // inspect_with_devtools
143 } 141 }
144 142
145 void BrowserActionButton::OnImageLoaded(SkBitmap* image, size_t index) { 143 void BrowserActionButton::OnImageLoaded(SkBitmap* image, int index) {
146 if (image) 144 if (image)
147 default_icon_ = *image; 145 default_icon_ = *image;
148 146
149 tracker_ = NULL; // The tracker object will delete itself when we return.
150
151 // Call back to UpdateState() because a more specific icon might have been set 147 // Call back to UpdateState() because a more specific icon might have been set
152 // while the load was outstanding. 148 // while the load was outstanding.
153 UpdateState(); 149 UpdateState();
154 } 150 }
155 151
156 void BrowserActionButton::UpdateState() { 152 void BrowserActionButton::UpdateState() {
157 int tab_id = panel_->GetCurrentTabId(); 153 int tab_id = panel_->GetCurrentTabId();
158 if (tab_id < 0) 154 if (tab_id < 0)
159 return; 155 return;
160 156
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 if (tab_id < 0) { 196 if (tab_id < 0) {
201 NOTREACHED() << "Button is not on a specific tab."; 197 NOTREACHED() << "Button is not on a specific tab.";
202 GURL empty_url; 198 GURL empty_url;
203 return empty_url; 199 return empty_url;
204 } 200 }
205 return browser_action_->GetPopupUrl(tab_id); 201 return browser_action_->GetPopupUrl(tab_id);
206 } 202 }
207 203
208 bool BrowserActionButton::Activate() { 204 bool BrowserActionButton::Activate() {
209 if (IsPopup()) { 205 if (IsPopup()) {
210 panel_->OnBrowserActionExecuted(this, false); // inspect_with_devtools 206 panel_->OnBrowserActionExecuted(this, false); // |inspect_with_devtools|.
211 207
212 // TODO(erikkay): Run a nested modal loop while the mouse is down to 208 // TODO(erikkay): Run a nested modal loop while the mouse is down to
213 // enable menu-like drag-select behavior. 209 // enable menu-like drag-select behavior.
214 210
215 // The return value of this method is returned via OnMousePressed. 211 // The return value of this method is returned via OnMousePressed.
216 // We need to return false here since we're handing off focus to another 212 // We need to return false here since we're handing off focus to another
217 // widget/view, and true will grab it right back and try to send events 213 // widget/view, and true will grab it right back and try to send events
218 // to us. 214 // to us.
219 return false; 215 return false;
220 } 216 }
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 owner_view_->SchedulePaint(); 500 owner_view_->SchedulePaint();
505 } 501 }
506 502
507 void BrowserActionsContainer::HidePopup() { 503 void BrowserActionsContainer::HidePopup() {
508 if (popup_) 504 if (popup_)
509 popup_->Close(); 505 popup_->Close();
510 } 506 }
511 507
512 void BrowserActionsContainer::TestExecuteBrowserAction(int index) { 508 void BrowserActionsContainer::TestExecuteBrowserAction(int index) {
513 BrowserActionButton* button = browser_action_views_[index]->button(); 509 BrowserActionButton* button = browser_action_views_[index]->button();
514 OnBrowserActionExecuted(button, false); // inspect_with_devtools 510 OnBrowserActionExecuted(button, false); // |inspect_with_devtools|.
515 } 511 }
516 512
517 void BrowserActionsContainer::TestSetIconVisibilityCount(size_t icons) { 513 void BrowserActionsContainer::TestSetIconVisibilityCount(size_t icons) {
518 chevron_->SetVisible(icons < browser_action_views_.size()); 514 chevron_->SetVisible(icons < browser_action_views_.size());
519 container_size_.set_width(IconCountToWidth(icons)); 515 container_size_.set_width(IconCountToWidth(icons));
520 Layout(); 516 Layout();
521 SchedulePaint(); 517 SchedulePaint();
522 } 518 }
523 519
524 void BrowserActionsContainer::OnBrowserActionExecuted( 520 void BrowserActionsContainer::OnBrowserActionExecuted(
(...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after
1107 1103
1108 void BrowserActionsContainer::NotifyMenuDeleted( 1104 void BrowserActionsContainer::NotifyMenuDeleted(
1109 BrowserActionOverflowMenuController* controller) { 1105 BrowserActionOverflowMenuController* controller) {
1110 DCHECK(controller == overflow_menu_); 1106 DCHECK(controller == overflow_menu_);
1111 overflow_menu_ = NULL; 1107 overflow_menu_ = NULL;
1112 } 1108 }
1113 1109
1114 void BrowserActionsContainer::InspectPopup( 1110 void BrowserActionsContainer::InspectPopup(
1115 ExtensionAction* action) { 1111 ExtensionAction* action) {
1116 OnBrowserActionExecuted(GetBrowserActionView(action)->button(), 1112 OnBrowserActionExecuted(GetBrowserActionView(action)->button(),
1117 true); // inspect_with_devtools 1113 true); // |inspect_with_devtools|.
1118 } 1114 }
1119 1115
1120 void BrowserActionsContainer::ExtensionPopupClosed(ExtensionPopup* popup) { 1116 void BrowserActionsContainer::ExtensionPopupClosed(ExtensionPopup* popup) {
1121 // ExtensionPopup is ref-counted, so we don't need to delete it. 1117 // ExtensionPopup is ref-counted, so we don't need to delete it.
1122 DCHECK_EQ(popup_, popup); 1118 DCHECK_EQ(popup_, popup);
1123 popup_ = NULL; 1119 popup_ = NULL;
1124 popup_button_->SetButtonNotPushed(); 1120 popup_button_->SetButtonNotPushed();
1125 popup_button_ = NULL; 1121 popup_button_ = NULL;
1126 } 1122 }
1127 1123
1128 bool BrowserActionsContainer::ShouldDisplayBrowserAction(Extension* extension) { 1124 bool BrowserActionsContainer::ShouldDisplayBrowserAction(Extension* extension) {
1129 // Only display incognito-enabled extensions while in incognito mode. 1125 // Only display incognito-enabled extensions while in incognito mode.
1130 return (!profile_->IsOffTheRecord() || 1126 return (!profile_->IsOffTheRecord() ||
1131 profile_->GetExtensionsService()->IsIncognitoEnabled(extension)); 1127 profile_->GetExtensionsService()->IsIncognitoEnabled(extension));
1132 } 1128 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698