1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "gin/modules/file_module_provider.h" 6 7#include "base/bind.h" 8#include "base/files/file_util.h" 9#include "base/message_loop/message_loop.h" 10#include "base/strings/string_split.h" 11#include "gin/converter.h" 12 13namespace gin { 14 15namespace { 16 17void AttempToLoadModule(const base::WeakPtr<Runner>& runner, 18 const std::vector<base::FilePath>& search_paths, 19 const std::string& id) { 20 if (!runner) 21 return; 22 23 std::vector<std::string> components; 24 base::SplitString(id, '/', &components); 25 26 base::FilePath path; 27 for (size_t i = 0; i < components.size(); ++i) { 28 // TODO(abarth): Technically the path components can be UTF-8. We don't 29 // handle that case correctly yet. 30 path = path.AppendASCII(components[i]); 31 } 32 path = path.AddExtension(FILE_PATH_LITERAL("js")); 33 34 for (size_t i = 0; i < search_paths.size(); ++i) { 35 std::string source; 36 if (!ReadFileToString(search_paths[i].Append(path), &source)) 37 continue; 38 39 Runner::Scope scope(runner.get()); 40 runner->Run(source, id); 41 return; 42 } 43 LOG(ERROR) << "Failed to load module from disk: " << id; 44} 45 46} // namespace 47 48FileModuleProvider::FileModuleProvider( 49 const std::vector<base::FilePath>& search_paths) 50 : search_paths_(search_paths) { 51} 52 53FileModuleProvider::~FileModuleProvider() { 54} 55 56void FileModuleProvider::AttempToLoadModules( 57 Runner* runner, const std::set<std::string>& ids) { 58 std::set<std::string> modules = ids; 59 for (std::set<std::string>::const_iterator it = modules.begin(); 60 it != modules.end(); ++it) { 61 const std::string& id = *it; 62 if (attempted_ids_.count(id)) 63 continue; 64 attempted_ids_.insert(id); 65 base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind( 66 AttempToLoadModule, runner->GetWeakPtr(), search_paths_, id)); 67 } 68} 69 70} // namespace gin 71