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