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