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/extensions_ui.h"
6
7#include "chrome/browser/profiles/profile.h"
8#include "chrome/browser/ui/webui/extensions/command_handler.h"
9#include "chrome/browser/ui/webui/extensions/extension_error_handler.h"
10#include "chrome/browser/ui/webui/extensions/extension_loader_handler.h"
11#include "chrome/browser/ui/webui/extensions/extension_settings_handler.h"
12#include "chrome/browser/ui/webui/extensions/install_extension_handler.h"
13#include "chrome/browser/ui/webui/extensions/pack_extension_handler.h"
14#include "chrome/browser/ui/webui/metrics_handler.h"
15#include "chrome/common/url_constants.h"
16#include "content/public/browser/web_ui.h"
17#include "content/public/browser/web_ui_data_source.h"
18#include "grit/browser_resources.h"
19#include "grit/theme_resources.h"
20#include "ui/base/resource/resource_bundle.h"
21
22#if defined(OS_CHROMEOS)
23#include "chrome/browser/ui/webui/extensions/chromeos/kiosk_apps_handler.h"
24#endif
25
26namespace extensions {
27
28namespace {
29
30content::WebUIDataSource* CreateExtensionsHTMLSource() {
31  content::WebUIDataSource* source =
32      content::WebUIDataSource::Create(chrome::kChromeUIExtensionsFrameHost);
33
34  source->SetUseJsonJSFormatV2();
35  source->SetJsonPath("strings.js");
36  source->AddResourcePath("extensions.js", IDR_EXTENSIONS_JS);
37  source->AddResourcePath("extension_command_list.js",
38                          IDR_EXTENSION_COMMAND_LIST_JS);
39  source->AddResourcePath("extension_list.js", IDR_EXTENSION_LIST_JS);
40  source->SetDefaultResource(IDR_EXTENSIONS_HTML);
41  source->DisableDenyXFrameOptions();
42  return source;
43}
44
45}  // namespace
46
47ExtensionsUI::ExtensionsUI(content::WebUI* web_ui) : WebUIController(web_ui) {
48  Profile* profile = Profile::FromWebUI(web_ui);
49  content::WebUIDataSource* source = CreateExtensionsHTMLSource();
50
51  ExtensionSettingsHandler* handler = new ExtensionSettingsHandler();
52  handler->GetLocalizedValues(source);
53  web_ui->AddMessageHandler(handler);
54
55  PackExtensionHandler* pack_handler = new PackExtensionHandler();
56  pack_handler->GetLocalizedValues(source);
57  web_ui->AddMessageHandler(pack_handler);
58
59  CommandHandler* commands_handler = new CommandHandler(profile);
60  commands_handler->GetLocalizedValues(source);
61  web_ui->AddMessageHandler(commands_handler);
62
63  ExtensionErrorHandler* extension_error_handler =
64      new ExtensionErrorHandler(profile);
65  extension_error_handler->GetLocalizedValues(source);
66  web_ui->AddMessageHandler(extension_error_handler);
67
68  ExtensionLoaderHandler* extension_loader_handler =
69      new ExtensionLoaderHandler(profile);
70  extension_loader_handler->GetLocalizedValues(source);
71  web_ui->AddMessageHandler(extension_loader_handler);
72
73  InstallExtensionHandler* install_extension_handler =
74      new InstallExtensionHandler();
75  install_extension_handler->GetLocalizedValues(source);
76  web_ui->AddMessageHandler(install_extension_handler);
77
78#if defined(OS_CHROMEOS)
79  chromeos::KioskAppsHandler* kiosk_app_handler =
80      new chromeos::KioskAppsHandler();
81  kiosk_app_handler->GetLocalizedValues(source);
82  web_ui->AddMessageHandler(kiosk_app_handler);
83#endif
84
85  web_ui->AddMessageHandler(new MetricsHandler());
86
87  // Need to allow <object> elements so that the <extensionoptions> browser
88  // plugin can be loaded within chrome://extensions.
89  source->OverrideContentSecurityPolicyObjectSrc("object-src 'self';");
90
91  content::WebUIDataSource::Add(profile, source);
92}
93
94ExtensionsUI::~ExtensionsUI() {}
95
96// static
97base::RefCountedMemory* ExtensionsUI::GetFaviconResourceBytes(
98    ui::ScaleFactor scale_factor) {
99  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
100  return rb.LoadDataResourceBytesForScale(IDR_EXTENSIONS_FAVICON, scale_factor);
101}
102
103}  // namespace extensions
104