Reviewed by Ken.
authordarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 20 May 2004 15:09:33 +0000 (15:09 +0000)
committerdarin <darin@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 20 May 2004 15:09:33 +0000 (15:09 +0000)
        - fixed <rdar://problem/3661918>: "repro nil-deref in RenderImage::paint (www.codepoetry.net)"

        * khtml/rendering/render_image.cpp: (RenderImage::paint): Check renderer pointer to see if it's
        nil before dereferencing it.

        - fixed <rdar://problem/3658455>: "readFromData:options:documentAttributes: crashes when passed page without a body (in WebKit mode)"

        * kwq/KWQKHTMLPart.mm: (KWQKHTMLPart::bodyBackgroundColor): Check renderer pointer to see if it's
        nil before dereferencing it.

        - fixed <rdar://problem/2948112>: "implement addRule for JavaScript for style sheets"

        * khtml/dom/css_stylesheet.h: Added addRule.
        * khtml/dom/css_stylesheet.cpp: (CSSStyleSheet::addRule): Added.
        * khtml/css/css_stylesheetimpl.h: Added addRule.
        * khtml/css/css_stylesheetimpl.cpp: (CSSStyleSheetImpl::addRule): Added an implementation
        based on the Microsoft documentation. An index of -1 means "at the end of the list".

        * khtml/dom/dom_string.h: Changed the string-append operator to be a non-member function
        so it works even if the left side has to undergo type conversion.
        * khtml/dom/dom_string.cpp: (DOM::operator+): Changed implementation to match above.
        Also changed to not use anything private or protected so it doesn't have to be a friend.

        * khtml/ecma/kjs_css.h: Added addRule to the list of functions for CSS style sheets.
        * khtml/ecma/kjs_css.cpp: (DOMCSSStyleSheetProtoFunc::tryCall): Add support for addRule,
        based on the Microsoft documentation; always returns -1. Also removed unused string conversions.
        * khtml/ecma/kjs_css.lut.h: Regenerated.

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

12 files changed:
WebCore/ChangeLog-2005-08-23
WebCore/khtml/css/css_stylesheetimpl.cpp
WebCore/khtml/css/css_stylesheetimpl.h
WebCore/khtml/dom/css_stylesheet.cpp
WebCore/khtml/dom/css_stylesheet.h
WebCore/khtml/dom/dom_string.cpp
WebCore/khtml/dom/dom_string.h
WebCore/khtml/ecma/kjs_css.cpp
WebCore/khtml/ecma/kjs_css.h
WebCore/khtml/ecma/kjs_css.lut.h
WebCore/khtml/rendering/render_image.cpp
WebCore/kwq/KWQKHTMLPart.mm

index 75b49a8d378fa8429b19fe68b3a2777d67129d5a..a84a338014dfbb247496a1d0a79c94a58b42788a 100644 (file)
@@ -1,3 +1,35 @@
+2004-05-20  Darin Adler  <darin@apple.com>
+
+        Reviewed by Ken.
+
+        - fixed <rdar://problem/3661918>: "repro nil-deref in RenderImage::paint (www.codepoetry.net)"
+
+        * khtml/rendering/render_image.cpp: (RenderImage::paint): Check renderer pointer to see if it's
+        nil before dereferencing it.
+
+        - fixed <rdar://problem/3658455>: "readFromData:options:documentAttributes: crashes when passed page without a body (in WebKit mode)"
+
+        * kwq/KWQKHTMLPart.mm: (KWQKHTMLPart::bodyBackgroundColor): Check renderer pointer to see if it's
+        nil before dereferencing it.
+
+        - fixed <rdar://problem/2948112>: "implement addRule for JavaScript for style sheets"
+
+        * khtml/dom/css_stylesheet.h: Added addRule.
+        * khtml/dom/css_stylesheet.cpp: (CSSStyleSheet::addRule): Added.
+        * khtml/css/css_stylesheetimpl.h: Added addRule.
+        * khtml/css/css_stylesheetimpl.cpp: (CSSStyleSheetImpl::addRule): Added an implementation
+        based on the Microsoft documentation. An index of -1 means "at the end of the list".
+
+        * khtml/dom/dom_string.h: Changed the string-append operator to be a non-member function
+        so it works even if the left side has to undergo type conversion.
+        * khtml/dom/dom_string.cpp: (DOM::operator+): Changed implementation to match above.
+        Also changed to not use anything private or protected so it doesn't have to be a friend.
+
+        * khtml/ecma/kjs_css.h: Added addRule to the list of functions for CSS style sheets.
+        * khtml/ecma/kjs_css.cpp: (DOMCSSStyleSheetProtoFunc::tryCall): Add support for addRule,
+        based on the Microsoft documentation; always returns -1. Also removed unused string conversions.
+        * khtml/ecma/kjs_css.lut.h: Regenerated.
+
 2004-05-19  David Hyatt  <hyatt@apple.com>
 
        Implement support for notification posting to accessibility clients for layouts and loads.
index 86e68ffc34672b22df16cbe451cf161184e045ec..1f683576c7c60c81424a43d8b26022251a265733 100644 (file)
@@ -2,6 +2,7 @@
  * This file is part of the DOM implementation for KDE.
  *
  * (C) 1999-2003 Lars Knoll (knoll@kde.org)
+ * 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 Library General Public
@@ -186,6 +187,13 @@ unsigned long CSSStyleSheetImpl::insertRule( const DOMString &rule, unsigned lon
     return index;
 }
 
+unsigned long CSSStyleSheetImpl::addRule( const DOMString &selector, const DOMString &style, long index, int &exceptioncode )
+{
+    if (index == -1)
+        index = m_lstChildren->count();
+    return insertRule(selector + " { " + style + " }", index, exceptioncode);
+}
+
 CSSRuleList CSSStyleSheetImpl::cssRules()
 {
     return this;
index e2d7b1c3e71a3718fb666764ff091eaadc9bbf9d..b98f1f3160e13112813f4edc326c660418d112ce 100644 (file)
@@ -2,6 +2,7 @@
  * This file is part of the DOM implementation for KDE.
  *
  * (C) 1999-2003 Lars Knoll (knoll@kde.org)
+ * 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 Library General Public
@@ -99,6 +100,7 @@ public:
     CSSRuleList cssRules();
     unsigned long insertRule ( const DOM::DOMString &rule, unsigned long index, int &exceptioncode );
     void deleteRule ( unsigned long index, int &exceptioncode );
+    unsigned long addRule ( const DOMString &selector, const DOMString &style, long index, int &exceptioncode );
 
     void addNamespace(CSSParser* p, const DOM::DOMString& prefix, const DOM::DOMString& uri);
     void determineNamespace(Q_UINT32& id, const DOM::DOMString& prefix);
index 2f07daaa07dc64e1e3d87936b63ce3581b6654e4..d06bb9b34736ecc4c683fd9517ecb021b7be8e51 100644 (file)
@@ -2,7 +2,7 @@
  * This file is part of the DOM implementation for KDE.
  *
  * (C) 1999 Lars Knoll (knoll@kde.org)
- * Copyright (C) 2003 Apple Computer, Inc.
+ * 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 Library General Public
@@ -205,6 +205,18 @@ void CSSStyleSheet::deleteRule( unsigned long index )
         throw DOMException( exceptioncode );
 }
 
+void CSSStyleSheet::addRule( const DOMString &selector, const DOMString &style, long index )
+{
+    if (!impl)
+        return;
+    int exceptioncode = 0;
+    static_cast<CSSStyleSheetImpl *>(impl)->addRule( selector, style, index, exceptioncode );
+    if ( exceptioncode >= CSSException::_EXCEPTION_OFFSET )
+        throw CSSException( exceptioncode - CSSException::_EXCEPTION_OFFSET );
+    if ( exceptioncode )
+        throw DOMException( exceptioncode );
+}
+
 
 
 StyleSheetList::StyleSheetList()
index e64f8a5a222a59e05ce73d86f35bf9841f4645e3..ca4045085b92c58cd80dce5ab1ed64475f600584 100644 (file)
@@ -2,6 +2,7 @@
  * This file is part of the DOM implementation for KDE.
  *
  * (C) 1999 Lars Knoll (knoll@kde.org)
+ * 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 Library General Public
@@ -295,6 +296,9 @@ public:
      *
      */
     void deleteRule ( unsigned long index );
+
+    /* Microsoft extension. */
+    void addRule ( const DOMString &selector, const DOMString &style, long index );
 };
 
 
index cc11612f336a5ac2d8ed5c5f9c2c2a7e3005d909..ea804b477c52e9713b8101fff5d091b1a3d3843c 100644 (file)
@@ -2,7 +2,7 @@
  * This file is part of the DOM implementation for KDE.
  *
  * (C) 1999 Lars Knoll (knoll@kde.org)
- * Copyright (C) 2003 Apple Computer, Inc.
+ * 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 Library General Public
@@ -24,7 +24,7 @@
 #include "xml/dom_stringimpl.h"
 
 
-using namespace DOM;
+namespace DOM {
 
 
 DOMString::DOMString(const QChar *str, uint len)
@@ -112,17 +112,15 @@ DOMString &DOMString::operator += (const DOMString &str)
     return *this;
 }
 
-DOMString DOMString::operator + (const DOMString &str)
+DOMString operator + (const DOMString &a, const DOMString &b)
 {
-    if(!impl) return str.copy();
-    if(str.impl)
-    {
-       DOMString s = copy();
-       s += str;
-       return s;
-    }
-
-    return copy();
+    if (a.isEmpty())
+        return b.copy();
+    if (b.isEmpty())
+        return a.copy();
+    DOMString c = a.copy();
+    c += b;
+    return c;
 }
 
 void DOMString::insert(DOMString str, uint pos)
@@ -317,3 +315,6 @@ bool DOM::operator==( const DOMString &a, const char *b )
     }
     return *b == 0;
 }
+
+
+}
index fe68d5a17b70ba1df87d7d201786356022397d91..88e9855c4e87c67168a2c5fc7d0febb599ac426c 100644 (file)
@@ -2,6 +2,7 @@
  * This file is part of the DOM implementation for KDE.
  *
  * (C) 1999 Lars Knoll (knoll@kde.org)
+ * 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 Library General Public
@@ -68,10 +69,6 @@ public:
      * append str to this string
      */
     DOMString &operator += (const DOMString &str);
-    /**
-     * add two DOMString's
-     */
-    DOMString operator + (const DOMString &str);
 
     void insert(DOMString str, uint pos);
 
@@ -127,6 +124,7 @@ protected:
     DOMStringImpl *impl;
 };
 
+DOMString operator + (const DOMString &a, const DOMString &b);
 bool operator==( const DOMString &a, const QString &b );
 bool operator==( const DOMString &a, const char *b );
 inline bool operator==( const QString &b, const DOMString &a ) { return a == b; }
index c765ffe852f313218bc477ac9c9d82071ab52c96..320b183d4fcf07ef7d8d97335c2fa44c44128d64 100644 (file)
@@ -3,7 +3,7 @@
  *  This file is part of the KDE libraries
  *  Copyright (C) 2000 Harri Porten (porten@kde.org)
  *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
- *  Copyright (C) 2003 Apple Computer, Inc.
+ *  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
@@ -481,15 +481,17 @@ Value KJS::DOMMediaListProtoFunc::tryCall(ExecState *exec, Object &thisObj, cons
 const ClassInfo DOMCSSStyleSheet::info = { "CSSStyleSheet", 0, &DOMCSSStyleSheetTable, 0 };
 
 /*
-@begin DOMCSSStyleSheetTable 2
+@begin DOMCSSStyleSheetTable 5
   ownerRule    DOMCSSStyleSheet::OwnerRule     DontDelete|ReadOnly
   cssRules     DOMCSSStyleSheet::CssRules      DontDelete|ReadOnly
 # MSIE extension
   rules                DOMCSSStyleSheet::Rules         DontDelete|ReadOnly
 @end
-@begin DOMCSSStyleSheetProtoTable 2
+@begin DOMCSSStyleSheetProtoTable 6
   insertRule   DOMCSSStyleSheet::InsertRule    DontDelete|Function 2
   deleteRule   DOMCSSStyleSheet::DeleteRule    DontDelete|Function 1
+# MSIE extension
+  addRule      DOMCSSStyleSheet::AddRule       DontDelete|Function 2
 @end
 */
 DEFINE_PROTOTYPE("DOMCSSStyleSheet",DOMCSSStyleSheetProto)
@@ -522,20 +524,21 @@ Value DOMCSSStyleSheetProtoFunc::tryCall(ExecState *exec, Object &thisObj, const
   }
   DOM::CSSStyleSheet styleSheet = static_cast<DOMCSSStyleSheet *>(thisObj.imp())->toCSSStyleSheet();
   Value result;
-  UString str = args[0].toString(exec);
-  DOM::DOMString s = str.string();
-
   switch (id) {
     case DOMCSSStyleSheet::InsertRule:
-      result = Number(styleSheet.insertRule(args[0].toString(exec).string(),(long unsigned int)args[1].toInt32(exec)));
+      return Number(styleSheet.insertRule(args[0].toString(exec).string(),(long unsigned int)args[1].toInt32(exec)));
       break;
     case DOMCSSStyleSheet::DeleteRule:
       styleSheet.deleteRule(args[0].toInt32(exec));
-      break;
-    default:
-      result = Undefined();
+      return Undefined();
+    case DOMCSSStyleSheet::AddRule: {
+      long index = args.size() >= 3 ? args[2].toInt32(exec) : -1;
+      styleSheet.addRule(args[0].toString(exec).string(), args[1].toString(exec).string(), index);
+      // As per Microsoft documentation, always return -1.
+      return Number(-1);
+    }
   }
-  return result;
+  return Undefined();
 }
 
 // -------------------------------------------------------------------------
index 09898a3e4328d914b9ed508fde354dfd66579a8e..4136d2c98b70822be55d31de1921db39c7d3486a 100644 (file)
@@ -3,7 +3,7 @@
  *  This file is part of the KDE libraries
  *  Copyright (C) 2000 Harri Porten (porten@kde.org)
  *  Copyright (C) 2001 Peter Kelly (pmk@post.com)
- *  Copyright (C) 2003 Apple Computer, Inc.
+ *  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
@@ -119,7 +119,7 @@ namespace KJS {
     virtual const ClassInfo* classInfo() const { return &info; }
     static const ClassInfo info;
     enum { OwnerRule, CssRules, Rules,
-           InsertRule, DeleteRule };
+           InsertRule, DeleteRule, AddRule };
     DOM::CSSStyleSheet toCSSStyleSheet() const { return static_cast<DOM::CSSStyleSheet>(styleSheet); }
   };
 
index d86e669096de9b8aa2331ea74b9d54089050d9ec..6743ed06779b06a59f2b4f95b0df56c5acf919bf 100644 (file)
@@ -89,12 +89,13 @@ const struct HashTable DOMMediaListProtoTable = { 2, 4, DOMMediaListProtoTableEn
 namespace KJS {
 
 const struct HashEntry DOMCSSStyleSheetTableEntries[] = {
+   { "rules", DOMCSSStyleSheet::Rules, DontDelete|ReadOnly, 0, 0 },
+   { 0, 0, 0, 0, 0 },
    { "cssRules", DOMCSSStyleSheet::CssRules, DontDelete|ReadOnly, 0, 0 },
-   { "ownerRule", DOMCSSStyleSheet::OwnerRule, DontDelete|ReadOnly, 0, &DOMCSSStyleSheetTableEntries[2] },
-   { "rules", DOMCSSStyleSheet::Rules, DontDelete|ReadOnly, 0, 0 }
+   { "ownerRule", DOMCSSStyleSheet::OwnerRule, DontDelete|ReadOnly, 0, 0 },
 };
 
-const struct HashTable DOMCSSStyleSheetTable = { 2, 3, DOMCSSStyleSheetTableEntries, 2 };
+const struct HashTable DOMCSSStyleSheetTable = { 2, 5, DOMCSSStyleSheetTableEntries, 5 };
 
 } // namespace
 
@@ -102,11 +103,15 @@ namespace KJS {
 
 const struct HashEntry DOMCSSStyleSheetProtoTableEntries[] = {
    { 0, 0, 0, 0, 0 },
-   { "insertRule", DOMCSSStyleSheet::InsertRule, DontDelete|Function, 2, &DOMCSSStyleSheetProtoTableEntries[2] },
-   { "deleteRule", DOMCSSStyleSheet::DeleteRule, DontDelete|Function, 1, 0 }
+   { "insertRule", DOMCSSStyleSheet::InsertRule, DontDelete|Function, 2, 0 },
+   { 0, 0, 0, 0, 0 },
+   { "deleteRule", DOMCSSStyleSheet::DeleteRule, DontDelete|Function, 1, &DOMCSSStyleSheetProtoTableEntries[6] },
+   { 0, 0, 0, 0, 0 },
+   { 0, 0, 0, 0, 0 },
+   { "addRule", DOMCSSStyleSheet::AddRule, DontDelete|Function, 2, 0 }
 };
 
-const struct HashTable DOMCSSStyleSheetProtoTable = { 2, 3, DOMCSSStyleSheetProtoTableEntries, 2 };
+const struct HashTable DOMCSSStyleSheetProtoTable = { 2, 7, DOMCSSStyleSheetProtoTableEntries, 6 };
 
 } // namespace
 
index 1a2c995f620ac6fec8459decaa80e780ad825899..f87614be9f2e6b778ecbaa0e3d41556fc62526cc 100644 (file)
@@ -463,7 +463,7 @@ void RenderImage::paint(PaintInfo& i, int _tx, int _ty)
 
 
 //             p->drawPixmap( offs.x(), y, pix, rect.x(), rect.y(), rect.width(), rect.height() );
-             HTMLImageElementImpl* i = element()->id() == ID_IMG ? static_cast<HTMLImageElementImpl*>(element()) : 0;
+             HTMLImageElementImpl* i = (element() && element()->id() == ID_IMG) ? static_cast<HTMLImageElementImpl*>(element()) : 0;
              if (i && !i->compositeOperator().isNull()){
                 p->drawPixmap (offs, pix, rect, i->compositeOperator());
              }
index 49f512c713b763d4386a9d82dc833bb0e3d13b27..8235c6fd57fc3794b223ee07d804bf8be9286420 100644 (file)
@@ -2826,16 +2826,13 @@ QChar KWQKHTMLPart::backslashAsCurrencySymbol() const
     return codec->backslashAsCurrencySymbol();
 }
 
-NSColor *KWQKHTMLPart::bodyBackgroundColor(void) const
+NSColor *KWQKHTMLPart::bodyBackgroundColor() const
 {
-    HTMLDocumentImpl *doc = docImpl();
-    
-    if (doc){
-        HTMLElementImpl *body = doc->body();
-        QColor bgColor =  body->renderer()->style()->backgroundColor();
-        
-        if (bgColor.isValid())
+    if (docImpl() && docImpl()->body() && docImpl()->body()->renderer()) {
+        QColor bgColor = docImpl()->body()->renderer()->style()->backgroundColor();
+        if (bgColor.isValid()) {
             return bgColor.getNSColor();
+        }
     }
     return nil;
 }