Index: chrome/browser/extensions/api/runtime/runtime_api.cc |
diff --git a/chrome/browser/extensions/api/runtime/runtime_api.cc b/chrome/browser/extensions/api/runtime/runtime_api.cc |
deleted file mode 100644 |
index fbb35ed0d676627af9358e0aed455a08ffa6bc79..0000000000000000000000000000000000000000 |
--- a/chrome/browser/extensions/api/runtime/runtime_api.cc |
+++ /dev/null |
@@ -1,678 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/extensions/api/runtime/runtime_api.h" |
- |
-#include <utility> |
- |
-#include "base/lazy_instance.h" |
-#include "base/logging.h" |
-#include "base/memory/scoped_ptr.h" |
-#include "base/metrics/histogram.h" |
-#include "base/values.h" |
-#include "chrome/browser/browser_process.h" |
-#include "chrome/browser/chrome_notification_types.h" |
-#include "chrome/browser/extensions/extension_service.h" |
-#include "chrome/browser/extensions/extension_warning_service.h" |
-#include "chrome/browser/extensions/updater/extension_updater.h" |
-#include "chrome/browser/omaha_query_params/omaha_query_params.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/profiles/profile_manager.h" |
-#include "chrome/browser/ui/browser_finder.h" |
-#include "chrome/browser/ui/browser_navigator.h" |
-#include "chrome/browser/ui/browser_window.h" |
-#include "chrome/common/extensions/api/runtime.h" |
-#include "content/public/browser/child_process_security_policy.h" |
-#include "content/public/browser/notification_service.h" |
-#include "content/public/browser/render_process_host.h" |
-#include "content/public/browser/render_view_host.h" |
-#include "extensions/browser/event_router.h" |
-#include "extensions/browser/extension_host.h" |
-#include "extensions/browser/extension_registry.h" |
-#include "extensions/browser/extension_system.h" |
-#include "extensions/browser/extensions_browser_client.h" |
-#include "extensions/browser/lazy_background_task_queue.h" |
-#include "extensions/browser/process_manager.h" |
-#include "extensions/common/error_utils.h" |
-#include "extensions/common/extension.h" |
-#include "extensions/common/manifest_handlers/background_info.h" |
-#include "url/gurl.h" |
-#include "webkit/browser/fileapi/isolated_context.h" |
- |
-#if defined(OS_CHROMEOS) |
-#include "chrome/browser/chromeos/login/user_manager.h" |
-#include "chromeos/dbus/dbus_thread_manager.h" |
-#include "chromeos/dbus/power_manager_client.h" |
-#endif |
- |
-using content::BrowserContext; |
- |
-namespace GetPlatformInfo = extensions::api::runtime::GetPlatformInfo; |
- |
-namespace extensions { |
- |
-namespace runtime = api::runtime; |
- |
-namespace { |
- |
-const char kNoBackgroundPageError[] = "You do not have a background page."; |
-const char kPageLoadError[] = "Background page failed to load."; |
-const char kInstallReason[] = "reason"; |
-const char kInstallReasonChromeUpdate[] = "chrome_update"; |
-const char kInstallReasonUpdate[] = "update"; |
-const char kInstallReasonInstall[] = "install"; |
-const char kInstallPreviousVersion[] = "previousVersion"; |
-const char kInvalidUrlError[] = "Invalid URL."; |
-const char kUpdatesDisabledError[] = "Autoupdate is not enabled."; |
-const char kUpdateFound[] = "update_available"; |
-const char kUpdateNotFound[] = "no_update"; |
-const char kUpdateThrottled[] = "throttled"; |
- |
-// A preference key storing the url loaded when an extension is uninstalled. |
-const char kUninstallUrl[] = "uninstall_url"; |
- |
-// The name of the directory to be returned by getPackageDirectoryEntry. This |
-// particular value does not matter to user code, but is chosen for consistency |
-// with the equivalent Pepper API. |
-const char kPackageDirectoryPath[] = "crxfs"; |
- |
-// If an extension reloads itself within this many miliseconds of reloading |
-// itself, the reload is considered suspiciously fast. |
-const int kFastReloadTime = 10000; |
- |
-// After this many suspiciously fast consecutive reloads, an extension will get |
-// disabled. |
-const int kFastReloadCount = 5; |
- |
-void DispatchOnStartupEventImpl(BrowserContext* browser_context, |
- const std::string& extension_id, |
- bool first_call, |
- ExtensionHost* host) { |
- // A NULL host from the LazyBackgroundTaskQueue means the page failed to |
- // load. Give up. |
- if (!host && !first_call) |
- return; |
- |
- // Don't send onStartup events to incognito browser contexts. |
- if (browser_context->IsOffTheRecord()) |
- return; |
- |
- if (ExtensionsBrowserClient::Get()->IsShuttingDown() || |
- !ExtensionsBrowserClient::Get()->IsValidContext(browser_context)) |
- return; |
- ExtensionSystem* system = ExtensionSystem::Get(browser_context); |
- if (!system) |
- return; |
- |
- // If this is a persistent background page, we want to wait for it to load |
- // (it might not be ready, since this is startup). But only enqueue once. |
- // If it fails to load the first time, don't bother trying again. |
- const Extension* extension = |
- ExtensionRegistry::Get(browser_context)->enabled_extensions().GetByID( |
- extension_id); |
- if (extension && BackgroundInfo::HasPersistentBackgroundPage(extension) && |
- first_call && |
- system->lazy_background_task_queue()-> |
- ShouldEnqueueTask(browser_context, extension)) { |
- system->lazy_background_task_queue()->AddPendingTask( |
- browser_context, extension_id, |
- base::Bind(&DispatchOnStartupEventImpl, |
- browser_context, extension_id, false)); |
- return; |
- } |
- |
- scoped_ptr<base::ListValue> event_args(new base::ListValue()); |
- scoped_ptr<Event> event(new Event(runtime::OnStartup::kEventName, |
- event_args.Pass())); |
- system->event_router()->DispatchEventToExtension(extension_id, event.Pass()); |
-} |
- |
-void SetUninstallURL(ExtensionPrefs* prefs, |
- const std::string& extension_id, |
- const std::string& url_string) { |
- prefs->UpdateExtensionPref(extension_id, |
- kUninstallUrl, |
- new base::StringValue(url_string)); |
-} |
- |
-#if defined(ENABLE_EXTENSIONS) |
-std::string GetUninstallURL(ExtensionPrefs* prefs, |
- const std::string& extension_id) { |
- std::string url_string; |
- prefs->ReadPrefAsString(extension_id, kUninstallUrl, &url_string); |
- return url_string; |
-} |
-#endif // defined(ENABLE_EXTENSIONS) |
- |
-} // namespace |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-static base::LazyInstance<BrowserContextKeyedAPIFactory<RuntimeAPI> > |
- g_factory = LAZY_INSTANCE_INITIALIZER; |
- |
-// static |
-BrowserContextKeyedAPIFactory<RuntimeAPI>* RuntimeAPI::GetFactoryInstance() { |
- return g_factory.Pointer(); |
-} |
- |
-RuntimeAPI::RuntimeAPI(content::BrowserContext* context) |
- : browser_context_(context), |
- dispatch_chrome_updated_event_(false), |
- registered_for_updates_(false) { |
- registrar_.Add(this, chrome::NOTIFICATION_EXTENSIONS_READY, |
- content::Source<BrowserContext>(context)); |
- registrar_.Add(this, |
- chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED, |
- content::Source<BrowserContext>(context)); |
- registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_INSTALLED, |
- content::Source<BrowserContext>(context)); |
- registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNINSTALLED, |
- content::Source<BrowserContext>(context)); |
- |
- // Check if registered events are up-to-date. We can only do this once |
- // per browser context, since it updates internal state when called. |
- dispatch_chrome_updated_event_ = |
- ExtensionsBrowserClient::Get()->DidVersionUpdate(browser_context_); |
-} |
- |
-RuntimeAPI::~RuntimeAPI() { |
- if (registered_for_updates_) { |
- ExtensionSystem::Get(browser_context_)-> |
- extension_service()->RemoveUpdateObserver(this); |
- } |
-} |
- |
-void RuntimeAPI::Observe(int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) { |
- switch (type) { |
- case chrome::NOTIFICATION_EXTENSIONS_READY: { |
- OnExtensionsReady(); |
- break; |
- } |
- case chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED: { |
- const Extension* extension = |
- content::Details<const Extension>(details).ptr(); |
- OnExtensionLoaded(extension); |
- break; |
- } |
- case chrome::NOTIFICATION_EXTENSION_INSTALLED: { |
- const Extension* extension = |
- content::Details<const InstalledExtensionInfo>(details)->extension; |
- OnExtensionInstalled(extension); |
- break; |
- } |
- case chrome::NOTIFICATION_EXTENSION_UNINSTALLED: { |
- const Extension* extension = |
- content::Details<const Extension>(details).ptr(); |
- OnExtensionUninstalled(extension); |
- break; |
- } |
- default: |
- NOTREACHED(); |
- break; |
- } |
-} |
- |
-void RuntimeAPI::OnExtensionsReady() { |
- // We're done restarting Chrome after an update. |
- dispatch_chrome_updated_event_ = false; |
- |
- registered_for_updates_ = true; |
- |
- ExtensionSystem* extension_system = ExtensionSystem::Get(browser_context_); |
- extension_system->extension_service()->AddUpdateObserver(this); |
- |
- // RuntimeAPI is redirected in incognito, so |browser_context_| is never |
- // incognito. We don't observe incognito ProcessManagers but that is OK |
- // because we don't send onStartup events to incognito browser contexts. |
- DCHECK(!browser_context_->IsOffTheRecord()); |
- // Some tests use partially constructed Profiles without a process manager. |
- if (extension_system->process_manager()) |
- extension_system->process_manager()->AddObserver(this); |
-} |
- |
-void RuntimeAPI::OnExtensionLoaded(const Extension* extension) { |
- if (!dispatch_chrome_updated_event_) |
- return; |
- |
- // Dispatch the onInstalled event with reason "chrome_update". |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind(&RuntimeEventRouter::DispatchOnInstalledEvent, |
- browser_context_, |
- extension->id(), |
- Version(), |
- true)); |
-} |
- |
-void RuntimeAPI::OnExtensionInstalled(const Extension* extension) { |
- // Ephemeral apps are not considered to be installed and do not receive |
- // the onInstalled() event. |
- if (extension->is_ephemeral()) |
- return; |
- |
- // Get the previous version to check if this is an upgrade. |
- ExtensionService* service = ExtensionSystem::Get( |
- browser_context_)->extension_service(); |
- const Extension* old = service->GetExtensionById(extension->id(), true); |
- Version old_version; |
- if (old) |
- old_version = *old->version(); |
- |
- // Dispatch the onInstalled event. |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind(&RuntimeEventRouter::DispatchOnInstalledEvent, |
- browser_context_, |
- extension->id(), |
- old_version, |
- false)); |
- |
-} |
- |
-void RuntimeAPI::OnExtensionUninstalled(const Extension* extension) { |
- // Ephemeral apps are not considered to be installed, so the uninstall URL |
- // is not invoked when they are removed. |
- if (extension->is_ephemeral()) |
- return; |
- |
- Profile* profile = Profile::FromBrowserContext(browser_context_); |
- RuntimeEventRouter::OnExtensionUninstalled(profile, extension->id()); |
-} |
- |
-void RuntimeAPI::Shutdown() { |
- // ExtensionSystem deletes its ProcessManager during the Shutdown() phase, so |
- // the observer must be removed here and not in the RuntimeAPI destructor. |
- ProcessManager* process_manager = |
- ExtensionSystem::Get(browser_context_)->process_manager(); |
- // Some tests use partially constructed Profiles without a process manager. |
- if (process_manager) |
- process_manager->RemoveObserver(this); |
-} |
- |
-void RuntimeAPI::OnAppUpdateAvailable(const Extension* extension) { |
- Profile* profile = Profile::FromBrowserContext(browser_context_); |
- RuntimeEventRouter::DispatchOnUpdateAvailableEvent( |
- profile, extension->id(), extension->manifest()->value()); |
-} |
- |
-void RuntimeAPI::OnChromeUpdateAvailable() { |
- Profile* profile = Profile::FromBrowserContext(browser_context_); |
- RuntimeEventRouter::DispatchOnBrowserUpdateAvailableEvent(profile); |
-} |
- |
-void RuntimeAPI::OnBackgroundHostStartup(const Extension* extension) { |
- RuntimeEventRouter::DispatchOnStartupEvent(browser_context_, extension->id()); |
-} |
- |
-void RuntimeAPI::MaybeReloadExtension(const std::string& extension_id) { |
- std::pair<base::TimeTicks, int>& reload_info = |
- last_reload_time_[extension_id]; |
- base::TimeTicks now = base::TimeTicks::Now(); |
- if (reload_info.first.is_null() || |
- (now - reload_info.first).InMilliseconds() > kFastReloadTime) { |
- reload_info.second = 0; |
- } else { |
- reload_info.second++; |
- } |
- if (!reload_info.first.is_null()) { |
- UMA_HISTOGRAM_LONG_TIMES("Extensions.RuntimeReloadTime", |
- now - reload_info.first); |
- } |
- UMA_HISTOGRAM_COUNTS_100("Extensions.RuntimeReloadFastCount", |
- reload_info.second); |
- reload_info.first = now; |
- |
- ExtensionService* service = |
- ExtensionSystem::Get(browser_context_)->extension_service(); |
- if (reload_info.second >= kFastReloadCount) { |
- // Unloading an extension clears all warnings, so first terminate the |
- // extension, and then add the warning. Since this is called from an |
- // extension function unloading the extension has to be done |
- // asynchronously. Fortunately PostTask guarentees FIFO order so just |
- // post both tasks. |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind(&ExtensionService::TerminateExtension, |
- service->AsWeakPtr(), |
- extension_id)); |
- ExtensionWarningSet warnings; |
- warnings.insert( |
- ExtensionWarning::CreateReloadTooFrequentWarning(extension_id)); |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind(&ExtensionWarningService::NotifyWarningsOnUI, |
- browser_context_, |
- warnings)); |
- } else { |
- // We can't call ReloadExtension directly, since when this method finishes |
- // it tries to decrease the reference count for the extension, which fails |
- // if the extension has already been reloaded; so instead we post a task. |
- base::MessageLoop::current()->PostTask( |
- FROM_HERE, |
- base::Bind(&ExtensionService::ReloadExtension, |
- service->AsWeakPtr(), |
- extension_id)); |
- } |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////// |
- |
-// static |
-void RuntimeEventRouter::DispatchOnStartupEvent( |
- content::BrowserContext* context, const std::string& extension_id) { |
- DispatchOnStartupEventImpl(context, extension_id, true, NULL); |
-} |
- |
-// static |
-void RuntimeEventRouter::DispatchOnInstalledEvent( |
- content::BrowserContext* context, |
- const std::string& extension_id, |
- const Version& old_version, |
- bool chrome_updated) { |
- if (!ExtensionsBrowserClient::Get()->IsValidContext(context)) |
- return; |
- ExtensionSystem* system = ExtensionSystem::Get(context); |
- if (!system) |
- return; |
- |
- scoped_ptr<base::ListValue> event_args(new base::ListValue()); |
- base::DictionaryValue* info = new base::DictionaryValue(); |
- event_args->Append(info); |
- if (old_version.IsValid()) { |
- info->SetString(kInstallReason, kInstallReasonUpdate); |
- info->SetString(kInstallPreviousVersion, old_version.GetString()); |
- } else if (chrome_updated) { |
- info->SetString(kInstallReason, kInstallReasonChromeUpdate); |
- } else { |
- info->SetString(kInstallReason, kInstallReasonInstall); |
- } |
- DCHECK(system->event_router()); |
- scoped_ptr<Event> event(new Event(runtime::OnInstalled::kEventName, |
- event_args.Pass())); |
- system->event_router()->DispatchEventWithLazyListener(extension_id, |
- event.Pass()); |
-} |
- |
-// static |
-void RuntimeEventRouter::DispatchOnUpdateAvailableEvent( |
- Profile* profile, |
- const std::string& extension_id, |
- const base::DictionaryValue* manifest) { |
- ExtensionSystem* system = ExtensionSystem::Get(profile); |
- if (!system) |
- return; |
- |
- scoped_ptr<base::ListValue> args(new base::ListValue); |
- args->Append(manifest->DeepCopy()); |
- DCHECK(system->event_router()); |
- scoped_ptr<Event> event(new Event(runtime::OnUpdateAvailable::kEventName, |
- args.Pass())); |
- system->event_router()->DispatchEventToExtension(extension_id, event.Pass()); |
-} |
- |
-// static |
-void RuntimeEventRouter::DispatchOnBrowserUpdateAvailableEvent( |
- Profile* profile) { |
- ExtensionSystem* system = ExtensionSystem::Get(profile); |
- if (!system) |
- return; |
- |
- scoped_ptr<base::ListValue> args(new base::ListValue); |
- DCHECK(system->event_router()); |
- scoped_ptr<Event> event(new Event( |
- runtime::OnBrowserUpdateAvailable::kEventName, args.Pass())); |
- system->event_router()->BroadcastEvent(event.Pass()); |
-} |
- |
-// static |
-void RuntimeEventRouter::DispatchOnRestartRequiredEvent( |
- Profile* profile, |
- const std::string& app_id, |
- api::runtime::OnRestartRequired::Reason reason) { |
- ExtensionSystem* system = ExtensionSystem::Get(profile); |
- if (!system) |
- return; |
- |
- scoped_ptr<Event> event( |
- new Event(runtime::OnRestartRequired::kEventName, |
- api::runtime::OnRestartRequired::Create(reason))); |
- |
- DCHECK(system->event_router()); |
- system->event_router()->DispatchEventToExtension(app_id, event.Pass()); |
-} |
- |
-// static |
-void RuntimeEventRouter::OnExtensionUninstalled( |
- Profile* profile, |
- const std::string& extension_id) { |
-#if defined(ENABLE_EXTENSIONS) |
- GURL uninstall_url(GetUninstallURL(ExtensionPrefs::Get(profile), |
- extension_id)); |
- |
- if (uninstall_url.is_empty()) |
- return; |
- |
- Browser* browser = chrome::FindLastActiveWithProfile(profile, |
- chrome::GetActiveDesktop()); |
- if (!browser) |
- browser = new Browser(Browser::CreateParams(profile, |
- chrome::GetActiveDesktop())); |
- |
- chrome::NavigateParams params(browser, uninstall_url, |
- content::PAGE_TRANSITION_CLIENT_REDIRECT); |
- params.disposition = NEW_FOREGROUND_TAB; |
- params.user_gesture = false; |
- chrome::Navigate(¶ms); |
-#endif // defined(ENABLE_EXTENSIONS) |
-} |
- |
-bool RuntimeGetBackgroundPageFunction::RunAsync() { |
- ExtensionSystem* system = ExtensionSystem::Get(GetProfile()); |
- ExtensionHost* host = system->process_manager()-> |
- GetBackgroundHostForExtension(extension_id()); |
- if (system->lazy_background_task_queue()->ShouldEnqueueTask(GetProfile(), |
- GetExtension())) { |
- system->lazy_background_task_queue()->AddPendingTask( |
- GetProfile(), |
- extension_id(), |
- base::Bind(&RuntimeGetBackgroundPageFunction::OnPageLoaded, this)); |
- } else if (host) { |
- OnPageLoaded(host); |
- } else { |
- error_ = kNoBackgroundPageError; |
- return false; |
- } |
- |
- return true; |
-} |
- |
-void RuntimeGetBackgroundPageFunction::OnPageLoaded(ExtensionHost* host) { |
- if (host) { |
- SendResponse(true); |
- } else { |
- error_ = kPageLoadError; |
- SendResponse(false); |
- } |
-} |
- |
-bool RuntimeSetUninstallURLFunction::RunSync() { |
- std::string url_string; |
- EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &url_string)); |
- |
- GURL url(url_string); |
- if (!url.is_valid()) { |
- error_ = ErrorUtils::FormatErrorMessage(kInvalidUrlError, url_string); |
- return false; |
- } |
- |
- SetUninstallURL( |
- ExtensionPrefs::Get(GetProfile()), extension_id(), url_string); |
- return true; |
-} |
- |
-bool RuntimeReloadFunction::RunSync() { |
- RuntimeAPI::GetFactoryInstance()->Get(GetProfile())->MaybeReloadExtension( |
- extension_id()); |
- return true; |
-} |
- |
-RuntimeRequestUpdateCheckFunction::RuntimeRequestUpdateCheckFunction() { |
- registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UPDATE_FOUND, |
- content::NotificationService::AllSources()); |
-} |
- |
-bool RuntimeRequestUpdateCheckFunction::RunAsync() { |
- ExtensionSystem* system = ExtensionSystem::Get(GetProfile()); |
- ExtensionService* service = system->extension_service(); |
- ExtensionUpdater* updater = service->updater(); |
- if (!updater) { |
- error_ = kUpdatesDisabledError; |
- return false; |
- } |
- |
- did_reply_ = false; |
- if (!updater->CheckExtensionSoon(extension_id(), base::Bind( |
- &RuntimeRequestUpdateCheckFunction::CheckComplete, this))) { |
- did_reply_ = true; |
- SetResult(new base::StringValue(kUpdateThrottled)); |
- SendResponse(true); |
- } |
- return true; |
-} |
- |
-void RuntimeRequestUpdateCheckFunction::CheckComplete() { |
- if (did_reply_) |
- return; |
- |
- did_reply_ = true; |
- |
- // Since no UPDATE_FOUND notification was seen, this generally would mean |
- // that no update is found, but a previous update check might have already |
- // queued up an update, so check for that here to make sure we return the |
- // right value. |
- ExtensionSystem* system = ExtensionSystem::Get(GetProfile()); |
- ExtensionService* service = system->extension_service(); |
- const Extension* update = service->GetPendingExtensionUpdate(extension_id()); |
- if (update) { |
- ReplyUpdateFound(update->VersionString()); |
- } else { |
- SetResult(new base::StringValue(kUpdateNotFound)); |
- } |
- SendResponse(true); |
-} |
- |
-void RuntimeRequestUpdateCheckFunction::Observe( |
- int type, |
- const content::NotificationSource& source, |
- const content::NotificationDetails& details) { |
- if (did_reply_) |
- return; |
- |
- DCHECK(type == chrome::NOTIFICATION_EXTENSION_UPDATE_FOUND); |
- typedef const std::pair<std::string, Version> UpdateDetails; |
- const std::string& id = content::Details<UpdateDetails>(details)->first; |
- const Version& version = content::Details<UpdateDetails>(details)->second; |
- if (id == extension_id()) { |
- ReplyUpdateFound(version.GetString()); |
- } |
-} |
- |
-void RuntimeRequestUpdateCheckFunction::ReplyUpdateFound( |
- const std::string& version) { |
- did_reply_ = true; |
- results_.reset(new base::ListValue); |
- results_->AppendString(kUpdateFound); |
- base::DictionaryValue* details = new base::DictionaryValue; |
- results_->Append(details); |
- details->SetString("version", version); |
- SendResponse(true); |
-} |
- |
-bool RuntimeRestartFunction::RunSync() { |
-#if defined(OS_CHROMEOS) |
- if (chromeos::UserManager::Get()->IsLoggedInAsKioskApp()) { |
- chromeos::DBusThreadManager::Get() |
- ->GetPowerManagerClient() |
- ->RequestRestart(); |
- return true; |
- } |
-#endif |
- SetError("Function available only for ChromeOS kiosk mode."); |
- return false; |
-} |
- |
-bool RuntimeGetPlatformInfoFunction::RunSync() { |
- GetPlatformInfo::Results::PlatformInfo info; |
- |
- const char* os = chrome::OmahaQueryParams::GetOS(); |
- if (strcmp(os, "mac") == 0) { |
- info.os = GetPlatformInfo::Results::PlatformInfo::OS_MAC_; |
- } else if (strcmp(os, "win") == 0) { |
- info.os = GetPlatformInfo::Results::PlatformInfo::OS_WIN_; |
- } else if (strcmp(os, "android") == 0) { |
- info.os = GetPlatformInfo::Results::PlatformInfo::OS_ANDROID_; |
- } else if (strcmp(os, "cros") == 0) { |
- info.os = GetPlatformInfo::Results::PlatformInfo::OS_CROS_; |
- } else if (strcmp(os, "linux") == 0) { |
- info.os = GetPlatformInfo::Results::PlatformInfo::OS_LINUX_; |
- } else if (strcmp(os, "openbsd") == 0) { |
- info.os = GetPlatformInfo::Results::PlatformInfo::OS_OPENBSD_; |
- } else { |
- NOTREACHED(); |
- return false; |
- } |
- |
- const char* arch = chrome::OmahaQueryParams::GetArch(); |
- if (strcmp(arch, "arm") == 0) { |
- info.arch = GetPlatformInfo::Results::PlatformInfo::ARCH_ARM; |
- } else if (strcmp(arch, "x86") == 0) { |
- info.arch = GetPlatformInfo::Results::PlatformInfo::ARCH_X86_32; |
- } else if (strcmp(arch, "x64") == 0) { |
- info.arch = GetPlatformInfo::Results::PlatformInfo::ARCH_X86_64; |
- } else { |
- NOTREACHED(); |
- return false; |
- } |
- |
- const char* nacl_arch = chrome::OmahaQueryParams::GetNaclArch(); |
- if (strcmp(nacl_arch, "arm") == 0) { |
- info.nacl_arch = GetPlatformInfo::Results::PlatformInfo::NACL_ARCH_ARM; |
- } else if (strcmp(nacl_arch, "x86-32") == 0) { |
- info.nacl_arch = GetPlatformInfo::Results::PlatformInfo::NACL_ARCH_X86_32; |
- } else if (strcmp(nacl_arch, "x86-64") == 0) { |
- info.nacl_arch = GetPlatformInfo::Results::PlatformInfo::NACL_ARCH_X86_64; |
- } else { |
- NOTREACHED(); |
- return false; |
- } |
- |
- results_ = GetPlatformInfo::Results::Create(info); |
- return true; |
-} |
- |
-bool RuntimeGetPackageDirectoryEntryFunction::RunSync() { |
- fileapi::IsolatedContext* isolated_context = |
- fileapi::IsolatedContext::GetInstance(); |
- DCHECK(isolated_context); |
- |
- std::string relative_path = kPackageDirectoryPath; |
- base::FilePath path = extension_->path(); |
- std::string filesystem_id = isolated_context->RegisterFileSystemForPath( |
- fileapi::kFileSystemTypeNativeLocal, path, &relative_path); |
- |
- int renderer_id = render_view_host_->GetProcess()->GetID(); |
- content::ChildProcessSecurityPolicy* policy = |
- content::ChildProcessSecurityPolicy::GetInstance(); |
- policy->GrantReadFileSystem(renderer_id, filesystem_id); |
- base::DictionaryValue* dict = new base::DictionaryValue(); |
- SetResult(dict); |
- dict->SetString("fileSystemId", filesystem_id); |
- dict->SetString("baseName", relative_path); |
- return true; |
-} |
- |
-} // namespace extensions |