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

Side by Side Diff: chrome/browser/extensions/api/developer_private/developer_private_api.cc

Issue 989813002: [Extensions] Make a chrome.developerPrivate.getExtensionsInfo function (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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/api/developer_private/developer_private_api. h" 5 #include "chrome/browser/extensions/api/developer_private/developer_private_api. h"
6 6
7 #include "apps/app_load_service.h" 7 #include "apps/app_load_service.h"
8 #include "apps/saved_files_service.h" 8 #include "apps/saved_files_service.h"
9 #include "base/base64.h" 9 #include "base/base64.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/command_line.h" 11 #include "base/command_line.h"
12 #include "base/files/file_enumerator.h"
13 #include "base/files/file_util.h" 12 #include "base/files/file_util.h"
14 #include "base/i18n/file_util_icu.h"
15 #include "base/lazy_instance.h" 13 #include "base/lazy_instance.h"
16 #include "base/strings/string_number_conversions.h" 14 #include "base/strings/string_number_conversions.h"
17 #include "base/strings/stringprintf.h" 15 #include "base/strings/stringprintf.h"
18 #include "base/strings/utf_string_conversions.h" 16 #include "base/strings/utf_string_conversions.h"
19 #include "base/values.h" 17 #include "base/values.h"
20 #include "chrome/browser/devtools/devtools_window.h" 18 #include "chrome/browser/devtools/devtools_window.h"
19 #include "chrome/browser/extensions/api/developer_private/developer_private_mang le.h"
21 #include "chrome/browser/extensions/api/developer_private/entry_picker.h" 20 #include "chrome/browser/extensions/api/developer_private/entry_picker.h"
21 #include "chrome/browser/extensions/api/developer_private/inspectable_views_find er.h"
22 #include "chrome/browser/extensions/api/extension_action/extension_action_api.h" 22 #include "chrome/browser/extensions/api/extension_action/extension_action_api.h"
23 #include "chrome/browser/extensions/api/file_handlers/app_file_handler_util.h" 23 #include "chrome/browser/extensions/api/file_handlers/app_file_handler_util.h"
24 #include "chrome/browser/extensions/chrome_requirements_checker.h" 24 #include "chrome/browser/extensions/chrome_requirements_checker.h"
25 #include "chrome/browser/extensions/devtools_util.h" 25 #include "chrome/browser/extensions/devtools_util.h"
26 #include "chrome/browser/extensions/extension_disabled_ui.h"
27 #include "chrome/browser/extensions/extension_error_reporter.h"
28 #include "chrome/browser/extensions/extension_service.h" 26 #include "chrome/browser/extensions/extension_service.h"
29 #include "chrome/browser/extensions/extension_ui_util.h" 27 #include "chrome/browser/extensions/extension_ui_util.h"
30 #include "chrome/browser/extensions/extension_util.h" 28 #include "chrome/browser/extensions/extension_util.h"
29 #include "chrome/browser/extensions/path_util.h"
30 #include "chrome/browser/extensions/shared_module_service.h"
31 #include "chrome/browser/extensions/unpacked_installer.h" 31 #include "chrome/browser/extensions/unpacked_installer.h"
32 #include "chrome/browser/extensions/updater/extension_updater.h" 32 #include "chrome/browser/extensions/updater/extension_updater.h"
33 #include "chrome/browser/platform_util.h" 33 #include "chrome/browser/platform_util.h"
34 #include "chrome/browser/profiles/profile.h" 34 #include "chrome/browser/profiles/profile.h"
35 #include "chrome/browser/sync_file_system/syncable_file_system_util.h"
36 #include "chrome/browser/ui/browser_finder.h" 35 #include "chrome/browser/ui/browser_finder.h"
37 #include "chrome/browser/ui/chrome_select_file_policy.h"
38 #include "chrome/browser/ui/tabs/tab_strip_model.h" 36 #include "chrome/browser/ui/tabs/tab_strip_model.h"
39 #include "chrome/browser/ui/webui/extensions/extension_icon_source.h" 37 #include "chrome/browser/ui/webui/extensions/extension_icon_source.h"
40 #include "chrome/common/extensions/api/developer_private.h" 38 #include "chrome/common/extensions/api/developer_private.h"
41 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h" 39 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
42 #include "chrome/common/url_constants.h" 40 #include "chrome/common/url_constants.h"
43 #include "chrome/grit/generated_resources.h" 41 #include "chrome/grit/generated_resources.h"
44 #include "content/public/browser/browser_thread.h" 42 #include "content/public/browser/browser_thread.h"
45 #include "content/public/browser/notification_service.h" 43 #include "content/public/browser/notification_service.h"
46 #include "content/public/browser/render_process_host.h" 44 #include "content/public/browser/render_process_host.h"
47 #include "content/public/browser/render_view_host.h" 45 #include "content/public/browser/render_view_host.h"
48 #include "content/public/browser/site_instance.h" 46 #include "content/public/browser/site_instance.h"
49 #include "content/public/browser/storage_partition.h" 47 #include "content/public/browser/storage_partition.h"
50 #include "content/public/browser/web_contents.h" 48 #include "content/public/browser/web_contents.h"
51 #include "extensions/browser/api/device_permissions_manager.h" 49 #include "extensions/browser/api/device_permissions_manager.h"
52 #include "extensions/browser/app_window/app_window.h" 50 #include "extensions/browser/app_window/app_window.h"
53 #include "extensions/browser/app_window/app_window_registry.h" 51 #include "extensions/browser/app_window/app_window_registry.h"
54 #include "extensions/browser/extension_error.h" 52 #include "extensions/browser/extension_error.h"
55 #include "extensions/browser/extension_prefs.h" 53 #include "extensions/browser/extension_prefs.h"
56 #include "extensions/browser/extension_registry.h" 54 #include "extensions/browser/extension_registry.h"
57 #include "extensions/browser/extension_system.h" 55 #include "extensions/browser/extension_system.h"
58 #include "extensions/browser/file_highlighter.h" 56 #include "extensions/browser/file_highlighter.h"
59 #include "extensions/browser/management_policy.h" 57 #include "extensions/browser/management_policy.h"
60 #include "extensions/browser/notification_types.h" 58 #include "extensions/browser/notification_types.h"
61 #include "extensions/browser/view_type_utils.h" 59 #include "extensions/browser/warning_service.h"
62 #include "extensions/common/constants.h" 60 #include "extensions/common/constants.h"
63 #include "extensions/common/extension_resource.h" 61 #include "extensions/common/extension_resource.h"
64 #include "extensions/common/extension_set.h" 62 #include "extensions/common/extension_set.h"
63 #include "extensions/common/feature_switch.h"
65 #include "extensions/common/install_warning.h" 64 #include "extensions/common/install_warning.h"
66 #include "extensions/common/manifest.h" 65 #include "extensions/common/manifest.h"
67 #include "extensions/common/manifest_handlers/background_info.h" 66 #include "extensions/common/manifest_handlers/background_info.h"
68 #include "extensions/common/manifest_handlers/icons_handler.h" 67 #include "extensions/common/manifest_handlers/icons_handler.h"
69 #include "extensions/common/manifest_handlers/incognito_info.h" 68 #include "extensions/common/manifest_handlers/incognito_info.h"
70 #include "extensions/common/manifest_handlers/offline_enabled_info.h" 69 #include "extensions/common/manifest_handlers/offline_enabled_info.h"
71 #include "extensions/common/manifest_handlers/options_page_info.h" 70 #include "extensions/common/manifest_handlers/options_page_info.h"
72 #include "extensions/common/manifest_url_handlers.h" 71 #include "extensions/common/manifest_url_handlers.h"
73 #include "extensions/common/permissions/permissions_data.h" 72 #include "extensions/common/permissions/permissions_data.h"
74 #include "extensions/common/switches.h" 73 #include "extensions/common/switches.h"
75 #include "extensions/grit/extensions_browser_resources.h" 74 #include "extensions/grit/extensions_browser_resources.h"
76 #include "net/base/net_util.h" 75 #include "net/base/net_util.h"
77 #include "storage/browser/blob/shareable_file_reference.h"
78 #include "storage/browser/fileapi/external_mount_points.h" 76 #include "storage/browser/fileapi/external_mount_points.h"
79 #include "storage/browser/fileapi/file_system_context.h" 77 #include "storage/browser/fileapi/file_system_context.h"
80 #include "storage/browser/fileapi/file_system_operation.h" 78 #include "storage/browser/fileapi/file_system_operation.h"
81 #include "storage/browser/fileapi/file_system_operation_runner.h" 79 #include "storage/browser/fileapi/file_system_operation_runner.h"
82 #include "storage/browser/fileapi/isolated_context.h" 80 #include "storage/browser/fileapi/isolated_context.h"
83 #include "ui/base/l10n/l10n_util.h" 81 #include "ui/base/l10n/l10n_util.h"
84 #include "ui/base/resource/resource_bundle.h" 82 #include "ui/base/resource/resource_bundle.h"
85 #include "ui/base/webui/web_ui_util.h" 83 #include "ui/base/webui/web_ui_util.h"
86 84
87 using content::RenderViewHost;
88
89 namespace extensions { 85 namespace extensions {
90 86
91 namespace developer_private = api::developer_private; 87 namespace developer_private = api::developer_private;
92 88
93 namespace { 89 namespace {
94 90
95 const char kNoSuchExtensionError[] = "No such extension."; 91 const char kNoSuchExtensionError[] = "No such extension.";
96 const char kSupervisedUserError[] = 92 const char kSupervisedUserError[] =
97 "Supervised users cannot modify extension settings."; 93 "Supervised users cannot modify extension settings.";
98 const char kCannotModifyPolicyExtensionError[] = 94 const char kCannotModifyPolicyExtensionError[] =
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 // extensions::ImageLoader. Also a resize should be performed to avoid 146 // extensions::ImageLoader. Also a resize should be performed to avoid
151 // potential huge URLs: crbug/297298. 147 // potential huge URLs: crbug/297298.
152 GURL ToDataURL(const base::FilePath& path, developer_private::ItemType type) { 148 GURL ToDataURL(const base::FilePath& path, developer_private::ItemType type) {
153 std::string contents; 149 std::string contents;
154 if (path.empty() || !base::ReadFileToString(path, &contents)) 150 if (path.empty() || !base::ReadFileToString(path, &contents))
155 return GetDefaultImageURL(type); 151 return GetDefaultImageURL(type);
156 152
157 return GetImageURLFromData(contents); 153 return GetImageURLFromData(contents);
158 } 154 }
159 155
160 std::string GetExtensionID(const RenderViewHost* render_view_host) { 156 std::string GetExtensionID(const content::RenderViewHost* render_view_host) {
161 if (!render_view_host->GetSiteInstance()) 157 if (!render_view_host->GetSiteInstance())
162 return std::string(); 158 return std::string();
163 159
164 return render_view_host->GetSiteInstance()->GetSiteURL().host(); 160 return render_view_host->GetSiteInstance()->GetSiteURL().host();
165 } 161 }
166 162
167 void BroadcastItemStateChanged(content::BrowserContext* browser_context, 163 void BroadcastItemStateChanged(content::BrowserContext* browser_context,
168 developer::EventType event_type, 164 developer::EventType event_type,
169 const std::string& item_id) { 165 const std::string& item_id) {
170 developer::EventData event_data; 166 developer::EventData event_data;
171 event_data.event_type = event_type; 167 event_data.event_type = event_type;
172 event_data.item_id = item_id; 168 event_data.item_id = item_id;
173 169
174 scoped_ptr<base::ListValue> args(new base::ListValue()); 170 scoped_ptr<base::ListValue> args(new base::ListValue());
175 args->Append(event_data.ToValue().release()); 171 args->Append(event_data.ToValue().release());
176 scoped_ptr<Event> event(new Event( 172 scoped_ptr<Event> event(new Event(
177 developer_private::OnItemStateChanged::kEventName, args.Pass())); 173 developer_private::OnItemStateChanged::kEventName, args.Pass()));
178 EventRouter::Get(browser_context)->BroadcastEvent(event.Pass()); 174 EventRouter::Get(browser_context)->BroadcastEvent(event.Pass());
179 } 175 }
180 176
181 std::string ReadFileToString(const base::FilePath& path) { 177 std::string ReadFileToString(const base::FilePath& path) {
182 std::string data; 178 std::string data;
183 ignore_result(base::ReadFileToString(path, &data)); 179 ignore_result(base::ReadFileToString(path, &data));
184 return data; 180 return data;
185 } 181 }
186 182
183 // Populates the common fields of an extension error.
184 template <typename ErrorType>
185 void PopulateErrorBase(const ExtensionError& error,
186 ErrorType* out) {
187 CHECK(out);
188 out->type = error.type() == ExtensionError::MANIFEST_ERROR ?
189 developer::ERROR_TYPE_MANIFEST : developer::ERROR_TYPE_RUNTIME;
190 out->extension_id = error.extension_id();
191 out->from_incognito = error.from_incognito();
192 out->source = base::UTF16ToUTF8(error.source());
193 out->message = base::UTF16ToUTF8(error.message());
194 }
195
196 // Given a ManifestError object, converts it into its developer_private
197 // counterpart.
198 linked_ptr<developer::ManifestError> ConstructManifestError(
199 const ManifestError& error) {
200 linked_ptr<developer::ManifestError> result(new developer::ManifestError());
201 PopulateErrorBase(error, result.get());
202 result->manifest_key = base::UTF16ToUTF8(error.manifest_key());
203 if (!error.manifest_specific().empty()) {
204 result->manifest_specific.reset(
205 new std::string(base::UTF16ToUTF8(error.manifest_specific())));
206 }
207 return result;
208 }
209
210 // Given a RuntimeError object, converts it into its developer_private
211 // counterpart.
212 linked_ptr<developer::RuntimeError> ConstructRuntimeError(
213 const RuntimeError& error) {
214 linked_ptr<developer::RuntimeError> result(new developer::RuntimeError());
215 PopulateErrorBase(error, result.get());
216 switch (error.level()) {
217 case logging::LOG_INFO:
218 result->severity = developer::ERROR_LEVEL_LOG;
219 break;
220 case logging::LOG_WARNING:
221 result->severity = developer::ERROR_LEVEL_WARN;
222 break;
223 case logging::LOG_ERROR:
224 result->severity = developer::ERROR_LEVEL_ERROR;
225 break;
226 default:
227 NOTREACHED();
228 }
229 result->occurrences = error.occurrences();
230 result->render_view_id = error.render_view_id();
231 result->render_process_id = error.render_process_id();
232 result->can_inspect =
233 content::RenderViewHost::FromID(error.render_process_id(),
234 error.render_view_id()) != nullptr;
235 for (const StackFrame& f : error.stack_trace()) {
236 linked_ptr<developer::StackFrame> frame(new developer::StackFrame());
237 frame->line_number = f.line_number;
238 frame->column_number = f.column_number;
239 frame->url = base::UTF16ToUTF8(f.source);
240 frame->function_name = base::UTF16ToUTF8(f.function);
241 result->stack_trace.push_back(frame);
242 }
243 return result;
244 }
245
246 // Given a Manifest::Type, converts it into its developer_private
247 // counterpart.
248 developer::ExtensionType GetExtensionType(Manifest::Type manifest_type) {
249 developer::ExtensionType type = developer::EXTENSION_TYPE_EXTENSION;
250 switch (manifest_type) {
251 case Manifest::TYPE_EXTENSION:
252 type = developer::EXTENSION_TYPE_EXTENSION;
253 break;
254 case Manifest::TYPE_THEME:
255 type = developer::EXTENSION_TYPE_THEME;
256 break;
257 case Manifest::TYPE_HOSTED_APP:
258 type = developer::EXTENSION_TYPE_HOSTED_APP;
259 break;
260 case Manifest::TYPE_LEGACY_PACKAGED_APP:
261 type = developer::EXTENSION_TYPE_LEGACY_PACKAGED_APP;
262 break;
263 case Manifest::TYPE_PLATFORM_APP:
264 type = developer::EXTENSION_TYPE_PLATFORM_APP;
265 break;
266 case Manifest::TYPE_SHARED_MODULE:
267 type = developer::EXTENSION_TYPE_SHARED_MODULE;
268 break;
269 default:
270 NOTREACHED();
271 }
272 return type;
273 }
274
275 // Constructs information about a given |extension|.
276 scoped_ptr<developer::ExtensionInfo> CreateExtensionInfo(
277 const Extension& extension,
278 developer::ExtensionState state,
279 content::BrowserContext* browser_context) {
280 scoped_ptr<developer::ExtensionInfo> info(new developer::ExtensionInfo());
281
282 ExtensionPrefs* prefs = ExtensionPrefs::Get(browser_context);
283 // Don't consider the button hidden with the redesign, because "hidden"
284 // buttons are now just hidden in the wrench menu.
285 info->action_button_hidden =
286 !ExtensionActionAPI::GetBrowserActionVisibility(prefs, extension.id()) &&
287 !FeatureSwitch::extension_action_redesign()->IsEnabled();
288
289 // Blacklist text.
290 int blacklist_text = -1;
291 switch (prefs->GetExtensionBlacklistState(extension.id())) {
292 case BLACKLISTED_SECURITY_VULNERABILITY:
293 blacklist_text = IDS_OPTIONS_BLACKLISTED_SECURITY_VULNERABILITY;
294 break;
295 case BLACKLISTED_CWS_POLICY_VIOLATION:
296 blacklist_text = IDS_OPTIONS_BLACKLISTED_CWS_POLICY_VIOLATION;
297 break;
298 case BLACKLISTED_POTENTIALLY_UNWANTED:
299 blacklist_text = IDS_OPTIONS_BLACKLISTED_POTENTIALLY_UNWANTED;
300 break;
301 default:
302 break;
303 }
304 if (blacklist_text != -1) {
305 info->blacklist_text.reset(
306 new std::string(l10n_util::GetStringUTF8(blacklist_text)));
307 }
308
309 // Dependent extensions.
310 if (extension.is_shared_module()) {
311 scoped_ptr<ExtensionSet> dependent_extensions =
312 ExtensionSystem::Get(browser_context)->extension_service()->
313 shared_module_service()->GetDependentExtensions(&extension);
314 for (const scoped_refptr<const Extension>& dependent :
315 *dependent_extensions)
316 info->dependent_extensions.push_back(dependent->id());
317 }
318
319 info->description = extension.description();
320
321 // Disable reasons.
322 int disable_reasons = prefs->GetDisableReasons(extension.id());
323 info->disable_reasons.suspicious_install =
324 (disable_reasons & Extension::DISABLE_NOT_VERIFIED) != 0;
325 info->disable_reasons.corrupt_install =
326 (disable_reasons & Extension::DISABLE_CORRUPTED) != 0;
327 info->disable_reasons.update_required =
328 (disable_reasons & Extension::DISABLE_UPDATE_REQUIRED_BY_POLICY) != 0;
329
330 // Error collection.
331 Profile* profile = Profile::FromBrowserContext(browser_context);
332 ErrorConsole* error_console = ErrorConsole::Get(profile);
333 bool error_console_enabled =
334 error_console->IsEnabledForChromeExtensionsPage();
335 info->error_collection.is_enabled = error_console_enabled;
336 info->error_collection.is_active =
337 error_console_enabled &&
338 error_console->IsReportingEnabledForExtension(extension.id());
339
340 // File access.
341 info->file_access.is_enabled = extension.wants_file_access();
342 info->file_access.is_active =
343 util::AllowFileAccess(extension.id(), browser_context);
344
345 // Home page.
346 info->home_page.url = ManifestURL::GetHomepageURL(&extension).spec();
347 info->home_page.specified = ManifestURL::SpecifiedHomepageURL(&extension);
348
349 bool is_enabled = state == developer::EXTENSION_STATE_ENABLED;
350
351 // TODO(devlin): This won't work with apps (CORS). We should convert to data
352 // urls.
353 info->icon_url =
354 ExtensionIconSource::GetIconURL(&extension,
355 extension_misc::EXTENSION_ICON_MEDIUM,
356 ExtensionIconSet::MATCH_BIGGER,
357 !is_enabled,
358 nullptr).spec();
359
360 info->id = extension.id();
361
362 // Incognito access.
363 info->incognito_access.is_enabled = extension.can_be_incognito_enabled();
364 info->incognito_access.is_active =
365 util::IsIncognitoEnabled(extension.id(), browser_context);
366
367 info->installed_by_custodian =
368 util::IsExtensionSupervised(&extension, profile);
369
370 // Install warnings (only if unpacked and no error console).
371 if (!error_console_enabled &&
372 Manifest::IsUnpackedLocation(extension.location())) {
373 const std::vector<InstallWarning>& install_warnings =
374 extension.install_warnings();
375 for (const InstallWarning& warning : install_warnings)
376 info->install_warnings.push_back(warning.message);
377 }
378
379 // Launch url.
380 if (extension.is_app()) {
381 info->launch_url.reset(
382 new std::string(AppLaunchInfo::GetFullLaunchURL(&extension).spec()));
383 }
384
385 // Location.
386 if (extension.location() == Manifest::INTERNAL &&
387 ManifestURL::UpdatesFromGallery(&extension)) {
388 info->location = developer::LOCATION_FROM_STORE;
389 } else if (Manifest::IsUnpackedLocation(extension.location())) {
390 info->location = developer::LOCATION_UNPACKED;
391 } else {
392 info->location = developer::LOCATION_UNKNOWN;
393 }
394
395 // Location text.
396 int location_text = -1;
397 if (info->location == developer::LOCATION_UNKNOWN)
398 location_text = IDS_OPTIONS_INSTALL_LOCATION_UNKNOWN;
399 else if (extension.location() == Manifest::EXTERNAL_REGISTRY)
400 location_text = IDS_OPTIONS_INSTALL_LOCATION_3RD_PARTY;
401 else if (extension.is_shared_module())
402 location_text = IDS_OPTIONS_INSTALL_LOCATION_SHARED_MODULE;
403 if (location_text != -1) {
404 info->location_text.reset(
405 new std::string(l10n_util::GetStringUTF8(location_text)));
406 }
407
408 // Runtime/Manifest errors.
409 if (error_console_enabled) {
410 const ErrorList& errors =
411 error_console->GetErrorsForExtension(extension.id());
412 for (const ExtensionError* error : errors) {
413 switch (error->type()) {
414 case ExtensionError::MANIFEST_ERROR:
415 info->manifest_errors.push_back(ConstructManifestError(
416 static_cast<const ManifestError&>(*error)));
417 break;
418 case ExtensionError::RUNTIME_ERROR:
419 info->runtime_errors.push_back(ConstructRuntimeError(
420 static_cast<const RuntimeError&>(*error)));
421 break;
422 case ExtensionError::NUM_ERROR_TYPES:
423 NOTREACHED();
424 break;
425 }
426 }
427 }
428
429 ManagementPolicy* management_policy =
430 ExtensionSystem::Get(browser_context)->management_policy();
431 info->must_remain_installed =
432 management_policy->MustRemainInstalled(&extension, nullptr);
433
434 info->name = extension.name();
435 info->offline_enabled = OfflineEnabledInfo::IsOfflineEnabled(&extension);
436
437 // Options page.
438 if (OptionsPageInfo::HasOptionsPage(&extension)) {
439 info->options_page.reset(new developer::OptionsPage());
440 info->options_page->open_in_tab =
441 OptionsPageInfo::ShouldOpenInTab(&extension);
442 info->options_page->url =
443 OptionsPageInfo::GetOptionsPage(&extension).spec();
444 }
445
446 // Path.
447 if (Manifest::IsUnpackedLocation(extension.location())) {
448 info->path.reset(new std::string(extension.path().AsUTF8Unsafe()));
449 info->prettified_path.reset(new std::string(
450 extensions::path_util::PrettifyPath(extension.path()).AsUTF8Unsafe()));
451 }
452
453 if (Manifest::IsPolicyLocation(extension.location())) {
454 info->policy_text.reset(new std::string(
455 l10n_util::GetStringUTF8(IDS_OPTIONS_INSTALL_LOCATION_ENTERPRISE)));
456 }
457
458 // Runs on all urls.
459 info->run_on_all_urls.is_enabled =
460 (FeatureSwitch::scripts_require_action()->IsEnabled() &&
461 PermissionsData::ScriptsMayRequireActionForExtension(
462 &extension,
463 extension.permissions_data()->active_permissions().get())) ||
464 extension.permissions_data()->HasWithheldImpliedAllHosts() ||
465 util::HasSetAllowedScriptingOnAllUrls(extension.id(), browser_context);
466 info->run_on_all_urls.is_active =
467 util::AllowedScriptingOnAllUrls(extension.id(), browser_context);
468
469 // Runtime warnings.
470 WarningService* warning_service = WarningService::Get(profile);
471 std::vector<std::string> warnings =
472 warning_service->GetWarningMessagesForExtension(extension.id());
473 for (const std::string& warning : warnings)
474 info->runtime_warnings.push_back(warning);
475
476 info->state = state;
477
478 info->type = GetExtensionType(extension.manifest()->type());
479
480 info->update_url = ManifestURL::GetUpdateURL(&extension).spec();
481
482 info->user_may_modify =
483 management_policy->UserMayModifySettings(&extension, nullptr);
484
485 info->version = extension.GetVersionForDisplay();
486
487 if (state != developer::EXTENSION_STATE_TERMINATED) {
488 info->views = InspectableViewsFinder(profile, nullptr).
489 GetViewsForExtension(extension, is_enabled);
490 }
491 return info.Pass();
492 }
493
494 std::vector<linked_ptr<developer::ExtensionInfo>> GetExtensionsInfo(
495 content::BrowserContext* context,
496 bool include_disabled,
497 bool include_terminated) {
498 std::vector<linked_ptr<developer::ExtensionInfo>> list;
499 auto add_to_list = [&list, context](const ExtensionSet& extensions,
500 developer::ExtensionState state) {
501 for (const scoped_refptr<const Extension>& extension : extensions) {
502 if (ui_util::ShouldDisplayInExtensionSettings(extension.get(), context)) {
503 scoped_ptr<developer::ExtensionInfo> info =
504 CreateExtensionInfo(*extension, state, context);
505 list.push_back(make_linked_ptr(info.release()));
506 }
507 }
508 };
509
510 ExtensionRegistry* registry = ExtensionRegistry::Get(context);
511 add_to_list(registry->enabled_extensions(),
512 developer::EXTENSION_STATE_ENABLED);
513 if (include_disabled) {
514 add_to_list(registry->disabled_extensions(),
515 developer::EXTENSION_STATE_DISABLED);
516 }
517 if (include_terminated) {
518 add_to_list(registry->terminated_extensions(),
519 developer::EXTENSION_STATE_TERMINATED);
520 }
521
522 return list;
523 }
524
187 } // namespace 525 } // namespace
188 526
189 namespace AllowFileAccess = api::developer_private::AllowFileAccess; 527 namespace AllowFileAccess = api::developer_private::AllowFileAccess;
190 namespace AllowIncognito = api::developer_private::AllowIncognito; 528 namespace AllowIncognito = api::developer_private::AllowIncognito;
191 namespace ChoosePath = api::developer_private::ChoosePath; 529 namespace ChoosePath = api::developer_private::ChoosePath;
192 namespace GetItemsInfo = api::developer_private::GetItemsInfo; 530 namespace GetItemsInfo = api::developer_private::GetItemsInfo;
193 namespace Inspect = api::developer_private::Inspect; 531 namespace Inspect = api::developer_private::Inspect;
194 namespace PackDirectory = api::developer_private::PackDirectory; 532 namespace PackDirectory = api::developer_private::PackDirectory;
195 namespace Reload = api::developer_private::Reload; 533 namespace Reload = api::developer_private::Reload;
196 534
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 const content::NotificationDetails& details) { 587 const content::NotificationDetails& details) {
250 Profile* profile = content::Source<Profile>(source).ptr(); 588 Profile* profile = content::Source<Profile>(source).ptr();
251 CHECK(profile); 589 CHECK(profile);
252 CHECK(profile_->IsSameProfile(profile)); 590 CHECK(profile_->IsSameProfile(profile));
253 developer::EventData event_data; 591 developer::EventData event_data;
254 592
255 switch (type) { 593 switch (type) {
256 case extensions::NOTIFICATION_EXTENSION_VIEW_UNREGISTERED: { 594 case extensions::NOTIFICATION_EXTENSION_VIEW_UNREGISTERED: {
257 event_data.event_type = developer::EVENT_TYPE_VIEW_UNREGISTERED; 595 event_data.event_type = developer::EVENT_TYPE_VIEW_UNREGISTERED;
258 event_data.item_id = GetExtensionID( 596 event_data.item_id = GetExtensionID(
259 content::Details<const RenderViewHost>(details).ptr()); 597 content::Details<const content::RenderViewHost>(details).ptr());
260 break; 598 break;
261 } 599 }
262 case extensions::NOTIFICATION_EXTENSION_VIEW_REGISTERED: { 600 case extensions::NOTIFICATION_EXTENSION_VIEW_REGISTERED: {
263 event_data.event_type = developer::EVENT_TYPE_VIEW_REGISTERED; 601 event_data.event_type = developer::EVENT_TYPE_VIEW_REGISTERED;
264 event_data.item_id = GetExtensionID( 602 event_data.item_id = GetExtensionID(
265 content::Details<const RenderViewHost>(details).ptr()); 603 content::Details<const content::RenderViewHost>(details).ptr());
266 break; 604 break;
267 } 605 }
268 default: 606 default:
269 NOTREACHED(); 607 NOTREACHED();
270 return; 608 return;
271 } 609 }
272 610
273 BroadcastItemStateChanged(profile, event_data.event_type, event_data.item_id); 611 BroadcastItemStateChanged(profile, event_data.event_type, event_data.item_id);
274 } 612 }
275 613
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 bool DeveloperPrivateAutoUpdateFunction::RunSync() { 706 bool DeveloperPrivateAutoUpdateFunction::RunSync() {
369 ExtensionUpdater* updater = GetExtensionUpdater(GetProfile()); 707 ExtensionUpdater* updater = GetExtensionUpdater(GetProfile());
370 if (updater) 708 if (updater)
371 updater->CheckNow(ExtensionUpdater::CheckParams()); 709 updater->CheckNow(ExtensionUpdater::CheckParams());
372 SetResult(new base::FundamentalValue(true)); 710 SetResult(new base::FundamentalValue(true));
373 return true; 711 return true;
374 } 712 }
375 713
376 DeveloperPrivateAutoUpdateFunction::~DeveloperPrivateAutoUpdateFunction() {} 714 DeveloperPrivateAutoUpdateFunction::~DeveloperPrivateAutoUpdateFunction() {}
377 715
378 scoped_ptr<developer::ItemInfo> 716 DeveloperPrivateGetExtensionsInfoFunction::
379 DeveloperPrivateGetItemsInfoFunction::CreateItemInfo(const Extension& item, 717 ~DeveloperPrivateGetExtensionsInfoFunction() {
380 bool item_is_enabled) { 718 }
381 scoped_ptr<developer::ItemInfo> info(new developer::ItemInfo());
382 719
383 ExtensionSystem* system = ExtensionSystem::Get(GetProfile()); 720 ExtensionFunction::ResponseAction
384 ExtensionService* service = system->extension_service(); 721 DeveloperPrivateGetExtensionsInfoFunction::Run() {
385 ExtensionRegistry* registry = ExtensionRegistry::Get(GetProfile()); 722 scoped_ptr<developer::GetExtensionsInfo::Params> params(
723 developer::GetExtensionsInfo::Params::Create(*args_));
724 EXTENSION_FUNCTION_VALIDATE(params);
386 725
387 info->id = item.id(); 726 bool include_disabled = true;
388 info->name = item.name(); 727 bool include_terminated = true;
389 info->enabled = service->IsExtensionEnabled(info->id); 728 if (params->options) {
390 info->offline_enabled = OfflineEnabledInfo::IsOfflineEnabled(&item); 729 if (params->options->include_disabled)
391 info->version = item.VersionString(); 730 include_disabled = *params->options->include_disabled;
392 info->description = item.description(); 731 if (params->options->include_terminated)
393 732 include_terminated = *params->options->include_terminated;
394 if (item.is_app()) {
395 if (item.is_legacy_packaged_app())
396 info->type = developer::ITEM_TYPE_LEGACY_PACKAGED_APP;
397 else if (item.is_hosted_app())
398 info->type = developer::ITEM_TYPE_HOSTED_APP;
399 else if (item.is_platform_app())
400 info->type = developer::ITEM_TYPE_PACKAGED_APP;
401 else
402 NOTREACHED();
403 } else if (item.is_theme()) {
404 info->type = developer::ITEM_TYPE_THEME;
405 } else if (item.is_extension()) {
406 info->type = developer::ITEM_TYPE_EXTENSION;
407 } else {
408 NOTREACHED();
409 } 733 }
410 734
411 if (Manifest::IsUnpackedLocation(item.location())) { 735 std::vector<linked_ptr<developer::ExtensionInfo>> list =
412 info->path.reset( 736 GetExtensionsInfo(browser_context(),
413 new std::string(base::UTF16ToUTF8(item.path().LossyDisplayName()))); 737 include_disabled,
414 // If the ErrorConsole is enabled and the extension is unpacked, use the 738 include_terminated);
415 // more detailed errors from the ErrorConsole. Otherwise, use the install 739
416 // warnings (using both is redundant). 740 return RespondNow(ArgumentList(
417 ErrorConsole* error_console = ErrorConsole::Get(GetProfile()); 741 developer::GetExtensionsInfo::Results::Create(list)));
418 if (error_console->IsEnabledForAppsDeveloperTools() && 742 }
419 item.location() == Manifest::UNPACKED) { 743
420 const ErrorList& errors = error_console->GetErrorsForExtension(item.id()); 744 DeveloperPrivateGetExtensionInfoFunction::
421 if (!errors.empty()) { 745 ~DeveloperPrivateGetExtensionInfoFunction() {
422 for (ErrorList::const_iterator iter = errors.begin(); 746 }
423 iter != errors.end(); 747
424 ++iter) { 748 ExtensionFunction::ResponseAction
425 switch ((*iter)->type()) { 749 DeveloperPrivateGetExtensionInfoFunction::Run() {
426 case ExtensionError::MANIFEST_ERROR: 750 scoped_ptr<developer::GetExtensionInfo::Params> params(
427 info->manifest_errors.push_back( 751 developer::GetExtensionInfo::Params::Create(*args_));
428 make_linked_ptr((*iter)->ToValue().release())); 752 EXTENSION_FUNCTION_VALIDATE(params);
429 break; 753
430 case ExtensionError::RUNTIME_ERROR: { 754 ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context());
431 const RuntimeError* error = 755 developer::ExtensionState state = developer::EXTENSION_STATE_ENABLED;
432 static_cast<const RuntimeError*>(*iter); 756 const Extension* extension =
433 scoped_ptr<base::DictionaryValue> value = error->ToValue(); 757 registry->enabled_extensions().GetByID(params->id);
434 bool can_inspect = content::RenderViewHost::FromID( 758 if (!extension &&
435 error->render_process_id(), 759 (extension = registry->disabled_extensions().GetByID(params->id)) !=
436 error->render_view_id()) != NULL; 760 nullptr) {
437 value->SetBoolean("canInspect", can_inspect); 761 state = developer::EXTENSION_STATE_DISABLED;
438 info->runtime_errors.push_back(make_linked_ptr(value.release())); 762 } else if (!extension &&
439 break; 763 (extension =
440 } 764 registry->terminated_extensions().GetByID(params->id)) !=
441 case ExtensionError::NUM_ERROR_TYPES: 765 nullptr) {
442 NOTREACHED(); 766 state = developer::EXTENSION_STATE_TERMINATED;
443 break; 767 } else {
444 } 768 return RespondNow(Error(kNoSuchExtensionError));
445 } 769 }
446 } 770
447 } else { 771 return RespondNow(OneArgument(CreateExtensionInfo(
448 for (std::vector<InstallWarning>::const_iterator it = 772 *extension, state, browser_context())->ToValue().release()));
449 item.install_warnings().begin(); 773 }
450 it != item.install_warnings().end(); 774
451 ++it) { 775 DeveloperPrivateGetItemsInfoFunction::DeveloperPrivateGetItemsInfoFunction() {}
452 scoped_ptr<developer::InstallWarning> warning( 776 DeveloperPrivateGetItemsInfoFunction::~DeveloperPrivateGetItemsInfoFunction() {}
453 new developer::InstallWarning); 777
454 warning->message = it->message; 778 ExtensionFunction::ResponseAction DeveloperPrivateGetItemsInfoFunction::Run() {
455 info->install_warnings.push_back(make_linked_ptr(warning.release())); 779 scoped_ptr<developer::GetItemsInfo::Params> params(
456 } 780 developer::GetItemsInfo::Params::Create(*args_));
781 EXTENSION_FUNCTION_VALIDATE(params);
782
783 ExtensionSet items;
784 ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context());
785 items.InsertAll(registry->enabled_extensions());
786
787 if (params->include_disabled)
788 items.InsertAll(registry->disabled_extensions());
789 if (params->include_terminated)
790 items.InsertAll(registry->terminated_extensions());
791
792 std::map<std::string, ExtensionResource> resource_map;
793 for (const scoped_refptr<const Extension>& item : items) {
794 // Don't show component extensions and invisible apps.
795 if (ui_util::ShouldDisplayInExtensionSettings(item.get(),
796 browser_context())) {
797 resource_map[item->id()] =
798 IconsInfo::GetIconResource(item.get(),
799 extension_misc::EXTENSION_ICON_MEDIUM,
800 ExtensionIconSet::MATCH_BIGGER);
457 } 801 }
458 } 802 }
459 803
460 info->incognito_enabled = util::IsIncognitoEnabled(item.id(), GetProfile()); 804 std::vector<linked_ptr<developer::ExtensionInfo>> list =
461 info->wants_file_access = item.wants_file_access(); 805 GetExtensionsInfo(browser_context(),
462 info->allow_file_access = util::AllowFileAccess(item.id(), GetProfile()); 806 params->include_disabled,
463 info->allow_reload = Manifest::IsUnpackedLocation(item.location()); 807 params->include_terminated);
464 info->is_unpacked = Manifest::IsUnpackedLocation(item.location());
465 info->terminated = registry->terminated_extensions().Contains(item.id());
466 info->allow_incognito = item.can_be_incognito_enabled();
467 808
468 info->homepage_url.reset(new std::string( 809 for (const linked_ptr<developer::ExtensionInfo>& info : list)
469 ManifestURL::GetHomepageURL(&item).spec())); 810 item_list_.push_back(developer_private_mangle::MangleExtensionInfo(*info));
470 if (!OptionsPageInfo::GetOptionsPage(&item).is_empty()) {
471 info->options_url.reset(
472 new std::string(OptionsPageInfo::GetOptionsPage(&item).spec()));
473 }
474 811
475 if (!ManifestURL::GetUpdateURL(&item).is_empty()) { 812 content::BrowserThread::PostTask(
476 info->update_url.reset( 813 content::BrowserThread::FILE,
477 new std::string(ManifestURL::GetUpdateURL(&item).spec())); 814 FROM_HERE,
478 } 815 base::Bind(&DeveloperPrivateGetItemsInfoFunction::GetIconsOnFileThread,
816 this,
817 resource_map));
479 818
480 if (item.is_app()) { 819 return RespondLater();
481 info->app_launch_url.reset(
482 new std::string(AppLaunchInfo::GetFullLaunchURL(&item).spec()));
483 }
484
485 info->may_disable = system->management_policy()->
486 UserMayModifySettings(&item, NULL);
487 info->is_app = item.is_app();
488 info->views = GetInspectablePagesForExtension(&item, item_is_enabled);
489
490 return info.Pass();
491 } 820 }
492 821
493 void DeveloperPrivateGetItemsInfoFunction::GetIconsOnFileThread( 822 void DeveloperPrivateGetItemsInfoFunction::GetIconsOnFileThread(
494 ItemInfoList item_list, 823 const std::map<std::string, ExtensionResource> resource_map) {
495 const std::map<std::string, ExtensionResource> idToIcon) { 824 for (const linked_ptr<developer::ItemInfo>& item : item_list_) {
496 for (ItemInfoList::iterator iter = item_list.begin(); 825 auto resource = resource_map.find(item->id);
497 iter != item_list.end(); ++iter) { 826 if (resource != resource_map.end()) {
498 developer_private::ItemInfo* info = iter->get(); 827 item->icon_url = ToDataURL(resource->second.GetFilePath(),
499 std::map<std::string, ExtensionResource>::const_iterator resource_ptr 828 item->type).spec();
500 = idToIcon.find(info->id);
501 if (resource_ptr != idToIcon.end()) {
502 info->icon_url =
503 ToDataURL(resource_ptr->second.GetFilePath(), info->type).spec();
504 } 829 }
505 } 830 }
506 831
507 results_ = developer::GetItemsInfo::Results::Create(item_list); 832 content::BrowserThread::PostTask(
508 content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, 833 content::BrowserThread::UI,
509 base::Bind(&DeveloperPrivateGetItemsInfoFunction::SendResponse, 834 FROM_HERE,
510 this, 835 base::Bind(&DeveloperPrivateGetItemsInfoFunction::Finish, this));
511 true));
512 } 836 }
513 837
514 void DeveloperPrivateGetItemsInfoFunction:: 838 void DeveloperPrivateGetItemsInfoFunction::Finish() {
515 GetInspectablePagesForExtensionProcess( 839 Respond(ArgumentList(developer::GetItemsInfo::Results::Create(item_list_)));
516 const Extension* extension,
517 const std::set<content::RenderViewHost*>& views,
518 ItemInspectViewList* result) {
519 bool has_generated_background_page =
520 BackgroundInfo::HasGeneratedBackgroundPage(extension);
521 for (std::set<content::RenderViewHost*>::const_iterator iter = views.begin();
522 iter != views.end(); ++iter) {
523 content::RenderViewHost* host = *iter;
524 content::WebContents* web_contents =
525 content::WebContents::FromRenderViewHost(host);
526 ViewType host_type = GetViewType(web_contents);
527 if (VIEW_TYPE_EXTENSION_POPUP == host_type ||
528 VIEW_TYPE_EXTENSION_DIALOG == host_type)
529 continue;
530
531 content::RenderProcessHost* process = host->GetProcess();
532 bool is_background_page =
533 (web_contents->GetURL() == BackgroundInfo::GetBackgroundURL(extension));
534 result->push_back(constructInspectView(
535 web_contents->GetURL(),
536 process->GetID(),
537 host->GetRoutingID(),
538 process->GetBrowserContext()->IsOffTheRecord(),
539 is_background_page && has_generated_background_page));
540 }
541 } 840 }
542 841
543 void DeveloperPrivateGetItemsInfoFunction::GetAppWindowPagesForExtensionProfile(
544 const Extension* extension,
545 ItemInspectViewList* result) {
546 AppWindowRegistry* registry = AppWindowRegistry::Get(GetProfile());
547 if (!registry) return;
548
549 const AppWindowRegistry::AppWindowList windows =
550 registry->GetAppWindowsForApp(extension->id());
551
552 bool has_generated_background_page =
553 BackgroundInfo::HasGeneratedBackgroundPage(extension);
554 for (AppWindowRegistry::const_iterator it = windows.begin();
555 it != windows.end();
556 ++it) {
557 content::WebContents* web_contents = (*it)->web_contents();
558 RenderViewHost* host = web_contents->GetRenderViewHost();
559 content::RenderProcessHost* process = host->GetProcess();
560 bool is_background_page =
561 (web_contents->GetURL() == BackgroundInfo::GetBackgroundURL(extension));
562 result->push_back(constructInspectView(
563 web_contents->GetURL(),
564 process->GetID(),
565 host->GetRoutingID(),
566 process->GetBrowserContext()->IsOffTheRecord(),
567 is_background_page && has_generated_background_page));
568 }
569 }
570
571 linked_ptr<developer::ItemInspectView> DeveloperPrivateGetItemsInfoFunction::
572 constructInspectView(
573 const GURL& url,
574 int render_process_id,
575 int render_view_id,
576 bool incognito,
577 bool generated_background_page) {
578 linked_ptr<developer::ItemInspectView> view(new developer::ItemInspectView());
579
580 if (url.scheme() == kExtensionScheme) {
581 // No leading slash.
582 view->path = url.path().substr(1);
583 } else {
584 // For live pages, use the full URL.
585 view->path = url.spec();
586 }
587
588 view->render_process_id = render_process_id;
589 view->render_view_id = render_view_id;
590 view->incognito = incognito;
591 view->generated_background_page = generated_background_page;
592 return view;
593 }
594
595 ItemInspectViewList DeveloperPrivateGetItemsInfoFunction::
596 GetInspectablePagesForExtension(
597 const Extension* extension,
598 bool extension_is_enabled) {
599 ItemInspectViewList result;
600 // Get the extension process's active views.
601 ProcessManager* process_manager = ProcessManager::Get(GetProfile());
602 GetInspectablePagesForExtensionProcess(
603 extension,
604 process_manager->GetRenderViewHostsForExtension(extension->id()),
605 &result);
606
607 // Get app window views.
608 GetAppWindowPagesForExtensionProfile(extension, &result);
609
610 // Include a link to start the lazy background page, if applicable.
611 if (BackgroundInfo::HasLazyBackgroundPage(extension) &&
612 extension_is_enabled &&
613 !process_manager->GetBackgroundHostForExtension(extension->id())) {
614 result.push_back(constructInspectView(
615 BackgroundInfo::GetBackgroundURL(extension),
616 -1,
617 -1,
618 false,
619 BackgroundInfo::HasGeneratedBackgroundPage(extension)));
620 }
621
622 ExtensionService* service = GetExtensionService(GetProfile());
623 // Repeat for the incognito process, if applicable. Don't try to get
624 // app windows for incognito process.
625 if (service->profile()->HasOffTheRecordProfile() &&
626 IncognitoInfo::IsSplitMode(extension)) {
627 process_manager =
628 ProcessManager::Get(service->profile()->GetOffTheRecordProfile());
629 GetInspectablePagesForExtensionProcess(
630 extension,
631 process_manager->GetRenderViewHostsForExtension(extension->id()),
632 &result);
633
634 if (BackgroundInfo::HasLazyBackgroundPage(extension) &&
635 extension_is_enabled &&
636 !process_manager->GetBackgroundHostForExtension(extension->id())) {
637 result.push_back(constructInspectView(
638 BackgroundInfo::GetBackgroundURL(extension),
639 -1,
640 -1,
641 false,
642 BackgroundInfo::HasGeneratedBackgroundPage(extension)));
643 }
644 }
645
646 return result;
647 }
648
649 bool DeveloperPrivateGetItemsInfoFunction::RunAsync() {
650 scoped_ptr<developer::GetItemsInfo::Params> params(
651 developer::GetItemsInfo::Params::Create(*args_));
652 EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
653
654 bool include_disabled = params->include_disabled;
655 bool include_terminated = params->include_terminated;
656
657 ExtensionSet items;
658
659 ExtensionRegistry* registry = ExtensionRegistry::Get(GetProfile());
660
661 items.InsertAll(registry->enabled_extensions());
662
663 if (include_disabled) {
664 items.InsertAll(registry->disabled_extensions());
665 }
666
667 if (include_terminated) {
668 items.InsertAll(registry->terminated_extensions());
669 }
670
671 ExtensionService* service =
672 ExtensionSystem::Get(GetProfile())->extension_service();
673 std::map<std::string, ExtensionResource> id_to_icon;
674 ItemInfoList item_list;
675
676 for (ExtensionSet::const_iterator iter = items.begin(); iter != items.end();
677 ++iter) {
678 const Extension& item = *iter->get();
679
680 ExtensionResource item_resource =
681 IconsInfo::GetIconResource(&item,
682 extension_misc::EXTENSION_ICON_MEDIUM,
683 ExtensionIconSet::MATCH_BIGGER);
684 id_to_icon[item.id()] = item_resource;
685
686 // Don't show component extensions and invisible apps.
687 if (ui_util::ShouldNotBeVisible(&item, GetProfile()))
688 continue;
689
690 item_list.push_back(make_linked_ptr<developer::ItemInfo>(
691 CreateItemInfo(
692 item, service->IsExtensionEnabled(item.id())).release()));
693 }
694
695 content::BrowserThread::PostTask(content::BrowserThread::FILE, FROM_HERE,
696 base::Bind(&DeveloperPrivateGetItemsInfoFunction::GetIconsOnFileThread,
697 this,
698 item_list,
699 id_to_icon));
700
701 return true;
702 }
703
704 DeveloperPrivateGetItemsInfoFunction::~DeveloperPrivateGetItemsInfoFunction() {}
705
706 ExtensionFunction::ResponseAction 842 ExtensionFunction::ResponseAction
707 DeveloperPrivateAllowFileAccessFunction::Run() { 843 DeveloperPrivateAllowFileAccessFunction::Run() {
708 scoped_ptr<AllowFileAccess::Params> params( 844 scoped_ptr<AllowFileAccess::Params> params(
709 AllowFileAccess::Params::Create(*args_)); 845 AllowFileAccess::Params::Create(*args_));
710 EXTENSION_FUNCTION_VALIDATE(params.get()); 846 EXTENSION_FUNCTION_VALIDATE(params.get());
711 847
712 const Extension* extension = GetExtensionById(params->extension_id); 848 const Extension* extension = GetExtensionById(params->extension_id);
713 849
714 if (!extension) 850 if (!extension)
715 return RespondNow(Error(kNoSuchExtensionError)); 851 return RespondNow(Error(kNoSuchExtensionError));
(...skipping 761 matching lines...) Expand 10 before | Expand all | Expand 10 after
1477 1613
1478 TabStripModel* tab_strip = browser->tab_strip_model(); 1614 TabStripModel* tab_strip = browser->tab_strip_model();
1479 tab_strip->ActivateTabAt(tab_strip->GetIndexOfWebContents(web_contents), 1615 tab_strip->ActivateTabAt(tab_strip->GetIndexOfWebContents(web_contents),
1480 false); // Not through direct user gesture. 1616 false); // Not through direct user gesture.
1481 return RespondNow(NoArguments()); 1617 return RespondNow(NoArguments());
1482 } 1618 }
1483 1619
1484 } // namespace api 1620 } // namespace api
1485 1621
1486 } // namespace extensions 1622 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698