OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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/extension_web_ui.h" | 5 #include "chrome/browser/extensions/extension_web_ui.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 27 matching lines...) Expand all Loading... |
38 #include "ui/gfx/favicon_size.h" | 38 #include "ui/gfx/favicon_size.h" |
39 #include "ui/gfx/image/image_skia.h" | 39 #include "ui/gfx/image/image_skia.h" |
40 | 40 |
41 using content::WebContents; | 41 using content::WebContents; |
42 using extensions::Extension; | 42 using extensions::Extension; |
43 using extensions::URLOverrides; | 43 using extensions::URLOverrides; |
44 | 44 |
45 namespace { | 45 namespace { |
46 | 46 |
47 // De-dupes the items in |list|. Assumes the values are strings. | 47 // De-dupes the items in |list|. Assumes the values are strings. |
48 void CleanUpDuplicates(ListValue* list) { | 48 void CleanUpDuplicates(base::ListValue* list) { |
49 std::set<std::string> seen_values; | 49 std::set<std::string> seen_values; |
50 | 50 |
51 // Loop backwards as we may be removing items. | 51 // Loop backwards as we may be removing items. |
52 for (size_t i = list->GetSize() - 1; (i + 1) > 0; --i) { | 52 for (size_t i = list->GetSize() - 1; (i + 1) > 0; --i) { |
53 std::string value; | 53 std::string value; |
54 if (!list->GetString(i, &value)) { | 54 if (!list->GetString(i, &value)) { |
55 NOTREACHED(); | 55 NOTREACHED(); |
56 continue; | 56 continue; |
57 } | 57 } |
58 | 58 |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); | 171 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); |
172 } | 172 } |
173 | 173 |
174 // static | 174 // static |
175 bool ExtensionWebUI::HandleChromeURLOverride( | 175 bool ExtensionWebUI::HandleChromeURLOverride( |
176 GURL* url, content::BrowserContext* browser_context) { | 176 GURL* url, content::BrowserContext* browser_context) { |
177 if (!url->SchemeIs(chrome::kChromeUIScheme)) | 177 if (!url->SchemeIs(chrome::kChromeUIScheme)) |
178 return false; | 178 return false; |
179 | 179 |
180 Profile* profile = Profile::FromBrowserContext(browser_context); | 180 Profile* profile = Profile::FromBrowserContext(browser_context); |
181 const DictionaryValue* overrides = | 181 const base::DictionaryValue* overrides = |
182 profile->GetPrefs()->GetDictionary(kExtensionURLOverrides); | 182 profile->GetPrefs()->GetDictionary(kExtensionURLOverrides); |
183 std::string page = url->host(); | 183 std::string page = url->host(); |
184 const ListValue* url_list = NULL; | 184 const base::ListValue* url_list = NULL; |
185 if (!overrides || !overrides->GetList(page, &url_list)) | 185 if (!overrides || !overrides->GetList(page, &url_list)) |
186 return false; | 186 return false; |
187 | 187 |
188 ExtensionService* service = profile->GetExtensionService(); | 188 ExtensionService* service = profile->GetExtensionService(); |
189 | 189 |
190 size_t i = 0; | 190 size_t i = 0; |
191 while (i < url_list->GetSize()) { | 191 while (i < url_list->GetSize()) { |
192 const Value* val = NULL; | 192 const Value* val = NULL; |
193 url_list->Get(i, &val); | 193 url_list->Get(i, &val); |
194 | 194 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 *url = extension_url; | 237 *url = extension_url; |
238 return true; | 238 return true; |
239 } | 239 } |
240 return false; | 240 return false; |
241 } | 241 } |
242 | 242 |
243 // static | 243 // static |
244 bool ExtensionWebUI::HandleChromeURLOverrideReverse( | 244 bool ExtensionWebUI::HandleChromeURLOverrideReverse( |
245 GURL* url, content::BrowserContext* browser_context) { | 245 GURL* url, content::BrowserContext* browser_context) { |
246 Profile* profile = Profile::FromBrowserContext(browser_context); | 246 Profile* profile = Profile::FromBrowserContext(browser_context); |
247 const DictionaryValue* overrides = | 247 const base::DictionaryValue* overrides = |
248 profile->GetPrefs()->GetDictionary(kExtensionURLOverrides); | 248 profile->GetPrefs()->GetDictionary(kExtensionURLOverrides); |
249 if (!overrides) | 249 if (!overrides) |
250 return false; | 250 return false; |
251 | 251 |
252 // Find the reverse mapping based on the given URL. For example this maps the | 252 // Find the reverse mapping based on the given URL. For example this maps the |
253 // internal URL | 253 // internal URL |
254 // chrome-extension://eemcgdkfndhakfknompkggombfjjjeno/main.html#1 to | 254 // chrome-extension://eemcgdkfndhakfknompkggombfjjjeno/main.html#1 to |
255 // chrome://bookmarks/#1 for display in the omnibox. | 255 // chrome://bookmarks/#1 for display in the omnibox. |
256 for (DictionaryValue::Iterator it(*overrides); !it.IsAtEnd(); it.Advance()) { | 256 for (base::DictionaryValue::Iterator it(*overrides); !it.IsAtEnd(); |
257 const ListValue* url_list = NULL; | 257 it.Advance()) { |
| 258 const base::ListValue* url_list = NULL; |
258 if (!it.value().GetAsList(&url_list)) | 259 if (!it.value().GetAsList(&url_list)) |
259 continue; | 260 continue; |
260 | 261 |
261 for (ListValue::const_iterator it2 = url_list->begin(); | 262 for (base::ListValue::const_iterator it2 = url_list->begin(); |
262 it2 != url_list->end(); ++it2) { | 263 it2 != url_list->end(); ++it2) { |
263 std::string override; | 264 std::string override; |
264 if (!(*it2)->GetAsString(&override)) | 265 if (!(*it2)->GetAsString(&override)) |
265 continue; | 266 continue; |
266 if (StartsWithASCII(url->spec(), override, true)) { | 267 if (StartsWithASCII(url->spec(), override, true)) { |
267 GURL original_url(chrome::kChromeUIScheme + std::string("://") + | 268 GURL original_url(chrome::kChromeUIScheme + std::string("://") + |
268 it.key() + url->spec().substr(override.length())); | 269 it.key() + url->spec().substr(override.length())); |
269 *url = original_url; | 270 *url = original_url; |
270 return true; | 271 return true; |
271 } | 272 } |
272 } | 273 } |
273 } | 274 } |
274 | 275 |
275 return false; | 276 return false; |
276 } | 277 } |
277 | 278 |
278 // static | 279 // static |
279 void ExtensionWebUI::RegisterChromeURLOverrides( | 280 void ExtensionWebUI::RegisterChromeURLOverrides( |
280 Profile* profile, const URLOverrides::URLOverrideMap& overrides) { | 281 Profile* profile, const URLOverrides::URLOverrideMap& overrides) { |
281 if (overrides.empty()) | 282 if (overrides.empty()) |
282 return; | 283 return; |
283 | 284 |
284 PrefService* prefs = profile->GetPrefs(); | 285 PrefService* prefs = profile->GetPrefs(); |
285 DictionaryPrefUpdate update(prefs, kExtensionURLOverrides); | 286 DictionaryPrefUpdate update(prefs, kExtensionURLOverrides); |
286 DictionaryValue* all_overrides = update.Get(); | 287 base::DictionaryValue* all_overrides = update.Get(); |
287 | 288 |
288 // For each override provided by the extension, add it to the front of | 289 // For each override provided by the extension, add it to the front of |
289 // the override list if it's not already in the list. | 290 // the override list if it's not already in the list. |
290 URLOverrides::URLOverrideMap::const_iterator iter = overrides.begin(); | 291 URLOverrides::URLOverrideMap::const_iterator iter = overrides.begin(); |
291 for (; iter != overrides.end(); ++iter) { | 292 for (; iter != overrides.end(); ++iter) { |
292 const std::string& key = iter->first; | 293 const std::string& key = iter->first; |
293 ListValue* page_overrides = NULL; | 294 base::ListValue* page_overrides = NULL; |
294 if (!all_overrides->GetList(key, &page_overrides)) { | 295 if (!all_overrides->GetList(key, &page_overrides)) { |
295 page_overrides = new ListValue(); | 296 page_overrides = new base::ListValue(); |
296 all_overrides->Set(key, page_overrides); | 297 all_overrides->Set(key, page_overrides); |
297 } else { | 298 } else { |
298 CleanUpDuplicates(page_overrides); | 299 CleanUpDuplicates(page_overrides); |
299 | 300 |
300 // Verify that the override isn't already in the list. | 301 // Verify that the override isn't already in the list. |
301 ListValue::iterator i = page_overrides->begin(); | 302 base::ListValue::iterator i = page_overrides->begin(); |
302 for (; i != page_overrides->end(); ++i) { | 303 for (; i != page_overrides->end(); ++i) { |
303 std::string override_val; | 304 std::string override_val; |
304 if (!(*i)->GetAsString(&override_val)) { | 305 if (!(*i)->GetAsString(&override_val)) { |
305 NOTREACHED(); | 306 NOTREACHED(); |
306 continue; | 307 continue; |
307 } | 308 } |
308 if (override_val == iter->second.spec()) | 309 if (override_val == iter->second.spec()) |
309 break; | 310 break; |
310 } | 311 } |
311 // This value is already in the list, leave it alone. | 312 // This value is already in the list, leave it alone. |
312 if (i != page_overrides->end()) | 313 if (i != page_overrides->end()) |
313 continue; | 314 continue; |
314 } | 315 } |
315 // Insert the override at the front of the list. Last registered override | 316 // Insert the override at the front of the list. Last registered override |
316 // wins. | 317 // wins. |
317 page_overrides->Insert(0, new StringValue(iter->second.spec())); | 318 page_overrides->Insert(0, new StringValue(iter->second.spec())); |
318 } | 319 } |
319 } | 320 } |
320 | 321 |
321 // static | 322 // static |
322 void ExtensionWebUI::UnregisterAndReplaceOverride(const std::string& page, | 323 void ExtensionWebUI::UnregisterAndReplaceOverride(const std::string& page, |
323 Profile* profile, | 324 Profile* profile, |
324 ListValue* list, | 325 base::ListValue* list, |
325 const Value* override) { | 326 const Value* override) { |
326 size_t index = 0; | 327 size_t index = 0; |
327 bool found = list->Remove(*override, &index); | 328 bool found = list->Remove(*override, &index); |
328 if (found && index == 0) { | 329 if (found && index == 0) { |
329 // This is the active override, so we need to find all existing | 330 // This is the active override, so we need to find all existing |
330 // tabs for this override and get them to reload the original URL. | 331 // tabs for this override and get them to reload the original URL. |
331 base::Callback<void(WebContents*)> callback = | 332 base::Callback<void(WebContents*)> callback = |
332 base::Bind(&UnregisterAndReplaceOverrideForWebContents, page, profile); | 333 base::Bind(&UnregisterAndReplaceOverrideForWebContents, page, profile); |
333 ExtensionTabUtil::ForEachTab(callback); | 334 ExtensionTabUtil::ForEachTab(callback); |
334 } | 335 } |
335 } | 336 } |
336 | 337 |
337 // static | 338 // static |
338 void ExtensionWebUI::UnregisterChromeURLOverride(const std::string& page, | 339 void ExtensionWebUI::UnregisterChromeURLOverride(const std::string& page, |
339 Profile* profile, | 340 Profile* profile, |
340 const Value* override) { | 341 const Value* override) { |
341 if (!override) | 342 if (!override) |
342 return; | 343 return; |
343 PrefService* prefs = profile->GetPrefs(); | 344 PrefService* prefs = profile->GetPrefs(); |
344 DictionaryPrefUpdate update(prefs, kExtensionURLOverrides); | 345 DictionaryPrefUpdate update(prefs, kExtensionURLOverrides); |
345 DictionaryValue* all_overrides = update.Get(); | 346 base::DictionaryValue* all_overrides = update.Get(); |
346 ListValue* page_overrides = NULL; | 347 base::ListValue* page_overrides = NULL; |
347 if (!all_overrides->GetList(page, &page_overrides)) { | 348 if (!all_overrides->GetList(page, &page_overrides)) { |
348 // If it's being unregistered, it should already be in the list. | 349 // If it's being unregistered, it should already be in the list. |
349 NOTREACHED(); | 350 NOTREACHED(); |
350 return; | 351 return; |
351 } else { | 352 } else { |
352 UnregisterAndReplaceOverride(page, profile, page_overrides, override); | 353 UnregisterAndReplaceOverride(page, profile, page_overrides, override); |
353 } | 354 } |
354 } | 355 } |
355 | 356 |
356 // static | 357 // static |
357 void ExtensionWebUI::UnregisterChromeURLOverrides( | 358 void ExtensionWebUI::UnregisterChromeURLOverrides( |
358 Profile* profile, const URLOverrides::URLOverrideMap& overrides) { | 359 Profile* profile, const URLOverrides::URLOverrideMap& overrides) { |
359 if (overrides.empty()) | 360 if (overrides.empty()) |
360 return; | 361 return; |
361 PrefService* prefs = profile->GetPrefs(); | 362 PrefService* prefs = profile->GetPrefs(); |
362 DictionaryPrefUpdate update(prefs, kExtensionURLOverrides); | 363 DictionaryPrefUpdate update(prefs, kExtensionURLOverrides); |
363 DictionaryValue* all_overrides = update.Get(); | 364 base::DictionaryValue* all_overrides = update.Get(); |
364 URLOverrides::URLOverrideMap::const_iterator iter = overrides.begin(); | 365 URLOverrides::URLOverrideMap::const_iterator iter = overrides.begin(); |
365 for (; iter != overrides.end(); ++iter) { | 366 for (; iter != overrides.end(); ++iter) { |
366 const std::string& page = iter->first; | 367 const std::string& page = iter->first; |
367 ListValue* page_overrides = NULL; | 368 base::ListValue* page_overrides = NULL; |
368 if (!all_overrides->GetList(page, &page_overrides)) { | 369 if (!all_overrides->GetList(page, &page_overrides)) { |
369 // If it's being unregistered, it should already be in the list. | 370 // If it's being unregistered, it should already be in the list. |
370 NOTREACHED(); | 371 NOTREACHED(); |
371 continue; | 372 continue; |
372 } else { | 373 } else { |
373 StringValue override(iter->second.spec()); | 374 StringValue override(iter->second.spec()); |
374 UnregisterAndReplaceOverride(iter->first, profile, | 375 UnregisterAndReplaceOverride(iter->first, profile, |
375 page_overrides, &override); | 376 page_overrides, &override); |
376 } | 377 } |
377 } | 378 } |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
416 extensions::ImageLoader::ImageRepresentation::ALWAYS_RESIZE, | 417 extensions::ImageLoader::ImageRepresentation::ALWAYS_RESIZE, |
417 gfx::Size(pixel_size, pixel_size), | 418 gfx::Size(pixel_size, pixel_size), |
418 scale_factors[i])); | 419 scale_factors[i])); |
419 } | 420 } |
420 | 421 |
421 // LoadImagesAsync actually can run callback synchronously. We want to force | 422 // LoadImagesAsync actually can run callback synchronously. We want to force |
422 // async. | 423 // async. |
423 extensions::ImageLoader::Get(profile)->LoadImagesAsync( | 424 extensions::ImageLoader::Get(profile)->LoadImagesAsync( |
424 extension, info_list, base::Bind(&RunFaviconCallbackAsync, callback)); | 425 extension, info_list, base::Bind(&RunFaviconCallbackAsync, callback)); |
425 } | 426 } |
OLD | NEW |