Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / webui / extensions / install_extension_handler.cc
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.
4
5 #include "chrome/browser/ui/webui/extensions/install_extension_handler.h"
6
7 #include "base/bind.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/profiles/profile.h"
15 #include "content/public/browser/web_contents.h"
16 #include "content/public/browser/web_contents_view.h"
17 #include "content/public/browser/web_ui.h"
18 #include "content/public/browser/web_ui_data_source.h"
19 #include "content/public/common/drop_data.h"
20 #include "extensions/browser/extension_system.h"
21 #include "extensions/common/feature_switch.h"
22 #include "grit/generated_resources.h"
23 #include "net/base/net_util.h"
24 #include "ui/base/l10n/l10n_util.h"
25
26 namespace extensions {
27
28 InstallExtensionHandler::InstallExtensionHandler() {
29 }
30
31 InstallExtensionHandler::~InstallExtensionHandler() {
32 }
33
34 void InstallExtensionHandler::GetLocalizedValues(
35     content::WebUIDataSource* source) {
36   source->AddString(
37       "extensionSettingsInstallDropTarget",
38       l10n_util::GetStringUTF16(IDS_EXTENSIONS_INSTALL_DROP_TARGET));
39   source->AddBoolean(
40       "offStoreInstallEnabled",
41       FeatureSwitch::easy_off_store_install()->IsEnabled());
42 }
43
44 void InstallExtensionHandler::RegisterMessages() {
45   web_ui()->RegisterMessageCallback(
46       "startDrag",
47       base::Bind(&InstallExtensionHandler::HandleStartDragMessage,
48                  base::Unretained(this)));
49   web_ui()->RegisterMessageCallback(
50       "stopDrag",
51       base::Bind(&InstallExtensionHandler::HandleStopDragMessage,
52                  base::Unretained(this)));
53   web_ui()->RegisterMessageCallback(
54       "installDroppedFile",
55       base::Bind(&InstallExtensionHandler::HandleInstallMessage,
56                  base::Unretained(this)));
57   web_ui()->RegisterMessageCallback(
58       "installDroppedDirectory",
59       base::Bind(&InstallExtensionHandler::HandleInstallDirectoryMessage,
60                  base::Unretained(this)));
61 }
62
63 void InstallExtensionHandler::HandleStartDragMessage(
64     const base::ListValue* args) {
65   content::DropData* drop_data =
66       web_ui()->GetWebContents()->GetView()->GetDropData();
67   if (!drop_data) {
68     DLOG(ERROR) << "No current drop data.";
69     return;
70   }
71
72   if (drop_data->filenames.empty()) {
73     DLOG(ERROR) << "Current drop data contains no files.";
74     return;
75   }
76
77   const content::DropData::FileInfo& file_info = drop_data->filenames.front();
78
79   file_to_install_ = base::FilePath::FromUTF16Unsafe(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).
82   file_display_name_ =
83       file_info.display_name.empty() ? file_info.path : file_info.display_name;
84 }
85
86 void InstallExtensionHandler::HandleStopDragMessage(
87     const base::ListValue* args) {
88   file_to_install_.clear();
89   file_display_name_.clear();
90 }
91
92 void InstallExtensionHandler::HandleInstallMessage(
93     const base::ListValue* args) {
94   if (file_to_install_.empty()) {
95     LOG(ERROR) << "No file captured to install.";
96     return;
97   }
98
99   Profile* profile = Profile::FromBrowserContext(
100       web_ui()->GetWebContents()->GetBrowserContext());
101   scoped_ptr<ExtensionInstallPrompt> prompt(
102       new ExtensionInstallPrompt(web_ui()->GetWebContents()));
103   scoped_refptr<CrxInstaller> crx_installer(CrxInstaller::Create(
104       ExtensionSystem::Get(profile)->extension_service(),
105       prompt.Pass()));
106   crx_installer->set_error_on_unsupported_requirements(true);
107   crx_installer->set_off_store_install_allow_reason(
108       CrxInstaller::OffStoreInstallAllowedFromSettingsPage);
109   crx_installer->set_install_wait_for_idle(false);
110
111   const bool kCaseSensitive = false;
112
113   if (EndsWith(file_display_name_,
114       base::ASCIIToUTF16(".user.js"),
115       kCaseSensitive)) {
116     crx_installer->InstallUserScript(
117         file_to_install_,
118         net::FilePathToFileURL(file_to_install_));
119   } else if (EndsWith(file_display_name_,
120                       base::ASCIIToUTF16(".crx"),
121                       kCaseSensitive)) {
122     crx_installer->InstallCrx(file_to_install_);
123   } else {
124     CHECK(false);
125   }
126
127   file_to_install_.clear();
128   file_display_name_.clear();
129 }
130
131 void InstallExtensionHandler::HandleInstallDirectoryMessage(
132     const base::ListValue* args) {
133   Profile* profile = Profile::FromBrowserContext(
134       web_ui()->GetWebContents()->GetBrowserContext());
135   UnpackedInstaller::Create(
136       ExtensionSystem::Get(profile)->
137           extension_service())->Load(file_to_install_);
138 }
139
140 }  // namespace extensions