[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