OLD | NEW |
| (Empty) |
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/extensions/extension_warning_set.h" | |
6 | |
7 #include "base/files/file_path.h" | |
8 #include "base/strings/string_util.h" | |
9 #include "base/strings/utf_string_conversions.h" | |
10 #include "chrome/browser/chrome_notification_types.h" | |
11 #include "chrome/grit/chromium_strings.h" | |
12 #include "chrome/grit/generated_resources.h" | |
13 #include "content/public/browser/browser_thread.h" | |
14 #include "extensions/common/extension.h" | |
15 #include "extensions/common/extension_set.h" | |
16 #include "net/base/escape.h" | |
17 #include "ui/base/l10n/l10n_util.h" | |
18 | |
19 using content::BrowserThread; | |
20 | |
21 namespace { | |
22 // Prefix for message parameters indicating that the parameter needs to | |
23 // be translated from an extension id to the extension name. | |
24 const char kTranslate[] = "TO_TRANSLATE:"; | |
25 const size_t kMaxNumberOfParameters = 4; | |
26 } | |
27 | |
28 namespace extensions { | |
29 | |
30 // | |
31 // ExtensionWarning | |
32 // | |
33 | |
34 ExtensionWarning::ExtensionWarning( | |
35 WarningType type, | |
36 const std::string& extension_id, | |
37 int message_id, | |
38 const std::vector<std::string>& message_parameters) | |
39 : type_(type), | |
40 extension_id_(extension_id), | |
41 message_id_(message_id), | |
42 message_parameters_(message_parameters) { | |
43 // These are invalid here because they do not have corresponding warning | |
44 // messages in the UI. | |
45 CHECK_NE(type, kInvalid); | |
46 CHECK_NE(type, kMaxWarningType); | |
47 CHECK_LE(message_parameters.size(), kMaxNumberOfParameters); | |
48 } | |
49 | |
50 ExtensionWarning::ExtensionWarning(const ExtensionWarning& other) | |
51 : type_(other.type_), | |
52 extension_id_(other.extension_id_), | |
53 message_id_(other.message_id_), | |
54 message_parameters_(other.message_parameters_) {} | |
55 | |
56 ExtensionWarning::~ExtensionWarning() { | |
57 } | |
58 | |
59 ExtensionWarning& ExtensionWarning::operator=(const ExtensionWarning& other) { | |
60 type_ = other.type_; | |
61 extension_id_ = other.extension_id_; | |
62 message_id_ = other.message_id_; | |
63 message_parameters_ = other.message_parameters_; | |
64 return *this; | |
65 } | |
66 | |
67 // static | |
68 ExtensionWarning ExtensionWarning::CreateNetworkDelayWarning( | |
69 const std::string& extension_id) { | |
70 std::vector<std::string> message_parameters; | |
71 message_parameters.push_back(l10n_util::GetStringUTF8(IDS_PRODUCT_NAME)); | |
72 return ExtensionWarning( | |
73 kNetworkDelay, | |
74 extension_id, | |
75 IDS_EXTENSION_WARNINGS_NETWORK_DELAY, | |
76 message_parameters); | |
77 } | |
78 | |
79 // static | |
80 ExtensionWarning ExtensionWarning::CreateNetworkConflictWarning( | |
81 const std::string& extension_id) { | |
82 std::vector<std::string> message_parameters; | |
83 return ExtensionWarning( | |
84 kNetworkConflict, | |
85 extension_id, | |
86 IDS_EXTENSION_WARNINGS_NETWORK_CONFLICT, | |
87 message_parameters); | |
88 } | |
89 | |
90 // static | |
91 ExtensionWarning ExtensionWarning::CreateRedirectConflictWarning( | |
92 const std::string& extension_id, | |
93 const std::string& winning_extension_id, | |
94 const GURL& attempted_redirect_url, | |
95 const GURL& winning_redirect_url) { | |
96 std::vector<std::string> message_parameters; | |
97 message_parameters.push_back(attempted_redirect_url.spec()); | |
98 message_parameters.push_back(kTranslate + winning_extension_id); | |
99 message_parameters.push_back(winning_redirect_url.spec()); | |
100 return ExtensionWarning( | |
101 kRedirectConflict, | |
102 extension_id, | |
103 IDS_EXTENSION_WARNINGS_REDIRECT_CONFLICT, | |
104 message_parameters); | |
105 } | |
106 | |
107 // static | |
108 ExtensionWarning ExtensionWarning::CreateRequestHeaderConflictWarning( | |
109 const std::string& extension_id, | |
110 const std::string& winning_extension_id, | |
111 const std::string& conflicting_header) { | |
112 std::vector<std::string> message_parameters; | |
113 message_parameters.push_back(conflicting_header); | |
114 message_parameters.push_back(kTranslate + winning_extension_id); | |
115 return ExtensionWarning( | |
116 kNetworkConflict, | |
117 extension_id, | |
118 IDS_EXTENSION_WARNINGS_REQUEST_HEADER_CONFLICT, | |
119 message_parameters); | |
120 } | |
121 | |
122 // static | |
123 ExtensionWarning ExtensionWarning::CreateResponseHeaderConflictWarning( | |
124 const std::string& extension_id, | |
125 const std::string& winning_extension_id, | |
126 const std::string& conflicting_header) { | |
127 std::vector<std::string> message_parameters; | |
128 message_parameters.push_back(conflicting_header); | |
129 message_parameters.push_back(kTranslate + winning_extension_id); | |
130 return ExtensionWarning( | |
131 kNetworkConflict, | |
132 extension_id, | |
133 IDS_EXTENSION_WARNINGS_RESPONSE_HEADER_CONFLICT, | |
134 message_parameters); | |
135 } | |
136 | |
137 // static | |
138 ExtensionWarning ExtensionWarning::CreateCredentialsConflictWarning( | |
139 const std::string& extension_id, | |
140 const std::string& winning_extension_id) { | |
141 std::vector<std::string> message_parameters; | |
142 message_parameters.push_back(kTranslate + winning_extension_id); | |
143 return ExtensionWarning( | |
144 kNetworkConflict, | |
145 extension_id, | |
146 IDS_EXTENSION_WARNINGS_CREDENTIALS_CONFLICT, | |
147 message_parameters); | |
148 } | |
149 | |
150 // static | |
151 ExtensionWarning ExtensionWarning::CreateRepeatedCacheFlushesWarning( | |
152 const std::string& extension_id) { | |
153 std::vector<std::string> message_parameters; | |
154 message_parameters.push_back(l10n_util::GetStringUTF8(IDS_PRODUCT_NAME)); | |
155 return ExtensionWarning( | |
156 kRepeatedCacheFlushes, | |
157 extension_id, | |
158 IDS_EXTENSION_WARNINGS_NETWORK_DELAY, | |
159 message_parameters); | |
160 } | |
161 | |
162 // static | |
163 ExtensionWarning ExtensionWarning::CreateDownloadFilenameConflictWarning( | |
164 const std::string& losing_extension_id, | |
165 const std::string& winning_extension_id, | |
166 const base::FilePath& losing_filename, | |
167 const base::FilePath& winning_filename) { | |
168 std::vector<std::string> message_parameters; | |
169 message_parameters.push_back(base::UTF16ToUTF8( | |
170 losing_filename.LossyDisplayName())); | |
171 message_parameters.push_back(kTranslate + winning_extension_id); | |
172 message_parameters.push_back(base::UTF16ToUTF8( | |
173 winning_filename.LossyDisplayName())); | |
174 return ExtensionWarning( | |
175 kDownloadFilenameConflict, | |
176 losing_extension_id, | |
177 IDS_EXTENSION_WARNINGS_DOWNLOAD_FILENAME_CONFLICT, | |
178 message_parameters); | |
179 } | |
180 | |
181 // static | |
182 ExtensionWarning ExtensionWarning::CreateReloadTooFrequentWarning( | |
183 const std::string& extension_id) { | |
184 std::vector<std::string> message_parameters; | |
185 return ExtensionWarning(kReloadTooFrequent, | |
186 extension_id, | |
187 IDS_EXTENSION_WARNING_RELOAD_TOO_FREQUENT, | |
188 message_parameters); | |
189 } | |
190 | |
191 std::string ExtensionWarning::GetLocalizedMessage( | |
192 const ExtensionSet* extensions) const { | |
193 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
194 | |
195 // These parameters may be unsafe (URLs and Extension names) and need | |
196 // to be HTML-escaped before being embedded in the UI. Also extension IDs | |
197 // are translated to full extension names. | |
198 std::vector<base::string16> final_parameters; | |
199 for (size_t i = 0; i < message_parameters_.size(); ++i) { | |
200 std::string message = message_parameters_[i]; | |
201 if (StartsWithASCII(message, kTranslate, true)) { | |
202 std::string extension_id = message.substr(sizeof(kTranslate) - 1); | |
203 const extensions::Extension* extension = | |
204 extensions->GetByID(extension_id); | |
205 message = extension ? extension->name() : extension_id; | |
206 } | |
207 final_parameters.push_back(base::UTF8ToUTF16(net::EscapeForHTML(message))); | |
208 } | |
209 | |
210 COMPILE_ASSERT(kMaxNumberOfParameters == 4u, YouNeedToAddMoreCaseStatements); | |
211 switch (final_parameters.size()) { | |
212 case 0: | |
213 return l10n_util::GetStringUTF8(message_id_); | |
214 case 1: | |
215 return l10n_util::GetStringFUTF8(message_id_, final_parameters[0]); | |
216 case 2: | |
217 return l10n_util::GetStringFUTF8(message_id_, final_parameters[0], | |
218 final_parameters[1]); | |
219 case 3: | |
220 return l10n_util::GetStringFUTF8(message_id_, final_parameters[0], | |
221 final_parameters[1], final_parameters[2]); | |
222 case 4: | |
223 return l10n_util::GetStringFUTF8(message_id_, final_parameters[0], | |
224 final_parameters[1], final_parameters[2], final_parameters[3]); | |
225 default: | |
226 NOTREACHED(); | |
227 return std::string(); | |
228 } | |
229 } | |
230 | |
231 bool operator<(const ExtensionWarning& a, const ExtensionWarning& b) { | |
232 if (a.extension_id() != b.extension_id()) | |
233 return a.extension_id() < b.extension_id(); | |
234 return a.warning_type() < b.warning_type(); | |
235 } | |
236 | |
237 } // namespace extensions | |
OLD | NEW |