~ubuntu-branches/ubuntu/raring/qtwebkit-source/raring-proposed

« back to all changes in this revision

Viewing changes to Source/WebCore/bindings/gobject/GObjectEventListener.cpp

  • Committer: Package Import Robot
  • Author(s): Jonathan Riddell
  • Date: 2013-02-18 14:24:18 UTC
  • Revision ID: package-import@ubuntu.com-20130218142418-eon0jmjg3nj438uy
Tags: upstream-2.3
ImportĀ upstreamĀ versionĀ 2.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *  Copyright (C) 2010, 2011 Igalia S.L.
 
3
 *
 
4
 *  This library is free software; you can redistribute it and/or
 
5
 *  modify it under the terms of the GNU Lesser General Public
 
6
 *  License as published by the Free Software Foundation; either
 
7
 *  version 2 of the License, or (at your option) any later version.
 
8
 *
 
9
 *  This library is distributed in the hope that it will be useful,
 
10
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 
11
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
12
 *  Lesser General Public License for more details.
 
13
 *
 
14
 *  You should have received a copy of the GNU Lesser General Public
 
15
 *  License along with this library; if not, write to the Free Software
 
16
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
17
 */
 
18
 
 
19
#include "config.h"
 
20
#include "GObjectEventListener.h"
 
21
 
 
22
#include "Event.h"
 
23
#include "WebKitDOMEvent.h"
 
24
#include "WebKitDOMEventPrivate.h"
 
25
#include <glib-object.h>
 
26
#include <wtf/HashMap.h>
 
27
 
 
28
namespace WebCore {
 
29
 
 
30
typedef void (*GObjectEventListenerCallback)(GObject*, WebKitDOMEvent*, void*);
 
31
 
 
32
GObjectEventListener::GObjectEventListener(GObject* object, EventTarget* target, const char* domEventName, GCallback handler, bool capture, void* userData)
 
33
    : EventListener(GObjectEventListenerType)
 
34
    , m_object(object)
 
35
    , m_coreTarget(target)
 
36
    , m_domEventName(domEventName)
 
37
    , m_handler(handler)
 
38
    , m_capture(capture)
 
39
    , m_userData(userData)
 
40
{
 
41
    ASSERT(m_coreTarget);
 
42
    g_object_weak_ref(object, reinterpret_cast<GWeakNotify>(GObjectEventListener::gobjectDestroyedCallback), this);
 
43
}
 
44
 
 
45
GObjectEventListener::~GObjectEventListener()
 
46
{
 
47
    if (!m_coreTarget)
 
48
        return;
 
49
    g_object_weak_unref(m_object, reinterpret_cast<GWeakNotify>(GObjectEventListener::gobjectDestroyedCallback), this);
 
50
}
 
51
 
 
52
void GObjectEventListener::gobjectDestroyed()
 
53
{
 
54
    ASSERT(m_coreTarget);
 
55
 
 
56
    // We must set m_coreTarget to null, because removeEventListener
 
57
    // may call the destructor as a side effect and we must be in the
 
58
    // proper state to prevent g_object_weak_unref.
 
59
    EventTarget* target = m_coreTarget;
 
60
    m_coreTarget = 0;
 
61
    target->removeEventListener(m_domEventName.data(), this, m_capture);
 
62
}
 
63
 
 
64
void GObjectEventListener::handleEvent(ScriptExecutionContext*, Event* event)
 
65
{
 
66
    WebKitDOMEvent* gobjectEvent = WEBKIT_DOM_EVENT(WebKit::kit(event));
 
67
    reinterpret_cast<GObjectEventListenerCallback>(m_handler)(m_object, gobjectEvent, m_userData);
 
68
    g_object_unref(gobjectEvent);
 
69
}
 
70
 
 
71
bool GObjectEventListener::operator==(const EventListener& listener)
 
72
{
 
73
    if (const GObjectEventListener* gobjectEventListener = GObjectEventListener::cast(&listener))
 
74
        return m_object == gobjectEventListener->m_object && m_handler == gobjectEventListener->m_handler;
 
75
 
 
76
    return false;
 
77
}
 
78
 
 
79
}