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