[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/KDE/3.5/kdelibs/khtml
From:       Maks Orlovich <maksim () kde ! org>
Date:       2007-03-15 19:32:35
Message-ID: 1173987155.228063.635.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 642894 by orlovich:

Implement support for textContent, which websites use 
heavily on their mozilla paths as it does not do innerText..



 M  +16 -0     dom/dom_node.cpp  
 M  +35 -1     dom/dom_node.h  
 M  +7 -0      ecma/kjs_dom.cpp  
 M  +1 -1      ecma/kjs_dom.h  
 M  +16 -0     xml/dom_docimpl.cpp  
 M  +6 -0      xml/dom_docimpl.h  
 M  +15 -0     xml/dom_elementimpl.cpp  
 M  +4 -0      xml/dom_elementimpl.h  
 M  +31 -0     xml/dom_nodeimpl.cpp  
 M  +9 -0      xml/dom_nodeimpl.h  
 M  +10 -0     xml/dom_textimpl.cpp  
 M  +3 -0      xml/dom_textimpl.h  


--- branches/KDE/3.5/kdelibs/khtml/dom/dom_node.cpp #642893:642894
@@ -432,6 +432,22 @@
     return impl->getRect();
 }
 
+DOMString Node::textContent( ) const
+{
+    if(impl) return impl->textContent();
+    return DOMString();
+}
+
+void Node::setTextContent(const DOMString &content) const
+{
+    if (!impl) throw DOMException(DOMException::NOT_FOUND_ERR);
+
+    int exceptioncode = 0;
+    impl->setTextContent( content, exceptioncode );
+    if (exceptioncode)
+	throw DOMException(exceptioncode);
+}
+
 //-----------------------------------------------------------------------------
 
 NodeList::NodeList()
--- branches/KDE/3.5/kdelibs/khtml/dom/dom_node.h #642893:642894
@@ -21,10 +21,14 @@
  * This file includes excerpts from the Document Object Model (DOM)
  * Level 1 Specification (Recommendation)
  * http://www.w3.org/TR/REC-DOM-Level-1/
- * Copyright © World Wide Web Consortium , (Massachusetts Institute of
+ * Copyright  World Wide Web Consortium , (Massachusetts Institute of
  * Technology , Institut National de Recherche en Informatique et en
  * Automatique , Keio University ). All Rights Reserved.
  *
+ * This file includes excerpts from the Document Object Model (DOM)
+ * Level 3 Core Specification (Recommendation)
+ * http://www.w3.org/TR/DOM-Level-3-Core/
+ * Copyright  ©2004 W3C ® (MIT, ERCIM, Keio), All Rights Reserved.
  */
 #ifndef _DOM_Node_h_
 #define _DOM_Node_h_
@@ -751,6 +755,34 @@
     bool hasAttributes (  );
 
     /**
+     * Introduced in DOM Level 3
+     *
+     * This attribute returns the text content of this node and its descendants. 
+     * On getting, no serialization is performed, the returned string does not \
contain any markup. +     *
+     * @since 3.5.7
+     */
+    DOMString textContent( ) const;
+
+    /**
+     * Introduced in DOM Level 3
+     *
+     * @see textContent
+     *
+     * On setting, any possible children this node may have are removed and, if the \
new  +     * string is not empty or null, replaced by a single Text node containing \
the string this attribute is set to.  +     * No parsing is performed, the input \
string is taken as pure textual content. +     *
+     * @exception DOMException
+     * NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+     * Note: KHTML will also raise this if setContent is called on things
+     * that do not have child nodes.
+     *
+     * @since 3.5.7
+     */
+    void setTextContent(const DOMString &content) const;
+
+    /**
      * Introduced in DOM Level 2
      * This method is from the EventTarget interface
      *
@@ -836,6 +868,8 @@
      */
     bool dispatchEvent(const Event &evt);
 
+
+
     /**
      * @internal
      * not part of the DOM.
--- branches/KDE/3.5/kdelibs/khtml/ecma/kjs_dom.cpp #642893:642894
@@ -130,6 +130,8 @@
   prefix	DOMNode::Prefix		DontDelete
   localName	DOMNode::LocalName	DontDelete|ReadOnly
   ownerDocument	DOMNode::OwnerDocument	DontDelete|ReadOnly
+# DOM3
+  textContent	DOMNode::TextContent		DontDelete
 # Event handlers
 # IE also has: onactivate, onbefore*, oncontextmenu, oncontrolselect, oncut,
 # ondeactivate, ondrag*, ondrop, onfocusin, onfocusout, onhelp, onmousewheel,
@@ -250,6 +252,8 @@
     return getString(node.namespaceURI()); // Moz returns null if not set \
(dom/namespaces.html)  case Prefix:
     return getString(node.prefix());  // Moz returns null if not set \
(dom/namespaces.html) +  case TextContent:
+     return getString(node.textContent()); //DOM3 says return null, but I really \
should test mozilla..  case LocalName:
     return getString(node.localName());  // Moz returns null if not set \
(dom/namespaces.html)  case OwnerDocument:
@@ -392,6 +396,9 @@
   case Prefix:
     node.setPrefix(value.toString(exec).string());
     break;
+  case TextContent:
+    node.setTextContent(value.toString(exec).string());
+    break;
   case OnAbort:
     setListener(exec,DOM::EventImpl::ABORT_EVENT,value);
     break;
--- branches/KDE/3.5/kdelibs/khtml/ecma/kjs_dom.h #642893:642894
@@ -67,7 +67,7 @@
            OnResize, OnSelect, OnSubmit, OnUnload,
            OffsetLeft, OffsetTop, OffsetWidth, OffsetHeight, OffsetParent,
            ClientWidth, ClientHeight, ScrollLeft, ScrollTop,
-	   ScrollWidth, ScrollHeight, SourceIndex };
+	   ScrollWidth, ScrollHeight, SourceIndex, TextContent };
 
   protected:
     DOM::Node node;
--- branches/KDE/3.5/kdelibs/khtml/xml/dom_docimpl.cpp #642893:642894
@@ -763,6 +763,14 @@
     return Node::DOCUMENT_NODE;
 }
 
+DOMStringImpl* DocumentImpl::textContent() const
+{
+    return 0;
+}
+
+void DocumentImpl::setTextContent( const DOMString&, int& )
+{}
+
 ElementImpl *DocumentImpl::createHTMLElement( const DOMString &name )
 {
     uint id = khtml::getTagID( name.string().lower().latin1(), \
name.string().length() ); @@ -2855,6 +2863,14 @@
     return 0;
 }
 
+DOMStringImpl* DocumentTypeImpl::textContent() const
+{
+    return 0;
+}
+    
+void DocumentTypeImpl::setTextContent( const DOMString&, int& )
+{}
+
 NamedNodeMapImpl * DocumentTypeImpl::entities() const
 {
     if ( !m_entities ) {
--- branches/KDE/3.5/kdelibs/khtml/xml/dom_docimpl.h #642893:642894
@@ -219,6 +219,9 @@
     virtual DOMString nodeName() const;
     virtual unsigned short nodeType() const;
 
+    virtual DOMStringImpl* textContent() const;
+    virtual void           setTextContent( const DOMString &text, int& exceptioncode \
); +
     // Other methods (not part of DOM)
     virtual bool isDocumentNode() const { return true; }
     virtual bool isHTMLDocument() const { return false; }
@@ -733,6 +736,9 @@
     virtual bool childTypeAllowed( unsigned short type );
     virtual NodeImpl *cloneNode ( bool deep );
 
+    virtual DOMStringImpl* textContent() const;
+    virtual void           setTextContent( const DOMString &text, int& exceptioncode \
); +
     // Other methods (not part of DOM)
     void setName(const DOMString& n) { m_qualifiedName = n; }
     void setPublicId(const DOMString& publicId) { m_publicId = publicId; }
--- branches/KDE/3.5/kdelibs/khtml/xml/dom_elementimpl.cpp #642893:642894
@@ -249,6 +249,21 @@
     m_element = element;
 }
 
+// Strictly speaking, these two methods should not be needed, but
+// we can't fully deal with the mess that are DOM attributes right..
+DOMStringImpl* AttrImpl::textContent() const
+{
+    if (m_value)
+        return new DOMStringImpl(m_value->s, m_value->l);
+    else
+        return 0;
+}
+
+void AttrImpl::setTextContent( const DOMString &text, int& exceptioncode )
+{
+    setValue(text, exceptioncode);
+}
+
 // -------------------------------------------------------------------------
 
 void AttributeImpl::setValue(DOMStringImpl *value, ElementImpl *element)
--- branches/KDE/3.5/kdelibs/khtml/xml/dom_elementimpl.h #642893:642894
@@ -83,6 +83,10 @@
     virtual void setNodeValue( const DOMString &, int &exceptioncode );
     virtual NodeImpl *cloneNode ( bool deep );
 
+    virtual DOMStringImpl* textContent() const;
+    virtual void           setTextContent( const DOMString &text, int& exceptioncode \
); +
+
     // Other methods (not part of DOM)
     virtual bool isAttributeNode() const { return true; }
     virtual bool childAllowed( NodeImpl *newChild );
--- branches/KDE/3.5/kdelibs/khtml/xml/dom_nodeimpl.cpp #642893:642894
@@ -977,6 +977,21 @@
 //  return renderer() ? renderer()->maxOffset() : 1;
 }
 
+DOMStringImpl* NodeImpl::textContent() const
+{
+  QString out;
+  for (NodeImpl *child = firstChild(); child != 0; child = child->nextSibling()) {
+    short type = child->nodeType();
+    if (type != Node::COMMENT_NODE && type != Node::PROCESSING_INSTRUCTION_NODE) {
+      DOMStringImpl* kidText = child->textContent();
+      if (kidText)
+         out += QConstString(kidText->s, kidText->l).string();
+      delete kidText;
+    }
+  }
+  return new DOMStringImpl(out.unicode(), out.length());
+}
+
 //-------------------------------------------------------------------------
 
 NodeBaseImpl::~NodeBaseImpl()
@@ -1617,6 +1632,22 @@
     }
 }
 
+void NodeBaseImpl::setTextContent( const DOMString &text, int& exceptioncode )
+{
+    // NO_MODIFICATION_ALLOWED_ERR: Raised if this node is readonly.
+    if (isReadOnly()) {
+        exceptioncode = DOMException::NO_MODIFICATION_ALLOWED_ERR;
+        return;
+    }
+
+    removeChildren();
+
+    if ( !text.isEmpty() && !text.isNull() ) {
+       TextImpl *t = new TextImpl( docPtr(), text.implementation() );
+       appendChild( t, exceptioncode );
+    }
+}
+
 // ---------------------------------------------------------------------------
 NodeImpl *NodeListImpl::item( unsigned long index ) const
 {
--- branches/KDE/3.5/kdelibs/khtml/xml/dom_nodeimpl.h #642893:642894
@@ -172,6 +172,13 @@
     //                 qualified element name.
     virtual Id id() const { return 0; }
 
+    // These are the DOM 3 Core answer to innerText/setInnerText, and are used
+    // quite a bit since Mozilla doesn't do innerText. They do, however, behave \
slightly  +    // differently. The default implementation is for ELEMENT_NODE, \
ATTRIBUTE_NODE,  +    // ENTITY_NODE, ENTITY_REFERENCE_NODE, DOCUMENT_FRAGMENT_NODE. 
+    virtual DOMStringImpl* textContent() const;
+    virtual void           setTextContent( const DOMString &text, int& exceptioncode \
) = 0; +
     enum IdType {
         AttributeId,
         ElementId,
@@ -495,6 +502,8 @@
     virtual NodeImpl *appendChild ( NodeImpl *newChild, int &exceptioncode );
     virtual bool hasChildNodes (  ) const;
 
+    virtual void setTextContent( const DOMString &text, int& exceptioncode );
+
     // Other methods (not part of DOM)
     void removeChildren();
     void cloneChildNodes(NodeImpl *clone);
--- branches/KDE/3.5/kdelibs/khtml/xml/dom_textimpl.cpp #642893:642894
@@ -265,6 +265,16 @@
   return r->maxOffset();
 }
 
+DOMStringImpl* CharacterDataImpl::textContent() const
+{
+  return new DOMStringImpl(str->s, str->l);
+}
+
+void CharacterDataImpl::setTextContent( const DOMString &str, int& exceptioncode )
+{
+  setData(str, exceptioncode);
+}
+
 // ---------------------------------------------------------------------------
 
 DOMString CommentImpl::nodeName() const
--- branches/KDE/3.5/kdelibs/khtml/xml/dom_textimpl.h #642893:642894
@@ -60,6 +60,9 @@
     virtual DOMString nodeValue() const;
     virtual void setNodeValue( const DOMString &_nodeValue, int &exceptioncode );
 
+    virtual DOMStringImpl* textContent() const;
+    virtual void           setTextContent( const DOMString &text, int& exceptioncode \
); +
     // Other methods (not part of DOM)
 
     DOMStringImpl *string() const { return str; }


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic