diff options
author | benwells@chromium.org <benwells@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-23 06:17:00 +0000 |
---|---|---|
committer | benwells@chromium.org <benwells@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-23 06:17:00 +0000 |
commit | 02d96b139b73c27ff3ceebbda132c59866de46f1 (patch) | |
tree | 1912ade2a73ddb933fb2aa66951a83c1dc98dcf2 /chrome/browser/extensions | |
parent | cbba20e8ddf92868c097a10ea31ddf4e18f3776d (diff) | |
download | chromium_src-02d96b139b73c27ff3ceebbda132c59866de46f1.zip chromium_src-02d96b139b73c27ff3ceebbda132c59866de46f1.tar.gz chromium_src-02d96b139b73c27ff3ceebbda132c59866de46f1.tar.bz2 |
Move app_host code from extensions into src/apps.
BUG=None
Review URL: https://chromiumcodereview.appspot.com/12310059
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@184295 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions')
-rw-r--r-- | chrome/browser/extensions/app_host/OWNERS | 1 | ||||
-rw-r--r-- | chrome/browser/extensions/app_host/app_host.rc | 46 | ||||
-rw-r--r-- | chrome/browser/extensions/app_host/app_host_main.cc | 53 | ||||
-rw-r--r-- | chrome/browser/extensions/app_host/app_host_resource.h | 5 | ||||
-rw-r--r-- | chrome/browser/extensions/app_host/binaries_installer.cc | 327 | ||||
-rw-r--r-- | chrome/browser/extensions/app_host/binaries_installer.h | 19 | ||||
-rw-r--r-- | chrome/browser/extensions/app_host/update.cc | 102 | ||||
-rw-r--r-- | chrome/browser/extensions/app_host/update.h | 16 |
8 files changed, 0 insertions, 569 deletions
diff --git a/chrome/browser/extensions/app_host/OWNERS b/chrome/browser/extensions/app_host/OWNERS deleted file mode 100644 index 82e44d8..0000000 --- a/chrome/browser/extensions/app_host/OWNERS +++ /dev/null @@ -1 +0,0 @@ -erikwright@chromium.org diff --git a/chrome/browser/extensions/app_host/app_host.rc b/chrome/browser/extensions/app_host/app_host.rc deleted file mode 100644 index ef4d290..0000000 --- a/chrome/browser/extensions/app_host/app_host.rc +++ /dev/null @@ -1,46 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "app_host_resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#define APSTUDIO_HIDDEN_SYMBOLS -#include "windows.h" -#undef APSTUDIO_HIDDEN_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) -#endif //_WIN32 - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_APP_HOST_MAIN ICON "..\\..\\..\\app\\theme\\app_list.ico" - -///////////////////////////////////////////////////////////////////////////// -// -// GOOGLEUPDATEAPPLICATIONCOMMANDS is a "well-known" marker resource defined -// by Omaha. Executables must both be signed by Google and contain the marker -// in order to expose application commands. -// -#define IDR_GOOGLE_UPDATE_APP_COMMANDS_MARKUP 1 - -IDR_GOOGLE_UPDATE_APP_COMMANDS_MARKUP GOOGLEUPDATEAPPLICATIONCOMMANDS { 1L } - -#endif // English (U.S.) resources -///////////////////////////////////////////////////////////////////////////// diff --git a/chrome/browser/extensions/app_host/app_host_main.cc b/chrome/browser/extensions/app_host/app_host_main.cc deleted file mode 100644 index 578f18e..0000000 --- a/chrome/browser/extensions/app_host/app_host_main.cc +++ /dev/null @@ -1,53 +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 <windows.h> - -#include "base/at_exit.h" -#include "base/command_line.h" -#include "base/file_path.h" -#include "base/logging.h" -#include "base/process_util.h" -#include "chrome/browser/extensions/app_host/binaries_installer.h" -#include "chrome/browser/extensions/app_host/update.h" -#include "chrome/installer/launcher_support/chrome_launcher_support.h" - -int APIENTRY wWinMain(HINSTANCE, HINSTANCE, wchar_t*, int) { - base::AtExitManager exit_manager; - - // Initialize the commandline singleton from the environment. - CommandLine::Init(0, NULL); - - base::FilePath chrome_exe(chrome_launcher_support::GetAnyChromePath()); - if (chrome_exe.empty()) { - LOG(INFO) << "No Chrome executable could be found. Let's install it."; - HRESULT hr = app_host::InstallBinaries(); - if (FAILED(hr)) { - LOG(ERROR) << "Failed to install the Chrome Binaries. Error: " << hr; - return 1; - } else { - chrome_exe = chrome_launcher_support::GetAnyChromePath(); - if (chrome_exe.empty()) { - LOG(ERROR) << "Failed to find the Chrome Binaries despite a " - << "'successful' installation."; - return 1; - } - } - } - - CommandLine chrome_exe_command_line(chrome_exe); - chrome_exe_command_line.AppendArguments( - *CommandLine::ForCurrentProcess(), false); - // Launch Chrome before checking for update, for faster user experience. - bool launch_result = base::LaunchProcess(chrome_exe_command_line, - base::LaunchOptions(), NULL); - if (launch_result) - LOG(INFO) << "Delegated to Chrome executable at " << chrome_exe.value(); - else - LOG(INFO) << "Failed to launch Chrome executable at " << chrome_exe.value(); - - app_host::EnsureAppHostUpToDate(); - - return !launch_result; -} diff --git a/chrome/browser/extensions/app_host/app_host_resource.h b/chrome/browser/extensions/app_host/app_host_resource.h deleted file mode 100644 index 29d289c..0000000 --- a/chrome/browser/extensions/app_host/app_host_resource.h +++ /dev/null @@ -1,5 +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. - -#define IDI_APP_HOST_MAIN 101 diff --git a/chrome/browser/extensions/app_host/binaries_installer.cc b/chrome/browser/extensions/app_host/binaries_installer.cc deleted file mode 100644 index 75fb8db..0000000 --- a/chrome/browser/extensions/app_host/binaries_installer.cc +++ /dev/null @@ -1,327 +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/app_host/binaries_installer.h" - -#include "base/logging.h" -#include "base/threading/platform_thread.h" -#include "base/win/scoped_bstr.h" -#include "base/win/scoped_com_initializer.h" -#include "base/win/scoped_comptr.h" -#include "google_update/google_update_idl.h" - - -namespace app_host { - -// Helpers -------------------------------------------------------------------- - -namespace { - -const wchar_t kAppHostAppId[] = L"{FDA71E6F-AC4C-4a00-8B70-9958A68906BF}"; -const wchar_t kBinariesAppId[] = L"{4DC8B4CA-1BDA-483e-B5FA-D3C12E15B62D}"; -const int kInstallationPollingIntervalMs = 50; - -HRESULT CreateInstalledApp(IAppBundle* app_bundle, - const wchar_t* app_guid, - IApp** app) { - base::win::ScopedComPtr<IDispatch> idispatch; - HRESULT hr = app_bundle->createInstalledApp(base::win::ScopedBstr(app_guid), - idispatch.Receive()); - if (FAILED(hr)) { - LOG(ERROR) << "Failed to configure App Bundle: " << hr; - return hr; - } - - base::win::ScopedComPtr<IApp> temp_app; - hr = temp_app.QueryFrom(idispatch); - if (FAILED(hr)) { - LOG(ERROR) << "Unexpected error querying IApp from " - << "IAppBundle->createInstalledApp return value: " << hr; - } else { - *app = temp_app.Detach(); - } - return hr; -} - -HRESULT GetAppHostApValue(IGoogleUpdate3* update3, - IAppBundle* app_bundle, - BSTR* ap_value) { - base::win::ScopedComPtr<IApp> app; - HRESULT hr = CreateInstalledApp(app_bundle, kAppHostAppId, app.Receive()); - if (FAILED(hr)) - return hr; - - hr = app->get_ap(ap_value); - if (FAILED(hr)) - LOG(ERROR) << "Failed to get the App Launcher AP value."; - return hr; -} - -HRESULT GetCurrentState(IApp* app, - ICurrentState** current_state, - CurrentState* state_value) { - base::win::ScopedComPtr<IDispatch> idispatch; - HRESULT hr = app->get_currentState(idispatch.Receive()); - if (FAILED(hr)) { - LOG(ERROR) << "Failed to get App Bundle state: " << hr; - return hr; - } - - base::win::ScopedComPtr<ICurrentState> temp_current_state; - hr = temp_current_state.QueryFrom(idispatch); - if (FAILED(hr)) { - LOG(ERROR) << "Unexpected error querying ICurrentState from " - << "IApp::get_currentState return value: " << hr; - return hr; - } - - LONG long_state_value; - hr = temp_current_state->get_stateValue(&long_state_value); - if (SUCCEEDED(hr)) { - *state_value = static_cast<CurrentState>(long_state_value); - *current_state = temp_current_state.Detach(); - } else { - LOG(ERROR) << "Failed to get App Bundle state value: " << hr; - } - return hr; -} - -bool CheckIsBusy(IAppBundle* app_bundle, HRESULT* hr) { - VARIANT_BOOL variant_is_busy = VARIANT_TRUE; - *hr = app_bundle->isBusy(&variant_is_busy); - if (FAILED(*hr)) - LOG(ERROR) << "Failed to check app_bundle->isBusy: " << *hr; - return (variant_is_busy == VARIANT_TRUE); -} - -void OnUpdateAvailable(IAppBundle* app_bundle, HRESULT* hr) { - // If the app bundle is busy we will just wait some more. - if (CheckIsBusy(app_bundle, hr) || FAILED(*hr)) - return; - *hr = app_bundle->download(); - if (FAILED(*hr)) - LOG(ERROR) << "Failed to initiate bundle download: " << *hr; -} - -void OnReadyToInstall(IAppBundle* app_bundle, HRESULT* hr) { - // If the app bundle is busy we will just wait some more. - if (CheckIsBusy(app_bundle, hr) || FAILED(*hr)) - return; - *hr = app_bundle->install(); - if (FAILED(*hr)) - LOG(ERROR) << "Failed to initiate bundle install: " << *hr; -} - -HRESULT OnError(ICurrentState* current_state) { - LONG error_code; - HRESULT hr = current_state->get_errorCode(&error_code); - if (FAILED(hr)) { - LOG(ERROR) << "Failed to retrieve bundle error code: " << hr; - return hr; - } - - base::win::ScopedBstr completion_message; - HRESULT completion_message_hr = - current_state->get_completionMessage(completion_message.Receive()); - if (FAILED(completion_message_hr)) { - LOG(ERROR) << "Bundle installation failed with error " << error_code - << ". Error message retrieval failed with error: " - << completion_message_hr; - } else { - LOG(ERROR) << "Bundle installation failed with error " << error_code << ": " - << completion_message; - } - return error_code; -} - -HRESULT CreateGoogleUpdate3(IGoogleUpdate3** update3) { - base::win::ScopedComPtr<IGoogleUpdate3> temp_update3; - HRESULT hr = temp_update3.CreateInstance(CLSID_GoogleUpdate3UserClass); - if (SUCCEEDED(hr)) { - *update3 = temp_update3.Detach(); - } else { - // TODO(erikwright): Try in-proc to support running elevated? According - // to update3_utils.cc (CreateGoogleUpdate3UserClass): - // The primary reason for the LocalServer activation failing on Vista/Win7 - // is that COM does not look at HKCU registration when the code is running - // elevated. We fall back to an in-proc mode. The in-proc mode is limited to - // one install at a time, so we use it only as a backup mechanism. - LOG(ERROR) << "Failed to instantiate GoogleUpdate3: " << hr; - } - return hr; -} - -HRESULT CreateAppBundle(IGoogleUpdate3* update3, IAppBundle** app_bundle) { - base::win::ScopedComPtr<IDispatch> idispatch; - HRESULT hr = update3->createAppBundle(idispatch.Receive()); - if (FAILED(hr)) { - LOG(ERROR) << "Failed to createAppBundle: " << hr; - return hr; - } - - base::win::ScopedComPtr<IAppBundle> temp_app_bundle; - hr = temp_app_bundle.QueryFrom(idispatch); - if (FAILED(hr)) { - LOG(ERROR) << "Unexpected error querying IAppBundle from " - << "IGoogleUpdate3->createAppBundle return value: " << hr; - return hr; - } - - hr = temp_app_bundle->initialize(); - if (FAILED(hr)) - LOG(ERROR) << "Failed to initialize App Bundle: " << hr; - else - *app_bundle = temp_app_bundle.Detach(); - return hr; -} - -HRESULT SelectBinariesApValue(IGoogleUpdate3* update3, - IAppBundle* app_bundle, - BSTR* ap_value) { - HRESULT hr = GetAppHostApValue(update3, app_bundle, ap_value); - if (SUCCEEDED(hr)) - return hr; - - // TODO(erikwright): distinguish between AppHost not installed and an - // error in GetAppHostApValue. - // TODO(erikwright): Use stable by default when App Host support is in - // stable. - base::win::ScopedBstr temp_ap_value; - if (temp_ap_value.Allocate(L"2.0-dev-multi-apphost") == NULL) { - LOG(ERROR) << "Unexpected error in ScopedBstr::Allocate."; - return E_FAIL; - } - *ap_value = temp_ap_value.Release(); - return S_OK; -} - -HRESULT CreateBinariesIApp(IAppBundle* app_bundle, BSTR ap, IApp** app) { - base::win::ScopedComPtr<IDispatch> idispatch; - HRESULT hr = app_bundle->createApp(base::win::ScopedBstr(kBinariesAppId), - idispatch.Receive()); - if (FAILED(hr)) { - LOG(ERROR) << "Failed to configure App Bundle: " << hr; - return hr; - } - - base::win::ScopedComPtr<IApp> temp_app; - hr = temp_app.QueryFrom(idispatch); - if (FAILED(hr)) { - LOG(ERROR) << "Unexpected error querying IApp from " - << "IAppBundle->createApp return value: " << hr; - return hr; - } - - hr = temp_app->put_isEulaAccepted(VARIANT_TRUE); - if (FAILED(hr)) { - LOG(ERROR) << "Failed to set 'EULA Accepted': " << hr; - return hr; - } - - hr = temp_app->put_ap(ap); - if (FAILED(hr)) - LOG(ERROR) << "Failed to set AP value: " << hr; - else - *app = temp_app.Detach(); - return hr; -} - -bool CheckIfDone(IAppBundle* app_bundle, IApp* app, HRESULT* hr) { - base::win::ScopedComPtr<ICurrentState> current_state; - CurrentState state_value; - *hr = GetCurrentState(app, current_state.Receive(), &state_value); - if (FAILED(*hr)) - return true; - - switch (state_value) { - case STATE_WAITING_TO_CHECK_FOR_UPDATE: - case STATE_CHECKING_FOR_UPDATE: - case STATE_WAITING_TO_DOWNLOAD: - case STATE_RETRYING_DOWNLOAD: - case STATE_DOWNLOADING: - case STATE_WAITING_TO_INSTALL: - case STATE_INSTALLING: - case STATE_DOWNLOAD_COMPLETE: - case STATE_EXTRACTING: - case STATE_APPLYING_DIFFERENTIAL_PATCH: - // These states will all transition on their own. - return false; - - case STATE_UPDATE_AVAILABLE: - OnUpdateAvailable(app_bundle, hr); - return FAILED(*hr); - - case STATE_READY_TO_INSTALL: - OnReadyToInstall(app_bundle, hr); - return FAILED(*hr); - - case STATE_NO_UPDATE: - LOG(INFO) << "Google Update reports that the binaries are already " - << "installed and up-to-date."; - return true; - - case STATE_INSTALL_COMPLETE: - return true; - - case STATE_ERROR: - *hr = OnError(current_state); - return FAILED(*hr); - - case STATE_INIT: - case STATE_PAUSED: - default: - LOG(ERROR) << "Unexpected bundle state: " << state_value << "."; - *hr = E_FAIL; - return true; - } -} - -} // namespace - - -// Globals -------------------------------------------------------------------- - -HRESULT InstallBinaries() { - base::win::ScopedCOMInitializer initialize_com; - if (!initialize_com.succeeded()) { - LOG(ERROR) << "COM initialization failed"; - return E_FAIL; - } - - base::win::ScopedComPtr<IGoogleUpdate3> update3; - HRESULT hr = CreateGoogleUpdate3(update3.Receive()); - if (FAILED(hr)) - return hr; - - base::win::ScopedComPtr<IAppBundle> app_bundle; - hr = CreateAppBundle(update3, app_bundle.Receive()); - if (FAILED(hr)) - return hr; - - base::win::ScopedBstr ap_value; - hr = SelectBinariesApValue(update3, app_bundle, ap_value.Receive()); - if (FAILED(hr)) - return hr; - - base::win::ScopedComPtr<IApp> app; - hr = CreateBinariesIApp(app_bundle, ap_value, app.Receive()); - if (FAILED(hr)) - return hr; - - hr = app_bundle->checkForUpdate(); - if (FAILED(hr)) { - LOG(ERROR) << "Failed to initiate update check: " << hr; - return hr; - } - - // We rely upon Omaha to eventually time out and transition to a failure - // state. - while (!CheckIfDone(app_bundle, app, &hr)) { - base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds( - kInstallationPollingIntervalMs)); - } - return hr; -} - -} // namespace app_host diff --git a/chrome/browser/extensions/app_host/binaries_installer.h b/chrome/browser/extensions/app_host/binaries_installer.h deleted file mode 100644 index 7d6ff19..0000000 --- a/chrome/browser/extensions/app_host/binaries_installer.h +++ /dev/null @@ -1,19 +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. - -#ifndef CHROME_BROWSER_EXTENSIONS_APP_HOST_BINARIES_INSTALLER_H_ -#define CHROME_BROWSER_EXTENSIONS_APP_HOST_BINARIES_INSTALLER_H_ - -#include <windows.h> - -namespace app_host { - -// Attempts to install the Chrome Binaries. Blocks until the installation -// process is complete. The AP value, if any, from the currently installed App -// Host will be used. -HRESULT InstallBinaries(); - -} // namespace app_host - -#endif // CHROME_BROWSER_EXTENSIONS_APP_HOST_BINARIES_INSTALLER_H_ diff --git a/chrome/browser/extensions/app_host/update.cc b/chrome/browser/extensions/app_host/update.cc deleted file mode 100644 index 4d466f7..0000000 --- a/chrome/browser/extensions/app_host/update.cc +++ /dev/null @@ -1,102 +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/app_host/update.h" - -#include <windows.h> -#include "base/command_line.h" -#include "base/file_version_info.h" -#include "base/logging.h" -#include "base/memory/scoped_ptr.h" -#include "base/process_util.h" -#include "base/string16.h" -#include "base/string_util.h" -#include "base/version.h" -#include "base/win/registry.h" -#include "chrome/installer/launcher_support/chrome_launcher_support.h" - -namespace app_host { - -namespace { - -// TODO(huangs) Refactor the constants: http://crbug.com/148538 -const wchar_t kGoogleRegClientsKey[] = L"Software\\Google\\Update\\Clients\\"; - -// Copied from util_constants.cc. -const char kMultiInstall[] = "multi-install"; -const char kChromeAppHost[] = "app-host"; -const char kVerboseLogging[] = "verbose-logging"; - -// Copied from google_update_constants.cc. -const wchar_t kRegVersionField[] = L"pv"; - -// Copied from chrome_appid.cc. -const wchar_t kBinariesAppGuid[] = L"{4DC8B4CA-1BDA-483e-B5FA-D3C12E15B62D}"; - -// Copied from google_chrome_distribution.cc. -const wchar_t kBrowserAppGuid[] = L"{8A69D345-D564-463c-AFF1-A69D9E530F96}"; - -// Fetches the version of the App Host, directly from the image's version -// resource. -Version GetAppHostVersion() { - scoped_ptr<FileVersionInfo> version_info( - FileVersionInfo::CreateFileVersionInfoForCurrentModule()); - Version app_host_version(WideToASCII(version_info->product_version())); - DCHECK(app_host_version.IsValid()); - return app_host_version; -} - -// Fetches the app version ("pv" entry) of a Google product from the -// system-level registry, given the app GUID ("{###...###}"). -Version GetAppVersionFromRegistry(const wchar_t* app_guid) { - HKEY root_key = HKEY_LOCAL_MACHINE; - string16 client_key(kGoogleRegClientsKey); - client_key.append(app_guid); - base::win::RegKey reg_key; - string16 version_str; - if ((reg_key.Open(root_key, client_key.c_str(), - KEY_QUERY_VALUE) == ERROR_SUCCESS) && - (reg_key.ReadValue(kRegVersionField, &version_str) == ERROR_SUCCESS)) { - return Version(WideToASCII(version_str)); - } - return Version(); -} - -// Calls setup.exe to update App Host, using the system-level setup.exe. -bool LaunchAppHostUpdate() { - // Get the path to the setup.exe. - base::FilePath setup_exe( - chrome_launcher_support::GetSetupExeForInstallationLevel( - chrome_launcher_support::SYSTEM_LEVEL_INSTALLATION)); - if (setup_exe.empty()) { - LOG(ERROR) << "Failed to find setup.exe"; - return false; - } - CommandLine cmd_line(setup_exe); - cmd_line.AppendSwitch(kMultiInstall); - cmd_line.AppendSwitch(kChromeAppHost); - cmd_line.AppendSwitch(kVerboseLogging); - LOG(INFO) << "Launching: " << cmd_line.GetCommandLineString(); - return base::LaunchProcess(cmd_line, base::LaunchOptions(), NULL); -} - -} // namespace - -void EnsureAppHostUpToDate() { - // Check version from Chrome Binaries first, then Chrome (all system-level). - Version new_version(GetAppVersionFromRegistry(kBinariesAppGuid)); - if (!new_version.IsValid()) - new_version = GetAppVersionFromRegistry(kBrowserAppGuid); - if (!new_version.IsValid()) - return; // Not an error: System-level Chrome might not be installed. - Version app_host_version(GetAppHostVersion()); - if (app_host_version.CompareTo(new_version) < 0) { - LOG(INFO) << "Updating App Launcher from " << app_host_version.GetString() - << " to " << new_version.GetString(); - if (!LaunchAppHostUpdate()) - LOG(ERROR) << "Failed to launch App Launcher update."; - } -} - -} // namespace app_host diff --git a/chrome/browser/extensions/app_host/update.h b/chrome/browser/extensions/app_host/update.h deleted file mode 100644 index af14da27..0000000 --- a/chrome/browser/extensions/app_host/update.h +++ /dev/null @@ -1,16 +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. - -#ifndef CHROME_BROWSER_EXTENSIONS_APP_HOST_UPDATE_H_ -#define CHROME_BROWSER_EXTENSIONS_APP_HOST_UPDATE_H_ - -namespace app_host { - -// If system-level Chrome Binary is installed, and if its version is -// newer than App Host's, then udpate App Host by calling setup.exe. -void EnsureAppHostUpToDate(); - -} // namespace app_host - -#endif // CHROME_BROWSER_EXTENSIONS_APP_HOST_UPDATE_H_ |