Fix two SVG test failures in 64-bit.
authormrowe@apple.com <mrowe@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 28 Mar 2009 02:40:34 +0000 (02:40 +0000)
committermrowe@apple.com <mrowe@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 28 Mar 2009 02:40:34 +0000 (02:40 +0000)
Reviewed by Sam Weinig.

getSubStringLength's arguments were declared as unsigned in the IDL and as signed long in the implementation.
This led to a value of -1 in JavaScript being converted to MAX_UINT in the bindings.  In 32-bit this was
identical to -1 when interpeted as signed long, but in 64-bit it was still equal to MAX_UINT.

The solution for this is to use the IsIndex attribute on arguments that the SVG spec declares as "unsigned long"
but requires an exception be thrown when a negative value is passed.  This results in the JS bindings handling the
check for a negative value and lets the implementation treat the arguments purely as unsigned values.

* svg/SVGTextContentElement.cpp:
(WebCore::SVGTextContentElement::getNumberOfChars):
(WebCore::SVGTextContentElement::getSubStringLength):
(WebCore::SVGTextContentElement::getStartPositionOfChar):
(WebCore::SVGTextContentElement::getEndPositionOfChar):
(WebCore::SVGTextContentElement::getExtentOfChar):
(WebCore::SVGTextContentElement::getRotationOfChar):
(WebCore::SVGTextContentElement::getCharNumAtPosition):
(WebCore::SVGTextContentElement::selectSubString):
* svg/SVGTextContentElement.h:
* svg/SVGTextContentElement.idl:

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

WebCore/ChangeLog
WebCore/svg/SVGTextContentElement.cpp
WebCore/svg/SVGTextContentElement.h
WebCore/svg/SVGTextContentElement.idl

index dc59be3..d0e159d 100644 (file)
@@ -1,3 +1,29 @@
+2009-03-27  Mark Rowe  <mrowe@apple.com>
+
+        Reviewed by Sam Weinig.
+
+        Fix two SVG test failures in 64-bit.
+
+        getSubStringLength's arguments were declared as unsigned in the IDL and as signed long in the implementation.
+        This led to a value of -1 in JavaScript being converted to MAX_UINT in the bindings.  In 32-bit this was
+        identical to -1 when interpeted as signed long, but in 64-bit it was still equal to MAX_UINT.
+
+        The solution for this is to use the IsIndex attribute on arguments that the SVG spec declares as "unsigned long"
+        but requires an exception be thrown when a negative value is passed.  This results in the JS bindings handling the
+        check for a negative value and lets the implementation treat the arguments purely as unsigned values.
+
+        * svg/SVGTextContentElement.cpp:
+        (WebCore::SVGTextContentElement::getNumberOfChars):
+        (WebCore::SVGTextContentElement::getSubStringLength):
+        (WebCore::SVGTextContentElement::getStartPositionOfChar):
+        (WebCore::SVGTextContentElement::getEndPositionOfChar):
+        (WebCore::SVGTextContentElement::getExtentOfChar):
+        (WebCore::SVGTextContentElement::getRotationOfChar):
+        (WebCore::SVGTextContentElement::getCharNumAtPosition):
+        (WebCore::SVGTextContentElement::selectSubString):
+        * svg/SVGTextContentElement.h:
+        * svg/SVGTextContentElement.idl:
+
 2009-03-27  Darin Adler  <darin@apple.com>
 
         Reviewed by Sam Weinig.
 2009-03-27  Darin Adler  <darin@apple.com>
 
         Reviewed by Sam Weinig.
index 8b34c2c..6fad8e8 100644 (file)
@@ -370,7 +370,7 @@ static inline SVGInlineTextBoxQueryWalker executeTextQuery(const SVGTextContentE
     return walkerCallback;
 }
 
     return walkerCallback;
 }
 
-long SVGTextContentElement::getNumberOfChars() const
+unsigned SVGTextContentElement::getNumberOfChars() const
 {
     document()->updateLayoutIgnorePendingStylesheets();
 
 {
     document()->updateLayoutIgnorePendingStylesheets();
 
@@ -384,12 +384,12 @@ float SVGTextContentElement::getComputedTextLength() const
     return executeTextQuery(this, SVGInlineTextBoxQueryWalker::TextLength).floatResult();
 }
 
     return executeTextQuery(this, SVGInlineTextBoxQueryWalker::TextLength).floatResult();
 }
 
-float SVGTextContentElement::getSubStringLength(long charnum, long nchars, ExceptionCode& ec) const
+float SVGTextContentElement::getSubStringLength(unsigned charnum, unsigned nchars, ExceptionCode& ec) const
 {
     document()->updateLayoutIgnorePendingStylesheets();
 
 {
     document()->updateLayoutIgnorePendingStylesheets();
 
-    long numberOfChars = getNumberOfChars();
-    if (charnum < 0 || nchars < 0 || charnum >= numberOfChars) {
+    unsigned numberOfChars = getNumberOfChars();
+    if (charnum >= numberOfChars) {
         ec = INDEX_SIZE_ERR;
         return 0.0f;
     }
         ec = INDEX_SIZE_ERR;
         return 0.0f;
     }
@@ -397,11 +397,11 @@ float SVGTextContentElement::getSubStringLength(long charnum, long nchars, Excep
     return executeTextQuery(this, SVGInlineTextBoxQueryWalker::SubStringLength, charnum, nchars).floatResult();
 }
 
     return executeTextQuery(this, SVGInlineTextBoxQueryWalker::SubStringLength, charnum, nchars).floatResult();
 }
 
-FloatPoint SVGTextContentElement::getStartPositionOfChar(long charnum, ExceptionCode& ec) const
+FloatPoint SVGTextContentElement::getStartPositionOfChar(unsigned charnum, ExceptionCode& ec) const
 {
     document()->updateLayoutIgnorePendingStylesheets();
 
 {
     document()->updateLayoutIgnorePendingStylesheets();
 
-    if (charnum < 0 || charnum > getNumberOfChars()) {
+    if (charnum > getNumberOfChars()) {
         ec = INDEX_SIZE_ERR;
         return FloatPoint();
     }
         ec = INDEX_SIZE_ERR;
         return FloatPoint();
     }
@@ -409,11 +409,11 @@ FloatPoint SVGTextContentElement::getStartPositionOfChar(long charnum, Exception
     return executeTextQuery(this, SVGInlineTextBoxQueryWalker::StartPosition, charnum).pointResult();
 }
 
     return executeTextQuery(this, SVGInlineTextBoxQueryWalker::StartPosition, charnum).pointResult();
 }
 
-FloatPoint SVGTextContentElement::getEndPositionOfChar(long charnum, ExceptionCode& ec) const
+FloatPoint SVGTextContentElement::getEndPositionOfChar(unsigned charnum, ExceptionCode& ec) const
 {
     document()->updateLayoutIgnorePendingStylesheets();
 
 {
     document()->updateLayoutIgnorePendingStylesheets();
 
-    if (charnum < 0 || charnum > getNumberOfChars()) {
+    if (charnum > getNumberOfChars()) {
         ec = INDEX_SIZE_ERR;
         return FloatPoint();
     }
         ec = INDEX_SIZE_ERR;
         return FloatPoint();
     }
@@ -421,11 +421,11 @@ FloatPoint SVGTextContentElement::getEndPositionOfChar(long charnum, ExceptionCo
     return executeTextQuery(this, SVGInlineTextBoxQueryWalker::EndPosition, charnum).pointResult();
 }
 
     return executeTextQuery(this, SVGInlineTextBoxQueryWalker::EndPosition, charnum).pointResult();
 }
 
-FloatRect SVGTextContentElement::getExtentOfChar(long charnum, ExceptionCode& ec) const
+FloatRect SVGTextContentElement::getExtentOfChar(unsigned charnum, ExceptionCode& ec) const
 {
     document()->updateLayoutIgnorePendingStylesheets();
 
 {
     document()->updateLayoutIgnorePendingStylesheets();
 
-    if (charnum < 0 || charnum > getNumberOfChars()) {
+    if (charnum > getNumberOfChars()) {
         ec = INDEX_SIZE_ERR;
         return FloatRect();
     }
         ec = INDEX_SIZE_ERR;
         return FloatRect();
     }
@@ -433,11 +433,11 @@ FloatRect SVGTextContentElement::getExtentOfChar(long charnum, ExceptionCode& ec
     return executeTextQuery(this, SVGInlineTextBoxQueryWalker::Extent, charnum).rectResult();
 }
 
     return executeTextQuery(this, SVGInlineTextBoxQueryWalker::Extent, charnum).rectResult();
 }
 
-float SVGTextContentElement::getRotationOfChar(long charnum, ExceptionCode& ec) const
+float SVGTextContentElement::getRotationOfChar(unsigned charnum, ExceptionCode& ec) const
 {
     document()->updateLayoutIgnorePendingStylesheets();
 
 {
     document()->updateLayoutIgnorePendingStylesheets();
 
-    if (charnum < 0 || charnum > getNumberOfChars()) {
+    if (charnum > getNumberOfChars()) {
         ec = INDEX_SIZE_ERR;
         return 0.0f;
     }
         ec = INDEX_SIZE_ERR;
         return 0.0f;
     }
@@ -445,17 +445,17 @@ float SVGTextContentElement::getRotationOfChar(long charnum, ExceptionCode& ec)
     return executeTextQuery(this, SVGInlineTextBoxQueryWalker::Rotation, charnum).floatResult();
 }
 
     return executeTextQuery(this, SVGInlineTextBoxQueryWalker::Rotation, charnum).floatResult();
 }
 
-long SVGTextContentElement::getCharNumAtPosition(const FloatPoint& point) const
+int SVGTextContentElement::getCharNumAtPosition(const FloatPoint& point) const
 {
     document()->updateLayoutIgnorePendingStylesheets();
 
     return executeTextQuery(this, SVGInlineTextBoxQueryWalker::CharacterNumberAtPosition, 0.0f, 0.0f, point).longResult();
 }
 
 {
     document()->updateLayoutIgnorePendingStylesheets();
 
     return executeTextQuery(this, SVGInlineTextBoxQueryWalker::CharacterNumberAtPosition, 0.0f, 0.0f, point).longResult();
 }
 
-void SVGTextContentElement::selectSubString(long charnum, long nchars, ExceptionCode& ec) const
+void SVGTextContentElement::selectSubString(unsigned charnum, unsigned nchars, ExceptionCode& ec) const
 {
 {
-    long numberOfChars = getNumberOfChars();
-    if (charnum < 0 || nchars < 0 || charnum >= numberOfChars) {
+    unsigned numberOfChars = getNumberOfChars();
+    if (charnum >= numberOfChars) {
         ec = INDEX_SIZE_ERR;
         return;
     }
         ec = INDEX_SIZE_ERR;
         return;
     }
@@ -472,12 +472,12 @@ void SVGTextContentElement::selectSubString(long charnum, long nchars, Exception
 
     // Find selection start
     VisiblePosition start(const_cast<SVGTextContentElement*>(this), 0, SEL_DEFAULT_AFFINITY);
 
     // Find selection start
     VisiblePosition start(const_cast<SVGTextContentElement*>(this), 0, SEL_DEFAULT_AFFINITY);
-    for (long i = 0; i < charnum; ++i)
+    for (unsigned i = 0; i < charnum; ++i)
         start = start.next();
 
     // Find selection end
     VisiblePosition end(start);
         start = start.next();
 
     // Find selection end
     VisiblePosition end(start);
-    for (long i = 0; i < nchars; ++i)
+    for (unsigned i = 0; i < nchars; ++i)
         end = end.next();
 
     controller->setSelection(VisibleSelection(start, end));
         end = end.next();
 
     controller->setSelection(VisibleSelection(start, end));
index d6b9d93..9933b2c 100644 (file)
@@ -52,15 +52,15 @@ namespace WebCore {
         virtual bool isValid() const { return SVGTests::isValid(); }
         virtual bool isTextContent() const { return true; }
 
         virtual bool isValid() const { return SVGTests::isValid(); }
         virtual bool isTextContent() const { return true; }
 
-        long getNumberOfChars() const;
+        unsigned getNumberOfChars() const;
         float getComputedTextLength() const;
         float getComputedTextLength() const;
-        float getSubStringLength(long charnum, long nchars, ExceptionCode&) const;
-        FloatPoint getStartPositionOfChar(long charnum, ExceptionCode&) const;
-        FloatPoint getEndPositionOfChar(long charnum, ExceptionCode&) const;
-        FloatRect getExtentOfChar(long charnum, ExceptionCode&) const;
-        float getRotationOfChar(long charnum, ExceptionCode&) const;
-        long getCharNumAtPosition(const FloatPoint&) const;
-        void selectSubString(long charnum, long nchars, ExceptionCode&) const;
+        float getSubStringLength(unsigned charnum, unsigned nchars, ExceptionCode&) const;
+        FloatPoint getStartPositionOfChar(unsigned charnum, ExceptionCode&) const;
+        FloatPoint getEndPositionOfChar(unsigned charnum, ExceptionCode&) const;
+        FloatRect getExtentOfChar(unsigned charnum, ExceptionCode&) const;
+        float getRotationOfChar(unsigned charnum, ExceptionCode&) const;
+        int getCharNumAtPosition(const FloatPoint&) const;
+        void selectSubString(unsigned charnum, unsigned nchars, ExceptionCode&) const;
 
         virtual void parseMappedAttribute(MappedAttribute*);
 
 
         virtual void parseMappedAttribute(MappedAttribute*);
 
index e4e0163..394b398 100644 (file)
@@ -40,20 +40,20 @@ module svg {
 
         long getNumberOfChars();
         float getComputedTextLength();
 
         long getNumberOfChars();
         float getComputedTextLength();
-        float getSubStringLength(in unsigned long offset, 
-                                 in unsigned long length)
+        float getSubStringLength(in [IsIndex] unsigned long offset, 
+                                 in [IsIndex] unsigned long length)
             raises(DOMException);
             raises(DOMException);
-        SVGPoint getStartPositionOfChar(in unsigned long offset)
+        SVGPoint getStartPositionOfChar(in [IsIndex] unsigned long offset)
             raises(DOMException);
             raises(DOMException);
-        SVGPoint getEndPositionOfChar(in unsigned long offset)
+        SVGPoint getEndPositionOfChar(in [IsIndex] unsigned long offset)
             raises(DOMException);
             raises(DOMException);
-        SVGRect getExtentOfChar(in unsigned long offset)
+        SVGRect getExtentOfChar(in [IsIndex] unsigned long offset)
             raises(DOMException);
             raises(DOMException);
-        float getRotationOfChar(in unsigned long offset)
+        float getRotationOfChar(in [IsIndex] unsigned long offset)
             raises(DOMException);
         long getCharNumAtPosition(in SVGPoint point);
             raises(DOMException);
         long getCharNumAtPosition(in SVGPoint point);
-        void selectSubString(in unsigned long offset, 
-                             in unsigned long length)
+        void selectSubString(in [IsIndex] unsigned long offset, 
+                             in [IsIndex] unsigned long length)
             raises(DOMException);
     };
 
             raises(DOMException);
     };