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