165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved.
365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without
565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions
665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met:
765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright
865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer.
965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    documentation and/or other materials provided with the distribution.
1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE.
2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */
2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "config.h"
2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "NPJSObject.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "JSNPObject.h"
3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "NPRuntimeObjectMap.h"
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "NPRuntimeUtilities.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "PluginView.h"
3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <JavaScriptCore/JSLock.h>
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <JavaScriptCore/JSObject.h>
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/Frame.h>
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/IdentifierRep.h>
3781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <WebCore/NotImplemented.h>
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/text/WTFString.h>
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace JSC;
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore;
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochNPJSObject* NPJSObject::create(JSGlobalData& globalData, NPRuntimeObjectMap* objectMap, JSObject* jsObject)
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // We should never have a JSNPObject inside an NPJSObject.
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!jsObject->inherits(&JSNPObject::s_info));
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPJSObject* npJSObject = toNPJSObject(createNPObject(0, npClass()));
5181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    npJSObject->initialize(globalData, objectMap, jsObject);
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return npJSObject;
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNPJSObject::NPJSObject()
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    : m_objectMap(0)
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNPJSObject::~NPJSObject()
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_objectMap->npJSObjectDestroyed(this);
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPJSObject::isNPJSObject(NPObject* npObject)
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return npObject->_class == npClass();
6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid NPJSObject::initialize(JSGlobalData& globalData, NPRuntimeObjectMap* objectMap, JSObject* jsObject)
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!m_objectMap);
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!m_jsObject);
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_objectMap = objectMap;
7781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    m_jsObject.set(globalData, jsObject);
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic Identifier identifierFromIdentifierRep(ExecState* exec, IdentifierRep* identifierRep)
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(identifierRep->isString());
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    const char* string = identifierRep->string();
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    int length = strlen(string);
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return Identifier(exec, String::fromUTF8WithLatin1Fallback(string, length).impl());
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPJSObject::hasMethod(NPIdentifier methodName)
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IdentifierRep* identifierRep = static_cast<IdentifierRep*>(methodName);
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!identifierRep->isString())
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ExecState* exec = m_objectMap->globalExec();
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!exec)
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    JSValue value = m_jsObject->get(exec, identifierFromIdentifierRep(exec, identifierRep));
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    exec->clearException();
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CallData callData;
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return getCallData(value, callData) != CallTypeNone;
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPJSObject::invoke(NPIdentifier methodName, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IdentifierRep* identifierRep = static_cast<IdentifierRep*>(methodName);
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!identifierRep->isString())
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ExecState* exec = m_objectMap->globalExec();
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!exec)
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    JSValue function = m_jsObject->get(exec, identifierFromIdentifierRep(exec, identifierRep));
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return invoke(exec, m_objectMap->globalObject(), function, arguments, argumentCount, result);
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPJSObject::invokeDefault(const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ExecState* exec = m_objectMap->globalExec();
13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!exec)
13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    JSValue function = m_jsObject.get();
13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return invoke(exec, m_objectMap->globalObject(), function, arguments, argumentCount, result);
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPJSObject::hasProperty(NPIdentifier identifier)
14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IdentifierRep* identifierRep = static_cast<IdentifierRep*>(identifier);
14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ExecState* exec = m_objectMap->globalExec();
14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!exec)
14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool result;
15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (identifierRep->isString())
15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        result = m_jsObject->hasProperty(exec, identifierFromIdentifierRep(exec, identifierRep));
15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    else
15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        result = m_jsObject->hasProperty(exec, identifierRep->number());
15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    exec->clearException();
15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return result;
15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPJSObject::getProperty(NPIdentifier propertyName, NPVariant* result)
16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IdentifierRep* identifierRep = static_cast<IdentifierRep*>(propertyName);
16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ExecState* exec = m_objectMap->globalExec();
16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!exec)
16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    JSValue jsResult;
16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (identifierRep->isString())
17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        jsResult = m_jsObject->get(exec, identifierFromIdentifierRep(exec, identifierRep));
17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    else
17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        jsResult = m_jsObject->get(exec, identifierRep->number());
17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_objectMap->convertJSValueToNPVariant(exec, jsResult, *result);
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    exec->clearException();
17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPJSObject::setProperty(NPIdentifier propertyName, const NPVariant* value)
18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IdentifierRep* identifierRep = static_cast<IdentifierRep*>(propertyName);
18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ExecState* exec = m_objectMap->globalExec();
18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!exec)
18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    JSValue jsValue = m_objectMap->convertNPVariantToJSValue(exec, m_objectMap->globalObject(), *value);
19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (identifierRep->isString()) {
19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        PutPropertySlot slot;
19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_jsObject->put(exec, identifierFromIdentifierRep(exec, identifierRep), jsValue, slot);
19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    } else
19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_jsObject->put(exec, identifierRep->number(), jsValue);
19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    exec->clearException();
19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPJSObject::removeProperty(NPIdentifier propertyName)
20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    IdentifierRep* identifierRep = static_cast<IdentifierRep*>(propertyName);
20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ExecState* exec = m_objectMap->globalExec();
20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!exec)
20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (identifierRep->isString()) {
21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        Identifier identifier = identifierFromIdentifierRep(exec, identifierRep);
21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (!m_jsObject->hasProperty(exec, identifier)) {
21365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            exec->clearException();
21465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return false;
21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
21765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_jsObject->deleteProperty(exec, identifier);
21865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    } else {
21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (!m_jsObject->hasProperty(exec, identifierRep->number())) {
22065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            exec->clearException();
22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return false;
22265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
22365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_jsObject->deleteProperty(exec, identifierRep->number());
22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
22665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
22765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    exec->clearException();
22865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
22965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
23065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPJSObject::enumerate(NPIdentifier** identifiers, uint32_t* identifierCount)
23265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ExecState* exec = m_objectMap->globalExec();
23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!exec)
23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
23865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    PropertyNameArray propertyNames(exec);
24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_jsObject->getPropertyNames(exec, propertyNames);
24165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPIdentifier* nameIdentifiers = npnMemNewArray<NPIdentifier>(propertyNames.size());
24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (size_t i = 0; i < propertyNames.size(); ++i)
24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        nameIdentifiers[i] = static_cast<NPIdentifier>(IdentifierRep::get(propertyNames[i].ustring().utf8().data()));
24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    *identifiers = nameIdentifiers;
24865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    *identifierCount = propertyNames.size();
24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
25265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPJSObject::construct(const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ExecState* exec = m_objectMap->globalExec();
25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!exec)
25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    JSLock lock(SilenceAssertionsOnly);
26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ConstructData constructData;
26281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ConstructType constructType = getConstructData(m_jsObject.get(), constructData);
26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (constructType == ConstructTypeNone)
26465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
26565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
26665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Convert the passed in arguments.
26765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MarkedArgumentBuffer argumentList;
26865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (uint32_t i = 0; i < argumentCount; ++i)
26965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        argumentList.append(m_objectMap->convertNPVariantToJSValue(exec, m_objectMap->globalObject(), arguments[i]));
27065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    exec->globalData().timeoutChecker.start();
27281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    JSValue value = JSC::construct(exec, m_jsObject.get(), constructType, constructData, argumentList);
27365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    exec->globalData().timeoutChecker.stop();
27465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Convert and return the new object.
27665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_objectMap->convertJSValueToNPVariant(exec, value, *result);
27765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    exec->clearException();
27865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
27965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
28065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
28165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
28265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPJSObject::invoke(ExecState* exec, JSGlobalObject* globalObject, JSValue function, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
28365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
28465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CallData callData;
28565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    CallType callType = getCallData(function, callData);
28665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (callType == CallTypeNone)
28765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return false;
28865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
28965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Convert the passed in arguments.
29065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MarkedArgumentBuffer argumentList;
29165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    for (uint32_t i = 0; i < argumentCount; ++i)
29265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        argumentList.append(m_objectMap->convertNPVariantToJSValue(exec, globalObject, arguments[i]));
29365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
29465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    exec->globalData().timeoutChecker.start();
29581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    JSValue value = JSC::call(exec, function, callType, callData, m_jsObject.get(), argumentList);
29665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    exec->globalData().timeoutChecker.stop();
29765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
29865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Convert and return the result of the function call.
29965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_objectMap->convertJSValueToNPVariant(exec, value, *result);
30065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    exec->clearException();
30165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return true;
30365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
30465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
30565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNPClass* NPJSObject::npClass()
30665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
30765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static NPClass npClass = {
30865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_CLASS_STRUCT_VERSION,
30965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_Allocate,
31065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_Deallocate,
31165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        0,
31265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_HasMethod,
31365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_Invoke,
31465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_InvokeDefault,
31565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_HasProperty,
31665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_GetProperty,
31765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_SetProperty,
31865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_RemoveProperty,
31965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_Enumerate,
32065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        NP_Construct
32165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    };
32265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
32365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return &npClass;
32465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
32565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
32665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochNPObject* NPJSObject::NP_Allocate(NPP npp, NPClass*)
32765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
32865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT_UNUSED(npp, !npp);
32965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
33065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return new NPJSObject;
33165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
33265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
33365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid NPJSObject::NP_Deallocate(NPObject* npObject)
33465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
33565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    NPJSObject* npJSObject = toNPJSObject(npObject);
33665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    delete npJSObject;
33765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
33865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
33965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPJSObject::NP_HasMethod(NPObject* npObject, NPIdentifier methodName)
34065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
34165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return toNPJSObject(npObject)->hasMethod(methodName);
34265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
34365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
34465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPJSObject::NP_Invoke(NPObject* npObject, NPIdentifier methodName, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
34565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
34665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return toNPJSObject(npObject)->invoke(methodName, arguments, argumentCount, result);
34765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
34865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
34965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPJSObject::NP_InvokeDefault(NPObject* npObject, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
35065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
35165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return toNPJSObject(npObject)->invokeDefault(arguments, argumentCount, result);
35265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
35365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
35465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPJSObject::NP_HasProperty(NPObject* npObject, NPIdentifier propertyName)
35565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
35665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return toNPJSObject(npObject)->hasProperty(propertyName);
35765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
35865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
35965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPJSObject::NP_GetProperty(NPObject* npObject, NPIdentifier propertyName, NPVariant* result)
36065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
36165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return toNPJSObject(npObject)->getProperty(propertyName, result);
36265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
36365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
36465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPJSObject::NP_SetProperty(NPObject* npObject, NPIdentifier propertyName, const NPVariant* value)
36565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
36665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return toNPJSObject(npObject)->setProperty(propertyName, value);
36765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
36865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
36965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPJSObject::NP_RemoveProperty(NPObject* npObject, NPIdentifier propertyName)
37065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
37165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return toNPJSObject(npObject)->removeProperty(propertyName);
37265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
37365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
37465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPJSObject::NP_Enumerate(NPObject* npObject, NPIdentifier** identifiers, uint32_t* identifierCount)
37565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
37665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return toNPJSObject(npObject)->enumerate(identifiers, identifierCount);
37765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
37865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
37965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool NPJSObject::NP_Construct(NPObject* npObject, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
38065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
38165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return toNPJSObject(npObject)->construct(arguments, argumentCount, result);
38265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
38365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
38465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
385