summaryrefslogtreecommitdiffstats
path: root/webkit/port
diff options
context:
space:
mode:
authorasargent@chromium.org <asargent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-13 22:52:44 +0000
committerasargent@chromium.org <asargent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-13 22:52:44 +0000
commitde1e870b9e8039ec1a13c646c107a3c979a88fc1 (patch)
tree0d5cd860d806554b45c245118be7ed345b71513f /webkit/port
parent8148f5135b76e2a496f38a022671e161c5e964f7 (diff)
downloadchromium_src-de1e870b9e8039ec1a13c646c107a3c979a88fc1.zip
chromium_src-de1e870b9e8039ec1a13c646c107a3c979a88fc1.tar.gz
chromium_src-de1e870b9e8039ec1a13c646c107a3c979a88fc1.tar.bz2
Fix problems in event listener teardown
The problem is sometimes the functions to remove event listeners get called outside of a ContextScope (even though we still have a valid context). BUG=9775 Review URL: http://codereview.chromium.org/66045 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@13622 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/port')
-rw-r--r--webkit/port/bindings/v8/v8_proxy.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/webkit/port/bindings/v8/v8_proxy.cpp b/webkit/port/bindings/v8/v8_proxy.cpp
index 723d32b..945b1c3 100644
--- a/webkit/port/bindings/v8/v8_proxy.cpp
+++ b/webkit/port/bindings/v8/v8_proxy.cpp
@@ -924,12 +924,16 @@ static void RemoveEventListenerFromList(V8EventListenerList& list,
void V8Proxy::RemoveV8EventListener(V8EventListener* listener)
{
+ ASSERT(!m_context.IsEmpty());
+ v8::Context::Scope contextScope(m_context);
RemoveEventListenerFromList(m_event_listeners, listener);
}
void V8Proxy::RemoveObjectEventListener(V8ObjectEventListener* listener)
{
+ ASSERT(!m_context.IsEmpty());
+ v8::Context::Scope contextScope(m_context);
RemoveEventListenerFromList(m_xhr_listeners, listener);
}
@@ -947,8 +951,13 @@ static void DisconnectEventListenersInList(V8EventListenerList& list)
void V8Proxy::DisconnectEventListeners()
{
- DisconnectEventListenersInList(m_event_listeners);
- DisconnectEventListenersInList(m_xhr_listeners);
+ if (m_event_listeners.begin() != m_event_listeners.end() ||
+ m_xhr_listeners.begin() != m_xhr_listeners.end()) {
+ ASSERT(!m_context.IsEmpty());
+ v8::Context::Scope contextScope(m_context);
+ DisconnectEventListenersInList(m_event_listeners);
+ DisconnectEventListenersInList(m_xhr_listeners);
+ }
}