Reviewed by Dave Hyatt.
authorthatcher <thatcher@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 1 Nov 2005 18:36:29 +0000 (18:36 +0000)
committerthatcher <thatcher@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 1 Nov 2005 18:36:29 +0000 (18:36 +0000)
        Commited by Tim Hatcher.

        Fixes http://bugzilla.opendarwin.org/show_bug.cgi?id=5256
        Relayout during load causes duplicate plugin part.

        This was a problem with <OBJECT>s that contain an <EMBED>, if
        layout happened in the middle of the OBJECT but before the EMBED.

        No test case added, requires manual testing.

        * khtml/html/html_objectimpl.cpp:
        (DOM::HTMLObjectElementImpl::HTMLObjectElementImpl):
        (DOM::HTMLObjectElementImpl::closeRenderer):
        (DOM::HTMLObjectElementImpl::setComplete):
        * khtml/html/html_objectimpl.h:
        (DOM::HTMLObjectElementImpl::isComplete):
        * khtml/html/htmlfactory.cpp:
        (DOM::objectConstructor):
        * khtml/rendering/render_frames.cpp:
        (RenderPartObject::updateWidget):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@11017 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog-2005-12-19
WebCore/khtml/html/html_objectimpl.cpp
WebCore/khtml/html/html_objectimpl.h
WebCore/khtml/html/htmlfactory.cpp
WebCore/khtml/rendering/render_frames.cpp

index 4473be85a48510d3fe955a0cb8856b6217f77c4f..c9f9fc647678bd9b7ededa5d019ceec67e35ea2b 100644 (file)
@@ -1,3 +1,27 @@
+2005-11-01  Mitz Pettel  <opendarwin.org@mitzpettel.com>
+
+        Reviewed by Dave Hyatt.
+        Commited by Tim Hatcher.
+
+        Fixes http://bugzilla.opendarwin.org/show_bug.cgi?id=5256
+        Relayout during load causes duplicate plugin part.
+
+        This was a problem with <OBJECT>s that contain an <EMBED>, if 
+        layout happened in the middle of the OBJECT but before the EMBED.
+
+        No test case added, requires manual testing. 
+
+        * khtml/html/html_objectimpl.cpp:
+        (DOM::HTMLObjectElementImpl::HTMLObjectElementImpl):
+        (DOM::HTMLObjectElementImpl::closeRenderer):
+        (DOM::HTMLObjectElementImpl::setComplete):
+        * khtml/html/html_objectimpl.h:
+        (DOM::HTMLObjectElementImpl::isComplete):
+        * khtml/html/htmlfactory.cpp:
+        (DOM::objectConstructor):
+        * khtml/rendering/render_frames.cpp:
+        (RenderPartObject::updateWidget):
+
 2005-11-01  Alexey Proskuryakov  <ap@nypop.com>
 
         Reviewed by Dave Hyatt.
index ce525d919d19ed3235bd47aaebada77eaa642408..5de032f17ac88e8e5bbfa81b888ae6d1e216243e 100644 (file)
@@ -562,6 +562,7 @@ HTMLObjectElementImpl::HTMLObjectElementImpl(DocumentPtr *doc)
 {
     needWidgetUpdate = false;
     m_useFallbackContent = false;
+    m_complete = false;
     m_docNamedItem = true;
 }
 
@@ -764,6 +765,25 @@ void HTMLObjectElementImpl::attach()
     }
 }
 
+void HTMLObjectElementImpl::closeRenderer()
+{
+    // The parser just reached </object>.
+    setComplete(true);
+    
+    HTMLElementImpl::closeRenderer();
+}
+
+void HTMLObjectElementImpl::setComplete(bool complete)
+{
+    if (complete != m_complete) {
+        m_complete = complete;
+        if (complete && inDocument() && !m_useFallbackContent) {
+            needWidgetUpdate = true;
+            setChanged();
+        }
+    }
+}
+
 void HTMLObjectElementImpl::detach()
 {
     if (attached() && m_render && !m_useFallbackContent) {
index ff9df2328d1583ac25a55ed26ea93dad25a251c3..482e2b27fd538e71f0752b18c5e84303d7435b78 100644 (file)
@@ -170,6 +170,7 @@ public:
     virtual void attach();
     virtual bool rendererIsNeeded(khtml::RenderStyle *);
     virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
+    virtual void closeRenderer();
     virtual void detach();
     virtual void insertedIntoDocument();
     virtual void removedFromDocument();
@@ -236,6 +237,9 @@ public:
     DOMString width() const;
     void setWidth(const DOMString &);
 
+    bool isComplete() const { return m_complete; }
+    void setComplete(bool complete);
+    
     bool isDocNamedItem() const { return m_docNamedItem; }
 #if APPLE_CHANGES
     KJS::Bindings::Instance *getObjectInstance() const;
@@ -255,6 +259,7 @@ private:
 #if APPLE_CHANGES
     mutable KJS::Bindings::Instance *objectInstance;
 #endif
+    bool m_complete;
     bool m_docNamedItem;
 };
 
index 311e53c4fe436d3875b9a46ffcc8cae708128f36..069177a829e87e6587cb2739543490967214eb79 100644 (file)
@@ -269,7 +269,9 @@ HTMLElementImpl* embedConstructor(const AtomicString& tagName, DocumentPtr* docP
 
 HTMLElementImpl* objectConstructor(const AtomicString& tagName, DocumentPtr* docPtr, HTMLFormElementImpl* form, bool createdByParser)
 {
-    return new HTMLObjectElementImpl(docPtr);
+    HTMLObjectElementImpl * object = new HTMLObjectElementImpl(docPtr);
+    object->setComplete(!createdByParser);
+    return object;
 }
 
 HTMLElementImpl* paramConstructor(const AtomicString& tagName, DocumentPtr* docPtr, HTMLFormElementImpl* form, bool createdByParser)
index 635a48cbef832b63ac89528f1addb9a371514e44..e4acfb787b1aff5d073886ba81a0d46048ad25b1 100644 (file)
@@ -781,6 +781,8 @@ void RenderPartObject::updateWidget()
 
       HTMLObjectElementImpl *o = static_cast<HTMLObjectElementImpl *>(element());
 
+      if (!o->isComplete())
+        return;
       // Check for a child EMBED tag.
       HTMLEmbedElementImpl *embed = 0;
       for (NodeImpl *child = o->firstChild(); child; ) {