15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file.
44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/shell/common/shell_content_client.h"
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/strings/string_piece.h"
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/strings/utf_string_conversions.h"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/common/user_agent.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/constants.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/shell/common/version.h"  // Generated file.
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if !defined(DISABLE_NACL)
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/base_paths.h"
1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/files/file_path.h"
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/path_service.h"
1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "components/nacl/common/nacl_constants.h"
2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "content/public/common/pepper_plugin_info.h"
2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ppapi/native_client/src/trusted/plugin/ppapi_entrypoints.h"
2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ppapi/shared_impl/ppapi_permissions.h"
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif
2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace extensions {
2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace {
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if !defined(DISABLE_NACL)
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool GetNaClPluginPath(base::FilePath* path) {
3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // On Posix, plugins live in the module directory.
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::FilePath module;
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!PathService::Get(base::DIR_MODULE, &module))
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return false;
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  *path = module.Append(nacl::kInternalNaClPluginFileName);
3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return true;
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif  // !defined(DISABLE_NACL)
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ShellContentClient::ShellContentClient() {
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ShellContentClient::~ShellContentClient() {
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void ShellContentClient::AddPepperPlugins(
4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    std::vector<content::PepperPluginInfo>* plugins) {
4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if !defined(DISABLE_NACL)
5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  base::FilePath path;
5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!GetNaClPluginPath(&path))
5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return;
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  content::PepperPluginInfo nacl;
5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // The nacl plugin is now built into the binary.
5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  nacl.is_internal = true;
5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  nacl.path = path;
5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  nacl.name = nacl::kNaClPluginName;
5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  content::WebPluginMimeType nacl_mime_type(nacl::kNaClPluginMimeType,
6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                            nacl::kNaClPluginExtension,
6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                            nacl::kNaClPluginDescription);
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  nacl.mime_types.push_back(nacl_mime_type);
6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  content::WebPluginMimeType pnacl_mime_type(nacl::kPnaclPluginMimeType,
6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                             nacl::kPnaclPluginExtension,
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                             nacl::kPnaclPluginDescription);
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  nacl.mime_types.push_back(pnacl_mime_type);
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  nacl.internal_entry_points.get_interface = nacl_plugin::PPP_GetInterface;
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  nacl.internal_entry_points.initialize_module =
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      nacl_plugin::PPP_InitializeModule;
7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  nacl.internal_entry_points.shutdown_module =
7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      nacl_plugin::PPP_ShutdownModule;
7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  nacl.permissions = ppapi::PERMISSION_PRIVATE | ppapi::PERMISSION_DEV;
7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  plugins->push_back(nacl);
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif  // !defined(DISABLE_NACL)
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShellContentClient::AddAdditionalSchemes(
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::vector<std::string>* standard_schemes,
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::vector<std::string>* savable_schemes) {
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  standard_schemes->push_back(kExtensionScheme);
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  savable_schemes->push_back(kExtensionScheme);
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  standard_schemes->push_back(kExtensionResourceScheme);
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  savable_schemes->push_back(kExtensionResourceScheme);
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::string ShellContentClient::GetUserAgent() const {
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Must contain a user agent string for version sniffing. For example,
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // pluginless WebRTC Hangouts checks the Chrome version number.
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return content::BuildUserAgentFromProduct("Chrome/" PRODUCT_VERSION);
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ShellContentClient::GetLocalizedString(int message_id) const {
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return l10n_util::GetStringUTF16(message_id);
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::StringPiece ShellContentClient::GetDataResource(
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int resource_id,
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ui::ScaleFactor scale_factor) const {
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return ResourceBundle::GetSharedInstance().GetRawDataResourceForScale(
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      resource_id, scale_factor);
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::RefCountedStaticMemory* ShellContentClient::GetDataResourceBytes(
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int resource_id) const {
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return ResourceBundle::GetSharedInstance().LoadDataResourceBytes(resource_id);
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)gfx::Image& ShellContentClient::GetNativeImageNamed(int resource_id) const {
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return ResourceBundle::GetSharedInstance().GetNativeImageNamed(resource_id);
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace extensions
113