Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(268)

Side by Side Diff: chrome/browser/apps/install_chrome_app.cc

Issue 412043003: Make --install-chrome-app use extensions::WebstoreInstallWithPrompt. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/apps/install_chrome_app.h" 5 #include "chrome/browser/apps/install_chrome_app.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/strings/stringprintf.h" 9 #include "base/strings/stringprintf.h"
10 #include "chrome/browser/browser_process.h" 10 #include "chrome/browser/browser_process.h"
11 #include "chrome/browser/extensions/webstore_install_with_prompt.h"
12 #include "chrome/browser/extensions/webstore_standalone_installer.h"
13 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/browser/ui/browser.h"
11 #include "chrome/browser/ui/browser_list.h" 15 #include "chrome/browser/ui/browser_list.h"
12 #include "chrome/browser/ui/browser_navigator.h" 16 #include "chrome/browser/ui/browser_window.h"
17 #include "extensions/browser/extension_registry.h"
13 #include "extensions/common/extension.h" 18 #include "extensions/common/extension.h"
14 #include "google_apis/gaia/gaia_urls.h" 19
15 #include "net/url_request/url_fetcher.h" 20 using extensions::ExtensionRegistry;
16 #include "net/url_request/url_fetcher_delegate.h"
17 21
18 namespace { 22 namespace {
19 23
20 // The URL to the webstore page for a specific app. "_asi=1" instructs webstore 24 // The URL to the webstore page for a specific app.
21 // to immediately try to install the app if the referrer is the sign in page.
22 // This is actually the short form of the URL which just redirects to the full
23 // URL. Since "_asi=1" only works on the full url, we need to resolve it first
24 // before navigating the user to it.
25 const char kWebstoreUrlFormat[] = 25 const char kWebstoreUrlFormat[] =
26 "https://chrome.google.com/webstore/detail/%s?_asi=1"; 26 "https://chrome.google.com/webstore/detail/%s";
27
28 // The URL for the sign in page, set as the referrer to webstore.
29 const char kAccountsUrl[] = "https://accounts.google.com/ServiceLogin";
30 27
31 // Returns the webstore URL for an app. 28 // Returns the webstore URL for an app.
32 GURL GetAppInstallUrl(const std::string& app_id) { 29 GURL GetAppInstallUrl(const std::string& app_id) {
33 return GURL(base::StringPrintf(kWebstoreUrlFormat, app_id.c_str())); 30 return GURL(base::StringPrintf(kWebstoreUrlFormat, app_id.c_str()));
34 } 31 }
35 32
36 void NavigateToUrlWithAccountsReferrer(const GURL& url) {
37 Browser* browser =
38 BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_NATIVE)->get(0);
39 if (!browser)
40 return;
41
42 chrome::NavigateParams params(
43 browser, url, content::PAGE_TRANSITION_AUTO_TOPLEVEL);
44 params.disposition = NEW_FOREGROUND_TAB;
45 params.window_action = chrome::NavigateParams::SHOW_WINDOW;
46 params.referrer = content::Referrer();
47 params.referrer.url = GURL(kAccountsUrl);
48 chrome::Navigate(&params);
49 }
50
51 class AppURLFetcher : net::URLFetcherDelegate {
52 public:
53 explicit AppURLFetcher(const std::string& app_id);
54
55 // net::URLFetcherDelegate OVERRIDES:
56 virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
57
58 private:
59 virtual ~AppURLFetcher();
60
61 scoped_ptr<net::URLFetcher> url_fetcher_;
62
63 DISALLOW_COPY_AND_ASSIGN(AppURLFetcher);
64 };
65
66 AppURLFetcher::AppURLFetcher(const std::string& app_id) {
67 url_fetcher_.reset(net::URLFetcher::Create(
68 GetAppInstallUrl(app_id), net::URLFetcher::GET, this));
69 url_fetcher_->SetRequestContext(g_browser_process->system_request_context());
70 url_fetcher_->SetStopOnRedirect(true);
71 url_fetcher_->Start();
72 }
73
74 AppURLFetcher::~AppURLFetcher() {
75 }
76
77 void AppURLFetcher::OnURLFetchComplete(const net::URLFetcher* source) {
78 if (source->GetResponseCode() == 301) {
79 // Moved permanently.
80 NavigateToUrlWithAccountsReferrer(source->GetURL());
81 }
82
83 delete this;
84 }
85
86 } // namespace 33 } // namespace
87 34
88 namespace install_chrome_app { 35 namespace install_chrome_app {
89 36
90 void InstallChromeApp(const std::string& app_id) { 37 void InstallChromeApp(const std::string& app_id) {
91 if (!extensions::Extension::IdIsValid(app_id)) 38 if (!extensions::Extension::IdIsValid(app_id))
92 return; 39 return;
93 40
94 new AppURLFetcher(app_id); 41 // At the moment InstallChromeApp() is called immediately after handling
42 // startup URLs, so a browser is guaranteed to be created. If that changes we
43 // may need to start a browser or browser session here.
44 Browser* browser =
45 BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_NATIVE)->get(0);
46 DCHECK(browser);
47
48 content::OpenURLParams params(GetAppInstallUrl(app_id),
49 content::Referrer(),
50 NEW_FOREGROUND_TAB,
51 content::PAGE_TRANSITION_AUTO_TOPLEVEL,
52 false);
53 browser->OpenURL(params);
54
55 ExtensionRegistry* registry = ExtensionRegistry::Get(browser->profile());
56 // Skip if this app is already installed or blacklisted. For disabled or
57 // or terminated apps, going through the installation flow should re-enable
58 // them.
59 const extensions::Extension* installed_extension = registry->GetExtensionById(
60 app_id, ExtensionRegistry::ENABLED | ExtensionRegistry::BLACKLISTED);
61 // TODO(jackhou): For installed apps, maybe we should do something better,
62 // e.g. show the app list (and re-add it to the taskbar).
63 if (installed_extension)
64 return;
65
66 extensions::WebstoreInstallWithPrompt* installer =
67 new extensions::WebstoreInstallWithPrompt(
68 app_id,
69 browser->profile(),
70 browser->window()->GetNativeWindow(),
71 extensions::WebstoreStandaloneInstaller::Callback());
72 installer->BeginInstall();
95 } 73 }
96 74
97 } // namespace install_chrome_app 75 } // namespace install_chrome_app
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698