Index: chrome/browser/apps/install_chrome_app.cc |
diff --git a/chrome/browser/apps/install_chrome_app.cc b/chrome/browser/apps/install_chrome_app.cc |
index 57965bfd99732686b1a57b86ba54fb07adf99514..ce9366ed42e5bb37f0375420a9ee80b9f734891c 100644 |
--- a/chrome/browser/apps/install_chrome_app.cc |
+++ b/chrome/browser/apps/install_chrome_app.cc |
@@ -8,81 +8,28 @@ |
#include "base/command_line.h" |
#include "base/strings/stringprintf.h" |
#include "chrome/browser/browser_process.h" |
+#include "chrome/browser/extensions/webstore_install_with_prompt.h" |
+#include "chrome/browser/extensions/webstore_standalone_installer.h" |
+#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/ui/browser.h" |
#include "chrome/browser/ui/browser_list.h" |
-#include "chrome/browser/ui/browser_navigator.h" |
+#include "chrome/browser/ui/browser_window.h" |
+#include "extensions/browser/extension_registry.h" |
#include "extensions/common/extension.h" |
-#include "google_apis/gaia/gaia_urls.h" |
-#include "net/url_request/url_fetcher.h" |
-#include "net/url_request/url_fetcher_delegate.h" |
+ |
+using extensions::ExtensionRegistry; |
namespace { |
-// The URL to the webstore page for a specific app. "_asi=1" instructs webstore |
-// to immediately try to install the app if the referrer is the sign in page. |
-// This is actually the short form of the URL which just redirects to the full |
-// URL. Since "_asi=1" only works on the full url, we need to resolve it first |
-// before navigating the user to it. |
+// The URL to the webstore page for a specific app. |
const char kWebstoreUrlFormat[] = |
- "https://chrome.google.com/webstore/detail/%s?_asi=1"; |
- |
-// The URL for the sign in page, set as the referrer to webstore. |
-const char kAccountsUrl[] = "https://accounts.google.com/ServiceLogin"; |
+ "https://chrome.google.com/webstore/detail/%s"; |
// Returns the webstore URL for an app. |
GURL GetAppInstallUrl(const std::string& app_id) { |
return GURL(base::StringPrintf(kWebstoreUrlFormat, app_id.c_str())); |
} |
-void NavigateToUrlWithAccountsReferrer(const GURL& url) { |
- Browser* browser = |
- BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_NATIVE)->get(0); |
- if (!browser) |
- return; |
- |
- chrome::NavigateParams params( |
- browser, url, content::PAGE_TRANSITION_AUTO_TOPLEVEL); |
- params.disposition = NEW_FOREGROUND_TAB; |
- params.window_action = chrome::NavigateParams::SHOW_WINDOW; |
- params.referrer = content::Referrer(); |
- params.referrer.url = GURL(kAccountsUrl); |
- chrome::Navigate(¶ms); |
-} |
- |
-class AppURLFetcher : net::URLFetcherDelegate { |
- public: |
- explicit AppURLFetcher(const std::string& app_id); |
- |
- // net::URLFetcherDelegate OVERRIDES: |
- virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; |
- |
- private: |
- virtual ~AppURLFetcher(); |
- |
- scoped_ptr<net::URLFetcher> url_fetcher_; |
- |
- DISALLOW_COPY_AND_ASSIGN(AppURLFetcher); |
-}; |
- |
-AppURLFetcher::AppURLFetcher(const std::string& app_id) { |
- url_fetcher_.reset(net::URLFetcher::Create( |
- GetAppInstallUrl(app_id), net::URLFetcher::GET, this)); |
- url_fetcher_->SetRequestContext(g_browser_process->system_request_context()); |
- url_fetcher_->SetStopOnRedirect(true); |
- url_fetcher_->Start(); |
-} |
- |
-AppURLFetcher::~AppURLFetcher() { |
-} |
- |
-void AppURLFetcher::OnURLFetchComplete(const net::URLFetcher* source) { |
- if (source->GetResponseCode() == 301) { |
- // Moved permanently. |
- NavigateToUrlWithAccountsReferrer(source->GetURL()); |
- } |
- |
- delete this; |
-} |
- |
} // namespace |
namespace install_chrome_app { |
@@ -91,7 +38,38 @@ void InstallChromeApp(const std::string& app_id) { |
if (!extensions::Extension::IdIsValid(app_id)) |
return; |
- new AppURLFetcher(app_id); |
+ // At the moment InstallChromeApp() is called immediately after handling |
+ // startup URLs, so a browser is guaranteed to be created. If that changes we |
+ // may need to start a browser or browser session here. |
+ Browser* browser = |
+ BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_NATIVE)->get(0); |
+ DCHECK(browser); |
+ |
+ content::OpenURLParams params(GetAppInstallUrl(app_id), |
+ content::Referrer(), |
+ NEW_FOREGROUND_TAB, |
+ content::PAGE_TRANSITION_AUTO_TOPLEVEL, |
+ false); |
+ browser->OpenURL(params); |
+ |
+ ExtensionRegistry* registry = ExtensionRegistry::Get(browser->profile()); |
+ // Skip if this app is already installed or blacklisted. For disabled or |
+ // or terminated apps, going through the installation flow should re-enable |
+ // them. |
+ const extensions::Extension* installed_extension = registry->GetExtensionById( |
+ app_id, ExtensionRegistry::ENABLED | ExtensionRegistry::BLACKLISTED); |
+ // TODO(jackhou): For installed apps, maybe we should do something better, |
+ // e.g. show the app list (and re-add it to the taskbar). |
+ if (installed_extension) |
+ return; |
+ |
+ extensions::WebstoreInstallWithPrompt* installer = |
+ new extensions::WebstoreInstallWithPrompt( |
+ app_id, |
+ browser->profile(), |
+ browser->window()->GetNativeWindow(), |
+ extensions::WebstoreStandaloneInstaller::Callback()); |
+ installer->BeginInstall(); |
} |
} // namespace install_chrome_app |