Index: extensions/browser/api/runtime/runtime_api.cc |
diff --git a/chrome/browser/extensions/api/runtime/runtime_api.cc b/extensions/browser/api/runtime/runtime_api.cc |
similarity index 50% |
rename from chrome/browser/extensions/api/runtime/runtime_api.cc |
rename to extensions/browser/api/runtime/runtime_api.cc |
index fbb35ed0d676627af9358e0aed455a08ffa6bc79..95f19a27e22eaa9eecfd371bb6aa79df850d4b74 100644 |
--- a/chrome/browser/extensions/api/runtime/runtime_api.cc |
+++ b/extensions/browser/api/runtime/runtime_api.cc |
@@ -2,7 +2,7 @@ |
// 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 "extensions/browser/api/runtime/runtime_api.h" |
#include <utility> |
@@ -11,48 +11,34 @@ |
#include "base/memory/scoped_ptr.h" |
#include "base/metrics/histogram.h" |
#include "base/values.h" |
-#include "chrome/browser/browser_process.h" |
+#include "base/version.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/browser_context.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/api/runtime/runtime_api_delegate.h" |
#include "extensions/browser/event_router.h" |
#include "extensions/browser/extension_host.h" |
+#include "extensions/browser/extension_prefs.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/api/runtime.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 runtime = core_api::runtime; |
namespace { |
@@ -64,10 +50,9 @@ const char kInstallReasonUpdate[] = "update"; |
const char kInstallReasonInstall[] = "install"; |
const char kInstallPreviousVersion[] = "previousVersion"; |
const char kInvalidUrlError[] = "Invalid URL."; |
+const char kPlatformInfoUnavailable[] = "Platform information unavailable."; |
+ |
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"; |
@@ -77,14 +62,6 @@ const char kUninstallUrl[] = "uninstall_url"; |
// 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, |
@@ -113,27 +90,27 @@ void DispatchOnStartupEventImpl(BrowserContext* browser_context, |
extension_id); |
if (extension && BackgroundInfo::HasPersistentBackgroundPage(extension) && |
first_call && |
- system->lazy_background_task_queue()-> |
- ShouldEnqueueTask(browser_context, extension)) { |
+ 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)); |
+ 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())); |
+ 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)); |
+ prefs->UpdateExtensionPref( |
+ extension_id, kUninstallUrl, new base::StringValue(url_string)); |
} |
#if defined(ENABLE_EXTENSIONS) |
@@ -158,19 +135,23 @@ BrowserContextKeyedAPIFactory<RuntimeAPI>* RuntimeAPI::GetFactoryInstance() { |
} |
RuntimeAPI::RuntimeAPI(content::BrowserContext* context) |
- : browser_context_(context), |
- dispatch_chrome_updated_event_(false), |
- registered_for_updates_(false) { |
- registrar_.Add(this, chrome::NOTIFICATION_EXTENSIONS_READY, |
+ : browser_context_(context), dispatch_chrome_updated_event_(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, |
+ registrar_.Add(this, |
+ chrome::NOTIFICATION_EXTENSION_INSTALLED, |
content::Source<BrowserContext>(context)); |
- registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNINSTALLED, |
+ registrar_.Add(this, |
+ chrome::NOTIFICATION_EXTENSION_UNINSTALLED, |
content::Source<BrowserContext>(context)); |
+ delegate_ = ExtensionsBrowserClient::Get()->CreateRuntimeAPIDelegate( |
+ browser_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_ = |
@@ -178,10 +159,7 @@ RuntimeAPI::RuntimeAPI(content::BrowserContext* context) |
} |
RuntimeAPI::~RuntimeAPI() { |
- if (registered_for_updates_) { |
- ExtensionSystem::Get(browser_context_)-> |
- extension_service()->RemoveUpdateObserver(this); |
- } |
+ delegate_->RemoveUpdateObserver(this); |
} |
void RuntimeAPI::Observe(int type, |
@@ -220,16 +198,14 @@ 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); |
+ delegate_->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. |
+ ExtensionSystem* extension_system = ExtensionSystem::Get(browser_context_); |
if (extension_system->process_manager()) |
extension_system->process_manager()->AddObserver(this); |
} |
@@ -254,13 +230,7 @@ void RuntimeAPI::OnExtensionInstalled(const Extension* extension) { |
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(); |
+ Version old_version = delegate_->GetPreviousExtensionVersion(extension); |
// Dispatch the onInstalled event. |
base::MessageLoop::current()->PostTask( |
@@ -270,7 +240,6 @@ void RuntimeAPI::OnExtensionInstalled(const Extension* extension) { |
extension->id(), |
old_version, |
false)); |
- |
} |
void RuntimeAPI::OnExtensionUninstalled(const Extension* extension) { |
@@ -279,8 +248,7 @@ void RuntimeAPI::OnExtensionUninstalled(const Extension* extension) { |
if (extension->is_ephemeral()) |
return; |
- Profile* profile = Profile::FromBrowserContext(browser_context_); |
- RuntimeEventRouter::OnExtensionUninstalled(profile, extension->id()); |
+ RuntimeEventRouter::OnExtensionUninstalled(browser_context_, extension->id()); |
} |
void RuntimeAPI::Shutdown() { |
@@ -294,76 +262,46 @@ void RuntimeAPI::Shutdown() { |
} |
void RuntimeAPI::OnAppUpdateAvailable(const Extension* extension) { |
- Profile* profile = Profile::FromBrowserContext(browser_context_); |
RuntimeEventRouter::DispatchOnUpdateAvailableEvent( |
- profile, extension->id(), extension->manifest()->value()); |
+ browser_context_, extension->id(), extension->manifest()->value()); |
} |
void RuntimeAPI::OnChromeUpdateAvailable() { |
- Profile* profile = Profile::FromBrowserContext(browser_context_); |
- RuntimeEventRouter::DispatchOnBrowserUpdateAvailableEvent(profile); |
+ RuntimeEventRouter::DispatchOnBrowserUpdateAvailableEvent(browser_context_); |
} |
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)); |
- } |
+void RuntimeAPI::ReloadExtension(const std::string& extension_id) { |
+ delegate_->ReloadExtension(extension_id); |
+} |
+ |
+bool RuntimeAPI::CheckForUpdates( |
+ const std::string& extension_id, |
+ const RuntimeAPIDelegate::UpdateCheckCallback& callback) { |
+ return delegate_->CheckForUpdates(extension_id, callback); |
+} |
+ |
+void RuntimeAPI::OpenURL(const GURL& update_url) { |
+ delegate_->OpenURL(update_url); |
+} |
+ |
+bool RuntimeAPI::GetPlatformInfo(runtime::PlatformInfo* info) { |
+ return delegate_->GetPlatformInfo(info); |
+} |
+ |
+bool RuntimeAPI::RestartDevice(std::string* error_message) { |
+ return delegate_->RestartDevice(error_message); |
} |
/////////////////////////////////////////////////////////////////////////////// |
// static |
void RuntimeEventRouter::DispatchOnStartupEvent( |
- content::BrowserContext* context, const std::string& extension_id) { |
+ content::BrowserContext* context, |
+ const std::string& extension_id) { |
DispatchOnStartupEventImpl(context, extension_id, true, NULL); |
} |
@@ -391,55 +329,55 @@ void RuntimeEventRouter::DispatchOnInstalledEvent( |
info->SetString(kInstallReason, kInstallReasonInstall); |
} |
DCHECK(system->event_router()); |
- scoped_ptr<Event> event(new Event(runtime::OnInstalled::kEventName, |
- event_args.Pass())); |
+ 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, |
+ content::BrowserContext* context, |
const std::string& extension_id, |
const base::DictionaryValue* manifest) { |
- ExtensionSystem* system = ExtensionSystem::Get(profile); |
+ ExtensionSystem* system = ExtensionSystem::Get(context); |
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())); |
+ 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); |
+ content::BrowserContext* context) { |
+ ExtensionSystem* system = ExtensionSystem::Get(context); |
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())); |
+ scoped_ptr<Event> event( |
+ new Event(runtime::OnBrowserUpdateAvailable::kEventName, args.Pass())); |
system->event_router()->BroadcastEvent(event.Pass()); |
} |
// static |
void RuntimeEventRouter::DispatchOnRestartRequiredEvent( |
- Profile* profile, |
+ content::BrowserContext* context, |
const std::string& app_id, |
- api::runtime::OnRestartRequired::Reason reason) { |
- ExtensionSystem* system = ExtensionSystem::Get(profile); |
+ core_api::runtime::OnRestartRequired::Reason reason) { |
+ ExtensionSystem* system = ExtensionSystem::Get(context); |
if (!system) |
return; |
scoped_ptr<Event> event( |
new Event(runtime::OnRestartRequired::kEventName, |
- api::runtime::OnRestartRequired::Create(reason))); |
+ core_api::runtime::OnRestartRequired::Create(reason))); |
DCHECK(system->event_router()); |
system->event_router()->DispatchEventToExtension(app_id, event.Pass()); |
@@ -447,214 +385,116 @@ void RuntimeEventRouter::DispatchOnRestartRequiredEvent( |
// static |
void RuntimeEventRouter::OnExtensionUninstalled( |
- Profile* profile, |
+ content::BrowserContext* context, |
const std::string& extension_id) { |
#if defined(ENABLE_EXTENSIONS) |
- GURL uninstall_url(GetUninstallURL(ExtensionPrefs::Get(profile), |
- extension_id)); |
+ GURL uninstall_url( |
+ GetUninstallURL(ExtensionPrefs::Get(context), 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); |
+ RuntimeAPI::GetFactoryInstance()->Get(context)->OpenURL(uninstall_url); |
#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(), |
+ExtensionFunction::ResponseAction RuntimeGetBackgroundPageFunction::Run() { |
+ ExtensionSystem* system = ExtensionSystem::Get(browser_context()); |
+ ExtensionHost* host = |
+ system->process_manager()->GetBackgroundHostForExtension(extension_id()); |
+ if (system->lazy_background_task_queue()->ShouldEnqueueTask(browser_context(), |
GetExtension())) { |
system->lazy_background_task_queue()->AddPendingTask( |
- GetProfile(), |
+ browser_context(), |
extension_id(), |
base::Bind(&RuntimeGetBackgroundPageFunction::OnPageLoaded, this)); |
} else if (host) { |
OnPageLoaded(host); |
} else { |
- error_ = kNoBackgroundPageError; |
- return false; |
+ return RespondNow(Error(kNoBackgroundPageError)); |
} |
- return true; |
+ return RespondLater(); |
} |
void RuntimeGetBackgroundPageFunction::OnPageLoaded(ExtensionHost* host) { |
if (host) { |
- SendResponse(true); |
+ Respond(NoArguments()); |
} else { |
- error_ = kPageLoadError; |
- SendResponse(false); |
+ Respond(Error(kPageLoadError)); |
} |
} |
-bool RuntimeSetUninstallURLFunction::RunSync() { |
+ExtensionFunction::ResponseAction RuntimeSetUninstallURLFunction::Run() { |
std::string url_string; |
- EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &url_string)); |
+ EXTENSION_FUNCTION_VALIDATE_TYPESAFE(args_->GetString(0, &url_string)); |
GURL url(url_string); |
if (!url.is_valid()) { |
- error_ = ErrorUtils::FormatErrorMessage(kInvalidUrlError, url_string); |
- return false; |
+ return RespondNow( |
+ Error(ErrorUtils::FormatErrorMessage(kInvalidUrlError, url_string))); |
} |
- |
SetUninstallURL( |
- ExtensionPrefs::Get(GetProfile()), extension_id(), url_string); |
- return true; |
+ ExtensionPrefs::Get(browser_context()), extension_id(), url_string); |
+ return RespondNow(NoArguments()); |
} |
-bool RuntimeReloadFunction::RunSync() { |
- RuntimeAPI::GetFactoryInstance()->Get(GetProfile())->MaybeReloadExtension( |
+ExtensionFunction::ResponseAction RuntimeReloadFunction::Run() { |
+ RuntimeAPI::GetFactoryInstance()->Get(browser_context())->ReloadExtension( |
extension_id()); |
- return true; |
+ return RespondNow(NoArguments()); |
} |
-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); |
+ExtensionFunction::ResponseAction RuntimeRequestUpdateCheckFunction::Run() { |
+ if (!RuntimeAPI::GetFactoryInstance() |
+ ->Get(browser_context()) |
+ ->CheckForUpdates( |
+ extension_id(), |
+ base::Bind(&RuntimeRequestUpdateCheckFunction::CheckComplete, |
+ this))) { |
+ return RespondNow(Error(kUpdatesDisabledError)); |
} |
- 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()); |
+ return RespondLater(); |
+} |
+ |
+void RuntimeRequestUpdateCheckFunction::CheckComplete( |
+ const RuntimeAPIDelegate::UpdateCheckResult& result) { |
+ if (result.success) { |
+ base::ListValue* results = new base::ListValue; |
+ results->AppendString(result.response); |
+ base::DictionaryValue* details = new base::DictionaryValue; |
+ results->Append(details); |
+ details->SetString("version", result.version); |
+ Respond(MultipleArguments(results)); |
} else { |
- SetResult(new base::StringValue(kUpdateNotFound)); |
+ Respond(SingleArgument(new base::StringValue(result.response))); |
} |
- 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()); |
+ExtensionFunction::ResponseAction RuntimeRestartFunction::Run() { |
+ std::string message; |
+ bool result = |
+ RuntimeAPI::GetFactoryInstance()->Get(browser_context())->RestartDevice( |
+ &message); |
+ if (!result) { |
+ return RespondNow(Error(message)); |
} |
+ return RespondNow(NoArguments()); |
} |
-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; |
+ExtensionFunction::ResponseAction RuntimeGetPlatformInfoFunction::Run() { |
+ runtime::PlatformInfo info; |
+ if (!RuntimeAPI::GetFactoryInstance() |
+ ->Get(browser_context()) |
+ ->GetPlatformInfo(&info)) { |
+ return RespondNow(Error(kPlatformInfoUnavailable)); |
} |
- |
- 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; |
+ return RespondNow(MultipleArguments( |
+ runtime::GetPlatformInfo::Results::Create(info).release())); |
} |
-bool RuntimeGetPackageDirectoryEntryFunction::RunSync() { |
+ExtensionFunction::ResponseAction |
+RuntimeGetPackageDirectoryEntryFunction::Run() { |
fileapi::IsolatedContext* isolated_context = |
fileapi::IsolatedContext::GetInstance(); |
DCHECK(isolated_context); |
@@ -669,10 +509,9 @@ bool RuntimeGetPackageDirectoryEntryFunction::RunSync() { |
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; |
+ return RespondNow(SingleArgument(dict)); |
} |
-} // namespace extensions |
+} // namespace extensions |