[SCM] WebKit Debian packaging branch, debian/unstable, updated. debian/1.1.15-1-40151-g37bb677
mjs
mjs at 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Sat Sep 26 07:15:18 UTC 2009
The following commit has been merged in the debian/unstable branch:
commit 4d93d49551a42d7d4b94e391bbb80219c72cbac4
Author: mjs <mjs at 268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Mon Dec 16 03:05:40 2002 +0000
Reviewed by Darin.
- fixed 3128383 - DOM nodes should always use the same JS object
* khtml/ecma/kjs_binding.h:
* khtml/ecma/kjs_binding.cpp:
(ScriptInterpreter::ScriptInterpreter): Set auto-delete to true on
document dictionary.
(ScriptInterpreter::getDOMObjectForDocument): New function - gets
DOM object from per-document dictionary.
(ScriptInterpreter::putDOMObjectForDocument): New function - put
DOM object into per-document dictionary.
(ScriptInterpreter::deleteDOMObjectsForDocument): Clear all
objects from specific per-document dictionary.
(ScriptInterpreter::mark): Mark per-document objects.
(ScriptInterpreter::forgetDOMObjectsForDocument): Clear objects
for this document from all interpreters.
* khtml/ecma/kjs_dom.h:
* khtml/ecma/kjs_dom.cpp:
(KJS::getDOMNode): Use per-document rather than general DOM object
dictionary.
* khtml/xml/dom_docimpl.cpp:
(DocumentImpl::~DocumentImpl): Call forgetDOMObjectsForDocument.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@3070 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/ChangeLog-2003-10-25 b/WebCore/ChangeLog-2003-10-25
index db37fd1..baab217 100644
--- a/WebCore/ChangeLog-2003-10-25
+++ b/WebCore/ChangeLog-2003-10-25
@@ -1,3 +1,29 @@
+2002-12-15 Maciej Stachowiak <mjs at apple.com>
+
+ Reviewed by Darin.
+
+ - fixed 3128383 - DOM nodes should always use the same JS object
+
+ * khtml/ecma/kjs_binding.h:
+ * khtml/ecma/kjs_binding.cpp:
+ (ScriptInterpreter::ScriptInterpreter): Set auto-delete to true on
+ document dictionary.
+ (ScriptInterpreter::getDOMObjectForDocument): New function - gets
+ DOM object from per-document dictionary.
+ (ScriptInterpreter::putDOMObjectForDocument): New function - put
+ DOM object into per-document dictionary.
+ (ScriptInterpreter::deleteDOMObjectsForDocument): Clear all
+ objects from specific per-document dictionary.
+ (ScriptInterpreter::mark): Mark per-document objects.
+ (ScriptInterpreter::forgetDOMObjectsForDocument): Clear objects
+ for this document from all interpreters.
+ * khtml/ecma/kjs_dom.h:
+ * khtml/ecma/kjs_dom.cpp:
+ (KJS::getDOMNode): Use per-document rather than general DOM object
+ dictionary.
+ * khtml/xml/dom_docimpl.cpp:
+ (DocumentImpl::~DocumentImpl): Call forgetDOMObjectsForDocument.
+
2002-12-15 David Hyatt <hyatt at apple.com>
Fix for 3057974 and 3128713. I needed to make frames check to
@@ -11,6 +37,7 @@
2002-12-15 David Hyatt <hyatt at apple.com>
+>>>>>>> 1.1128
Fix for 3109226, epinions page is mostly blank. Add a hack
to disallow > but only inside attribute values for which there
is no corresponding attribute name.
diff --git a/WebCore/ChangeLog-2005-08-23 b/WebCore/ChangeLog-2005-08-23
index db37fd1..baab217 100644
--- a/WebCore/ChangeLog-2005-08-23
+++ b/WebCore/ChangeLog-2005-08-23
@@ -1,3 +1,29 @@
+2002-12-15 Maciej Stachowiak <mjs at apple.com>
+
+ Reviewed by Darin.
+
+ - fixed 3128383 - DOM nodes should always use the same JS object
+
+ * khtml/ecma/kjs_binding.h:
+ * khtml/ecma/kjs_binding.cpp:
+ (ScriptInterpreter::ScriptInterpreter): Set auto-delete to true on
+ document dictionary.
+ (ScriptInterpreter::getDOMObjectForDocument): New function - gets
+ DOM object from per-document dictionary.
+ (ScriptInterpreter::putDOMObjectForDocument): New function - put
+ DOM object into per-document dictionary.
+ (ScriptInterpreter::deleteDOMObjectsForDocument): Clear all
+ objects from specific per-document dictionary.
+ (ScriptInterpreter::mark): Mark per-document objects.
+ (ScriptInterpreter::forgetDOMObjectsForDocument): Clear objects
+ for this document from all interpreters.
+ * khtml/ecma/kjs_dom.h:
+ * khtml/ecma/kjs_dom.cpp:
+ (KJS::getDOMNode): Use per-document rather than general DOM object
+ dictionary.
+ * khtml/xml/dom_docimpl.cpp:
+ (DocumentImpl::~DocumentImpl): Call forgetDOMObjectsForDocument.
+
2002-12-15 David Hyatt <hyatt at apple.com>
Fix for 3057974 and 3128713. I needed to make frames check to
@@ -11,6 +37,7 @@
2002-12-15 David Hyatt <hyatt at apple.com>
+>>>>>>> 1.1128
Fix for 3109226, epinions page is mostly blank. Add a hack
to disallow > but only inside attribute values for which there
is no corresponding attribute name.
diff --git a/WebCore/khtml/ecma/kjs_binding.cpp b/WebCore/khtml/ecma/kjs_binding.cpp
index ba68fc1..5dd84ba 100644
--- a/WebCore/khtml/ecma/kjs_binding.cpp
+++ b/WebCore/khtml/ecma/kjs_binding.cpp
@@ -141,6 +141,7 @@ ScriptInterpreter::ScriptInterpreter( const Object &global, KHTMLPart* part )
#ifdef KJS_VERBOSE
kdDebug(6070) << "ScriptInterpreter::ScriptInterpreter " << this << " for part=" << m_part << endl;
#endif
+ m_domObjectsPerDocument.setAutoDelete(true);
}
ScriptInterpreter::~ScriptInterpreter()
@@ -163,6 +164,65 @@ void ScriptInterpreter::forgetDOMObject( void* objectHandle )
}
}
+DOMObject* ScriptInterpreter::getDOMObjectForDocument( void* documentHandle, void *objectHandle ) const
+{
+ QPtrDict<DOMObject> *documentDict = (QPtrDict<DOMObject> *)m_domObjectsPerDocument[documentHandle];
+ if (documentDict) {
+ return (*documentDict)[objectHandle];
+ }
+
+ return NULL;
+}
+
+void ScriptInterpreter::putDOMObjectForDocument( void* documentHandle, void *objectHandle, DOMObject *obj )
+{
+ QPtrDict<DOMObject> *documentDict = (QPtrDict<DOMObject> *)m_domObjectsPerDocument[documentHandle];
+ if (!documentDict) {
+ documentDict = new QPtrDict<DOMObject>();
+ m_domObjectsPerDocument.insert(documentHandle, documentDict);
+ }
+
+ documentDict->insert( objectHandle, obj );
+}
+
+bool ScriptInterpreter::deleteDOMObjectsForDocument( void* documentHandle )
+{
+ return m_domObjectsPerDocument.remove( documentHandle );
+}
+
+void ScriptInterpreter::mark()
+{
+ QPtrDictIterator<QPtrDict<DOMObject> > dictIterator(m_domObjectsPerDocument);
+
+ QPtrDict<DOMObject> *objectDict;
+ while ((objectDict = dictIterator.current())) {
+ QPtrDictIterator<DOMObject> objectIterator(*objectDict);
+
+ DOMObject *obj;
+ while ((obj = objectIterator.current())) {
+ if (!obj->marked()) {
+ obj->mark();
+ }
+ ++objectIterator;
+ }
+ ++dictIterator;
+ }
+}
+
+void ScriptInterpreter::forgetDOMObjectsForDocument( void* documentHandle )
+{
+ InterpreterImp *first = InterpreterImp::firstInterpreter();
+ if (first) {
+ InterpreterImp *scr = first;
+ do {
+ if ( scr->interpreter()->rtti() == 1 )
+ static_cast<ScriptInterpreter *>(scr->interpreter())->deleteDOMObjectsForDocument( documentHandle );
+ scr = scr->nextInterpreter();
+ } while (scr != first);
+ }
+}
+
+
bool ScriptInterpreter::isWindowOpenAllowed() const
{
if ( m_evt )
diff --git a/WebCore/khtml/ecma/kjs_binding.h b/WebCore/khtml/ecma/kjs_binding.h
index 4ff0194..0e424c8 100644
--- a/WebCore/khtml/ecma/kjs_binding.h
+++ b/WebCore/khtml/ecma/kjs_binding.h
@@ -96,10 +96,16 @@ namespace KJS {
bool deleteDOMObject( void* objectHandle ) {
return m_domObjects.remove( objectHandle );
}
+
+ DOMObject* getDOMObjectForDocument( void* documentHandle, void *objectHandle ) const;
+ void putDOMObjectForDocument( void* documentHandle, void *objectHandle, DOMObject *obj );
+ bool deleteDOMObjectsForDocument( void* documentHandle );
+
/**
* Static method. Makes all interpreters forget about the object
*/
static void forgetDOMObject( void* objectHandle );
+ static void forgetDOMObjectsForDocument( void* documentHandle );
KHTMLPart* part() const { return m_part; }
@@ -116,9 +122,12 @@ namespace KJS {
*/
bool isWindowOpenAllowed() const;
+ virtual void mark();
private:
KHTMLPart* m_part;
QPtrDict<DOMObject> m_domObjects;
+ QPtrDict<QPtrDict<DOMObject> > m_domObjectsPerDocument;
+
DOM::Event *m_evt;
bool m_inlineCode;
bool m_timerCallback;
diff --git a/WebCore/khtml/ecma/kjs_dom.cpp b/WebCore/khtml/ecma/kjs_dom.cpp
index a4f41f5..a312190 100644
--- a/WebCore/khtml/ecma/kjs_dom.cpp
+++ b/WebCore/khtml/ecma/kjs_dom.cpp
@@ -76,11 +76,6 @@ DOMNode::DOMNode(const Object &proto, const DOM::Node &n)
{
}
-DOMNode::~DOMNode()
-{
- ScriptInterpreter::forgetDOMObject(node.handle());
-}
-
bool DOMNode::toBoolean(ExecState *) const
{
return !node.isNull();
@@ -1255,7 +1250,9 @@ Value KJS::getDOMNode(ExecState *exec, const DOM::Node &n)
if (n.isNull())
return Null();
ScriptInterpreter* interp = static_cast<ScriptInterpreter *>(exec->interpreter());
- if ((ret = interp->getDOMObject(n.handle())))
+ DOM::NodeImpl *doc = n.ownerDocument().handle();
+
+ if ((ret = interp->getDOMObjectForDocument(doc, n.handle())))
return Value(ret);
switch (n.nodeType()) {
@@ -1289,6 +1286,7 @@ Value KJS::getDOMNode(ExecState *exec, const DOM::Node &n)
ret = new HTMLDocument(exec, static_cast<DOM::HTMLDocument>(n));
else
ret = new DOMDocument(exec, static_cast<DOM::Document>(n));
+ doc = n.handle();
break;
case DOM::Node::DOCUMENT_TYPE_NODE:
ret = new DOMDocumentType(exec, static_cast<DOM::DocumentType>(n));
@@ -1302,7 +1300,8 @@ Value KJS::getDOMNode(ExecState *exec, const DOM::Node &n)
default:
ret = new DOMNode(exec, n);
}
- interp->putDOMObject(n.handle(),ret);
+
+ interp->putDOMObjectForDocument(doc, n.handle(), ret);
return Value(ret);
}
diff --git a/WebCore/khtml/ecma/kjs_dom.h b/WebCore/khtml/ecma/kjs_dom.h
index 3084c59..13ffeb7 100644
--- a/WebCore/khtml/ecma/kjs_dom.h
+++ b/WebCore/khtml/ecma/kjs_dom.h
@@ -36,7 +36,6 @@ namespace KJS {
DOMNode(ExecState *exec, const DOM::Node &n);
// Constructor for inherited classes
DOMNode(const Object &proto, const DOM::Node &n);
- ~DOMNode();
virtual bool toBoolean(ExecState *) const;
virtual Value tryGet(ExecState *exec, const Identifier &propertyName) const;
Value getValueProperty(ExecState *exec, int token) const;
diff --git a/WebCore/khtml/xml/dom_docimpl.cpp b/WebCore/khtml/xml/dom_docimpl.cpp
index 2f34e90..2a22e69 100644
--- a/WebCore/khtml/xml/dom_docimpl.cpp
+++ b/WebCore/khtml/xml/dom_docimpl.cpp
@@ -35,6 +35,7 @@
#include "misc/htmlhashes.h"
#include "misc/helper.h"
#include "ecma/kjs_proxy.h"
+#include "ecma/kjs_binding.h"
#include <qptrstack.h>
#include <qpaintdevicemetrics.h>
@@ -294,6 +295,8 @@ DocumentImpl::DocumentImpl(DOMImplementationImpl *_implementation, KHTMLView *v)
DocumentImpl::~DocumentImpl()
{
+ KJS::ScriptInterpreter::forgetDOMObjectsForDocument(this);
+
if (changedDocuments && m_docChanged)
changedDocuments->remove(this);
delete m_tokenizer;
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list