1e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)/*
219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved.
319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) *
419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) * modification, are permitted provided that the following conditions are
619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) * met:
719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) *
819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) *     * Redistributions of source code must retain the above copyright
919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) * notice, this list of conditions and the following disclaimer.
1019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) *     * Redistributions in binary form must reproduce the above
1119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
1219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) * in the documentation and/or other materials provided with the
1319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) * distribution.
1419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
1519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) * contributors may be used to endorse or promote products derived from
1619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) * this software without specific prior written permission.
1719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) *
1819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) */
3019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)
3119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)// This file has been auto-generated by code_generator_v8.pm. DO NOT MODIFY!
32e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
33e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "config.h"
34e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "V8TestInterfaceImplementedAs.h"
35e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
36e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "RuntimeEnabledFeatures.h"
37e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "bindings/v8/ExceptionState.h"
38e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "bindings/v8/V8DOMConfiguration.h"
39e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/ContextFeatures.h"
40e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/Document.h"
411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/TraceEvent.h"
42e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "wtf/GetPtr.h"
43e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "wtf/RefPtr.h"
44e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
45e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)namespace WebCore {
46e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)static void initializeScriptWrappableForInterface(RealClass* object)
48e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
49e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    if (ScriptWrappable::wrapperCanBeStoredInObject(object))
50f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        ScriptWrappable::setTypeInfoInObject(object, &V8TestInterfaceImplementedAs::wrapperTypeInfo);
5193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    else
5293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        ASSERT_NOT_REACHED();
53e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
545267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
555267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} // namespace WebCore
565267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
575267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// In ScriptWrappable::init, the use of a local function declaration has an issue on Windows:
585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// the local declaration does not pick up the surrounding namespace. Therefore, we provide this function
595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// in the global namespace.
605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)// (More info on the MSVC bug here: http://connect.microsoft.com/VisualStudio/feedback/details/664619/the-namespace-of-local-function-declarations-in-c)
615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void webCoreInitializeScriptWrappableForInterface(WebCore::RealClass* object)
625267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    WebCore::initializeScriptWrappableForInterface(object);
645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
66e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)namespace WebCore {
67a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)const WrapperTypeInfo V8TestInterfaceImplementedAs::wrapperTypeInfo = { gin::kEmbedderBlink, V8TestInterfaceImplementedAs::domTemplate, V8TestInterfaceImplementedAs::derefObject, 0, 0, 0, V8TestInterfaceImplementedAs::installPerContextEnabledMethods, 0, WrapperTypeObjectPrototype };
68e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
69e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)namespace RealClassV8Internal {
70e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
71e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)template <typename T> void V8_USE(T) { }
72e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
7319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)static void aAttributeGetter(const v8::PropertyCallbackInfo<v8::Value>& info)
74e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
75e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    RealClass* imp = V8TestInterfaceImplementedAs::toNative(info.Holder());
763464d02a173573db42f8ee6bb07bb74fabf4f5f2Ben Murdoch    v8SetReturnValueString(info, imp->a(), info.GetIsolate());
77e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
78e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
7919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)static void aAttributeGetterCallback(v8::Local<v8::String>, const v8::PropertyCallbackInfo<v8::Value>& info)
80e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
81e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    TRACE_EVENT_SET_SAMPLING_STATE("Blink", "DOMGetter");
8219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    RealClassV8Internal::aAttributeGetter(info);
83e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    TRACE_EVENT_SET_SAMPLING_STATE("V8", "Execution");
84e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
85e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
8619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)static void aAttributeSetter(v8::Local<v8::Value> jsValue, const v8::PropertyCallbackInfo<void>& info)
87e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
88e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    RealClass* imp = V8TestInterfaceImplementedAs::toNative(info.Holder());
89bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    V8TRYCATCH_FOR_V8STRINGRESOURCE_VOID(V8StringResource<>, cppValue, jsValue);
90bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    imp->setA(cppValue);
91e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
92e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
9319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)static void aAttributeSetterCallback(v8::Local<v8::String>, v8::Local<v8::Value> jsValue, const v8::PropertyCallbackInfo<void>& info)
94e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
95e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    TRACE_EVENT_SET_SAMPLING_STATE("Blink", "DOMSetter");
9619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    RealClassV8Internal::aAttributeSetter(jsValue, info);
97e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    TRACE_EVENT_SET_SAMPLING_STATE("V8", "Execution");
98e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
99e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
10019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)static void bAttributeGetter(const v8::PropertyCallbackInfo<v8::Value>& info)
101e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
102e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    RealClass* imp = V8TestInterfaceImplementedAs::toNative(info.Holder());
103e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    v8SetReturnValueFast(info, imp->b(), imp);
104e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
105e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
10619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)static void bAttributeGetterCallback(v8::Local<v8::String>, const v8::PropertyCallbackInfo<v8::Value>& info)
107e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
108e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    TRACE_EVENT_SET_SAMPLING_STATE("Blink", "DOMGetter");
10919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    RealClassV8Internal::bAttributeGetter(info);
110e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    TRACE_EVENT_SET_SAMPLING_STATE("V8", "Execution");
111e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
112e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
11319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)static void bAttributeSetter(v8::Local<v8::Value> jsValue, const v8::PropertyCallbackInfo<void>& info)
114e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
115e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    RealClass* imp = V8TestInterfaceImplementedAs::toNative(info.Holder());
11651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    V8TRYCATCH_VOID(RealClass*, cppValue, V8TestInterfaceImplementedAs::hasInstance(jsValue, info.GetIsolate(), worldType(info.GetIsolate())) ? V8TestInterfaceImplementedAs::toNative(v8::Handle<v8::Object>::Cast(jsValue)) : 0);
117bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    imp->setB(WTF::getPtr(cppValue));
118e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
119e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
12019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)static void bAttributeSetterCallback(v8::Local<v8::String>, v8::Local<v8::Value> jsValue, const v8::PropertyCallbackInfo<void>& info)
121e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
122e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    TRACE_EVENT_SET_SAMPLING_STATE("Blink", "DOMSetter");
12319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    RealClassV8Internal::bAttributeSetter(jsValue, info);
124e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    TRACE_EVENT_SET_SAMPLING_STATE("V8", "Execution");
125e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
126e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
12719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)static void func1Method(const v8::FunctionCallbackInfo<v8::Value>& info)
128e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
12919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    if (UNLIKELY(info.Length() < 1)) {
13019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        throwTypeError(ExceptionMessages::failedToExecute("func1", "TestInterfaceImplementedAs", ExceptionMessages::notEnoughArguments(1, info.Length())), info.GetIsolate());
1315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return;
1325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    }
13319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    RealClass* imp = V8TestInterfaceImplementedAs::toNative(info.Holder());
13419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    V8TRYCATCH_FOR_V8STRINGRESOURCE_VOID(V8StringResource<>, a, info[0]);
13519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    v8SetReturnValueString(info, imp->func1(a), info.GetIsolate());
136e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
137e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
13819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)static void func1MethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info)
139e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
140e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    TRACE_EVENT_SET_SAMPLING_STATE("Blink", "DOMMethod");
14119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    RealClassV8Internal::func1Method(info);
142e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    TRACE_EVENT_SET_SAMPLING_STATE("V8", "Execution");
143e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
144e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
14519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)static void funcTestInterfaceImplementedAsParamMethod(const v8::FunctionCallbackInfo<v8::Value>& info)
146e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
14719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    if (UNLIKELY(info.Length() < 1)) {
14819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        throwTypeError(ExceptionMessages::failedToExecute("funcTestInterfaceImplementedAsParam", "TestInterfaceImplementedAs", ExceptionMessages::notEnoughArguments(1, info.Length())), info.GetIsolate());
1495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return;
1505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    }
15119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    RealClass* imp = V8TestInterfaceImplementedAs::toNative(info.Holder());
15251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    V8TRYCATCH_VOID(RealClass*, orange, V8TestInterfaceImplementedAs::hasInstance(info[0], info.GetIsolate(), worldType(info.GetIsolate())) ? V8TestInterfaceImplementedAs::toNative(v8::Handle<v8::Object>::Cast(info[0])) : 0);
15319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    v8SetReturnValueString(info, imp->funcTestInterfaceImplementedAsParam(orange), info.GetIsolate());
154e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
155e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
15619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)static void funcTestInterfaceImplementedAsParamMethodCallback(const v8::FunctionCallbackInfo<v8::Value>& info)
157e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
158e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    TRACE_EVENT_SET_SAMPLING_STATE("Blink", "DOMMethod");
15919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    RealClassV8Internal::funcTestInterfaceImplementedAsParamMethod(info);
160e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    TRACE_EVENT_SET_SAMPLING_STATE("V8", "Execution");
161e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
162e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
163e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)} // namespace RealClassV8Internal
164e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
165c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)static const V8DOMConfiguration::AttributeConfiguration V8TestInterfaceImplementedAsAttributes[] = {
166c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    {"a", RealClassV8Internal::aAttributeGetterCallback, RealClassV8Internal::aAttributeSetterCallback, 0, 0, 0, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */},
167c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    {"b", RealClassV8Internal::bAttributeGetterCallback, RealClassV8Internal::bAttributeSetterCallback, 0, 0, 0, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */},
168e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)};
169e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
170c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)static const V8DOMConfiguration::MethodConfiguration V8TestInterfaceImplementedAsMethods[] = {
171e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    {"func1", RealClassV8Internal::func1MethodCallback, 0, 1},
172e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)};
173e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
17451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)static v8::Handle<v8::FunctionTemplate> ConfigureV8TestInterfaceImplementedAsTemplate(v8::Handle<v8::FunctionTemplate> functionTemplate, v8::Isolate* isolate, WrapperWorldType currentWorldType)
175e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
17651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    functionTemplate->ReadOnlyPrototype();
177e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
178e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    v8::Local<v8::Signature> defaultSignature;
17951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    defaultSignature = V8DOMConfiguration::installDOMClassTemplate(functionTemplate, "TestInterfaceImplementedAs", v8::Local<v8::FunctionTemplate>(), V8TestInterfaceImplementedAs::internalFieldCount,
180c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        V8TestInterfaceImplementedAsAttributes, WTF_ARRAY_LENGTH(V8TestInterfaceImplementedAsAttributes),
18151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        0, 0,
18219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        V8TestInterfaceImplementedAsMethods, WTF_ARRAY_LENGTH(V8TestInterfaceImplementedAsMethods),
18319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)        isolate, currentWorldType);
184a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    v8::Local<v8::ObjectTemplate> ALLOW_UNUSED instanceTemplate = functionTemplate->InstanceTemplate();
185a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    v8::Local<v8::ObjectTemplate> ALLOW_UNUSED prototypeTemplate = functionTemplate->PrototypeTemplate();
186e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
187e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    // Custom Signature 'funcTestInterfaceImplementedAsParam'
188e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    const int funcTestInterfaceImplementedAsParamArgc = 1;
189a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    v8::Handle<v8::FunctionTemplate> funcTestInterfaceImplementedAsParamArgv[funcTestInterfaceImplementedAsParamArgc] = { V8PerIsolateData::from(isolate)->rawDOMTemplate(&V8TestInterfaceImplementedAs::wrapperTypeInfo, currentWorldType) };
190a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    v8::Handle<v8::Signature> funcTestInterfaceImplementedAsParamSignature = v8::Signature::New(isolate, functionTemplate, funcTestInterfaceImplementedAsParamArgc, funcTestInterfaceImplementedAsParamArgv);
191a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    prototypeTemplate->Set(v8::String::NewFromUtf8(isolate, "funcTestInterfaceImplementedAsParam", v8::String::kInternalizedString), v8::FunctionTemplate::New(isolate, RealClassV8Internal::funcTestInterfaceImplementedAsParamMethodCallback, v8Undefined(), funcTestInterfaceImplementedAsParamSignature, 1));
192e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
193e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    // Custom toString template
194a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    functionTemplate->Set(v8::String::NewFromUtf8(isolate, "toString", v8::String::kInternalizedString), V8PerIsolateData::current()->toStringTemplate());
19551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return functionTemplate;
196e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
197e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
198a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)v8::Handle<v8::FunctionTemplate> V8TestInterfaceImplementedAs::domTemplate(v8::Isolate* isolate, WrapperWorldType currentWorldType)
199e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
200e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    V8PerIsolateData* data = V8PerIsolateData::from(isolate);
201f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    V8PerIsolateData::TemplateMap::iterator result = data->templateMap(currentWorldType).find(&wrapperTypeInfo);
202e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    if (result != data->templateMap(currentWorldType).end())
2035267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return result->value.newLocal(isolate);
204e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
205e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    TRACE_EVENT_SCOPED_SAMPLING_STATE("Blink", "BuildDOMTemplate");
206a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    v8::EscapableHandleScope handleScope(isolate);
207a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    v8::Local<v8::FunctionTemplate> templ =
208a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        ConfigureV8TestInterfaceImplementedAsTemplate(data->rawDOMTemplate(&wrapperTypeInfo, currentWorldType), isolate, currentWorldType);
209f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    data->templateMap(currentWorldType).add(&wrapperTypeInfo, UnsafePersistent<v8::FunctionTemplate>(isolate, templ));
210a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    return handleScope.Escape(templ);
211e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
212e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
21351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool V8TestInterfaceImplementedAs::hasInstance(v8::Handle<v8::Value> jsValue, v8::Isolate* isolate, WrapperWorldType currentWorldType)
214e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
215f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return V8PerIsolateData::from(isolate)->hasInstance(&wrapperTypeInfo, jsValue, currentWorldType);
216e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
217e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
21851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool V8TestInterfaceImplementedAs::hasInstanceInAnyWorld(v8::Handle<v8::Value> jsValue, v8::Isolate* isolate)
219e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
220f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return V8PerIsolateData::from(isolate)->hasInstance(&wrapperTypeInfo, jsValue, MainWorld)
221f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        || V8PerIsolateData::from(isolate)->hasInstance(&wrapperTypeInfo, jsValue, IsolatedWorld)
222f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        || V8PerIsolateData::from(isolate)->hasInstance(&wrapperTypeInfo, jsValue, WorkerWorld);
223e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
224e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
225e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)v8::Handle<v8::Object> V8TestInterfaceImplementedAs::createWrapper(PassRefPtr<RealClass> impl, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate)
226e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
2271e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    ASSERT(impl);
228e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    ASSERT(!DOMDataStore::containsWrapper<V8TestInterfaceImplementedAs>(impl.get(), isolate));
2297757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    if (ScriptWrappable::wrapperCanBeStoredInObject(impl.get())) {
2307757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        const WrapperTypeInfo* actualInfo = ScriptWrappable::getTypeInfoFromObject(impl.get());
231f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        // Might be a XXXConstructor::wrapperTypeInfo instead of an XXX::wrapperTypeInfo. These will both have
2327757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        // the same object de-ref functions, though, so use that as the basis of the check.
233f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(actualInfo->derefObjectFunction == wrapperTypeInfo.derefObjectFunction);
2347757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    }
2357757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch
236f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    v8::Handle<v8::Object> wrapper = V8DOMWrapper::createWrapper(creationContext, &wrapperTypeInfo, toInternalPointer(impl.get()), isolate);
237e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    if (UNLIKELY(wrapper.IsEmpty()))
238e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)        return wrapper;
239c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
240bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    installPerContextEnabledProperties(wrapper, impl.get(), isolate);
241f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    V8DOMWrapper::associateObjectWithWrapper<V8TestInterfaceImplementedAs>(impl, &wrapperTypeInfo, wrapper, isolate, WrapperConfiguration::Independent);
242e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    return wrapper;
243e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
244c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
245e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)void V8TestInterfaceImplementedAs::derefObject(void* object)
246e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
247e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    fromInternalPointer(object)->deref();
248e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
249e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
25051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)template<>
25151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)v8::Handle<v8::Value> toV8NoInline(RealClass* impl, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate)
25251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
25351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return toV8(impl, creationContext, isolate);
25451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
25551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
256e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)} // namespace WebCore
257