18f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian/* 28f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Copyright (C) 2006, 2007, 2008, 2009 Google Inc. All rights reserved. 38f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 48f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Redistribution and use in source and binary forms, with or without 58f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * modification, are permitted provided that the following conditions are 68f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * met: 78f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 88f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * * Redistributions of source code must retain the above copyright 98f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * notice, this list of conditions and the following disclaimer. 108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * * Redistributions in binary form must reproduce the above 118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * copyright notice, this list of conditions and the following disclaimer 128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * in the documentation and/or other materials provided with the 138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * distribution. 148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * * Neither the name of Google Inc. nor the names of its 158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * contributors may be used to endorse or promote products derived from 168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * this software without specific prior written permission. 178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * 188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 298f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian */ 308f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 318f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "config.h" 32cad810f21b803229eb11403f9209855525a25d57Steve Block#include "V8EventListener.h" 338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 348f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "V8Proxy.h" 358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qiannamespace WebCore { 378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 38643ca7872b450ea4efacab6188849e5aac2ba161Steve BlockV8EventListener::V8EventListener(v8::Local<v8::Object> listener, bool isAttribute, const WorldContextHandle& worldContext) 39643ca7872b450ea4efacab6188849e5aac2ba161Steve Block : V8AbstractEventListener(isAttribute, worldContext) 408f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 41231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block setListenerObject(listener); 428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 44cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockv8::Local<v8::Function> V8EventListener::getListenerFunction(ScriptExecutionContext* context) 458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 46cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block v8::Local<v8::Object> listener = getListenerObject(context); 47231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 488f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Has the listener been disposed? 49231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (listener.IsEmpty()) 508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return v8::Local<v8::Function>(); 518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 52231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (listener->IsFunction()) 53231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return v8::Local<v8::Function>::Cast(listener); 548f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 55231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block if (listener->IsObject()) { 56231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block v8::Local<v8::Value> property = listener->Get(v8::String::NewSymbol("handleEvent")); 572fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // Check that no exceptions were thrown when getting the 582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // handleEvent property and that the value is a function. 592fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (!property.IsEmpty() && property->IsFunction()) 608f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return v8::Local<v8::Function>::Cast(property); 618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 628f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return v8::Local<v8::Function>(); 648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 66cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockv8::Local<v8::Value> V8EventListener::callListenerFunction(ScriptExecutionContext* context, v8::Handle<v8::Value> jsEvent, Event* event) 678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 68cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 69cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block v8::Local<v8::Function> handlerFunction = getListenerFunction(context); 70231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block v8::Local<v8::Object> receiver = getReceiverObject(event); 718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (handlerFunction.IsEmpty() || receiver.IsEmpty()) 728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return v8::Local<v8::Value>(); 738f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian v8::Handle<v8::Value> parameters[1] = { jsEvent }; 758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 76cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block if (V8Proxy* proxy = V8Proxy::retrieve(context)) 77cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return proxy->callFunction(handlerFunction, receiver, 1, parameters); 78cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 79cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block return v8::Local<v8::Value>(); 808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} // namespace WebCore 83