17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// found in the LICENSE file.
47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/nacl_host/nacl_browser_delegate_impl.h"
67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/path_service.h"
81e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/strings/string_split.h"
9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/browser_process.h"
10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/component_updater/pnacl/pnacl_component_installer.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/nacl_host/nacl_infobar_delegate.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.h"
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/common/chrome_paths.h"
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/common/chrome_paths_internal.h"
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/common/chrome_version_info.h"
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/common/logging_chrome.h"
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/pepper_permission_util.h"
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/browser/browser_thread.h"
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/info_map.h"
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/process_manager.h"
258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "extensions/common/constants.h"
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "extensions/common/url_pattern.h"
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ppapi/c/private/ppb_nacl_private.h"
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "url/gurl.h"
307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// These are temporarily needed for testing non-sfi mode on ChromeOS without
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// passing command-line arguments to Chrome.
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char* const kAllowedNonSfiOrigins[] = {
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "6EAED1924DB611B6EEF2A664BD077BE7EAD33B8F",  // see http://crbug.com/355141
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    "4EB74897CB187C7633357C2FE832E0AD6A44883A"   // see http://crbug.com/355141
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Handles an extension's NaCl process transitioning in or out of idle state by
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// relaying the state to the extension's process manager.
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// A NaCl instance, when active (making PPAPI calls or receiving callbacks),
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// sends keepalive IPCs to the browser process BrowserPpapiHost at a throttled
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// rate. The content::BrowserPpapiHost passes context information up to the
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// chrome level NaClProcessHost where we use the instance's context to find the
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// associated extension process manager.
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// There is a 1:many relationship for extension:nacl-embeds, but only a
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// 1:1 relationship for NaClProcessHost:PP_Instance. The content layer doesn't
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// rely on this knowledge because it routes messages for ppapi non-nacl
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// instances as well, though they won't have callbacks set. Here the 1:1
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// assumption is made and DCHECKed.
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void OnKeepaliveOnUIThread(
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const content::BrowserPpapiHost::OnKeepaliveInstanceData& instance_data,
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::FilePath& profile_data_directory) {
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Only one instance will exist for NaCl embeds, even when more than one
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // embed of the same plugin exists on the same page.
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(instance_data.size() == 1);
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (instance_data.size() < 1)
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  extensions::ProcessManager::OnKeepaliveFromPlugin(
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      instance_data[0].render_process_id,
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      instance_data[0].render_frame_id,
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      instance_data[0].document_url.host());
7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Calls OnKeepaliveOnUIThread on UI thread.
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void OnKeepalive(
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const content::BrowserPpapiHost::OnKeepaliveInstanceData& instance_data,
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::FilePath& profile_data_directory) {
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   base::Bind(&OnKeepaliveOnUIThread,
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                              instance_data,
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                              profile_data_directory));
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)NaClBrowserDelegateImpl::NaClBrowserDelegateImpl(
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ProfileManager* profile_manager)
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    : profile_manager_(profile_manager), inverse_debug_patterns_(false) {
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DCHECK(profile_manager_);
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kAllowedNonSfiOrigins); ++i) {
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    allowed_nonsfi_origins_.insert(kAllowedNonSfiOrigins[i]);
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)NaClBrowserDelegateImpl::~NaClBrowserDelegateImpl() {
968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void NaClBrowserDelegateImpl::ShowMissingArchInfobar(int render_process_id,
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                                     int render_view_id) {
1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  content::BrowserThread::PostTask(
1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      content::BrowserThread::UI, FROM_HERE,
1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&NaClInfoBarDelegate::Create, render_process_id,
1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 render_view_id));
1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool NaClBrowserDelegateImpl::DialogsAreSuppressed() {
1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return logging::DialogsAreSuppressed();
1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool NaClBrowserDelegateImpl::GetCacheDirectory(base::FilePath* cache_dir) {
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::FilePath user_data_dir;
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!PathService::Get(chrome::DIR_USER_DATA, &user_data_dir))
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return false;
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  chrome::GetUserCacheDirectory(user_data_dir, cache_dir);
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return true;
1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool NaClBrowserDelegateImpl::GetPluginDirectory(base::FilePath* plugin_dir) {
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return PathService::Get(chrome::DIR_INTERNAL_PLUGINS, plugin_dir);
1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool NaClBrowserDelegateImpl::GetPnaclDirectory(base::FilePath* pnacl_dir) {
1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return PathService::Get(chrome::DIR_PNACL_COMPONENT, pnacl_dir);
1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool NaClBrowserDelegateImpl::GetUserDirectory(base::FilePath* user_dir) {
1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return PathService::Get(chrome::DIR_USER_DATA, user_dir);
1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstd::string NaClBrowserDelegateImpl::GetVersionString() const {
1317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return chrome::VersionInfo().CreateVersionString();
1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochppapi::host::HostFactory* NaClBrowserDelegateImpl::CreatePpapiHostFactory(
1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    content::BrowserPpapiHost* ppapi_host) {
1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return new chrome::ChromeBrowserPepperHostFactory(ppapi_host);
1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void NaClBrowserDelegateImpl::SetDebugPatterns(std::string debug_patterns) {
1401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!debug_patterns.empty() && debug_patterns[0] == '!') {
1411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    inverse_debug_patterns_ = true;
1421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    debug_patterns.erase(0, 1);
1431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (debug_patterns.empty()) {
1451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return;
1461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  std::vector<std::string> patterns;
1481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::SplitString(debug_patterns, ',', &patterns);
1491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (std::vector<std::string>::iterator iter = patterns.begin();
1501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)       iter != patterns.end(); ++iter) {
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Allow chrome:// schema, which is used to filter out the internal
152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // PNaCl translator. Also allow chrome-extension:// schema (which
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // can have NaCl modules). The default is to disallow these schema
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // since they can be dangerous in the context of chrome extension
155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // permissions, but they are okay here, for NaCl GDB avoidance.
156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    URLPattern pattern(URLPattern::SCHEME_ALL);
1571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (pattern.Parse(*iter) == URLPattern::PARSE_SUCCESS) {
1581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      // If URL pattern has scheme equal to *, Parse method resets valid
1591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      // schemes mask to http and https only, so we need to reset it after
160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      // Parse to re-include chrome-extension and chrome schema.
1611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      pattern.SetValidSchemes(URLPattern::SCHEME_ALL);
1621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      debug_patterns_.push_back(pattern);
1631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
1641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool NaClBrowserDelegateImpl::URLMatchesDebugPatterns(
1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const GURL& manifest_url) {
1691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Empty patterns are forbidden so we ignore them.
1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (debug_patterns_.empty()) {
1711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return true;
1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  bool matches = false;
1741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  for (std::vector<URLPattern>::iterator iter = debug_patterns_.begin();
1751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)       iter != debug_patterns_.end(); ++iter) {
1761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (iter->MatchesURL(manifest_url)) {
1771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      matches = true;
1781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      break;
1791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
1801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (inverse_debug_patterns_) {
1821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return !matches;
1831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  } else {
1841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return matches;
1851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// This function is security sensitive.  Be sure to check with a security
1898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// person before you modify it.
1908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)bool NaClBrowserDelegateImpl::MapUrlToLocalFilePath(
191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const GURL& file_url,
192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    bool use_blocking_api,
193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const base::FilePath& profile_directory,
194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    base::FilePath* file_path) {
19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_refptr<extensions::InfoMap> extension_info_map =
197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      GetExtensionInfoMap(profile_directory);
1986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return extension_info_map->MapUrlToLocalFilePath(
1996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      file_url, use_blocking_api, file_path);
20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#else
20103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return false;
20203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif
2038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)content::BrowserPpapiHost::OnKeepaliveCallback
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)NaClBrowserDelegateImpl::GetOnKeepaliveCallback() {
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return base::Bind(&OnKeepalive);
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool NaClBrowserDelegateImpl::IsNonSfiModeAllowed(
211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const base::FilePath& profile_directory,
212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const GURL& manifest_url) {
21303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const extensions::ExtensionSet* extension_set =
215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      &GetExtensionInfoMap(profile_directory)->extensions();
216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return chrome::IsExtensionOrSharedModuleWhitelisted(
217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      manifest_url, extension_set, allowed_nonsfi_origins_);
21803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#else
21903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return false;
22003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif
221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
22303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS)
224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)scoped_refptr<extensions::InfoMap> NaClBrowserDelegateImpl::GetExtensionInfoMap(
225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const base::FilePath& profile_directory) {
226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Get the profile associated with the renderer.
227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Profile* profile = profile_manager_->GetProfileByPath(profile_directory);
228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(profile);
229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_refptr<extensions::InfoMap> extension_info_map =
230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      extensions::ExtensionSystem::Get(profile)->info_map();
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(extension_info_map.get());
232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return extension_info_map;
233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
23403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif
235