| Index: chrome/browser/extensions/extension_webstore_private_api.cc
|
| diff --git a/chrome/browser/extensions/extension_webstore_private_api.cc b/chrome/browser/extensions/extension_webstore_private_api.cc
|
| index 536008c3cfeb68493830725a8d56256285387347..184c9e53590faf6334b492bedab0a608ddc21dd8 100644
|
| --- a/chrome/browser/extensions/extension_webstore_private_api.cc
|
| +++ b/chrome/browser/extensions/extension_webstore_private_api.cc
|
| @@ -4,17 +4,72 @@
|
|
|
| #include "chrome/browser/extensions/extension_webstore_private_api.h"
|
|
|
| +#include "base/string_util.h"
|
| #include "base/values.h"
|
| +#include "chrome/browser/browser_process.h"
|
| +#include "chrome/browser/extensions/crx_installer.h"
|
| #include "chrome/browser/extensions/extension_prefs.h"
|
| #include "chrome/browser/extensions/extensions_service.h"
|
| #include "chrome/browser/sync/profile_sync_service.h"
|
| +#include "chrome/browser/tab_contents/tab_contents.h"
|
| +#include "chrome/common/extensions/extension_constants.h"
|
| +#include "net/base/escape.h"
|
| +
|
| +namespace {
|
| +
|
| +const char* install_base_url = extension_urls::kGalleryUpdateHttpsUrl;
|
| +
|
| +}
|
|
|
| static bool IsWebStoreURL(const GURL& url) {
|
| GURL store_url(Extension::ChromeStoreURL());
|
| if (!url.is_valid() || !store_url.is_valid()) {
|
| return false;
|
| }
|
| - return store_url.GetOrigin() == url.GetOrigin();
|
| +
|
| + // Ignore port. It may be set on |url| during tests, but cannot be set on
|
| + // ChromeStoreURL.
|
| + return store_url.scheme() == url.scheme() &&
|
| + store_url.host() == url.host();
|
| +}
|
| +
|
| +// static
|
| +void InstallFunction::SetTestingInstallBaseUrl(
|
| + const char* testing_install_base_url) {
|
| + install_base_url = testing_install_base_url;
|
| +}
|
| +
|
| +bool InstallFunction::RunImpl() {
|
| + if (!IsWebStoreURL(source_url()))
|
| + return false;
|
| +
|
| + std::string id;
|
| + EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &id));
|
| + EXTENSION_FUNCTION_VALIDATE(Extension::IdIsValid(id));
|
| +
|
| + std::vector<std::string> params;
|
| + params.push_back("id=" + id);
|
| + params.push_back("lang=" + g_browser_process->GetApplicationLocale());
|
| + params.push_back("uc");
|
| + std::string url_string = install_base_url;
|
| +
|
| + GURL url(url_string + "?response=redirect&x=" +
|
| + EscapeQueryParamValue(JoinString(params, '&'), true));
|
| + DCHECK(url.is_valid());
|
| +
|
| + // Cleared in ~CrxInstaller().
|
| + CrxInstaller::SetWhitelistedInstallId(id);
|
| +
|
| + // The download url for the given |id| is now contained in |url|. We
|
| + // navigate the current (calling) tab to this url which will result in a
|
| + // download starting. Once completed it will go through the normal extension
|
| + // install flow. The above call to SetWhitelistedInstallId will bypass the
|
| + // normal permissions install dialog.
|
| + NavigationController& controller =
|
| + dispatcher()->delegate()->associated_tab_contents()->controller();
|
| + controller.LoadURL(url, source_url(), PageTransition::LINK);
|
| +
|
| + return true;
|
| }
|
|
|
| bool GetSyncLoginFunction::RunImpl() {
|
|
|