1643ca7872b450ea4efacab6188849e5aac2ba161Steve Block/*
2643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Copyright (C) 2009 Google Inc. All rights reserved.
3643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *
4643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * Redistribution and use in source and binary forms, with or without
5643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * modification, are permitted provided that the following conditions are
6643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * met:
7643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *
8643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *     * Redistributions of source code must retain the above copyright
9643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * notice, this list of conditions and the following disclaimer.
10643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *     * Redistributions in binary form must reproduce the above
11643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * copyright notice, this list of conditions and the following disclaimer
12643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * in the documentation and/or other materials provided with the
13643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * distribution.
14643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *     * Neither the name of Google Inc. nor the names of its
15643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * contributors may be used to endorse or promote products derived from
16643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * this software without specific prior written permission.
17643ca7872b450ea4efacab6188849e5aac2ba161Steve Block *
18643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28643ca7872b450ea4efacab6188849e5aac2ba161Steve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29643ca7872b450ea4efacab6188849e5aac2ba161Steve Block */
30643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
31643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "config.h"
32643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "WebBindings.h"
33643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
34643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "npruntime_impl.h"
35643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "npruntime_priv.h"
36643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
37643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if USE(V8)
38643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "NPV8Object.h"  // for PrivateIdentifier
39643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "Range.h"
40d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "V8BindingState.h"
41643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "V8DOMWrapper.h"
425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "V8Element.h"
43e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "V8NPUtils.h"
442bde8e466a4451c7319e3a072d118917957d6554Steve Block#include "V8Node.h"
45643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "V8Proxy.h"
46d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "V8Range.h"
47643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#elif USE(JSC)
48643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "bridge/c/c_utility.h"
49643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
505ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "WebElement.h"
516c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#include "WebRange.h"
52643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
53643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if USE(JAVASCRIPTCORE_BINDINGS)
54643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockusing JSC::Bindings::PrivateIdentifier;
55643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
56643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
57643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockusing namespace WebCore;
58643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
59643ca7872b450ea4efacab6188849e5aac2ba161Steve Blocknamespace WebKit {
60643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
612bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool WebBindings::construct(NPP npp, NPObject* object, const NPVariant* args, uint32_t argCount, NPVariant* result)
62643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
632bde8e466a4451c7319e3a072d118917957d6554Steve Block    return _NPN_Construct(npp, object, args, argCount, result);
64643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
65643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
66643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockNPObject* WebBindings::createObject(NPP npp, NPClass* npClass)
67643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
68643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return _NPN_CreateObject(npp, npClass);
69643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
70643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
712bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool WebBindings::enumerate(NPP npp, NPObject* object, NPIdentifier** identifier, uint32_t* identifierCount)
72643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
732bde8e466a4451c7319e3a072d118917957d6554Steve Block    return _NPN_Enumerate(npp, object, identifier, identifierCount);
74643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
75643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
762bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool WebBindings::evaluate(NPP npp, NPObject* object, NPString* script, NPVariant* result)
77643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
782bde8e466a4451c7319e3a072d118917957d6554Steve Block    return _NPN_Evaluate(npp, object, script, result);
79643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
80643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
812bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool WebBindings::evaluateHelper(NPP npp, bool popupsAllowed, NPObject* object, NPString* script, NPVariant* result)
82643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
832bde8e466a4451c7319e3a072d118917957d6554Steve Block    return _NPN_EvaluateHelper(npp, popupsAllowed, object, script, result);
84643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
85643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
86643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockNPIdentifier WebBindings::getIntIdentifier(int32_t number)
87643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
88643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return _NPN_GetIntIdentifier(number);
89643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
90643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
912bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool WebBindings::getProperty(NPP npp, NPObject* object, NPIdentifier property, NPVariant* result)
92643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
932bde8e466a4451c7319e3a072d118917957d6554Steve Block    return _NPN_GetProperty(npp, object, property, result);
94643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
95643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
96643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockNPIdentifier WebBindings::getStringIdentifier(const NPUTF8* string)
97643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
98643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return _NPN_GetStringIdentifier(string);
99643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
100643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
101643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebBindings::getStringIdentifiers(const NPUTF8** names, int32_t nameCount, NPIdentifier* identifiers)
102643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
103643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    _NPN_GetStringIdentifiers(names, nameCount, identifiers);
104643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
105643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1062bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool WebBindings::hasMethod(NPP npp, NPObject* object, NPIdentifier method)
107643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1082bde8e466a4451c7319e3a072d118917957d6554Steve Block    return _NPN_HasMethod(npp, object, method);
109643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
110643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1112bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool WebBindings::hasProperty(NPP npp, NPObject* object, NPIdentifier property)
112643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1132bde8e466a4451c7319e3a072d118917957d6554Steve Block    return _NPN_HasProperty(npp, object, property);
114643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
115643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
116643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockbool WebBindings::identifierIsString(NPIdentifier identifier)
117643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
118643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return _NPN_IdentifierIsString(identifier);
119643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
120643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
121643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockint32_t WebBindings::intFromIdentifier(NPIdentifier identifier)
122643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
123643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return _NPN_IntFromIdentifier(identifier);
124643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
125643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
126643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebBindings::initializeVariantWithStringCopy(NPVariant* variant, const NPString* value)
127643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
128643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if USE(V8)
129643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    _NPN_InitializeVariantWithStringCopy(variant, value);
130643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#else
131643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    NPN_InitializeVariantWithStringCopy(variant, value);
132643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
133643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
134643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1352bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool WebBindings::invoke(NPP npp, NPObject* object, NPIdentifier method, const NPVariant* args, uint32_t argCount, NPVariant* result)
136643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1372bde8e466a4451c7319e3a072d118917957d6554Steve Block    return _NPN_Invoke(npp, object, method, args, argCount, result);
138643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
139643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1402bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool WebBindings::invokeDefault(NPP npp, NPObject* object, const NPVariant* args, uint32_t argCount, NPVariant* result)
141643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1422bde8e466a4451c7319e3a072d118917957d6554Steve Block    return _NPN_InvokeDefault(npp, object, args, argCount, result);
143643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
144643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1452bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebBindings::releaseObject(NPObject* object)
146643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1472bde8e466a4451c7319e3a072d118917957d6554Steve Block    return _NPN_ReleaseObject(object);
148643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
149643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
150643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebBindings::releaseVariantValue(NPVariant* variant)
151643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
152643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    _NPN_ReleaseVariantValue(variant);
153643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
154643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1552bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool WebBindings::removeProperty(NPP npp, NPObject* object, NPIdentifier identifier)
156643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1572bde8e466a4451c7319e3a072d118917957d6554Steve Block    return _NPN_RemoveProperty(npp, object, identifier);
158643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
159643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1602bde8e466a4451c7319e3a072d118917957d6554Steve BlockNPObject* WebBindings::retainObject(NPObject* object)
161643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1622bde8e466a4451c7319e3a072d118917957d6554Steve Block    return _NPN_RetainObject(object);
163643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
164643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1652bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebBindings::setException(NPObject* object, const NPUTF8* message)
166643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1672bde8e466a4451c7319e3a072d118917957d6554Steve Block    _NPN_SetException(object, message);
168643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
169643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1702bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool WebBindings::setProperty(NPP npp, NPObject* object, NPIdentifier identifier, const NPVariant* value)
171643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1722bde8e466a4451c7319e3a072d118917957d6554Steve Block    return _NPN_SetProperty(npp, object, identifier, value);
173643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
174643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1752bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid WebBindings::unregisterObject(NPObject* object)
176643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
177643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if USE(V8)
1782bde8e466a4451c7319e3a072d118917957d6554Steve Block    _NPN_UnregisterObject(object);
179643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
180643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
181643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
182643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockNPUTF8* WebBindings::utf8FromIdentifier(NPIdentifier identifier)
183643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
184643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return _NPN_UTF8FromIdentifier(identifier);
185643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
186643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
187643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid WebBindings::extractIdentifierData(const NPIdentifier& identifier, const NPUTF8*& string, int32_t& number, bool& isString)
188643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
1892bde8e466a4451c7319e3a072d118917957d6554Steve Block    PrivateIdentifier* data = static_cast<PrivateIdentifier*>(identifier);
1902bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!data) {
191643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        isString = false;
192643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        number = 0;
193643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return;
194643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
195643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
1962bde8e466a4451c7319e3a072d118917957d6554Steve Block    isString = data->isString;
197643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (isString)
1982bde8e466a4451c7319e3a072d118917957d6554Steve Block        string = data->value.string;
199643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    else
2002bde8e466a4451c7319e3a072d118917957d6554Steve Block        number = data->value.number;
201643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
202643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
203643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if USE(V8)
204643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2052bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic bool getRangeImpl(NPObject* object, WebRange* webRange)
206643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2072bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!object || (object->_class != npScriptObjectClass))
208643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return false;
209643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2102bde8e466a4451c7319e3a072d118917957d6554Steve Block    V8NPObject* v8NPObject = reinterpret_cast<V8NPObject*>(object);
2112bde8e466a4451c7319e3a072d118917957d6554Steve Block    v8::Handle<v8::Object> v8Object(v8NPObject->v8Object);
2122bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!V8Range::info.equals(V8DOMWrapper::domWrapperType(v8Object)))
213643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return false;
214643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2152bde8e466a4451c7319e3a072d118917957d6554Steve Block    Range* native = V8Range::toNative(v8Object);
216643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    if (!native)
217643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        return false;
218643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2192bde8e466a4451c7319e3a072d118917957d6554Steve Block    *webRange = WebRange(native);
220643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return true;
221643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
222643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2232bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic bool getElementImpl(NPObject* object, WebElement* webElement)
2245ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
2252bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (!object || (object->_class != npScriptObjectClass))
2265ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        return false;
2275ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
2282bde8e466a4451c7319e3a072d118917957d6554Steve Block    V8NPObject* v8NPObject = reinterpret_cast<V8NPObject*>(object);
2295ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    v8::Handle<v8::Object> v8Object(v8NPObject->v8Object);
2305ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    Element* native = V8Element::toNative(v8Object);
2315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    if (!native)
2325ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        return false;
2335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
2345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    *webElement = WebElement(native);
2355ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return true;
2365ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
2375ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
238bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenstatic NPObject* makeIntArrayImpl(const WebVector<int>& data)
239bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
240bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    v8::HandleScope handleScope;
241bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    v8::Handle<v8::Array> result = v8::Array::New(data.size());
2422bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (size_t i = 0; i < data.size(); ++i)
243bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        result->Set(i, v8::Number::New(data[i]));
244bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
245bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    WebCore::DOMWindow* window = WebCore::V8Proxy::retrieveWindow(WebCore::V8Proxy::currentContext());
246bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return npCreateV8ScriptObject(0, result, window);
247bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
248bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
2496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerstatic NPObject* makeStringArrayImpl(const WebVector<WebString>& data)
2506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
2516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    v8::HandleScope handleScope;
2526b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    v8::Handle<v8::Array> result = v8::Array::New(data.size());
2536b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    for (size_t i = 0; i < data.size(); ++i)
2544576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        result->Set(i, data[i].data() ? v8::String::New(reinterpret_cast<const uint16_t*>((data[i].data())), data[i].length()) : v8::String::New(""));
2556b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
2566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    WebCore::DOMWindow* window = WebCore::V8Proxy::retrieveWindow(WebCore::V8Proxy::currentContext());
2576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    return npCreateV8ScriptObject(0, result, window);
2586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}
2596b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
2602bde8e466a4451c7319e3a072d118917957d6554Steve Blockstatic NPObject* makeNodeImpl(WebNode data)
261643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
2622bde8e466a4451c7319e3a072d118917957d6554Steve Block    v8::HandleScope handleScope;
2632bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (data.isNull())
2642bde8e466a4451c7319e3a072d118917957d6554Steve Block        return 0;
2652bde8e466a4451c7319e3a072d118917957d6554Steve Block    v8::Handle<v8::Object> result = V8Node::wrap(data.unwrap<Node>());
2662bde8e466a4451c7319e3a072d118917957d6554Steve Block    WebCore::DOMWindow* window = WebCore::V8Proxy::retrieveWindow(WebCore::V8Proxy::currentContext());
2672bde8e466a4451c7319e3a072d118917957d6554Steve Block    return npCreateV8ScriptObject(0, result, window);
268643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
269643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2702bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
271643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2722bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool WebBindings::getRange(NPObject* range, WebRange* webRange)
273643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
274643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if USE(V8)
2752bde8e466a4451c7319e3a072d118917957d6554Steve Block    return getRangeImpl(range, webRange);
276643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#else
277643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Not supported on other ports (JSC, etc).
278643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return false;
279643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
280643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
281643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
2825ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenbool WebBindings::getElement(NPObject* element, WebElement* webElement)
2835ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{
2845ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if USE(V8)
2855ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return getElementImpl(element, webElement);
2865ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#else
2875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    // Not supported on other ports (JSC, etc.).
2885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    return false;
2895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif
2905ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen}
2915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen
2922bde8e466a4451c7319e3a072d118917957d6554Steve BlockNPObject* WebBindings::makeIntArray(const WebVector<int>& data)
293bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{
294bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if USE(V8)
295bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return makeIntArrayImpl(data);
296bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#else
297bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    // Not supported on other ports (JSC, etc.).
298bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen    return 0;
299bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#endif
300bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen}
301bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen
3026b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerNPObject* WebBindings::makeStringArray(const WebVector<WebString>& data)
3036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
3046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#if USE(V8)
3056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    return makeStringArrayImpl(data);
3066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#else
3076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // Not supported on other ports (JSC, etc.).
3086b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    return 0;
3096b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#endif
3106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}
3116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
3122bde8e466a4451c7319e3a072d118917957d6554Steve BlockNPObject* WebBindings::makeNode(const WebNode& data)
3132bde8e466a4451c7319e3a072d118917957d6554Steve Block{
3142bde8e466a4451c7319e3a072d118917957d6554Steve Block#if USE(V8)
3152bde8e466a4451c7319e3a072d118917957d6554Steve Block    return makeNodeImpl(data);
3162bde8e466a4451c7319e3a072d118917957d6554Steve Block#else
3172bde8e466a4451c7319e3a072d118917957d6554Steve Block    // Not supported on other ports (JSC, etc.).
3182bde8e466a4451c7319e3a072d118917957d6554Steve Block    return 0;
3192bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
3202bde8e466a4451c7319e3a072d118917957d6554Steve Block}
3212bde8e466a4451c7319e3a072d118917957d6554Steve Block
322e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockvoid WebBindings::pushExceptionHandler(ExceptionHandler handler, void* data)
323e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{
324e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    WebCore::pushExceptionHandler(handler, data);
325e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block}
326e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
327e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockvoid WebBindings::popExceptionHandler()
328e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block{
329e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block    WebCore::popExceptionHandler();
330e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block}
331e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
332643ca7872b450ea4efacab6188849e5aac2ba161Steve Block} // namespace WebKit
333