1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/ui/webui/extensions/install_extension_handler.h"
8 #include "base/strings/string_util.h"
9 #include "base/strings/utf_string_conversions.h"
10 #include "chrome/browser/extensions/crx_installer.h"
11 #include "chrome/browser/extensions/extension_install_prompt.h"
12 #include "chrome/browser/extensions/extension_service.h"
13 #include "chrome/browser/extensions/unpacked_installer.h"
14 #include "chrome/browser/extensions/zipfile_installer.h"
15 #include "chrome/browser/profiles/profile.h"
16 #include "chrome/grit/generated_resources.h"
17 #include "content/public/browser/web_contents.h"
18 #include "content/public/browser/web_ui.h"
19 #include "content/public/browser/web_ui_data_source.h"
20 #include "content/public/common/drop_data.h"
21 #include "extensions/browser/extension_system.h"
22 #include "extensions/common/feature_switch.h"
23 #include "net/base/filename_util.h"
24 #include "ui/base/l10n/l10n_util.h"
26 namespace extensions
{
28 InstallExtensionHandler::InstallExtensionHandler() {
31 InstallExtensionHandler::~InstallExtensionHandler() {
34 void InstallExtensionHandler::GetLocalizedValues(
35 content::WebUIDataSource
* source
) {
37 "extensionSettingsInstallDropTarget",
38 l10n_util::GetStringUTF16(IDS_EXTENSIONS_INSTALL_DROP_TARGET
));
40 "offStoreInstallEnabled",
41 FeatureSwitch::easy_off_store_install()->IsEnabled());
44 void InstallExtensionHandler::RegisterMessages() {
45 web_ui()->RegisterMessageCallback(
47 base::Bind(&InstallExtensionHandler::HandleStartDragMessage
,
48 base::Unretained(this)));
49 web_ui()->RegisterMessageCallback(
51 base::Bind(&InstallExtensionHandler::HandleStopDragMessage
,
52 base::Unretained(this)));
53 web_ui()->RegisterMessageCallback(
55 base::Bind(&InstallExtensionHandler::HandleInstallMessage
,
56 base::Unretained(this)));
57 web_ui()->RegisterMessageCallback(
58 "installDroppedDirectory",
59 base::Bind(&InstallExtensionHandler::HandleInstallDirectoryMessage
,
60 base::Unretained(this)));
63 void InstallExtensionHandler::HandleStartDragMessage(
64 const base::ListValue
* args
) {
65 content::DropData
* drop_data
=
66 web_ui()->GetWebContents()->GetDropData();
68 DLOG(ERROR
) << "No current drop data.";
72 if (drop_data
->filenames
.empty()) {
73 DLOG(ERROR
) << "Current drop data contains no files.";
77 const ui::FileInfo
& file_info
= drop_data
->filenames
.front();
79 file_to_install_
= file_info
.path
;
80 // Use the display name if provided, for checking file names
81 // (.path is likely a random hash value in that case).
83 file_info
.display_name
.empty() ? file_info
.path
: file_info
.display_name
;
86 void InstallExtensionHandler::HandleStopDragMessage(
87 const base::ListValue
* args
) {
88 file_to_install_
.clear();
89 file_display_name_
.clear();
92 void InstallExtensionHandler::HandleInstallMessage(
93 const base::ListValue
* args
) {
94 if (file_to_install_
.empty()) {
95 LOG(ERROR
) << "No file captured to install.";
99 Profile
* profile
= Profile::FromBrowserContext(
100 web_ui()->GetWebContents()->GetBrowserContext());
102 if (file_display_name_
.MatchesExtension(FILE_PATH_LITERAL(".zip"))) {
103 ZipFileInstaller::Create(ExtensionSystem::Get(profile
)->extension_service())
104 ->LoadFromZipFile(file_to_install_
);
106 scoped_ptr
<ExtensionInstallPrompt
> prompt(
107 new ExtensionInstallPrompt(web_ui()->GetWebContents()));
108 scoped_refptr
<CrxInstaller
> crx_installer(CrxInstaller::Create(
109 ExtensionSystem::Get(profile
)->extension_service(), prompt
.Pass()));
110 crx_installer
->set_error_on_unsupported_requirements(true);
111 crx_installer
->set_off_store_install_allow_reason(
112 CrxInstaller::OffStoreInstallAllowedFromSettingsPage
);
113 crx_installer
->set_install_immediately(true);
115 if (file_display_name_
.MatchesExtension(FILE_PATH_LITERAL(".user.js"))) {
116 crx_installer
->InstallUserScript(
117 file_to_install_
, net::FilePathToFileURL(file_to_install_
));
118 } else if (file_display_name_
.MatchesExtension(FILE_PATH_LITERAL(".crx"))) {
119 crx_installer
->InstallCrx(file_to_install_
);
125 file_to_install_
.clear();
126 file_display_name_
.clear();
129 void InstallExtensionHandler::HandleInstallDirectoryMessage(
130 const base::ListValue
* args
) {
131 Profile
* profile
= Profile::FromBrowserContext(
132 web_ui()->GetWebContents()->GetBrowserContext());
133 UnpackedInstaller::Create(
134 ExtensionSystem::Get(profile
)->
135 extension_service())->Load(file_to_install_
);
138 } // namespace extensions