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

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: Redo this with only changes to install_chrome_app. 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_startup_installer.h"
12 #include "chrome/browser/profiles/profile.h"
13 #include "chrome/browser/ui/browser.h"
11 #include "chrome/browser/ui/browser_list.h" 14 #include "chrome/browser/ui/browser_list.h"
12 #include "chrome/browser/ui/browser_navigator.h" 15 #include "chrome/common/extensions/webstore_install_result.h"
16 #include "extensions/browser/extension_registry.h"
13 #include "extensions/common/extension.h" 17 #include "extensions/common/extension.h"
14 #include "google_apis/gaia/gaia_urls.h"
15 #include "net/url_request/url_fetcher.h"
16 #include "net/url_request/url_fetcher_delegate.h"
17 18
18 namespace { 19 namespace {
19 20
20 // The URL to the webstore page for a specific app. "_asi=1" instructs webstore 21 // 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[] = 22 const char kWebstoreUrlFormat[] =
26 "https://chrome.google.com/webstore/detail/%s?_asi=1"; 23 "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 24
31 // Returns the webstore URL for an app. 25 // Returns the webstore URL for an app.
32 GURL GetAppInstallUrl(const std::string& app_id) { 26 GURL GetAppInstallUrl(const std::string& app_id) {
33 return GURL(base::StringPrintf(kWebstoreUrlFormat, app_id.c_str())); 27 return GURL(base::StringPrintf(kWebstoreUrlFormat, app_id.c_str()));
34 } 28 }
35 29
36 void NavigateToUrlWithAccountsReferrer(const GURL& url) { 30 void DoNothingCallback(bool success,
37 Browser* browser = 31 const std::string& error,
38 BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_NATIVE)->get(0); 32 extensions::webstore_install::Result result) {
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 } 33 }
85 34
86 } // namespace 35 } // namespace
87 36
88 namespace install_chrome_app { 37 namespace install_chrome_app {
89 38
90 void InstallChromeApp(const std::string& app_id) { 39 void InstallChromeApp(const std::string& app_id) {
91 if (!extensions::Extension::IdIsValid(app_id)) 40 if (!extensions::Extension::IdIsValid(app_id))
92 return; 41 return;
93 42
94 new AppURLFetcher(app_id); 43 Browser* browser =
44 BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_NATIVE)->get(0);
tapted 2014/07/28 03:41:04 I don't think BrowserList::get() can ever return N
jackhou1 2014/07/28 04:18:53 At the moment it's not an issue, but that might ch
45 if (!browser)
46 return;
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 extensions::ExtensionRegistry* registry =
tapted 2014/07/28 03:41:04 nit: maybe `using extensions::ExtensionRegistry`?
jackhou1 2014/07/28 04:18:53 Done.
56 extensions::ExtensionRegistry::Get(browser->profile());
57 const extensions::Extension* installed_extension = registry->GetExtensionById(
58 app_id,
59 extensions::ExtensionRegistry::ENABLED |
60 extensions::ExtensionRegistry::BLACKLISTED);
tapted 2014/07/28 03:41:04 This probably needs a comment to explain this flag
jackhou1 2014/07/28 04:18:53 Done.
61 if (installed_extension)
62 return;
tapted 2014/07/28 03:41:04 Maybe a TODO(..) determine UX for an installed ext
jackhou1 2014/07/28 04:18:53 Done.
63
64 extensions::WebstoreStartupInstaller* installer =
65 new extensions::WebstoreStartupInstaller(
66 app_id, browser->profile(), true, base::Bind(&DoNothingCallback));
67 installer->BeginInstall();
95 } 68 }
96 69
97 } // namespace install_chrome_app 70 } // 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