OLD | NEW |
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/dom_ui/app_launcher_handler.h" | 5 #include "chrome/browser/dom_ui/app_launcher_handler.h" |
6 | 6 |
7 #include "app/animation.h" | 7 #include "app/animation.h" |
8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
9 #include "base/string_number_conversions.h" | 9 #include "base/string_number_conversions.h" |
10 #include "base/string_split.h" | 10 #include "base/string_split.h" |
11 #include "base/string_util.h" | 11 #include "base/string_util.h" |
12 #include "base/utf_string_conversions.h" | 12 #include "base/utf_string_conversions.h" |
13 #include "base/values.h" | 13 #include "base/values.h" |
14 #include "chrome/browser/app_launched_animation.h" | 14 #include "chrome/browser/app_launched_animation.h" |
15 #include "chrome/browser/extensions/default_apps.h" | 15 #include "chrome/browser/extensions/default_apps.h" |
16 #include "chrome/browser/extensions/extension_prefs.h" | 16 #include "chrome/browser/extensions/extension_prefs.h" |
17 #include "chrome/browser/extensions/extensions_service.h" | 17 #include "chrome/browser/extensions/extensions_service.h" |
18 #include "chrome/browser/platform_util.h" | 18 #include "chrome/browser/platform_util.h" |
19 #include "chrome/browser/profile.h" | 19 #include "chrome/browser/profile.h" |
20 #include "chrome/browser/tab_contents/tab_contents.h" | 20 #include "chrome/browser/tab_contents/tab_contents.h" |
21 #include "chrome/browser/ui/browser.h" | 21 #include "chrome/browser/ui/browser.h" |
22 #include "chrome/browser/ui/browser_list.h" | 22 #include "chrome/browser/ui/browser_list.h" |
| 23 #include "chrome/browser/ui/browser_window.h" |
23 #include "chrome/common/chrome_switches.h" | 24 #include "chrome/common/chrome_switches.h" |
24 #include "chrome/common/extensions/extension.h" | 25 #include "chrome/common/extensions/extension.h" |
25 #include "chrome/common/extensions/extension_constants.h" | 26 #include "chrome/common/extensions/extension_constants.h" |
26 #include "chrome/common/extensions/extension_icon_set.h" | 27 #include "chrome/common/extensions/extension_icon_set.h" |
27 #include "chrome/common/extensions/extension_resource.h" | 28 #include "chrome/common/extensions/extension_resource.h" |
28 #include "chrome/common/notification_service.h" | 29 #include "chrome/common/notification_service.h" |
29 #include "chrome/common/notification_type.h" | 30 #include "chrome/common/notification_type.h" |
30 #include "chrome/common/url_constants.h" | 31 #include "chrome/common/url_constants.h" |
31 #include "gfx/rect.h" | 32 #include "gfx/rect.h" |
32 #include "grit/browser_resources.h" | 33 #include "grit/browser_resources.h" |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 value->SetString("launch_url", extension->GetFullLaunchURL().spec()); | 91 value->SetString("launch_url", extension->GetFullLaunchURL().spec()); |
91 value->SetString("options_url", extension->options_url().spec()); | 92 value->SetString("options_url", extension->options_url().spec()); |
92 value->SetString("icon_big", GetIconURL( | 93 value->SetString("icon_big", GetIconURL( |
93 extension, Extension::EXTENSION_ICON_LARGE, | 94 extension, Extension::EXTENSION_ICON_LARGE, |
94 "chrome://theme/IDR_APP_DEFAULT_ICON")); | 95 "chrome://theme/IDR_APP_DEFAULT_ICON")); |
95 value->SetString("icon_small", GetIconURL( | 96 value->SetString("icon_small", GetIconURL( |
96 extension, Extension::EXTENSION_ICON_BITTY, | 97 extension, Extension::EXTENSION_ICON_BITTY, |
97 std::string("chrome://favicon/") + extension->GetFullLaunchURL().spec())); | 98 std::string("chrome://favicon/") + extension->GetFullLaunchURL().spec())); |
98 value->SetInteger("launch_container", extension->launch_container()); | 99 value->SetInteger("launch_container", extension->launch_container()); |
99 value->SetInteger("launch_type", | 100 value->SetInteger("launch_type", |
100 extension_prefs->GetLaunchType(extension->id())); | 101 extension_prefs->GetLaunchType(extension->id(), |
| 102 ExtensionPrefs::LAUNCH_REGULAR)); |
101 | 103 |
102 int app_launch_index = extension_prefs->GetAppLaunchIndex(extension->id()); | 104 int app_launch_index = extension_prefs->GetAppLaunchIndex(extension->id()); |
103 if (app_launch_index == -1) { | 105 if (app_launch_index == -1) { |
104 // Make sure every app has a launch index (some predate the launch index). | 106 // Make sure every app has a launch index (some predate the launch index). |
105 app_launch_index = extension_prefs->GetNextAppLaunchIndex(); | 107 app_launch_index = extension_prefs->GetNextAppLaunchIndex(); |
106 extension_prefs->SetAppLaunchIndex(extension->id(), app_launch_index); | 108 extension_prefs->SetAppLaunchIndex(extension->id(), app_launch_index); |
107 } | 109 } |
108 value->SetInteger("app_launch_index", app_launch_index); | 110 value->SetInteger("app_launch_index", app_launch_index); |
109 } | 111 } |
110 | 112 |
(...skipping 19 matching lines...) Expand all Loading... |
130 dom_ui_->RegisterMessageCallback("getApps", | 132 dom_ui_->RegisterMessageCallback("getApps", |
131 NewCallback(this, &AppLauncherHandler::HandleGetApps)); | 133 NewCallback(this, &AppLauncherHandler::HandleGetApps)); |
132 dom_ui_->RegisterMessageCallback("launchApp", | 134 dom_ui_->RegisterMessageCallback("launchApp", |
133 NewCallback(this, &AppLauncherHandler::HandleLaunchApp)); | 135 NewCallback(this, &AppLauncherHandler::HandleLaunchApp)); |
134 dom_ui_->RegisterMessageCallback("setLaunchType", | 136 dom_ui_->RegisterMessageCallback("setLaunchType", |
135 NewCallback(this, &AppLauncherHandler::HandleSetLaunchType)); | 137 NewCallback(this, &AppLauncherHandler::HandleSetLaunchType)); |
136 dom_ui_->RegisterMessageCallback("uninstallApp", | 138 dom_ui_->RegisterMessageCallback("uninstallApp", |
137 NewCallback(this, &AppLauncherHandler::HandleUninstallApp)); | 139 NewCallback(this, &AppLauncherHandler::HandleUninstallApp)); |
138 dom_ui_->RegisterMessageCallback("hideAppsPromo", | 140 dom_ui_->RegisterMessageCallback("hideAppsPromo", |
139 NewCallback(this, &AppLauncherHandler::HandleHideAppsPromo)); | 141 NewCallback(this, &AppLauncherHandler::HandleHideAppsPromo)); |
| 142 dom_ui_->RegisterMessageCallback("createAppShortcut", |
| 143 NewCallback(this, &AppLauncherHandler::HandleCreateAppShortcut)); |
140 } | 144 } |
141 | 145 |
142 void AppLauncherHandler::Observe(NotificationType type, | 146 void AppLauncherHandler::Observe(NotificationType type, |
143 const NotificationSource& source, | 147 const NotificationSource& source, |
144 const NotificationDetails& details) { | 148 const NotificationDetails& details) { |
145 switch (type.value) { | 149 switch (type.value) { |
146 case NotificationType::EXTENSION_LOADED: | 150 case NotificationType::EXTENSION_LOADED: |
147 case NotificationType::EXTENSION_UNLOADED: | 151 case NotificationType::EXTENSION_UNLOADED: |
148 if (dom_ui_->tab_contents()) | 152 if (dom_ui_->tab_contents()) |
149 HandleGetApps(NULL); | 153 HandleGetApps(NULL); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 dictionary->SetBoolean("showPromo", false); | 190 dictionary->SetBoolean("showPromo", false); |
187 promo_active_ = false; | 191 promo_active_ = false; |
188 } | 192 } |
189 | 193 |
190 bool showLauncher = | 194 bool showLauncher = |
191 CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableAppLauncher); | 195 CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableAppLauncher); |
192 dictionary->SetBoolean("showLauncher", showLauncher); | 196 dictionary->SetBoolean("showLauncher", showLauncher); |
193 | 197 |
194 #if defined(OS_MACOSX) | 198 #if defined(OS_MACOSX) |
195 // App windows are not yet implemented on mac. | 199 // App windows are not yet implemented on mac. |
196 bool disable_app_window_launch = true; | 200 dictionary->SetBoolean("disableAppWindowLaunch", true); |
197 #else | 201 dictionary->SetBoolean("disableCreateAppShortcut", true); |
198 bool disable_app_window_launch = false; | |
199 #endif | 202 #endif |
200 dictionary->SetBoolean("disableAppWindowLaunch", disable_app_window_launch); | |
201 } | 203 } |
202 | 204 |
203 void AppLauncherHandler::HandleGetApps(const ListValue* args) { | 205 void AppLauncherHandler::HandleGetApps(const ListValue* args) { |
204 DictionaryValue dictionary; | 206 DictionaryValue dictionary; |
205 FillAppDictionary(&dictionary); | 207 FillAppDictionary(&dictionary); |
206 dom_ui_->CallJavascriptFunction(L"getAppsCallback", dictionary); | 208 dom_ui_->CallJavascriptFunction(L"getAppsCallback", dictionary); |
207 | 209 |
208 // First time we get here we set up the observer so that we can tell update | 210 // First time we get here we set up the observer so that we can tell update |
209 // the apps as they change. | 211 // the apps as they change. |
210 if (registrar_.IsEmpty()) { | 212 if (registrar_.IsEmpty()) { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 | 252 |
251 // To give a more "launchy" experience when using the NTP launcher, we close | 253 // To give a more "launchy" experience when using the NTP launcher, we close |
252 // it automatically. | 254 // it automatically. |
253 Browser* browser = BrowserList::GetLastActive(); | 255 Browser* browser = BrowserList::GetLastActive(); |
254 TabContents* old_contents = NULL; | 256 TabContents* old_contents = NULL; |
255 if (browser) | 257 if (browser) |
256 old_contents = browser->GetSelectedTabContents(); | 258 old_contents = browser->GetSelectedTabContents(); |
257 | 259 |
258 AnimateAppIcon(extension, rect); | 260 AnimateAppIcon(extension, rect); |
259 | 261 |
| 262 // Look at preference to find the right launch container. If no preference |
| 263 // is set, launch as a regular tab. |
260 extension_misc::LaunchContainer launch_container = | 264 extension_misc::LaunchContainer launch_container = |
261 extension->launch_container(); | 265 extensions_service_->extension_prefs()->GetLaunchContainer( |
262 ExtensionPrefs::LaunchType prefs_launch_type = | 266 extension, ExtensionPrefs::LAUNCH_REGULAR); |
263 extensions_service_->extension_prefs()->GetLaunchType(extension_id); | |
264 | |
265 // If the user chose to open in a window, change the container type. | |
266 if (prefs_launch_type == ExtensionPrefs::LAUNCH_WINDOW) | |
267 launch_container = extension_misc::LAUNCH_WINDOW; | |
268 | 267 |
269 TabContents* new_contents = Browser::OpenApplication( | 268 TabContents* new_contents = Browser::OpenApplication( |
270 profile, extension, launch_container, old_contents); | 269 profile, extension, launch_container, old_contents); |
271 | 270 |
272 if (new_contents != old_contents && browser->tab_count() > 1) | 271 if (new_contents != old_contents && browser->tab_count() > 1) |
273 browser->CloseTabContents(old_contents); | 272 browser->CloseTabContents(old_contents); |
274 | 273 |
275 if (extension_id != extension_misc::kWebStoreAppId) | 274 if (extension_id != extension_misc::kWebStoreAppId) |
276 RecordAppLaunch(promo_active_); | 275 RecordAppLaunch(promo_active_); |
277 } | 276 } |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 | 320 |
322 for (ExtensionIdSet::const_iterator iter = app_ids->begin(); | 321 for (ExtensionIdSet::const_iterator iter = app_ids->begin(); |
323 iter != app_ids->end(); ++iter) { | 322 iter != app_ids->end(); ++iter) { |
324 if (extensions_service_->GetExtensionById(*iter, true)) | 323 if (extensions_service_->GetExtensionById(*iter, true)) |
325 extensions_service_->UninstallExtension(*iter, false); | 324 extensions_service_->UninstallExtension(*iter, false); |
326 } | 325 } |
327 | 326 |
328 extensions_service_->default_apps()->SetPromoHidden(); | 327 extensions_service_->default_apps()->SetPromoHidden(); |
329 } | 328 } |
330 | 329 |
| 330 void AppLauncherHandler::HandleCreateAppShortcut(const ListValue* args) { |
| 331 std::string extension_id; |
| 332 if (!args->GetString(0, &extension_id)) { |
| 333 NOTREACHED(); |
| 334 return; |
| 335 } |
| 336 |
| 337 const Extension* extension = |
| 338 extensions_service_->GetExtensionById(extension_id, false); |
| 339 CHECK(extension); |
| 340 |
| 341 Browser* browser = BrowserList::GetLastActive(); |
| 342 if (!browser) |
| 343 return; |
| 344 browser->window()->ShowCreateChromeAppShortcutsDialog( |
| 345 browser->profile(), extension); |
| 346 } |
| 347 |
331 // static | 348 // static |
332 void AppLauncherHandler::RecordWebStoreLaunch(bool promo_active) { | 349 void AppLauncherHandler::RecordWebStoreLaunch(bool promo_active) { |
333 if (!promo_active) return; | 350 if (!promo_active) return; |
334 | 351 |
335 UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppsPromoHistogram, | 352 UMA_HISTOGRAM_ENUMERATION(extension_misc::kAppsPromoHistogram, |
336 extension_misc::PROMO_LAUNCH_WEB_STORE, | 353 extension_misc::PROMO_LAUNCH_WEB_STORE, |
337 extension_misc::PROMO_BUCKET_BOUNDARY); | 354 extension_misc::PROMO_BUCKET_BOUNDARY); |
338 } | 355 } |
339 | 356 |
340 // static | 357 // static |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 // We make this check for the case of minimized windows, unit tests, etc. | 396 // We make this check for the case of minimized windows, unit tests, etc. |
380 if (platform_util::IsVisible(dom_ui_->tab_contents()->GetNativeView()) && | 397 if (platform_util::IsVisible(dom_ui_->tab_contents()->GetNativeView()) && |
381 Animation::ShouldRenderRichAnimation()) { | 398 Animation::ShouldRenderRichAnimation()) { |
382 #if defined(OS_WIN) | 399 #if defined(OS_WIN) |
383 AppLaunchedAnimation::Show(extension, rect); | 400 AppLaunchedAnimation::Show(extension, rect); |
384 #else | 401 #else |
385 NOTIMPLEMENTED(); | 402 NOTIMPLEMENTED(); |
386 #endif | 403 #endif |
387 } | 404 } |
388 } | 405 } |
OLD | NEW |