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)