Reviewed by Ken.
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 22 Sep 2004 00:41:01 +0000 (00:41 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 22 Sep 2004 00:41:01 +0000 (00:41 +0000)
        - fixed problem where our updateLayout call ignores pending stylesheets all the time

        * khtml/xml/dom_docimpl.h: Added updateLayoutIgnorePendingStylesheets.
        * khtml/xml/dom_docimpl.cpp:
        (DocumentImpl::updateLayout): Took out the "ignore pending stylesheets" business here.
        (DocumentImpl::updateLayoutIgnorePendingStylesheets): Put it in here.

        * khtml/ecma/kjs_dom.cpp: (DOMNode::getValueProperty): Call the new
        updateLayoutIgnorePendingStylesheets function.
        * khtml/ecma/kjs_html.cpp:
        (KJS::HTMLElement::getValueProperty): Ditto.
        (KJS::HTMLElement::putValue): Ditto.
        * khtml/ecma/kjs_views.cpp: (DOMAbstractViewFunc::tryCall): Ditto.
        * khtml/ecma/kjs_window.cpp:
        (Window::updateLayout): Ditto.
        (Selection::get): Ditto.
        (SelectionFunc::tryCall): Ditto.

        * khtml/html/html_imageimpl.h: Add ignorePendingStylesheets boolean parameter.
        * khtml/html/html_imageimpl.cpp:
        (HTMLImageElementImpl::width): Respect new parameter.
        (HTMLImageElementImpl::height): Ditto.

        - tweaks

        * kwq/WebCoreBridge.mm:
        (-[WebCoreBridge alterCurrentSelection:direction:granularity:]): Removed unneeded
        explicit "true" parameter to setSelection.
        (-[WebCoreBridge alterCurrentSelection:verticalDistance:]): Ditto.

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

WebCore/ChangeLog-2005-08-23
WebCore/khtml/ecma/kjs_dom.cpp
WebCore/khtml/ecma/kjs_html.cpp
WebCore/khtml/ecma/kjs_views.cpp
WebCore/khtml/ecma/kjs_window.cpp
WebCore/khtml/html/html_imageimpl.cpp
WebCore/khtml/html/html_imageimpl.h
WebCore/khtml/xml/dom_docimpl.cpp
WebCore/khtml/xml/dom_docimpl.h
WebCore/kwq/WebCoreBridge.mm

index 5e7d7c1350e21df2c06ca1ddc50fde7c356a2370..3474dbc41d7213e0659d2e5d943daa12ff15c74d 100644 (file)
@@ -1,3 +1,37 @@
+2004-09-21  Darin Adler  <darin@apple.com>
+
+        Reviewed by Ken.
+
+        - fixed problem where our updateLayout call ignores pending stylesheets all the time
+
+        * khtml/xml/dom_docimpl.h: Added updateLayoutIgnorePendingStylesheets.
+        * khtml/xml/dom_docimpl.cpp:
+        (DocumentImpl::updateLayout): Took out the "ignore pending stylesheets" business here.
+        (DocumentImpl::updateLayoutIgnorePendingStylesheets): Put it in here.
+
+        * khtml/ecma/kjs_dom.cpp: (DOMNode::getValueProperty): Call the new
+        updateLayoutIgnorePendingStylesheets function.
+        * khtml/ecma/kjs_html.cpp:
+        (KJS::HTMLElement::getValueProperty): Ditto.
+        (KJS::HTMLElement::putValue): Ditto.
+        * khtml/ecma/kjs_views.cpp: (DOMAbstractViewFunc::tryCall): Ditto.
+        * khtml/ecma/kjs_window.cpp:
+        (Window::updateLayout): Ditto.
+        (Selection::get): Ditto.
+        (SelectionFunc::tryCall): Ditto.
+
+        * khtml/html/html_imageimpl.h: Add ignorePendingStylesheets boolean parameter.
+        * khtml/html/html_imageimpl.cpp:
+        (HTMLImageElementImpl::width): Respect new parameter.
+        (HTMLImageElementImpl::height): Ditto.
+
+        - tweaks
+
+        * kwq/WebCoreBridge.mm:
+        (-[WebCoreBridge alterCurrentSelection:direction:granularity:]): Removed unneeded
+        explicit "true" parameter to setSelection.
+        (-[WebCoreBridge alterCurrentSelection:verticalDistance:]): Ditto.
+
 2004-09-21  Darin Adler  <darin@apple.com>
 
         Reviewed by Ken.
index b65e4d9ba5624c4b7426453135ac58fcd73ff172..ae5975dcb457895f35545f6e9fcd1afefcc8c702 100644 (file)
@@ -300,7 +300,7 @@ Value DOMNode::getValueProperty(ExecState *exec, int token) const
     // Make sure our layout is up to date before we allow a query on these attributes.
     DOM::DocumentImpl* docimpl = node.handle()->getDocument();
     if (docimpl) {
-      docimpl->updateLayout();
+      docimpl->updateLayoutIgnorePendingStylesheets();
     }
 
     khtml::RenderObject *rend = node.handle()->renderer();
index 2d77d7b489bedc5d8937d4c0a24addf46c547b6c..b2f4bd15cea4844d862e4fb492939b82ed011159 100644 (file)
@@ -1262,7 +1262,7 @@ Value KJS::HTMLElement::getValueProperty(ExecState *exec, int token) const
       // Update the document's layout before we compute these attributes.
       DOM::DocumentImpl* docimpl = node.handle()->getDocument();
       if (docimpl) {
-        docimpl->updateLayout();
+        docimpl->updateLayoutIgnorePendingStylesheets();
       }
       switch (token) {
         case BodyScrollLeft:
@@ -1571,8 +1571,14 @@ Value KJS::HTMLElement::getValueProperty(ExecState *exec, int token) const
     case AnchorShape:           return String(anchor.shape());
     case AnchorTabIndex:        return Number(anchor.tabIndex());
     case AnchorTarget:          return String(anchor.target());
-    case AnchorText:            return String(anchor.innerText());
     case AnchorType:            return String(anchor.type());
+    case AnchorText: {
+        DOM::DocumentImpl* docimpl = node.handle()->getDocument();
+        if (docimpl) {
+          docimpl->updateLayoutIgnorePendingStylesheets();
+        }
+      }
+      return String(anchor.innerText());
     }
   }
   break;
@@ -1583,14 +1589,14 @@ Value KJS::HTMLElement::getValueProperty(ExecState *exec, int token) const
     case ImageAlign:           return String(image.align());
     case ImageAlt:             return String(image.alt());
     case ImageBorder:          return Number(image.border());
-    case ImageHeight:          return Number(image.height());
+    case ImageHeight:          return Number(static_cast<DOM::HTMLImageElementImpl *>(image.handle())->height(true));
     case ImageHspace:          return Number(image.hspace());
     case ImageIsMap:           return Boolean(image.isMap());
     case ImageLongDesc:        return String(image.longDesc());
     case ImageSrc:             return String(image.src());
     case ImageUseMap:          return String(image.useMap());
     case ImageVspace:          return Number(image.vspace());
-    case ImageWidth:           return Number(image.width());
+    case ImageWidth:           return Number(static_cast<DOM::HTMLImageElementImpl *>(image.handle())->width(true));
     case ImageX:               return Number(image.x());
     case ImageY:               return Number(image.y());
     }
@@ -1857,6 +1863,12 @@ Value KJS::HTMLElement::getValueProperty(ExecState *exec, int token) const
   case ElementInnerHTML:
     return String(element.innerHTML());
   case ElementInnerText:
+    {
+      DOM::DocumentImpl* docimpl = node.handle()->getDocument();
+      if (docimpl) {
+        docimpl->updateLayoutIgnorePendingStylesheets();
+      }
+    }
     return String(element.innerText());
   case ElementOuterHTML:
     return String(element.outerHTML());
@@ -2327,7 +2339,7 @@ void KJS::HTMLElement::putValue(ExecState *exec, int token, const Value& value,
               // Update the document's layout before we compute these attributes.
               DOM::DocumentImpl* docimpl = body.handle()->getDocument();
               if (docimpl)
-                  docimpl->updateLayout();
+                  docimpl->updateLayoutIgnorePendingStylesheets();
               if (token == BodyScrollLeft)
                   sview->setContentsPos(value.toInt32(exec), sview->contentsY());
               else
index d88cbdca5dcd9e62fbaf216fe1c35ce33c722ea9..e1d8621c283d9f73bb5cf093590cbba01480b14d 100644 (file)
@@ -2,6 +2,7 @@
 /*
  *  This file is part of the KDE libraries
  *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
+ *  Copyright (C) 2004 Apple Computer, Inc.
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Lesser General Public
@@ -22,6 +23,8 @@
 #include "ecma/kjs_views.lut.h"
 #include "ecma/kjs_css.h"
 
+#include "xml/dom_docimpl.h"
+
 using namespace KJS;
 
 // -------------------------------------------------------------------------
@@ -63,9 +66,14 @@ Value DOMAbstractViewFunc::tryCall(ExecState *exec, Object &thisObj, const List
         DOM::Node arg0 = toNode(args[0]);
         if (arg0.nodeType() != DOM::Node::ELEMENT_NODE)
           return Undefined(); // throw exception?
-        else
+        else {
+          DOM::DocumentImpl* docimpl = arg0.handle()->getDocument();
+          if (docimpl) {
+            docimpl->updateLayoutIgnorePendingStylesheets();
+          }
           return getDOMCSSStyleDeclaration(exec,abstractView.getComputedStyle(static_cast<DOM::Element>(arg0),
                                                                               args[1].toString(exec).string()));
+        }
       }
   }
   return Undefined();
index de4563bda300b44afcee393c249317f8b0215216..0b5e5a2c1a1abd5902acafcf0877b4d3c471b6ba 100644 (file)
@@ -1709,7 +1709,7 @@ void Window::updateLayout() const
 {
   DOM::DocumentImpl* docimpl = static_cast<DOM::DocumentImpl *>(m_part->document().handle());
   if (docimpl) {
-    docimpl->updateLayout();
+    docimpl->updateLayoutIgnorePendingStylesheets();
   }
 }
 
@@ -2221,7 +2221,7 @@ Value Selection::get(ExecState *exec, const Identifier &p) const
 
   DocumentImpl *docimpl = m_part->xmlDocImpl();
   if (docimpl)
-    docimpl->updateLayout();
+    docimpl->updateLayoutIgnorePendingStylesheets();
 
   KURL url = m_part->url();
   const HashEntry *entry = Lookup::findEntry(&SelectionTable, p);
@@ -2303,7 +2303,7 @@ Value SelectionFunc::tryCall(ExecState *exec, Object &thisObj, const List &args)
     if (part) {
         DocumentImpl *docimpl = part->xmlDocImpl();
         if (docimpl)
-            docimpl->updateLayout();
+            docimpl->updateLayoutIgnorePendingStylesheets();
             
         switch (id) {
             case Selection::Collapse:
index 06fea1cf5b3a74754a25790202bd57f7b4eb8293..83a395c123870ec05e52dfc1924983d05057191f 100644 (file)
@@ -311,7 +311,7 @@ void HTMLImageElementImpl::detach()
     HTMLElementImpl::detach();
 }
 
-long HTMLImageElementImpl::width() const
+long HTMLImageElementImpl::width(bool ignorePendingStylesheets) const
 {
     if (!m_render) {
        // check the attribute first for an explicit pixel value
@@ -325,7 +325,10 @@ long HTMLImageElementImpl::width() const
 
     DOM::DocumentImpl* docimpl = getDocument();
     if (docimpl) {
-       docimpl->updateLayout();
+       if (ignorePendingStylesheets)
+            docimpl->updateLayoutIgnorePendingStylesheets();
+        else
+            docimpl->updateLayout();
     }
 
     if (!m_render) {
@@ -335,7 +338,7 @@ long HTMLImageElementImpl::width() const
     return m_render->contentWidth();
 }
 
-long HTMLImageElementImpl::height() const
+long HTMLImageElementImpl::height(bool ignorePendingStylesheets) const
 {
     if (!m_render) {
        // check the attribute first for an explicit pixel value
@@ -349,7 +352,10 @@ long HTMLImageElementImpl::height() const
 
     DOM::DocumentImpl* docimpl = getDocument();
     if (docimpl) {
-       docimpl->updateLayout();
+       if (ignorePendingStylesheets)
+            docimpl->updateLayoutIgnorePendingStylesheets();
+        else
+            docimpl->updateLayout();
     }
 
     if (!m_render) {
index 6171b24b895d0027ee693e1e0eb917c7e80166bf..5c17e8a8970dac7d0346600446e8cf526cd19350 100644 (file)
@@ -83,8 +83,8 @@ public:
     virtual khtml::RenderObject *createRenderer(RenderArena *, khtml::RenderStyle *);
     virtual void detach();
 
-    long width() const;
-    long height() const;
+    long width(bool ignorePendingStylesheets = false) const;
+    long height(bool ignorePendingStylesheets = false) const;
 
     bool isServerMap() const { return ( ismap && !usemap.length() );  }
     QImage currentImage() const;
index af3d1aeceab017a42ace5b240d6591519a47f864..3b4cd504170a250ef0f12d047444dddc844441ce 100644 (file)
@@ -1150,6 +1150,23 @@ void DocumentImpl::updateDocumentsRendering()
 }
 
 void DocumentImpl::updateLayout()
+{
+    // FIXME: Dave's pretty sure we can remove this because
+    // layout calls recalcStyle as needed.
+    updateRendering();
+
+    // Only do a layout if changes have occurred that make it necessary.      
+    if (m_view && renderer() && renderer()->needsLayout())
+       m_view->layout();
+}
+
+// FIXME: This is a bad idea and needs to be removed eventually.
+// Other browsers load stylesheets before they continue parsing the web page.
+// Since we don't, we can run JavaScript code that needs answers before the
+// stylesheets are loaded. Doing a layout ignoring the pending stylesheets
+// lets us get reasonable answers. The long term solution to this problem is
+// to instead suspend JavaScript execution.
+void DocumentImpl::updateLayoutIgnorePendingStylesheets()
 {
     bool oldIgnore = m_ignorePendingStylesheets;
     
@@ -1158,12 +1175,7 @@ void DocumentImpl::updateLayout()
        updateStyleSelector();    
     }
 
-    updateRendering();
-
-    // Only do a layout if changes have occurred that make it necessary.      
-    if (m_view && renderer() && renderer()->needsLayout()) {
-       m_view->layout();
-    }
+    updateLayout();
 
     m_ignorePendingStylesheets = oldIgnore;
 }
index 7f0aed99ea70045246664783c9ba67d2230dc870..396274ef0219d09c3f3c03c53dc424582fdd482f 100644 (file)
@@ -292,6 +292,7 @@ public:
     static QPtrList<DocumentImpl> * changedDocuments;
     virtual void updateRendering();
     void updateLayout();
+    void updateLayoutIgnorePendingStylesheets();
     static void updateDocumentsRendering();
     khtml::DocLoader *docLoader() { return m_docLoader; }
 
index 6f7f00ef367c51cc5cb62f2489bd5e42b3f0d0da..1ce1c5c33152bc13f0e112ef009e87d6254c4789 100644 (file)
@@ -1384,7 +1384,7 @@ static HTMLFormElementImpl *formElementFromDOMElement(DOMElement *element)
         xPos = _part->xPosForVerticalArrowNavigation();
     
     // setting the selection always clears saved vertical navigation x position
-    _part->setSelection(selection, true);
+    _part->setSelection(selection);
     
     // restore vertical navigation x position if necessary
     if (xPos != KHTMLPart::NoXPosForVerticalArrowNavigation)
@@ -1413,7 +1413,7 @@ static HTMLFormElementImpl *formElementFromDOMElement(DOMElement *element)
 
     // setting the selection always clears saved vertical navigation x position, so preserve it
     int xPos = _part->xPosForVerticalArrowNavigation();
-    _part->setSelection(selection, true);
+    _part->setSelection(selection);
     _part->setXPosForVerticalArrowNavigation(xPos);
 
     [self ensureCaretVisible];