15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/extensions/extensions_ui.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/extensions/command_handler.h"
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/webui/extensions/extension_error_handler.h"
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/ui/webui/extensions/extension_loader_handler.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/extensions/extension_settings_handler.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/extensions/install_extension_handler.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/extensions/pack_extension_handler.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/ui/webui/metrics_handler.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_ui_data_source.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/browser_resources.h"
19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "grit/theme_resources.h"
20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(OS_CHROMEOS)
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/ui/webui/extensions/chromeos/kiosk_apps_handler.h"
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace extensions {
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)content::WebUIDataSource* CreateExtensionsHTMLSource() {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebUIDataSource* source =
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::WebUIDataSource::Create(chrome::kChromeUIExtensionsFrameHost);
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  source->SetUseJsonJSFormatV2();
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  source->SetJsonPath("strings.js");
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  source->AddResourcePath("extensions.js", IDR_EXTENSIONS_JS);
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  source->AddResourcePath("extension_command_list.js",
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          IDR_EXTENSION_COMMAND_LIST_JS);
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  source->AddResourcePath("extension_list.js", IDR_EXTENSION_LIST_JS);
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  source->SetDefaultResource(IDR_EXTENSIONS_HTML);
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  source->DisableDenyXFrameOptions();
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return source;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionsUI::ExtensionsUI(content::WebUI* web_ui) : WebUIController(web_ui) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui);
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebUIDataSource* source = CreateExtensionsHTMLSource();
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionSettingsHandler* handler = new ExtensionSettingsHandler();
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  handler->GetLocalizedValues(source);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui->AddMessageHandler(handler);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PackExtensionHandler* pack_handler = new PackExtensionHandler();
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pack_handler->GetLocalizedValues(source);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui->AddMessageHandler(pack_handler);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  CommandHandler* commands_handler = new CommandHandler(profile);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  commands_handler->GetLocalizedValues(source);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui->AddMessageHandler(commands_handler);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ExtensionErrorHandler* extension_error_handler =
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      new ExtensionErrorHandler(profile);
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  extension_error_handler->GetLocalizedValues(source);
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  web_ui->AddMessageHandler(extension_error_handler);
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ExtensionLoaderHandler* extension_loader_handler =
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      new ExtensionLoaderHandler(profile);
705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  extension_loader_handler->GetLocalizedValues(source);
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  web_ui->AddMessageHandler(extension_loader_handler);
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstallExtensionHandler* install_extension_handler =
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new InstallExtensionHandler();
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  install_extension_handler->GetLocalizedValues(source);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui->AddMessageHandler(install_extension_handler);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(OS_CHROMEOS)
79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  chromeos::KioskAppsHandler* kiosk_app_handler =
80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new chromeos::KioskAppsHandler();
81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  kiosk_app_handler->GetLocalizedValues(source);
82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  web_ui->AddMessageHandler(kiosk_app_handler);
83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  web_ui->AddMessageHandler(new MetricsHandler());
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Need to allow <object> elements so that the <extensionoptions> browser
886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // plugin can be loaded within chrome://extensions.
896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  source->OverrideContentSecurityPolicyObjectSrc("object-src 'self';");
906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebUIDataSource::Add(profile, source);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)ExtensionsUI::~ExtensionsUI() {}
95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// static
97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)base::RefCountedMemory* ExtensionsUI::GetFaviconResourceBytes(
98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ui::ScaleFactor scale_factor) {
99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return rb.LoadDataResourceBytesForScale(IDR_EXTENSIONS_FAVICON, scale_factor);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace extensions
104