15af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke/* 22bde8e466a4451c7319e3a072d118917957d6554Steve Block * Copyright (C) 2010, 2011 Igalia S.L. 35af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke * 45af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke * This library is free software; you can redistribute it and/or 55af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke * modify it under the terms of the GNU Lesser General Public 65af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke * License as published by the Free Software Foundation; either 75af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke * version 2 of the License, or (at your option) any later version. 85af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke * 95af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke * This library is distributed in the hope that it will be useful, 105af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke * but WITHOUT ANY WARRANTY; without even the implied warranty of 115af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 125af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke * Lesser General Public License for more details. 135af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke * 145af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke * You should have received a copy of the GNU Lesser General Public 155af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke * License along with this library; if not, write to the Free Software 165af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 175af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke */ 185af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 195af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include "config.h" 205af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include "GObjectEventListener.h" 215af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 225af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include "Event.h" 235af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include "EventListener.h" 24f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include "webkit/WebKitDOMEvent.h" 255af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include "webkit/WebKitDOMEventPrivate.h" 2628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include <glib-object.h> 2728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include <glib.h> 285af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke#include <wtf/HashMap.h> 295af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 305af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkenamespace WebCore { 315af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 322bde8e466a4451c7319e3a072d118917957d6554Steve Blocktypedef void (*GObjectEventListenerCallback)(GObject*, WebKitDOMEvent*, void*); 332bde8e466a4451c7319e3a072d118917957d6554Steve Block 342bde8e466a4451c7319e3a072d118917957d6554Steve BlockGObjectEventListener::GObjectEventListener(GObject* object, EventTarget* target, const char* domEventName, GCallback handler, bool capture, void* userData) 3528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu : EventListener(GObjectEventListenerType) 3628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu , m_object(object) 372bde8e466a4451c7319e3a072d118917957d6554Steve Block , m_coreTarget(target) 3828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu , m_domEventName(domEventName) 392bde8e466a4451c7319e3a072d118917957d6554Steve Block , m_handler(handler) 402bde8e466a4451c7319e3a072d118917957d6554Steve Block , m_capture(capture) 412bde8e466a4451c7319e3a072d118917957d6554Steve Block , m_userData(userData) 4228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{ 432bde8e466a4451c7319e3a072d118917957d6554Steve Block ASSERT(m_coreTarget); 4428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu g_object_weak_ref(object, reinterpret_cast<GWeakNotify>(GObjectEventListener::gobjectDestroyedCallback), this); 4528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} 4628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 4728040489d744e0c5d475a88663056c9040ed5320Teng-Hui ZhuGObjectEventListener::~GObjectEventListener() 4828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{ 492bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!m_coreTarget) 5028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return; 5128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu g_object_weak_unref(m_object, reinterpret_cast<GWeakNotify>(GObjectEventListener::gobjectDestroyedCallback), this); 5228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} 5328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 5428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid GObjectEventListener::gobjectDestroyed() 5528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{ 562bde8e466a4451c7319e3a072d118917957d6554Steve Block ASSERT(m_coreTarget); 5728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 582bde8e466a4451c7319e3a072d118917957d6554Steve Block // We must set m_coreTarget to null, because removeEventListener 592bde8e466a4451c7319e3a072d118917957d6554Steve Block // may call the destructor as a side effect and we must be in the 602bde8e466a4451c7319e3a072d118917957d6554Steve Block // proper state to prevent g_object_weak_unref. 612bde8e466a4451c7319e3a072d118917957d6554Steve Block EventTarget* target = m_coreTarget; 622bde8e466a4451c7319e3a072d118917957d6554Steve Block m_coreTarget = 0; 632bde8e466a4451c7319e3a072d118917957d6554Steve Block target->removeEventListener(m_domEventName.data(), this, m_capture); 6428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} 6528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 665af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkevoid GObjectEventListener::handleEvent(ScriptExecutionContext*, Event* event) 675af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{ 68f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick WebKitDOMEvent* gobjectEvent = WEBKIT_DOM_EVENT(WebKit::kit(event)); 692bde8e466a4451c7319e3a072d118917957d6554Steve Block reinterpret_cast<GObjectEventListenerCallback>(m_handler)(m_object, gobjectEvent, m_userData); 704576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang g_object_unref(gobjectEvent); 715af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke} 725af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 735af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkebool GObjectEventListener::operator==(const EventListener& listener) 745af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke{ 755af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (const GObjectEventListener* gobjectEventListener = GObjectEventListener::cast(&listener)) 762bde8e466a4451c7319e3a072d118917957d6554Steve Block return m_object == gobjectEventListener->m_object && m_handler == gobjectEventListener->m_handler; 775af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 785af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke return false; 795af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke} 805af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke 815af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke} 82