Commit e85d1560 authored by ggaren@apple.com's avatar ggaren@apple.com

2009-04-14 Geoffrey Garen <ggaren@apple.com>

        Used svn merge -r42529:42528 to roll out my last patch because it broke
        the build.

        * bindings/js/JSDOMGlobalObject.cpp:
        (WebCore::JSDOMGlobalObject::~JSDOMGlobalObject):
        (WebCore::JSDOMGlobalObject::findJSProtectedEventListener):
        (WebCore::JSDOMGlobalObject::findOrCreateJSProtectedEventListener):
        (WebCore::JSDOMGlobalObject::jsProtectedEventListeners):
        (WebCore::JSDOMGlobalObject::jsProtectedInlineEventListeners):
        * bindings/js/JSDOMGlobalObject.h:



git-svn-id: svn://svn.chromium.org/blink/trunk@42531 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 47c69811
2009-04-14 Geoffrey Garen <ggaren@apple.com>
Used svn merge -r42529:42528 to roll out my last patch because it broke
the build.
* bindings/js/JSDOMGlobalObject.cpp:
(WebCore::JSDOMGlobalObject::~JSDOMGlobalObject):
(WebCore::JSDOMGlobalObject::findJSProtectedEventListener):
(WebCore::JSDOMGlobalObject::findOrCreateJSProtectedEventListener):
(WebCore::JSDOMGlobalObject::jsProtectedEventListeners):
(WebCore::JSDOMGlobalObject::jsProtectedInlineEventListeners):
* bindings/js/JSDOMGlobalObject.h:
2009-04-14 Geoffrey Garen <ggaren@apple.com> 2009-04-14 Geoffrey Garen <ggaren@apple.com>
Reviewed by Sam Weinig. Reviewed by Sam Weinig.
...@@ -52,6 +52,17 @@ JSDOMGlobalObject::JSDOMGlobalObject(PassRefPtr<Structure> structure, JSDOMGloba ...@@ -52,6 +52,17 @@ JSDOMGlobalObject::JSDOMGlobalObject(PassRefPtr<Structure> structure, JSDOMGloba
JSDOMGlobalObject::~JSDOMGlobalObject() JSDOMGlobalObject::~JSDOMGlobalObject()
{ {
// Clear any backpointers to the window
ProtectedListenersMap::iterator i1 = d()->jsProtectedEventListeners.begin();
ProtectedListenersMap::iterator e1 = d()->jsProtectedEventListeners.end();
for (; i1 != e1; ++i1)
i1->second->clearGlobalObject();
i1 = d()->jsProtectedInlineEventListeners.begin();
e1 = d()->jsProtectedInlineEventListeners.end();
for (; i1 != e1; ++i1)
i1->second->clearGlobalObject();
JSListenersMap::iterator i2 = d()->jsEventListeners.begin(); JSListenersMap::iterator i2 = d()->jsEventListeners.begin();
JSListenersMap::iterator e2 = d()->jsEventListeners.end(); JSListenersMap::iterator e2 = d()->jsEventListeners.end();
for (; i2 != e2; ++i2) for (; i2 != e2; ++i2)
...@@ -78,6 +89,27 @@ void JSDOMGlobalObject::mark() ...@@ -78,6 +89,27 @@ void JSDOMGlobalObject::mark()
} }
} }
JSProtectedEventListener* JSDOMGlobalObject::findJSProtectedEventListener(JSValuePtr val, bool isInline)
{
if (!val.isObject())
return 0;
JSObject* object = asObject(val);
ProtectedListenersMap& listeners = isInline ? d()->jsProtectedInlineEventListeners : d()->jsProtectedEventListeners;
return listeners.get(object);
}
PassRefPtr<JSProtectedEventListener> JSDOMGlobalObject::findOrCreateJSProtectedEventListener(JSValuePtr val, bool isInline)
{
if (JSProtectedEventListener* listener = findJSProtectedEventListener(val, isInline))
return listener;
if (!val.isObject())
return 0;
// The JSProtectedEventListener constructor adds it to our jsProtectedEventListeners map.
return JSProtectedEventListener::create(asObject(val), this, isInline).get();
}
JSEventListener* JSDOMGlobalObject::findJSEventListener(JSValuePtr val, bool isInline) JSEventListener* JSDOMGlobalObject::findJSEventListener(JSValuePtr val, bool isInline)
{ {
if (!val.isObject()) if (!val.isObject())
...@@ -99,6 +131,16 @@ PassRefPtr<JSEventListener> JSDOMGlobalObject::findOrCreateJSEventListener(JSVal ...@@ -99,6 +131,16 @@ PassRefPtr<JSEventListener> JSDOMGlobalObject::findOrCreateJSEventListener(JSVal
return JSEventListener::create(asObject(val), this, isInline).get(); return JSEventListener::create(asObject(val), this, isInline).get();
} }
JSDOMGlobalObject::ProtectedListenersMap& JSDOMGlobalObject::jsProtectedEventListeners()
{
return d()->jsProtectedEventListeners;
}
JSDOMGlobalObject::ProtectedListenersMap& JSDOMGlobalObject::jsProtectedInlineEventListeners()
{
return d()->jsProtectedInlineEventListeners;
}
JSDOMGlobalObject::JSListenersMap& JSDOMGlobalObject::jsEventListeners() JSDOMGlobalObject::JSListenersMap& JSDOMGlobalObject::jsEventListeners()
{ {
return d()->jsEventListeners; return d()->jsEventListeners;
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
namespace WebCore { namespace WebCore {
class Event; class Event;
class JSProtectedEventListener;
class JSEventListener; class JSEventListener;
class ScriptExecutionContext; class ScriptExecutionContext;
...@@ -52,14 +53,23 @@ namespace WebCore { ...@@ -52,14 +53,23 @@ namespace WebCore {
virtual ScriptExecutionContext* scriptExecutionContext() const = 0; virtual ScriptExecutionContext* scriptExecutionContext() const = 0;
// Finds a wrapper of a JS EventListener, returns 0 if no existing one.
JSProtectedEventListener* findJSProtectedEventListener(JSC::JSValuePtr, bool isInline = false);
// Finds or creates a wrapper of a JS EventListener. JS EventListener object is GC-protected.
PassRefPtr<JSProtectedEventListener> findOrCreateJSProtectedEventListener(JSC::JSValuePtr, bool isInline = false);
// Finds a wrapper of a GC-unprotected JS EventListener, returns 0 if no existing one. // Finds a wrapper of a GC-unprotected JS EventListener, returns 0 if no existing one.
JSEventListener* findJSEventListener(JSC::JSValuePtr, bool isInline = false); JSEventListener* findJSEventListener(JSC::JSValuePtr, bool isInline = false);
// Finds or creates a wrapper of a JS EventListener. JS EventListener object is *NOT* GC-protected. // Finds or creates a wrapper of a JS EventListener. JS EventListener object is *NOT* GC-protected.
PassRefPtr<JSEventListener> findOrCreateJSEventListener(JSC::JSValuePtr, bool isInline = false); PassRefPtr<JSEventListener> findOrCreateJSEventListener(JSC::JSValuePtr, bool isInline = false);
typedef HashMap<JSC::JSObject*, JSProtectedEventListener*> ProtectedListenersMap;
typedef HashMap<JSC::JSObject*, JSEventListener*> JSListenersMap; typedef HashMap<JSC::JSObject*, JSEventListener*> JSListenersMap;
ProtectedListenersMap& jsProtectedEventListeners();
ProtectedListenersMap& jsProtectedInlineEventListeners();
JSListenersMap& jsEventListeners(); JSListenersMap& jsEventListeners();
JSListenersMap& jsInlineEventListeners(); JSListenersMap& jsInlineEventListeners();
...@@ -75,6 +85,8 @@ namespace WebCore { ...@@ -75,6 +85,8 @@ namespace WebCore {
JSDOMStructureMap structures; JSDOMStructureMap structures;
JSDOMConstructorMap constructors; JSDOMConstructorMap constructors;
JSDOMGlobalObject::ProtectedListenersMap jsProtectedEventListeners;
JSDOMGlobalObject::ProtectedListenersMap jsProtectedInlineEventListeners;
JSDOMGlobalObject::JSListenersMap jsEventListeners; JSDOMGlobalObject::JSListenersMap jsEventListeners;
JSDOMGlobalObject::JSListenersMap jsInlineEventListeners; JSDOMGlobalObject::JSListenersMap jsInlineEventListeners;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment