2 * Copyright (C) 2013 Google Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
14 * * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 #ifndef ScriptFunction_h
32 #define ScriptFunction_h
34 #include "bindings/v8/ScriptValue.h"
35 #include "bindings/v8/V8Binding.h"
36 #include "bindings/v8/V8GarbageCollected.h"
37 #include "wtf/RefCounted.h"
43 v8::Handle<v8::Function> adoptByGarbageCollector(PassOwnPtr<ScriptFunction>);
45 class ScriptFunction : public V8GarbageCollected<ScriptFunction> {
47 virtual ~ScriptFunction() { }
50 ScriptFunction(v8::Isolate* isolate) : V8GarbageCollected<ScriptFunction>(isolate) { }
53 friend v8::Handle<v8::Function> adoptByGarbageCollector(PassOwnPtr<ScriptFunction>);
55 virtual ScriptValue call(ScriptValue) = 0;
57 static void callCallback(const v8::FunctionCallbackInfo<v8::Value>& args)
59 v8::Isolate* isolate = args.GetIsolate();
60 ASSERT(!args.Data().IsEmpty());
61 ScriptFunction* function = ScriptFunction::Cast(args.Data());
62 v8::Local<v8::Value> value = args.Length() > 0 ? args[0] : v8::Local<v8::Value>(v8::Undefined(isolate));
64 ScriptValue result = function->call(ScriptValue(value, isolate));
66 v8SetReturnValue(args, result.v8Value());
70 inline v8::Handle<v8::Function> adoptByGarbageCollector(PassOwnPtr<ScriptFunction> function)
73 return v8::Handle<v8::Function>();
74 v8::Isolate* isolate = function->isolate();
75 return createClosure(&ScriptFunction::callCallback, function.leakPtr()->releaseToV8GarbageCollector(), isolate);
78 } // namespace WebCore