1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/extensions/api/inline_install_private/inline_install_private_api.h"
#include "base/bind.h"
#include "base/strings/string_number_conversions.h"
#include "chrome/browser/extensions/webstore_install_with_prompt.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/extensions/api/inline_install_private.h"
#include "chrome/common/extensions/api/webstore/webstore_api_constants.h"
#include "components/crx_file/id_util.h"
#include "content/public/browser/browser_thread.h"
#include "extensions/browser/extension_registry.h"
namespace extensions {
namespace {
class Installer : public WebstoreInstallWithPrompt {
public:
Installer(const std::string& id,
const GURL& requestor_url,
Profile* profile,
const Callback& callback);
protected:
friend class base::RefCountedThreadSafe<Installer>;
~Installer() override;
// Needed so that we send the right referrer value in requests to the
// webstore.
const GURL& GetRequestorURL() const override { return requestor_url_; }
scoped_refptr<ExtensionInstallPrompt::Prompt> CreateInstallPrompt() const
override;
void OnManifestParsed() override;
GURL requestor_url_;
};
Installer::Installer(const std::string& id,
const GURL& requestor_url,
Profile* profile,
const Callback& callback) :
WebstoreInstallWithPrompt(id, profile, callback),
requestor_url_(requestor_url) {
set_show_post_install_ui(false);
}
Installer::~Installer() {
}
scoped_refptr<ExtensionInstallPrompt::Prompt>
Installer::CreateInstallPrompt() const {
scoped_refptr<ExtensionInstallPrompt::Prompt> prompt(
new ExtensionInstallPrompt::Prompt(
ExtensionInstallPrompt::INLINE_INSTALL_PROMPT));
prompt->SetWebstoreData(localized_user_count(),
show_user_count(),
average_rating(),
rating_count());
return prompt;
}
void Installer::OnManifestParsed() {
if (manifest() == nullptr) {
CompleteInstall(webstore_install::INVALID_MANIFEST, std::string());
return;
}
Manifest parsed_manifest(Manifest::INTERNAL,
make_scoped_ptr(manifest()->DeepCopy()));
std::string manifest_error;
std::vector<InstallWarning> warnings;
if (!parsed_manifest.is_platform_app()) {
CompleteInstall(webstore_install::NOT_PERMITTED, std::string());
return;
}
ProceedWithInstallPrompt();
}
} // namespace
InlineInstallPrivateInstallFunction::
InlineInstallPrivateInstallFunction() {
}
InlineInstallPrivateInstallFunction::
~InlineInstallPrivateInstallFunction() {
}
ExtensionFunction::ResponseAction
InlineInstallPrivateInstallFunction::Run() {
typedef api::inline_install_private::Install::Params Params;
scoped_ptr<Params> params(Params::Create(*args_));
if (!user_gesture())
return RespondNow(CreateResponse("Must be called with a user gesture",
webstore_install::NOT_PERMITTED));
content::WebContents* web_contents = GetAssociatedWebContents();
if (!web_contents)
return RespondNow(CreateResponse("Must be called from a foreground page",
webstore_install::NOT_PERMITTED));
ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context());
if (registry->GetExtensionById(params->id, ExtensionRegistry::EVERYTHING))
return RespondNow(CreateResponse("Already installed",
webstore_install::OTHER_ERROR));
scoped_refptr<Installer> installer =
new Installer(
params->id,
source_url_,
Profile::FromBrowserContext(browser_context()),
base::Bind(
&InlineInstallPrivateInstallFunction::InstallerCallback,
this));
installer->BeginInstall();
return RespondLater();
}
void InlineInstallPrivateInstallFunction::InstallerCallback(
bool success,
const std::string& error,
webstore_install::Result result) {
Respond(CreateResponse(success ? std::string() : error, result));
}
ExtensionFunction::ResponseValue
InlineInstallPrivateInstallFunction::CreateResponse(
const std::string& error, webstore_install::Result result) {
return ArgumentList(api::inline_install_private::Install::Results::Create(
error,
api::webstore::kInstallResultCodes[result]));
}
} // namespace extensions
|