1// Copyright 2014 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/test/file.h"
6
7#include <iostream>
8
9#include "base/bind.h"
10#include "base/files/file_enumerator.h"
11#include "base/files/file_path.h"
12#include "base/files/file_util.h"
13#include "base/path_service.h"
14#include "gin/arguments.h"
15#include "gin/converter.h"
16#include "gin/object_template_builder.h"
17#include "gin/per_isolate_data.h"
18#include "gin/public/wrapper_info.h"
19
20using v8::ObjectTemplate;
21
22namespace gin {
23
24namespace {
25
26v8::Handle<v8::Value> ReadFileToString(gin::Arguments* args) {
27  std::string filename;
28  if (!args->GetNext(&filename))
29    return v8::Null(args->isolate());
30
31  const base::FilePath& path = base::FilePath::FromUTF8Unsafe(filename);
32  std::string contents;
33  if (!ReadFileToString(path, &contents))
34    return v8::Null(args->isolate());
35
36  return gin::Converter<std::string>::ToV8(args->isolate(), contents);
37}
38
39v8::Handle<v8::Value> GetSourceRootDirectory(gin::Arguments* args) {
40  base::FilePath path;
41  if (!PathService::Get(base::DIR_SOURCE_ROOT, &path))
42    return v8::Null(args->isolate());
43  return gin::Converter<std::string>::ToV8(args->isolate(),
44                                           path.AsUTF8Unsafe());
45}
46
47v8::Handle<v8::Value> GetFilesInDirectory(gin::Arguments* args) {
48  std::string filename;
49  if (!args->GetNext(&filename))
50    return v8::Null(args->isolate());
51
52  const base::FilePath& path = base::FilePath::FromUTF8Unsafe(filename);
53  if (!base::DirectoryExists(path))
54    return v8::Null(args->isolate());
55
56  std::vector<std::string> names;
57  base::FileEnumerator e(path, false, base::FileEnumerator::FILES);
58  for (base::FilePath name = e.Next(); !name.empty(); name = e.Next()) {
59    names.push_back(name.BaseName().AsUTF8Unsafe());
60  }
61
62  return gin::Converter<std::vector<std::string> >::ToV8(args->isolate(),
63                                                         names);
64}
65
66gin::WrapperInfo g_wrapper_info = { gin::kEmbedderNativeGin };
67
68}  // namespace
69
70const char File::kModuleName[] = "file";
71
72v8::Local<v8::Value> File::GetModule(v8::Isolate* isolate) {
73  gin::PerIsolateData* data = gin::PerIsolateData::From(isolate);
74  v8::Local<ObjectTemplate> templ = data->GetObjectTemplate(&g_wrapper_info);
75  if (templ.IsEmpty()) {
76    templ = gin::ObjectTemplateBuilder(isolate)
77        .SetMethod("readFileToString", ReadFileToString)
78        .SetMethod("getFilesInDirectory", GetFilesInDirectory)
79        .SetMethod("getSourceRootDirectory", GetSourceRootDirectory)
80        .Build();
81    data->SetObjectTemplate(&g_wrapper_info, templ);
82  }
83  return templ->NewInstance();
84}
85
86}  // namespace gin
87