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

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_.LoadImage(extension->GetResource(relative_path),
124 tracker_->PostLoadImageTask( 124 gfx::Size(Extension::kBrowserActionIconMaxSize,
125 extension->GetResource(relative_path), 125 Extension::kBrowserActionIconMaxSize));
126 gfx::Size(Extension::kBrowserActionIconMaxSize,
127 Extension::kBrowserActionIconMaxSize));
128 } 126 }
129 127
130 BrowserActionButton::~BrowserActionButton() { 128 BrowserActionButton::~BrowserActionButton() {
131 if (tracker_)
132 tracker_->StopTrackingImageLoad();
133 } 129 }
134 130
135 gfx::Insets BrowserActionButton::GetInsets() const { 131 gfx::Insets BrowserActionButton::GetInsets() const {
136 static gfx::Insets zero_inset; 132 static gfx::Insets zero_inset;
137 return zero_inset; 133 return zero_inset;
138 } 134 }
139 135
140 void BrowserActionButton::ButtonPressed(views::Button* sender, 136 void BrowserActionButton::ButtonPressed(views::Button* sender,
141 const views::Event& event) { 137 const views::Event& event) {
142 panel_->OnBrowserActionExecuted(this, false); // inspect_with_devtools 138 panel_->OnBrowserActionExecuted(this, false); // inspect_with_devtools
143 } 139 }
144 140
145 void BrowserActionButton::OnImageLoaded(SkBitmap* image, size_t index) { 141 void BrowserActionButton::OnImageLoaded(
142 SkBitmap* image, ExtensionResource resource, int index) {
146 if (image) 143 if (image)
147 default_icon_ = *image; 144 default_icon_ = *image;
148 145
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 146 // Call back to UpdateState() because a more specific icon might have been set
152 // while the load was outstanding. 147 // while the load was outstanding.
153 UpdateState(); 148 UpdateState();
154 } 149 }
155 150
156 void BrowserActionButton::UpdateState() { 151 void BrowserActionButton::UpdateState() {
157 int tab_id = panel_->GetCurrentTabId(); 152 int tab_id = panel_->GetCurrentTabId();
158 if (tab_id < 0) 153 if (tab_id < 0)
159 return; 154 return;
160 155
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 if (tab_id < 0) { 195 if (tab_id < 0) {
201 NOTREACHED() << "Button is not on a specific tab."; 196 NOTREACHED() << "Button is not on a specific tab.";
202 GURL empty_url; 197 GURL empty_url;
203 return empty_url; 198 return empty_url;
204 } 199 }
205 return browser_action_->GetPopupUrl(tab_id); 200 return browser_action_->GetPopupUrl(tab_id);
206 } 201 }
207 202
208 bool BrowserActionButton::Activate() { 203 bool BrowserActionButton::Activate() {
209 if (IsPopup()) { 204 if (IsPopup()) {
210 panel_->OnBrowserActionExecuted(this, false); // inspect_with_devtools 205 panel_->OnBrowserActionExecuted(this, false); // |inspect_with_devtools|.
211 206
212 // TODO(erikkay): Run a nested modal loop while the mouse is down to 207 // TODO(erikkay): Run a nested modal loop while the mouse is down to
213 // enable menu-like drag-select behavior. 208 // enable menu-like drag-select behavior.
214 209
215 // The return value of this method is returned via OnMousePressed. 210 // 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 211 // 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 212 // widget/view, and true will grab it right back and try to send events
218 // to us. 213 // to us.
219 return false; 214 return false;
220 } 215 }
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 owner_view_->SchedulePaint(); 499 owner_view_->SchedulePaint();
505 } 500 }
506 501
507 void BrowserActionsContainer::HidePopup() { 502 void BrowserActionsContainer::HidePopup() {
508 if (popup_) 503 if (popup_)
509 popup_->Close(); 504 popup_->Close();
510 } 505 }
511 506
512 void BrowserActionsContainer::TestExecuteBrowserAction(int index) { 507 void BrowserActionsContainer::TestExecuteBrowserAction(int index) {
513 BrowserActionButton* button = browser_action_views_[index]->button(); 508 BrowserActionButton* button = browser_action_views_[index]->button();
514 OnBrowserActionExecuted(button, false); // inspect_with_devtools 509 OnBrowserActionExecuted(button, false); // |inspect_with_devtools|.
515 } 510 }
516 511
517 void BrowserActionsContainer::TestSetIconVisibilityCount(size_t icons) { 512 void BrowserActionsContainer::TestSetIconVisibilityCount(size_t icons) {
518 chevron_->SetVisible(icons < browser_action_views_.size()); 513 chevron_->SetVisible(icons < browser_action_views_.size());
519 container_size_.set_width(IconCountToWidth(icons)); 514 container_size_.set_width(IconCountToWidth(icons));
520 Layout(); 515 Layout();
521 SchedulePaint(); 516 SchedulePaint();
522 } 517 }
523 518
524 void BrowserActionsContainer::OnBrowserActionExecuted( 519 void BrowserActionsContainer::OnBrowserActionExecuted(
(...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after
1107 1102
1108 void BrowserActionsContainer::NotifyMenuDeleted( 1103 void BrowserActionsContainer::NotifyMenuDeleted(
1109 BrowserActionOverflowMenuController* controller) { 1104 BrowserActionOverflowMenuController* controller) {
1110 DCHECK(controller == overflow_menu_); 1105 DCHECK(controller == overflow_menu_);
1111 overflow_menu_ = NULL; 1106 overflow_menu_ = NULL;
1112 } 1107 }
1113 1108
1114 void BrowserActionsContainer::InspectPopup( 1109 void BrowserActionsContainer::InspectPopup(
1115 ExtensionAction* action) { 1110 ExtensionAction* action) {
1116 OnBrowserActionExecuted(GetBrowserActionView(action)->button(), 1111 OnBrowserActionExecuted(GetBrowserActionView(action)->button(),
1117 true); // inspect_with_devtools 1112 true); // |inspect_with_devtools|.
1118 } 1113 }
1119 1114
1120 void BrowserActionsContainer::ExtensionPopupClosed(ExtensionPopup* popup) { 1115 void BrowserActionsContainer::ExtensionPopupClosed(ExtensionPopup* popup) {
1121 // ExtensionPopup is ref-counted, so we don't need to delete it. 1116 // ExtensionPopup is ref-counted, so we don't need to delete it.
1122 DCHECK_EQ(popup_, popup); 1117 DCHECK_EQ(popup_, popup);
1123 popup_ = NULL; 1118 popup_ = NULL;
1124 popup_button_->SetButtonNotPushed(); 1119 popup_button_->SetButtonNotPushed();
1125 popup_button_ = NULL; 1120 popup_button_ = NULL;
1126 } 1121 }
1127 1122
1128 bool BrowserActionsContainer::ShouldDisplayBrowserAction(Extension* extension) { 1123 bool BrowserActionsContainer::ShouldDisplayBrowserAction(Extension* extension) {
1129 // Only display incognito-enabled extensions while in incognito mode. 1124 // Only display incognito-enabled extensions while in incognito mode.
1130 return (!profile_->IsOffTheRecord() || 1125 return (!profile_->IsOffTheRecord() ||
1131 profile_->GetExtensionsService()->IsIncognitoEnabled(extension)); 1126 profile_->GetExtensionsService()->IsIncognitoEnabled(extension));
1132 } 1127 }
OLDNEW
« no previous file with comments | « chrome/browser/views/browser_actions_container.h ('k') | chrome/browser/views/infobars/extension_infobar.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698