| Index: Source/core/rendering/RenderText.cpp
 | 
| diff --git a/Source/core/rendering/RenderText.cpp b/Source/core/rendering/RenderText.cpp
 | 
| index 5c2ff91236b44a3f6956448dff3cfa445c9d364e..13d84d9aa8aa899b96369c50f4357126d6e4361e 100644
 | 
| --- a/Source/core/rendering/RenderText.cpp
 | 
| +++ b/Source/core/rendering/RenderText.cpp
 | 
| @@ -141,8 +141,8 @@ RenderText::RenderText(Node* node, PassRefPtr<StringImpl> str)
 | 
|      , m_needsTranscoding(false)
 | 
|      , m_minWidth(-1)
 | 
|      , m_maxWidth(-1)
 | 
| -    , m_beginMinWidth(0)
 | 
| -    , m_endMinWidth(0)
 | 
| +    , m_firstLineMinWidth(0)
 | 
| +    , m_lastLineLineMinWidth(0)
 | 
|      , m_text(str)
 | 
|      , m_firstTextBox(0)
 | 
|      , m_lastTextBox(0)
 | 
| @@ -768,11 +768,11 @@ ALWAYS_INLINE float RenderText::widthFromCache(const Font& f, int start, int len
 | 
|  }
 | 
|  
 | 
|  void RenderText::trimmedPrefWidths(float leadWidth,
 | 
| -                                   float& beginMinW, bool& beginWS,
 | 
| -                                   float& endMinW, bool& endWS,
 | 
| -                                   bool& hasBreakableChar, bool& hasBreak,
 | 
| -                                   float& beginMaxW, float& endMaxW,
 | 
| -                                   float& minW, float& maxW, bool& stripFrontSpaces)
 | 
| +    float& firstLineMinWidth, bool& hasBreakableStart,
 | 
| +    float& lastLineMinWidth, bool& hasBreakableEnd,
 | 
| +    bool& hasBreakableChar, bool& hasBreak,
 | 
| +    float& firstLineMaxWidth, float& lastLineMaxWidth,
 | 
| +    float& minWidth, float& maxWidth, bool& stripFrontSpaces)
 | 
|  {
 | 
|      bool collapseWhiteSpace = style()->collapseWhiteSpace();
 | 
|      if (!collapseWhiteSpace)
 | 
| @@ -781,27 +781,27 @@ void RenderText::trimmedPrefWidths(float leadWidth,
 | 
|      if (m_hasTab || preferredLogicalWidthsDirty())
 | 
|          computePreferredLogicalWidths(leadWidth);
 | 
|  
 | 
| -    beginWS = !stripFrontSpaces && m_hasBeginWS;
 | 
| -    endWS = m_hasEndWS;
 | 
| +    hasBreakableStart = !stripFrontSpaces && m_hasBreakableStart;
 | 
| +    hasBreakableEnd = m_hasBreakableEnd;
 | 
|  
 | 
|      int len = textLength();
 | 
|  
 | 
|      if (!len || (stripFrontSpaces && text()->containsOnlyWhitespace())) {
 | 
| -        beginMinW = 0;
 | 
| -        endMinW = 0;
 | 
| -        beginMaxW = 0;
 | 
| -        endMaxW = 0;
 | 
| -        minW = 0;
 | 
| -        maxW = 0;
 | 
| +        firstLineMinWidth = 0;
 | 
| +        lastLineMinWidth = 0;
 | 
| +        firstLineMaxWidth = 0;
 | 
| +        lastLineMaxWidth = 0;
 | 
| +        minWidth = 0;
 | 
| +        maxWidth = 0;
 | 
|          hasBreak = false;
 | 
|          return;
 | 
|      }
 | 
|  
 | 
| -    minW = m_minWidth;
 | 
| -    maxW = m_maxWidth;
 | 
| +    minWidth = m_minWidth;
 | 
| +    maxWidth = m_maxWidth;
 | 
|  
 | 
| -    beginMinW = m_beginMinWidth;
 | 
| -    endMinW = m_endMinWidth;
 | 
| +    firstLineMinWidth = m_firstLineMinWidth;
 | 
| +    lastLineMinWidth = m_lastLineLineMinWidth;
 | 
|  
 | 
|      hasBreakableChar = m_hasBreakableChar;
 | 
|      hasBreak = m_hasBreak;
 | 
| @@ -813,45 +813,47 @@ void RenderText::trimmedPrefWidths(float leadWidth,
 | 
|          if (stripFrontSpaces) {
 | 
|              const UChar space = ' ';
 | 
|              float spaceWidth = font.width(RenderBlock::constructTextRun(this, font, &space, 1, style()));
 | 
| -            maxW -= spaceWidth;
 | 
| -        } else
 | 
| -            maxW += font.wordSpacing();
 | 
| +            maxWidth -= spaceWidth;
 | 
| +        } else {
 | 
| +            maxWidth += font.wordSpacing();
 | 
| +        }
 | 
|      }
 | 
|  
 | 
| -    stripFrontSpaces = collapseWhiteSpace && m_hasEndWS;
 | 
| +    stripFrontSpaces = collapseWhiteSpace && m_hasBreakableEnd;
 | 
|  
 | 
| -    if (!style()->autoWrap() || minW > maxW)
 | 
| -        minW = maxW;
 | 
| +    if (!style()->autoWrap() || minWidth > maxWidth)
 | 
| +        minWidth = maxWidth;
 | 
|  
 | 
|      // Compute our max widths by scanning the string for newlines.
 | 
|      if (hasBreak) {
 | 
|          const Font& f = style()->font(); // FIXME: This ignores first-line.
 | 
|          bool firstLine = true;
 | 
| -        beginMaxW = maxW;
 | 
| -        endMaxW = maxW;
 | 
| +        firstLineMaxWidth = maxWidth;
 | 
| +        lastLineMaxWidth = maxWidth;
 | 
|          for (int i = 0; i < len; i++) {
 | 
|              int linelen = 0;
 | 
|              while (i + linelen < len && text[i + linelen] != '\n')
 | 
|                  linelen++;
 | 
|  
 | 
|              if (linelen) {
 | 
| -                endMaxW = widthFromCache(f, i, linelen, leadWidth + endMaxW, 0, 0);
 | 
| +                lastLineMaxWidth = widthFromCache(f, i, linelen, leadWidth + lastLineMaxWidth, 0, 0);
 | 
|                  if (firstLine) {
 | 
|                      firstLine = false;
 | 
|                      leadWidth = 0;
 | 
| -                    beginMaxW = endMaxW;
 | 
| +                    firstLineMaxWidth = lastLineMaxWidth;
 | 
|                  }
 | 
|                  i += linelen;
 | 
|              } else if (firstLine) {
 | 
| -                beginMaxW = 0;
 | 
| +                firstLineMaxWidth = 0;
 | 
|                  firstLine = false;
 | 
|                  leadWidth = 0;
 | 
|              }
 | 
|  
 | 
| -            if (i == len - 1)
 | 
| +            if (i == len - 1) {
 | 
|                  // A <pre> run that ends with a newline, as in, e.g.,
 | 
|                  // <pre>Some text\n\n<span>More text</pre>
 | 
| -                endMaxW = 0;
 | 
| +                lastLineMaxWidth = 0;
 | 
| +            }
 | 
|          }
 | 
|      }
 | 
|  }
 | 
| @@ -932,9 +934,9 @@ void RenderText::computePreferredLogicalWidths(float leadWidth, HashSet<const Si
 | 
|      ASSERT(m_hasTab || preferredLogicalWidthsDirty() || !m_knownToHaveNoOverflowAndNoFallbackFonts);
 | 
|  
 | 
|      m_minWidth = 0;
 | 
| -    m_beginMinWidth = 0;
 | 
| -    m_endMinWidth = 0;
 | 
|      m_maxWidth = 0;
 | 
| +    m_firstLineMinWidth = 0;
 | 
| +    m_lastLineLineMinWidth = 0;
 | 
|  
 | 
|      if (isBR())
 | 
|          return;
 | 
| @@ -944,8 +946,8 @@ void RenderText::computePreferredLogicalWidths(float leadWidth, HashSet<const Si
 | 
|      m_hasBreakableChar = false;
 | 
|      m_hasBreak = false;
 | 
|      m_hasTab = false;
 | 
| -    m_hasBeginWS = false;
 | 
| -    m_hasEndWS = false;
 | 
| +    m_hasBreakableStart = false;
 | 
| +    m_hasBreakableEnd = false;
 | 
|  
 | 
|      RenderStyle* styleToUse = style();
 | 
|      const Font& f = styleToUse->font(); // FIXME: This ignores first-line.
 | 
| @@ -1009,9 +1011,9 @@ void RenderText::computePreferredLogicalWidths(float leadWidth, HashSet<const Si
 | 
|              isSpace = c == ' ';
 | 
|  
 | 
|          if ((isSpace || isNewline) && !i)
 | 
| -            m_hasBeginWS = true;
 | 
| +            m_hasBreakableStart = true;
 | 
|          if ((isSpace || isNewline) && i == len - 1)
 | 
| -            m_hasEndWS = true;
 | 
| +            m_hasBreakableEnd = true;
 | 
|  
 | 
|          if (!ignoringSpaces && styleToUse->collapseWhiteSpace() && previousCharacterIsSpace && isSpace)
 | 
|              ignoringSpaces = true;
 | 
| @@ -1106,9 +1108,9 @@ void RenderText::computePreferredLogicalWidths(float leadWidth, HashSet<const Si
 | 
|                  // being appended to a previous text run when considering the total minimum width of the containing block.
 | 
|                  if (hasBreak)
 | 
|                      m_hasBreakableChar = true;
 | 
| -                m_beginMinWidth = hasBreak ? 0 : currMinWidth;
 | 
| +                m_firstLineMinWidth = hasBreak ? 0 : currMinWidth;
 | 
|              }
 | 
| -            m_endMinWidth = currMinWidth;
 | 
| +            m_lastLineLineMinWidth = currMinWidth;
 | 
|  
 | 
|              if (currMinWidth > m_minWidth)
 | 
|                  m_minWidth = currMinWidth;
 | 
| @@ -1130,7 +1132,7 @@ void RenderText::computePreferredLogicalWidths(float leadWidth, HashSet<const Si
 | 
|                      firstLine = false;
 | 
|                      leadWidth = 0;
 | 
|                      if (!styleToUse->autoWrap())
 | 
| -                        m_beginMinWidth = currMaxWidth;
 | 
| +                        m_firstLineMinWidth = currMaxWidth;
 | 
|                  }
 | 
|  
 | 
|                  if (currMaxWidth > m_maxWidth)
 | 
| @@ -1166,8 +1168,8 @@ void RenderText::computePreferredLogicalWidths(float leadWidth, HashSet<const Si
 | 
|  
 | 
|      if (styleToUse->whiteSpace() == PRE) {
 | 
|          if (firstLine)
 | 
| -            m_beginMinWidth = m_maxWidth;
 | 
| -        m_endMinWidth = currMaxWidth;
 | 
| +            m_firstLineMinWidth = m_maxWidth;
 | 
| +        m_lastLineLineMinWidth = currMaxWidth;
 | 
|      }
 | 
|  
 | 
|      setPreferredLogicalWidthsDirty(false);
 | 
| 
 |