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() { |