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

Side by Side Diff: chrome/browser/extensions/webstore_inline_installer.cc

Issue 7795032: Add link URL and success/failure callback parameters to chrome.webstore.install() (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Review feedback Created 9 years, 3 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
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/extensions/webstore_inline_installer.h" 5 #include "chrome/browser/extensions/webstore_inline_installer.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/string_util.h" 9 #include "base/string_util.h"
10 #include "base/values.h" 10 #include "base/values.h"
11 #include "chrome/browser/browser_process.h" 11 #include "chrome/browser/browser_process.h"
12 #include "chrome/browser/extensions/crx_installer.h" 12 #include "chrome/browser/extensions/crx_installer.h"
13 #include "chrome/browser/extensions/extension_install_dialog.h" 13 #include "chrome/browser/extensions/extension_install_dialog.h"
14 #include "chrome/browser/profiles/profile.h" 14 #include "chrome/browser/profiles/profile.h"
15 #include "chrome/common/chrome_utility_messages.h" 15 #include "chrome/common/chrome_utility_messages.h"
16 #include "chrome/common/extensions/extension.h" 16 #include "chrome/common/extensions/extension.h"
17 #include "chrome/common/extensions/extension_constants.h" 17 #include "chrome/common/extensions/extension_constants.h"
18 #include "chrome/common/extensions/url_pattern.h"
18 #include "content/browser/tab_contents/tab_contents.h" 19 #include "content/browser/tab_contents/tab_contents.h"
19 #include "content/browser/utility_process_host.h" 20 #include "content/browser/utility_process_host.h"
20 #include "googleurl/src/gurl.h"
21 #include "net/base/escape.h" 21 #include "net/base/escape.h"
22 #include "net/url_request/url_request_status.h" 22 #include "net/url_request/url_request_status.h"
23 23
24 const char kManifestKey[] = "manifest"; 24 const char kManifestKey[] = "manifest";
25 const char kIconUrlKey[] = "icon_url"; 25 const char kIconUrlKey[] = "icon_url";
26 const char kLocalizedNameKey[] = "localized_name"; 26 const char kLocalizedNameKey[] = "localized_name";
27 const char kLocalizedDescriptionKey[] = "localized_description"; 27 const char kLocalizedDescriptionKey[] = "localized_description";
28 const char kUsersKey[] = "users"; 28 const char kUsersKey[] = "users";
29 const char kAverageRatingKey[] = "average_rating"; 29 const char kAverageRatingKey[] = "average_rating";
30 const char kRatingCountKey[] = "rating_count"; 30 const char kRatingCountKey[] = "rating_count";
31 const char kVerifiedSiteKey[] = "verified_site";
31 32
32 const char kInvalidWebstoreItemId[] = "Invalid webstore item ID"; 33 const char kInvalidWebstoreItemId[] = "Invalid Chrome Web Store item ID";
33 const char kWebstoreRequestError[] = "Could not fetch data from webstore"; 34 const char kWebstoreRequestError[] =
34 const char kInvalidWebstoreResponseError[] = "Invalid webstore reponse"; 35 "Could not fetch data from the Chrome Web Store";
36 const char kInvalidWebstoreResponseError[] = "Invalid Chrome Web Store reponse";
35 const char kInvalidManifestError[] = "Invalid manifest"; 37 const char kInvalidManifestError[] = "Invalid manifest";
36 const char kUserCancelledError[] = "User cancelled install"; 38 const char kUserCancelledError[] = "User cancelled install";
39 const char kNotFromVerifiedSite[] =
40 "Installs can only be initiated by the Chrome Web Store item's verified "
41 "site";
37 42
38 class SafeWebstoreResponseParser : public UtilityProcessHost::Client { 43 class SafeWebstoreResponseParser : public UtilityProcessHost::Client {
39 public: 44 public:
40 SafeWebstoreResponseParser(WebstoreInlineInstaller *client, 45 SafeWebstoreResponseParser(WebstoreInlineInstaller *client,
41 const std::string& webstore_data) 46 const std::string& webstore_data)
42 : client_(client), 47 : client_(client),
43 webstore_data_(webstore_data), 48 webstore_data_(webstore_data),
44 utility_host_(NULL) {} 49 utility_host_(NULL) {}
45 50
46 void Start() { 51 void Start() {
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 125
121 std::string webstore_data_; 126 std::string webstore_data_;
122 127
123 UtilityProcessHost* utility_host_; 128 UtilityProcessHost* utility_host_;
124 129
125 std::string error_; 130 std::string error_;
126 scoped_ptr<DictionaryValue> parsed_webstore_data_; 131 scoped_ptr<DictionaryValue> parsed_webstore_data_;
127 }; 132 };
128 133
129 WebstoreInlineInstaller::WebstoreInlineInstaller(TabContents* tab_contents, 134 WebstoreInlineInstaller::WebstoreInlineInstaller(TabContents* tab_contents,
135 int install_id,
130 std::string webstore_item_id, 136 std::string webstore_item_id,
137 GURL requestor_url,
131 Delegate* delegate) 138 Delegate* delegate)
132 : tab_contents_(tab_contents), 139 : tab_contents_(tab_contents),
140 install_id_(install_id),
133 id_(webstore_item_id), 141 id_(webstore_item_id),
142 requestor_url_(requestor_url),
134 delegate_(delegate) {} 143 delegate_(delegate) {}
135 144
136 WebstoreInlineInstaller::~WebstoreInlineInstaller() { 145 WebstoreInlineInstaller::~WebstoreInlineInstaller() {
137 } 146 }
138 147
139 void WebstoreInlineInstaller::BeginInstall() { 148 void WebstoreInlineInstaller::BeginInstall() {
140 AddRef(); // Balanced in CompleteInstall. 149 AddRef(); // Balanced in CompleteInstall.
141 150
142 if (!Extension::IdIsValid(id_)) { 151 if (!Extension::IdIsValid(id_)) {
143 CompleteInstall(kInvalidWebstoreItemId); 152 CompleteInstall(kInvalidWebstoreItemId);
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 return; 227 return;
219 } 228 }
220 icon_url = GURL(extension_urls::GetWebstoreLaunchURL()).Resolve( 229 icon_url = GURL(extension_urls::GetWebstoreLaunchURL()).Resolve(
221 icon_url_string); 230 icon_url_string);
222 if (!icon_url.is_valid()) { 231 if (!icon_url.is_valid()) {
223 CompleteInstall(kInvalidWebstoreResponseError); 232 CompleteInstall(kInvalidWebstoreResponseError);
224 return; 233 return;
225 } 234 }
226 } 235 }
227 236
237 // Verified site is optional
238 if (webstore_data->HasKey(kVerifiedSiteKey)) {
239 std::string verified_site_domain;
240 if (!webstore_data->GetString(kVerifiedSiteKey, &verified_site_domain)) {
241 CompleteInstall(kInvalidWebstoreResponseError);
242 return;
243 }
244
245 URLPattern verified_site_pattern(URLPattern::SCHEME_ALL);
246 verified_site_pattern.SetScheme("*");
247 verified_site_pattern.SetHost(verified_site_domain);
248 verified_site_pattern.SetMatchSubdomains(true);
249 verified_site_pattern.SetPath("/*");
250
251 if (!verified_site_pattern.MatchesURL(requestor_url_)) {
252 CompleteInstall(kNotFromVerifiedSite);
253 return;
254 }
255 }
256
228 scoped_refptr<WebstoreInstallHelper> helper = new WebstoreInstallHelper( 257 scoped_refptr<WebstoreInstallHelper> helper = new WebstoreInstallHelper(
229 this, 258 this,
230 manifest, 259 manifest,
231 "", // We don't have any icon data. 260 "", // We don't have any icon data.
232 icon_url, 261 icon_url,
233 Profile::FromBrowserContext(tab_contents_->browser_context())-> 262 Profile::FromBrowserContext(tab_contents_->browser_context())->
234 GetRequestContext()); 263 GetRequestContext());
235 // The helper will call us back via OnWebstoreParseSucces or 264 // The helper will call us back via OnWebstoreParseSucces or
236 // OnWebstoreParseFailure. 265 // OnWebstoreParseFailure.
237 helper->Start(); 266 helper->Start();
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
305 // or NOTIFICATION_EXTENSION_INSTALL_ERROR fire). 334 // or NOTIFICATION_EXTENSION_INSTALL_ERROR fire).
306 CompleteInstall(""); 335 CompleteInstall("");
307 } 336 }
308 337
309 void WebstoreInlineInstaller::InstallUIAbort(bool user_initiated) { 338 void WebstoreInlineInstaller::InstallUIAbort(bool user_initiated) {
310 CompleteInstall(kUserCancelledError); 339 CompleteInstall(kUserCancelledError);
311 } 340 }
312 341
313 void WebstoreInlineInstaller::CompleteInstall(const std::string& error) { 342 void WebstoreInlineInstaller::CompleteInstall(const std::string& error) {
314 if (error.empty()) { 343 if (error.empty()) {
315 delegate_->OnInlineInstallSuccess(); 344 delegate_->OnInlineInstallSuccess(install_id_);
316 } else { 345 } else {
317 delegate_->OnInlineInstallFailure(error); 346 delegate_->OnInlineInstallFailure(install_id_, error);
318 } 347 }
319 Release(); // Matches the AddRef in BeginInstall. 348 Release(); // Matches the AddRef in BeginInstall.
320 } 349 }
OLDNEW
« no previous file with comments | « chrome/browser/extensions/webstore_inline_installer.h ('k') | chrome/common/extensions/extension_messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698