Reviewed by Hyatt
authorkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 22 Sep 2004 22:17:28 +0000 (22:17 +0000)
committerkocienda <kocienda@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 22 Sep 2004 22:17:28 +0000 (22:17 +0000)
        * khtml/css/css_computedstyle.cpp:
        (DOM::CSSComputedStyleDeclarationImpl::getPropertyCSSValue): New overloaded
version of this function, one that takes a flag to determine whether to
perform a document updateLayout() call before querying the style system.
        * khtml/css/css_computedstyle.h:
        (DOM::EUpdateLayout): Give a symbolic constant to true/false for the
purpose of the new call to getPropertyCSSValue.
        * khtml/editing/htmlediting_impl.cpp:
        (khtml::StyleChange::currentlyHasStyle): Pass DoNotUpdateLayout to call to
getPropertyCSSValue.
        (khtml::CompositeEditCommandImpl::applyTypingStyle): Add in top-level calls
to updateLayout before doing style changes that now do not update styles
themselves.
        (khtml::ApplyStyleCommandImpl::doApply): Ditto.
        (khtml::ApplyStyleCommandImpl::removeCSSStyle): Pass DoNotUpdateLayout to call to
        getPropertyCSSValue.
        (khtml::DeleteSelectionCommandImpl::computeTypingStyle): Remove this dead code.
        * khtml/editing/htmlediting_impl.h: Ditto.

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

WebCore/ChangeLog-2005-08-23
WebCore/khtml/css/css_computedstyle.cpp
WebCore/khtml/css/css_computedstyle.h
WebCore/khtml/editing/htmlediting_impl.cpp
WebCore/khtml/editing/htmlediting_impl.h

index 424dcc4942945fb295c14866fc71cbd9d001060f..abdf07718423b8fd6614d8ac9fe5ebb036aab6b6 100644 (file)
@@ -1,3 +1,26 @@
+2004-09-22  Ken Kocienda  <kocienda@apple.com>
+
+        Reviewed by Hyatt
+
+        * khtml/css/css_computedstyle.cpp:
+        (DOM::CSSComputedStyleDeclarationImpl::getPropertyCSSValue): New overloaded 
+       version of this function, one that takes a flag to determine whether to
+       perform a document updateLayout() call before querying the style system.
+        * khtml/css/css_computedstyle.h:
+        (DOM::EUpdateLayout): Give a symbolic constant to true/false for the 
+       purpose of the new call to getPropertyCSSValue.
+        * khtml/editing/htmlediting_impl.cpp:
+        (khtml::StyleChange::currentlyHasStyle): Pass DoNotUpdateLayout to call to
+       getPropertyCSSValue.
+        (khtml::CompositeEditCommandImpl::applyTypingStyle): Add in top-level calls
+       to updateLayout before doing style changes that now do not update styles
+       themselves.
+        (khtml::ApplyStyleCommandImpl::doApply): Ditto.
+        (khtml::ApplyStyleCommandImpl::removeCSSStyle): Pass DoNotUpdateLayout to call to
+        getPropertyCSSValue.
+        (khtml::DeleteSelectionCommandImpl::computeTypingStyle): Remove this dead code.
+        * khtml/editing/htmlediting_impl.h: Ditto.
+
 2004-09-22  Ken Kocienda  <kocienda@apple.com>
 
         Reviewed by Darin
index 36b8468a51d78ab3613c5e08e468750b83f52fc6..39f6ed359cf8d7576c5da048c755c37b7df9c3bd 100644 (file)
@@ -212,10 +212,15 @@ static QString numberAsString(double n)
 }
 
 CSSValueImpl *CSSComputedStyleDeclarationImpl::getPropertyCSSValue(int propertyID) const
+{
+    return getPropertyCSSValue(propertyID, UpdateLayout);
+}
+
+CSSValueImpl *CSSComputedStyleDeclarationImpl::getPropertyCSSValue(int propertyID, bool updateLayout) const
 {
     // Make sure our layout is up to date before we allow a query on these attributes.
     DocumentImpl* docimpl = node()->getDocument();
-    if (docimpl)
+    if (docimpl && updateLayout)
         docimpl->updateLayout();
 
     if (!m_renderer)
index d347b6e5c1cf80c62b3d7b404aaa053388d07b7e..31891328984693d9cffee4346899ea203906fa53 100644 (file)
@@ -37,6 +37,8 @@ class CSSValueImpl;
 class DOMString;
 class NodeImpl;
 
+enum EUpdateLayout { DoNotUpdateLayout = false, UpdateLayout = true };
+
 class CSSComputedStyleDeclarationImpl : public CSSStyleDeclarationImpl
 {
 public:
@@ -47,6 +49,7 @@ public:
     virtual void setCssText(const DOMString &);
 
     virtual CSSValueImpl *getPropertyCSSValue(int propertyID) const;
+    CSSValueImpl *getPropertyCSSValue(int propertyID, bool updateLayout) const;
     virtual DOMString getPropertyValue(int propertyID) const;
     virtual bool getPropertyPriority(int propertyID) const;
 
index ffe342030fad2362628f4995951bc3cf5bba9b97..0e00497349854e206747273351628d3564edefea 100644 (file)
@@ -68,6 +68,7 @@ using DOM::DocumentFragmentImpl;
 using DOM::DocumentImpl;
 using DOM::DOMString;
 using DOM::DOMStringImpl;
+using DOM::DoNotUpdateLayout;
 using DOM::EditingTextImpl;
 using DOM::ElementImpl;
 using DOM::HTMLElementImpl;
@@ -220,7 +221,7 @@ bool StyleChange::currentlyHasStyle(const Position &pos, const CSSProperty *prop
     CSSComputedStyleDeclarationImpl *style = pos.computedStyle();
     ASSERT(style);
     style->ref();
-    CSSValueImpl *value = style->getPropertyCSSValue(property->id());
+    CSSValueImpl *value = style->getPropertyCSSValue(property->id(), DoNotUpdateLayout);
     style->deref();
     return value && strcasecmp(value->cssText(), property->value()->cssText()) == 0;
 }
@@ -570,6 +571,12 @@ NodeImpl *CompositeEditCommandImpl::applyTypingStyle(NodeImpl *child) const
 
     // FIXME: Improve typing style.
     // See this bug: <rdar://problem/3769899> Implementation of typing style needs improvement
+
+    // update document layout once before running the rest of the function
+    // so that we avoid the expense of updating before each and every call
+    // to check a computed style
+    document()->updateLayout();
+
     StyleChange styleChange(document()->part()->typingStyle());
 
     NodeImpl *childToAppend = child;
@@ -719,6 +726,11 @@ void ApplyStyleCommandImpl::doApply()
     Position start(endingSelection().start().downstream(StayInBlock).equivalentRangeCompliantPosition());
     Position end(endingSelection().end().upstream(StayInBlock));
 
+    // update document layout once before removing styles
+    // so that we avoid the expense of updating before each and every call
+    // to check a computed style
+    document()->updateLayout();
+
     // Remove style from the selection.
     // Use the upstream position of the start for removing style.
     // This will ensure we remove all traces of the relevant styles from the selection
@@ -735,6 +747,10 @@ void ApplyStyleCommandImpl::doApply()
     start = endingSelection().start();
     end = endingSelection().end();
 
+    // update document layout once before running the rest of the function
+    // so that we avoid the expense of updating before each and every call
+    // to check a computed style
+    document()->updateLayout();
     
     if (start.node() == end.node()) {
         // simple case...start and end are the same node
@@ -808,7 +824,7 @@ void ApplyStyleCommandImpl::removeCSSStyle(HTMLElementImpl *elem)
 
     for (QPtrListIterator<CSSProperty> it(*(style()->values())); it.current(); ++it) {
         CSSProperty *property = it.current();
-        if (decl->getPropertyCSSValue(property->id()))
+        if (decl->getPropertyCSSValue(property->id()), DoNotUpdateLayout)
             removeCSSProperty(decl, property->id());
     }
 
@@ -994,51 +1010,6 @@ DeleteSelectionCommandImpl::DeleteSelectionCommandImpl(DocumentImpl *document, c
 {
 }
 
-CSSStyleDeclarationImpl *DeleteSelectionCommandImpl::computeTypingStyle(const Position &pos) const
-{
-    ElementImpl *element = pos.element();
-    if (!element)
-        return 0;
-
-    ElementImpl *shallowElement = pos.equivalentShallowPosition().element();
-    if (!shallowElement)
-        return 0;
-
-    ElementImpl *parent = Position(shallowElement->parentNode(), 0).element();
-    if (!parent)
-        return 0;
-
-    // Loop from the element up to the shallowElement, building up the
-    // style that this node has that its parent does not.
-    CSSStyleDeclarationImpl *result = document()->createCSSStyleDeclaration();
-    NodeImpl *node = element;
-    while (1) {
-        // check for an inline style declaration
-        if (node->isHTMLElement()) {
-            CSSStyleDeclarationImpl *s = static_cast<HTMLElementImpl *>(node)->inlineStyleDecl();
-            if (s)
-                result->merge(s, false);
-        }
-        // check if this is a bold tag
-        if (node->id() == ID_B) {
-            CSSValueImpl *boldValue = result->getPropertyCSSValue(CSS_PROP_FONT_WEIGHT);
-            if (!boldValue)
-                result->setProperty(CSS_PROP_FONT_WEIGHT, "bold");
-        }
-        // check if this is an italic tag
-        if (node->id() == ID_I) {
-            CSSValueImpl *italicValue = result->getPropertyCSSValue(CSS_PROP_FONT_STYLE);
-            if (!italicValue)
-                result->setProperty(CSS_PROP_FONT_STYLE, "italic");
-        }
-        if (node == shallowElement)
-            break;
-        node = node->parentNode();
-    }
-
-    return result;
-}
-
 // This function moves nodes in the block containing startNode to dstBlock, starting
 // from startNode and proceeding to the end of the block. Nodes in the block containing
 // startNode that appear in document order before startNode are not moved.
index f992cd02dc36d69da477dc5291632b89915dfad2..f40c87d7236bf4c157796f719bafaa770d56b80e 100644 (file)
@@ -242,7 +242,6 @@ private:
 
     void deleteDownstreamWS(const DOM::Position &start);
     bool containsOnlyWhitespace(const DOM::Position &start, const DOM::Position &end);
-    DOM::CSSStyleDeclarationImpl *computeTypingStyle(const DOM::Position &pos) const;
     void moveNodesAfterNode(DOM::NodeImpl *startNode, DOM::NodeImpl *dstNode);
 
     DOM::Selection m_selectionToDelete;