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/string_number_conversions.h" | 8 #include "base/string_number_conversions.h" |
9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
11 #include "base/values.h" | 11 #include "base/values.h" |
12 #include "chrome/browser/app_launched_animation.h" | 12 #include "chrome/browser/app_launched_animation.h" |
13 #include "chrome/browser/browser.h" | 13 #include "chrome/browser/browser.h" |
14 #include "chrome/browser/browser_list.h" | 14 #include "chrome/browser/browser_list.h" |
| 15 #include "chrome/browser/extensions/extension_prefs.h" |
15 #include "chrome/browser/extensions/extensions_service.h" | 16 #include "chrome/browser/extensions/extensions_service.h" |
16 #include "chrome/browser/platform_util.h" | 17 #include "chrome/browser/platform_util.h" |
17 #include "chrome/browser/tab_contents/tab_contents.h" | 18 #include "chrome/browser/tab_contents/tab_contents.h" |
18 #include "chrome/common/chrome_switches.h" | 19 #include "chrome/common/chrome_switches.h" |
19 #include "chrome/common/extensions/extension.h" | 20 #include "chrome/common/extensions/extension.h" |
20 #include "chrome/common/extensions/extension_constants.h" | 21 #include "chrome/common/extensions/extension_constants.h" |
21 #include "chrome/common/extensions/extension_icon_set.h" | 22 #include "chrome/common/extensions/extension_icon_set.h" |
22 #include "chrome/common/extensions/extension_resource.h" | 23 #include "chrome/common/extensions/extension_resource.h" |
23 #include "chrome/common/notification_service.h" | 24 #include "chrome/common/notification_service.h" |
24 #include "chrome/common/notification_type.h" | 25 #include "chrome/common/notification_type.h" |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 DOMMessageHandler* AppLauncherHandler::Attach(DOMUI* dom_ui) { | 62 DOMMessageHandler* AppLauncherHandler::Attach(DOMUI* dom_ui) { |
62 // TODO(arv): Add initialization code to the Apps store etc. | 63 // TODO(arv): Add initialization code to the Apps store etc. |
63 return DOMMessageHandler::Attach(dom_ui); | 64 return DOMMessageHandler::Attach(dom_ui); |
64 } | 65 } |
65 | 66 |
66 void AppLauncherHandler::RegisterMessages() { | 67 void AppLauncherHandler::RegisterMessages() { |
67 dom_ui_->RegisterMessageCallback("getApps", | 68 dom_ui_->RegisterMessageCallback("getApps", |
68 NewCallback(this, &AppLauncherHandler::HandleGetApps)); | 69 NewCallback(this, &AppLauncherHandler::HandleGetApps)); |
69 dom_ui_->RegisterMessageCallback("launchApp", | 70 dom_ui_->RegisterMessageCallback("launchApp", |
70 NewCallback(this, &AppLauncherHandler::HandleLaunchApp)); | 71 NewCallback(this, &AppLauncherHandler::HandleLaunchApp)); |
| 72 dom_ui_->RegisterMessageCallback("setLaunchType", |
| 73 NewCallback(this, &AppLauncherHandler::HandleSetLaunchType)); |
71 dom_ui_->RegisterMessageCallback("uninstallApp", | 74 dom_ui_->RegisterMessageCallback("uninstallApp", |
72 NewCallback(this, &AppLauncherHandler::HandleUninstallApp)); | 75 NewCallback(this, &AppLauncherHandler::HandleUninstallApp)); |
73 } | 76 } |
74 | 77 |
75 void AppLauncherHandler::Observe(NotificationType type, | 78 void AppLauncherHandler::Observe(NotificationType type, |
76 const NotificationSource& source, | 79 const NotificationSource& source, |
77 const NotificationDetails& details) { | 80 const NotificationDetails& details) { |
78 switch (type.value) { | 81 switch (type.value) { |
79 case NotificationType::EXTENSION_LOADED: | 82 case NotificationType::EXTENSION_LOADED: |
80 case NotificationType::EXTENSION_UNLOADED: | 83 case NotificationType::EXTENSION_UNLOADED: |
81 if (dom_ui_->tab_contents()) | 84 if (dom_ui_->tab_contents()) |
82 HandleGetApps(NULL); | 85 HandleGetApps(NULL); |
83 break; | 86 break; |
| 87 case NotificationType::PREF_CHANGED: { |
| 88 if (!dom_ui_->tab_contents()) |
| 89 break; |
84 | 90 |
| 91 DictionaryValue dictionary; |
| 92 FillAppDictionary(&dictionary); |
| 93 dom_ui_->CallJavascriptFunction(L"appsPrefChangeCallback", dictionary); |
| 94 break; |
| 95 } |
85 default: | 96 default: |
86 NOTREACHED(); | 97 NOTREACHED(); |
87 } | 98 } |
88 } | 99 } |
89 | 100 |
90 // static | 101 // static |
91 void AppLauncherHandler::CreateAppInfo(Extension* extension, | 102 void AppLauncherHandler::CreateAppInfo(Extension* extension, |
| 103 ExtensionPrefs* extension_prefs, |
92 DictionaryValue* value) { | 104 DictionaryValue* value) { |
93 value->Clear(); | 105 value->Clear(); |
94 value->SetString("id", extension->id()); | 106 value->SetString("id", extension->id()); |
95 value->SetString("name", extension->name()); | 107 value->SetString("name", extension->name()); |
96 value->SetString("description", extension->description()); | 108 value->SetString("description", extension->description()); |
97 value->SetString("launch_url", extension->GetFullLaunchURL().spec()); | 109 value->SetString("launch_url", extension->GetFullLaunchURL().spec()); |
98 value->SetString("options_url", extension->options_url().spec()); | 110 value->SetString("options_url", extension->options_url().spec()); |
99 | |
100 value->SetString("icon_big", GetIconURL( | 111 value->SetString("icon_big", GetIconURL( |
101 extension, Extension::EXTENSION_ICON_LARGE, | 112 extension, Extension::EXTENSION_ICON_LARGE, |
102 "chrome://theme/IDR_APP_DEFAULT_ICON")); | 113 "chrome://theme/IDR_APP_DEFAULT_ICON")); |
103 value->SetString("icon_small", GetIconURL( | 114 value->SetString("icon_small", GetIconURL( |
104 extension, Extension::EXTENSION_ICON_BITTY, | 115 extension, Extension::EXTENSION_ICON_BITTY, |
105 std::string("chrome://favicon/") + extension->GetFullLaunchURL().spec())); | 116 std::string("chrome://favicon/") + extension->GetFullLaunchURL().spec())); |
| 117 value->SetInteger("launch_container", extension->launch_container()); |
| 118 value->SetInteger("launch_type", |
| 119 extension_prefs->GetLaunchType(extension->id())); |
106 } | 120 } |
107 | 121 |
108 void AppLauncherHandler::HandleGetApps(const ListValue* args) { | 122 void AppLauncherHandler::FillAppDictionary(DictionaryValue* dictionary) { |
109 bool show_debug_link = CommandLine::ForCurrentProcess()->HasSwitch( | |
110 switches::kAppsDebug); | |
111 | |
112 DictionaryValue dictionary; | |
113 dictionary.SetBoolean("showDebugLink", show_debug_link); | |
114 | |
115 ListValue* list = new ListValue(); | 123 ListValue* list = new ListValue(); |
116 const ExtensionList* extensions = extensions_service_->extensions(); | 124 const ExtensionList* extensions = extensions_service_->extensions(); |
117 for (ExtensionList::const_iterator it = extensions->begin(); | 125 for (ExtensionList::const_iterator it = extensions->begin(); |
118 it != extensions->end(); ++it) { | 126 it != extensions->end(); ++it) { |
119 // Don't include the WebStore component app. The WebStore launcher | 127 // Don't include the WebStore component app. The WebStore launcher |
120 // gets special treatment in ntp/apps.js. | 128 // gets special treatment in ntp/apps.js. |
121 if ((*it)->is_app() && (*it)->id() != extension_misc::kWebStoreAppId) { | 129 if ((*it)->is_app() && (*it)->id() != extension_misc::kWebStoreAppId) { |
122 DictionaryValue* app_info = new DictionaryValue(); | 130 DictionaryValue* app_info = new DictionaryValue(); |
123 CreateAppInfo(*it, app_info); | 131 CreateAppInfo(*it, extensions_service_->extension_prefs(), app_info); |
124 list->Append(app_info); | 132 list->Append(app_info); |
125 } | 133 } |
126 } | 134 } |
| 135 dictionary->Set("apps", list); |
| 136 } |
127 | 137 |
128 dictionary.Set("apps", list); | 138 void AppLauncherHandler::HandleGetApps(const ListValue* args) { |
| 139 DictionaryValue dictionary; |
| 140 FillAppDictionary(&dictionary); |
129 dom_ui_->CallJavascriptFunction(L"getAppsCallback", dictionary); | 141 dom_ui_->CallJavascriptFunction(L"getAppsCallback", dictionary); |
130 | 142 |
131 // First time we get here we set up the observer so that we can tell update | 143 // First time we get here we set up the observer so that we can tell update |
132 // the apps as they change. | 144 // the apps as they change. |
133 if (registrar_.IsEmpty()) { | 145 if (registrar_.IsEmpty()) { |
134 registrar_.Add(this, NotificationType::EXTENSION_LOADED, | 146 registrar_.Add(this, NotificationType::EXTENSION_LOADED, |
135 NotificationService::AllSources()); | 147 NotificationService::AllSources()); |
136 registrar_.Add(this, NotificationType::EXTENSION_UNLOADED, | 148 registrar_.Add(this, NotificationType::EXTENSION_UNLOADED, |
137 NotificationService::AllSources()); | 149 NotificationService::AllSources()); |
138 } | 150 } |
| 151 if (pref_change_registrar_.IsEmpty()) { |
| 152 pref_change_registrar_.Init( |
| 153 extensions_service_->extension_prefs()->pref_service()); |
| 154 pref_change_registrar_.Add(ExtensionPrefs::kExtensionsPref, this); |
| 155 } |
139 } | 156 } |
140 | 157 |
141 void AppLauncherHandler::HandleLaunchApp(const ListValue* args) { | 158 void AppLauncherHandler::HandleLaunchApp(const ListValue* args) { |
142 std::string extension_id; | 159 std::string extension_id; |
143 int left = 0; | 160 int left = 0; |
144 int top = 0; | 161 int top = 0; |
145 int width = 0; | 162 int width = 0; |
146 int height = 0; | 163 int height = 0; |
147 | 164 |
148 if (!args->GetString(0, &extension_id) || | 165 if (!args->GetString(0, &extension_id) || |
149 !ExtractInt(args, 1, &left) || | 166 !ExtractInt(args, 1, &left) || |
150 !ExtractInt(args, 2, &top) || | 167 !ExtractInt(args, 2, &top) || |
151 !ExtractInt(args, 3, &width) || | 168 !ExtractInt(args, 3, &width) || |
152 !ExtractInt(args, 4, &height)) { | 169 !ExtractInt(args, 4, &height)) { |
153 NOTREACHED(); | 170 NOTREACHED(); |
154 return; | 171 return; |
155 } | 172 } |
156 | 173 |
157 // The rect we get from the client is relative to the browser client viewport. | 174 // The rect we get from the client is relative to the browser client viewport. |
158 // Offset the rect by the tab contents bounds. | 175 // Offset the rect by the tab contents bounds. |
159 gfx::Rect rect(left, top, width, height); | 176 gfx::Rect rect(left, top, width, height); |
160 gfx::Rect tab_contents_bounds; | 177 gfx::Rect tab_contents_bounds; |
161 dom_ui_->tab_contents()->GetContainerBounds(&tab_contents_bounds); | 178 dom_ui_->tab_contents()->GetContainerBounds(&tab_contents_bounds); |
162 rect.Offset(tab_contents_bounds.origin()); | 179 rect.Offset(tab_contents_bounds.origin()); |
163 | 180 |
164 Extension* extension = | 181 Extension* extension = |
165 extensions_service_->GetExtensionById(extension_id, false); | 182 extensions_service_->GetExtensionById(extension_id, false); |
166 DCHECK(extension); | 183 DCHECK(extension); |
167 Profile* profile = extensions_service_->profile(); | 184 Profile* profile = extensions_service_->profile(); |
168 extension_misc::LaunchContainer container = extension->launch_container(); | |
169 | 185 |
170 // To give a more "launchy" experience when using the NTP launcher, we close | 186 // To give a more "launchy" experience when using the NTP launcher, we close |
171 // it automatically. | 187 // it automatically. |
172 Browser* browser = BrowserList::GetLastActive(); | 188 Browser* browser = BrowserList::GetLastActive(); |
173 TabContents* old_contents = NULL; | 189 TabContents* old_contents = NULL; |
174 if (browser) | 190 if (browser) |
175 old_contents = browser->GetSelectedTabContents(); | 191 old_contents = browser->GetSelectedTabContents(); |
176 | 192 |
177 AnimateAppIcon(extension, rect); | 193 AnimateAppIcon(extension, rect); |
178 Browser::OpenApplication(profile, extension, container); | 194 Browser::OpenApplication(profile, extension, extension->launch_container()); |
179 | 195 |
180 if (old_contents && | 196 if (old_contents && |
181 old_contents->GetURL().GetOrigin() == | 197 old_contents->GetURL().GetOrigin() == |
182 GURL(chrome::kChromeUINewTabURL).GetOrigin()) { | 198 GURL(chrome::kChromeUINewTabURL).GetOrigin()) { |
183 browser->CloseTabContents(old_contents); | 199 browser->CloseTabContents(old_contents); |
184 } | 200 } |
185 } | 201 } |
186 | 202 |
| 203 void AppLauncherHandler::HandleSetLaunchType(const ListValue* args) { |
| 204 std::string extension_id; |
| 205 int launch_type; |
| 206 if (!args->GetString(0, &extension_id) || |
| 207 !ExtractInt(args, 1, &launch_type)) { |
| 208 NOTREACHED(); |
| 209 return; |
| 210 } |
| 211 |
| 212 Extension* extension = |
| 213 extensions_service_->GetExtensionById(extension_id, false); |
| 214 DCHECK(extension); |
| 215 |
| 216 extensions_service_->extension_prefs()->SetLaunchType( |
| 217 extension_id, |
| 218 static_cast<ExtensionPrefs::LaunchType>(launch_type)); |
| 219 } |
| 220 |
187 void AppLauncherHandler::AnimateAppIcon(Extension* extension, | 221 void AppLauncherHandler::AnimateAppIcon(Extension* extension, |
188 const gfx::Rect& rect) { | 222 const gfx::Rect& rect) { |
189 // We make this check for the case of minimized windows, unit tests, etc. | 223 // We make this check for the case of minimized windows, unit tests, etc. |
190 if (platform_util::IsVisible(dom_ui_->tab_contents()->GetNativeView()) && | 224 if (platform_util::IsVisible(dom_ui_->tab_contents()->GetNativeView()) && |
191 Animation::ShouldRenderRichAnimation()) { | 225 Animation::ShouldRenderRichAnimation()) { |
192 #if defined(OS_WIN) | 226 #if defined(OS_WIN) |
193 AppLaunchedAnimation::Show(extension, rect); | 227 AppLaunchedAnimation::Show(extension, rect); |
194 #else | 228 #else |
195 NOTIMPLEMENTED(); | 229 NOTIMPLEMENTED(); |
196 #endif | 230 #endif |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
228 return; | 262 return; |
229 | 263 |
230 extensions_service_->UninstallExtension(extension_id_prompting_, | 264 extensions_service_->UninstallExtension(extension_id_prompting_, |
231 false /* external_uninstall */); | 265 false /* external_uninstall */); |
232 extension_id_prompting_ = ""; | 266 extension_id_prompting_ = ""; |
233 } | 267 } |
234 | 268 |
235 void AppLauncherHandler::InstallUIAbort() { | 269 void AppLauncherHandler::InstallUIAbort() { |
236 extension_id_prompting_ = ""; | 270 extension_id_prompting_ = ""; |
237 } | 271 } |
OLD | NEW |