168513a70bcd92384395513322f1b801e7bf9c729Steve Block/*
268513a70bcd92384395513322f1b801e7bf9c729Steve Block * Copyright (C) 2010 Google Inc. All rights reserved.
368513a70bcd92384395513322f1b801e7bf9c729Steve Block *
468513a70bcd92384395513322f1b801e7bf9c729Steve Block * Redistribution and use in source and binary forms, with or without
568513a70bcd92384395513322f1b801e7bf9c729Steve Block * modification, are permitted provided that the following conditions are
668513a70bcd92384395513322f1b801e7bf9c729Steve Block * met:
768513a70bcd92384395513322f1b801e7bf9c729Steve Block *
868513a70bcd92384395513322f1b801e7bf9c729Steve Block *     * Redistributions of source code must retain the above copyright
968513a70bcd92384395513322f1b801e7bf9c729Steve Block * notice, this list of conditions and the following disclaimer.
1068513a70bcd92384395513322f1b801e7bf9c729Steve Block *     * Redistributions in binary form must reproduce the above
1168513a70bcd92384395513322f1b801e7bf9c729Steve Block * copyright notice, this list of conditions and the following disclaimer
1268513a70bcd92384395513322f1b801e7bf9c729Steve Block * in the documentation and/or other materials provided with the
1368513a70bcd92384395513322f1b801e7bf9c729Steve Block * distribution.
1468513a70bcd92384395513322f1b801e7bf9c729Steve Block *     * Neither the name of Google Inc. nor the names of its
1568513a70bcd92384395513322f1b801e7bf9c729Steve Block * contributors may be used to endorse or promote products derived from
1668513a70bcd92384395513322f1b801e7bf9c729Steve Block * this software without specific prior written permission.
1768513a70bcd92384395513322f1b801e7bf9c729Steve Block *
1868513a70bcd92384395513322f1b801e7bf9c729Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1968513a70bcd92384395513322f1b801e7bf9c729Steve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2068513a70bcd92384395513322f1b801e7bf9c729Steve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2168513a70bcd92384395513322f1b801e7bf9c729Steve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2268513a70bcd92384395513322f1b801e7bf9c729Steve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2368513a70bcd92384395513322f1b801e7bf9c729Steve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2468513a70bcd92384395513322f1b801e7bf9c729Steve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2568513a70bcd92384395513322f1b801e7bf9c729Steve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2668513a70bcd92384395513322f1b801e7bf9c729Steve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2768513a70bcd92384395513322f1b801e7bf9c729Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2868513a70bcd92384395513322f1b801e7bf9c729Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2968513a70bcd92384395513322f1b801e7bf9c729Steve Block */
3068513a70bcd92384395513322f1b801e7bf9c729Steve Block
3168513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "config.h"
3268513a70bcd92384395513322f1b801e7bf9c729Steve Block
3368513a70bcd92384395513322f1b801e7bf9c729Steve Block#if ENABLE(FILE_SYSTEM)
3468513a70bcd92384395513322f1b801e7bf9c729Steve Block
3568513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "JSDirectoryEntry.h"
3668513a70bcd92384395513322f1b801e7bf9c729Steve Block
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ExceptionCode.h"
3868513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "JSDOMBinding.h"
3968513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "JSEntryCallback.h"
4068513a70bcd92384395513322f1b801e7bf9c729Steve Block#include "JSErrorCallback.h"
412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "JSWebKitFlags.h"
4268513a70bcd92384395513322f1b801e7bf9c729Steve Block#include <wtf/Assertions.h>
4368513a70bcd92384395513322f1b801e7bf9c729Steve Block
4468513a70bcd92384395513322f1b801e7bf9c729Steve Blockusing namespace JSC;
4568513a70bcd92384395513322f1b801e7bf9c729Steve Block
4668513a70bcd92384395513322f1b801e7bf9c729Steve Blocknamespace WebCore {
4768513a70bcd92384395513322f1b801e7bf9c729Steve Block
4868513a70bcd92384395513322f1b801e7bf9c729Steve BlockJSValue JSDirectoryEntry::getFile(ExecState* exec)
4968513a70bcd92384395513322f1b801e7bf9c729Steve Block{
5068513a70bcd92384395513322f1b801e7bf9c729Steve Block    DirectoryEntry* imp = static_cast<DirectoryEntry*>(impl());
5168513a70bcd92384395513322f1b801e7bf9c729Steve Block    const String& path = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(0));
5268513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (exec->hadException())
5368513a70bcd92384395513322f1b801e7bf9c729Steve Block        return jsUndefined();
5468513a70bcd92384395513322f1b801e7bf9c729Steve Block
5568513a70bcd92384395513322f1b801e7bf9c729Steve Block    int argsCount = exec->argumentCount();
5668513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (argsCount <= 1) {
5768513a70bcd92384395513322f1b801e7bf9c729Steve Block        imp->getFile(path);
5868513a70bcd92384395513322f1b801e7bf9c729Steve Block        return jsUndefined();
5968513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
6068513a70bcd92384395513322f1b801e7bf9c729Steve Block
612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RefPtr<WebKitFlags> flags;
622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!exec->argument(1).isNull() && !exec->argument(1).isUndefined() && exec->argument(1).isObject() && !exec->argument(1).inherits(&JSWebKitFlags::s_info)) {
6368513a70bcd92384395513322f1b801e7bf9c729Steve Block        JSObject* object = exec->argument(1).getObject();
642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        flags = WebKitFlags::create();
6568513a70bcd92384395513322f1b801e7bf9c729Steve Block        JSValue jsCreate = object->get(exec, Identifier(exec, "create"));
6668513a70bcd92384395513322f1b801e7bf9c729Steve Block        flags->setCreate(jsCreate.toBoolean(exec));
6768513a70bcd92384395513322f1b801e7bf9c729Steve Block        JSValue jsExclusive = object->get(exec, Identifier(exec, "exclusive"));
6868513a70bcd92384395513322f1b801e7bf9c729Steve Block        flags->setExclusive(jsExclusive.toBoolean(exec));
6968513a70bcd92384395513322f1b801e7bf9c729Steve Block    } else
702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        flags = toWebKitFlags(exec->argument(1));
7168513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (exec->hadException())
7268513a70bcd92384395513322f1b801e7bf9c729Steve Block        return jsUndefined();
7368513a70bcd92384395513322f1b801e7bf9c729Steve Block    RefPtr<EntryCallback> successCallback;
7468513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (exec->argumentCount() > 2 && !exec->argument(2).isNull() && !exec->argument(2).isUndefined()) {
7568513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (!exec->argument(2).isObject()) {
7668513a70bcd92384395513322f1b801e7bf9c729Steve Block            setDOMException(exec, TYPE_MISMATCH_ERR);
7768513a70bcd92384395513322f1b801e7bf9c729Steve Block            return jsUndefined();
7868513a70bcd92384395513322f1b801e7bf9c729Steve Block        }
7968513a70bcd92384395513322f1b801e7bf9c729Steve Block        successCallback = JSEntryCallback::create(asObject(exec->argument(2)), globalObject());
8068513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
8168513a70bcd92384395513322f1b801e7bf9c729Steve Block    RefPtr<ErrorCallback> errorCallback;
8268513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (exec->argumentCount() > 3 && !exec->argument(3).isNull() && !exec->argument(3).isUndefined()) {
8368513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (!exec->argument(3).isObject()) {
8468513a70bcd92384395513322f1b801e7bf9c729Steve Block            setDOMException(exec, TYPE_MISMATCH_ERR);
8568513a70bcd92384395513322f1b801e7bf9c729Steve Block            return jsUndefined();
8668513a70bcd92384395513322f1b801e7bf9c729Steve Block        }
8768513a70bcd92384395513322f1b801e7bf9c729Steve Block        errorCallback = JSErrorCallback::create(asObject(exec->argument(3)), globalObject());
8868513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
8968513a70bcd92384395513322f1b801e7bf9c729Steve Block
9068513a70bcd92384395513322f1b801e7bf9c729Steve Block    imp->getFile(path, flags, successCallback, errorCallback);
9168513a70bcd92384395513322f1b801e7bf9c729Steve Block    return jsUndefined();
9268513a70bcd92384395513322f1b801e7bf9c729Steve Block}
9368513a70bcd92384395513322f1b801e7bf9c729Steve Block
9468513a70bcd92384395513322f1b801e7bf9c729Steve BlockJSValue JSDirectoryEntry::getDirectory(ExecState* exec)
9568513a70bcd92384395513322f1b801e7bf9c729Steve Block{
9668513a70bcd92384395513322f1b801e7bf9c729Steve Block    DirectoryEntry* imp = static_cast<DirectoryEntry*>(impl());
9768513a70bcd92384395513322f1b801e7bf9c729Steve Block    const String& path = valueToStringWithUndefinedOrNullCheck(exec, exec->argument(0));
9868513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (exec->hadException())
9968513a70bcd92384395513322f1b801e7bf9c729Steve Block        return jsUndefined();
10068513a70bcd92384395513322f1b801e7bf9c729Steve Block
10168513a70bcd92384395513322f1b801e7bf9c729Steve Block    int argsCount = exec->argumentCount();
10268513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (argsCount <= 1) {
10368513a70bcd92384395513322f1b801e7bf9c729Steve Block        imp->getDirectory(path);
10468513a70bcd92384395513322f1b801e7bf9c729Steve Block        return jsUndefined();
10568513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
10668513a70bcd92384395513322f1b801e7bf9c729Steve Block
1072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    RefPtr<WebKitFlags> flags;
1082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    if (!exec->argument(1).isNull() && !exec->argument(1).isUndefined() && exec->argument(1).isObject() && !exec->argument(1).inherits(&JSWebKitFlags::s_info)) {
10968513a70bcd92384395513322f1b801e7bf9c729Steve Block        JSObject* object = exec->argument(1).getObject();
1102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        flags = WebKitFlags::create();
11168513a70bcd92384395513322f1b801e7bf9c729Steve Block        JSValue jsCreate = object->get(exec, Identifier(exec, "create"));
11268513a70bcd92384395513322f1b801e7bf9c729Steve Block        flags->setCreate(jsCreate.toBoolean(exec));
11368513a70bcd92384395513322f1b801e7bf9c729Steve Block        JSValue jsExclusive = object->get(exec, Identifier(exec, "exclusive"));
11468513a70bcd92384395513322f1b801e7bf9c729Steve Block        flags->setExclusive(jsExclusive.toBoolean(exec));
11568513a70bcd92384395513322f1b801e7bf9c729Steve Block    } else
1162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        flags = toWebKitFlags(exec->argument(1));
11768513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (exec->hadException())
11868513a70bcd92384395513322f1b801e7bf9c729Steve Block        return jsUndefined();
11968513a70bcd92384395513322f1b801e7bf9c729Steve Block    RefPtr<EntryCallback> successCallback;
12068513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (exec->argumentCount() > 2 && !exec->argument(2).isNull() && !exec->argument(2).isUndefined()) {
12168513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (!exec->argument(2).isObject()) {
12268513a70bcd92384395513322f1b801e7bf9c729Steve Block            setDOMException(exec, TYPE_MISMATCH_ERR);
12368513a70bcd92384395513322f1b801e7bf9c729Steve Block            return jsUndefined();
12468513a70bcd92384395513322f1b801e7bf9c729Steve Block        }
12568513a70bcd92384395513322f1b801e7bf9c729Steve Block        successCallback = JSEntryCallback::create(asObject(exec->argument(2)), globalObject());
12668513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
12768513a70bcd92384395513322f1b801e7bf9c729Steve Block    RefPtr<ErrorCallback> errorCallback;
12868513a70bcd92384395513322f1b801e7bf9c729Steve Block    if (exec->argumentCount() > 3 && !exec->argument(3).isNull() && !exec->argument(3).isUndefined()) {
12968513a70bcd92384395513322f1b801e7bf9c729Steve Block        if (!exec->argument(3).isObject()) {
13068513a70bcd92384395513322f1b801e7bf9c729Steve Block            setDOMException(exec, TYPE_MISMATCH_ERR);
13168513a70bcd92384395513322f1b801e7bf9c729Steve Block            return jsUndefined();
13268513a70bcd92384395513322f1b801e7bf9c729Steve Block        }
13368513a70bcd92384395513322f1b801e7bf9c729Steve Block        errorCallback = JSErrorCallback::create(asObject(exec->argument(3)), globalObject());
13468513a70bcd92384395513322f1b801e7bf9c729Steve Block    }
13568513a70bcd92384395513322f1b801e7bf9c729Steve Block
13668513a70bcd92384395513322f1b801e7bf9c729Steve Block    imp->getDirectory(path, flags, successCallback, errorCallback);
13768513a70bcd92384395513322f1b801e7bf9c729Steve Block    return jsUndefined();
13868513a70bcd92384395513322f1b801e7bf9c729Steve Block}
13968513a70bcd92384395513322f1b801e7bf9c729Steve Block
14068513a70bcd92384395513322f1b801e7bf9c729Steve Block} // namespace WebCore
14168513a70bcd92384395513322f1b801e7bf9c729Steve Block
14268513a70bcd92384395513322f1b801e7bf9c729Steve Block#endif // ENABLE(FILE_SYSTEM)
143