| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "chrome/browser/extensions/extension_install_ui_default.h" | |
| 6 | |
| 7 #include "base/bind.h" | |
| 8 #include "base/command_line.h" | |
| 9 #include "base/utf_string_conversions.h" | |
| 10 #include "chrome/browser/api/infobars/confirm_infobar_delegate.h" | |
| 11 #include "chrome/browser/api/infobars/infobar_service.h" | |
| 12 #include "chrome/browser/extensions/app_launcher.h" | |
| 13 #include "chrome/browser/extensions/extension_install_prompt.h" | |
| 14 #include "chrome/browser/extensions/theme_installed_infobar_delegate.h" | |
| 15 #include "chrome/browser/profiles/profile.h" | |
| 16 #include "chrome/browser/themes/theme_service.h" | |
| 17 #include "chrome/browser/themes/theme_service_factory.h" | |
| 18 #include "chrome/browser/ui/app_list/app_list_util.h" | |
| 19 #include "chrome/browser/ui/browser.h" | |
| 20 #include "chrome/browser/ui/browser_dialogs.h" | |
| 21 #include "chrome/browser/ui/browser_finder.h" | |
| 22 #include "chrome/browser/ui/browser_navigator.h" | |
| 23 #include "chrome/browser/ui/browser_tabstrip.h" | |
| 24 #include "chrome/browser/ui/browser_window.h" | |
| 25 #include "chrome/browser/ui/host_desktop.h" | |
| 26 #include "chrome/browser/ui/simple_message_box.h" | |
| 27 #include "chrome/browser/ui/singleton_tabs.h" | |
| 28 #include "chrome/browser/ui/tabs/tab_strip_model.h" | |
| 29 #include "chrome/browser/ui/webui/ntp/new_tab_ui.h" | |
| 30 #include "chrome/common/chrome_notification_types.h" | |
| 31 #include "chrome/common/chrome_switches.h" | |
| 32 #include "chrome/common/extensions/extension.h" | |
| 33 #include "chrome/common/url_constants.h" | |
| 34 #include "content/public/browser/browser_thread.h" | |
| 35 #include "content/public/browser/notification_service.h" | |
| 36 #include "content/public/browser/web_contents.h" | |
| 37 #include "grit/generated_resources.h" | |
| 38 #include "grit/theme_resources.h" | |
| 39 #include "ui/base/l10n/l10n_util.h" | |
| 40 #include "ui/base/resource/resource_bundle.h" | |
| 41 | |
| 42 #if defined(USE_ASH) | |
| 43 #include "ash/shell.h" | |
| 44 #endif | |
| 45 | |
| 46 using content::BrowserThread; | |
| 47 using content::WebContents; | |
| 48 using extensions::Extension; | |
| 49 | |
| 50 namespace { | |
| 51 | |
| 52 bool disable_failure_ui_for_tests = false; | |
| 53 | |
| 54 // Helper class to put up an infobar when installation fails. | |
| 55 class ErrorInfobarDelegate : public ConfirmInfoBarDelegate { | |
| 56 public: | |
| 57 // Creates an error delegate and adds it to |infobar_service|. | |
| 58 static void Create(InfoBarService* infobar_service, | |
| 59 Browser* browser, | |
| 60 const extensions::CrxInstallerError& error); | |
| 61 | |
| 62 private: | |
| 63 ErrorInfobarDelegate(InfoBarService* infobar_service, | |
| 64 Browser* browser, | |
| 65 const extensions::CrxInstallerError& error) | |
| 66 : ConfirmInfoBarDelegate(infobar_service), | |
| 67 browser_(browser), | |
| 68 error_(error) { | |
| 69 } | |
| 70 | |
| 71 virtual string16 GetMessageText() const OVERRIDE { | |
| 72 return error_.message(); | |
| 73 } | |
| 74 | |
| 75 virtual int GetButtons() const OVERRIDE { | |
| 76 return BUTTON_OK; | |
| 77 } | |
| 78 | |
| 79 virtual string16 GetLinkText() const OVERRIDE { | |
| 80 return error_.type() == extensions::CrxInstallerError::ERROR_OFF_STORE ? | |
| 81 l10n_util::GetStringUTF16(IDS_LEARN_MORE) : ASCIIToUTF16(""); | |
| 82 } | |
| 83 | |
| 84 virtual bool LinkClicked(WindowOpenDisposition disposition) OVERRIDE { | |
| 85 chrome::NavigateParams params( | |
| 86 browser_, | |
| 87 GURL("http://support.google.com/chrome_webstore/?p=crx_warning"), | |
| 88 content::PAGE_TRANSITION_LINK); | |
| 89 params.disposition = NEW_FOREGROUND_TAB; | |
| 90 chrome::Navigate(¶ms); | |
| 91 return false; | |
| 92 } | |
| 93 | |
| 94 Browser* browser_; | |
| 95 extensions::CrxInstallerError error_; | |
| 96 }; | |
| 97 | |
| 98 // static | |
| 99 void ErrorInfobarDelegate::Create(InfoBarService* infobar_service, | |
| 100 Browser* browser, | |
| 101 const extensions::CrxInstallerError& error) { | |
| 102 infobar_service->AddInfoBar(scoped_ptr<InfoBarDelegate>( | |
| 103 new ErrorInfobarDelegate(infobar_service, browser, error))); | |
| 104 } | |
| 105 | |
| 106 void OnAppLauncherEnabledCompleted(const extensions::Extension* extension, | |
| 107 Browser* browser, | |
| 108 SkBitmap* icon, | |
| 109 bool use_bubble, | |
| 110 bool use_launcher) { | |
| 111 #if defined(ENABLE_APP_LIST) | |
| 112 if (use_launcher) { | |
| 113 chrome::ShowAppList(browser->profile()); | |
| 114 | |
| 115 content::NotificationService::current()->Notify( | |
| 116 chrome::NOTIFICATION_APP_INSTALLED_TO_APPLIST, | |
| 117 content::Source<Profile>(browser->profile()), | |
| 118 content::Details<const std::string>(&extension->id())); | |
| 119 return; | |
| 120 } | |
| 121 #endif | |
| 122 | |
| 123 if (use_bubble) { | |
| 124 chrome::ShowExtensionInstalledBubble(extension, browser, *icon); | |
| 125 return; | |
| 126 } | |
| 127 | |
| 128 ExtensionInstallUI::OpenAppInstalledUI(browser, extension->id()); | |
| 129 } | |
| 130 | |
| 131 } // namespace | |
| 132 | |
| 133 ExtensionInstallUIDefault::ExtensionInstallUIDefault(Profile* profile) | |
| 134 : skip_post_install_ui_(false), | |
| 135 previous_using_native_theme_(false), | |
| 136 use_app_installed_bubble_(false) { | |
| 137 profile_ = profile; | |
| 138 | |
| 139 // |profile_| can be NULL during tests. | |
| 140 if (profile_) { | |
| 141 // Remember the current theme in case the user presses undo. | |
| 142 const Extension* previous_theme = | |
| 143 ThemeServiceFactory::GetThemeForProfile(profile); | |
| 144 if (previous_theme) | |
| 145 previous_theme_id_ = previous_theme->id(); | |
| 146 previous_using_native_theme_ = | |
| 147 ThemeServiceFactory::GetForProfile(profile)->UsingNativeTheme(); | |
| 148 } | |
| 149 } | |
| 150 | |
| 151 ExtensionInstallUIDefault::~ExtensionInstallUIDefault() { | |
| 152 } | |
| 153 | |
| 154 void ExtensionInstallUIDefault::OnInstallSuccess(const Extension* extension, | |
| 155 SkBitmap* icon) { | |
| 156 if (skip_post_install_ui_) | |
| 157 return; | |
| 158 | |
| 159 if (!profile_) { | |
| 160 // TODO(zelidrag): Figure out what exact conditions cause crash | |
| 161 // http://crbug.com/159437 and write browser test to cover it. | |
| 162 NOTREACHED(); | |
| 163 return; | |
| 164 } | |
| 165 | |
| 166 if (extension->is_theme()) { | |
| 167 ThemeInstalledInfoBarDelegate::Create( | |
| 168 extension, profile_, previous_theme_id_, previous_using_native_theme_); | |
| 169 return; | |
| 170 } | |
| 171 | |
| 172 // Extensions aren't enabled by default in incognito so we confirm | |
| 173 // the install in a normal window. | |
| 174 Profile* current_profile = profile_->GetOriginalProfile(); | |
| 175 Browser* browser = | |
| 176 chrome::FindOrCreateTabbedBrowser(current_profile, | |
| 177 chrome::GetActiveDesktop()); | |
| 178 if (browser->tab_strip_model()->count() == 0) | |
| 179 chrome::AddBlankTabAt(browser, -1, true); | |
| 180 browser->window()->Show(); | |
| 181 | |
| 182 if (extension->is_app()) { | |
| 183 bool use_bubble = false; | |
| 184 | |
| 185 #if defined(TOOLKIT_VIEWS) || defined(OS_MACOSX) | |
| 186 CommandLine* cmdline = CommandLine::ForCurrentProcess(); | |
| 187 use_bubble = (use_app_installed_bubble_ || | |
| 188 cmdline->HasSwitch(switches::kAppsNewInstallBubble)); | |
| 189 #endif | |
| 190 | |
| 191 extensions::UpdateIsAppLauncherEnabled( | |
| 192 base::Bind(&OnAppLauncherEnabledCompleted, extension, browser, icon, | |
| 193 use_bubble)); | |
| 194 return; | |
| 195 } | |
| 196 | |
| 197 chrome::ShowExtensionInstalledBubble(extension, browser, *icon); | |
| 198 } | |
| 199 | |
| 200 void ExtensionInstallUIDefault::OnInstallFailure( | |
| 201 const extensions::CrxInstallerError& error) { | |
| 202 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
| 203 if (disable_failure_ui_for_tests || skip_post_install_ui_) | |
| 204 return; | |
| 205 | |
| 206 Browser* browser = chrome::FindLastActiveWithProfile(profile_, | |
| 207 chrome::GetActiveDesktop()); | |
| 208 WebContents* web_contents = | |
| 209 browser->tab_strip_model()->GetActiveWebContents(); | |
| 210 if (!web_contents) | |
| 211 return; | |
| 212 ErrorInfobarDelegate::Create(InfoBarService::FromWebContents(web_contents), | |
| 213 browser, error); | |
| 214 } | |
| 215 | |
| 216 void ExtensionInstallUIDefault::SetSkipPostInstallUI(bool skip_ui) { | |
| 217 skip_post_install_ui_ = skip_ui; | |
| 218 } | |
| 219 | |
| 220 void ExtensionInstallUIDefault::SetUseAppInstalledBubble(bool use_bubble) { | |
| 221 use_app_installed_bubble_ = use_bubble; | |
| 222 } | |
| 223 | |
| 224 // static | |
| 225 ExtensionInstallUI* ExtensionInstallUI::Create(Profile* profile) { | |
| 226 return new ExtensionInstallUIDefault(profile); | |
| 227 } | |
| 228 | |
| 229 // static | |
| 230 void ExtensionInstallUI::OpenAppInstalledUI(Browser* browser, | |
| 231 const std::string& app_id) { | |
| 232 #if defined(OS_CHROMEOS) | |
| 233 chrome::ShowAppList(browser->profile()); | |
| 234 | |
| 235 content::NotificationService::current()->Notify( | |
| 236 chrome::NOTIFICATION_APP_INSTALLED_TO_APPLIST, | |
| 237 content::Source<Profile>(browser->profile()), | |
| 238 content::Details<const std::string>(&app_id)); | |
| 239 #else | |
| 240 chrome::NavigateParams params(chrome::GetSingletonTabNavigateParams( | |
| 241 browser, GURL(chrome::kChromeUINewTabURL))); | |
| 242 chrome::Navigate(¶ms); | |
| 243 | |
| 244 content::NotificationService::current()->Notify( | |
| 245 chrome::NOTIFICATION_APP_INSTALLED_TO_NTP, | |
| 246 content::Source<WebContents>(params.target_contents), | |
| 247 content::Details<const std::string>(&app_id)); | |
| 248 #endif | |
| 249 } | |
| 250 | |
| 251 // static | |
| 252 void ExtensionInstallUI::DisableFailureUIForTests() { | |
| 253 disable_failure_ui_for_tests = true; | |
| 254 } | |
| 255 | |
| 256 // static | |
| 257 ExtensionInstallPrompt* ExtensionInstallUI::CreateInstallPromptWithBrowser( | |
| 258 Browser* browser) { | |
| 259 content::WebContents* web_contents = NULL; | |
| 260 if (browser) | |
| 261 web_contents = browser->tab_strip_model()->GetActiveWebContents(); | |
| 262 return new ExtensionInstallPrompt(web_contents); | |
| 263 } | |
| 264 | |
| 265 // static | |
| 266 ExtensionInstallPrompt* ExtensionInstallUI::CreateInstallPromptWithProfile( | |
| 267 Profile* profile) { | |
| 268 Browser* browser = chrome::FindLastActiveWithProfile(profile, | |
| 269 chrome::GetActiveDesktop()); | |
| 270 return CreateInstallPromptWithBrowser(browser); | |
| 271 } | |
| OLD | NEW |