1 // Copyright (c) 2012 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 "chrome/renderer/extensions/file_browser_handler_custom_bindings.h" 6 7 #include <string> 8 9 #include "base/basictypes.h" 10 #include "base/logging.h" 11 #include "extensions/renderer/script_context.h" 12 #include "third_party/WebKit/public/platform/WebString.h" 13 #include "third_party/WebKit/public/web/WebDOMFileSystem.h" 14 #include "third_party/WebKit/public/web/WebLocalFrame.h" 15 #include "third_party/WebKit/public/web/WebScriptBindings.h" 16 17 namespace extensions { 18 19 FileBrowserHandlerCustomBindings::FileBrowserHandlerCustomBindings( 20 ScriptContext* context) 21 : ObjectBackedNativeHandler(context) { 22 RouteFunction( 23 "GetExternalFileEntry", 24 base::Bind(&FileBrowserHandlerCustomBindings::GetExternalFileEntry, 25 base::Unretained(this))); 26 RouteFunction("GetEntryURL", 27 base::Bind(&FileBrowserHandlerCustomBindings::GetEntryURL, 28 base::Unretained(this))); 29 } 30 31 void FileBrowserHandlerCustomBindings::GetExternalFileEntry( 32 const v8::FunctionCallbackInfo<v8::Value>& args) { 33 // TODO(zelidrag): Make this magic work on other platforms when file browser 34 // matures enough on ChromeOS. 35 #if defined(OS_CHROMEOS) 36 CHECK(args.Length() == 1); 37 CHECK(args[0]->IsObject()); 38 v8::Local<v8::Object> file_def = args[0]->ToObject(); 39 std::string file_system_name( 40 *v8::String::Utf8Value(file_def->Get( 41 v8::String::NewFromUtf8(args.GetIsolate(), "fileSystemName")))); 42 GURL file_system_root( 43 *v8::String::Utf8Value(file_def->Get( 44 v8::String::NewFromUtf8(args.GetIsolate(), "fileSystemRoot")))); 45 std::string file_full_path( 46 *v8::String::Utf8Value(file_def->Get( 47 v8::String::NewFromUtf8(args.GetIsolate(), "fileFullPath")))); 48 bool is_directory = file_def->Get(v8::String::NewFromUtf8( 49 args.GetIsolate(), "fileIsDirectory"))->ToBoolean()->Value(); 50 blink::WebDOMFileSystem::EntryType entry_type = 51 is_directory ? blink::WebDOMFileSystem::EntryTypeDirectory 52 : blink::WebDOMFileSystem::EntryTypeFile; 53 blink::WebLocalFrame* webframe = 54 blink::WebLocalFrame::frameForContext(context()->v8_context()); 55 args.GetReturnValue().Set( 56 blink::WebDOMFileSystem::create( 57 webframe, 58 blink::WebFileSystemTypeExternal, 59 blink::WebString::fromUTF8(file_system_name), 60 file_system_root) 61 .createV8Entry(blink::WebString::fromUTF8(file_full_path), 62 entry_type, 63 args.Holder(), 64 args.GetIsolate())); 65 #endif 66 } 67 68 void FileBrowserHandlerCustomBindings::GetEntryURL( 69 const v8::FunctionCallbackInfo<v8::Value>& args) { 70 CHECK(args.Length() == 1); 71 CHECK(args[0]->IsObject()); 72 const blink::WebURL& url = 73 blink::WebDOMFileSystem::createFileSystemURL(args[0]); 74 args.GetReturnValue().Set( 75 blink::WebScriptBindings::toV8String(url.string(), args.GetIsolate())); 76 } 77 78 } // namespace extensions 79