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

Side by Side Diff: chrome/browser/extensions/extension_install_ui.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) 2009 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/extensions/extension_install_ui.h" 5 #include "chrome/browser/extensions/extension_install_ui.h"
6 6
7 #include <map> 7 #include <map>
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"
11 #include "base/file_util.h" 11 #include "base/file_util.h"
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 DCHECK(hosts.size() == 0); 120 DCHECK(hosts.size() == 0);
121 if (extension->api_permissions().empty()) 121 if (extension->api_permissions().empty())
122 return L""; 122 return L"";
123 else 123 else
124 return l10n_util::GetString(IDS_EXTENSION_PROMPT_WARNING_NEW_BROWSER); 124 return l10n_util::GetString(IDS_EXTENSION_PROMPT_WARNING_NEW_BROWSER);
125 } 125 }
126 126
127 } // namespace 127 } // namespace
128 128
129 ExtensionInstallUI::ExtensionInstallUI(Profile* profile) 129 ExtensionInstallUI::ExtensionInstallUI(Profile* profile)
130 : profile_(profile), ui_loop_(MessageLoop::current()) 130 : profile_(profile),
131 ui_loop_(MessageLoop::current()),
132 extension_(NULL),
133 delegate_(NULL),
134 prompt_type_(NUM_PROMPT_TYPES),
135 ALLOW_THIS_IN_INITIALIZER_LIST(tracker_(this))
131 #if defined(TOOLKIT_GTK) 136 #if defined(TOOLKIT_GTK)
132 ,previous_use_gtk_theme_(false) 137 , previous_use_gtk_theme_(false)
133 #endif 138 #endif
134 {} 139 {}
135 140
136 void ExtensionInstallUI::ConfirmInstall(Delegate* delegate, 141 void ExtensionInstallUI::ConfirmInstall(Delegate* delegate,
137 Extension* extension, 142 Extension* extension) {
138 SkBitmap* install_icon) {
139 DCHECK(ui_loop_ == MessageLoop::current()); 143 DCHECK(ui_loop_ == MessageLoop::current());
144 extension_ = extension;
145 delegate_ = delegate;
140 146
141 // We special-case themes to not show any confirm UI. Instead they are 147 // We special-case themes to not show any confirm UI. Instead they are
142 // immediately installed, and then we show an infobar (see OnInstallSuccess) 148 // immediately installed, and then we show an infobar (see OnInstallSuccess)
143 // to allow the user to revert if they don't like it. 149 // to allow the user to revert if they don't like it.
144 if (extension->IsTheme()) { 150 if (extension->IsTheme()) {
145 // Remember the current theme in case the user pressed undo. 151 // Remember the current theme in case the user pressed undo.
146 Extension* previous_theme = profile_->GetTheme(); 152 Extension* previous_theme = profile_->GetTheme();
147 if (previous_theme) 153 if (previous_theme)
148 previous_theme_id_ = previous_theme->id(); 154 previous_theme_id_ = previous_theme->id();
149 155
150 #if defined(TOOLKIT_GTK) 156 #if defined(TOOLKIT_GTK)
151 // On linux, we also need to take the user's system settings into account 157 // On Linux, we also need to take the user's system settings into account
152 // to undo theme installation. 158 // to undo theme installation.
153 previous_use_gtk_theme_ = 159 previous_use_gtk_theme_ =
154 GtkThemeProvider::GetFrom(profile_)->UseGtkTheme(); 160 GtkThemeProvider::GetFrom(profile_)->UseGtkTheme();
155 #endif 161 #endif
156 162
157 delegate->InstallUIProceed(false); 163 delegate->InstallUIProceed(false);
158 return; 164 return;
159 } 165 }
160 166
161 if (!install_icon) { 167 ShowConfirmation(INSTALL_PROMPT);
162 install_icon = ResourceBundle::GetSharedInstance().GetBitmapNamed(
163 IDR_EXTENSION_DEFAULT_ICON);
164 }
165 icon_ = *install_icon;
166
167 NotificationService* service = NotificationService::current();
168 service->Notify(NotificationType::EXTENSION_WILL_SHOW_CONFIRM_DIALOG,
169 Source<ExtensionInstallUI>(this),
170 NotificationService::NoDetails());
171
172 ShowExtensionInstallUIPromptImpl(
173 profile_, delegate, extension, &icon_,
174 WideToUTF16Hack(GetInstallWarning(extension)), INSTALL_PROMPT);
175 } 168 }
176 169
177 void ExtensionInstallUI::ConfirmUninstall(Delegate* delegate, 170 void ExtensionInstallUI::ConfirmUninstall(Delegate* delegate,
178 Extension* extension, 171 Extension* extension) {
179 SkBitmap* icon) {
180 DCHECK(ui_loop_ == MessageLoop::current()); 172 DCHECK(ui_loop_ == MessageLoop::current());
173 extension_ = extension;
174 delegate_ = delegate;
181 175
182 if (!icon) { 176 ShowConfirmation(UNINSTALL_PROMPT);
183 icon = ResourceBundle::GetSharedInstance().GetBitmapNamed(
184 IDR_EXTENSION_DEFAULT_ICON);
185 }
186
187 string16 message =
188 l10n_util::GetStringUTF16(IDS_EXTENSION_UNINSTALL_CONFIRMATION);
189 ShowExtensionInstallUIPromptImpl(profile_, delegate, extension, icon,
190 message, UNINSTALL_PROMPT);
191 } 177 }
192 178
193 void ExtensionInstallUI::ConfirmEnableIncognito(Delegate* delegate, 179 void ExtensionInstallUI::ConfirmEnableIncognito(Delegate* delegate,
194 Extension* extension, 180 Extension* extension) {
195 SkBitmap* icon) {
196 DCHECK(ui_loop_ == MessageLoop::current()); 181 DCHECK(ui_loop_ == MessageLoop::current());
182 extension_ = extension;
183 delegate_ = delegate;
197 184
198 if (!icon) { 185 ShowConfirmation(ENABLE_INCOGNITO_PROMPT);
199 icon = ResourceBundle::GetSharedInstance().GetBitmapNamed(
200 IDR_EXTENSION_DEFAULT_ICON);
201 }
202
203 string16 message =
204 l10n_util::GetStringFUTF16(IDS_EXTENSION_PROMPT_WARNING_INCOGNITO,
205 l10n_util::GetStringUTF16(IDS_PRODUCT_NAME));
206 ShowExtensionInstallUIPromptImpl(profile_, delegate, extension, icon,
207 message, ENABLE_INCOGNITO_PROMPT);
208 } 186 }
209 187
210 void ExtensionInstallUI::OnInstallSuccess(Extension* extension) { 188 void ExtensionInstallUI::OnInstallSuccess(Extension* extension) {
211 if (extension->IsTheme()) { 189 if (extension->IsTheme()) {
212 ShowThemeInfoBar(extension); 190 ShowThemeInfoBar(extension);
213 return; 191 return;
214 } 192 }
215 193
216 // GetLastActiveWithProfile will fail on the build bots. This needs to 194 // GetLastActiveWithProfile will fail on the build bots. This needs to be
217 // implemented differently if any test is created which depends on 195 // implemented differently if any test is created which depends on
218 // ExtensionInstalledBubble showing. 196 // ExtensionInstalledBubble showing.
219 #if defined(TOOLKIT_VIEWS) 197 #if defined(TOOLKIT_VIEWS)
220 Browser* browser = BrowserList::GetLastActiveWithProfile(profile_); 198 Browser* browser = BrowserList::GetLastActiveWithProfile(profile_);
221 if (!browser) 199 if (!browser)
222 return; 200 return;
223 201
224 ExtensionInstalledBubble::Show(extension, browser, icon_); 202 ExtensionInstalledBubble::Show(extension, browser, icon_);
225 #elif defined(OS_MACOSX) 203 #elif defined(OS_MACOSX)
226 if (extension->browser_action() || 204 if (extension->browser_action() ||
(...skipping 24 matching lines...) Expand all
251 platform_util::SimpleErrorBox( 229 platform_util::SimpleErrorBox(
252 browser ? browser->window()->GetNativeHandle() : NULL, 230 browser ? browser->window()->GetNativeHandle() : NULL,
253 l10n_util::GetStringUTF16(IDS_EXTENSION_INSTALL_FAILURE_TITLE), 231 l10n_util::GetStringUTF16(IDS_EXTENSION_INSTALL_FAILURE_TITLE),
254 UTF8ToUTF16(error)); 232 UTF8ToUTF16(error));
255 } 233 }
256 234
257 void ExtensionInstallUI::OnOverinstallAttempted(Extension* extension) { 235 void ExtensionInstallUI::OnOverinstallAttempted(Extension* extension) {
258 ShowThemeInfoBar(extension); 236 ShowThemeInfoBar(extension);
259 } 237 }
260 238
239 void ExtensionInstallUI::OnImageLoaded(
240 SkBitmap* image, ExtensionResource resource, int index) {
241 if (image)
242 icon_ = *image;
243 else
244 icon_ = SkBitmap();
245 if (icon_.empty()) {
246 icon_ = *ResourceBundle::GetSharedInstance().GetBitmapNamed(
247 IDR_EXTENSION_DEFAULT_ICON);
248 }
249
250 switch (prompt_type_) {
251 case INSTALL_PROMPT: {
252 NotificationService* service = NotificationService::current();
253 service->Notify(NotificationType::EXTENSION_WILL_SHOW_CONFIRM_DIALOG,
254 Source<ExtensionInstallUI>(this),
255 NotificationService::NoDetails());
256
257 ShowExtensionInstallUIPromptImpl(
258 profile_, delegate_, extension_, &icon_,
259 WideToUTF16Hack(GetInstallWarning(extension_)), INSTALL_PROMPT);
260 break;
261 }
262 case UNINSTALL_PROMPT: {
263 string16 message =
264 l10n_util::GetStringUTF16(IDS_EXTENSION_UNINSTALL_CONFIRMATION);
265 ShowExtensionInstallUIPromptImpl(profile_, delegate_, extension_, &icon_,
266 message, UNINSTALL_PROMPT);
267 break;
268 }
269 case ENABLE_INCOGNITO_PROMPT: {
270 string16 message =
271 l10n_util::GetStringFUTF16(IDS_EXTENSION_PROMPT_WARNING_INCOGNITO,
272 l10n_util::GetStringUTF16(IDS_PRODUCT_NAME));
273 ShowExtensionInstallUIPromptImpl(profile_, delegate_, extension_, &icon_,
274 message, ENABLE_INCOGNITO_PROMPT);
275 break;
276 }
277 default:
278 NOTREACHED() << "Unknown message";
279 break;
280 }
281 }
282
261 void ExtensionInstallUI::ShowThemeInfoBar(Extension* new_theme) { 283 void ExtensionInstallUI::ShowThemeInfoBar(Extension* new_theme) {
262 if (!new_theme->IsTheme()) 284 if (!new_theme->IsTheme())
263 return; 285 return;
264 286
265 Browser* browser = BrowserList::GetLastActiveWithProfile(profile_); 287 Browser* browser = BrowserList::GetLastActiveWithProfile(profile_);
266 if (!browser) 288 if (!browser)
267 return; 289 return;
268 290
269 TabContents* tab_contents = browser->GetSelectedTabContents(); 291 TabContents* tab_contents = browser->GetSelectedTabContents();
270 if (!tab_contents) 292 if (!tab_contents)
(...skipping 12 matching lines...) Expand all
283 // Then either replace that old one or add a new one. 305 // Then either replace that old one or add a new one.
284 InfoBarDelegate* new_delegate = GetNewInfoBarDelegate(new_theme, 306 InfoBarDelegate* new_delegate = GetNewInfoBarDelegate(new_theme,
285 tab_contents); 307 tab_contents);
286 308
287 if (old_delegate) 309 if (old_delegate)
288 tab_contents->ReplaceInfoBar(old_delegate, new_delegate); 310 tab_contents->ReplaceInfoBar(old_delegate, new_delegate);
289 else 311 else
290 tab_contents->AddInfoBar(new_delegate); 312 tab_contents->AddInfoBar(new_delegate);
291 } 313 }
292 314
315 void ExtensionInstallUI::ShowConfirmation(PromptType prompt_type) {
316 // Load the image asynchronously. For the response, check OnImageLoaded.
317 prompt_type_ = prompt_type;
318 ExtensionResource image =
319 extension_->GetIconPath(Extension::EXTENSION_ICON_LARGE);
320 tracker_.LoadImage(image,
321 gfx::Size(Extension::EXTENSION_ICON_LARGE,
322 Extension::EXTENSION_ICON_LARGE));
323 }
324
293 #if defined(OS_MACOSX) 325 #if defined(OS_MACOSX)
294 void ExtensionInstallUI::ShowGenericExtensionInstalledInfoBar( 326 void ExtensionInstallUI::ShowGenericExtensionInstalledInfoBar(
295 Extension* new_extension) { 327 Extension* new_extension) {
296 Browser* browser = BrowserList::GetLastActiveWithProfile(profile_); 328 Browser* browser = BrowserList::GetLastActiveWithProfile(profile_);
297 if (!browser) 329 if (!browser)
298 return; 330 return;
299 331
300 TabContents* tab_contents = browser->GetSelectedTabContents(); 332 TabContents* tab_contents = browser->GetSelectedTabContents();
301 if (!tab_contents) 333 if (!tab_contents)
302 return; 334 return;
(...skipping 10 matching lines...) Expand all
313 InfoBarDelegate* ExtensionInstallUI::GetNewInfoBarDelegate( 345 InfoBarDelegate* ExtensionInstallUI::GetNewInfoBarDelegate(
314 Extension* new_theme, TabContents* tab_contents) { 346 Extension* new_theme, TabContents* tab_contents) {
315 #if defined(TOOLKIT_GTK) 347 #if defined(TOOLKIT_GTK)
316 return new GtkThemeInstalledInfoBarDelegate(tab_contents, new_theme, 348 return new GtkThemeInstalledInfoBarDelegate(tab_contents, new_theme,
317 previous_theme_id_, previous_use_gtk_theme_); 349 previous_theme_id_, previous_use_gtk_theme_);
318 #else 350 #else
319 return new ThemeInstalledInfoBarDelegate(tab_contents, new_theme, 351 return new ThemeInstalledInfoBarDelegate(tab_contents, new_theme,
320 previous_theme_id_); 352 previous_theme_id_);
321 #endif 353 #endif
322 } 354 }
OLDNEW
« no previous file with comments | « chrome/browser/extensions/extension_install_ui.h ('k') | chrome/browser/extensions/extensions_ui.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698