shell_nacl_browser_delegate.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// found in the LICENSE file.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "extensions/shell/browser/shell_nacl_browser_delegate.h"
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <string>
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/base_paths.h"
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/command_line.h"
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/path_service.h"
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/strings/string_split.h"
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "base/strings/string_util.h"
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "content/public/browser/browser_context.h"
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "content/public/browser/render_frame_host.h"
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "content/public/browser/site_instance.h"
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "extensions/browser/extension_system.h"
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "extensions/browser/info_map.h"
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "extensions/browser/process_manager.h"
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "extensions/common/constants.h"
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "extensions/common/extension.h"
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "extensions/common/url_pattern.h"
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "extensions/shell/common/version.h"  // Generated file.
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "ppapi/c/private/ppb_nacl_private.h"
2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "url/gurl.h"
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28197021e6b966cfb06891637935ef33fff06433d1Ben Murdochusing content::BrowserContext;
29197021e6b966cfb06891637935ef33fff06433d1Ben Murdochusing content::BrowserThread;
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)using content::BrowserPpapiHost;
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)namespace extensions {
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace {
34c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Handles an extension's NaCl process transitioning in or out of idle state by
36d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)// relaying the state to the extension's process manager. See Chrome's
37d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// NaClBrowserDelegateImpl for another example.
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void OnKeepaliveOnUIThread(
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const BrowserPpapiHost::OnKeepaliveInstanceData& instance_data,
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const base::FilePath& profile_data_directory) {
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK_CURRENTLY_ON(BrowserThread::UI);
42d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Only one instance will exist for NaCl embeds, even when more than one
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // embed of the same plugin exists on the same page.
45d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)  DCHECK(instance_data.size() == 1);
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (instance_data.size() < 1)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return;
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ProcessManager::OnKeepaliveFromPlugin(instance_data[0].render_process_id,
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                        instance_data[0].render_frame_id,
51d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                                        instance_data[0].document_url.host());
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Calls OnKeepaliveOnUIThread on UI thread.
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void OnKeepalive(const BrowserPpapiHost::OnKeepaliveInstanceData& instance_data,
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 const base::FilePath& profile_data_directory) {
57a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch  DCHECK(!BrowserThread::CurrentlyOn(BrowserThread::UI));
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  BrowserThread::PostTask(
59d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)      BrowserThread::UI,
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      FROM_HERE,
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      base::Bind(
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          &OnKeepaliveOnUIThread, instance_data, profile_data_directory));
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
64a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
65a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}  // namespace
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ShellNaClBrowserDelegate::ShellNaClBrowserDelegate(BrowserContext* context)
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : browser_context_(context) {
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  DCHECK(browser_context_);
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ShellNaClBrowserDelegate::~ShellNaClBrowserDelegate() {
73a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch}
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
75d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void ShellNaClBrowserDelegate::ShowMissingArchInfobar(int render_process_id,
76a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch                                                      int render_view_id) {
77a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch  // app_shell does not have infobars.
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  LOG(ERROR) << "Missing architecture for pid " << render_process_id;
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ShellNaClBrowserDelegate::DialogsAreSuppressed() {
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return false;
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
84c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ShellNaClBrowserDelegate::GetCacheDirectory(base::FilePath* cache_dir) {
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Just use the general cache directory, not a subdirectory like Chrome does.
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if defined(OS_POSIX)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return PathService::Get(base::DIR_CACHE, cache_dir);
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#elif defined(OS_WIN)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // TODO(yoz): Find an appropriate persistent directory to use here.
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return PathService::Get(base::DIR_TEMP, cache_dir);
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ShellNaClBrowserDelegate::GetPluginDirectory(base::FilePath* plugin_dir) {
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // On Posix, plugins are in the module directory.
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return PathService::Get(base::DIR_MODULE, plugin_dir);
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ShellNaClBrowserDelegate::GetPnaclDirectory(base::FilePath* pnacl_dir) {
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // On Posix, the pnacl directory is inside the plugin directory.
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  base::FilePath plugin_dir;
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!GetPluginDirectory(&plugin_dir))
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  *pnacl_dir = plugin_dir.Append(FILE_PATH_LITERAL("pnacl"));
106a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch  return true;
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
108d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)
109a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochbool ShellNaClBrowserDelegate::GetUserDirectory(base::FilePath* user_dir) {
110a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch  base::FilePath path = browser_context_->GetPath();
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!path.empty()) {
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    *user_dir = path;
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return false;
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)std::string ShellNaClBrowserDelegate::GetVersionString() const {
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // A version change triggers an update of the NaCl validation caches.
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Example version: "39.0.2129.0 (290550)".
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return PRODUCT_VERSION " (" LAST_CHANGE ")";
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ppapi::host::HostFactory* ShellNaClBrowserDelegate::CreatePpapiHostFactory(
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    content::BrowserPpapiHost* ppapi_host) {
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return NULL;
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ShellNaClBrowserDelegate::SetDebugPatterns(std::string debug_patterns) {
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // No debugger support. Developers should use Chrome for debugging.
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ShellNaClBrowserDelegate::URLMatchesDebugPatterns(
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const GURL& manifest_url) {
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // No debugger support. Developers should use Chrome for debugging.
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return false;
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
139a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch// This function is security sensitive.  Be sure to check with a security
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// person before you modify it.
141d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)// TODO(jamescook): Refactor this code into the extensions module so it can
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// be shared with Chrome's NaClBrowserDelegateImpl. http://crbug.com/403017
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ShellNaClBrowserDelegate::MapUrlToLocalFilePath(
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const GURL& file_url,
145d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    bool use_blocking_api,
146a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    const base::FilePath& profile_directory,
147a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    base::FilePath* file_path) {
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  scoped_refptr<InfoMap> info_map =
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      ExtensionSystem::Get(browser_context_)->info_map();
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // Check that the URL is recognized by the extension system.
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  const Extension* extension =
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      info_map->extensions().GetExtensionOrAppByURL(file_url);
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!extension)
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // This is a short-cut which avoids calling a blocking file operation
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // (GetFilePath()), so that this can be called on the IO thread. It only
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // handles a subset of the urls.
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (!use_blocking_api) {
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (file_url.SchemeIs(kExtensionScheme)) {
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      std::string path = file_url.path();
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      base::TrimString(path, "/", &path);  // Remove first slash
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      *file_path = extension->path().AppendASCII(path);
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return true;
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  }
168a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
169a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch  // Check that the URL references a resource in the extension.
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // NOTE: app_shell does not support shared modules.
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  ExtensionResource resource = extension->GetResource(file_url.path());
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (resource.empty())
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  // GetFilePath is a blocking function call.
176a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch  const base::FilePath resource_file_path = resource.GetFilePath();
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  if (resource_file_path.empty())
178d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    return false;
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  *file_path = resource_file_path;
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return true;
182d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)}
183a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
184a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdochcontent::BrowserPpapiHost::OnKeepaliveCallback
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ShellNaClBrowserDelegate::GetOnKeepaliveCallback() {
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return base::Bind(&OnKeepalive);
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ShellNaClBrowserDelegate::IsNonSfiModeAllowed(
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const base::FilePath& profile_directory,
191c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    const GURL& manifest_url) {
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  return false;
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}  // namespace extensions
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)