summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2014-10-02 18:38:22 -0500
committerSlávek Banko <slavek.banko@axis.cz>2015-12-23 02:22:50 +0100
commitf3635faf14a7521e7e9263f197d071a98bdda171 (patch)
tree2b4fc2f411b813c3fbd03ac51dc091220ea580d3
parente25c6429ea1c1578452eb329a7a03457d57948f0 (diff)
downloadtdelibs-f3635faf14a7521e7e9263f197d071a98bdda171.tar.gz
tdelibs-f3635faf14a7521e7e9263f197d071a98bdda171.zip
Don't use insane (negative) layout values if layout engine does not allocate sufficient space for a text string
This resolves Bug 1950 Make most debugging statements work again Add new debugging statements Fix several annoying build warnings (cherry picked from commit cc5fd88be313142d3996c81f8bdfc1290485858c)
-rw-r--r--khtml/html/html_imageimpl.cpp4
-rw-r--r--khtml/html/htmltokenizer.cpp13
-rw-r--r--khtml/rendering/bidi.cpp28
-rw-r--r--khtml/rendering/render_block.cpp16
-rw-r--r--khtml/rendering/render_canvas.cpp2
-rw-r--r--khtml/rendering/render_flow.cpp3
-rw-r--r--khtml/rendering/render_line.h10
-rw-r--r--khtml/rendering/render_object.h2
-rw-r--r--khtml/rendering/render_text.cpp21
-rw-r--r--khtml/rendering/render_text.h10
-rw-r--r--khtml/xml/dom_docimpl.cpp2
-rw-r--r--khtml/xml/dom_docimpl.h4
12 files changed, 80 insertions, 35 deletions
diff --git a/khtml/html/html_imageimpl.cpp b/khtml/html/html_imageimpl.cpp
index be13e93c2..4a5a35f37 100644
--- a/khtml/html/html_imageimpl.cpp
+++ b/khtml/html/html_imageimpl.cpp
@@ -539,12 +539,12 @@ TQRegion HTMLAreaElementImpl::getRegion(int width_, int height_) const
m_coords[(i<<1)+1].minWidth(height_));
region = TQRegion(points);
}
- else if (shape==Circle && m_coordsLen>=3 || shape==Unknown && m_coordsLen == 3) {
+ else if ((shape==Circle && m_coordsLen>=3) || (shape==Unknown && m_coordsLen == 3)) {
int r = kMin(m_coords[2].minWidth(width_), m_coords[2].minWidth(height_));
region = TQRegion(m_coords[0].minWidth(width_)-r,
m_coords[1].minWidth(height_)-r, 2*r, 2*r,TQRegion::Ellipse);
}
- else if (shape==Rect && m_coordsLen>=4 || shape==Unknown && m_coordsLen == 4) {
+ else if ((shape==Rect && m_coordsLen>=4) || (shape==Unknown && m_coordsLen == 4)) {
int x0 = m_coords[0].minWidth(width_);
int y0 = m_coords[1].minWidth(height_);
int x1 = m_coords[2].minWidth(width_);
diff --git a/khtml/html/htmltokenizer.cpp b/khtml/html/htmltokenizer.cpp
index 5da6edd14..9de68e708 100644
--- a/khtml/html/htmltokenizer.cpp
+++ b/khtml/html/htmltokenizer.cpp
@@ -1385,11 +1385,11 @@ void HTMLTokenizer::write( const TokenizerString &str, bool appendData )
else if ( startTag )
{
startTag = false;
- bool endTag = false;
+ // bool endTag = false;
switch(cc) {
case '/':
- endTag = true;
+ // endTag = true;
break;
case '!':
{
@@ -1440,11 +1440,14 @@ void HTMLTokenizer::write( const TokenizerString &str, bool appendData )
// immediately before an endtag should be ignored.
// ### Gecko and MSIE though only ignores LF immediately after
// starttags and only for PRE elements -- asj (28/06-2005)
- if ( pending )
- if (!select)
+ if ( pending ) {
+ if (!select) {
addPending();
- else
+ }
+ else {
pending = NonePending;
+ }
+ }
// Cancel unused discards
discard = NoneDiscard;
diff --git a/khtml/rendering/bidi.cpp b/khtml/rendering/bidi.cpp
index bd010047a..c41b27b69 100644
--- a/khtml/rendering/bidi.cpp
+++ b/khtml/rendering/bidi.cpp
@@ -35,8 +35,9 @@
#include "tqfontmetrics.h"
#define BIDI_DEBUG 0
-//#define DEBUG_LINEBREAKS
-//#define PAGE_DEBUG
+// #define DEBUG_LINEBREAKS
+// #define DEBUG_LAYOUT
+// #define PAGE_DEBUG
namespace khtml {
@@ -701,8 +702,12 @@ void RenderBlock::computeHorizontalPositionsForLine(InlineFlowBox* lineBox, Bidi
if (r->obj->isPositioned())
continue; // Positioned objects are only participating to figure out their
// correct static x position. They have no effect on the width.
- if (r->obj->isText())
+ if (r->obj->isText()) {
r->box->setWidth(static_cast<RenderText *>(r->obj)->width(r->start, r->stop-r->start, m_firstLine));
+#ifdef DEBUG_LAYOUT
+ kdDebug( 6040 ) << renderName() << " computeHorizontalPositionsForLine() set text box width: " << r->box->width() << endl;
+#endif
+ }
else if (!r->obj->isInlineFlow()) {
r->obj->calcWidth();
r->box->setWidth(r->obj->width());
@@ -776,6 +781,10 @@ void RenderBlock::computeHorizontalPositionsForLine(InlineFlowBox* lineBox, Bidi
m_overflowWidth = rightPos; // FIXME: Work for rtl overflow also.
if (x < 0)
m_overflowLeft = kMin(m_overflowLeft, x);
+
+#ifdef DEBUG_LAYOUT
+ kdDebug( 6040 ) << renderName() << " computeHorizontalPositionsForLine() m_overflowWidth: " << m_overflowWidth << " m_overflowLeft: " << m_overflowLeft << endl;
+#endif
}
void RenderBlock::computeVerticalPositionsForLine(InlineFlowBox* lineBox)
@@ -865,6 +874,9 @@ bool RenderBlock::clearLineOfPageBreaks(InlineFlowBox* lineBox)
}
if (doPageBreak) {
int pTop = pageTopAfter(lineBox->yPos());
+#ifdef PAGE_DEBUG
+ int oldYPos = lineBox->yPos();
+#endif
m_height = pTop;
lineBox->setAfterPageBreak(true);
@@ -1254,8 +1266,8 @@ void RenderBlock::bidiReorderLine(const BidiIterator &start, const BidiIterator
}
#if BIDI_DEBUG > 0
- kdDebug(6041) << "reached end of line current=" << current.obj << "/" << current.pos
- << ", eor=" << eor.obj << "/" << eor.pos << endl;
+ kdDebug(6041) << "reached end of line current=" << bidi.current.obj << "/" << bidi.current.pos
+ << ", eor=" << bidi.eor.obj << "/" << bidi.eor.pos << endl;
#endif
if ( !emptyRun && bidi.sor != bidi.current ) {
bidi.eor = bidi.last;
@@ -1286,9 +1298,7 @@ void RenderBlock::bidiReorderLine(const BidiIterator &start, const BidiIterator
#if BIDI_DEBUG > 0
kdDebug(6041) << "lineLow = " << (uint)levelLow << ", lineHigh = " << (uint)levelHigh << endl;
kdDebug(6041) << "logical order is:" << endl;
- TQPtrListIterator<BidiRun> it2(runs);
- BidiRun *r2;
- for ( ; (r2 = it2.current()); ++it2 )
+ for (BidiRun* r2 = sFirstBidiRun; r2; r2 = r2->nextRun)
kdDebug(6041) << " " << r2 << " start=" << r2->start << " stop=" << r2->stop << " level=" << (uint)r2->level << endl;
#endif
@@ -1318,7 +1328,7 @@ void RenderBlock::bidiReorderLine(const BidiIterator &start, const BidiIterator
#if BIDI_DEBUG > 0
kdDebug(6041) << "visual order is:" << endl;
- for (BidiRun* curr = sFirstRun; curr; curr = curr->nextRun)
+ for (BidiRun* curr = sFirstBidiRun; curr; curr = curr->nextRun)
kdDebug(6041) << " " << curr << endl;
#endif
}
diff --git a/khtml/rendering/render_block.cpp b/khtml/rendering/render_block.cpp
index ccbb6fad0..c941315e2 100644
--- a/khtml/rendering/render_block.cpp
+++ b/khtml/rendering/render_block.cpp
@@ -230,11 +230,9 @@ void RenderBlock::updateFirstLetter()
while ( length < oldText->l && (oldText->s+length)->isSpace() )
length++;
begin = length;
- while ( length < oldText->l &&
- ( (oldText->s+length)->isPunct()) || (oldText->s+length)->isSpace() )
+ while ( (length < oldText->l && ( (oldText->s+length)->isPunct())) || (oldText->s+length)->isSpace() )
length++;
- if ( length < oldText->l &&
- !( (oldText->s+length)->isSpace() || (oldText->s+length)->isPunct() ))
+ if ( length < oldText->l && !( (oldText->s+length)->isSpace() || (oldText->s+length)->isPunct() ))
length++;
while ( length < oldText->l && (oldText->s+length)->isMark() )
length++;
@@ -1466,6 +1464,10 @@ void RenderBlock::layoutBlockChildren( bool relayoutChildren )
m_overflowHeight = kMax(effY + child->effectiveHeight(), m_overflowHeight);
m_overflowTop = kMin(effY, m_overflowTop);
+#ifdef PAGE_DEBUG
+ kdDebug(6040) << renderName() << "(RenderBlock)::layoutBlockChildren(" << relayoutChildren << ") effX: " << effX << " effY: " << effY << " child: " << child << " child->effectiveWidth(): " << child->effectiveWidth() << " child->effectiveHeight(): " << child->effectiveHeight() << endl;
+#endif
+
// Insert our compact into the block margin if we have one.
insertCompactIfNeeded(child, compactInfo);
@@ -2168,6 +2170,9 @@ int RenderBlock::rightmostPosition(bool includeOverflowInterior, bool includeSel
}
}
+#ifdef PAGE_DEBUG
+ kdDebug(6040) << renderName() << "(RenderBlock)::rightmostPosition(" << includeOverflowInterior << "," << includeSelf << ") Rightmost position: " << right << " overflow width: " << m_overflowWidth << endl;
+#endif
return right;
}
@@ -2184,6 +2189,9 @@ int RenderBlock::rightmostAbsolutePosition() const
int rp = r->xPos() + r->rightmostPosition(false);
right = kMax(right, rp);
}
+#ifdef PAGE_DEBUG
+ kdDebug(6040) << renderName() << " Rightmost absolute position: " << right << endl;
+#endif
return right;
}
diff --git a/khtml/rendering/render_canvas.cpp b/khtml/rendering/render_canvas.cpp
index e8540eba6..c73b94841 100644
--- a/khtml/rendering/render_canvas.cpp
+++ b/khtml/rendering/render_canvas.cpp
@@ -319,7 +319,7 @@ void RenderCanvas::paint(PaintInfo& paintInfo, int _tx, int _ty)
_ty += m_view->contentsY();
}
- outlineBox(p, _tx, _ty);
+ outlineBox(paintInfo.p, _tx, _ty);
#endif
}
diff --git a/khtml/rendering/render_flow.cpp b/khtml/rendering/render_flow.cpp
index ae579bd46..6fda24bb4 100644
--- a/khtml/rendering/render_flow.cpp
+++ b/khtml/rendering/render_flow.cpp
@@ -358,6 +358,9 @@ int RenderFlow::rightmostPosition(bool includeOverflowInterior, bool includeSelf
relativePositionOffset(right, y);
}
+#ifdef DEBUG_LAYOUT
+ kdDebug(6040) << renderName() << "(RenderFlow)::rightmostPosition(" << includeOverflowInterior << "," << includeSelf << ") Rightmost position: " << right << endl;
+#endif
return right;
}
diff --git a/khtml/rendering/render_line.h b/khtml/rendering/render_line.h
index d42f2acb8..972a57830 100644
--- a/khtml/rendering/render_line.h
+++ b/khtml/rendering/render_line.h
@@ -84,7 +84,15 @@ public:
RootInlineBox* root();
- void setWidth(short w) { m_width = w; }
+ void setWidth(short w) {
+ if (w < 0) {
+ m_width = SHRT_MAX;
+ kdDebug( 6040 ) << " InlineBox::setWidth() invalid negative width " << w << " specified!" << endl;
+ }
+ else {
+ m_width = w;
+ }
+ }
short width() const { return m_width; }
void setXPos(short x) { m_x = x; }
diff --git a/khtml/rendering/render_object.h b/khtml/rendering/render_object.h
index f7f772387..a88385c29 100644
--- a/khtml/rendering/render_object.h
+++ b/khtml/rendering/render_object.h
@@ -334,10 +334,8 @@ public:
m_minMaxKnown = b;
if ( !b ) {
RenderObject *o = this;
- RenderObject *root = this;
while( o ) { // ### && !o->m_recalcMinMax ) {
o->m_recalcMinMax = true;
- root = o;
o = o->m_parent;
}
}
diff --git a/khtml/rendering/render_text.cpp b/khtml/rendering/render_text.cpp
index f5fa2e373..cd8f39d8c 100644
--- a/khtml/rendering/render_text.cpp
+++ b/khtml/rendering/render_text.cpp
@@ -23,8 +23,8 @@
*
*/
-//#define DEBUG_LAYOUT
-//#define BIDI_DEBUG
+// #define DEBUG_LAYOUT
+// #define BIDI_DEBUG
#ifdef HAVE_CONFIG_H
#include <config.h>
@@ -295,7 +295,7 @@ void InlineTextBox::paintDecoration( TQPainter *pt, const Font *f, int _tx, int
pt->setPen(linethrough);
f->drawDecoration(pt, _tx, _ty, baseline(), width, height(), Font::LINE_THROUGH);
}
- // NO! Do NOT add BLINK! It is the most annouing feature of Netscape, and IE has a reason not to
+ // NO! Do NOT add BLINK! It is the most annoying feature of Netscape, and IE has a reason not to
// support it. Lars
}
@@ -1305,7 +1305,9 @@ unsigned int RenderText::width(unsigned int from, unsigned int len, const Font *
int w = f->width(str->s, str->l, from, len );
- //kdDebug( 6040 ) << "RenderText::width(" << from << ", " << len << ") = " << w << endl;
+#ifdef DEBUG_LAYOUT
+ kdDebug( 6040 ) << "RenderText::width(" << from << ", " << len << ") = " << w << endl;
+#endif
return w;
}
@@ -1315,16 +1317,19 @@ short RenderText::width() const
int minx = 100000000;
int maxx = 0;
// slooow
- for(unsigned int si = 0; si < m_lines.count(); si++) {
+ for (unsigned int si = 0; si < m_lines.count(); si++) {
InlineTextBox* s = m_lines[si];
- if(s->m_x < minx)
+ if (s->m_x < minx)
minx = s->m_x;
- if(s->m_x + s->m_width > maxx)
+ if (s->m_x + s->m_width > maxx)
maxx = s->m_x + s->m_width;
}
w = kMax(0, maxx-minx);
+#ifdef DEBUG_LAYOUT
+ kdDebug( 6040 ) << "RenderText::width() = " << w << endl;
+#endif
return w;
}
@@ -1486,7 +1491,7 @@ static TQString quoteAndEscapeNonPrintables(const TQString &s)
static void writeTextRun(TQTextStream &ts, const RenderText &o, const InlineTextBox &run)
{
- ts << "text run at (" << run.m_x << "," << run.m_y << ") width " << run.m_width << ": "
+ ts << "text run at (" << run.m_x << "," << run.m_y << ") width " << run.width() << ": "
<< quoteAndEscapeNonPrintables(o.data().string().mid(run.m_start, run.m_len));
}
diff --git a/khtml/rendering/render_text.h b/khtml/rendering/render_text.h
index 50132fbc7..ccd207b9d 100644
--- a/khtml/rendering/render_text.h
+++ b/khtml/rendering/render_text.h
@@ -74,7 +74,15 @@ private:
void* operator new(size_t sz) throw();
public:
- void setSpaceAdd(int add) { m_width -= m_toAdd; m_toAdd = add; m_width += m_toAdd; }
+ void setSpaceAdd(int add) {
+ if (add < 0) {
+ m_toAdd = 0;
+ kdDebug( 6040 ) << " InlineTextBox::setSpaceAdd() invalid negative value " << add << " specified!" << endl;
+ }
+ else {
+ m_width -= m_toAdd; m_toAdd = add; m_width += m_toAdd;
+ }
+ }
int spaceAdd() { return m_toAdd; }
virtual bool isInlineTextBox() const { return true; }
diff --git a/khtml/xml/dom_docimpl.cpp b/khtml/xml/dom_docimpl.cpp
index 922714a4e..ee039b1b2 100644
--- a/khtml/xml/dom_docimpl.cpp
+++ b/khtml/xml/dom_docimpl.cpp
@@ -2345,7 +2345,7 @@ bool DocumentImpl::isURLAllowed(const TQString& url) const
return false;
// Prohibit non-file URLs if we are asked to.
- if (!thisPart || thisPart->onlyLocalReferences() && newURL.protocol() != "file" && newURL.protocol() != "data")
+ if (!thisPart || (thisPart->onlyLocalReferences() && (newURL.protocol() != "file") && (newURL.protocol() != "data")))
return false;
// do we allow this suburl ?
diff --git a/khtml/xml/dom_docimpl.h b/khtml/xml/dom_docimpl.h
index 5e50c09a4..b4b0058c9 100644
--- a/khtml/xml/dom_docimpl.h
+++ b/khtml/xml/dom_docimpl.h
@@ -27,6 +27,8 @@
#ifndef _DOM_DocumentImpl_h_
#define _DOM_DocumentImpl_h_
+#include <stdint.h>
+
#include "xml/dom_elementimpl.h"
#include "xml/dom_textimpl.h"
#include "xml/dom2_traversalimpl.h"
@@ -617,7 +619,7 @@ protected:
TQString name = cs ? n.string() : n.string().upper();
TQString qn("aliases: " + (cs ? px.string() : px.string().upper()) + ":" + name);
if (!ids.find( qn )) {
- ids.insert( qn, (void*)id );
+ ids.insert( qn, (void*)(intptr_t)id );
}
}
expandIfNeeded();