diff options
author | asargent@chromium.org <asargent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-13 22:52:44 +0000 |
---|---|---|
committer | asargent@chromium.org <asargent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-13 22:52:44 +0000 |
commit | de1e870b9e8039ec1a13c646c107a3c979a88fc1 (patch) | |
tree | 0d5cd860d806554b45c245118be7ed345b71513f /webkit/port | |
parent | 8148f5135b76e2a496f38a022671e161c5e964f7 (diff) | |
download | chromium_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.cpp | 13 |
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); + } } |